diff --git a/.gitmodules b/.gitmodules index 36e7dc6..2a29106 100644 --- a/.gitmodules +++ b/.gitmodules
@@ -759,10 +759,6 @@ path = third_party/gles2_conform url = https://chrome-internal.googlesource.com/chrome/deps/gles2_conform gclient-condition = checkout_src_internal -[submodule "third_party/googlemac"] - path = third_party/googlemac - url = https://chrome-internal.googlesource.com/chrome/deps/googlemac - gclient-condition = checkout_mac and checkout_src_internal [submodule "third_party/khronos_glcts"] path = third_party/khronos_glcts url = https://chrome-internal.googlesource.com/chrome/deps/khronos_glcts
diff --git a/DEPS b/DEPS index 1b977b9..f326809 100644 --- a/DEPS +++ b/DEPS
@@ -304,19 +304,19 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': '99f8a11b3c5a426de2878eca0a9b1fd23f2ae8e7', + 'src_internal_revision': 'cf0c9456e3dcd7fa1f4f51fa89aac1ee026ca47e', # 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': '21c53af2e9f593e3378bdb0ead5d8b2c824a3b29', + 'skia_revision': '416d7b0e5ba1f773fe4c08cd398a1207b6d781f7', # 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': 'c5ab7c355c16e632dd3cc88d2f32202c9ca9b94a', + 'v8_revision': 'aacf1e1b503a77d4c030a42a6f8dd8323e4dcecb', # 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': '8e2678463dae9729e3c80e76c00b0eb26d7823a0', + 'angle_revision': 'c7ed7da64071842113a833665598dc0d4e8fbcdf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -379,11 +379,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'd1eeccf9e4a273c3639d6554c889f8ee3ca9bc0d', + 'catapult_revision': 'd7ee2f7345cc7b989b88c5323f9b3e6e380fb0d5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling chromium_variations # and whatever else without interference from each other. - 'chromium_variations_revision': 'd370e39f2d5d7ea3b25afcda4acf56682854f097', + 'chromium_variations_revision': 'a2d67c6b98b7924209af2aae5be3da8a9a4b69a6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -399,7 +399,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': 'e7083d45c07666a4c81a69df7317e741aed20fc2', + 'devtools_frontend_revision': '8c6063b58de3e8ce312977c50ed9a9385167be87', # 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. @@ -423,7 +423,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': 'be3d39c265017ff85a3f7fcd50e52849835e6b02', + 'dawn_revision': '10d6e1fa0349777c9e99b9ad431dcf5806397769', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -823,12 +823,12 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '9798a6dc4119617e2b9d14d91c2d0e43d290097d', + '46a763c388f69b4de7d25149a50b688b09c2906e', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'b7bba5c5b9d9c674a978ddaef034cc7c185aab5f', + 'url': Var('chromium_git') + '/website.git' + '@' + 'dd6ef26042e3c7a265349d73ffe2b64e5c791f2b', }, 'src/ios/third_party/earl_grey2/src': { @@ -1201,7 +1201,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '7fc0271543993e57b56c4e628037d320a8e7c3e4', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '6ae0c39dd87c7dc0ffb214eb2e372178eb259345', 'condition': 'checkout_src_internal', }, @@ -1661,7 +1661,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'bd299c3878ebd23de57b0f1cef2811a92c6a3407', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd9c3231123fd6b1d0c1afd49d27c628a3b01c4f6', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '8ef97ff3b7332e38e61b347a2fbed425a4617151', @@ -1846,7 +1846,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e082b08475761a2ba6a3349dfea72f704c8b68d4', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1b61c7161edb645153f1f76e1f731443f95e6bfb', + Var('webrtc_git') + '/src.git' + '@' + 'cc70a6d1748cd28a9d62fb234ab3f0b48cbebb1e', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1969,7 +1969,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'm34KC5oXKP0ZjIfoG8w8AoSn41n33u66JKocc0VrhWUC', + 'version': 'QhnuT3B8X3lRwz17Cq-9JNMWdODIafvDzOmWVMjJLDMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2013,7 +2013,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'HT5gRARwZ22SYKRboAW3FlC6MPWXVXHM3VPbDyLXpXgC', + 'version': '3PLjWhPGrB-dJSFkp-hyuiCwSoQqehygqF1_i9Bn7gMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4009,7 +4009,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'a14976d2e2ff641ed611c67ce8f61a1f86fefa55', + '51fd534742fad032462e1b917df03b94ef0a953f', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 7aabff9..61c9aaf7 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -513,7 +513,6 @@ generate_jni("browser_jni_headers") { sources = [ "java/src/org/chromium/android_webview/AndroidProtocolHandler.java", - "java/src/org/chromium/android_webview/AwAutofillClient.java", "java/src/org/chromium/android_webview/AwBrowserContext.java", "java/src/org/chromium/android_webview/AwBrowserContextStore.java", "java/src/org/chromium/android_webview/AwBrowserProcess.java", @@ -563,7 +562,6 @@ sources = [ "java/src/org/chromium/android_webview/AndroidProtocolHandler.java", "java/src/org/chromium/android_webview/AwActionModeCallback.java", - "java/src/org/chromium/android_webview/AwAutofillClient.java", "java/src/org/chromium/android_webview/AwBrowserContext.java", "java/src/org/chromium/android_webview/AwBrowserContextStore.java", "java/src/org/chromium/android_webview/AwBrowserProcess.java",
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn index 79ba76f..3da54758 100644 --- a/android_webview/browser/BUILD.gn +++ b/android_webview/browser/BUILD.gn
@@ -24,8 +24,6 @@ "android_protocol_handler.cc", "android_protocol_handler.h", "aw_apk_type.h", - "aw_autofill_client.cc", - "aw_autofill_client.h", "aw_browser_context.cc", "aw_browser_context.h", "aw_browser_context_store.cc",
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc deleted file mode 100644 index 4c251fd..0000000 --- a/android_webview/browser/aw_autofill_client.cc +++ /dev/null
@@ -1,399 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "android_webview/browser/aw_autofill_client.h" - -#include <utility> - -#include "android_webview/browser/aw_browser_context.h" -#include "android_webview/browser/aw_content_browser_client.h" -#include "android_webview/browser/aw_contents.h" -#include "android_webview/browser/aw_form_database_service.h" -#include "android_webview/browser_jni_headers/AwAutofillClient_jni.h" -#include "base/android/build_info.h" -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "base/android/locale_utils.h" -#include "base/android/scoped_java_ref.h" -#include "base/check_op.h" -#include "base/notreached.h" -#include "base/types/cxx23_to_underlying.h" -#include "components/android_autofill/browser/android_autofill_manager.h" -#include "components/android_autofill/browser/autofill_provider_android.h" -#include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h" -#include "components/autofill/core/browser/payments/legal_message_line.h" -#include "components/autofill/core/browser/ui/autofill_popup_delegate.h" -#include "components/autofill/core/browser/ui/popup_item_ids.h" -#include "components/autofill/core/browser/ui/suggestion.h" -#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" -#include "components/autofill/core/common/aliases.h" -#include "components/prefs/pref_registry_simple.h" -#include "components/prefs/pref_service.h" -#include "components/prefs/pref_service_factory.h" -#include "components/user_prefs/user_prefs.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/ssl_status.h" -#include "content/public/browser/storage_partition.h" -#include "content/public/browser/web_contents.h" -#include "ui/android/view_android.h" -#include "ui/gfx/geometry/rect_f.h" - -using base::android::AttachCurrentThread; -using base::android::ConvertUTF16ToJavaString; -using base::android::JavaParamRef; -using base::android::ScopedJavaLocalRef; -using content::WebContents; - -namespace android_webview { - -void AwAutofillClient::CreateForWebContents(content::WebContents* contents) { - DCHECK(contents); - if (!FromWebContents(contents)) { - contents->SetUserData(UserDataKey(), - base::WrapUnique(new AwAutofillClient(contents))); - } -} - -AwAutofillClient::~AwAutofillClient() { - HideAutofillPopup(autofill::PopupHidingReason::kTabGone); -} - -bool AwAutofillClient::IsOffTheRecord() { - return GetWebContents().GetBrowserContext()->IsOffTheRecord(); -} - -scoped_refptr<network::SharedURLLoaderFactory> -AwAutofillClient::GetURLLoaderFactory() { - return GetWebContents() - .GetBrowserContext() - ->GetDefaultStoragePartition() - ->GetURLLoaderFactoryForBrowserProcess(); -} - -autofill::AutofillCrowdsourcingManager* -AwAutofillClient::GetCrowdsourcingManager() { - if (autofill::AutofillProvider:: - is_crowdsourcing_manager_disabled_for_testing()) { - return nullptr; - } - if (!crowdsourcing_manager_) { - // Lazy initialization to avoid virtual function calls in the constructor. - crowdsourcing_manager_ = - std::make_unique<autofill::AutofillCrowdsourcingManager>( - this, GetChannel(), GetLogManager()); - } - return crowdsourcing_manager_.get(); -} - -autofill::PersonalDataManager* AwAutofillClient::GetPersonalDataManager() { - return nullptr; -} - -autofill::AutocompleteHistoryManager* -AwAutofillClient::GetAutocompleteHistoryManager() { - NOTREACHED_NORETURN(); -} - -PrefService* AwAutofillClient::GetPrefs() { - return const_cast<PrefService*>(std::as_const(*this).GetPrefs()); -} - -const PrefService* AwAutofillClient::GetPrefs() const { - return user_prefs::UserPrefs::Get(AwBrowserContext::FromWebContents( - const_cast<WebContents*>(&GetWebContents()))); -} - -syncer::SyncService* AwAutofillClient::GetSyncService() { - return nullptr; -} - -signin::IdentityManager* AwAutofillClient::GetIdentityManager() { - return nullptr; -} - -autofill::FormDataImporter* AwAutofillClient::GetFormDataImporter() { - return nullptr; -} - -autofill::payments::PaymentsNetworkInterface* -AwAutofillClient::GetPaymentsNetworkInterface() { - return nullptr; -} - -autofill::StrikeDatabase* AwAutofillClient::GetStrikeDatabase() { - return nullptr; -} - -ukm::UkmRecorder* AwAutofillClient::GetUkmRecorder() { - return nullptr; -} - -ukm::SourceId AwAutofillClient::GetUkmSourceId() { - // UKM recording is not supported for WebViews. - return ukm::kInvalidSourceId; -} - -autofill::AddressNormalizer* AwAutofillClient::GetAddressNormalizer() { - return nullptr; -} - -const GURL& AwAutofillClient::GetLastCommittedPrimaryMainFrameURL() const { - return GetWebContents().GetPrimaryMainFrame()->GetLastCommittedURL(); -} - -url::Origin AwAutofillClient::GetLastCommittedPrimaryMainFrameOrigin() const { - return GetWebContents().GetPrimaryMainFrame()->GetLastCommittedOrigin(); -} - -security_state::SecurityLevel -AwAutofillClient::GetSecurityLevelForUmaHistograms() { - // The metrics are not recorded for Android webview, so return the count value - // which will not be recorded. - return security_state::SecurityLevel::SECURITY_LEVEL_COUNT; -} - -const translate::LanguageState* AwAutofillClient::GetLanguageState() { - return nullptr; -} - -translate::TranslateDriver* AwAutofillClient::GetTranslateDriver() { - return nullptr; -} - -void AwAutofillClient::ShowAutofillSettings( - autofill::FillingProduct main_filling_product) { - NOTIMPLEMENTED(); -} - -void AwAutofillClient::ShowEditAddressProfileDialog( - const autofill::AutofillProfile& profile, - AddressProfileSavePromptCallback on_user_decision_callback) { - NOTREACHED(); -} - -void AwAutofillClient::ShowDeleteAddressProfileDialog( - const autofill::AutofillProfile& profile, - AddressProfileDeleteDialogCallback delete_dialog_callback) { - NOTREACHED(); -} - -void AwAutofillClient::ConfirmCreditCardFillAssist( - const autofill::CreditCard& card, - base::OnceClosure callback) { - NOTIMPLEMENTED(); -} - -void AwAutofillClient::ConfirmSaveAddressProfile( - const autofill::AutofillProfile& profile, - const autofill::AutofillProfile* original_profile, - SaveAddressProfilePromptOptions options, - AddressProfileSavePromptCallback callback) { - NOTIMPLEMENTED(); -} - -bool AwAutofillClient::HasCreditCardScanFeature() const { - return false; -} - -void AwAutofillClient::ScanCreditCard(CreditCardScanCallback callback) { - NOTIMPLEMENTED(); -} - -bool AwAutofillClient::ShowTouchToFillCreditCard( - base::WeakPtr<autofill::TouchToFillDelegate> delegate, - base::span<const autofill::CreditCard> cards_to_suggest) { - return false; -} - -void AwAutofillClient::HideTouchToFillCreditCard() {} - -void AwAutofillClient::ShowAutofillPopup( - const autofill::AutofillClient::PopupOpenArgs& open_args, - base::WeakPtr<autofill::AutofillPopupDelegate> delegate) { - suggestions_ = open_args.suggestions; - delegate_ = delegate; - - // Convert element_bounds to be in screen space. - gfx::Rect client_area = GetWebContents().GetContainerBounds(); - gfx::RectF element_bounds_in_screen_space = - open_args.element_bounds + client_area.OffsetFromOrigin(); - - ShowAutofillPopupImpl(element_bounds_in_screen_space, - open_args.text_direction == base::i18n::RIGHT_TO_LEFT, - open_args.suggestions); -} - -void AwAutofillClient::UpdateAutofillPopupDataListValues( - base::span<const autofill::SelectOption> datalist) { - // Leaving as an empty method since updating autofill popup window - // dynamically does not seem to be a useful feature for android webview. - // See crrev.com/18102002 if need to implement. -} - -std::vector<autofill::Suggestion> AwAutofillClient::GetPopupSuggestions() - const { - NOTIMPLEMENTED(); - return {}; -} - -void AwAutofillClient::PinPopupView() { - NOTIMPLEMENTED(); -} - -autofill::AutofillClient::PopupOpenArgs AwAutofillClient::GetReopenPopupArgs( - autofill::AutofillSuggestionTriggerSource trigger_source) const { - NOTIMPLEMENTED(); - return {}; -} - -void AwAutofillClient::UpdatePopup( - const std::vector<autofill::Suggestion>& suggestions, - autofill::FillingProduct main_filling_product, - autofill::AutofillSuggestionTriggerSource trigger_source) { - NOTIMPLEMENTED(); -} - -void AwAutofillClient::HideAutofillPopup(autofill::PopupHidingReason reason) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); - if (!obj) - return; - delegate_.reset(); - Java_AwAutofillClient_hideAutofillPopup(env, obj); -} - -bool AwAutofillClient::IsAutocompleteEnabled() const { - return false; -} - -bool AwAutofillClient::IsPasswordManagerEnabled() { - // Android WebView (since Android O+) relies on the AndroidAutofillManager, - // which does not call this function. If it ever does, the function needs to - // be implemented in a meaningful way. - NOTREACHED(); - // This is behavior preserving: For pre-O versions, AwAutofill did rely on a - // BrowserAutofillManager, which now calls the function. But pre-O only - // offered an autocomplete feature that restored values of specific input - // elements. It did not support password management. - return false; -} - -void AwAutofillClient::DidFillOrPreviewForm( - autofill::mojom::ActionPersistence action_persistence, - autofill::AutofillTriggerSource trigger_source, - bool is_refill) {} - -void AwAutofillClient::DidFillOrPreviewField( - const std::u16string& autofilled_value, - const std::u16string& profile_full_name) {} - -bool AwAutofillClient::IsContextSecure() const { - content::SSLStatus ssl_status; - content::NavigationEntry* navigation_entry = - GetWebContents().GetController().GetLastCommittedEntry(); - if (!navigation_entry) - return false; - - ssl_status = navigation_entry->GetSSL(); - // Note: As of crbug.com/701018, Chrome relies on SecurityStateTabHelper to - // determine whether the page is secure, but WebView has no equivalent class. - - return navigation_entry->GetURL().SchemeIsCryptographic() && - ssl_status.certificate && - !net::IsCertStatusError(ssl_status.cert_status) && - !(ssl_status.content_status & - content::SSLStatus::RAN_INSECURE_CONTENT); -} - -autofill::FormInteractionsFlowId -AwAutofillClient::GetCurrentFormInteractionsFlowId() { - // Currently not in use here. See `ChromeAutofillClient` for a proper - // implementation. - return {}; -} - -void AwAutofillClient::Dismissed(JNIEnv* env, - const JavaParamRef<jobject>& obj) { - anchor_view_.Reset(); -} - -void AwAutofillClient::SuggestionSelected(JNIEnv* env, - const JavaParamRef<jobject>& object, - jint position) { - if (delegate_) { - delegate_->DidAcceptSuggestion(suggestions_[position], {.row = position}); - } -} - -// Ownership: The native object is created (if autofill enabled) and owned by -// AwContents. The native object creates the java peer which handles most -// autofill functionality at the java side. The java peer is owned by Java -// AwContents. The native object only maintains a weak ref to it. -AwAutofillClient::AwAutofillClient(WebContents* contents) - : autofill::ContentAutofillClient( - contents, - base::BindRepeating(&autofill::AndroidDriverInitHook, this)) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> delegate; - delegate.Reset( - Java_AwAutofillClient_create(env, reinterpret_cast<intptr_t>(this))); - - AwContents* aw_contents = AwContents::FromWebContents(contents); - aw_contents->SetAwAutofillClient(delegate); - java_ref_ = JavaObjectWeakGlobalRef(env, delegate); -} - -void AwAutofillClient::ShowAutofillPopupImpl( - const gfx::RectF& element_bounds, - bool is_rtl, - const std::vector<autofill::Suggestion>& suggestions) { - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); - if (!obj) - return; - - // We need an array of AutofillSuggestion. - size_t count = suggestions.size(); - - ScopedJavaLocalRef<jobjectArray> data_array = - Java_AwAutofillClient_createAutofillSuggestionArray(env, count); - - for (size_t i = 0; i < count; ++i) { - ScopedJavaLocalRef<jstring> name = - ConvertUTF16ToJavaString(env, suggestions[i].main_text.value); - ScopedJavaLocalRef<jstring> label = - base::android::ConvertUTF8ToJavaString(env, std::string()); - // For Android, we only show the primary/first label in the matrix. - if (!suggestions[i].labels.empty()) - label = ConvertUTF16ToJavaString(env, suggestions[i].labels[0][0].value); - - Java_AwAutofillClient_addToAutofillSuggestionArray( - env, data_array, i, name, label, - base::to_underlying(suggestions[i].popup_item_id)); - } - ui::ViewAndroid* view_android = GetWebContents().GetNativeView(); - if (!view_android) - return; - - const ScopedJavaLocalRef<jobject> current_view = anchor_view_.view(); - if (!current_view) - anchor_view_ = view_android->AcquireAnchorView(); - - const ScopedJavaLocalRef<jobject> view = anchor_view_.view(); - if (!view) - return; - - view_android->SetAnchorRect(view, element_bounds); - Java_AwAutofillClient_showAutofillPopup(env, obj, view, is_rtl, data_array); -} - -content::WebContents& AwAutofillClient::GetWebContents() const { - // While a const_cast is not ideal. The Autofill API uses const in various - // spots and the content public API doesn't have const accessors. So the const - // cast is the lesser of two evils. - return const_cast<content::WebContents&>( - ContentAutofillClient::GetWebContents()); -} - -} // namespace android_webview
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc index b0290a2..c47a70c 100644 --- a/android_webview/browser/aw_contents.cc +++ b/android_webview/browser/aw_contents.cc
@@ -9,7 +9,6 @@ #include <string> #include <utility> -#include "android_webview/browser/aw_autofill_client.h" #include "android_webview/browser/aw_browser_context.h" #include "android_webview/browser/aw_browser_main_parts.h" #include "android_webview/browser/aw_contents_client_bridge.h" @@ -63,6 +62,7 @@ #include "base/threading/thread_restrictions.h" #include "base/trace_event/trace_event.h" #include "base/trace_event/typed_macros.h" +#include "components/android_autofill/browser/android_autofill_client.h" #include "components/android_autofill/browser/android_autofill_manager.h" #include "components/android_autofill/browser/autofill_provider_android.h" #include "components/autofill/content/browser/content_autofill_client.h" @@ -303,7 +303,9 @@ if (!autofill::AutofillProvider::FromWebContents(web_contents_.get())) { return; } - AwAutofillClient::CreateForWebContents(web_contents_.get()); + android_autofill::AndroidAutofillClient::CreateForWebContents( + web_contents_.get(), + [&](const JavaRef<jobject>& client) { SetAwAutofillClient(client); }); // We need to initialize the keyboard suppressor before creating any // AutofillManagers and after the autofill client is available. @@ -317,7 +319,7 @@ ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); if (!obj) return; - Java_AwContents_setAwAutofillClient(env, obj, client); + Java_AwContents_setAndroidAutofillClient(env, obj, client); } AwContents::~AwContents() {
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 166ac56..bf7a71c 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -93,6 +93,7 @@ import org.chromium.base.task.AsyncTask; import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; +import org.chromium.components.autofill.AndroidAutofillClient; import org.chromium.components.autofill.AutofillProvider; import org.chromium.components.autofill.AutofillSelectionMenuItemHelper; import org.chromium.components.content_capture.OnscreenContentProvider; @@ -485,7 +486,7 @@ private float mContentWidthDip; private float mContentHeightDip; - private AwAutofillClient mAwAutofillClient; + private AndroidAutofillClient mAndroidAutofillClient; private AwPdfExporter mAwPdfExporter; @@ -3756,8 +3757,8 @@ */ public void hideAutofillPopup() { if (TRACE) Log.i(TAG, "%s hideAutofillPopup", this); - if (mAwAutofillClient != null) { - mAwAutofillClient.hideAutofillPopup(); + if (mAndroidAutofillClient != null) { + mAndroidAutofillClient.hideAutofillPopup(); } if (mAutofillProvider != null) { mAutofillProvider.hideDatalistPopup(); @@ -4078,14 +4079,14 @@ } @CalledByNative - private void setAwAutofillClient(AwAutofillClient client) { - mAwAutofillClient = client; + private void setAndroidAutofillClient(AndroidAutofillClient client) { + mAndroidAutofillClient = client; client.init(mContext); } @VisibleForTesting - public AwAutofillClient getAutofillClient() { - return mAwAutofillClient; + public AndroidAutofillClient getAutofillClient() { + return mAndroidAutofillClient; } @CalledByNative
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index 6256c5c..4c382338 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -441,6 +441,9 @@ BlinkFeatures.DEPRECATE_UNLOAD, "If false prevents the gradual deprecation of the unload event."), Flag.baseFeature( + BlinkFeatures.DEPRECATE_UNLOAD_BY_ALLOW_LIST, + "Unload Deprecation respects a list of allowed origins."), + Flag.baseFeature( AwFeatures.WEBVIEW_RECORD_APP_DATA_DIRECTORY_SIZE, "Record the size of the embedding app's data directory"), Flag.baseFeature( @@ -530,6 +533,10 @@ "Allows creating WebRTC Encoded Transforms without the " + "encodedInsertableStreams RTCPeerConnection Parameter."), Flag.baseFeature( + "RTCAlignReceivedEncodedVideoTransforms", + "Aligns the JS calls by WebRTC Encoded Transforms on Video Frames with a Metronome" + + " to save power."), + Flag.baseFeature( ContentSwitches.DISABLE_DOMAIN_BLOCKING_FOR3DAP_IS, "Disable the per-domain blocking for 3D APIs after GPU reset. " + "This switch is intended only for tests."),
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index aa38a0d..2b832c9 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -3252,6 +3252,7 @@ "ambient/ui/ambient_animation_shield_controller_unittest.cc", "ambient/ui/ambient_container_view_unittest.cc", "ambient/ui/ambient_video_view_unittest.cc", + "ambient/ui/glanceable_info_view_unittest.cc", "ambient/ui/jitter_calculator_unittest.cc", "ambient/ui/media_string_view_unittest.cc", "ambient/ui/photo_view_unittest.cc",
diff --git a/ash/accessibility/magnifier/magnifier_test_utils.h b/ash/accessibility/magnifier/magnifier_test_utils.h index b0cb81e..5d38353 100644 --- a/ash/accessibility/magnifier/magnifier_test_utils.h +++ b/ash/accessibility/magnifier/magnifier_test_utils.h
@@ -6,7 +6,6 @@ #define ASH_ACCESSIBILITY_MAGNIFIER_MAGNIFIER_TEST_UTILS_H_ #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "ui/base/ime/input_method.h" #include "ui/gfx/geometry/size.h" @@ -66,9 +65,7 @@ private: ui::InputMethod* GetInputMethod(); - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION TestTextInputView* text_input_view_ = nullptr; + raw_ptr<TestTextInputView> text_input_view_ = nullptr; }; } // namespace ash
diff --git a/ash/ambient/ambient_weather_controller.cc b/ash/ambient/ambient_weather_controller.cc index c0742fad..8536094 100644 --- a/ash/ambient/ambient_weather_controller.cc +++ b/ash/ambient/ambient_weather_controller.cc
@@ -24,6 +24,7 @@ #include "chromeos/ash/components/geolocation/simple_geolocation_provider.h" #include "components/account_id/account_id.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "ui/gfx/image/image_skia.h" namespace ash { namespace { @@ -94,9 +95,13 @@ } void AmbientWeatherController::OnGeolocationPermissionChanged(bool enabled) { - // When system permission is blocked, stop scheduling new requests. + // When system permission is blocked, stop scheduling new requests and drop + // all pending requests. Also clears the weather model cache for privacy + // reasons. if (!enabled) { weather_refresh_timer_.Stop(); + weak_factory_.InvalidateWeakPtrs(); + ClearAmbientWeatherModel(); return; } @@ -111,8 +116,7 @@ std::unique_ptr<AmbientWeatherController::ScopedRefresher> AmbientWeatherController::CreateScopedRefresher() { ++num_active_scoped_refreshers_; - if (!weather_refresh_timer_.IsRunning() && - location_permission_provider_->IsGeolocationUsageAllowedForSystem()) { + if (!weather_refresh_timer_.IsRunning() && IsGeolocationUsageAllowed()) { FetchWeather(); weather_refresh_timer_.Start(FROM_HERE, kWeatherRefreshInterval, this, &AmbientWeatherController::FetchWeather); @@ -173,6 +177,14 @@ weather_model_->UpdateWeatherInfo(icon, temp_f, show_celsius); } +bool AmbientWeatherController::IsGeolocationUsageAllowed() { + return location_permission_provider_->IsGeolocationUsageAllowedForSystem(); +} + +void AmbientWeatherController::ClearAmbientWeatherModel() { + weather_model_->UpdateWeatherInfo(gfx::ImageSkia(), 0.0f, true); +} + void AmbientWeatherController::OnScopedRefresherDestroyed() { --num_active_scoped_refreshers_; CHECK_GE(num_active_scoped_refreshers_, 0);
diff --git a/ash/ambient/ambient_weather_controller.h b/ash/ambient/ambient_weather_controller.h index 7882f964..2017bd7 100644 --- a/ash/ambient/ambient_weather_controller.h +++ b/ash/ambient/ambient_weather_controller.h
@@ -62,6 +62,8 @@ AmbientWeatherModel* weather_model() { return weather_model_.get(); } private: + friend class AmbientWeatherControllerTest; + // Triggers a fetch of weather information and a download of the appropriate // weather condition icon. void FetchWeather(); @@ -75,6 +77,14 @@ bool show_celsius, const gfx::ImageSkia& icon); + // Returns true when geolocation permission is allowed for the Ambient + // Weather, i.e. geolocation access level is set either to "Allowed" or "Only + // allowed for system". + bool IsGeolocationUsageAllowed(); + + // Deletes the cached weather model. + void ClearAmbientWeatherModel(); + void OnScopedRefresherDestroyed(); const raw_ptr<SimpleGeolocationProvider> location_permission_provider_ =
diff --git a/ash/ambient/ambient_weather_controller_unittest.cc b/ash/ambient/ambient_weather_controller_unittest.cc index 66aca5a8..9512f0b 100644 --- a/ash/ambient/ambient_weather_controller_unittest.cc +++ b/ash/ambient/ambient_weather_controller_unittest.cc
@@ -13,9 +13,14 @@ #include "testing/gtest/include/gtest/gtest.h" namespace ash { -namespace { -using AmbientWeatherControllerTest = AmbientAshTestBase; +class AmbientWeatherControllerTest : public AmbientAshTestBase { + public: + bool IsGeolocationUsageAllowed() { + CHECK_NE(weather_controller(), nullptr); + return weather_controller()->IsGeolocationUsageAllowed(); + } +}; TEST_F(AmbientWeatherControllerTest, RefreshesWeather) { auto* model = weather_controller()->weather_model(); @@ -29,8 +34,7 @@ backend_controller()->SetWeatherInfo(info); // Check location permission is granted. - EXPECT_TRUE(SimpleGeolocationProvider::GetInstance() - ->IsGeolocationUsageAllowedForSystem()); + EXPECT_TRUE(IsGeolocationUsageAllowed()); auto weather_refresher = weather_controller()->CreateScopedRefresher(); base::RunLoop().RunUntilIdle(); @@ -65,29 +69,30 @@ EXPECT_TRUE(model->weather_condition_icon().isNull()); // Check location permission is enabled by default. - EXPECT_TRUE(SimpleGeolocationProvider::GetInstance() - ->IsGeolocationUsageAllowedForSystem()); + EXPECT_TRUE(IsGeolocationUsageAllowed()); WeatherInfo info; - info.show_celsius = true; + info.show_celsius = false; info.condition_icon_url = "https://fake-icon-url"; info.temp_f = 70.0f; backend_controller()->SetWeatherInfo(info); // Disable location permission and check the weather model will not get - // updated. + // updated. This should clear the weather model cache. SimpleGeolocationProvider::GetInstance()->SetGeolocationAccessLevel( GeolocationAccessLevel::kDisallowed); + EXPECT_FALSE(IsGeolocationUsageAllowed()); auto weather_refresher = weather_controller()->CreateScopedRefresher(); base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(model->show_celsius()); + // Check against the default values of `AmbientWeatherModel`. + EXPECT_TRUE(model->show_celsius()); EXPECT_TRUE(model->weather_condition_icon().isNull()); EXPECT_FLOAT_EQ(model->temperature_fahrenheit(), 0.0f); // Check again on next interval timelapse. FastForwardByWeatherRefreshInterval(); - EXPECT_FALSE(model->show_celsius()); + EXPECT_TRUE(model->show_celsius()); EXPECT_TRUE(model->weather_condition_icon().isNull()); EXPECT_FLOAT_EQ(model->temperature_fahrenheit(), 0.0f); @@ -95,8 +100,10 @@ // will get updated. SimpleGeolocationProvider::GetInstance()->SetGeolocationAccessLevel( GeolocationAccessLevel::kOnlyAllowedForSystem); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(model->show_celsius()); + EXPECT_TRUE(IsGeolocationUsageAllowed()); + + FastForwardByWeatherRefreshInterval(); + EXPECT_FALSE(model->show_celsius()); EXPECT_FALSE(model->weather_condition_icon().isNull()); EXPECT_FLOAT_EQ(model->temperature_fahrenheit(), 70.0f); @@ -104,16 +111,16 @@ // weather models. SimpleGeolocationProvider::GetInstance()->SetGeolocationAccessLevel( GeolocationAccessLevel::kAllowed); + EXPECT_TRUE(IsGeolocationUsageAllowed()); - info.show_celsius = false; + info.show_celsius = true; info.temp_f = -70.0f; backend_controller()->SetWeatherInfo(info); FastForwardByWeatherRefreshInterval(); - EXPECT_FALSE(model->show_celsius()); + EXPECT_TRUE(model->show_celsius()); EXPECT_FALSE(model->weather_condition_icon().isNull()); EXPECT_FLOAT_EQ(model->temperature_fahrenheit(), -70.0f); } -} // namespace } // namespace ash
diff --git a/ash/ambient/model/ambient_weather_model.cc b/ash/ambient/model/ambient_weather_model.cc index bf081c6..bd43ed28 100644 --- a/ash/ambient/model/ambient_weather_model.cc +++ b/ash/ambient/model/ambient_weather_model.cc
@@ -30,8 +30,7 @@ temperature_fahrenheit_ = temperature_fahrenheit; show_celsius_ = show_celsius; - if (!weather_condition_icon.isNull()) - NotifyWeatherInfoUpdated(); + NotifyWeatherInfoUpdated(); } float AmbientWeatherModel::GetTemperatureInCelsius() const {
diff --git a/ash/ambient/model/ambient_weather_model.h b/ash/ambient/model/ambient_weather_model.h index 31e0f2c..b214c8ab 100644 --- a/ash/ambient/model/ambient_weather_model.h +++ b/ash/ambient/model/ambient_weather_model.h
@@ -25,12 +25,15 @@ void AddObserver(AmbientWeatherModelObserver* observer); void RemoveObserver(AmbientWeatherModelObserver* observer); - // Updates the weather information and notifies observers if the icon image is - // not null. + // Updates the weather information and notifies observers. void UpdateWeatherInfo(const gfx::ImageSkia& weather_condition_icon, float temperature_fahrenheit, bool show_celsius); + // Checks if the model has not been fully updated. Currently there's no way to + // check if the temperature field is a valid value or not. + bool IsIncomplete() const { return weather_condition_icon_.isNull(); } + // Returns the cached condition icon. Will return a null image if it has not // been set yet. const gfx::ImageSkia& weather_condition_icon() const {
diff --git a/ash/ambient/ui/ambient_info_view.cc b/ash/ambient/ui/ambient_info_view.cc index e7622c3..aafc69b 100644 --- a/ash/ambient/ui/ambient_info_view.cc +++ b/ash/ambient/ui/ambient_info_view.cc
@@ -127,6 +127,10 @@ return adjusted_left_padding; } +GlanceableInfoView* AmbientInfoView::GetGlanceableInfoViewForTesting() const { + return glanceable_info_view_; +} + BEGIN_METADATA(AmbientInfoView, views::View) END_METADATA
diff --git a/ash/ambient/ui/ambient_info_view.h b/ash/ambient/ui/ambient_info_view.h index 7848a0e..c84c43d 100644 --- a/ash/ambient/ui/ambient_info_view.h +++ b/ash/ambient/ui/ambient_info_view.h
@@ -47,6 +47,8 @@ int GetAdjustedLeftPaddingToMatchBottom(); + GlanceableInfoView* GetGlanceableInfoViewForTesting() const; + private: void InitLayout();
diff --git a/ash/ambient/ui/glanceable_info_view.cc b/ash/ambient/ui/glanceable_info_view.cc index fa30827a..69994dd 100644 --- a/ash/ambient/ui/glanceable_info_view.cc +++ b/ash/ambient/ui/glanceable_info_view.cc
@@ -27,6 +27,7 @@ #include "ui/gfx/font_list.h" #include "ui/gfx/geometry/insets.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/views/background.h" #include "ui/views/border.h" @@ -95,14 +96,14 @@ if (!weather_model->weather_condition_icon().isNull()) { // already has weather info, show immediately. - Show(); + ShowWeather(); } } GlanceableInfoView::~GlanceableInfoView() = default; void GlanceableInfoView::OnWeatherInfoUpdated() { - Show(); + ShowWeather(); } void GlanceableInfoView::OnThemeChanged() { @@ -120,9 +121,16 @@ } } -void GlanceableInfoView::Show() { +void GlanceableInfoView::ShowWeather() { AmbientWeatherModel* weather_model = delegate_->GetAmbientWeatherModel(); + // Hide the weather info when the model is incomplete. + if (weather_model->IsIncomplete()) { + temperature_->SetText(std::u16string()); + weather_condition_icon_->SetImage(gfx::ImageSkia()); + return; + } + // When ImageView has an |image_| with different size than the |image_size_|, // it will resize and draw the |image_|. The quality is not as good as if we // resize the |image_| to be the same as the |image_size_| with |RESIZE_BEST| @@ -148,6 +156,13 @@ static_cast<int>(weather_model->temperature_fahrenheit())); } +bool GlanceableInfoView::IsWeatherConditionIconSetForTesting() const { + return !weather_condition_icon_->GetImage().isNull(); +} +bool GlanceableInfoView::IsTemperatureSetForTesting() const { + return !temperature_->GetText().empty(); +} + void GlanceableInfoView::InitLayout() { // The children of |GlanceableInfoView| will be drawn on their own // layer instead of the layer of |PhotoView| with a solid black background.
diff --git a/ash/ambient/ui/glanceable_info_view.h b/ash/ambient/ui/glanceable_info_view.h index 77cad87..05097bc0 100644 --- a/ash/ambient/ui/glanceable_info_view.h +++ b/ash/ambient/ui/glanceable_info_view.h
@@ -7,6 +7,7 @@ #include "ash/ambient/model/ambient_weather_model.h" #include "ash/ambient/model/ambient_weather_model_observer.h" +#include "ash/ash_export.h" #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "third_party/skia/include/core/SkColor.h" @@ -24,8 +25,8 @@ class TimeView; // Container for displaying a glanceable clock and weather info. -class GlanceableInfoView : public views::View, - public AmbientWeatherModelObserver { +class ASH_EXPORT GlanceableInfoView : public views::View, + public AmbientWeatherModelObserver { public: class Delegate { public: @@ -52,10 +53,13 @@ // AmbientWeatherModelObserver: void OnWeatherInfoUpdated() override; - void Show(); + void ShowWeather(); int GetTimeFontDescent(); + bool IsWeatherConditionIconSetForTesting() const; + bool IsTemperatureSetForTesting() const; + private: void InitLayout();
diff --git a/ash/ambient/ui/glanceable_info_view_unittest.cc b/ash/ambient/ui/glanceable_info_view_unittest.cc new file mode 100644 index 0000000..cb473dc3 --- /dev/null +++ b/ash/ambient/ui/glanceable_info_view_unittest.cc
@@ -0,0 +1,119 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/ambient/ui/glanceable_info_view.h" + +#include "ash/ambient/ambient_controller.h" +#include "ash/ambient/model/ambient_weather_model.h" +#include "ash/ambient/test/ambient_ash_test_base.h" +#include "ash/ambient/ui/ambient_container_view.h" +#include "ash/constants/geolocation_access_level.h" +#include "ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h" +#include "base/run_loop.h" +#include "chromeos/ash/components/geolocation/simple_geolocation_provider.h" +#include "ui/aura/window.h" +#include "ui/display/display.h" +#include "ui/display/screen.h" +#include "ui/views/widget/widget.h" + +namespace ash { + +// using GlanceableInfoViewTest = AmbientAshTestBase; + +class GlanceableInfoViewTest : public AmbientAshTestBase { + public: + GlanceableInfoViewTest() : AmbientAshTestBase() {} + ~GlanceableInfoViewTest() override = default; + + void SetUp() override { + AmbientAshTestBase::SetUp(); + + // Set test weather info. + WeatherInfo info; + info.show_celsius = true; + info.condition_icon_url = "https://fake-icon-url"; + info.temp_f = 70.0f; + backend_controller()->SetWeatherInfo(info); + + weather_model_ = weather_controller()->weather_model(); + weather_refresher_ = weather_controller()->CreateScopedRefresher(); + } + + void TearDown() override { + weather_refresher_.reset(); + weather_model_ = nullptr; + AmbientAshTestBase::TearDown(); + } + + protected: + raw_ptr<AmbientWeatherModel> weather_model_; + std::unique_ptr<AmbientWeatherController::ScopedRefresher> + weather_refresher_ = nullptr; +}; + +TEST_F(GlanceableInfoViewTest, WeatherInfoIsShown) { + // Geolocation should be allowed by default. + ASSERT_EQ( + GeolocationAccessLevel::kAllowed, + SimpleGeolocationProvider::GetInstance()->GetGeolocationAccessLevel()); + + // Wait for the initial weather fetch and check the weather model is updated. + FastForwardByWeatherRefreshInterval(); + ASSERT_FALSE(weather_model_->weather_condition_icon().isNull()); + ASSERT_FLOAT_EQ(70.0f, weather_model_->temperature_fahrenheit()); + + // Launch screensaver. + SetAmbientShownAndWaitForWidgets(); + + // Check that the weather is shown. + AmbientInfoView* ambient_info = GetAmbientInfoView(); + CHECK_NE(nullptr, ambient_info); + GlanceableInfoView* weather_info_view = + ambient_info->GetGlanceableInfoViewForTesting(); + EXPECT_TRUE(weather_info_view->IsWeatherConditionIconSetForTesting()); + EXPECT_TRUE(weather_info_view->IsTemperatureSetForTesting()); +} + +TEST_F(GlanceableInfoViewTest, WeatherInfoIsHiddenWhenGeolocationIsOff) { + // Geolocation should be allowed by default. + ASSERT_EQ( + GeolocationAccessLevel::kAllowed, + SimpleGeolocationProvider::GetInstance()->GetGeolocationAccessLevel()); + + // Wait for the initial weather fetch and check the weather model is updated. + FastForwardByWeatherRefreshInterval(); + ASSERT_FALSE(weather_model_->weather_condition_icon().isNull()); + ASSERT_FLOAT_EQ(70.0f, weather_model_->temperature_fahrenheit()); + + // Launch screensaver. + SetAmbientShownAndWaitForWidgets(); + + // Check that weather info is shown. + AmbientInfoView* ambient_info = GetAmbientInfoView(); + CHECK_NE(nullptr, ambient_info); + GlanceableInfoView* weather_info_view = + ambient_info->GetGlanceableInfoViewForTesting(); + EXPECT_TRUE(weather_info_view->IsWeatherConditionIconSetForTesting()); + EXPECT_TRUE(weather_info_view->IsTemperatureSetForTesting()); + + // Disable geolocation and check the weather info has disappeared. + SimpleGeolocationProvider::GetInstance()->SetGeolocationAccessLevel( + GeolocationAccessLevel::kDisallowed); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(weather_info_view->IsWeatherConditionIconSetForTesting()); + EXPECT_FALSE(weather_info_view->IsTemperatureSetForTesting()); + + // Re-enable geolocation permission and check that weather is shown again. + SimpleGeolocationProvider::GetInstance()->SetGeolocationAccessLevel( + GeolocationAccessLevel::kAllowed); + base::RunLoop().RunUntilIdle(); + FastForwardByWeatherRefreshInterval(); + + ASSERT_FALSE(weather_model_->weather_condition_icon().isNull()); + ASSERT_FLOAT_EQ(70.0f, weather_model_->temperature_fahrenheit()); + EXPECT_TRUE(weather_info_view->IsWeatherConditionIconSetForTesting()); + EXPECT_TRUE(weather_info_view->IsTemperatureSetForTesting()); +} + +} // namespace ash
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h index 6af35e6..2dd5ed61 100644 --- a/ash/app_list/views/app_list_view.h +++ b/ash/app_list/views/app_list_view.h
@@ -16,7 +16,6 @@ #include "base/functional/callback.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/time/time.h" #include "build/build_config.h" #include "ui/aura/window_observer.h" @@ -99,9 +98,7 @@ ~ScopedContentsResetDisabler(); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION AppListView* const view_; + const raw_ptr<AppListView> view_; }; // Does not take ownership of |delegate|.
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index dddfef67b..60bb20c 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -3250,7 +3250,7 @@ const auto& entries = view_model_.entries(); const auto iter = base::ranges::find_if(entries, [&](const auto& entry) { - return entry.view->bounds() == tile_rect && entry.view != drag_view_; + return entry.view->bounds() == tile_rect && entry.view.get() != drag_view_; }); return iter == entries.end() ? nullptr : static_cast<AppListItemView*>(iter->view);
diff --git a/ash/app_list/views/contents_view.h b/ash/app_list/views/contents_view.h index eddbfd5..05a1d56 100644 --- a/ash/app_list/views/contents_view.h +++ b/ash/app_list/views/contents_view.h
@@ -15,7 +15,6 @@ #include "ash/public/cpp/pagination/pagination_model.h" #include "ash/public/cpp/pagination/pagination_model_observer.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/views/view.h" @@ -67,9 +66,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION ContentsView* const contents_view_; + const raw_ptr<ContentsView> contents_view_; }; explicit ContentsView(AppListView* app_list_view);
diff --git a/ash/app_list/views/recent_apps_view.cc b/ash/app_list/views/recent_apps_view.cc index 158d48c..6b337a86 100644 --- a/ash/app_list/views/recent_apps_view.cc +++ b/ash/app_list/views/recent_apps_view.cc
@@ -25,7 +25,6 @@ #include "base/check.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/strings/string_util.h" #include "extensions/common/constants.h" #include "ui/base/l10n/l10n_util.h" @@ -59,12 +58,8 @@ RecentAppInfo& operator=(RecentAppInfo&) = default; ~RecentAppInfo() = default; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION AppListItem* item; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION SearchResult* result; + raw_ptr<AppListItem> item; + raw_ptr<SearchResult> result; }; // Returns a list of recent apps by filtering zero-state suggestion data.
diff --git a/ash/app_menu/notification_menu_view_unittest.cc b/ash/app_menu/notification_menu_view_unittest.cc index 8ac7766..e168f0ef 100644 --- a/ash/app_menu/notification_menu_view_unittest.cc +++ b/ash/app_menu/notification_menu_view_unittest.cc
@@ -7,7 +7,6 @@ #include "ash/app_menu/notification_item_view.h" #include "ash/app_menu/notification_menu_view_test_api.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" @@ -71,9 +70,7 @@ int overflow_added_or_removed_count_ = 0; // Owned by NotificationMenuViewTest. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION NotificationMenuView* notification_menu_view_ = nullptr; + raw_ptr<NotificationMenuView> notification_menu_view_ = nullptr; }; } // namespace
diff --git a/ash/capture_mode/capture_mode_controller.h b/ash/capture_mode/capture_mode_controller.h index d1ad79bb..549bbb96 100644 --- a/ash/capture_mode/capture_mode_controller.h +++ b/ash/capture_mode/capture_mode_controller.h
@@ -20,7 +20,7 @@ #include "base/files/file_path.h" #include "base/functional/callback_forward.h" #include "base/functional/callback_helpers.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/ref_counted_memory.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" @@ -393,9 +393,7 @@ // kWindow source, or no region is selected in a kRegion source), then a // std::nullopt is returned. struct CaptureParams { - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION aura::Window* window = nullptr; + raw_ptr<aura::Window> window = nullptr; // The capture bounds, either in root coordinates (in kFullscreen or kRegion // capture sources), or window-local coordinates (in a kWindow capture // source).
diff --git a/ash/in_session_auth/authentication_dialog.cc b/ash/in_session_auth/authentication_dialog.cc index 71a10f9..277f80e2 100644 --- a/ash/in_session_auth/authentication_dialog.cc +++ b/ash/in_session_auth/authentication_dialog.cc
@@ -15,6 +15,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "chromeos/ash/components/cryptohome/common_types.h" +#include "chromeos/ash/components/cryptohome/error_util.h" #include "chromeos/ash/components/login/auth/auth_performer.h" #include "chromeos/ash/components/login/auth/public/auth_session_intent.h" #include "chromeos/ash/components/login/auth/public/authentication_error.h" @@ -184,8 +185,9 @@ std::unique_ptr<UserContext> user_context, std::optional<AuthenticationError> authentication_error) { if (authentication_error.has_value()) { - if (authentication_error.value().get_cryptohome_code() == - user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN) { + if (cryptohome::ErrorMatches( + authentication_error.value().get_cryptohome_error(), + user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)) { // Auth session expired for some reason, start it again and reattempt // authentication. // TODO(b/240147756): Choose the intent based on
diff --git a/ash/in_session_auth/authentication_dialog_unittest.cc b/ash/in_session_auth/authentication_dialog_unittest.cc index 2b3ee78..d6c9c3b 100644 --- a/ash/in_session_auth/authentication_dialog_unittest.cc +++ b/ash/in_session_auth/authentication_dialog_unittest.cc
@@ -175,8 +175,9 @@ password == kExpectedPassword ? std::nullopt : std::optional<AuthenticationError>{AuthenticationError{ - user_data_auth:: - CRYPTOHOME_ERROR_AUTHORIZATION_KEY_NOT_FOUND}}); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth:: + CRYPTOHOME_ERROR_AUTHORIZATION_KEY_NOT_FOUND)}}); }); PressOkButton(); @@ -200,18 +201,20 @@ EXPECT_CALL(*auth_performer_, AuthenticateWithPassword(kCryptohomeGaiaKeyLabel, kExpectedPassword, _, _)) - .WillRepeatedly([&number_of_calls]( - const std::string& key_label, - const std::string& password, - std::unique_ptr<UserContext> user_context, - AuthOperationCallback callback) { - std::move(callback).Run( - std::move(user_context), - number_of_calls++ - ? std::nullopt - : std::optional<AuthenticationError>{AuthenticationError{ - user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN}}); - }); + .WillRepeatedly( + [&number_of_calls](const std::string& key_label, + const std::string& password, + std::unique_ptr<UserContext> user_context, + AuthOperationCallback callback) { + std::move(callback).Run( + std::move(user_context), + number_of_calls++ + ? std::nullopt + : std::optional<AuthenticationError>{AuthenticationError{ + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth:: + CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)}}); + }); EXPECT_CALL(*auth_token_provider_, ExchangeForToken) .WillOnce(testing::Invoke(this, &AuthenticationDialogTest::GetAuthToken));
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc index f11ae46..ee062bc 100644 --- a/ash/login/login_screen_controller.cc +++ b/ash/login/login_screen_controller.cc
@@ -534,7 +534,7 @@ << authentication_stage_; } - // Dimiss the toast created by `ShowKioskAppError`, if any. + // Dismiss the toast created by `ShowKioskAppError`, if any. Shell::Get()->toast_manager()->Cancel(kKioskToastId); // Still handle it to avoid crashes during Login/Lock/Unlock flows.
diff --git a/ash/login/ui/fake_smart_lock_auth_factor_model.h b/ash/login/ui/fake_smart_lock_auth_factor_model.h index 1a4ce450..8e57f8a 100644 --- a/ash/login/ui/fake_smart_lock_auth_factor_model.h +++ b/ash/login/ui/fake_smart_lock_auth_factor_model.h
@@ -6,7 +6,7 @@ #define ASH_LOGIN_UI_FAKE_SMART_LOCK_AUTH_FACTOR_MODEL_H_ #include "ash/login/ui/smart_lock_auth_factor_model.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" namespace ash { @@ -37,9 +37,8 @@ FakeSmartLockAuthFactorModel* GetLastCreatedModel(); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSmartLockAuthFactorModel* last_created_model_ = nullptr; + raw_ptr<FakeSmartLockAuthFactorModel, DanglingUntriaged> last_created_model_ = + nullptr; }; } // namespace ash
diff --git a/ash/public/cpp/pagination/pagination_model_unittest.cc b/ash/public/cpp/pagination/pagination_model_unittest.cc index 53b84a4..159bb894 100644 --- a/ash/public/cpp/pagination/pagination_model_unittest.cc +++ b/ash/public/cpp/pagination/pagination_model_unittest.cc
@@ -8,7 +8,7 @@ #include "ash/public/cpp/pagination/pagination_model_observer.h" #include "base/compiler_specific.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" @@ -104,9 +104,7 @@ void TransitionEnded() override { ++transition_ended_call_count_; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION PaginationModel* model_ = nullptr; + raw_ptr<PaginationModel, DanglingUntriaged> model_ = nullptr; int expected_page_selection_ = 0; int expected_transition_start_ = 0; @@ -124,9 +122,7 @@ int transition_start_call_count_ = 0; int transition_ended_call_count_ = 0; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION base::RunLoop* wait_loop_ = nullptr; + raw_ptr<base::RunLoop, DanglingUntriaged> wait_loop_ = nullptr; }; class PaginationModelTest : public views::test::WidgetTest {
diff --git a/ash/public/cpp/system/toast_data.h b/ash/public/cpp/system/toast_data.h index ef78cec..3e1c6fe 100644 --- a/ash/public/cpp/system/toast_data.h +++ b/ash/public/cpp/system/toast_data.h
@@ -60,8 +60,8 @@ bool show_on_all_root_windows = false; // TODO(b/259100049): We should turn this into a `OnceClosure`. base::RepeatingClosure dismiss_callback; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon* leading_icon; base::OnceClosure expired_callback; base::TimeTicks time_created;
diff --git a/ash/quick_pair/repository/fast_pair/pairing_metadata.h b/ash/quick_pair/repository/fast_pair/pairing_metadata.h index 648046c..db87981 100644 --- a/ash/quick_pair/repository/fast_pair/pairing_metadata.h +++ b/ash/quick_pair/repository/fast_pair/pairing_metadata.h
@@ -7,7 +7,7 @@ #include <vector> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" namespace ash { namespace quick_pair { @@ -24,9 +24,7 @@ PairingMetadata(PairingMetadata&&); ~PairingMetadata(); - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION DeviceMetadata* device_metadata; + raw_ptr<DeviceMetadata, DanglingUntriaged> device_metadata; std::vector<uint8_t> account_key; };
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h index 9a3becd..9fbf88a 100644 --- a/ash/shelf/shelf_layout_manager.h +++ b/ash/shelf/shelf_layout_manager.h
@@ -31,7 +31,6 @@ #include "ash/wm/wm_default_layout_manager.h" #include "ash/wm/workspace/workspace_types.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/scoped_observation.h" @@ -111,9 +110,7 @@ ~ScopedSuspendWorkAreaUpdate(); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION ShelfLayoutManager* const manager_; + const raw_ptr<ShelfLayoutManager> manager_; }; // Used to maintain a lock for the shelf visibility state. If locked, then we
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index f38cd34..390b495ca 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Jou foon moet mobiele data hê om 'n warmkol te verskaf</translation> <translation id="2727175239389218057">Antwoord</translation> <translation id="2727977024730340865">By 'n laekrag-laaier ingeprop. Laai van battery is dalk nie betroubaar nie.</translation> +<translation id="2744221223678373668">Gedeelde</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Vee uit"</translation> <translation id="2750941250130734256">Aktiewe venster is losgemaak.</translation> <translation id="2761723519669354964">Maak gemerkte item uit rak oop</translation> +<translation id="2762000892062317888">sopas</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> tot <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> bestuur deur <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 33ed4d8a..11342cad 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">የእርስዎ ስልክ ሆትስፖት ማቅረብ እንዲችል ሞባይል ውሂብ ሊኖረው ይገባል</translation> <translation id="2727175239389218057">ምላሽ ስጥ</translation> <translation id="2727977024730340865">አነስተኛ ኃይል ወዳለው ባትሪ መሙያ ተሰክቷል። የባትሪ መሙላት አስተማማኝ ላይሆን ይችላል።</translation> +<translation id="2744221223678373668">የተጋራ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />፣ <ph name="PRICE" /></translation> <translation id="2750932254614666392">«ሰርዝ»</translation> <translation id="2750941250130734256">ገባሪ መስኮት ተነቅሏል።</translation> <translation id="2761723519669354964">የደመቀ ንጥልን ከመደርደሪያ ክፈት</translation> +<translation id="2762000892062317888">አሁን</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> በ<ph name="KEY_TWO" /> በኩል</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> በ<ph name="MANAGER" /> የሚተዳደር ነው</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 964bb7c4..9aab5680 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -390,7 +390,7 @@ <translation id="2624588537172718173">صوت الجهاز والميكروفون</translation> <translation id="263399434338050016">"اختيار الكل"</translation> <translation id="2644422758626431000">تثبيت النافذة على اليمين</translation> -<translation id="2645435784669275700">نظام التشغيل Chrome</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">لقطة نافذة</translation> <translation id="2653659639078652383">إرسال</translation> <translation id="2658778018866295321">انقر واسحب</translation> @@ -410,10 +410,12 @@ <translation id="2726420622004325180">يجب أن يتوفّر في هاتفك اتصال بيانات الجوّال لتتمكّن من تفعيل ميزة "نقطة الاتصال".</translation> <translation id="2727175239389218057">الرّد</translation> <translation id="2727977024730340865">تمّ توصيل شاحن منخفض الطاقة. لذا قد لا تكون عملية شحن البطارية جديرة بالثقة.</translation> +<translation id="2744221223678373668">مشتركة</translation> <translation id="2749082172777216925">التطبيق <ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation> <translation id="2750932254614666392">"حذف"</translation> <translation id="2750941250130734256">تم إلغاء إرساء النافذة النشطة.</translation> <translation id="2761723519669354964">فتح العنصر المميّز من الرف</translation> +<translation id="2762000892062317888">الآن</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> من <ph name="KEY_ONE" /> إلى <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+Search+s</translation> <translation id="2778650143428714839">تتم إدارة <ph name="DEVICE_TYPE" /> من خلال <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 0155d4a..690c083 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">এটা হটস্পট প্ৰদান কৰিবলৈ আপোনাৰ ফ’নত ম’বাইল ডেটা থাকিবই লাগিব</translation> <translation id="2727175239389218057">প্ৰত্যুত্তৰ দিয়ক</translation> <translation id="2727977024730340865">কম পাৱাৰৰ এটা চাৰ্জাৰত প্লাগ ইন কৰা হৈছে। বেটাৰীৰ চাৰ্জিং বিশ্বাসযোগ্য নহ'বও পাৰে।</translation> +<translation id="2744221223678373668">শ্বেয়াৰ কৰা</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"মচক"</translation> <translation id="2750941250130734256">ড’ক নকৰা ৱিণ্ড’ সক্ৰিয় কৰক।</translation> <translation id="2761723519669354964">শ্বেল্ফৰ পৰা হাইলাইট কৰা বস্তু খোলক</translation> +<translation id="2762000892062317888">এইমাত্ৰ</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />ৰ পৰা <ph name="KEY_TWO" />লৈ</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> <ph name="MANAGER" />এ পৰিচালনা কৰে</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 5e82a5d..1a7b449 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Hotspot təmin etmək üçün telefonunuzda mobil data olmalıdır</translation> <translation id="2727175239389218057">Cavablayın</translation> <translation id="2727977024730340865">Zəif şarjerə qoşulub. Ola bilər ki, enerji dolmasın.</translation> +<translation id="2744221223678373668">Paylaşılan</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Silin"</translation> <translation id="2750941250130734256">Aktiv pəncərə çıxarılıb.</translation> <translation id="2761723519669354964">Rəfdə vurğulanan elementi açın</translation> +<translation id="2762000892062317888">indicə</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> - <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+axtarış+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> tərəfindən idarə edilir</translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">Girişi aktiv edin</translation> <translation id="6981982820502123353">Giriş İmkanı</translation> <translation id="698231206551913481">İstifadəçi silinən kimi onunla əlaqədar bütün fayl və data həmişəlik silinəcək.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hs) ayırdetmə dəqiqliyini dəstəkləmir. Ayırdetmə dəqiqliyi <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hs) olaraq dəyişdirildi. Dəyişiklikləri saxlamaq üçün "təsdiq edin" seçiminə klikləyin. Əvvəlki ayarlar <ph name="TIMEOUT_SECONDS" /> ərzində bərpa ediləcək.</translation> <translation id="6989752354829085073">Chromebook istifadəsi haqqında məlumat üçün nəzər salın. 6 addımlıq təlimat.</translation> <translation id="7004910047186208204">Mobil dataya qoşulun</translation> <translation id="7005239792648594238">Başlamaq üçün tətbiqi açın</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 389293bc..70ae9efb 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Аўдыя з прылады і мікрафон</translation> <translation id="263399434338050016">"Выбраць усё"</translation> <translation id="2644422758626431000">Замацаваць акно злева</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Здыманне акна</translation> <translation id="2653659639078652383">Адправіць</translation> <translation id="2658778018866295321">Націснуць і перацягнуць</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Каб тэлефон мог дзейнічаць як хот-спот, ён павінен выкарыстоўваць мабільную перадачу даных</translation> <translation id="2727175239389218057">Адказаць</translation> <translation id="2727977024730340865">Падключана зарадная прылада нізкай магутнасці. Зарадка акумулятара можа быць нестабільнай.</translation> +<translation id="2744221223678373668">Абагулена</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Выдаліць"</translation> <translation id="2750941250130734256">Актыўнае акно адмацавана.</translation> <translation id="2761723519669354964">Адкрыць на панэлі доступу вылучаны элемент</translation> +<translation id="2762000892062317888">толькі што</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />…<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Пошук + S</translation> <translation id="2778650143428714839">Прыладай <ph name="DEVICE_TYPE" /> кіруе <ph name="MANAGER" /></translation> @@ -621,6 +623,7 @@ <translation id="3577473026931028326">Нешта пайшло не так. Паўтарыце спробу.</translation> <translation id="3580650856351781466">Ідзе спампоўванне файлаў для ператварэння маўлення ў тэкст</translation> <translation id="3585296979871889131">Прагляд нядаўніх фота, медыяфайлаў, апавяшчэнняў і праграм з тэлефона</translation> +<translation id="3590441166907930941">Бакавая кнопка</translation> <translation id="3593039967545720377">Каб праглядзець гісторыю буфера абмену, націсніце <ph name="SHORTCUT_KEY_NAME" /> + V Каб пачаць, скапіруйце элемент.</translation> <translation id="3593646411856133110">Каб убачыць адкрытыя праграмы, правядзіце пальцам уверх і ўтрымлівайце</translation> <translation id="3595596368722241419">Акумулятар поўнасцю зараджаны</translation> @@ -1033,6 +1036,7 @@ <translation id="5163434717504750796">Стан акумулятара: <ph name="BATTERY_HEALTH_PERCENTAGE" />% | Колькасць цыклаў: <ph name="CYCLE_COUNT" /></translation> <translation id="5166007464919321363">Захаваць працоўны стол як шаблон</translation> <translation id="5168181903108465623">Ёсць даступныя прылады для трансляцыі</translation> +<translation id="5168753792967365150">Змяніць у Google Задачах</translation> <translation id="5170568018924773124">Паказаць у папцы</translation> <translation id="5176318573511391780">Запіс часткі экрана</translation> <translation id="5187627942836026988">Паказаць падрабязныя звесткі пра хот-спот. Хот-спот заблакіраваны адміністратарам.</translation> @@ -1302,6 +1306,8 @@ <translation id="6168622430237609329">Усталяваныя праграмы</translation> <translation id="6173151025443907148">Пры выкарыстанні Lacros уваход у некалькі ўліковых запісаў не падтрымліваецца. Выкарыстайце другі профіль браўзера або адключыце Lacros і паўтарыце спробу.</translation> <translation id="6179832488876878285">Тут можна замацаваць важныя файлы. Каб пачаць, адкрыйце праграму "Файлы".</translation> +<translation id="6180193585172850042">Кнопка "Назад"</translation> +<translation id="6180651297859206670">Кнопка "Наперад"</translation> <translation id="6182592640011875895">Адкрыць працоўны стол</translation> <translation id="6185696379715117369">На старонку ўверх</translation> <translation id="619335566042889110">Зарадзіць акумулятар поўнасцю</translation> @@ -1494,6 +1500,7 @@ <translation id="6981291220124935078">Даць доступ</translation> <translation id="6981982820502123353">Спец. магчымасці</translation> <translation id="698231206551913481">Пры выдаленні карыстальніка будуць выдалены ўсе звязаныя з ім файлы і лакальныя даныя.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> не падтрымлівае раздзяляльнасць <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Гц). Раздзяляльнасць зменена на <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Гц). Каб захаваць змяненні, націсніце "Пацвердзіць". Папярэднія налады будуць адноўлены праз <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="6989752354829085073">Удзяліце час на кароткі агляд і даведайцеся, як працаваць з Chromebook. Прайдзіце навучанне ўсяго за 6 крокаў.</translation> <translation id="7004910047186208204">Падключыцца да мабільнага інтэрнэту</translation> <translation id="7005239792648594238">Каб пачаць, адкрыйце праграму</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index c0c1e0b8..b6d1e69 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Аудио от устройството и микрофона</translation> <translation id="263399434338050016">„Select all“</translation> <translation id="2644422758626431000">Фиксиране на прозореца отляво</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Заснемане на прозореца</translation> <translation id="2653659639078652383">Изпращане</translation> <translation id="2658778018866295321">Кликване и преместване с плъзгане</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">За да предостави точка за достъп, телефонът ви трябва да има мобилни данни</translation> <translation id="2727175239389218057">Отговор</translation> <translation id="2727977024730340865">Използва се зарядно устройство с малка мощност. Зареждането на батерията може да не е надеждно.</translation> +<translation id="2744221223678373668">Споделени</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Delete“</translation> <translation id="2750941250130734256">Активният прозорец е отделен.</translation> <translation id="2761723519669354964">Отваряне на откроения елемент от лентата</translation> +<translation id="2762000892062317888">току-що</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /> <ph name="DELIMITER" /> <ph name="KEY_ONE" /> до <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + клавиша „търсене“ + s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> се управлява от <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index a96a120..9624f70 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">হটস্পট দেওয়ার জন্য আপনার ফোনে মোবাইল ডেটার অ্যাক্সেস থাকতে হবে</translation> <translation id="2727175239389218057">উত্তর দিন</translation> <translation id="2727977024730340865">একটি নিম্ন শক্তির চার্জার প্লাগইন করা হয়েছে৷ বিশ্বস্ত ব্যাটারি চার্জ নাও হতে পারে৷</translation> +<translation id="2744221223678373668">শেয়ার করে নেওয়া</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"মুছে ফেলুন"</translation> <translation id="2750941250130734256">অ্যাক্টিভ উইন্ডোটি আনডক করা হয়েছে।</translation> <translation id="2761723519669354964">শেল্ফ থেকে হাইলাইট করা আইটেম খুলুন</translation> +<translation id="2762000892062317888">এখনই</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> <ph name="KEY_TWO" />-এর মাধ্যমে</translation> <translation id="2778197796481941784">Ctrl+Search+S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />, <ph name="MANAGER" />-এর মাধ্যমে ম্যানেজ করা হয়</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 96594b3d..de4bd8c 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefon mora imati prijenos podataka na mobilnoj mreži kako bi mogao pružiti pristupnu tačku</translation> <translation id="2727175239389218057">Odgovori</translation> <translation id="2727977024730340865">Priključeno na niskonaponski punjač. Punjenje baterije može biti nepouzdano.</translation> +<translation id="2744221223678373668">Dijeljeno</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Izbrišite"</translation> <translation id="2750941250130734256">Aktivni prozor je odvojen.</translation> <translation id="2761723519669354964">Otvorite istaknute stavke s police</translation> +<translation id="2762000892062317888">maloprije</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> do <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839">Uređajem <ph name="DEVICE_TYPE" /> upravlja <ph name="MANAGER" /></translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">Uključi pristup</translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="698231206551913481">Nakon što se ukloni ovaj korisnik, trajno će se izbrisati svi fajlovi i lokalni podaci povezani s njim.</translation> +<translation id="6984028004251196682">Ekran <ph name="DISPLAY_NAME" /> ne podržava rezoluciju <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz). Rezolucija je promijenjena u <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz). Kliknite na Potvrdi da zadržite promjene. Prethodne postavke će se vratiti za <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="6989752354829085073">Krenite u kratki obilazak da saznate kako se kretati Chromebookom. Izvršite pokretanje u šest koraka.</translation> <translation id="7004910047186208204">Povežite se s prijenosom podataka na mobilnoj mreži</translation> <translation id="7005239792648594238">Otvorite aplikaciju da započnete</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 63f1039..2fdb819 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">El telèfon ha de tenir dades mòbils per proporcionar un punt d'accés</translation> <translation id="2727175239389218057">Respon</translation> <translation id="2727977024730340865">S'ha connectat a un carregador de baix consum. És possible que la càrrega de la bateria no sigui fiable.</translation> +<translation id="2744221223678373668">Compartides</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Suprimeix"</translation> <translation id="2750941250130734256">Finestra activa desacoblada.</translation> <translation id="2761723519669354964">Obre l'element marcat del prestatge</translation> +<translation id="2762000892062317888">ara mateix</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> de l'<ph name="KEY_ONE" /> al <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+cerca+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> gestionat per <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index dc64f00a..564b355a 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Aby telefon mohl sloužit jako hotspot, musí v něm být zapnutá mobilní data</translation> <translation id="2727175239389218057">Odpovědět</translation> <translation id="2727977024730340865">Byla připojena nabíječka s nízkým výkonem. Nabíjení baterie nemusí probíhat spolehlivě.</translation> +<translation id="2744221223678373668">Sdílené</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Smazat“</translation> <translation id="2750941250130734256">Aktivní okno není zadokováno.</translation> <translation id="2761723519669354964">Otevřít zvýrazněnou položku na poličce</translation> +<translation id="2762000892062317888">právě teď</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> až <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839">Zařízení <ph name="DEVICE_TYPE" /> spravované doménou <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index e53ba929..16eec878 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Rhaid bod gan eich ffôn ddata symudol i ddarparu poethfan</translation> <translation id="2727175239389218057">Ateb</translation> <translation id="2727977024730340865">Wedi'i blygio i mewn i wefrydd pŵer isel. Mae'n bosib na fydd gwefru'r batri yn ddibynadwy.</translation> +<translation id="2744221223678373668">Cafodd ei rannu â'r defnyddiwr eisoes</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Dileu"</translation> <translation id="2750941250130734256">Mae'r ffenestr weithredol wedi'i rhyddhau.</translation> <translation id="2761723519669354964">Agor yr eitem sydd wedi'i hamlygu o'r silff</translation> +<translation id="2762000892062317888">newydd ddigwydd</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> hyd at <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839">Mae <ph name="DEVICE_TYPE" /> yn cael ei reoli gan <ph name="MANAGER" />.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 1dbfbdb..f85ff56 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Din telefon skal have mobildata for at fungere som hotspot</translation> <translation id="2727175239389218057">Svar</translation> <translation id="2727977024730340865">Tilsluttet en oplader med lav kraft. Batteriopladningen er muligvis ikke pålidelig.</translation> +<translation id="2744221223678373668">Delte</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Slet"</translation> <translation id="2750941250130734256">Det aktive vindue er frigjort.</translation> <translation id="2761723519669354964">Åbn det fremhævede element på hylden</translation> +<translation id="2762000892062317888">lige nu</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />-<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+søgetast+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> administreres af <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 72cd3f5..0be6452 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Audio des Geräts und über Mikrofon</translation> <translation id="263399434338050016">„Alles auswählen“</translation> <translation id="2644422758626431000">Fenster links anpinnen</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Fensteraufnahme</translation> <translation id="2653659639078652383">Senden</translation> <translation id="2658778018866295321">Klicken und ziehen</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Damit dein Smartphone einen Hotspot nutzen kann, müssen mobile Daten aktiviert sein</translation> <translation id="2727175239389218057">Antworten</translation> <translation id="2727977024730340865">Das Gerät ist an ein Schwachstrom-Ladegerät angeschlossen. Möglicherweise kann der Akku nicht zuverlässig aufgeladen werden.</translation> +<translation id="2744221223678373668">Freigegeben</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Löschen“</translation> <translation id="2750941250130734256">Fixierung des aktiven Fensters rückgängig gemacht.</translation> <translation id="2761723519669354964">Hervorgehobenes Element in der Ablage öffnen</translation> +<translation id="2762000892062317888">gerade eben</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /> <ph name="DELIMITER" /> <ph name="KEY_ONE" /> bis <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Strg + Suchtaste + S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> verwaltet von <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index eb0fcfee..cba12498 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Ήχος συσκευής και μικρόφωνο</translation> <translation id="263399434338050016">"Επιλογή όλων"</translation> <translation id="2644422758626431000">Καρφίτσωμα παραθύρου στα αριστερά</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Λήψη παραθύρου</translation> <translation id="2653659639078652383">Υποβολή</translation> <translation id="2658778018866295321">Κάντε κλικ και σύρετε</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Το τηλέφωνό σας πρέπει να διαθέτει σύνδεση δεδομένων κινητής τηλεφωνίας για να παρέχει σημείο πρόσβασης Wi-Fi</translation> <translation id="2727175239389218057">Απάντηση</translation> <translation id="2727977024730340865">Σύνδεση με φορτιστή χαμηλής ισχύος. Η φόρτιση της μπαταρίας ενδέχεται να μη γίνεται με αξιόπιστο τρόπο.</translation> +<translation id="2744221223678373668">Κοινόχρηστο</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Διαγραφή"</translation> <translation id="2750941250130734256">Έγινε απαγκύρωση του ενεργού παραθύρου.</translation> <translation id="2761723519669354964">Άνοιγμα επισημασμένου στοιχείου από το ράφι</translation> +<translation id="2762000892062317888">μόλις τώρα</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> έως <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+αναζήτηση+s</translation> <translation id="2778650143428714839">Η διαχείριση της συσκευής <ph name="DEVICE_TYPE" /> γίνεται από τον τομέα <ph name="MANAGER" />.</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index ca8df76..32dcd995 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Device audio and microphone</translation> <translation id="263399434338050016">'Select all'</translation> <translation id="2644422758626431000">Pin window to left</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Window capture</translation> <translation id="2653659639078652383">Submit</translation> <translation id="2658778018866295321">Click and drag</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Your phone must have mobile data to provide a hotspot</translation> <translation id="2727175239389218057">Reply</translation> <translation id="2727977024730340865">Plugged in to a low-power charger. Battery charging may not be reliable.</translation> +<translation id="2744221223678373668">Shared</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">'Delete'</translation> <translation id="2750941250130734256">Active window undocked.</translation> <translation id="2761723519669354964">Open highlighted item from shelf</translation> +<translation id="2762000892062317888">just now</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> to <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> managed by <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 126a037..626a51f 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Tu teléfono debe tener los datos móviles activados para proporcionar un hotspot.</translation> <translation id="2727175239389218057">Responder</translation> <translation id="2727977024730340865">Conexión a un cargador de baja potencia. Es posible que la carga de la batería no sea confiable.</translation> +<translation id="2744221223678373668">Compartidas</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Borrar"</translation> <translation id="2750941250130734256">Se desancló la ventana activa.</translation> <translation id="2761723519669354964">Abrir el elemento destacado de la barra</translation> +<translation id="2762000892062317888">recién</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> a <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + búsqueda + s</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> administra <ph name="DEVICE_TYPE" /></translation> @@ -1281,7 +1283,7 @@ <translation id="6073451960410192870">Detener grabación</translation> <translation id="6074087755403037157">Canal beta</translation> <translation id="6093867385179428431">El administrador lo inhabilitó</translation> -<translation id="6095008505822982596">Velocidad de voz</translation> +<translation id="6095008505822982596">Velocidad de habla</translation> <translation id="6095425951508823973">Agregar conexión con <ph name="PROVIDER" /></translation> <translation id="6099678161144790572">Se editó el mes pasado</translation> <translation id="6103838137565245112">sistema</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 898ff00..3ee30bc0 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Se requieren datos móviles para activar el punto de acceso</translation> <translation id="2727175239389218057">Responder</translation> <translation id="2727977024730340865">Conectado a un cargador de baja potencia. Es posible que la carga de la batería no sea fiable.</translation> +<translation id="2744221223678373668">Compartidas</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Eliminar"</translation> <translation id="2750941250130734256">Ventana activa desanclada.</translation> <translation id="2761723519669354964">Abre el elemento destacado de la estantería</translation> +<translation id="2762000892062317888">justo ahora</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" />teclas del <ph name="KEY_ONE" /> al <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Tecla de búsqueda + S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> gestionado por <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 97c73a2..61a8052 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Teie telefonil peab kuumkoha pakkumiseks olema mobiilne andmesideühendus</translation> <translation id="2727175239389218057">Vasta</translation> <translation id="2727977024730340865">Ühendatud väikese energiakuluga laadijaga. Aku laadimine võib olla ebastabiilne.</translation> +<translation id="2744221223678373668">Jagatud</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Kustuta“</translation> <translation id="2750941250130734256">Aktiivne aken dokiti lahti.</translation> <translation id="2761723519669354964">Riiulil esile tõstetud üksuse avamine</translation> +<translation id="2762000892062317888">just praegu</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />–<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + otsinguklahv + s</translation> <translation id="2778650143428714839">Seadet <ph name="DEVICE_TYPE" /> haldab <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index dbb781c4..24b487c 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefonoak datu-konexioa erabili behar du wifi-gune bat sortzeko</translation> <translation id="2727175239389218057">Erantzun</translation> <translation id="2727977024730340865">Potentzia txikiko kargagailu bat entxufatu duzu. Agian bateria kargatzeko prozesua ez da fidagarria izango.</translation> +<translation id="2744221223678373668">Partekatutakoak</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" /> (<ph name="PRICE" />)</translation> <translation id="2750932254614666392">"Ezabatu"</translation> <translation id="2750941250130734256">Kendu zaio aingura leiho aktiboari.</translation> <translation id="2761723519669354964">Ireki apaleko elementu nabarmendua</translation> +<translation id="2762000892062317888">oraintxe</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />-<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ktrl + Bilaketa + S</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> domeinuak kudeatzen du <ph name="DEVICE_TYPE" /> gailua</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index f707bc3..af77e44a 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">تلفنتان برای ارائه نقطه اتصال باید به داده تلفن همراه دسترسی داشته باشد</translation> <translation id="2727175239389218057">پاسخ دادن</translation> <translation id="2727977024730340865">باتری به شارژر برق ضعیف متصل است. شارژ باتری ممکن است قابل اطمینان نباشد.</translation> +<translation id="2744221223678373668">اشتراکگذاری شده</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation> <translation id="2750932254614666392">«حذف»</translation> <translation id="2750941250130734256">پنجره فعال جدا شد.</translation> <translation id="2761723519669354964">باز کردن مورد برجستهشده در قفسه</translation> +<translation id="2762000892062317888">هماکنون</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> تا <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">مهار+جستجو+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> تحت مدیریت <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 384dce8..6254fce3 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Laitteen audio ja mikrofoni</translation> <translation id="263399434338050016">Valitse kaikki</translation> <translation id="2644422758626431000">Kiinnitä ikkuna vasemmalle</translation> -<translation id="2645435784669275700">Chrome-käyttöjärjestelmä</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Ikkunan tallennus</translation> <translation id="2653659639078652383">Lähetä</translation> <translation id="2658778018866295321">Klikkaa ja vedä</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Puhelimen käyttäminen modeemina edellyttää mobiilidataa</translation> <translation id="2727175239389218057">Vastaa</translation> <translation id="2727977024730340865">Pienitehoinen laturi kytketty. Akku ei ehkä lataudu luotettavasti.</translation> +<translation id="2744221223678373668">Jaettu</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">Poista</translation> <translation id="2750941250130734256">Aktiivinen ikkuna irrotettu</translation> <translation id="2761723519669354964">Avaa korostettu kohde hyllystä</translation> +<translation id="2762000892062317888">äsken</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> – <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+haku+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />: ylläpitäjä on <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 8e813f7..e6a5464 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Dapat na mayroong mobile data ang iyong telepono para makapagbigay ito ng hotspot</translation> <translation id="2727175239389218057">Sumagot</translation> <translation id="2727977024730340865">Naka-saksak sa isang low-power charger. Maaaring hindi maging tiyak ang pag-charge ng baterya.</translation> +<translation id="2744221223678373668">Nakabahagi</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"I-delete"</translation> <translation id="2750941250130734256">Naka-undock ang aktibong window.</translation> <translation id="2761723519669354964">Buksan ang naka-highlight na item sa shelf</translation> +<translation id="2762000892062317888">ngayon lang</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> hanggang <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839">Pinapamahalaan ng <ph name="MANAGER" /> ang <ph name="DEVICE_TYPE" /></translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 23c42e9..36c100ef 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Les données cellulaires doivent être activées sur votre téléphone pour que celui-ci puisse offrir un point d'accès sans fil</translation> <translation id="2727175239389218057">Répondre</translation> <translation id="2727977024730340865">L'appareil est branché à un chargeur de faible puissance. Il se peut que la recharge de la batterie ne soit pas fiable.</translation> +<translation id="2744221223678373668">Partagé</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">« Supprimer »</translation> <translation id="2750941250130734256">Fenêtre active désancrée.</translation> <translation id="2761723519669354964">Ouvrir l'élément en évidence dans l'étagère</translation> +<translation id="2762000892062317888">à l'instant</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> à <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+recherche+s</translation> <translation id="2778650143428714839">Ce <ph name="DEVICE_TYPE" /> est géré par <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 81c8528..4037bea 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Les données mobiles doivent être activées sur votre téléphone pour qu'il puisse fournir un point d'accès</translation> <translation id="2727175239389218057">Répondre</translation> <translation id="2727977024730340865">L'appareil est branché à un chargeur de faible puissance. Il se peut que la charge ne soit pas fiable.</translation> +<translation id="2744221223678373668">Partagés</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Supprimer"</translation> <translation id="2750941250130734256">Fenêtre active détachée.</translation> <translation id="2761723519669354964">Ouvrir l'élément sélectionné depuis l'étagère</translation> +<translation id="2762000892062317888">à l'instant</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> à <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+recherche+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> géré par <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 6bb055f..b29557ea 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">O teu teléfono debe ter datos móbiles para ofrecer unha zona wifi</translation> <translation id="2727175239389218057">Responder</translation> <translation id="2727977024730340865">Conectado a un cargador de baixa potencia. É posible que a carga da batería non sexa fiable.</translation> +<translation id="2744221223678373668">Compartidas</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Elimina"</translation> <translation id="2750941250130734256">Ventá activa sen fixar.</translation> <translation id="2761723519669354964">Abre o elemento destacado do andel</translation> +<translation id="2762000892062317888">agora</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> do <ph name="KEY_ONE" /> ao <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Control + Busca + S</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> xestiona este dispositivo (<ph name="DEVICE_TYPE" />)</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 211636f..c41d5c65 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">હૉટસ્પૉટની સુવિધા આપવા માટે, તમારા ફોનમાં મોબાઇલ ડેટા હોવો જરૂરી છે</translation> <translation id="2727175239389218057">જવાબ આપો</translation> <translation id="2727977024730340865">નિમ્ન-પાવર ચાર્જરમાં પ્લગ કરેલું છે. બૅટરી ચાર્જિંગ વિશ્વસનીય હશે નહીં.</translation> +<translation id="2744221223678373668">શેર કરેલી</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ડિલીટ કરો"</translation> <translation id="2750941250130734256">સક્રિય વિન્ડોને અનડૉક કરી.</translation> <translation id="2761723519669354964">શેલ્ફ પરથી હાઇલાઇટ કરેલી આઇટમ ખોલો</translation> +<translation id="2762000892062317888">હમણાં જ</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />થી <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> દ્વારા મેનેજ કરવામાં આવે છે</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index cc65728a..8ce71dc 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">आपके फ़ोन में मोबाइल डेटा होना ज़रूरी है, ताकि हॉटस्पॉट की सुविधा दी जा सके</translation> <translation id="2727175239389218057">जवाब दें</translation> <translation id="2727977024730340865">कम-शक्ति वाले चार्जर में प्लग इन करें. बैटरी चार्ज करना संभवत: विश्वसनीय नहीं होगा.</translation> +<translation id="2744221223678373668">शेयर किए गए</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"मिटाएं"</translation> <translation id="2750941250130734256">चालू विंडो को अनडॉक किया गया है.</translation> <translation id="2761723519669354964">शेल्फ़ से हाइलाइट किया गया आइटम खोलने के लिए</translation> +<translation id="2762000892062317888">अभी-अभी</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> से <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+Search+S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> को <ph name="MANAGER" /> मैनेज करता है</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 097c87e..a3923a63 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefon mora imati mobilne podatke da bi osigurao žarišnu točku</translation> <translation id="2727175239389218057">Odgovori</translation> <translation id="2727977024730340865">Uređaj je priključen na punjač male snage. Punjenje baterije možda nije pouzdano.</translation> +<translation id="2744221223678373668">Dijeljeno</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Izbriši"</translation> <translation id="2750941250130734256">Aktivan prozor je premješten.</translation> <translation id="2761723519669354964">Otvaranje istaknute stavke na traci</translation> +<translation id="2762000892062317888">upravo sada</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> do <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Pretraživanje + S</translation> <translation id="2778650143428714839">Uređajem <ph name="DEVICE_TYPE" /> upravlja <ph name="MANAGER" /></translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">Uključi pristup</translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="698231206551913481">Sve datoteke i lokalni podaci povezani s ovim korisnikom trajno će se izbrisati nakon uklanjanja korisnika.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> ne podržava <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz). Razlučivost je promijenjena u <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz). Kliknite Potvrdi da biste zadržali promjene. Prethodne postavke vratit će se za <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="6989752354829085073">Krenite u kratki obilazak i naučite upotrebljavati značajke Chromebooka. Pokrenite se u šest koraka.</translation> <translation id="7004910047186208204">Povežite se s mobilnom podatkovnom mrežom</translation> <translation id="7005239792648594238">Otvorite aplikaciju da biste započeli</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index f9cbc7f..07fdf07 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Hotspot biztosításához telefonján engedélyeznie kell a mobiladat-használatot</translation> <translation id="2727175239389218057">Válasz</translation> <translation id="2727977024730340865">Kis teljesítményű töltőt csatlakoztatott. Az akkumulátor töltése nem megbízható.</translation> +<translation id="2744221223678373668">Megosztott</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Delete” (Törlés)</translation> <translation id="2750941250130734256">Az aktív ablak nincs dokkolva.</translation> <translation id="2761723519669354964">Kiemelt elem megnyitása a polcról</translation> +<translation id="2762000892062317888">éppen most</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />–<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl + search + s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> kezelője: <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index b878706..53fa1ea 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Թեժ կետն ակտիվացնելու համար հեռախոսում պետք է միացված լինի բջջային ինտերնետը</translation> <translation id="2727175239389218057">Պատասխանել</translation> <translation id="2727977024730340865">Միացված է թույլ լիցքավորիչի: Մարտկոցի լիցքավորումը կարող է հուսալի չլինել:</translation> +<translation id="2744221223678373668">Համօգտագործված</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">«Delete» (Ջնջել)</translation> <translation id="2750941250130734256">Ակտիվ պատուհանն ապամրացված է։</translation> <translation id="2761723519669354964">Բացել առանձնացված տարրը դարակից</translation> +<translation id="2762000892062317888">հենց նոր</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />-ից <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Որոնում + S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> սարքը կառավարվում է <ph name="MANAGER" />-ի կողմից</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 67763e6..2258d9d 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Ponsel harus memiliki data seluler agar dapat mengaktifkan hotspot</translation> <translation id="2727175239389218057">Balas</translation> <translation id="2727977024730340865">Dipasang ke pengisi daya rendah. Pengisian daya baterai mungkin tidak dapat diandalkan.</translation> +<translation id="2744221223678373668">Dibagikan</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Hapus"</translation> <translation id="2750941250130734256">Jendela yang aktif dilepas kaitannya.</translation> <translation id="2761723519669354964">Buka item yang ditandai dari rak</translation> +<translation id="2762000892062317888">baru saja</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> hingga <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+penelusuran+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> dikelola oleh <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index cc9904e..fe1b276 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Síminn verður að vera með farsímagögn til að útvega heitan reit</translation> <translation id="2727175239389218057">Svara</translation> <translation id="2727977024730340865">Tengt við afllítið hleðslutæki. Hleðsla rafhlöðunnar kann að vera brigðul.</translation> +<translation id="2744221223678373668">Deilt</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Eyða“</translation> <translation id="2750941250130734256">Virkur gluggi losaður.</translation> <translation id="2761723519669354964">Opna auðkennt atriði á hillu</translation> +<translation id="2762000892062317888">rétt í þessu</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> til <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> hefur umsjón með <ph name="DEVICE_TYPE" /></translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index ee8a7c53..7d569896 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Il telefono deve avere i dati mobili per poter fornire un hotspot</translation> <translation id="2727175239389218057">Rispondi</translation> <translation id="2727977024730340865">Collegato a un caricabatterie a basso consumo. La carica della batteria potrebbe non essere affidabile.</translation> +<translation id="2744221223678373668">Condivise</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Elimina"</translation> <translation id="2750941250130734256">Finestra attiva sganciata.</translation> <translation id="2761723519669354964">Apri l'elemento evidenziato dalla barra delle app</translation> +<translation id="2762000892062317888">in questo istante</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> da <ph name="KEY_ONE" /> a <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+ Tasto per la ricerca + S</translation> <translation id="2778650143428714839">Dispositivo <ph name="DEVICE_TYPE" /> gestito da <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 3b53d9b3..1cb8583 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">כדי לספק נקודה לשיתוף אינטרנט, נדרשת חבילת גלישה בטלפון</translation> <translation id="2727175239389218057">מענה</translation> <translation id="2727977024730340865">מחובר למטען בעל מתח נמוך. ייתכן שטעינת הסוללה לא תהיה אמינה.</translation> +<translation id="2744221223678373668">משותף</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Delete" (מחיקה)</translation> <translation id="2750941250130734256">בוטלה ההצמדה של החלון הפעיל.</translation> <translation id="2761723519669354964">פתיחת הפריט המודגש מהמדף</translation> +<translation id="2762000892062317888">ברגע זה</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> עד <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+מקש החיפוש+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> מנוהל על ידי <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 38cb7043..a21ca7d 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ホットスポットを提供するにはスマートフォンにモバイルデータが必要です</translation> <translation id="2727175239389218057">返信</translation> <translation id="2727977024730340865">低電力の充電器に接続しています。バッテリーが充電されない可能性があります。</translation> +<translation id="2744221223678373668">共有</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />、<ph name="PRICE" /></translation> <translation id="2750932254614666392">"削除"</translation> <translation id="2750941250130734256">アクティブなウィンドウの固定を解除しました。</translation> <translation id="2761723519669354964">シェルフのハイライト表示されたアイテムを開きます</translation> +<translation id="2762000892062317888">たった今</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />~<ph name="KEY_TWO" /> キーを押す</translation> <translation id="2778197796481941784">Ctrl+Search+S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> は <ph name="MANAGER" /> によって管理されています</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index db56007..a98a238 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">უსადენო ქსელის უზრუნველსაყოფად თქვენს ტელეფონს უნდ ჰქონდეს მობილური ინტერნეტი</translation> <translation id="2727175239389218057">პასუხი</translation> <translation id="2727977024730340865">შეერთებულია დაბალი სიმძლავრის დამტენთან. ბატარეის დატენვა შეიძლება არ იყოს სანდო.</translation> +<translation id="2744221223678373668">გაზიარებული</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"წაშლა"</translation> <translation id="2750941250130734256">აქტიური ფანჯრის ჩამაგრება მოხსნილია.</translation> <translation id="2761723519669354964">გამოყოფილი ერთეულის გახსნა თაროდან</translation> +<translation id="2762000892062317888">ახლახან</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />-დან <ph name="KEY_TWO" />-მდე</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> იმართება <ph name="MANAGER" />-ის მიერ</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index d306dbf..390089b 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Хотспотты ұсыну үшін телефоныңызда мобильдік интернет болуы керек.</translation> <translation id="2727175239389218057">Жауап беру</translation> <translation id="2727977024730340865">Төмен қуатты зарядтағышқа жалғанған. Батареяны зарядтау кезінде қиындықтар болуы мүмкін.</translation> +<translation id="2744221223678373668">Ортақ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Жою"</translation> <translation id="2750941250130734256">Белсенді терезе бекітілмеген.</translation> <translation id="2761723519669354964">Сөреден ерекшеленген элементті ашу</translation> +<translation id="2762000892062317888">жаңа ғана</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> – <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> құрылғысын <ph name="MANAGER" /> басқарады.</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 9660727..bbff5555 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ទូរសព្ទរបស់អ្នកត្រូវតែមានទិន្នន័យទូរសព្ទចល័ត ដើម្បីផ្ដល់ហតស្ប៉ត</translation> <translation id="2727175239389218057">ឆ្លើយតប</translation> <translation id="2727977024730340865">បានដោតទៅឆ្នាំងសាកថាមពលខ្សោយ។ ការសាកថ្មប្រហែលជាមិនអាចជឿជាក់បានទេ។</translation> +<translation id="2744221223678373668">បានចែករំលែក</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"លុប"</translation> <translation id="2750941250130734256">បានផ្ដាច់វិនដូសកម្ម។</translation> <translation id="2761723519669354964">បើកធាតុដែលបានរំលេចពីធ្នើរ</translation> +<translation id="2762000892062317888">អំបាញ់មិញនេះ</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> ដល់ <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+ស្វែងរក+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> ស្ថិតក្រោមការគ្រប់គ្រងរបស់ <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 425eabe..cf81b1f 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ಹಾಟ್ಸ್ಪಾಟ್ ಒದಗಿಸಲು ನಿಮ್ಮ ಫೋನ್ನಲ್ಲಿ ಮೊಬೈಲ್ ಡೇಟಾ ಇರಬೇಕು.</translation> <translation id="2727175239389218057">ಪ್ರತ್ಯುತ್ತರಿಸಿ</translation> <translation id="2727977024730340865">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್ಗೆ ಪ್ಲಗ್ ಮಾಡಲಾಗಿದೆ. ಬ್ಯಾಟರಿ ಚಾರ್ಜಿಂಗ್ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲದಿರಬಹುದು.</translation> +<translation id="2744221223678373668">ಹಂಚಿಕೊಳ್ಳಲಾಗಿರುವುದು</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ಅಳಿಸಿ"</translation> <translation id="2750941250130734256">ಸಕ್ರಿಯ ವಿಂಡೋವನ್ನು ಅನ್ಡಾಕ್ ಮಾಡಲಾಗಿದೆ.</translation> <translation id="2761723519669354964">ಶೆಲ್ಫ್ನಿಂದ ಹೈಲೈಟ್ ಮಾಡಿದ ಐಟಂ ಅನ್ನು ತೆರೆಯಿರಿ</translation> +<translation id="2762000892062317888">ಈಗತಾನೇ</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> ರಿಂದ <ph name="KEY_TWO" /> ವರೆಗೆ</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> ಸಾಧನವನ್ನು <ph name="MANAGER" /> ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> <translation id="6981982820502123353">ಪ್ರವೇಶ</translation> <translation id="698231206551913481">ಒಮ್ಮೆ ಈ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿದಾಗ ಈ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲಾ ಫೈಲ್ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> ರೆಸಲ್ಯೂಷನ್ <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz) ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಈ ರೆಸಲ್ಯೂಷನ್ ಅನ್ನು <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz) ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ. ಬದಲಾವಣೆಗಳನ್ನು ಸೇವ್ ಮಾಡಲು 'ಖಚಿತಪಡಿಸಿ' ಕ್ಲಿಕ್ ಮಾಡಿ. ಈ ಹಿಂದಿನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು <ph name="TIMEOUT_SECONDS" /> ನಲ್ಲಿ ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="6989752354829085073">ನಿಮ್ಮ Chromebook ಅನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸುವುದು ಎಂಬುದನ್ನು ತಿಳಿಯಲು ತ್ವರಿತ ಪ್ರವಾಸವನ್ನು ವೀಕ್ಷಿಸಿ. ಇದು ಕೇವಲ 6 ಹಂತಗಳಲ್ಲಿ ತಕ್ಷಣವೇ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.</translation> <translation id="7004910047186208204">ಮೊಬೈಲ್ ಡೇಟಾಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ</translation> <translation id="7005239792648594238">ಪ್ರಾರಂಭಿಸಲು ಆ್ಯಪ್ ತೆರೆಯಿರಿ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 91974bfc..d1d308d 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">핫스팟을 제공하려면 휴대전화에서 모바일 데이터를 이용할 수 있어야 합니다.</translation> <translation id="2727175239389218057">답장</translation> <translation id="2727977024730340865">저출력 충전기에 연결되었습니다. 배터리 충전 상태가 불안정합니다.</translation> +<translation id="2744221223678373668">공유</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"삭제"</translation> <translation id="2750941250130734256">활성 창이 고정 해제되었습니다.</translation> <translation id="2761723519669354964">앱 표시줄에서 강조 표시된 항목 열기</translation> +<translation id="2762000892062317888">방금 전</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />~<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+Search+S</translation> <translation id="2778650143428714839"><ph name="MANAGER" />에서 관리하는 <ph name="DEVICE_TYPE" /></translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 91a3edcb..e3ef721 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Байланыш түйүнү катары колдонуу үчүн телефонуңузда мобилдик Интернет болушу керек.</translation> <translation id="2727175239389218057">Жооп берүү</translation> <translation id="2727977024730340865">Кубаттуулугу төмөн кубаттагычка сайылды. Батареяны кубаттоо аракети ишенимдүү эмес.</translation> +<translation id="2744221223678373668">Бөлүшүлгөн</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Өчүрүү"</translation> <translation id="2750941250130734256">Активдүү терезе ажыратылды.</translation> <translation id="2761723519669354964">Текчедеги бөлүнүп көрсөтүлгөн нерсени ачуу</translation> +<translation id="2762000892062317888">жаңы эле</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />—<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> түзмөгү <ph name="MANAGER" /> тарабынан башкарылат</translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">Мүмкүнчүлүк берүү</translation> <translation id="6981982820502123353">Атайын мүмкүн-төр</translation> <translation id="698231206551913481">Колдонуучуга тийиштүү бардык файлдар менен жергиликтүү дайындар көзөмөлдөнгөн колдонуучу чыгарылып салынганда биротоло жок болот.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Герц) дааналыкты колдоого албайт. Дааналык төмөнкүгө өзгөртүлдү: <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Герц). Өзгөртүүлөрдү сактоо үчүн "Ырастоо" баскычын басыңыз. Мурунку параметрлер <ph name="TIMEOUT_SECONDS" /> кийин калыбына келтирилет.</translation> <translation id="6989752354829085073">Chromebook'ту колдонуу боюнча кеңештерди алыңыз. Аны 6 кадам менен тууралап аласыз.</translation> <translation id="7004910047186208204">Мобилдик трафикке туташуу</translation> <translation id="7005239792648594238">Баштоо үчүн колдонмону ачыңыз</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 0b33022..cbe8f4e 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ໂທລະສັບຂອງທ່ານຕ້ອງມີອິນເຕີເນັດມືຖືເພື່ອໃຫ້ຮັອດສະປອດ</translation> <translation id="2727175239389218057">ຕອບກັບ</translation> <translation id="2727977024730340865">ສຽບໃສ່ເຄື່ອງສາກໄຟຕໍ່າແລ້ວ. ການສາກແບັດເຕີຣີອາດຈະບໍ່ເຊື່ອຖືໄດ້.</translation> +<translation id="2744221223678373668">ແຊຣ໌ແລ້ວ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ລຶບ"</translation> <translation id="2750941250130734256">ຢຸດຈອດໜ້າຈໍທີ່ນຳໃຊ້ແລ້ວ.</translation> <translation id="2761723519669354964">ເປີດລາຍການທີ່ໄຮໄລ້ໄວ້ແລ້ວຈາກຖ້ານ</translation> +<translation id="2762000892062317888">ຕອນນີ້</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> ຫາ <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> ທີ່ຖືກຈັດການໂດຍ <ph name="MANAGER" /></translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">ເປີດໃຊ້ສິດເຂົ້າເຖິງ</translation> <translation id="6981982820502123353">ການເຂົ້າເຖິງໄດ້</translation> <translation id="698231206551913481">ທຸກໄຟລ໌ ແລະ ຂໍ້ມູນພາຍໃນເຄື່ອງທີ່ເຊື່ອມໂຍງກັບຜູ້ໃຊ້ນີ້ຈະຖືກລຶບອອກໂດຍຖາວອນເມື່ອລຶບຜູ້ໃຊ້ນີ້ອອກ.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> ບໍ່ຮອງຮັບ <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz). ຄວາມລະອຽດປ່ຽນເປັນ <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz). ຄລິກຢືນຢັນເພື່ອຮັກສາການປ່ຽນແປງໄວ້. ລະບົບຈະກູ້ຄືນການຕັ້ງຄ່າກ່ອນໜ້າໃນ <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="6989752354829085073">ເບິ່ງສາທິດສັ້ນໆສຳລັບວິທີໃຊ້ Chromebook ຂອງທ່ານ. ເລີ່ມຕົ້ນ ແລະ ພ້ອມໃຊ້ໃນ 6 ຂັ້ນຕອນ.</translation> <translation id="7004910047186208204">ເຊື່ອມຕໍ່ກັບອິນເຕີເນັດມືຖື</translation> <translation id="7005239792648594238">ເປີດແອັບເພື່ອເລີ່ມຕົ້ນ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index a52edb6..6ef6079 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Įrenginio garsas ir mikrofonas</translation> <translation id="263399434338050016">„Pasirinkti viską“</translation> <translation id="2644422758626431000">Prisegti langą kairėje</translation> -<translation id="2645435784669275700">„Chrome“ OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Lango užfiksavimas</translation> <translation id="2653659639078652383">Pateikti</translation> <translation id="2658778018866295321">Spustelėti ir vilkti</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefone turi būti naudojami mobiliojo ryšio duomenys, kad jame būtų galima įjungti viešosios interneto prieigos tašką</translation> <translation id="2727175239389218057">Atsakyti</translation> <translation id="2727977024730340865">Prijungtas mažos galios įkroviklis. Akumuliatoriaus įkrovimas gali būti nepatikimas.</translation> +<translation id="2744221223678373668">Bendrinama</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Ištrinti“</translation> <translation id="2750941250130734256">Aktyvus langas pašalintas.</translation> <translation id="2761723519669354964">Atidaryti paryškintą elementą iš lentynos</translation> +<translation id="2762000892062317888">ką tik</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /> <ph name="DELIMITER" /> <ph name="KEY_ONE" />–<ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">„Ctrl“ + paieškos klavišas + s</translation> <translation id="2778650143428714839">„<ph name="DEVICE_TYPE" />“ tvarko <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 976515b9..3102adf 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Jūsu tālrunī ir jābūt aktivizētiem mobilajiem datiem, lai iespējotu tīklāju.</translation> <translation id="2727175239389218057">Atbildēt</translation> <translation id="2727977024730340865">Pievienots lādētājs ar mazu strāvas padevi. Akumulatora uzlāde var nebūt uzticama.</translation> +<translation id="2744221223678373668">Koplietojamie</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">“Delete” (Dzēst)</translation> <translation id="2750941250130734256">Aktīvā loga dokošana ir atcelta.</translation> <translation id="2761723519669354964">Atvērt plauktā izcelto vienumu</translation> +<translation id="2762000892062317888">tikko</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /> <ph name="DELIMITER" /> no <ph name="KEY_ONE" /> līdz <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> ierīci pārvalda <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 8eedbd6..900f8866 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Аудио од уредот и микрофонот</translation> <translation id="263399434338050016">„Избери сѐ“</translation> <translation id="2644422758626431000">Закачете прозорец на левата страна</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Снимање прозорец</translation> <translation id="2653659639078652383">Испрати</translation> <translation id="2658778018866295321">Кликни и повлечи</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Телефонот мора да има мобилен интернет за да обезбеди точка на пристап</translation> <translation id="2727175239389218057">Одговори</translation> <translation id="2727977024730340865">Приклучен на полнач со мало напојување. Полнењето на батеријата може да не е веродостојно.</translation> +<translation id="2744221223678373668">Споделени</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Избриши“</translation> <translation id="2750941250130734256">Активниот прозорец е изваден од приклучок.</translation> <translation id="2761723519669354964">Отворете нагласена ставка од полицата</translation> +<translation id="2762000892062317888">пред малку</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> до <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl+Search+S</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> управува со <ph name="DEVICE_TYPE" /></translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 7661a8e..14ecfc5 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ഹോട്ട്സ്പോട്ട് നൽകാൻ നിങ്ങളുടെ ഫോണിൽ മൊബൈൽ ഡാറ്റ ഉണ്ടായിരിക്കണം</translation> <translation id="2727175239389218057">മറുപടി നൽകുക</translation> <translation id="2727977024730340865">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജ്ജറിലേക്ക് പ്ലഗ് ചെയ്തിരിക്കുന്നു. ബാറ്ററി ചാർജുചെയ്യൽ വിശ്വസനീയമാകണമെന്നില്ല.</translation> +<translation id="2744221223678373668">പങ്കിട്ടു</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ഇല്ലാതാക്കുക"</translation> <translation id="2750941250130734256">സജീവ വിൻഡോ അൺഡോക്ക് ചെയ്തു.</translation> <translation id="2761723519669354964">ഷെൽഫിൽ നിന്ന് ഹൈലൈറ്റ് ചെയ്ത ഇനം തുറക്കുക</translation> +<translation id="2762000892062317888">ഇപ്പോൾ</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> മുതൽ <ph name="KEY_TWO" /> വരെ</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> മാനേജ് ചെയ്യുന്നത് <ph name="MANAGER" /> ആണ്</translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">ആക്സസ് ഓണാക്കുക</translation> <translation id="6981982820502123353">ഉപയോഗസഹായി</translation> <translation id="698231206551913481">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുമ്പോൾ അതോടൊപ്പം അയാളുമായി ബന്ധപ്പെട്ട എല്ലാ ഫയലുകളും പ്രാദേശിക വിവരങ്ങളും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" />, <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz) എന്ന റെസല്യൂഷൻ പിന്തുണയ്ക്കുന്നില്ല. <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz) എന്നതിലേക്ക് റെസല്യൂഷൻ മാറ്റി. മാറ്റങ്ങൾ നിലനിർത്താൻ 'സ്ഥിരീകരിക്കുക' ക്ലിക്ക് ചെയ്യുക. മുമ്പത്തെ ക്രമീകരണം <ph name="TIMEOUT_SECONDS" /> പുനഃസ്ഥാപിക്കും.</translation> <translation id="6989752354829085073">നിങ്ങളുടെ Chromebook-നെ കുറിച്ച് മനസ്സിലാക്കാൻ ഒരു ദ്രുത ടൂർ നടത്തുക. വെറും 6 ഘട്ടങ്ങൾ മാത്രം.</translation> <translation id="7004910047186208204">മൊബൈൽ ഡാറ്റയിലേക്ക് കണക്റ്റ് ചെയ്യുക</translation> <translation id="7005239792648594238">ആരംഭിക്കാൻ ഒരു ആപ്പ് തുറക്കുക</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 800910b..4d70f62 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Таны утас сүлжээний цэг өгөхийн тулд мобайл дататай байх ёстой</translation> <translation id="2727175239389218057">Хариулах</translation> <translation id="2727977024730340865">Бага энергитэй цэнэглэгч залгасан байна. Тэжээлийг цэнэглэхгүй байж болох юм.</translation> +<translation id="2744221223678373668">Дундын</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Устгах"</translation> <translation id="2750941250130734256">Идэвхтэй цонхыг салгасан.</translation> <translation id="2761723519669354964">Тавиураас тодруулсан зүйл нээх</translation> +<translation id="2762000892062317888">дөнгөж сая</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />-с <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />-г <ph name="MANAGER" /> удирддаг</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index af9fa7a..bfc65a8 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">हॉटस्पॉट पुरवण्यासाठी तुमच्या फोनमध्ये मोबाइल डेटा असणे आवश्यक आहे</translation> <translation id="2727175239389218057">उत्तर द्या</translation> <translation id="2727977024730340865">एका निम्न-उर्जेच्या चार्जरवर प्लग इन केले. बॅटरी चार्जिंग विश्वसनीय असू शकत नाही.</translation> +<translation id="2744221223678373668">शेअर</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"हटवा"</translation> <translation id="2750941250130734256">अॅक्टिव्ह विंडो अनडॉक केली आहे.</translation> <translation id="2761723519669354964">शेल्फमधील हायलाइट केलेला आयटम उघडा</translation> +<translation id="2762000892062317888">आत्ताच</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> ते <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> हे <ph name="MANAGER" /> द्वारे व्यवस्थापित केले आहे</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 3e692546..8e1f59e5 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Audio dan mikrofon peranti</translation> <translation id="263399434338050016">"Pilih semua"</translation> <translation id="2644422758626431000">Sematkan tetingkap pada bahagian kiri</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Tangkapan tetingkap</translation> <translation id="2653659639078652383">Serah</translation> <translation id="2658778018866295321">Klik dan seret</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefon anda mestilah mempunyai data mudah alih untuk menyediakan tempat liputan</translation> <translation id="2727175239389218057">Balas</translation> <translation id="2727977024730340865">Dipalamkan pada pengecas berkuasa rendah. Pengecasan bateri mungkin tidak boleh diharapkan.</translation> +<translation id="2744221223678373668">Dikongsi</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Padam"</translation> <translation id="2750941250130734256">Tetingkap aktif tidak didok.</translation> <translation id="2761723519669354964">Buka item yang diserlahkan daripada rak</translation> +<translation id="2762000892062317888">sebentar tadi</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> hingga <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> diurus oleh <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 36d084e..b14f59fc3 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ဟော့စပေါ့ပေးရန် သင့်ဖုန်းတွင် မိုဘိုင်းဒေတာရှိရပါမည်</translation> <translation id="2727175239389218057">စာပြန်ရန်</translation> <translation id="2727977024730340865">ပါဝါနည်းသည့် အားသွင်းကိရိယာသို့ ချိတ်ဆက်ထားသည်။ ဘတ်ထရီအားသွင်းခြင်း အားကိုး၍ရမည် မဟုတ်ပါ။</translation> +<translation id="2744221223678373668">မျှဝေထား</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />၊ <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ဖျက်ရန်"</translation> <translation id="2750941250130734256">ဖွင့်ထားသည့်ဝင်းဒိုးကို ဖြုတ်လိုက်သည်။</translation> <translation id="2761723519669354964">စင်ပေါ်တွင် မြင်သာအောင်လုပ်ထားသည့် အက်ပ်ကိုဖွင့်ရန်</translation> +<translation id="2762000892062317888">ယခုလေးတင်</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> မှ <ph name="KEY_TWO" /> အထိ</translation> <translation id="2778197796481941784">Ctrl+ရှာဖွေမှု+S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> ကို <ph name="MANAGER" /> က စီမံခန့်ခွဲသည်</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 6ac09ec..789b437 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">हटस्पट सुविधा अन गर्न तपाईंको फोनमा अनिवार्य रूपमा मोबाइल डेटा उपलब्ध हुनु पर्छ</translation> <translation id="2727175239389218057">जवाफ दिनुहोस्</translation> <translation id="2727977024730340865">कम शक्ति भएको चार्जरमा प्लग इन गरिएको छ। ब्याट्री चार्जिङ भरपर्दो नहुन सक्छ।</translation> +<translation id="2744221223678373668">साझा गरिएको</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"मेटाऊ"</translation> <translation id="2750941250130734256">सक्रिय विन्डो अनडक गरिएको छ।</translation> <translation id="2761723519669354964">सेल्फबाट हाइलाइट गरिएको वस्तु खोल्नुहोस्</translation> +<translation id="2762000892062317888">भर्खरै</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> देखि <ph name="KEY_TWO" /> सम्म थिच्नुहोस्</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> ले <ph name="DEVICE_TYPE" /> व्यवस्थापन गर्छ</translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">प्रयोग गर्ने अनुमति दिनुहोस्</translation> <translation id="6981982820502123353">पहुँच</translation> <translation id="698231206551913481">एक पटक यस प्रयोगकर्तालाई मेटाइएपछि यस प्रयोगकर्तासँग सम्बन्धित सबै फाइलहरू र स्थानीय डेटा सदाका लागि मेटिनेछन्।</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> मा <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> हर्ज) रिजोल्युसन प्रयोग गर्न मिल्दैन। रिजोल्युसन परिवर्तन गरी <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" />) बनाइयो। यो परिवर्तन सेभ गर्न "पुष्टि गर्नुहोस्" बटनमा क्लिक गर्नुहोस्। <ph name="TIMEOUT_SECONDS" /> मा पहिलेका सेटिङ रिस्टोर गरिने छन्।</translation> <translation id="6989752354829085073">Chromebook चलाउने तरिका सिक्न केही समय खर्चेर यसका सुविधाहरू हेर्नुहोस्। ६ वटा चरणमा सेटअप गरी चलाउन थाल्नुहोस्।</translation> <translation id="7004910047186208204">मोबाइल डेटामा कनेक्ट गर्नुहोस्</translation> <translation id="7005239792648594238">सुरु गर्न कुनै एप खोल्नुहोस्</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 6117d22..5ffe430 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Je telefoon moet mobiele data hebben om als hotspot te werken</translation> <translation id="2727175239389218057">Reageren</translation> <translation id="2727977024730340865">Aangesloten op een laag-vermogen-lader. Opladen van de batterij mogelijk niet betrouwbaar.</translation> +<translation id="2744221223678373668">Gedeeld</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">'Verwijderen'</translation> <translation id="2750941250130734256">Actief venster losgemaakt.</translation> <translation id="2761723519669354964">Gemarkeerd item openen vanuit plank</translation> +<translation id="2762000892062317888">zojuist</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> tot en met <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+zoeken+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> beheerd door <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index dd710e2..a70c7a6e 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefonen må ha mobildata for å kunne tilby en wifi-sone</translation> <translation id="2727175239389218057">Svar</translation> <translation id="2727977024730340865">Tilkoblet laveffektslader. Batteriladingen kan være upålitelig.</translation> +<translation id="2744221223678373668">Delte</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" /> – <ph name="PRICE" /></translation> <translation id="2750932254614666392">«Slett»</translation> <translation id="2750941250130734256">Det aktive vinduet er løsnet.</translation> <translation id="2761723519669354964">Åpne det fremhevede elementet fra hyllen</translation> +<translation id="2762000892062317888">akkurat nå</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> til <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + søketasten + S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> administreres av <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 4bbf529c..5351701 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ହଟସ୍ପଟ୍ ପ୍ରଦାନ କରିବାକୁ ଆପଣଙ୍କ ଫୋନରେ ନିଶ୍ଚିତ ରୂପେ ମୋବାଇଲ ଡାଟା ଥିବା ଆବଶ୍ୟକ</translation> <translation id="2727175239389218057">ପ୍ରତ୍ୟୁତ୍ତର ଦିଅନ୍ତୁ</translation> <translation id="2727977024730340865">କମ୍-ପାୱର୍ଯୁକ୍ତ ଚାର୍ଜର୍। ବ୍ୟାଟେରୀ ଚାର୍ଜିଂ ନିର୍ଭରଯୋଗ୍ୟ ହୋଇନପାରେ।</translation> +<translation id="2744221223678373668">ସେୟାର କରାଯାଇଛି</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ଡିଲିଟ କରନ୍ତୁ"</translation> <translation id="2750941250130734256">ସକ୍ରିୟ ୱିଣ୍ଡୋକୁ ଅନଡକ କରାଯାଇଛି।</translation> <translation id="2761723519669354964">ସେଲ୍ଫରୁ ହାଇଲାଇଟ କରାଯାଇଥିବା ଆଇଟମ ଖୋଲନ୍ତୁ</translation> +<translation id="2762000892062317888">ଏହିକ୍ଷଣି</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" />ରୁ <ph name="KEY_TWO" /> ପର୍ଯ୍ୟନ୍ତ</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />, <ph name="MANAGER" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index facb2db..ea4efc8 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ਹੌਟਸਪੌਟ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ ਤੁਹਾਡੇ ਫ਼ੋਨ ਵਿੱਚ ਮੋਬਾਈਲ ਡਾਟਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ</translation> <translation id="2727175239389218057">ਜਵਾਬ ਦਿਓ</translation> <translation id="2727977024730340865">ਇੱਕ ਘੱਟ-ਪਾਵਰ ਦੇ ਚਾਰਜਰ ਨਾਲ ਪਲੱਗ-ਇਨ ਕੀਤਾ ਗਿਆ। ਬੈਟਰੀ ਚਾਰਜਿੰਗ ਭਰੋਸੇਯੋਗ ਨਹੀਂ ਵੀ ਹੋ ਸਕਦੀ।</translation> +<translation id="2744221223678373668">ਸ਼ੇਅਰ ਕੀਤਾ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ਮਿਟਾਓ"</translation> <translation id="2750941250130734256">ਕਿਰਿਆਸ਼ੀਲ ਵਿੰਡੋ ਨੂੰ ਅਣਡੌਕ ਕੀਤਾ ਗਿਆ।</translation> <translation id="2761723519669354964">ਸ਼ੈਲਫ ਤੋਂ ਉਜਾਗਰ ਕੀਤੀ ਆਈਟਮ ਖੋਲ੍ਹੋ</translation> +<translation id="2762000892062317888">ਹੁਣੇ ਹੀ</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> ਤੋਂ <ph name="KEY_TWO" /> ਤੱਕ</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="MANAGER" /> ਡੋਮੇਨ <ph name="DEVICE_TYPE" /> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ</translation> @@ -1499,6 +1501,7 @@ <translation id="6981291220124935078">ਪਹੁੰਚ ਚਾਲੂ ਕਰੋ</translation> <translation id="6981982820502123353">ਪਹੁੰਚਯੋਗਤਾ</translation> <translation id="698231206551913481">ਇਸ ਵਰਤੋਂਕਾਰ ਦੇ ਹਟਾਏ ਜਾਣ ਤੋਂ ਬਾਅਦ ਇਸ ਵਰਤੋਂਕਾਰ ਨਾਲ ਸਬੰਧਿਤ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਅਤੇ ਸਥਾਨਕ ਡਾਟੇ ਨੂੰ ਸਥਾਈ ਤੌਰ 'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz) ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ। ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨੂੰ <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz) 'ਤੇ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਤਬਦੀਲੀਆਂ ਨੂੰ ਬਣਾਈ ਰੱਖਣ ਲਈ 'ਤਸਦੀਕ ਕਰੋ' 'ਤੇ ਕਲਿੱਕ ਕਰੋ। ਪਿਛਲੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ <ph name="TIMEOUT_SECONDS" /> ਵਿੱਚ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="6989752354829085073">ਆਪਣੀ Chromebook ਨੂੰ ਚੰਗੀ ਤਰ੍ਹਾਂ ਸਮਝਣ ਲਈ ਨਵੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਾਰੇ ਜਾਣੋ। ਅੱਗੇ ਵਧੋ ਅਤੇ 6 ਪੜਾਵਾਂ ਨੂੰ ਪੂਰਾ ਕਰੋ।</translation> <translation id="7004910047186208204">ਮੋਬਾਈਲ ਡਾਟੇ ਨਾਲ ਕਨੈਕਟ ਕਰੋ</translation> <translation id="7005239792648594238">ਸ਼ੁਰੂਆਤ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਖੋਲ੍ਹੋ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index bf220ff..dcbabe5 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Mikrofon i dźwięki z urządzenia</translation> <translation id="263399434338050016">„Wybierz wszystko”</translation> <translation id="2644422758626431000">Przypnij okno z lewej strony</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Przechwytywanie okna</translation> <translation id="2653659639078652383">Prześlij</translation> <translation id="2658778018866295321">Kliknij i przeciągnij</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Aby telefon mógł działać jako punkt dostępu, musi korzystać z mobilnej transmisji danych</translation> <translation id="2727175239389218057">Odpowiedz</translation> <translation id="2727977024730340865">Podłączono ładowarkę o małej mocy. Ładowanie baterii może być nieprawidłowe.</translation> +<translation id="2744221223678373668">Udostępniane</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Usuń”</translation> <translation id="2750941250130734256">Aktywne okno zostało oddokowane.</translation> <translation id="2761723519669354964">Otwórz podświetlony element z półki</translation> +<translation id="2762000892062317888">przed chwilą</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /> <ph name="DELIMITER" /> klawisz od <ph name="KEY_ONE" /> do <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Szukaj + S</translation> <translation id="2778650143428714839">Urządzenie <ph name="DEVICE_TYPE" /> zarządzane przez <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 8035128..e3ef740 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Seu smartphone precisa usar dados móveis para fornecer um ponto de acesso</translation> <translation id="2727175239389218057">Responder</translation> <translation id="2727977024730340865">Conectado a um carregador de baixa potência. O carregamento da bateria pode não ser confiável.</translation> +<translation id="2744221223678373668">Compartilhadas</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Excluir"</translation> <translation id="2750941250130734256">Janela ativa desafixada.</translation> <translation id="2761723519669354964">Abrir item destacado na estante</translation> +<translation id="2762000892062317888">agora mesmo</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /> <ph name="DELIMITER" /> <ph name="KEY_ONE" /> a <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl + pesquisa + s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> gerenciado por <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index ee53788..ffe54992 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">O seu telemóvel tem de ter dados móveis para fornecer uma zona Wi-Fi.</translation> <translation id="2727175239389218057">Responder</translation> <translation id="2727977024730340865">Ligado a um carregador de baixo consumo. O carregamento da bateria pode não ser fiável.</translation> +<translation id="2744221223678373668">Partilhadas</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Eliminar"</translation> <translation id="2750941250130734256">Janela ativa desancorada.</translation> <translation id="2761723519669354964">Abrir o item realçado da prateleira</translation> +<translation id="2762000892062317888">agora mesmo</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> a <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+pesquisa+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> gerido por <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 6e92ca8..a04887b 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefonul trebuie să aibă date mobile pentru a crea un hotspot</translation> <translation id="2727175239389218057">Răspunde</translation> <translation id="2727977024730340865">V-ați conectat la un încărcător de putere joasă. Încărcarea bateriei poate fi nesigură.</translation> +<translation id="2744221223678373668">Comune</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">Șterge</translation> <translation id="2750941250130734256">Fereastra activă a fost desprinsă.</translation> <translation id="2761723519669354964">Deschide elementul evidențiat de pe raft</translation> +<translation id="2762000892062317888">adineauri</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> până la <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl + căutare + s</translation> <translation id="2778650143428714839">Dispozitivul <ph name="DEVICE_TYPE" /> gestionat de <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 6502f4d9..ab0d972d 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Чтобы включить точку доступа на телефоне, требуется подключение к мобильному Интернету</translation> <translation id="2727175239389218057">Ответить</translation> <translation id="2727977024730340865">Подключено маломощное зарядное устройство. Возможны проблемы при зарядке.</translation> +<translation id="2744221223678373668">Общедоступные</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Удалить"</translation> <translation id="2750941250130734256">Активное окно откреплено.</translation> <translation id="2761723519669354964">Открыть выделенный элемент на панели запуска</translation> +<translation id="2762000892062317888">только что</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> клавиши от <ph name="KEY_ONE" /> до <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Поиcк + S</translation> <translation id="2778650143428714839">Устройством <ph name="DEVICE_TYPE" /> управляет <ph name="MANAGER" />.</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index aaa8528..35c72fe 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">හොට්ස්පොට් එකක් ලබා දීමට ඔබගේ දුරකථනයේ ජංගම දත්ත තිබිය යුතුය</translation> <translation id="2727175239389218057">පිළිතුරු දෙන්න</translation> <translation id="2727977024730340865">අඩු බල චාජරයකට ප්ලග් ඉන් කර ඇත. බැටරිය චාජ් කිරිම විශ්වාස නැති විය හැක.</translation> +<translation id="2744221223678373668">හුවමාරු කළ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"මකන්න"</translation> <translation id="2750941250130734256">සක්රිය කවුළුව ඈඳීම ඉවත් කර ඇත.</translation> <translation id="2761723519669354964">රාක්කයෙන් උද්දීප්ත අයිතමය විවෘත කරන්න</translation> +<translation id="2762000892062317888">මේ දැන්</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> සිට <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> විසින් කළමනාකරණය කෙරේ</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index f2cf18a4..09c72411 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Ak chcete aktivovať hotspot, musíte v telefóne používať mobilné dáta</translation> <translation id="2727175239389218057">Odpovedať</translation> <translation id="2727977024730340865">Batéria je zapojená do nabíjačky s nízkym výkonom. Nabíjanie batérie nemusí byť spoľahlivé.</translation> +<translation id="2744221223678373668">Zdieľané</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">Odstrániť</translation> <translation id="2750941250130734256">Aktívne okno bolo uvoľnené.</translation> <translation id="2761723519669354964">Otvorenie zvýraznenej položku z poličky</translation> +<translation id="2762000892062317888">práve teraz</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> pomocou klávesa <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl + kláves vyhľadávania + s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> spravuje <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index c9957a9fa..d7ceff9 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Če želite, da telefon da na voljo dostopno točko, mora imeti vklopljen prenos podatkov v mobilnem omrežju.</translation> <translation id="2727175239389218057">Odgovori</translation> <translation id="2727977024730340865">Priključen je nizkoenergijski polnilnik. Polnjenje akumulatorja morda ne bo zanesljivo.</translation> +<translation id="2744221223678373668">V skupni rabi</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">»Izbriši«</translation> <translation id="2750941250130734256">Aktivno okno je odsidrano.</translation> <translation id="2761723519669354964">Odpiranje označenega elementa s police</translation> +<translation id="2762000892062317888">pravkar</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> od <ph name="KEY_ONE" /> do <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + iskanje + s</translation> <translation id="2778650143428714839">Napravo <ph name="DEVICE_TYPE" /> upravlja domena <ph name="MANAGER" />.</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index b849dafb..3f2ea10 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefoni yt duhet të përdorë të dhënat celulare për të ofruar një zonë qasjeje për internet</translation> <translation id="2727175239389218057">Përgjigju</translation> <translation id="2727977024730340865">E lidhur me një karikues me fuqi të ulët. Ngarkimi i baterisë mund të mos jetë i sigurt.</translation> +<translation id="2744221223678373668">Të ndara</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Fshi"</translation> <translation id="2750941250130734256">Dritarja aktive u hoq nga pozicioni.</translation> <translation id="2761723519669354964">Hap artikullin e theksuar nga rafti</translation> +<translation id="2762000892062317888">pikërisht tani</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> - <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+kërko+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> menaxhohet nga <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index b174019..07c64c7 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefon mora da ima mobilne podatke da bi pružao funkciju hotspota</translation> <translation id="2727175239389218057">Odgovori</translation> <translation id="2727977024730340865">Uređaj je uključen u punjač male snage. Punjenje baterije možda neće biti pouzdano.</translation> +<translation id="2744221223678373668">Deljeno</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Izbriši“</translation> <translation id="2750941250130734256">Aktivni prozor je odvojen.</translation> <translation id="2761723519669354964">Otvorite istaknutu stavku sa police</translation> +<translation id="2762000892062317888">malopre</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> od <ph name="KEY_ONE" /> do <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />-om upravlja <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 8b86a05a..c1f5225 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Телефон мора да има мобилне податке да би пружао функцију хотспота</translation> <translation id="2727175239389218057">Одговори</translation> <translation id="2727977024730340865">Уређај је укључен у пуњач мале снаге. Пуњење батерије можда неће бити поуздано.</translation> +<translation id="2744221223678373668">Дељено</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">„Избриши“</translation> <translation id="2750941250130734256">Активни прозор је одвојен.</translation> <translation id="2761723519669354964">Отворите истакнуту ставку са полице</translation> +<translation id="2762000892062317888">малопре</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> од <ph name="KEY_ONE" /> до <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />-ом управља <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 56c2783..9fb41b6 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefonen måste ha mobildata för att användas som surfzon</translation> <translation id="2727175239389218057">Svara</translation> <translation id="2727977024730340865">Ansluten till en laddare med låg effekt. Batteriet kanske inte laddas ordentligt.</translation> +<translation id="2744221223678373668">Delade</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">”Radera”</translation> <translation id="2750941250130734256">Det aktiva fönstret är inte längre dockat.</translation> <translation id="2761723519669354964">Öppna det markerade objektet från hyllan</translation> +<translation id="2762000892062317888">nyss</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> via <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl + sök + s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> hanteras av <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index fdea029c6..5794e3e 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Ni lazima simu yako iwe na data ya mtandao wa simu ili utumie kipengele cha mtandao pepe</translation> <translation id="2727175239389218057">Jibu</translation> <translation id="2727977024730340865">Imechomekwa katika chaja ya kawi ya chini. Huenda kuchaji kwa betri hakutakuwa kuzuri.</translation> +<translation id="2744221223678373668">Inayoshirikiwa</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Futa"</translation> <translation id="2750941250130734256">Dirisha linalotumika limepachuliwa.</translation> <translation id="2761723519669354964">Fungua kipengee kilichoangaziwa kwenye rafu</translation> +<translation id="2762000892062317888">sasa hivi tu</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> hadi <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> inadhibitiwa na <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 2778929..b37965e 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ஹாட்ஸ்பாட் இணைப்பை வழங்க உங்கள் ஃபோனில் மொபைல் டேட்டா இருக்க வேண்டும்</translation> <translation id="2727175239389218057">பதிலளி</translation> <translation id="2727977024730340865">குறைந்த சக்தியிலான சார்ஜர் செருகப்பட்டுள்ளது. பேட்டரி சார்ஜிங் நம்பகமானதாக இல்லாமல் இருக்கலாம்.</translation> +<translation id="2744221223678373668">பகிர்ந்தது</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"நீக்கு"</translation> <translation id="2750941250130734256">செயலிலுள்ள சாளரம் அன்-டாக் செய்யப்பட்டது.</translation> <translation id="2761723519669354964">ஷெல்ஃப்பில் இருந்து ஹைலைட் செய்யப்பட்டதைத் திறக்கும்</translation> +<translation id="2762000892062317888">சற்று முன்</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> முதல் <ph name="KEY_TWO" /> வரை ஏதேனும் ஒன்றை அழுத்தவும்</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> சாதனத்தை <ph name="MANAGER" /> நிர்வகிக்கிறது</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 0c59dd3..ab6a2d9e 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">హాట్స్పాట్ను అందించడానికి మీ ఫోన్ తప్పనిసరిగా మొబైల్ డేటాను కలిగి ఉండాలి</translation> <translation id="2727175239389218057">రిప్లయి ఇవ్వండి</translation> <translation id="2727977024730340865">తక్కువ-పవర్ గల ఛార్జర్కు ప్లగిన్ చేయబడింది. బ్యాటరీ ఛార్జింగ్ విశ్వసనీయంగా ఉండకపోవచ్చు.</translation> +<translation id="2744221223678373668">భాగస్వామ్యం చేయబడింది</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"తొలగించండి"</translation> <translation id="2750941250130734256">అన్డాక్ చేసిన విండోను యాక్టివేట్ చేయండి.</translation> <translation id="2761723519669354964">షెల్ఫ్లో హైలైట్ చేసిన ఐటెమ్ను తెరవండి</translation> +<translation id="2762000892062317888">ఇప్పుడే</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> నుండి <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="MANAGER" />, <ph name="DEVICE_TYPE" />ను మేనేజ్ చేస్తోంది</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 943147d..8fbf6172 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">เสียงจากอุปกรณ์และไมโครโฟน</translation> <translation id="263399434338050016">"เลือกทั้งหมด"</translation> <translation id="2644422758626431000">ปักหมุดหน้าต่างไว้ทางด้านซ้าย</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">การจับภาพหน้าต่าง</translation> <translation id="2653659639078652383">ส่ง</translation> <translation id="2658778018866295321">คลิกแล้วลาก</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">โทรศัพท์ต้องมืออินเทอร์เน็ตมือถือเพื่อการใช้งานเป็นฮอตสปอต</translation> <translation id="2727175239389218057">ตอบ</translation> <translation id="2727977024730340865">เสียบอยู่กับที่ชาร์จพลังงานต่ำ การชาร์จแบตเตอรี่อาจไม่น่าเชื่อถือ</translation> +<translation id="2744221223678373668">ที่แชร์</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"ลบ"</translation> <translation id="2750941250130734256">เลิกตรึงหน้าต่างที่ใช้งานแล้ว</translation> <translation id="2761723519669354964">เปิดรายการที่ไฮไลต์ไว้จากแถบ</translation> +<translation id="2762000892062317888">เมื่อสักครู่</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> จนถึง <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + Search + S</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> จัดการโดย <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 0a1c782..095aaa16 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Hotspot sunabilmesi için telefonunuzun mobil verisi olmalıdır</translation> <translation id="2727175239389218057">Yanıtla</translation> <translation id="2727977024730340865">Düşük güçlü bir şarj cihazına takıldı. Şarj durumu güvenilir olmayabilir.</translation> +<translation id="2744221223678373668">Paylaşıldı</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Sil"</translation> <translation id="2750941250130734256">Etkin pencere çıkarıldı.</translation> <translation id="2761723519669354964">Rafta vurgulanan öğeyi açın</translation> +<translation id="2762000892062317888">az önce</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> - <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+arama+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" />, <ph name="MANAGER" /> tarafından yönetiliyor</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 82db7f8..a2d72b0 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">Звук із пристрою і мікрофона</translation> <translation id="263399434338050016">"Вибрати все"</translation> <translation id="2644422758626431000">Закріпити вікно ліворуч</translation> -<translation id="2645435784669275700">ОС Chrome</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">Зйомка вікна</translation> <translation id="2653659639078652383">Надіслати</translation> <translation id="2658778018866295321">Натиснути й перетягнути</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">Щоб увімкнути функцію "Точка доступу", на телефоні має бути мобільний Інтернет</translation> <translation id="2727175239389218057">Відповісти</translation> <translation id="2727977024730340865">Підключено до зарядного пристрою низької потужності. Акумулятор може заряджатися неналежним чином.</translation> +<translation id="2744221223678373668">Спільні</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Видалити"</translation> <translation id="2750941250130734256">Активне вікно відкріплено.</translation> <translation id="2761723519669354964">Відкрити виділений елемент на панелі запуску</translation> +<translation id="2762000892062317888">щойно</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /> від <ph name="KEY_ONE" /> до <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl + пошук + s</translation> <translation id="2778650143428714839">Пристроєм <ph name="DEVICE_TYPE" /> керує <ph name="MANAGER" /></translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index b4c7020..1717f69 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">ہاٹ سپاٹ فراہم کرنے کے لیے آپ کے فون میں موبائل ڈیٹا کا ہونا ضروری ہے</translation> <translation id="2727175239389218057">جواب دیں</translation> <translation id="2727977024730340865">ایک کم پاور کے چارجر میں پلگ ان ہے۔ بیٹری چارجنگ ممکن ہے بھروسہ مند نہ ہو۔</translation> +<translation id="2744221223678373668">اشتراک کردہ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />، <ph name="PRICE" /></translation> <translation id="2750932254614666392">"حذف کریں"</translation> <translation id="2750941250130734256">فعال ونڈو کو غیر مقفل کیا گیا۔</translation> <translation id="2761723519669354964">شیلف سے نمایاں کردہ آئٹم کھولیں</translation> +<translation id="2762000892062317888">ابھی ابھی</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> سے <ph name="KEY_TWO" /> تک</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> <ph name="MANAGER" /> کے زیر انتظام ہے</translation> @@ -1497,6 +1499,7 @@ <translation id="6981291220124935078">رسائی آن کریں</translation> <translation id="6981982820502123353">ایکسیسبیلٹی</translation> <translation id="698231206551913481">اس صارف کو ہٹانے کے بعد اس صارف کے ساتھ وابستہ سبھی فائلیں اور مقامی ڈیٹا کو مستقل طور پر حذف کر دیا جائے گا۔</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" />(Hz<ph name="SPECIFIED_REFRESH_RATE" />) کو سپورٹ نہیں کرتا ہے۔ ریزولیوشن کو تبدیل کر کے <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz) کر دیا گیا۔ تبدیلیاں باقی رکھنے کے لیے تصدیق کریں پر کلک کریں۔ گزشتہ ترتیبات کو <ph name="TIMEOUT_SECONDS" /> میں بحال کر دیا جائے گا۔</translation> <translation id="6989752354829085073">اپنے Chromebook کے استعمال کا طریقہ جاننے کے لیے مختصر ٹؤر لیں۔ آگے بڑھ کر جلدی 6 مراحل مکمل کریں۔</translation> <translation id="7004910047186208204">موبائل ڈیٹا سے منسلک ہوں</translation> <translation id="7005239792648594238">شروع کرنے کیلئے کوئی ایپ کھولیں</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 43a5c3c..6be5db6 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Telefon mobil internetsiz hotspot tarqata olmaydi</translation> <translation id="2727175239389218057">Javob berish</translation> <translation id="2727977024730340865">Kam quvvatli zaryadlash vositasi ulanildi. Quvvatlantirishda muammolar bo‘lishi mumkin.</translation> +<translation id="2744221223678373668">Ulashilgan</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">“Oʻchirish”</translation> <translation id="2750941250130734256">Faol oyna ajratildi.</translation> <translation id="2761723519669354964">Panelda ajratilgan elementni ochish</translation> +<translation id="2762000892062317888">hozirgina</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> <ph name="KEY_TWO" /> orqali</translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839">Bu <ph name="DEVICE_TYPE" /> qurilmasi <ph name="MANAGER" /> domeni tomonidan boshqariladi</translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">Ruxsat berish</translation> <translation id="6981982820502123353">Qulayliklar</translation> <translation id="698231206551913481">Bu foydalanuvchiga tegishli barcha fayllar va mahalliy ma’lumotlar foydalanuvchi olib tashlanganda butunlay o‘chib ketadi.</translation> +<translation id="6984028004251196682"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz) tiniqlikda ishlamaydi. Tasvir <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz) tiniqligiga qaytarildi. Tasdiqlash uchun bosing. Eski sozlamalar <ph name="TIMEOUT_SECONDS" /> dan keyin tiklanadi.</translation> <translation id="6989752354829085073">Chromebook qurilmasidan qanday foydalanishni oʻrganish uchun tezkor tanishtiruvdan foydalaning. 6 ta bosqichda hammasi bilan tanishing.</translation> <translation id="7004910047186208204">Mobil internetga ulanish</translation> <translation id="7005239792648594238">Boshlash uchun ilovani oching</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 8c07872..551b154 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Điện thoại của bạn phải có dữ liệu di động thì mới dùng làm điểm phát sóng được</translation> <translation id="2727175239389218057">Trả lời</translation> <translation id="2727977024730340865">Được cắm vào bộ sạc công suất thấp. Việc sạc pin có thể không được đảm bảo.</translation> +<translation id="2744221223678373668">Được chia sẻ</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Xoá"</translation> <translation id="2750941250130734256">Đã gỡ cửa sổ đang hoạt động.</translation> <translation id="2761723519669354964">Mở mục được đánh dấu trên kệ</translation> +<translation id="2762000892062317888">vừa xong</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> rồi đến <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+tìm kiếm+s</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> này do <ph name="MANAGER" /> quản lý</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index d2e9631..987cd7f 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -389,7 +389,7 @@ <translation id="2624588537172718173">设备音频和麦克风</translation> <translation id="263399434338050016">“全选”</translation> <translation id="2644422758626431000">将窗口固定到左侧</translation> -<translation id="2645435784669275700">Chrome 操作系统</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2653019840645008922">窗口截取/录制</translation> <translation id="2653659639078652383">提交</translation> <translation id="2658778018866295321">点击并拖动</translation> @@ -409,10 +409,12 @@ <translation id="2726420622004325180">您的手机必须有移动数据网络,才能提供热点</translation> <translation id="2727175239389218057">回复</translation> <translation id="2727977024730340865">已插入低功率充电器;可能无法保证充电成功。</translation> +<translation id="2744221223678373668">已共享</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation> <translation id="2750932254614666392">“删除”</translation> <translation id="2750941250130734256">取消停靠活动窗口。</translation> <translation id="2761723519669354964">打开任务栏中的突出显示项</translation> +<translation id="2762000892062317888">刚刚</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> 至 <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + 搜索键 + S</translation> <translation id="2778650143428714839">此 <ph name="DEVICE_TYPE" /> 由 <ph name="MANAGER" /> 管理</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 921bda6..19ccfaa 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">您的手機必須具備流動數據,才能啟用熱點功能</translation> <translation id="2727175239389218057">回覆</translation> <translation id="2727977024730340865">使用低功率充電器,可能導致充電狀態不穩定。</translation> +<translation id="2744221223678373668">已分享</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation> <translation id="2750932254614666392">「刪除」</translation> <translation id="2750941250130734256">已經取消固定用緊嘅視窗。</translation> <translation id="2761723519669354964">開啟捷徑列的突顯項目</translation> +<translation id="2762000892062317888">剛剛</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> 到 <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">Ctrl + 搜尋鍵 + S 鍵</translation> <translation id="2778650143428714839"><ph name="DEVICE_TYPE" /> 由 <ph name="MANAGER" /> 管理</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 7a349cd..0851ff6 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">你的手機必須有行動數據才能提供無線基地台</translation> <translation id="2727175239389218057">回覆</translation> <translation id="2727977024730340865">使用低功率充電器,可能導致充電狀態不穩定。</translation> +<translation id="2744221223678373668">共用</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />,<ph name="PRICE" /></translation> <translation id="2750932254614666392">「刪除」</translation> <translation id="2750941250130734256">已取消固定使用中的視窗。</translation> <translation id="2761723519669354964">開啟檔案櫃中的醒目顯示項目</translation> +<translation id="2762000892062317888">剛剛</translation> <translation id="2774348302533424868">按下 <ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> 到 <ph name="KEY_TWO" /> 鍵</translation> <translation id="2778197796481941784">Ctrl + 搜尋鍵 + S 鍵</translation> <translation id="2778650143428714839">這部 <ph name="DEVICE_TYPE" /> 是由 <ph name="MANAGER" /> 管理</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 4f3aec5..5481eb3 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -409,10 +409,12 @@ <translation id="2726420622004325180">Ifoni yakho kumele ibe nedatha yeselula ukuze inikeze i-hotspot</translation> <translation id="2727175239389218057">Phendula</translation> <translation id="2727977024730340865">Ixhunye kushaja yamandla aphansi. Ukushaja ibhethri kungenzeka kungathembeki.</translation> +<translation id="2744221223678373668">Okwabiwe</translation> <translation id="2749082172777216925"><ph name="APP_NAME_INFO" />, <ph name="PRICE" /></translation> <translation id="2750932254614666392">"Sula"</translation> <translation id="2750941250130734256">Iwindi elisebenzayo lisuse ukudokha.</translation> <translation id="2761723519669354964">Vula into egqanyisiwe eshelufini</translation> +<translation id="2762000892062317888">khona manje</translation> <translation id="2774348302533424868"><ph name="MODIFIER" /><ph name="DELIMITER" /><ph name="KEY_ONE" /> ukuya kokuthi <ph name="KEY_TWO" /></translation> <translation id="2778197796481941784">ctrl+search+s</translation> <translation id="2778650143428714839">I-<ph name="DEVICE_TYPE" /> iphethwe yi-<ph name="MANAGER" /></translation> @@ -1498,6 +1500,7 @@ <translation id="6981291220124935078">Vula ukufinyelela</translation> <translation id="6981982820502123353">Ukufinyeleleka</translation> <translation id="698231206551913481">Onke amafayela nedatha yendawo ehlotshaniswa nalo msebenzisi izosuswa ngunaphakade uma lo msebenzisi asuswa.</translation> +<translation id="6984028004251196682">I-<ph name="DISPLAY_NAME" /> ayiyisekeli i-<ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz). Izinga lokucaca lishintshelwe ku-<ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz). Chofoza okuthi qinisekisa ukuze ugcine izinguquko. Amasethingi angaphambili azobuyiselwa esikhathini esingu-<ph name="TIMEOUT_SECONDS" />.</translation> <translation id="6989752354829085073">Ake uthathe uhambo oluncane ukuze ufunde indlela yokusebenzisa i-Chromebook yakho. Sukuma ugijime ngezinyathelo eziyi-6.</translation> <translation id="7004910047186208204">Xhuma kudatha yeselula</translation> <translation id="7005239792648594238">Vula i-app ukuze uqalise</translation>
diff --git a/ash/style/color_palette_controller_unittest.cc b/ash/style/color_palette_controller_unittest.cc index c3c46b20..fef64c4 100644 --- a/ash/style/color_palette_controller_unittest.cc +++ b/ash/style/color_palette_controller_unittest.cc
@@ -23,7 +23,7 @@ #include "ash/wallpaper/wallpaper_utils/wallpaper_calculated_colors.h" #include "base/functional/callback_helpers.h" #include "base/json/values_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" @@ -84,9 +84,7 @@ ui::NativeTheme* last_theme() { return last_theme_; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION ui::NativeTheme* last_theme_ = nullptr; + raw_ptr<ui::NativeTheme> last_theme_ = nullptr; int call_count_ = 0; };
diff --git a/ash/system/bluetooth/bluetooth_detailed_view_controller_unittest.cc b/ash/system/bluetooth/bluetooth_detailed_view_controller_unittest.cc index c1d5c757..27d79ed0 100644 --- a/ash/system/bluetooth/bluetooth_detailed_view_controller_unittest.cc +++ b/ash/system/bluetooth/bluetooth_detailed_view_controller_unittest.cc
@@ -22,7 +22,6 @@ #include "ash/test/ash_test_helper.h" #include "base/check.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "base/strings/string_piece.h" #include "chromeos/ash/services/bluetooth_config/fake_adapter_state_controller.h" @@ -70,10 +69,7 @@ return bluetooth_detailed_view; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeBluetoothDetailedView* bluetooth_detailed_view_ = - nullptr; + raw_ptr<FakeBluetoothDetailedView> bluetooth_detailed_view_ = nullptr; }; class FakeBluetoothDeviceListControllerFactory @@ -100,9 +96,7 @@ return bluetooth_device_list_controller; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeBluetoothDeviceListController* + raw_ptr<FakeBluetoothDeviceListController, DanglingUntriaged> bluetooth_device_list_controller_ = nullptr; };
diff --git a/ash/system/power/power_status.h b/ash/system/power/power_status.h index fa8344d..5ff0192 100644 --- a/ash/system/power/power_status.h +++ b/ash/system/power/power_status.h
@@ -10,7 +10,7 @@ #include <vector> #include "ash/ash_export.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/observer_list.h" #include "base/time/time.h" #include "chromeos/dbus/power/power_manager_client.h" @@ -110,15 +110,11 @@ // The badge (lightning bolt, exclamation mark, etc) that should be drawn // on top of the battery icon. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION const gfx::VectorIcon* icon_badge; + raw_ptr<const gfx::VectorIcon> icon_badge; // The outline for the badge, need to draw this to satisfy contrast // requirements. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION const gfx::VectorIcon* badge_outline; + raw_ptr<const gfx::VectorIcon> badge_outline; // When true and |charge_percent| is very low, special colors will be used // to alert the user.
diff --git a/ash/system/time/time_of_day.h b/ash/system/time/time_of_day.h index 35eb488..14ba96e 100644 --- a/ash/system/time/time_of_day.h +++ b/ash/system/time/time_of_day.h
@@ -11,7 +11,6 @@ #include "ash/ash_export.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/time/clock.h" #include "base/time/time.h" @@ -72,9 +71,7 @@ int offset_minutes_from_zero_hour_; // Optional Used in tests to override the time of "Now". - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const base::Clock* clock_ = nullptr; // Not owned. + raw_ptr<const base::Clock> clock_ = nullptr; // Not owned. // May be null, in which case `GetLocalTimeConverter()` returns the default // implementation.
diff --git a/ash/system/unified/deferred_update_dialog.h b/ash/system/unified/deferred_update_dialog.h index 9528324..46fb1d5 100644 --- a/ash/system/unified/deferred_update_dialog.h +++ b/ash/system/unified/deferred_update_dialog.h
@@ -6,7 +6,7 @@ #define ASH_SYSTEM_UNIFIED_DEFERRED_UPDATE_DIALOG_H_ #include "base/functional/callback.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "ui/base/models/dialog_model.h" namespace ash { @@ -49,9 +49,7 @@ DECLARE_CLASS_ELEMENT_IDENTIFIER_VALUE(kAutoUpdateCheckboxId); static DeferredUpdateDialog* dialog_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION ui::DialogModel* dialog_model_ = nullptr; + raw_ptr<ui::DialogModel> dialog_model_ = nullptr; DialogResult dialog_result_ = kClose; };
diff --git a/ash/wm/tablet_mode/tablet_mode_toggle_fullscreen_event_handler.h b/ash/wm/tablet_mode/tablet_mode_toggle_fullscreen_event_handler.h index 5fe0bd7..4d4b8f2 100644 --- a/ash/wm/tablet_mode/tablet_mode_toggle_fullscreen_event_handler.h +++ b/ash/wm/tablet_mode/tablet_mode_toggle_fullscreen_event_handler.h
@@ -7,7 +7,7 @@ #include <optional> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "ui/aura/window_observer.h" #include "ui/events/event_handler.h" @@ -33,9 +33,7 @@ private: struct DragData { int start_y_location; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION aura::Window* window; + raw_ptr<aura::Window> window; }; // ui::EventHandler:
diff --git a/base/allocator/partition_alloc_features.cc b/base/allocator/partition_alloc_features.cc index 34037443..769084f 100644 --- a/base/allocator/partition_alloc_features.cc +++ b/base/allocator/partition_alloc_features.cc
@@ -173,8 +173,8 @@ }; const base::FeatureParam<BackupRefPtrMode> kBackupRefPtrModeParam{ - &kPartitionAllocBackupRefPtr, "brp-mode", BackupRefPtrMode::kEnabled, - &kBackupRefPtrModeOptions}; + &kPartitionAllocBackupRefPtr, "brp-mode", + BackupRefPtrMode::kEnabledInSameSlotMode, &kBackupRefPtrModeOptions}; BASE_FEATURE(kPartitionAllocMemoryTagging, "PartitionAllocMemoryTagging",
diff --git a/base/check.h b/base/check.h index fd57c38..7e8fbc3 100644 --- a/base/check.h +++ b/base/check.h
@@ -14,6 +14,7 @@ #include "base/location.h" #include "base/macros/if.h" #include "base/macros/is_empty.h" +#include "base/memory/raw_ptr.h" #include "base/not_fatal_until.h" // This header defines the CHECK, DCHECK, and DPCHECK macros. @@ -141,7 +142,7 @@ // Takes ownership of `log_message`. explicit CheckError(LogMessage* log_message) : log_message_(log_message) {} - LogMessage* const log_message_; + const raw_ptr<LogMessage, DanglingUntriaged> log_message_; }; class BASE_EXPORT NotReachedError : public CheckError {
diff --git a/base/containers/adapters.h b/base/containers/adapters.h index 4dc11976..c331b1f 100644 --- a/base/containers/adapters.h +++ b/base/containers/adapters.h
@@ -30,9 +30,9 @@ Iterator end() const { return std::rend(t_); } private: - // Not a raw_ref<...> for performance reasons: on-stack pointer. - // It is only used inside for loops. Ideally, the container being iterated - // over should be the one held via a raw_ref/raw_ptrs. + // RAW_PTR_EXCLUSION: References a STACK_ALLOCATED class. It is only used + // inside for loops. Ideally, the container being iterated over should be the + // one held via a raw_ref/raw_ptrs. RAW_PTR_EXCLUSION T& t_; };
diff --git a/base/containers/checked_iterators.h b/base/containers/checked_iterators.h index 4b80b1da..dbef27a 100644 --- a/base/containers/checked_iterators.h +++ b/base/containers/checked_iterators.h
@@ -190,14 +190,9 @@ CHECK_EQ(end_, other.end_); } - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union, #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: T can be a STACK_ALLOCATED class. RAW_PTR_EXCLUSION const T* start_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union, #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION T* current_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union, #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION const T* end_ = nullptr; };
diff --git a/base/containers/flat_tree.h b/base/containers/flat_tree.h index 4337b72..a0f4a54 100644 --- a/base/containers/flat_tree.h +++ b/base/containers/flat_tree.h
@@ -398,10 +398,9 @@ const K& extract_if_value_type(const K& k) const { return k; } - // This field was not rewritten into `const raw_ref<const key_compare>` due - // to binary size increase. There's also little value to rewriting this - // member as it points to `flat_tree::comp_`. The flat_tree itself should be - // holding raw_ptr/raw_ref if necessary. + // RAW_PTR_EXCLUSION: Binary size increase. There's also little value to + // rewriting this member as it points to `flat_tree::comp_` and flat_tree + // itself should be holding raw_ptr/raw_ref if necessary. RAW_PTR_EXCLUSION const key_compare& comp_; };
diff --git a/base/containers/heap_array_unittest.cc b/base/containers/heap_array_unittest.cc index 6e3b824..377a326 100644 --- a/base/containers/heap_array_unittest.cc +++ b/base/containers/heap_array_unittest.cc
@@ -28,7 +28,8 @@ void set_where(size_t* where) { where_ = where; } private: - RAW_PTR_EXCLUSION size_t* where_ = nullptr; // Stack location only. + // RAW_PTR_EXCLUSION: Stack location only. + RAW_PTR_EXCLUSION size_t* where_ = nullptr; }; } // namespace
diff --git a/base/containers/intrusive_heap_unittest.cc b/base/containers/intrusive_heap_unittest.cc index 7a54e83..6681c17 100644 --- a/base/containers/intrusive_heap_unittest.cc +++ b/base/containers/intrusive_heap_unittest.cc
@@ -7,7 +7,7 @@ #include "base/check_op.h" #include "base/functional/callback_helpers.h" #include "base/memory/ptr_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/notreached.h" #include "base/rand_util.h" #include "base/test/bind.h" @@ -527,9 +527,7 @@ // the contract expected of the DefaultHeapHandleAccessor. struct TestElement { int key; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #reinterpret-cast-trivial-type - RAW_PTR_EXCLUSION HeapHandle* handle; + raw_ptr<HeapHandle> handle; // Make this a min-heap by return > instead of <. bool operator<(const TestElement& other) const { return key > other.key; }
diff --git a/base/files/memory_mapped_file.h b/base/files/memory_mapped_file.h index 8d63b520..40d38a9 100644 --- a/base/files/memory_mapped_file.h +++ b/base/files/memory_mapped_file.h
@@ -149,8 +149,8 @@ File file_; - // `data_` is never allocated by PartitionAlloc, so there is no benefit to - // using a raw_ptr. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION uint8_t* data_ = nullptr; size_t length_ = 0;
diff --git a/base/i18n/icu_mergeable_data_file.h b/base/i18n/icu_mergeable_data_file.h index 3af2981..8e377ed2 100644 --- a/base/i18n/icu_mergeable_data_file.h +++ b/base/i18n/icu_mergeable_data_file.h
@@ -107,9 +107,8 @@ File lacros_file_; size_t lacros_length_ = 0; - // This field is not a raw_ptr<> because it always points to a mmap'd - // region of memory outside of the PA heap. Thus, there would be overhead - // involved with using a raw_ptr<> but no safety gains. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION uint8_t* lacros_data_ = nullptr; bool used_cached_hashes_ = false; };
diff --git a/base/logging.h b/base/logging.h index ae1bbee..3b97725 100644 --- a/base/logging.h +++ b/base/logging.h
@@ -17,6 +17,7 @@ #include "base/compiler_specific.h" #include "base/dcheck_is_on.h" #include "base/functional/callback_forward.h" +#include "base/memory/raw_ptr.h" #include "base/scoped_clear_last_error.h" #include "base/strings/string_piece.h" #include "base/strings/utf_ostream_operators.h" @@ -243,7 +244,7 @@ // |log_file_path| will be ignored, and the logging system will take ownership // of the FILE. If there's an error writing to this file, no fallback paths // will be opened. - FILE* log_file = nullptr; + raw_ptr<FILE> log_file = nullptr; // ChromeOS uses the syslog log format by default. LogFormat log_format = LogFormat::LOG_FORMAT_SYSLOG; #endif
diff --git a/base/memory/madv_free_discardable_memory_posix.h b/base/memory/madv_free_discardable_memory_posix.h index 70ef71cc..7cd5116 100644 --- a/base/memory/madv_free_discardable_memory_posix.h +++ b/base/memory/madv_free_discardable_memory_posix.h
@@ -15,6 +15,7 @@ #include "base/functional/callback.h" #include "base/memory/discardable_memory.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_exclusion.h" #include "base/sequence_checker.h" #include "base/threading/thread_collision_warner.h" #include "build/build_config.h" @@ -113,6 +114,8 @@ raw_ptr<std::atomic<size_t>> allocator_byte_count_; // Data comes from mmap() and we manage its poisioning. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION void* data_; bool is_locked_ = true;
diff --git a/base/message_loop/message_pump_epoll.h b/base/message_loop/message_pump_epoll.h index 9d0897245..6a91c7d9 100644 --- a/base/message_loop/message_pump_epoll.h +++ b/base/message_loop/message_pump_epoll.h
@@ -113,8 +113,8 @@ struct RunState { explicit RunState(Delegate* delegate) : delegate(delegate) {} - // `delegate` is not a raw_ptr<...> for performance reasons (based on - // analysis of sampling profiler data and tab_search:top100:2020). + // RAW_PTR_EXCLUSION: Performance reasons (based on analysis of sampling + // profiler data and tab_search:top100:2020). RAW_PTR_EXCLUSION Delegate* const delegate; // Used to flag that the current Run() invocation should return ASAP.
diff --git a/base/profiler/suspendable_thread_delegate_win.cc b/base/profiler/suspendable_thread_delegate_win.cc index 24191d34..f691819 100644 --- a/base/profiler/suspendable_thread_delegate_win.cc +++ b/base/profiler/suspendable_thread_delegate_win.cc
@@ -79,7 +79,8 @@ constexpr auto ThreadBasicInformation = static_cast<THREADINFOCLASS>(0); struct THREAD_BASIC_INFORMATION { NTSTATUS ExitStatus; - RAW_PTR_EXCLUSION TEB* Teb; // Filled in by the OS so cannot use raw_ptr<>. + // RAW_PTR_EXCLUSION: Filled in by the OS so cannot use raw_ptr<>. + RAW_PTR_EXCLUSION TEB* Teb; CLIENT_ID ClientId; KAFFINITY AffinityMask; LONG Priority;
diff --git a/base/ranges/algorithm.h b/base/ranges/algorithm.h index 39f5dcb7..6d86351 100644 --- a/base/ranges/algorithm.h +++ b/base/ranges/algorithm.h
@@ -108,14 +108,9 @@ } private: - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: Binary size increase (~120K on Android). RAW_PTR_EXCLUSION Pred& pred_; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION Proj1& proj1_; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION Proj2& proj2_; };
diff --git a/base/run_loop.cc b/base/run_loop.cc index ce2473e..2af8260 100644 --- a/base/run_loop.cc +++ b/base/run_loop.cc
@@ -201,7 +201,6 @@ // QuitClosure() from the owning thread before Run() or invoke Quit() directly // (which is thread-safe). DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - allow_quit_current_deprecated_ = false; return BindRepeating( &ProxyToTaskRunner, origin_task_runner_, @@ -213,7 +212,6 @@ // QuitWhenIdleClosure() from the owning thread before Run() or invoke // QuitWhenIdle() directly (which is thread-safe). DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - allow_quit_current_deprecated_ = false; return BindRepeating( &ProxyToTaskRunner, origin_task_runner_, @@ -246,31 +244,6 @@ delegate->nesting_observers_.RemoveObserver(observer); } -// static -void RunLoop::QuitCurrentDeprecated() { - DCHECK(IsRunningOnCurrentThread()); - DCHECK(delegate->active_run_loops_.top()->allow_quit_current_deprecated_) - << "Please migrate off QuitCurrentDeprecated(), e.g. to QuitClosure()."; - delegate->active_run_loops_.top()->Quit(); -} - -// static -void RunLoop::QuitCurrentWhenIdleDeprecated() { - DCHECK(IsRunningOnCurrentThread()); - DCHECK(delegate->active_run_loops_.top()->allow_quit_current_deprecated_) - << "Please migrate off QuitCurrentWhenIdleDeprecated(), e.g. to " - "QuitWhenIdleClosure()."; - delegate->active_run_loops_.top()->QuitWhenIdle(); -} - -// static -RepeatingClosure RunLoop::QuitCurrentWhenIdleClosureDeprecated() { - // TODO(844016): Fix callsites and enable this check, or remove the API. - // DCHECK(delegate->active_run_loops_.top()->allow_quit_current_deprecated_) - // << "Please migrate off QuitCurrentWhenIdleClosureDeprecated(), e.g to " - // "QuitWhenIdleClosure()."; - return BindRepeating(&RunLoop::QuitCurrentWhenIdleDeprecated); -} #if DCHECK_IS_ON() ScopedDisallowRunningRunLoop::ScopedDisallowRunningRunLoop()
diff --git a/base/run_loop.h b/base/run_loop.h index c24f10d..1e94e8e6 100644 --- a/base/run_loop.h +++ b/base/run_loop.h
@@ -16,7 +16,6 @@ #include "base/gtest_prod_util.h" #include "base/location.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/sequence_checker.h" @@ -253,16 +252,6 @@ // on forever bound to that thread (including its destruction). static void RegisterDelegateForCurrentThread(Delegate* new_delegate); - // Quits the active RunLoop (when idle) -- there must be one. These were - // introduced as prefered temporary replacements to the long deprecated - // MessageLoop::Quit(WhenIdle)(Closure) methods. Callers should properly plumb - // a reference to the appropriate RunLoop instance (or its QuitClosure) - // instead of using these in order to link Run()/Quit() to a single RunLoop - // instance and increase readability. - static void QuitCurrentDeprecated(); - static void QuitCurrentWhenIdleDeprecated(); - [[nodiscard]] static RepeatingClosure QuitCurrentWhenIdleClosureDeprecated(); - // Support for //base/test/scoped_run_loop_timeout.h. // This must be public for access by the implementation code in run_loop.cc. struct BASE_EXPORT RunLoopTimeout { @@ -302,9 +291,7 @@ // A cached reference of RunLoop::Delegate for the thread driven by this // RunLoop for quick access without using TLS (also allows access to state // from another sequence during Run(), ref. |sequence_checker_| below). - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union, #global-scope - RAW_PTR_EXCLUSION Delegate* const delegate_; + const raw_ptr<Delegate, DanglingUntriaged> delegate_; const Type type_; @@ -322,11 +309,6 @@ // stored here rather than pushed to Delegate to support nested RunLoops. bool quit_when_idle_ = false; - // True if use of QuitCurrent*Deprecated() is allowed. Taking a Quit*Closure() - // from a RunLoop implicitly sets this to false, so QuitCurrent*Deprecated() - // cannot be used while that RunLoop is being Run(). - bool allow_quit_current_deprecated_ = true; - // RunLoop is not thread-safe. Its state/methods, unless marked as such, may // not be accessed from any other sequence than the thread it was constructed // on. Exception: RunLoop can be safely accessed from one other sequence (or
diff --git a/base/task/common/lazy_now.h b/base/task/common/lazy_now.h index 8e27ff2e..65db382 100644 --- a/base/task/common/lazy_now.h +++ b/base/task/common/lazy_now.h
@@ -34,9 +34,8 @@ private: absl::optional<TimeTicks> now_; - // `tick_clock_` is not a raw_ptr<TickClock> as a performance optimization: - // The pointee doesn't need UaF protection (it has the same lifetime as the - // theead/sequence). + // RAW_PTR_EXCLUSION: The pointee doesn't need UaF protection (it has the same + // lifetime as the thread/sequence). RAW_PTR_EXCLUSION const TickClock* tick_clock_; // Not owned. };
diff --git a/base/task/common/task_annotator.h b/base/task/common/task_annotator.h index 6261aa5..4d7ffa9 100644 --- a/base/task/common/task_annotator.h +++ b/base/task/common/task_annotator.h
@@ -174,7 +174,7 @@ // For tracking task duration. // - // Not a raw_ptr<...> for performance reasons: based on analysis of sampling + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling // profiler data (TaskAnnotator::LongTaskTracker::~LongTaskTracker). RAW_PTR_EXCLUSION const TickClock* tick_clock_; // Not owned. TimeTicks task_start_time_; @@ -192,8 +192,8 @@ // known. Note that this will not compile in the Native client. uint32_t (*ipc_method_info_)(); bool is_response_ = false; - // Not a raw_ptr/raw_ref<...> for performance reasons: based on analysis of - // sampling profiler data (TaskAnnotator::LongTaskTracker::~LongTaskTracker). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data (TaskAnnotator::LongTaskTracker::~LongTaskTracker). [[maybe_unused]] RAW_PTR_EXCLUSION PendingTask& pending_task_; [[maybe_unused]] RAW_PTR_EXCLUSION TaskAnnotator* task_annotator_; };
diff --git a/base/task/sequence_manager/sequenced_task_source.h b/base/task/sequence_manager/sequenced_task_source.h index 7aca158..e8e3b74 100644 --- a/base/task/sequence_manager/sequenced_task_source.h +++ b/base/task/sequence_manager/sequenced_task_source.h
@@ -38,8 +38,8 @@ QueueName task_queue_name); ~SelectedTask(); - // `task` is not a raw_ref<> for performance reasons: based on this sampling - // profiler result on Mac. go/brp-mac-prof-diff-20230403 + // RAW_PTR_EXCLUSION: Performance reasons: based on this sampling profiler + // result on Mac. go/brp-mac-prof-diff-20230403 RAW_PTR_EXCLUSION Task& task; // Callback to fill trace event arguments associated with the task // execution. Can be null
diff --git a/base/task/single_thread_task_runner.h b/base/task/single_thread_task_runner.h index 6db207f..24b060d 100644 --- a/base/task/single_thread_task_runner.h +++ b/base/task/single_thread_task_runner.h
@@ -9,7 +9,7 @@ #include "base/base_export.h" #include "base/dcheck_is_on.h" #include "base/gtest_prod_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/task/sequenced_task_runner.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -137,10 +137,8 @@ scoped_refptr<SingleThreadTaskRunner> task_runner_to_restore_; #if DCHECK_IS_ON() - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION SingleThreadTaskRunner* - expected_task_runner_before_restore_{nullptr}; + raw_ptr<SingleThreadTaskRunner> expected_task_runner_before_restore_{ + nullptr}; #endif std::unique_ptr<ScopedDisallowRunningRunLoop> no_running_during_override_;
diff --git a/base/task/thread_pool/task_source.h b/base/task/thread_pool/task_source.h index 1d74a97e..0a012d3 100644 --- a/base/task/thread_pool/task_source.h +++ b/base/task/thread_pool/task_source.h
@@ -11,7 +11,6 @@ #include "base/containers/intrusive_heap.h" #include "base/dcheck_is_on.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/ref_counted.h" #include "base/sequence_token.h" #include "base/task/common/checked_lock.h" @@ -150,9 +149,7 @@ private: friend class TaskSource; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION TaskSource* task_source_; + raw_ptr<TaskSource> task_source_; }; // |traits| is metadata that applies to all Tasks in the TaskSource. @@ -342,9 +339,7 @@ #endif // DCHECK_IS_ON() scoped_refptr<TaskSource> task_source_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION TaskTracker* task_tracker_ = nullptr; + raw_ptr<TaskTracker> task_tracker_ = nullptr; }; // A pair of Transaction and RegisteredTaskSource. Useful to carry a
diff --git a/base/task/thread_pool/tracked_ref.h b/base/task/thread_pool/tracked_ref.h index 14ad4bf..502bdc9 100644 --- a/base/task/thread_pool/tracked_ref.h +++ b/base/task/thread_pool/tracked_ref.h
@@ -10,7 +10,6 @@ #include "base/gtest_prod_util.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/synchronization/waitable_event.h" #include "base/template_util.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -120,12 +119,8 @@ factory_->live_tracked_refs_.Increment(); } - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION T* ptr_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION TrackedRefFactory<T>* factory_; + raw_ptr<T> ptr_; + raw_ptr<TrackedRefFactory<T>> factory_; }; // TrackedRefFactory<T> should be the last member of T.
diff --git a/base/test/test_pending_task.h b/base/test/test_pending_task.h index 76312359..5ceb6741 100644 --- a/base/test/test_pending_task.h +++ b/base/test/test_pending_task.h
@@ -10,10 +10,14 @@ #include "base/functional/callback.h" #include "base/location.h" #include "base/time/time.h" -#include "base/trace_event/base_tracing_forward.h" namespace base { +namespace trace_event { +class TracedValue; +class ConvertableToTraceFormat; +} // namespace trace_event + // TestPendingTask is a helper class for test TaskRunner // implementations. See test_simple_task_runner.h for example usage.
diff --git a/base/time/time.h b/base/time/time.h index 8928e9b9..0947dac4 100644 --- a/base/time/time.h +++ b/base/time/time.h
@@ -116,7 +116,9 @@ namespace base { +#if BUILDFLAG(IS_WIN) class PlatformThreadHandle; +#endif class TimeDelta; template <typename T>
diff --git a/base/trace_event/base_tracing_forward.h b/base/trace_event/base_tracing_forward.h index 825feaad..3aaf36d 100644 --- a/base/trace_event/base_tracing_forward.h +++ b/base/trace_event/base_tracing_forward.h
@@ -5,8 +5,8 @@ #ifndef BASE_TRACE_EVENT_BASE_TRACING_FORWARD_H_ #define BASE_TRACE_EVENT_BASE_TRACING_FORWARD_H_ -// Proxy header that provides //base code access to forward-declarations for -// classes and functions defined in base_tracing.h. +// This header is a wrapper around perfetto's traced_value_forward.h that +// handles Chromium's ENABLE_BASE_TRACING buildflag. #include "base/tracing_buildflags.h" @@ -34,13 +34,4 @@ #endif // !BUILDFLAG(ENABLE_BASE_TRACING) -namespace base { -namespace trace_event { - -class ConvertableToTraceFormat; -class TracedValue; - -} // namespace trace_event -} // namespace base - #endif // BASE_TRACE_EVENT_BASE_TRACING_FORWARD_H_
diff --git a/base/trace_event/trace_arguments.h b/base/trace_event/trace_arguments.h index e2790c3..03ed6710 100644 --- a/base/trace_event/trace_arguments.h +++ b/base/trace_event/trace_arguments.h
@@ -576,8 +576,7 @@ // enough, but the compiler will then complaing about inlined constructors // and destructors being too complex (!), resulting in larger code for no // good reason. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: As above, inlining bloats code for no good reason. RAW_PTR_EXCLUSION Data* data_ = nullptr; };
diff --git a/base/trace_event/traced_value.h b/base/trace_event/traced_value.h index 0178d262..54837dd 100644 --- a/base/trace_event/traced_value.h +++ b/base/trace_event/traced_value.h
@@ -20,11 +20,12 @@ namespace base { -class TraceEventMemoryOverhead; class Value; namespace trace_event { +class TraceEventMemoryOverhead; + class BASE_EXPORT TracedValue : public ConvertableToTraceFormat { public: // TODO(oysteine): |capacity| is not used in any production code. Consider
diff --git a/base/trace_event/typed_macros_embedder_support.h b/base/trace_event/typed_macros_embedder_support.h index e4b2cebb8..74beda7 100644 --- a/base/trace_event/typed_macros_embedder_support.h +++ b/base/trace_event/typed_macros_embedder_support.h
@@ -57,8 +57,8 @@ } private: - // These fields not raw_ptr<> for performance reasons: based on this sampling - // profiler result on ChromeOS. go/brp-cros-prof-diff-20230403 + // RAW_PTR_EXCLUSION: Performance reasons: based on this sampling profiler + // result on ChromeOS. go/brp-cros-prof-diff-20230403 RAW_PTR_EXCLUSION TrackEvent* event_; RAW_PTR_EXCLUSION IncrementalState* incremental_state_; RAW_PTR_EXCLUSION CompletionListener* listener_;
diff --git a/base/types/expected_macros.h b/base/types/expected_macros.h index 30784a8..79d99fa 100644 --- a/base/types/expected_macros.h +++ b/base/types/expected_macros.h
@@ -233,9 +233,9 @@ constexpr operator E() && noexcept { return std::move(lambda_)(); } private: - // `raw_ptr<>` and `raw_ref<>` aren't intended to handle &&-qualified members. + // RAW_PTR_EXCLUSION: Not intended to handle &&-qualified members. // `UnexpectedDeducer` is a short-lived temporary and tries to minimize - // copying and other overhead; using those types goes against this design + // copying and other overhead; using raw_ptr/ref goes against this design // without adding meaningful safety. RAW_PTR_EXCLUSION Lambda&& lambda_; };
diff --git a/base/win/scoped_safearray.h b/base/win/scoped_safearray.h index ab604ff..f9c332f 100644 --- a/base/win/scoped_safearray.h +++ b/base/win/scoped_safearray.h
@@ -107,9 +107,9 @@ array_size_ = 0U; } - // Cannot rewrite this pointer to raw_ptr<>, because this pointer - // comes from the operating system and may have been laundered - // if rewritten it may generate incorrect DPD error. + // RAW_PTR_EXCLUSION: Comes from the operating system and may have been + // laundered. If rewritten, it may generate an incorrect Dangling Pointer + // Detector error. RAW_PTR_EXCLUSION SAFEARRAY* safearray_ = nullptr; VARTYPE vartype_ = VT_EMPTY; pointer array_ = nullptr; @@ -222,8 +222,7 @@ bool operator!=(const ScopedSafearray& safearray2) const = delete; private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #addr-of + // RAW_PTR_EXCLUSION: #addr-of RAW_PTR_EXCLUSION SAFEARRAY* safearray_; };
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 016362e..a91928e 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -494,6 +494,9 @@ # linker_driver.py script runs dsymutil itself, which is set to be the # linker for Rust targets as well. rustflags += [ "-Csplit-debuginfo=unpacked" ] + + # TODO(crbug.com/1519899): Figure out how to remove this. + cflags += [ "-fno-define-target-os-macros" ] } # Linux/Android/Fuchsia common flags setup.
diff --git a/cc/metrics/latency_ukm_reporter.h b/cc/metrics/latency_ukm_reporter.h index 7401cc0..2b013cc 100644 --- a/cc/metrics/latency_ukm_reporter.h +++ b/cc/metrics/latency_ukm_reporter.h
@@ -53,7 +53,7 @@ // pointer is initialized, there should be no trackers yet. Moreover, the // LayerTreeHostImpl::ukm_manager_ lives as long as the LayerTreeHostImpl, so // this pointer should never be null as long as LayerTreeHostImpl is alive. - raw_ptr<UkmManager> ukm_manager_ = nullptr; + raw_ptr<UkmManager, DanglingUntriaged> ukm_manager_ = nullptr; std::unique_ptr<SamplingController> compositor_latency_sampling_controller_; std::unique_ptr<SamplingController> event_latency_sampling_controller_;
diff --git a/cc/paint/paint_canvas.h b/cc/paint/paint_canvas.h index 601f5344..2b86174f 100644 --- a/cc/paint/paint_canvas.h +++ b/cc/paint/paint_canvas.h
@@ -7,7 +7,6 @@ #include "base/compiler_specific.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/ref_counted.h" #include "build/build_config.h" #include "cc/paint/node_id.h" @@ -244,9 +243,8 @@ private: raw_ptr<printing::MetafileSkia> metafile_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION paint_preview::PaintPreviewTracker* tracker_ = nullptr; + raw_ptr<paint_preview::PaintPreviewTracker, DanglingUntriaged> tracker_ = + nullptr; }; class CC_PAINT_EXPORT PaintCanvasAutoRestore {
diff --git a/cc/paint/scoped_raster_flags.h b/cc/paint/scoped_raster_flags.h index 8104ca6..194b9c12 100644 --- a/cc/paint/scoped_raster_flags.h +++ b/cc/paint/scoped_raster_flags.h
@@ -6,7 +6,7 @@ #define CC_PAINT_SCOPED_RASTER_FLAGS_H_ #include <optional> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "cc/paint/decode_stashing_image_provider.h" #include "cc/paint/paint_export.h" #include "cc/paint/paint_flags.h" @@ -58,7 +58,7 @@ if (decode_failed_) return nullptr; - return modified_flags_ ? &*modified_flags_ : original_flags_; + return modified_flags_ ? &*modified_flags_ : original_flags_.get(); } private: @@ -74,9 +74,7 @@ return &*modified_flags_; } - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION const PaintFlags* original_flags_; + raw_ptr<const PaintFlags> original_flags_; std::optional<PaintFlags> modified_flags_; std::optional<DecodeStashingImageProvider> decode_stashing_image_provider_; bool decode_failed_ = false;
diff --git a/cc/paint/skia_paint_canvas.h b/cc/paint/skia_paint_canvas.h index 3dfed034..66925929 100644 --- a/cc/paint/skia_paint_canvas.h +++ b/cc/paint/skia_paint_canvas.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/compiler_specific.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "build/build_config.h" #include "cc/paint/paint_canvas.h" #include "cc/paint/paint_flags.h" @@ -182,14 +182,10 @@ int GetMaxTextureSize() const; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION SkCanvas* canvas_; + raw_ptr<SkCanvas, DanglingUntriaged> canvas_; SkBitmap bitmap_; std::unique_ptr<SkCanvas> owned_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION ImageProvider* image_provider_ = nullptr; + raw_ptr<ImageProvider, DanglingUntriaged> image_provider_ = nullptr; const ContextFlushes context_flushes_; int num_of_ops_ = 0;
diff --git a/cc/raster/playback_image_provider.h b/cc/raster/playback_image_provider.h index 26d6f889..4ad0eb5 100644 --- a/cc/raster/playback_image_provider.h +++ b/cc/raster/playback_image_provider.h
@@ -6,7 +6,7 @@ #define CC_RASTER_PLAYBACK_IMAGE_PROVIDER_H_ #include "base/containers/flat_map.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "cc/cc_export.h" #include "cc/paint/image_id.h" #include "cc/paint/image_provider.h" @@ -57,9 +57,7 @@ const DrawImage& draw_image) override; private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION ImageDecodeCache* cache_; + raw_ptr<ImageDecodeCache, DanglingUntriaged> cache_; TargetColorParams target_color_params_; std::optional<Settings> settings_; };
diff --git a/cc/tiles/picture_layer_tiling.h b/cc/tiles/picture_layer_tiling.h index 25a8d4f..b70d910d 100644 --- a/cc/tiles/picture_layer_tiling.h +++ b/cc/tiles/picture_layer_tiling.h
@@ -252,9 +252,7 @@ bool AtEnd() const; private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION PictureLayerTiling* tiling_; + raw_ptr<PictureLayerTiling> tiling_; PictureLayerTiling::TileMap::iterator iter_; }; @@ -290,16 +288,16 @@ private: gfx::Rect ComputeGeometryRect() const; - // `tiling_` is not a raw_ptr<...> for performance reasons (based on - // analysis of sampling profiler data and tab_search:top100:2020). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data and tab_search:top100:2020. RAW_PTR_EXCLUSION const PictureLayerTiling* tiling_ = nullptr; gfx::Size coverage_rect_max_bounds_; gfx::Rect coverage_rect_; gfx::AxisTransform2d coverage_to_content_; - // `current_tile_` is not a raw_ptr<...> for performance reasons (based on - // analysis of sampling profiler data and tab_search:top100:2020). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data and tab_search:top100:2020. RAW_PTR_EXCLUSION Tile* current_tile_ = nullptr; gfx::Rect current_geometry_rect_;
diff --git a/cc/tiles/picture_layer_tiling_set.h b/cc/tiles/picture_layer_tiling_set.h index 81ff04e..c4bf11b 100644 --- a/cc/tiles/picture_layer_tiling_set.h +++ b/cc/tiles/picture_layer_tiling_set.h
@@ -214,9 +214,9 @@ ~AutoClear() { *state_to_clear_ = StateSinceLastTilePriorityUpdate(); } private: - // Not a raw_ptr<...> for performance reasons: on-stack pointer + - // based on analysis of sampling profiler data - // (cc::PictureLayerTilingSet::UpdateTilePriorities -> creates AutoClear + // RAW_PTR_EXCLUSION: Performance reasons: on-stack pointer + based on + // analysis of sampling profiler data + // (PictureLayerTilingSet::UpdateTilePriorities -> creates AutoClear // on stack). RAW_PTR_EXCLUSION StateSinceLastTilePriorityUpdate* state_to_clear_; };
diff --git a/cc/tiles/prioritized_tile.h b/cc/tiles/prioritized_tile.h index 0af3ffa0..acbe452 100644 --- a/cc/tiles/prioritized_tile.h +++ b/cc/tiles/prioritized_tile.h
@@ -5,7 +5,7 @@ #ifndef CC_TILES_PRIORITIZED_TILE_H_ #define CC_TILES_PRIORITIZED_TILE_H_ -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "cc/cc_export.h" #include "cc/paint/paint_worklet_input.h" #include "cc/raster/raster_source.h" @@ -51,12 +51,8 @@ const PictureLayerTiling* source_tiling() const { return source_tiling_; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION Tile* tile_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION const PictureLayerTiling* source_tiling_ = nullptr; + raw_ptr<Tile, DanglingUntriaged> tile_ = nullptr; + raw_ptr<const PictureLayerTiling, DanglingUntriaged> source_tiling_ = nullptr; TilePriority priority_; bool is_occluded_ = false; bool is_process_for_images_only_ = false;
diff --git a/cc/tiles/tile.h b/cc/tiles/tile.h index 7b371f29..0abb727 100644 --- a/cc/tiles/tile.h +++ b/cc/tiles/tile.h
@@ -29,7 +29,7 @@ class CC_EXPORT Tile { public: struct CreateInfo { - // Not a raw_ptr<...> for performance reasons: on-stack pointer + based on + // RAW_PTR_EXCLUSION: Performance reasons: on-stack pointer + based on // analysis of sampling profiler data // (PictureLayerTilingSet::UpdateTilePriorities -> // PictureLayerTiling::ComputeTilePriorityRects -> @@ -155,8 +155,8 @@ int source_frame_number, int flags); - // These are not a raw_ptr<...> for performance reasons: based on analysis of - // sampling profiler data (PictureLayerTilingSet::UpdateTilePriorities -> + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data (PictureLayerTilingSet::UpdateTilePriorities -> // PictureLayerTiling::ComputeTilePriorityRects -> // PictureLayerTiling::SetLiveTilesRect -> PictureLayerTiling::CreateTile -> // allocates Tile).
diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc index cdbcfbc4..f86cb9e0 100644 --- a/cc/trees/layer_tree_host_unittest_scroll.cc +++ b/cc/trees/layer_tree_host_unittest_scroll.cc
@@ -801,8 +801,16 @@ RunTest(CompositorMode::THREADED); } +#if BUILDFLAG(IS_MAC) && defined(ADDRESS_SANITIZER) +// TODO(https://crbug.com/1521778): Fix the flakiness on Mac ASan and re-enable. +#define MAYBE_DeviceScaleFactor2_ScrollRootScrollLayer \ + DISABLED_DeviceScaleFactor2_ScrollRootScrollLayer +#else +#define MAYBE_DeviceScaleFactor2_ScrollRootScrollLayer \ + DeviceScaleFactor2_ScrollRootScrollLayer +#endif TEST_F(LayerTreeHostScrollTestCaseWithChild, - DeviceScaleFactor2_ScrollRootScrollLayer) { + MAYBE_DeviceScaleFactor2_ScrollRootScrollLayer) { device_scale_factor_ = 2.f; scroll_child_layer_ = false; RunTest(CompositorMode::THREADED);
diff --git a/cc/trees/occlusion_tracker.h b/cc/trees/occlusion_tracker.h index 03804b83..26ee2f12 100644 --- a/cc/trees/occlusion_tracker.h +++ b/cc/trees/occlusion_tracker.h
@@ -62,7 +62,7 @@ struct StackObject { StackObject() : target(nullptr) {} explicit StackObject(const RenderSurfaceImpl* target) : target(target) {} - // Not a raw_ptr<...> for performance reasons: on-stack (temporary) vector + + // RAW_PTR_EXCLUSION: Performance reasons: on-stack (temporary) vector + // based on analysis of sampling profiler data // (LayerTreeImpl::UpdateDrawProperties -> OcclusionTracker::EnterLayer -> // OcclusionTracker::EnterRenderTarget -> emplaces StackObject in a vector;
diff --git a/chrome/VERSION b/chrome/VERSION index 798c5d9a..d2ba326b 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=123 MINOR=0 -BUILD=6265 +BUILD=6266 PATCH=0
diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml index ace37015..1c53d53 100644 --- a/chrome/android/java/res/menu/custom_tabs_menu.xml +++ b/chrome/android/java/res/menu/custom_tabs_menu.xml
@@ -65,6 +65,9 @@ <item android:id="@+id/install_webapp_id" android:title="@string/menu_install_webapp" android:orderInCategory="2" /> + <item android:id="@+id/universal_install" + android:title="@string/menu_add_to_homescreen" + android:orderInCategory="2" /> <item android:id="@+id/open_webapk_id" android:title="@string/menu_open_webapk" android:orderInCategory="2" />
diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml index 808b300..266baa7 100644 --- a/chrome/android/java/res/menu/main_menu.xml +++ b/chrome/android/java/res/menu/main_menu.xml
@@ -116,6 +116,9 @@ <item android:id="@+id/install_webapp_id" android:title="@string/menu_install_webapp" android:icon="@drawable/ic_install_webapp" /> + <item android:id="@+id/universal_install" + android:title="@string/menu_add_to_homescreen" + android:icon="@drawable/ic_add_to_home_screen" /> <item android:id="@+id/open_webapk_id" android:title="@string/menu_open_webapk" android:icon="@drawable/ic_open_webapk" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index f17a47e54..b0844ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -190,6 +190,7 @@ import org.chromium.chrome.browser.ui.system.StatusBarColorController; import org.chromium.components.browser_ui.accessibility.FontSizePrefs; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider; import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; import org.chromium.components.browser_ui.notifications.NotificationManagerProxy; import org.chromium.components.browser_ui.notifications.NotificationManagerProxyImpl; @@ -218,6 +219,7 @@ import org.chromium.components.webapps.InstallTrigger; import org.chromium.components.webapps.bottomsheet.PwaBottomSheetController; import org.chromium.components.webapps.bottomsheet.PwaBottomSheetControllerProvider; +import org.chromium.components.webapps.pwa_universal_install.PwaUniversalInstallBottomSheetCoordinator; import org.chromium.components.webxr.XrDelegate; import org.chromium.components.webxr.XrDelegateProvider; import org.chromium.content_public.browser.DeviceUtils; @@ -2757,6 +2759,12 @@ currentTab, AppMenuVerbiage.APP_MENU_OPTION_INSTALL); } + if (id == R.id.universal_install) { + RecordUserAction.record("UniversalInstallFromMenu"); + return doUniversalInstall( + currentTab, AppMenuVerbiage.APP_MENU_OPTION_UNIVERSAL_INSTALL); + } + if (id == R.id.open_webapk_id) { RecordUserAction.record("MobileMenuOpenWebApk"); return doOpenWebApk(currentTab); @@ -3097,6 +3105,29 @@ return mCompositorViewHolderSupplier.get(); } + private boolean doUniversalInstall(Tab currentTab, int menuItemType) { + BottomSheetController controller = BottomSheetControllerProvider.from(getWindowAndroid()); + if (controller == null) { + // We have three options when this function fails. One is to abort the operation and do + // nothing (by returning false), or we can make one of the two options of the Universal + // Install dialog the default and go with that in case of errors. Since Install App is + // the menu item that would have been shown, if Universal Install was disabled, we + // fall back to the Install App option. + return doAddToHomescreenOrInstallWebApp( + currentTab, AppMenuVerbiage.APP_MENU_OPTION_INSTALL); + } + + PwaUniversalInstallBottomSheetCoordinator pwaUniversalInstallBottomSheetCoordinator = + new PwaUniversalInstallBottomSheetCoordinator(this, controller); + if (!pwaUniversalInstallBottomSheetCoordinator.show()) { + // Fall back to install method for the PWA. + return doAddToHomescreenOrInstallWebApp( + currentTab, AppMenuVerbiage.APP_MENU_OPTION_INSTALL); + } + + return true; + } + /** * Returns whether the Add to Home screen or Install Web App action was successfully started. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index 42b678c..38da5d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -887,10 +887,12 @@ Menu menu, Tab currentTab, boolean shouldShowHomeScreenMenuItem) { MenuItem addTohomescreenItem = menu.findItem(R.id.add_to_homescreen_id); MenuItem installWebAppItem = menu.findItem(R.id.install_webapp_id); + MenuItem universalInstallItem = menu.findItem(R.id.universal_install); MenuItem openWebApkItem = menu.findItem(R.id.open_webapk_id); addTohomescreenItem.setVisible(false); installWebAppItem.setVisible(false); + universalInstallItem.setVisible(false); openWebApkItem.setVisible(false); if (currentTab != null && shouldShowHomeScreenMenuItem) { @@ -915,8 +917,12 @@ addTohomescreenItem.setTitle(installStrings.titleTextId); addTohomescreenItem.setVisible(true); } else if (installStrings.titleTextId == AppBannerManager.PWA_PAIR.titleTextId) { - installWebAppItem.setTitle(installStrings.titleTextId); - installWebAppItem.setVisible(true); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.PWA_UNIVERSAL_INSTALL_UI)) { + universalInstallItem.setVisible(true); + } else { + installWebAppItem.setTitle(installStrings.titleTextId); + installWebAppItem.setVisible(true); + } } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dagger.md b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dagger.md index ca19c96b..d851cc6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dagger.md +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dagger.md
@@ -83,6 +83,11 @@ If there’s a circular dependency, take `Lazy<Foo>` instead of `Foo`. A `Lazy<T>` will be resolved the first time it is accessed. +`Lazy` can also be used when you want Dagger to provide a class that won't be ready at the time it +needs to be injected. For example,`ChromeActivityCommonsModule` contains a bunch of +`Supplier<Foo>`s that will only return non-null once some stage of startup has been completed. +To use `Foo` in a class that's created earlier than it, take a `Lazy<Foo>` in the constructor. + ### access a non-Dagger class from a Dagger class There are quite a few non-Dagger classes already provided to Dagger, so see if the class you want is provided in any of the Modules:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java index f0f744c..426ff9c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/DimmingDialog.java
@@ -101,7 +101,7 @@ /* package */ static void setVisibleStatusBarIconColor(Window window) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; UiUtils.setStatusBarIconColor( - window, + window.getDecorView().getRootView(), !ColorUtils.shouldUseLightForegroundOnBackground(window.getStatusBarColor())); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java index 4979e708..c08bd59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -660,7 +660,8 @@ // Set status bar icon color according to background color. UiUtils.setStatusBarIconColor( - getWindow(), getResources().getBoolean(R.bool.window_light_status_bar)); + getWindow().getDecorView().getRootView(), + getResources().getBoolean(R.bool.window_light_status_bar)); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java index 444b05c1..2fa80c7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/StatusBarColorController.java
@@ -519,8 +519,9 @@ public static void setStatusBarColor(Window window, @ColorInt int color) { if (UiUtils.isSystemUiThemingDisabled()) return; + final View root = window.getDecorView().getRootView(); boolean needsDarkStatusBarIcons = !ColorUtils.shouldUseLightForegroundOnBackground(color); - UiUtils.setStatusBarIconColor(window, needsDarkStatusBarIcons); + UiUtils.setStatusBarIconColor(root, needsDarkStatusBarIcons); UiUtils.setStatusBarColor(window, color); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java index 31d23d9..36dda71 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -249,6 +249,7 @@ private void setupFeatureDefaults() { setShoppingListEligible(false); setShoppingListEligible(false); + mTestValues.addFeatureFlagOverride(ChromeFeatureList.PWA_UNIVERSAL_INSTALL_UI, false); FeatureList.setTestValues(mTestValues); }
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni index 4602e09..8cbc5860 100644 --- a/chrome/android/webapk/shell_apk/current_version/current_version.gni +++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@ # //chrome/android/webapk/shell_apk:webapk is changed. This includes # Java files, Android resource files and AndroidManifest.xml. Does not affect # Chrome.apk -current_shell_apk_version = 169 +current_shell_apk_version = 168
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/WebApkUtilsTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/WebApkUtilsTest.java index 71949ff..80faee1 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/WebApkUtilsTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/WebApkUtilsTest.java
@@ -18,11 +18,8 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Color; -import android.os.Build; import android.os.Bundle; import android.view.View; -import android.view.Window; -import android.view.WindowInsetsController; import org.junit.Assert; import org.junit.Before; @@ -131,9 +128,10 @@ when(mMockApplicationContext.getPackageManager()).thenReturn(mMockPackageManager); when(mMockPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) .thenReturn(true); + View rootView = testActivity.getWindow().getDecorView().getRootView(); WebApkUtils.setStatusBarColor(testActivity, Color.RED); - WebApkUtils.setStatusBarIconColor(testActivity.getWindow(), false, testActivity); + WebApkUtils.setStatusBarIconColor(rootView, false, testActivity); // No matter what color the status bar is being set on other form factors, it should always // be black on automotive devices. @@ -141,24 +139,11 @@ "Status bar should always be black in automotive devices.", Color.BLACK, testActivity.getWindow().getStatusBarColor()); - assertIsUsingDarkIcons(testActivity.getWindow()); + assertNotEquals( + "Status bar should NOT use dark icons in automotive devices.", + View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR, + rootView.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); testActivity.finish(); } - - private void assertIsUsingDarkIcons(Window window) { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - assertNotEquals( - "Status bar should not use dark icons in automotive devices.", - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR, - window.getDecorView().getRootView().getSystemUiVisibility() - & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - } else { - assertNotEquals( - "Status bar should not use dark icons in automotive devices.", - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, - window.getInsetsController().getSystemBarsAppearance() - & WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); - } - } }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java index e38c3cf..bcf7406d 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkUtils.java
@@ -22,7 +22,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; @@ -31,12 +30,9 @@ import android.view.Surface; import android.view.View; import android.view.Window; -import android.view.WindowInsetsController; import android.view.WindowManager; import android.widget.TextView; -import androidx.annotation.RequiresApi; - import org.chromium.components.webapk.lib.common.WebApkMetaDataKeys; import java.util.ArrayList; @@ -239,26 +235,12 @@ /** * Sets the status bar icons to dark or light. * - * @param window The window used to request updates to the system UI theming. - * @param useDarkIcons Whether the status bar icons should be dark. - */ - public static void setStatusBarIconColor(Window window, boolean useDarkIcons, Context context) { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - setStatusBarIconColorApiRAndBelow( - window.getDecorView().getRootView(), useDarkIcons, context); - } else { - setStatusBarIconColorApiSAndAbove(window, useDarkIcons, context); - } - } - - /** - * Sets the status bar icons to dark or light. Note that this is only valid for Android M+. + * <p>TODO: migrate to WindowInsetsController API for Android R+ (API 30+) * * @param rootView The root view used to request updates to the system UI theming. * @param useDarkIcons Whether the status bar icons should be dark. */ - private static void setStatusBarIconColorApiRAndBelow( - View rootView, boolean useDarkIcons, Context context) { + public static void setStatusBarIconColor(View rootView, boolean useDarkIcons, Context context) { int systemUiVisibility = rootView.getSystemUiVisibility(); // The status bar should always be black in automotive devices to match the black back // button toolbar, so we should not use dark icons. @@ -271,29 +253,6 @@ } /** - * Sets the status bar icons to dark or light. Requires API S+. - * - * @param window The window used to request updates to the system UI theming. - * @param useDarkIcons Whether the status bar icons should be dark. - */ - @RequiresApi(Build.VERSION_CODES.S) - public static void setStatusBarIconColorApiSAndAbove( - Window window, boolean useDarkIcons, Context context) { - // The status bar should always be black in automotive devices to match the black back - // button toolbar, so we should not use dark icons. - if (useDarkIcons && !isAutomotive(context)) { - window.getInsetsController() - .setSystemBarsAppearance( - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); - } else { - window.getInsetsController() - .setSystemBarsAppearance( - 0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); - } - } - - /** * @see android.view.Window#setStatusBarColor(int color). */ public static void setStatusBarColor(Activity activity, int statusBarColor) {
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java index b5ea05e..749a8ed 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -229,7 +229,8 @@ this, WebApkUtils.inDarkMode(this) ? darkStatusBarColor : statusBarColor); boolean needsDarkStatusBarIcons = !WebApkUtils.shouldUseLightForegroundOnBackground(statusBarColor); - WebApkUtils.setStatusBarIconColor(getWindow(), needsDarkStatusBarIcons, this); + WebApkUtils.setStatusBarIconColor( + getWindow().getDecorView().getRootView(), needsDarkStatusBarIcons, this); } /** Called once the host browser has been selected. */
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index f5c3aab..4bf4afd 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -280,6 +280,7 @@ <translation id="6144416395842701622">Chromium-dan maksimum yararlanmaq üçün daxil olun</translation> <translation id="6145820983052037069">Burada Chromium profilləri arasında keçid edə bilərsiniz</translation> <translation id="615103374448673771">Kukilərə icazə versəniz, əvvəlcədən yükləmə zamanı Chromium onlardan istifadə edə bilər</translation> +<translation id="6174920971222007286">Bu fayl təhlükəli ola bilər<ph name="LINE_BREAK" />Parolu təqdim etsəniz, Chromium bu endirməni yoxlaya bilər. Fayl haqqında məlumat Google güvənli baxışa göndərilir, lakin fayl kontenti və parol cihazda qalır.</translation> <translation id="6175304430031192654">Ayarlardan asılı olaraq Chromium kukilər və cari URL-i də göndərə bilər</translation> <translation id="6182736845697986886">Yeniləmə serverində daxili xəta səbəbindən quraşdırma alınmadı.</translation> <translation id="6183079672144801177"><ph name="TARGET_DEVICE_NAME" /> cihazınızda Chromium'a daxil olduğunuza əmin olun və sonra yenidən göndərin.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 5ae730d2..415c65c 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Увайдзіце ва ўліковы запіс, каб карыстацца ўсімі магчымасцямі Chromium</translation> <translation id="6145820983052037069">Пераключацца паміж профілямі Chromium можна тут</translation> <translation id="615103374448673771">Калі вы дазволіце прымяняць файлы cookie, Chromium зможа выкарыстоўваць іх падчас перадзагрузкі</translation> +<translation id="6174920971222007286">Гэты файл можа быць небяспечным<ph name="LINE_BREAK" />Chromium можа праверыць спампоўку, калі вы ўведзяце пароль. Інфармацыя пра файл перадаецца ў Google Бяспечны прагляд, але змесціва файла і пароль застаюцца на прыладзе.</translation> <translation id="6175304430031192654">У залежнасці ад вашых налад Chromium можа таксама адпраўляць файлы cookie і ваш бягучы URL-адрас</translation> <translation id="6182736845697986886">Выканаць усталяванне не ўдалося з-за ўнутранай памылкі сервера абнаўленняў.</translation> <translation id="6183079672144801177">Упэўніцеся, што вы ўвайшлі ў Chromium на прыладзе "<ph name="TARGET_DEVICE_NAME" />", а затым паспрабуйце ажыццявіць адпраўку яшчэ раз.</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 670abea..8cfec64 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Prijavite se da iskoristite sve prednosti Chromiuma</translation> <translation id="6145820983052037069">Ovdje možete prebacivati između Chromium profila</translation> <translation id="615103374448673771">Ako dozvolite kolačiće, Chromium ih može koristiti prilikom predučitavanja</translation> +<translation id="6174920971222007286">Fajl je možda opasan<ph name="LINE_BREAK" />Chromium može provjeriti ovo preuzimanje za vas ako unesete lozinku. Informacije o fajlu se šalju na Sigurno pregledanje na Googleu, ali sadržaj fajla i lozinka ostaju na vašem uređaju.</translation> <translation id="6175304430031192654">Ovisno o vašim postavkama, Chromium također može slati kolačiće i vaš trenutni URL</translation> <translation id="6182736845697986886">Instalacija nije uspjela zbog interne greške na serveru za ažuriranje.</translation> <translation id="6183079672144801177">Provjerite jeste li prijavljeni u Chromium na svom uređaju <ph name="TARGET_DEVICE_NAME" /> i zatim pokušajte poslati ponovo.</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 246ed63..146c555 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -280,6 +280,7 @@ <translation id="6144416395842701622">Prijavite se da biste iskoristili sve prednosti Chromiuma</translation> <translation id="6145820983052037069">Ovdje se možete prebacivati između profila u Chromiumu</translation> <translation id="615103374448673771">Ako dopustite kolačiće, Chromium ih može koristiti prilikom predučitavanja.</translation> +<translation id="6174920971222007286">Datoteka može biti opasna<ph name="LINE_BREAK" />Chromium može provjeriti to preuzimanje za vas ako unesete zaporku. Podaci o datoteci šalju se Google sigurnom pregledavanju, ali sadržaj i zaporka datoteke ostaju na vašem uređaju.</translation> <translation id="6175304430031192654">Ovisno o postavkama, Chromium može slati kolačiće i vaš trenutačni URL</translation> <translation id="6182736845697986886">Instalacija nije uspjela zbog interne pogreške poslužitelja ažuriranja.</translation> <translation id="6183079672144801177">Obavezno se prijavite na Chromium na uređaju <ph name="TARGET_DEVICE_NAME" /> i nakon toga ponovno pokušajte sa slanjem.</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index ba72e87..bf94b0a0d 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -278,6 +278,7 @@ <translation id="6144416395842701622">Chromium ನಿಂದ ಹೆಚ್ಚಿನ ಪ್ರಯೋಜನ ಪಡೆದುಕೊಳ್ಳಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="6145820983052037069">ನೀವು ಇಲ್ಲಿ Chromium ಪ್ರೊಫೈಲ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು</translation> <translation id="615103374448673771">ನೀವು ಕುಕೀಗಳನ್ನು ಅನುಮತಿಸಿದರೆ, ಪ್ರಿಲೋಡ್ ಮಾಡುವಾಗ Chromium ಅವುಗಳನ್ನು ಬಳಸಬಹುದು</translation> +<translation id="6174920971222007286">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಬಹುದು<ph name="LINE_BREAK" />ನೀವು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಒದಗಿಸಿದರೆ Chromium ನಿಮಗಾಗಿ ಈ ಡೌನ್ಲೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಬಹುದು. ಫೈಲ್ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು Google Safe Browsing ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಫೈಲ್ನ ವಿಷಯಗಳು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಉಳಿಯುತ್ತದೆ.</translation> <translation id="6175304430031192654">ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆಧರಿಸಿ, Chromium ಕುಕೀಗಳನ್ನು ಮತ್ತು ನಿಮ್ಮ ಪ್ರಸ್ತುತ URL ಅನ್ನು ಸಹ ಕಳುಹಿಸಬಹುದು</translation> <translation id="6182736845697986886">ಅಪ್ಡೇಟ್ ಸರ್ವರ್ ಆಂತರಿಕ ದೋಷದಿಂದಾಗಿ ಇನ್ಸ್ಟಾಲೇಶನ್ ವಿಫಲವಾಗಿದೆ.</translation> <translation id="6183079672144801177">ನಿಮ್ಮ <ph name="TARGET_DEVICE_NAME" /> ನಲ್ಲಿ ನೀವು Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ನಂತರ ಪುನಃ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index bca6fd1..e3e3915 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Chromium'дун бардык мүмкүнчүлүктөрүн пайдалуу үчүн аккаунтуңузга кириңиз</translation> <translation id="6145820983052037069">Chromium профилдерин бул жерден которо аласыз</translation> <translation id="615103374448673771">Cookie файлдарына уруксат берсеңиз, Chromium аларды алдын ала жүктөө үчүн колдонушу мүмкүн</translation> +<translation id="6174920971222007286">Бул файл кооптуу болушу мүмкүн<ph name="LINE_BREAK" />Эгер сырсөздү көрсөтсөңүз, Chromium бул жүктөлүп алынган файды текшере алат. Файл тууралуу маалымат Google Коопсуз серептөө кызматына жөнөтүлөт, бирок файлдын мазмуну жана сырсөз түзмөгүңүздө калат.</translation> <translation id="6175304430031192654">Параметрлерге жараша Chromium cookie файлдарын жана учурдагы URL дарегин да жөнөтүшү мүмкүн</translation> <translation id="6182736845697986886">Орнотулган жок, анткени жаңыртуу серверинде ички ката кетти.</translation> <translation id="6183079672144801177">Chromium'га <ph name="TARGET_DEVICE_NAME" /> түзмөгүңүздөн кирип турганыңызды текшерип, кайра аракет кылыңыз.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 21473297..c2dadd8 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">ເຂົ້າສູ່ລະບົບເພື່ອໃຊ້ປະໂຫຍດສູງສຸດຈາກ Chromium</translation> <translation id="6145820983052037069">ທ່ານສາມາດສະຫຼັບລະຫວ່າງໂປຣໄຟລ໌ Chromium ໄດ້ຢູ່ບ່ອນນີ້</translation> <translation id="615103374448673771">ຫາກທ່ານອະນຸຍາດໃຫ້ໃຊ້ຄຸກກີ້ໄດ້, Chromium ອາດໃຊ້ພວກມັນເມື່ອໂຫຼດກ່ອນລ່ວງໜ້າ</translation> +<translation id="6174920971222007286">ໄຟລ໌ນີ້ອາດເປັນອັນຕະລາຍ<ph name="LINE_BREAK" />Chromium ສາມາດກວດສອບການດາວໂຫຼດນີ້ໃຫ້ທ່ານໄດ້ຫາກທ່ານລະບຸລະຫັດຜ່ານ. ຂໍ້ມູນກ່ຽວກັບໄຟລ໌ຈະຖືກສົ່ງໄປຫາ Google Safe Browsing, ແຕ່ເນື້ອຫາໄຟລ໌ ແລະ ລະຫັດຜ່ານຈະຍັງຢູ່ໃນອຸປະກອນຂອງທ່ານ.</translation> <translation id="6175304430031192654">ນອກຈາກນັ້ນ, Chromium ຍັງອາດສົ່ງຄຸກກີ້ ແລະ URL ປັດຈຸບັນຂອງທ່ານນຳ, ຂຶ້ນກັບການຕັ້ງຄ່າຂອງທ່ານ</translation> <translation id="6182736845697986886">ການຕິດຕັ້ງບໍ່ສຳເລັດເນື່ອງຈາກເຊີບເວີອັບເດດເກີດຂໍ້ຜິດພາດພາຍໃນ.</translation> <translation id="6183079672144801177">ກວດໃຫ້ແນ່ໃຈວ່າທ່ານໄດ້ເຂົ້າສູ່ລະບົບ Chrome ໃນ <ph name="TARGET_DEVICE_NAME" /> ຂອງທ່ານ ແລ້ວລອງສົ່ງໃໝ່.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index ef17256..e59e725b 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Chromium പരമാവധി പ്രയോജനപ്പെടുത്താൻ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="6145820983052037069">നിങ്ങൾക്ക് ഇവിടെ Chromium പ്രൊഫൈലുകൾ തമ്മിൽ പരസ്പരം മാറ്റാനാകും</translation> <translation id="615103374448673771">നിങ്ങൾ കുക്കികൾ അനുവദിച്ചാൽ, മുൻകൂട്ടി ലോഡ് ചെയ്യുമ്പോൾ Chromium അവ ഉപയോഗിച്ചേക്കാം</translation> +<translation id="6174920971222007286">ഈ ഫയൽ അപകടകരമായേക്കാം<ph name="LINE_BREAK" />നിങ്ങൾ പാസ്വേഡ് നൽകിയാൽ Chromium-ന് നിങ്ങൾക്കായി ഈ ഡൗൺലോഡ് പരിശോധിക്കാൻ കഴിയും. ഫയലിനെ സംബന്ധിച്ച വിവരങ്ങൾ Google സുരക്ഷിത ബ്രൗസിംഗിലേക്ക് അയയ്ക്കും, എന്നാൽ ഫയലിന്റെ ഉള്ളടക്കവും പാസ്വേഡും നിങ്ങളുടെ ഉപകരണത്തിൽ തന്നെ നിലനിൽക്കും.</translation> <translation id="6175304430031192654">നിങ്ങളുടെ ക്രമീകരണം അനുസരിച്ച്, കുക്കികളും നിങ്ങളുടെ നിലവിലെ URL-ഉം Chromium അയച്ചേക്കാം</translation> <translation id="6182736845697986886">അപ്ഡേറ്റ് സെർവർ ആന്തരിക പിശക് കാരണം ഇൻസ്റ്റാൾ ചെയ്യുന്നത് പരാജയപ്പെട്ടു.</translation> <translation id="6183079672144801177">നിങ്ങൾ <ph name="TARGET_DEVICE_NAME" /> ഉപകരണത്തിൽ Chromium-ലാണ് സൈൻ ഇൻ ചെയ്തിരിക്കുന്നതെന്ന് ഉറപ്പാക്കുക, തുടർന്ന് വീണ്ടും അയയ്ക്കാൻ ശ്രമിക്കുക.</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index 0d9bbbf..fad88ee 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -280,6 +280,7 @@ <translation id="6144416395842701622">Chromium बाट बढीभन्दा बढी फाइदा लिन साइन इन गर्नुहोस्</translation> <translation id="6145820983052037069">तपाईं यहाँबाट Chromium मा रहेको एक प्रोफाइलबाट अर्को प्रोफाइलमा जान सक्नुहुन्छ</translation> <translation id="615103374448673771">तपाईंले कुकीहरू प्रयोग गर्ने अनुमति दिनुभयो भने Chromium ले पेजहरू प्रिलोड गर्दा ती कुकीहरू प्रयोग गर्न सक्छ</translation> +<translation id="6174920971222007286">यो फाइल खतरनाक हुन सक्छ<ph name="LINE_BREAK" />तपाईंले पासवर्ड प्रदान गर्नुभयो भने Chromium ले तपाईंका तर्फबाट यो फाइलको जाँच गरिदिन सक्छ। यो फाइलसम्बन्धी जानकारी Google सुरक्षित ब्राउजिङमा पठाइन्छ तर फाइलमा भएको सामग्री र पासवर्ड तपाईंकै डिभाइसमा रहन्छन्।</translation> <translation id="6175304430031192654">तपाईंले तय गरेका सेटिङका आधारमा Chromium ले कुकी र हालको URL पनि पठाउन सक्छ</translation> <translation id="6182736845697986886">अपडेट सर्भरमा आन्तरिक त्रुटि भएकाले इन्स्टल गर्न सकिएन।</translation> <translation id="6183079672144801177">तपाईंले आफ्नो <ph name="TARGET_DEVICE_NAME" /> मा Chromium मा साइन इन गर्नुभएको छ भन्ने कुरा सुनिश्चित गर्नुहोस् अनि फेरि पठाउनुहोस्।</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index e4ddbf5f..048db7e 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Chromium ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਲਾਹਾ ਲੈਣ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="6145820983052037069">ਤੁਸੀਂ ਇੱਥੇ Chromium ਪ੍ਰੋਫਾਈਲਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="615103374448673771">ਜੇ ਤੁਸੀਂ ਕੁਕੀਜ਼ ਦੀ ਆਗਿਆ ਦਿੰਦੇ ਹੋ, ਤਾਂ Chromium ਉਨ੍ਹਾਂ ਨੂੰ ਪ੍ਰੀਲੋਡ ਕਰਨ 'ਤੇ ਵਰਤ ਸਕਦਾ ਹੈ</translation> +<translation id="6174920971222007286">ਇਹ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ<ph name="LINE_BREAK" />ਜੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦੇ ਹੋ, ਤਾਂ Chromium ਤੁਹਾਡੇ ਲਈ ਇਸ ਡਾਊਨਲੋਡ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹੈ। ਫ਼ਾਈਲ ਬਾਰੇ ਜਾਣਕਾਰੀ Google ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਭੇਜੀ ਜਾਂਦੀ ਹੈ, ਪਰ ਫ਼ਾਈਲ ਦੀ ਸਮੱਗਰੀ ਅਤੇ ਪਾਸਵਰਡ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਹੀ ਰਹਿੰਦੇ ਹਨ।</translation> <translation id="6175304430031192654">ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਦੇ ਆਧਾਰ 'ਤੇ, Chromium ਕੁਕੀਜ਼ ਅਤੇ ਤੁਹਾਡੇ ਮੌਜੂਦਾ URL ਨੂੰ ਵੀ ਭੇਜ ਸਕਦਾ ਹੈ</translation> <translation id="6182736845697986886">ਅੱਪਡੇਟ ਸਰਵਰ ਦੀ ਅੰਦਰੂਨੀ ਗੜਬੜ ਕਾਰਨ ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।</translation> <translation id="6183079672144801177">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਆਪਣੇ <ph name="TARGET_DEVICE_NAME" /> 'ਤੇ Chromium ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ ਅਤੇ ਫਿਰ ਦੁਬਾਰਾ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index 63fc832..6bd072a4 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Chromium سے زیادہ سے زیادہ فائدہ اٹھانے کے لیے سائن ان کریں</translation> <translation id="6145820983052037069">آپ یہاں Chromium پروفائلز کے درمیان سوئچ کر سکتے ہیں</translation> <translation id="615103374448673771">اگر آپ کوکیز کی اجازت دیتے ہیں تو Chromium پیشگی لوڈنگ کے دوران ان کا استعمال کر سکتا ہے</translation> +<translation id="6174920971222007286">یہ فائل خطرناک ہو سکتی ہے<ph name="LINE_BREAK" />اگر آپ پاس ورڈ فراہم کرتے ہیں تو Chromium آپ کے لیے اس ڈاؤن لوڈ کو چیک کر سکتا ہے۔ فائل کے بارے میں معلومات Google محفوظ براؤزنگ کو بھیجی جاتی ہے، لیکن فائل کا مواد اور پاس ورڈ آپ کے آلے پر رہتا ہے۔</translation> <translation id="6175304430031192654">آپ کی ترتیبات پر منحصر ہے، Chromium کوکیز اور آپ کا موجودہ URL بھی بھیج سکتا ہے</translation> <translation id="6182736845697986886">اپ ڈیٹ سرور کی اندرونی خرابی کی وجہ سے انسٹالیشن ناکام ہو گئی۔</translation> <translation id="6183079672144801177">یقینی بنائیں کہ آپ اپنے <ph name="TARGET_DEVICE_NAME" /> پر Chromium میں سائن ان ہیں اور پھر دوبارہ بھیج کر دیکھیں۔</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index 1890bf2..cd47406 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -278,6 +278,7 @@ <translation id="6144416395842701622">Chromiumning barcha imkoniyatlaridan foydalanish uchun hisobga kiring</translation> <translation id="6145820983052037069">Bu yerda Chromium profillarini almashtirish mumkin</translation> <translation id="615103374448673771">Cookie fayllarga ruxsat bersangiz, Chromium oldindan yuklashda ulardan foydalanishi mumkin.</translation> +<translation id="6174920971222007286">Bu fayl xavfli boʻlishi mumkin<ph name="LINE_BREAK" />Parol bilan tasdiqlasangiz, Chromium bu yuklanmani tekshirishi mumkin. Fayl Google Saytlarni xavfsiz kezish serveriga yuborilishi, ammo faylning kontenti va parol qurilmada saqlanishi haqidagi axborot.</translation> <translation id="6175304430031192654">Sozlamalar asosida Chromium cookie fayllar va joriy URL manzilni tekshiruvga yuborishi mumkin</translation> <translation id="6182736845697986886">Yangilanish serveridagi ichki xato sababli oʻrnatilmadi.</translation> <translation id="6183079672144801177"><ph name="TARGET_DEVICE_NAME" /> qurilmangizda Chromium hisobingizga kiring va keyin qaytadan yuborishga urining.</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index 32118a6..c675d57 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -282,6 +282,7 @@ <translation id="6144416395842701622">Ngena ngemvume ukuze uthole okuningi ku-Chromium</translation> <translation id="6145820983052037069">Ungashintsha phakathi kwamaphrofayela we-Chromium lapha</translation> <translation id="615103374448673771">Uma uvumela amakhukhi, i-Chromium ingase iwasebenzise lapho ilayisha kusengaphambili</translation> +<translation id="6174920971222007286">Leli fayela kungenzeka libe nobungozi<ph name="LINE_BREAK" />I-Chromium ingakuhlolela lokhu okudawunilodwayo uma unikeza iphasiwedi. Ulwazi mayelana nefayela luthunyelwa kokuthi Ukuphequlula ngokuphephile kwe-Google, kodwa okuqukethwe kufayela kanye nephasiwedi kusala kudivayisi yakho.</translation> <translation id="6175304430031192654">Kuye ngamasethingi akho, i-Chromium ingase ithumele amakhukhi kanye ne-URL yakho yamanje</translation> <translation id="6182736845697986886">Ukufaka kuhlulekile ngenxa yephutha langaphakathi leseva yokubuyekeza.</translation> <translation id="6183079672144801177">Yenza isiqinisekiso sokuthi ungene ngemvume ku-Chromium ku-<ph name="TARGET_DEVICE_NAME" /> yakho bese uzama ukuthumela futhi.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index d8e469d1..a955fc4 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Gekoppel aan Android-foon</translation> <translation id="1523279371236772909">In die afgelope maand bekyk</translation> <translation id="1523978563989812243">Teks-na-spraak-enjins</translation> -<translation id="1524430321211440688">Sleutelbord</translation> <translation id="1524563461097350801">Nee, dankie</translation> <translation id="1525740877599838384">Gebruik net Wi-Fi om ligging te bepaal</translation> <translation id="152629053603783244">Herbegin Linux</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Kies 'n ander vouer …</translation> <translation id="3966094581547899417">Warmkolbesonderhede</translation> <translation id="3967822245660637423">Aflaai is voltooi</translation> -<translation id="3967841595862839006">Kies jou taal en sleutelbord</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Bereken tans …</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Skryfvoorspelling</translation> <translation id="4513946894732546136">Terugvoer</translation> <translation id="4515872537870654449">Kontak Dell vir diens. Die dok sal afskakel as die waaier nie werk nie.</translation> -<translation id="4516008165284813420">Maak seker dat jou <ph name="DEVICE_TYPE" /> aan die internet gekoppel is en probeer weer Jy kan ook play.google.com/about/play-terms op ’n ander toestel besoek.</translation> <translation id="4518840066030486079">Shift-sleutelmodusstyl</translation> <translation id="4519331665958994620">Werwe kan vra om jou kamera te gebruik</translation> <translation id="4519605771716872386">Lêersinkronisering is aangeskakel</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 50aed4e..b93940c 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">ከAndroid ስልክ ጋር ተገናኝቷል</translation> <translation id="1523279371236772909">ባለፈው ወር ታይቷል</translation> <translation id="1523978563989812243">የጽሑፍ ወደ ንግግር ፕሮግራሞች</translation> -<translation id="1524430321211440688">የቁልፍ ሰሌዳ</translation> <translation id="1524563461097350801">አይ፣ አመሰግናለሁ</translation> <translation id="1525740877599838384">አካባቢን ለመወሰን Wi-Fiን ብቻ ተጠቀም</translation> <translation id="152629053603783244">Linuxን ዳግም አስነሳ</translation> @@ -3931,7 +3930,6 @@ <translation id="3966072572894326936">ሌላ አቃፊ ምረጥ…</translation> <translation id="3966094581547899417">የመገናኛ ነጥብ ዝርዝሮች</translation> <translation id="3967822245660637423">ማውረድ ተጠናቅቋል</translation> -<translation id="3967841595862839006">የእርስዎን ቋንቋ እና የቁልፍ ሰሌዳ ይምረጡ</translation> <translation id="3968739731834770921">ካና</translation> <translation id="3970114302595058915">መታወቂያ</translation> <translation id="397105322502079400">በማስላት ላይ...</translation> @@ -4613,7 +4611,6 @@ <translation id="4513872120116766993">ግምታዊ አጻጻፍ</translation> <translation id="4513946894732546136">ግብረ መልስ</translation> <translation id="4515872537870654449">ለጥገና አገልግሎት Dell ን ያነጋግሩ። አየር ማርገብገቢያው የማይሠራ ከሆነ መትከያው ይዘጋል።</translation> -<translation id="4516008165284813420">የእርስዎ <ph name="DEVICE_TYPE" /> ከበይነመረቡ ጋር መገናኘቱን ያረጋግጡና እንደገና ይሞክሩ። በሌላ መሣሪያ ላይ play.google.com/about/play-termsን መጎብኘት ይችላሉ።</translation> <translation id="4518840066030486079">የShift ቁልፍ ሁነታ ቅጥ</translation> <translation id="4519331665958994620">ጣቢያዎች ካሜራዎን ለመጠቀም መጠየቅ ይችላሉ</translation> <translation id="4519605771716872386">የፋይል ስምረት በርቷል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index d93c999..e87c3207 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -564,7 +564,8 @@ <translation id="1428770807407000502">هل تريد إيقاف المزامنة؟</translation> <translation id="1429300045468813835">تم محو الكل</translation> <translation id="1430915738399379752">طباعة</translation> -<translation id="1431188203598586230">التحديث الأخير للبرنامج</translation> +<translation id="1431188203598586230">التحديث الأخير للبرامج +</translation> <translation id="1432581352905426595">إدارة محركات البحث</translation> <translation id="1433478348197382180">وضع القراءة</translation> <translation id="1433980411933182122">التشغيل</translation> @@ -681,7 +682,6 @@ <translation id="1521933835545997395">تم الربط بهاتف Android.</translation> <translation id="1523279371236772909">تم الاطّلاع عليه في الشهر الماضي.</translation> <translation id="1523978563989812243">محرّكات "تحويل النص إلى كلام"</translation> -<translation id="1524430321211440688">لوحة المفاتيح</translation> <translation id="1524563461097350801">لا، شكرًا</translation> <translation id="1525740877599838384">استخدام شبكة Wi-Fi فقط لتحديد الموقع الجغرافي</translation> <translation id="152629053603783244">إعادة تشغيل نظام التشغيل Linux</translation> @@ -2207,7 +2207,7 @@ <translation id="2643698698624765890">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في القائمة "نافذة".</translation> <translation id="2645047101481282803">تتم إدارة جهازك من قِبل <ph name="PROFILE_NAME" />.</translation> <translation id="2645388244376970260">جارٍ بث علامة التبويب هذه على "<ph name="DEVICE_NAME" />"</translation> -<translation id="2645435784669275700">نظام التشغيل Chrome</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">غَطَشُ الأحمر</translation> <translation id="2649045351178520408">حفظ سلسلة شهادات بتشفير ASCII المرمّز باستخدام Base64</translation> <translation id="265156376773362237">التحميل المُسبق العادي</translation> @@ -3910,7 +3910,6 @@ <translation id="3966072572894326936">اختيار مجلد آخر...</translation> <translation id="3966094581547899417">تفاصيل نقطة الاتصال</translation> <translation id="3967822245660637423">اكتمل التنزيل</translation> -<translation id="3967841595862839006">اختيار اللغة ولوحة المفاتيح</translation> <translation id="3968739731834770921">كانا</translation> <translation id="3970114302595058915">رقم التعريف</translation> <translation id="397105322502079400">جارٍ الحساب...</translation> @@ -4591,7 +4590,6 @@ <translation id="4513872120116766993">اقتراحات نصية توقّعية</translation> <translation id="4513946894732546136">ملاحظات</translation> <translation id="4515872537870654449">يُرجي التواصل مع فريق دعم Dell للحصول على الخدمة. ستتوقف محطة الإرساء عن العمل في حال توقفت مروحة التبريد عن العمل.</translation> -<translation id="4516008165284813420">يُرجى التأكُّد من أنّ <ph name="DEVICE_TYPE" /> متصل بالإنترنت ثم إعادة المحاولة. ويمكنك أيضًا الانتقال إلى play.google.com/about/play-terms على جهاز آخر.</translation> <translation id="4518840066030486079">نمط وضع استخدام مفتاح Shift</translation> <translation id="4519331665958994620">السماح للمواقع الإلكترونية بطلب استخدام الكاميرا</translation> <translation id="4519605771716872386">تم تفعيل مزامنة الملفات.</translation> @@ -10410,7 +10408,7 @@ <translation id="9056788090206401048">يجب تفعيل البلوتوث لتتمكَّن من استخدام مفتاح المرور الخاص بك على جهاز مختلف. يمكنك متى شئت إدارة هذه الميزة من خلال الإعدادات.</translation> <translation id="9056810968620647706">لم يتم العثور على نتائج مطابقة.</translation> <translation id="9057007989365783744">هناك طلب من <ph name="SUPERVISED_USER_NAME" /> بالوصول إلى المحتوى التالي:</translation> -<translation id="9057354806206861646">تعديل الجدول الزمني</translation> +<translation id="9057354806206861646">الجدول الزمني للتحديثات</translation> <translation id="9058070466596314168">{NUM_NOTIFICATION,plural, =1{إشعار واحد تقريبًا في اليوم}zero{{NUM_NOTIFICATION} إشعار تقريبًا في اليوم}two{إشعاران ({NUM_NOTIFICATION}) تقريبًا في اليوم}few{{NUM_NOTIFICATION} إشعارات تقريبًا في اليوم}many{{NUM_NOTIFICATION} إشعارًا تقريبًا في اليوم}other{{NUM_NOTIFICATION} إشعار تقريبًا في اليوم}}</translation> <translation id="9058760336383947367">الاطّلاع على ملف PPD للطابعة</translation> <translation id="9061694916020926968">يجب تسجيل الدخول إلى حساب Google لاستخدام تطبيق "Steam لأجهزة Chromebook" (الإصدار التجريبي). يُرجى تسجيل الدخول وإعادة المحاولة.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 1dd21ec7..051be60 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Android ফ’নৰ সৈতে সংযোগ কৰা আছে</translation> <translation id="1523279371236772909">যোৱা মাহত চোৱা হৈছে</translation> <translation id="1523978563989812243">পাঠৰ পৰা কথনৰ ইঞ্জিনসমূহ</translation> -<translation id="1524430321211440688">কীব'ৰ্ড</translation> <translation id="1524563461097350801">নালাগে, ধন্যবাদ</translation> <translation id="1525740877599838384">অৱস্থান নির্ধাৰণ কৰিবলৈ কেৱল ৱাই-ফাই ব্যৱহাৰ কৰক</translation> <translation id="152629053603783244">Linux ৰিষ্টাৰ্ট কৰক</translation> @@ -3934,7 +3933,6 @@ <translation id="3966072572894326936">অন্য এটা ফ'ল্ডাৰ বাছনি কৰক...</translation> <translation id="3966094581547899417">হ’টস্প’টৰ সবিশেষ</translation> <translation id="3967822245660637423">ডাউনল’ড সম্পূৰ্ণ হ’ল</translation> -<translation id="3967841595862839006">আপোনাৰ ভাষা আৰু কীব’ৰ্ড বাছনি কৰক</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">গণনা কৰি থকা হৈছে…</translation> @@ -4619,7 +4617,6 @@ <translation id="4513872120116766993">পূৰ্বানুমানৰ ভিত্তি লিখা</translation> <translation id="4513946894732546136">মতামত</translation> <translation id="4515872537870654449">ছাৰ্ভিছিঙৰ বাবে Dellৰ সৈতে যোগাযোগ কৰক। ফেনখনে যদি কাম কৰা নাই ড’কটো বন্ধ হৈ যাব।</translation> -<translation id="4516008165284813420">আপোনাৰ <ph name="DEVICE_TYPE" /> ইণ্টাৰনেটৰ সৈতে সংযোগ হৈ থকাটো নিশ্চিত কৰি পুনৰ চেষ্টা কৰক। আপুনি অন্য এটা ডিভাইচত play.google.com/about/play-termsলৈ যাব পাৰে।</translation> <translation id="4518840066030486079">শ্বিফ্ট কীৰ ম’ডৰ শৈলী</translation> <translation id="4519331665958994620">ছাইটে আপোনাৰ কেমেৰা ব্যৱহাৰ কৰিবলৈ বিচাৰিব পাৰে</translation> <translation id="4519605771716872386">ফাইল ছিংক কৰাৰ সুবিধাটো অন কৰা হৈছে</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 51091fb..80c0dca 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -339,6 +339,7 @@ <translation id="1251578593170406502">Mobil data şəbəkələri üçün skan edilir...</translation> <translation id="125220115284141797">Defolt</translation> <translation id="1252219782845132919">Qrupu gizlədin</translation> +<translation id="1252714168533640068">Qrupu yenidən açmaq üçün qrup adı üzərinə klikləyin</translation> <translation id="1252987234827889034">Profil xətası baş verdi</translation> <translation id="1253664522045778676">Nəticəyə klikləyin, səhifə cari tabda açılacaq</translation> <translation id="1254593899333212300">Birbaşa İnternet bağlantısı</translation> @@ -619,6 +620,7 @@ <translation id="1476347941828409626">&Chrome profillərini idarə edin</translation> <translation id="1476607407192946488">&Dil Ayarları</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> smart kartınızın taxılı qalmasını tələb edir.</translation> +<translation id="1477645000789043442">Açıq tablara əsasən avtomatik tab qrupları yaradır. Bu funksiyadan istifadə üçün tab üzərinə sağ düymə ilə toxunun və Bənzər tabları nizamlayın üzərinə klikləyin.</translation> <translation id="1477654881618305065">Təşkilatınız bu məzmunu paylaşmağa icazə vermir. Yardıma ehtiyacınız varsa, admininizlə əlaqə saxlayın.</translation> <translation id="1478340334823509079">Ətraflı: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Quraşdırma aktiv deyil</translation> @@ -677,7 +679,6 @@ <translation id="1521933835545997395">Android telefonuna qoşulub</translation> <translation id="1523279371236772909">Keçən ay baxılıb</translation> <translation id="1523978563989812243">Mətndən-nitqə mexanizmləri</translation> -<translation id="1524430321211440688">Klaviatura</translation> <translation id="1524563461097350801">Xeyr, təşəkkürlər</translation> <translation id="1525740877599838384">Məkanı müəyyən etmək üçün yalnız Wi-Fi istifadə edin</translation> <translation id="152629053603783244">Linux'u yenidən başladın</translation> @@ -874,6 +875,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Məkanı aşkarlamaq üçün Wi‑Fi və ya mobil şəbəkə istifadə edin</translation> <translation id="164936512206786300">Bluetooth cihazını ayırın</translation> +<translation id="1650407365859096313">Yeni tabda açılır. İcazə: <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">İnternetsiz giriş üçün Mənim diskim bölməsindəki fayllar Chromebook-a avtomatik sinxronlaşdırılacaq. Ayarlar > Fayllar bölməsində dəyişə bilərsiniz.</translation> <translation id="1651008383952180276">Eyni parol sözü iki dəfə daxil etməlisiniz</translation> <translation id="1651609627703324721">Bu tab qulaqlıq üçün VR kontenti göstərir</translation> @@ -1110,6 +1112,7 @@ <translation id="1828901632669367785">Sistem Dialoqundan İstifadə edərək Çap edin...</translation> <translation id="1829129547161959350">Pinqvin</translation> <translation id="1829192082282182671">Kiçildin</translation> +<translation id="182973053761690772">Gün batımı cədvəli</translation> <translation id="1830550083491357902">Ildə imzalanmış deyil</translation> <translation id="1831848493690504725">Qoşulmuş şəbəkə vasitəsilə Google'a daxil olmaq mümkün deyil. Başqa şəbəkə seçin və ya şəbəkə ayarları və ya proksi ayarlarınızı (proksi istifadə edirsinizsə) yoxlayın.</translation> <translation id="1832459821645506983">Bəli, varam</translation> @@ -1166,6 +1169,7 @@ <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> cihazı güncəldir</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> üçün icazələri yenidən verin</translation> <translation id="1874248162548993294">İstənilən reklamın göstərilməsinə icazə verilib</translation> +<translation id="1874794096607967241">Kamera icazəsi olan tətbiq və veb-saytlar, habelə sistem xidmətləri üçün giriş imkanı verin</translation> <translation id="1874874185178737347">Tabların nizamlanması</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Tabı başqa pəncərəyə köçürün}other{Tabları başqa pəncərəyə köçürün}}</translation> <translation id="1875387611427697908">Bu, yalnız <ph name="CHROME_WEB_STORE" /> ünvanından əlavə edilə bilər</translation> @@ -1205,6 +1209,7 @@ <translation id="1901303067676059328">Hamısını seçin</translation> <translation id="1903542130902305074">Ayarlayın</translation> <translation id="1904580727789512086">Ziyarət etdiyiniz keçidlər Google Hesabınızda saxlanılır</translation> +<translation id="1904603806662441960">Chrome-da kamera icazələrini idarə edin</translation> <translation id="1905375423839394163">Chromebook cihaz adı</translation> <translation id="1906181697255754968">Saytlar adətən işinizi avtomatik yaddaşda saxlamaq kimi xüsusiyyətlər üçün cihazınızdakı fayllar və qovluqlara giriş edir</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome Veb Dükanında<ph name="END_LINK" /> digər artırma və temaları kəşf edin</translation> @@ -1345,6 +1350,7 @@ <translation id="200928901437634269">Uşağın Google Hesabından, yaxud məktəb hesabından istifadə edin. Valideyn nəzarəti də ayarlaya bilərsiniz.</translation> <translation id="2009590708342941694">Emoji aləti</translation> <translation id="2010501376126504057">Uyğun cihazlar</translation> +<translation id="201217432804812273">"Qrupu yadda saxlayın" seçimini aktiv edin</translation> <translation id="2012935757369720523">Faylı silin</translation> <translation id="2013550551806600826">Sınayın. Ayarı aktiv və ya deaktiv edib, test sahəsində taçped üzərində iki barmaq ilə sürüşdürün. Bunu Ayarlar > Cihaz > Maus və taçped bölməsində də tapa bilərsiniz.</translation> <translation id="2015232545623037616">Kompüter və Chromecast eyni Wi-Fi şəbəkəsindədir</translation> @@ -1768,6 +1774,7 @@ <translation id="2314165183524574721">Cari görünmə ayarı gizli olaraq ayarlanıb</translation> <translation id="2314774579020744484">Səhifələrin tərcüməsində istifadə edilən dil</translation> <translation id="2316129865977710310">Yox, çox sağ olun</translation> +<translation id="2316433409811863464">Tətbiq yayımı</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% hazırdır</translation> <translation id="2318143611928805047">Kağız ölçüsü</translation> <translation id="2318817390901984578">Android tətbiqləri istifadə etmək üçün <ph name="DEVICE_TYPE" /> cihazını batareya ilə doldurun və yeniləyin.</translation> @@ -1954,6 +1961,7 @@ <translation id="2454206500483040640">Bölünmüş</translation> <translation id="2454247629720664989">Açar söz</translation> <translation id="2454524890947537054">Veb sorğu təsdiq edilsin?</translation> +<translation id="2454913962395846391">Avtomatik saat qurşağı</translation> <translation id="245650153866130664">Bileti avtomatik yeniləmək üçün "Parolu yadda saxlayın"ı yoxlayın Parol yalnız Sizin cihazda saxlanılacaq.</translation> <translation id="2456794251167091176">İmport tamamlandı</translation> <translation id="2456827790665612305">Saytı izləməyin</translation> @@ -2912,6 +2920,7 @@ <translation id="3202499879214571401"><ph name="DEVICE_NAME" /> cihazında ekran yayımını durdurun</translation> <translation id="3202578601642193415">Ən yeni</translation> <translation id="3204648577100496185">Bu tətbiqlə bağlı data bu cihazdan silinəcək</translation> +<translation id="3205140624385017621">Kamera icazəsi olan tətbiq və veb-saytlar, habelə sistem xidmətləri kameradan istifadə edə bilər. Kameradan istifadə üçün tətbiqi yenidən başlatmalı, yaxud səhifəni təzələməlisiniz.</translation> <translation id="3207344462385471911">Son fəaliyyətə əsasən axtarış və şopinq endirimləri üzrə təkliflər görürsünüz. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3189,6 +3198,7 @@ <translation id="3434272557872943250">Uşağınız üçün əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data Google Hesabınızda saxlanıla bilər. families.google.com ünvanında bu ayarlar və onları tənzimləmək haqqında ətraflı məlumat əldə edin.</translation> <translation id="3434475275396485144">Bu ayar telefonunuzun administratoru tərəfindən idarə olunur</translation> <translation id="3434512374684753970">Audio və Video</translation> +<translation id="3435381311628654443">Mikrofon icazəsi olan tətbiq və veb-saytlar, habelə sistem xidmətləri üçün giriş imkanı verin</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" <ph name="CODE_TYPE" /> tələb edir</translation> <translation id="3435738964857648380">Təhlükəsizlik</translation> <translation id="343578350365773421">Kağız bitdi</translation> @@ -3266,6 +3276,7 @@ <translation id="3491669675709357988">Övladınızın hesabı Family Link valideyn nəzarəti üçün ayarlanmayıb. Ayarlamanı bitirdikdən sonra valideyn nəzarətini əlavə edə bilərsiniz. "Araşdırın" tətbiqində valideyn nəzarəti haqqında məlumat tapa bilərsiniz.</translation> <translation id="3491678231052507920">Saytlar adətən sizə VR sessiyalarına daxil olmaq imkanı vermək üçün virtual reallıq cihazlarınızdan və datadan istifadə edir</translation> <translation id="3493043608231401654"><ph name="TAB_TITLE" /> tabını tab qrupundan silin</translation> +<translation id="3493463599276143766">Kamera icazəsi olan veb-sayt yoxdur</translation> <translation id="3493486281776271508">İnternet bağlantısı tələb edilir</translation> <translation id="3493881266323043047">Doğrulama</translation> <translation id="3495496470825196617">Doldurma zamanı fəaliyyətsiz rejim</translation> @@ -3584,6 +3595,7 @@ <translation id="3733296813637058299">Həmin tətbiqləri sizin üçün quraşdıracağıq. Play Marketdə <ph name="DEVICE_TYPE" /> cihazınız üçün daha çox tətbiq tapa bilərsiniz.</translation> <translation id="3735039640698208086">Audio oxudulan zaman...</translation> <translation id="3735740477244556633">Çeşidləyin</translation> +<translation id="3735827758948958091">Ölçülü əlaqədə <ph name="FILE_NAMES" /> fayllarını açmaq olmur</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> datası 24 saat ərzində silinəcək</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> tətbiqi açılsın?</translation> @@ -3852,6 +3864,7 @@ <translation id="3925573269917483990">Kamera:</translation> <translation id="3925926055063465902">Bu cihazdakı digər istifadəçilər də bu şəbəkədən istifadə edə bilər</translation> <translation id="3926002189479431949">Smart Kilid telefonu dəyişdi</translation> +<translation id="3926410220776569451">Kameraya giriş bloklanıb</translation> <translation id="3927932062596804919">Rədd edin</translation> <translation id="3928570707778085600">Dəyişikliklər <ph name="FILE_OR_FOLDER_NAME" /> ünvanında yadda saxlanılsın?</translation> <translation id="3928659086758780856">Mürəkkəb azdır</translation> @@ -3907,7 +3920,6 @@ <translation id="3966072572894326936">Başqa qovluq seçin...</translation> <translation id="3966094581547899417">Hotspot detaları</translation> <translation id="3967822245660637423">Endirmə tamamdır</translation> -<translation id="3967841595862839006">Dil və klaviaturanızı seçin</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Hesablanır...</translation> @@ -4047,6 +4059,7 @@ <translation id="4078738236287221428">Aqressiv</translation> <translation id="4078903002989614318">Çeşidləmə və siyahı seçimləri</translation> <translation id="4079140982534148664">Qabaqcıl orfoqrafik yoxlama istifadə edin</translation> +<translation id="4082333918978320301">Mikrofon icazəsi olan veb-sayt yoxdur</translation> <translation id="4084582735848141214">{COUNT,plural, =1{1 sayta icazə verilib}other{# sayta icazə verilib}}</translation> <translation id="4084682180776658562">Əlfəcin</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> panelini bağlayın</translation> @@ -4194,6 +4207,7 @@ <translation id="4201546031411513170">Sinxronizasiya seçimlərini ayarlarda edə bilərsiniz.</translation> <translation id="4203065553461038553">Fayl adı və ya məkan çox uzundur</translation> <translation id="4203769790323223880">Kameraya icazə verilmir</translation> +<translation id="4204415812590935863">Tema yaratmaq olmur.</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> @@ -4535,6 +4549,7 @@ <translation id="447252321002412580">Chrome'un funksiya və performansını təkmilləşdirməyə kömək edin</translation> <translation id="4472533928615930332"><ph name="STYLE" /> üslubunda <ph name="INDEX" /> indeksli <ph name="SUBJECT" /> şəkli yaradıldı</translation> <translation id="4472575034687746823">Başlayın</translation> +<translation id="4473559657152613417">Taba sağ düymə ilə toxunun və "Tabı yeni qrupa əlavə edin" seçin</translation> <translation id="4473996011558324141">vaxt hesablanır</translation> <translation id="4474155171896946103">Bütün panelləri əlfəcinləyin...</translation> <translation id="4475552974751346499">Endirmələri axtarın</translation> @@ -4586,7 +4601,6 @@ <translation id="4513872120116766993">Proqnozlaşdırıcı yazı</translation> <translation id="4513946894732546136">Geri əlaqə</translation> <translation id="4515872537870654449">Texniki baxış üçün Dell ilə əlaqə saxlayın. Ventilyasiya işləmirsə, dok sönəcək.</translation> -<translation id="4516008165284813420"><ph name="DEVICE_TYPE" /> cihazının internetə qoşulduğuna əmin olun və yenidən cəhd edin. Başqa cihazda play.google.com/about/play-terms bölməsinə keçə də bilərsiniz.</translation> <translation id="4518840066030486079">Shift Düymə Rejimi Üslubu</translation> <translation id="4519331665958994620">Saytlar kameranızdan istifadə icazəsi istəyə bilər</translation> <translation id="4519605771716872386">Fayl sinxronlaşdırması aktivdir</translation> @@ -4630,6 +4644,7 @@ <translation id="4547672827276975204">Avtomatik olaraq ayarlayın</translation> <translation id="4548858987594081919">Google Parol Menecerinin giriş məlumatını yadda saxlaması üçün bu sayt üzrə istifadəçi adı əlavə edin</translation> <translation id="4549791035683739768">Təhlükəsizlik açarında saxlanılan barmaq izi yoxdur</translation> +<translation id="4550737096585299960">Bir neçə dəqiqə sonra yenidən cəhd edin.</translation> <translation id="4550926046134589611">Bəzi dəstəklənən keçidlər hələ də <ph name="APP_NAME" /> tətbiqində açılacaq.</translation> <translation id="4551379727767354516">Son AI temaları</translation> <translation id="4551763574344810652">Geri qaytarmaq üçün <ph name="MODIFIER_KEY_DESCRIPTION" /> qısayoluna klikləyin</translation> @@ -5254,6 +5269,7 @@ <translation id="5051461727068120271">Doğrulanmamış faylı endirin</translation> <translation id="5051836348807686060">Seçdiyiniz dillərdə orfoqrafik yoxlanış dəstəklənmir</translation> <translation id="5052499409147950210">Sayta düzəliş edin</translation> +<translation id="5052853071318006357">Taba sağ düymə ilə toxunun və "Tabı yeni qrupa əlavə edin" seçin</translation> <translation id="5053233576223592551">İstifadəçi adı əlavə edin</translation> <translation id="505347685865235222">Adsız qrup - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />Chrome'u Fərdiləşdirin<ph name="END_LINK" /> bölməsində bütün kart seçimlərini görə bilərsiniz</translation> @@ -5290,6 +5306,7 @@ <translation id="5078638979202084724">Bütün vərəqələri əlfəcinləyin</translation> <translation id="5078796286268621944">Yanlış PIN</translation> <translation id="5079010647467150187">Daxili VPN əlavə edin...</translation> +<translation id="5079460277417557557">Giriş edilmiş masaüstü cihazlarda yadda saxlanmış tab qruplarından istifadə edə bilərsiniz</translation> <translation id="5079699784114005398">Aktiv edilərsə, Google Hesabı ilə daxil olduqda tətbiqlər istənilən ChromeOS cihazında əlçatan olacaq. Brauzer sinxronlaşdırması deaktiv olsa belə, Chrome brauzerindən quraşdırılan veb-tətbiqlər sinxronlaşdırılacaq.</translation> <translation id="508059534790499809">Kerberos biletini yeniləyin</translation> <translation id="5081124414979006563">&Qonaq profilini açın</translation> @@ -5353,6 +5370,7 @@ <translation id="5125967981703109366">Bu kart haqqında</translation> <translation id="512642543295077915">axtarış + geri düyməsi</translation> <translation id="5126611267288187364">Dəyişikliklərə baxın</translation> +<translation id="512761462447738469">Kamera icazəsi olan tətbiq və veb-saytlar, habelə sistem xidmətləri kameradan istifadə edə bilər</translation> <translation id="5127620150973591153">Təhlükəsiz bağlantı ID'si: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Sinx deaktivdir</translation> <translation id="5127881134400491887">Şəbəkə bağlantılarını idarə edin</translation> @@ -6058,6 +6076,7 @@ <translation id="5691581861107245578">Yazdıqlarınıza əsasən emoji təklifləri alın</translation> <translation id="5691772641933328258">Barmaq izi tanınmadı</translation> <translation id="5692183275898619210">Çap hazırdır</translation> +<translation id="5693237475389615913">Chrome-da sayt üçün mikrofon icazələrini idarə edin</translation> <translation id="5693255400847650006">Mikrofon istifadə olunur</translation> <translation id="5695184138696833495">Linux Android tətbiqi üzrə ADB</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" ilə bağlı sui-istifadəni bildirin</translation> @@ -6079,6 +6098,7 @@ <translation id="5708171344853220004">Microsoft İştirakçı Adı</translation> <translation id="5709557627224531708">Chrome'u defolt brauzer kimi quraşdırın</translation> <translation id="5711010025974903573">Xidmət girişləri</translation> +<translation id="5711324642850167289">Mikrofon icazəsi olan tətbiq yoxdur</translation> <translation id="5711983031544731014">Kilidi açmaq mümkün olmadı. Şifrənizi daxil edin.</translation> <translation id="5712153969432126546">Saytlar bəzən sənədlər, müqavilələr və formalar kimi PDF-lər yayımlayır</translation> <translation id="571222594670061844">Saytlar kimlik xidmətlərindən daxil olma sorğularını göstərə bilər</translation> @@ -6270,6 +6290,7 @@ <translation id="5862319196656206789">Qoşulmuş cihazları ayarlayın</translation> <translation id="5862731021271217234">Tabları digər cihazlarınızdan əldə etmək üçün sinxronizasiyanı aktiv edin</translation> <translation id="5863195274347579748">Xarici aksesuarlar şəxsi dataya daxil ola, onu paylaşa bilər.</translation> +<translation id="5863263400083022538">Sistem xidmətləri</translation> <translation id="5863445608433396414">Debaq funksiyalarını aktiv edin</translation> <translation id="5863515189965725638">IBAN-a düzəliş edin</translation> <translation id="5864195618110239517">Limitli bağlantıdan istifadə edin</translation> @@ -6707,6 +6728,7 @@ <translation id="6207937957461833379">Ölkə / Region</translation> <translation id="6208521041562685716">Mobil data aktiv edilir</translation> <translation id="6208725777148613371"><ph name="INTERRUPT_REASON" /> səbəbindən <ph name="WEB_DRIVE" /> yaddaşında saxlamaq mümkün olmadı</translation> +<translation id="6209135795240627482">Mikrofon icazəsi olan tətbiq və veb-saytlar, habelə sistem xidmətləri mikrofondan istifadə edə bilər</translation> <translation id="6209838773933913227">Komponent güncəllənir</translation> <translation id="6209908325007204267">Cihazınıza Chrome Enterprise Güncəlləməsi daxildir, lakin istifadəçi adınız təşkilat hesabı ilə əlaqələndirilməyib. İkinci cihazda g.co/ChromeEnterpriseAccount ünvanına keçərək təşkilat hesabı yaradın.</translation> <translation id="6210282067670792090">Ünvan panelində axtarış sistemləri və sayt axtarışı üçün qısayollarla bu klaviatura qısayolundan istifadə edin</translation> @@ -7041,6 +7063,7 @@ <translation id="6478248366783946499">Təhlükəli fayllar saxlanılsın?</translation> <translation id="6479881432656947268">Chrome Veb Dükanına daxil olun</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> tərəfindən idarə edilir</translation> +<translation id="6481749622989211463">Yaxınlıqdakı cihazlar ilə fayl və s. paylaşın. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Tam ekran böyüdücüsü</translation> <translation id="6483485061007832714">Endirilən faylı açın</translation> <translation id="6483805311199035658"><ph name="FILE" /> açılır...</translation> @@ -7289,6 +7312,7 @@ <translation id="6680650203439190394">Qiymət</translation> <translation id="6683022854667115063">Qulaqlıq</translation> <translation id="6683087162435654533">B&ütün Tabları Bərpa Edin</translation> +<translation id="6683433919380522900">İcazə: <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Ən son güncəlləmə endirilir</translation> <translation id="668599234725812620">Google Play'i açın</translation> <translation id="6686490380836145850">Sağ panelləri bağlayın</translation> @@ -8102,6 +8126,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> adlı istifadəçinin cihazı üçün <ph name="FEATURE_NAME" /> ayarları, <ph name="USER_EMAIL" /> hesabında paylaşılır.</translation> <translation id="7331646370422660166">alt + aşağı ox</translation> <translation id="7332053360324989309">Xüsusi İşçi: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Ölçülü əlaqədə fayl yükləmək olmur.</translation> <translation id="7333669215417470379">Tətbiq və ayarların yedəklənməsi, bərpası</translation> <translation id="7335436113423103413">Yeni Tab Səhifəsindəki birləşdirilmiş yan paneldən Chrome-u Fərdiləşdirin funksiyasını istifadə etmək imkanı verir.</translation> <translation id="7335974957018254119">Bu dillər üçün orfoqrafik yoxlanışdan istifadə edin:</translation> @@ -8258,6 +8283,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome Veb Dükanından silinən 1 artırmaya nəzər salın}other{Chrome Veb Dükanından silinən {NUM_EXTENSIONS} artırmaya nəzər salın}}</translation> <translation id="7436921188514130341">Yenidən adlandırarkən xəta baş verdi.</translation> <translation id="7439519621174723623">Davam etmək üçün cihaz adı əlavə edin</translation> +<translation id="7441736532026945583">Qrupu tab zolağından silmək üçün "Qrupu gizlədin" seçin</translation> <translation id="7441736921018636843">Bu ayarı dəyişmək və sinxronizasiya parolunu silmək üçün <ph name="BEGIN_LINK" />sinxronizasiyanı sıfırlayın<ph name="END_LINK" /></translation> <translation id="7441830548568730290">Digər istifadəçilər</translation> <translation id="744341768939279100">Yeni profil yaradın</translation> @@ -8858,6 +8884,7 @@ <translation id="7887864092952184874">Bluetooth mausu cütləndi</translation> <translation id="7889371445710865055">Diktə dilini dəyişdirin</translation> <translation id="7890147169288018054">IP və ya MAC ünvanınız kimi şəbəkə məlumatlarına baxın</translation> +<translation id="7892005672811746207">"Qrupu yadda saxlayın" seçimini aktiv edin</translation> <translation id="7892384782944609022">Birləşdirmək mümkün olmadı. Yenidən cəhd etmək üçün cihaz seçin.</translation> <translation id="7893008570150657497">Kompüterinizdə foto, musiqi və digər medianı əldə edin</translation> <translation id="7893153962594818789"><ph name="DEVICE_TYPE" /> cihazında Bluetooth deaktivdir. Parolu daxil edərək Bluetooth'u aktiv edin.</translation> @@ -9100,6 +9127,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">Qrup <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Bağlantı Dialoqu</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> məkan icazəsi</translation> <translation id="8070662218171013510">Vibro rəy</translation> <translation id="8071432093239591881">Şəkil kimi çap edin</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Tətbiq datası kontakt, mesaj və foto kimi data daxil olmaqla, tətbiqin yadda saxladığı (tərtibatçı ayarlarına əsasən) istənilən data ola bilər.<ph name="END_PARAGRAPH1" /> @@ -9158,6 +9186,7 @@ <translation id="8109991406044913868">AI ilə yaradılmış tema</translation> <translation id="8110393529211831722">Abunə bu cihazda quraşdırılır və hesaba aid digər cihazlar ilə sinxronlaşdırılmır. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Kontakt siyahısı endirilir...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> mikrofon icazəsi</translation> <translation id="8115139559594092084">Google Diskinizdən</translation> <translation id="8116972784401310538">&Əlfəcin meneceri</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> giriş qaydanızı yadda saxlayır və mümkün olduqda sizi avtomatik daxil edir. Deaktiv olduqda hər dəfə təsdiq tələb ediləcək.</translation> @@ -9373,6 +9402,7 @@ <translation id="8275038454117074363">İmport edin</translation> <translation id="8275080796245127762">Cihazınızdan Zəng</translation> <translation id="8275339871947079271">Daxil olduqda təhlükəsiz giriş üçün parolunuzu Google Hesabınıza köçürün.</translation> +<translation id="8276242035951017580">Kamera icazəsi olan tətbiq yoxdur</translation> <translation id="8276560076771292512">Keşi boşaldın və yenidən yükləyin</translation> <translation id="8276850948802942358">Sayta üçüncü tərəf kukilərindən müvəqqəti istifadə icazəsi vermək haqqında ətraflı məlumat</translation> <translation id="828180235270931531">Digər əlçatan printerlər</translation> @@ -9391,6 +9421,7 @@ <translation id="8291942417224950075">Şəxsi istifadə üçün</translation> <translation id="8293206222192510085">Əlfəcin əlavə edin</translation> <translation id="8294431847097064396">Mənbə</translation> +<translation id="8294476140219241086">Tab nizamlayıcı</translation> <translation id="8294895455164415895">Chrome-un tab qrupları təklif etməsi üçün ayarları açın</translation> <translation id="8295449579927246485">Canlı Tərcümə</translation> <translation id="8295450130892483256">Microsoft 365-i quraşdırın</translation> @@ -9503,6 +9534,7 @@ <translation id="8380266723152870797">Pəncərə adı</translation> <translation id="8380941800586852976">Təhlükəli</translation> <translation id="8381630473947706877">Aktiv edin: <ph name="FEATURE_NAME" /></translation> +<translation id="8382197851871630452">Yerli hava</translation> <translation id="8382677870544805359">Müəssisə funksiyalarından istifadə etmək üçün bu cihazı zavod ayarlarına sıfırlamalı olacaqsınız.</translation> <translation id="8382715499079447151">Baxış qoruması</translation> <translation id="8382913212082956454">E-poçt ünvanını kopyalayın</translation> @@ -9693,6 +9725,7 @@ <translation id="8528962588711550376">Hesaba giriş.</translation> <translation id="8529578450330869579">İnternet trafikinə girişi olan şəxslərin daxil olduğunuz saytları görməməsi üçün təhlükəsiz Domen Adı Sistemindən (DNS) istifadə edin. Bu, <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> ünvanında idarə olunan xidmət təminatçısından istifadə edir</translation> <translation id="8529925957403338845">Cəld modem əlaqəsi kəsildi</translation> +<translation id="8531367864749403520">Qrupu tab zolağından silmək üçün "Qrupu gizlədin" seçin</translation> <translation id="8531701051932785007">Qabaqcıl Güvənli Baxış deaktivdir</translation> <translation id="8533670235862049797">Təhlükəsiz Baxış aktivdir</translation> <translation id="8534656636775144800">Ups! Domenə qoşularkən xəta baş verdi. Yenidən cəhd edin.</translation> @@ -9819,6 +9852,7 @@ <translation id="8639635302972078117">İ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 məlumatlardan uşağınızı müəyyən etmək üçün istifadə edilməyəcək. Onlar 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. Uşağınız üçün əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data Google Hesabınızda saxlanıla bilər.</translation> <translation id="8640575194957831802">Son açılan</translation> <translation id="8641946446576357115">Parolları iOS cihazlarında istifadə edin</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> kamera icazəsi</translation> <translation id="8642900771896232685">2 saniyə</translation> <translation id="8642947597466641025">Mətni böyüdün</translation> <translation id="8643403533759285912">Qrupu silin</translation> @@ -9853,6 +9887,7 @@ <translation id="8662978096466608964">Chrome divar kağızını ayarlaya bilmir.</translation> <translation id="8663051876219324457">Tətbiq, veb-sayt və sistem xidmətlərinə məkandan istifadə icazəsi verin. Məkan icazəsi cihaz məkanını təxmin etmək üçün Wi‑Fi, mobil şəbəkə və sensor kimi mənbələrdən istifadə edə bilər. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> hostunda çoxsaylı avtomatik endirmələri bloklayın</translation> +<translation id="8664249499245357248">Qrup adına sağ düymə ilə toxunun</translation> <translation id="8664389313780386848">Səhifə mənbəsinə baxın</translation> <translation id="8665110742939124773">Yanlış giriş kodu daxil etmisiniz. Yenə cəhd edin.</translation> <translation id="8665180165765946056">Yedəkləmə tamamlandı</translation> @@ -10175,6 +10210,7 @@ <translation id="8900413463156971200">Mobil şəbəkəni aktiv edin</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> bugün datanızı yedəkləmənizi və bu <ph name="DEVICE_TYPE" /> cihazını qaytarmanızı tələb edir.}other{<ph name="MANAGER" /> son tarixdən öncə datanızı yedəkləmənizi və bu <ph name="DEVICE_TYPE" /> cihazını qaytarmanızı tələb edir.}}</translation> <translation id="8902667442496790482">Seçib səsləndirmə ayarlarını seçin</translation> +<translation id="8903733144777177139">Mikrofona giriş bloklanıb</translation> <translation id="890616557918890486">Mənbəni dəyişin</translation> <translation id="8907701755790961703">Ölkə seçin</translation> <translation id="8908420399006197927">Tabı təklif edilən qrupdan çıxarın</translation> @@ -10212,6 +10248,7 @@ <translation id="8934732568177537184">Davam edin</translation> <translation id="8938800817013097409">USB-C cihazı (arxadakı sağ port)</translation> <translation id="8940081510938872932">Kompüteriniz hazırda çox məşğuldur. Sonra cəhd edin.</translation> +<translation id="8940228279218723234">Kamera icazəsi olan tətbiq və veb-saytlar, habelə sistem xidmətləri üçün giriş imkanı verin. Kameradan istifadə üçün tətbiqi yenidən başlatmalı, yaxud səhifəni təzələməlisiniz.</translation> <translation id="8940381019874223173">Google Foto'dan</translation> <translation id="8940888110818450052">Giriş seçimləri</translation> <translation id="8941173171815156065">'<ph name="PERMISSION" />' icazəsini ləğv edin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 1411b84..b3c55dc 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -344,6 +344,7 @@ <translation id="1251578593170406502">Ідзе пошук сетак мабільнай перадачы даных...</translation> <translation id="125220115284141797">Стандартныя</translation> <translation id="1252219782845132919">Схаваць групу</translation> +<translation id="1252714168533640068">Каб зноў адкрыць групу, націсніце на яе назву</translation> <translation id="1252987234827889034">Узнікла памылка профілю</translation> <translation id="1253664522045778676">Націсніце на вынік пошуку і старонка адкрыецца на вашай бягучай укладке</translation> <translation id="1254593899333212300">Прамое падключэнне да інтэрнэту</translation> @@ -380,6 +381,7 @@ <translation id="1281746473742296584">{NUM_OF_FILES,plural, =1{Не ўдаецца адкрыць файл}one{Не ўдаецца адкрыць файлы}few{Не ўдаецца адкрыць файлы}many{Не ўдаецца адкрыць файлы}other{Не ўдаецца адкрыць файлы}}</translation> <translation id="1282311502488501110">Не ўваходзіць</translation> <translation id="1282465000333679776">Абагульваць аўдыя сістэмы</translation> +<translation id="1283126956823499975">Пры наладжванні прылады адбылася памылка</translation> <translation id="1284277788676816155">Не дазваляць захоўваць даныя</translation> <translation id="1285320974508926690">Ніколі не перакладаць гэты сайт</translation> <translation id="1285484354230578868">Захаванне даных на вашым Google Дыску</translation> @@ -623,6 +625,7 @@ <translation id="1476347941828409626">&Кіраваць профілямі Chrome</translation> <translation id="1476607407192946488">&Налады мовы</translation> <translation id="1477446329585670721">Па правілах дамена <ph name="DOMAIN" /> разумная картка павінна быць устаўлена.</translation> +<translation id="1477645000789043442">Групы з адкрытых укладак ствараюцца аўтаматычна. Каб выкарыстоўваць гэту функцыю, націсніце правай кнопкай мышы на ўкладку і выберыце "Упарадкаваць падобныя ўкладкі".</translation> <translation id="1477654881618305065">Ваша арганізацыя не дазваляе вам абагульваць гэта змесціва. Пры патрэбе звярніцеся да адміністратара.</translation> <translation id="1478340334823509079">Падрабязнасці: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Усталяванне не ўключана</translation> @@ -681,7 +684,6 @@ <translation id="1521933835545997395">Падключана да тэлефона Android</translation> <translation id="1523279371236772909">Прагледжана ў мінулым месяцы</translation> <translation id="1523978563989812243">Модулі сінтэзу маўлення</translation> -<translation id="1524430321211440688">Клавіятура</translation> <translation id="1524563461097350801">Не, дзякуй</translation> <translation id="1525740877599838384">Вызначаць месцазнаходжанне толькі праз Wi-Fi</translation> <translation id="152629053603783244">Перазапусціць Linux</translation> @@ -880,6 +882,7 @@ <translation id="1648439345221797326">Ctrl + Shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Выкарыстоўваць Wi‑Fi або мабільныя сеткі для вызначэння месцазнаходжання</translation> <translation id="164936512206786300">Разлучыць прыладу Bluetooth</translation> +<translation id="1650407365859096313">Адкрыецца ў новай укладцы, стан дазволу: <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">Файлы з раздзела "Мой Дыск" будуць аўтаматычна сінхранізавацца з Chromebook, каб у вас быў да іх доступ нават без падключэння да інтэрнэту. Гэты параметр можна змяніць у любы час праз меню "Налады > Файлы".</translation> <translation id="1651008383952180276">Вам трэба двойчы ўвесці аднолькавую фразу-пароль</translation> <translation id="1651609627703324721">Гэта ўкладка паказвае VR-змесціва на гарнітуры</translation> @@ -1116,6 +1119,7 @@ <translation id="1828901632669367785">Друк з выкарыстаннем сістэмнага дыялогавага акна...</translation> <translation id="1829129547161959350">Пінгвін</translation> <translation id="1829192082282182671">Паменшыць &маштаб</translation> +<translation id="182973053761690772">Расклад з улікам захаду сонца</translation> <translation id="1830550083491357902">Уваход не выкананы</translation> <translation id="1831848493690504725">Нам не ўдаецца звязацца з Google праз падключаную сетку. Паспрабуйце выбраць іншую сетку або праверце налады сеткі і проксі-сервера (калі вы яго выкарыстоўваеце).</translation> <translation id="1832459821645506983">Так, згаджаюся</translation> @@ -1172,6 +1176,7 @@ <translation id="1871615898038944731">Абнаўленне прылады <ph name="DEVICE_TYPE" /> не патрабуецца</translation> <translation id="1873920700418191231">Даць дазволы вэб-сайту <ph name="WEBSITE" /> зноў</translation> <translation id="1874248162548993294">Дазволена паказваць любую рэкламу</translation> +<translation id="1874794096607967241">Даць доступ праграмам і вэб-сайтам з дазволам на выкарыстанне камеры, а таксама сістэмным службам</translation> <translation id="1874874185178737347">Упарадкаваць укладкі</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Перамясціць укладку ў іншае акно}one{Перамясціць укладкі ў іншае акно}few{Перамясціць укладкі ў іншае акно}many{Перамясціць укладкі ў іншае акно}other{Перамясціць укладкі ў іншае акно}}</translation> <translation id="1875387611427697908">Гэта можна дадаць толькі з <ph name="CHROME_WEB_STORE" /></translation> @@ -1211,6 +1216,7 @@ <translation id="1901303067676059328">Выбраць &усё</translation> <translation id="1903542130902305074">Наладзіць</translation> <translation id="1904580727789512086">URL-адрасы, якія вы наведвалі, захоўваюцца ва Уліковы запіс Google</translation> +<translation id="1904603806662441960">Кіраванне дазволамі сайтаў на выкарыстанне камеры ў Chrome</translation> <translation id="1905375423839394163">Назва прылады Chromebook</translation> <translation id="1906181697255754968">Сайты звычайна атрымліваюць доступ да файлаў і папак на прыладзе для работы такіх функцый, як аўтаматычнае захаванне зробленага</translation> <translation id="1906488504371069394">Больш пашырэнняў і тэм можна знайсці ў <ph name="BEGIN_LINK" />Вэб-краме Chrome<ph name="END_LINK" /></translation> @@ -1351,6 +1357,7 @@ <translation id="200928901437634269">Выкарыстаць вучэбны ўліковы запіс або Уліковы запіс Google дзіцяці. Таксама можна наладзіць бацькоўскі кантроль.</translation> <translation id="2009590708342941694">Інструмент "Эмодзі"</translation> <translation id="2010501376126504057">Сумяшчальныя прылады</translation> +<translation id="201217432804812273">Уключыце параметр "Захаваць групу"</translation> <translation id="2012935757369720523">Выдаліць файл</translation> <translation id="2013550551806600826">Паспрабуйце: уключыце або выключыце гэту наладу, а затым прагартайце, правёўшы двума пальцамі па сэнсарнай панэлі ў вобласці тэсціравання. Вы таксама можаце зрабіць гэта пазней, адкрыўшы меню "Налады > Прылада > Мыш і сэнсарная панэль".</translation> <translation id="2015232545623037616">ПК і прылада Chromecast у адной і той жа сетцы Wi-Fi</translation> @@ -1769,6 +1776,7 @@ <translation id="2314165183524574721">Бягучая налада бачнасці: схавана</translation> <translation id="2314774579020744484">Мова, якая выкарыстоўваецца для перакладу</translation> <translation id="2316129865977710310">Не, дзякуй</translation> +<translation id="2316433409811863464">Трансляцыя праграм</translation> <translation id="2317842250900878657">Гатова <ph name="PROGRESS_PERCENT" /> %</translation> <translation id="2318143611928805047">Памер паперы</translation> <translation id="2318817390901984578">Каб карыстацца праграмамі Android, зарадзіце і абнавіце <ph name="DEVICE_TYPE" />.</translation> @@ -1955,6 +1963,7 @@ <translation id="2454206500483040640">Прыменена раздзяленне</translation> <translation id="2454247629720664989">Ключавое слова</translation> <translation id="2454524890947537054">Даць доступ да вэб-старонкі?</translation> +<translation id="2454913962395846391">Аўтавызначэнне часавага пояса</translation> <translation id="245650153866130664">Каб аўтаматычна абнаўляць білет, пастаўце птушку "Запомніць пароль". Пароль будзе захоўвацца толькі на вашай прыладзе.</translation> <translation id="2456794251167091176">Імпартаванне завершана</translation> <translation id="2456827790665612305">Адпісацца ад сайта</translation> @@ -2203,7 +2212,7 @@ <translation id="2643698698624765890">Каб кіраваць пашырэннямі, націсніце "Пашырэнні" ў меню "Акно".</translation> <translation id="2645047101481282803">Гэтай прыладай кіруе <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Ідзе трансляцыя гэтай укладкі на прыладу "<ph name="DEVICE_NAME" />"</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Пратанамалія</translation> <translation id="2649045351178520408">ASCII з кадзіраваннем Base64, ланцужок сертыфікатаў</translation> <translation id="265156376773362237">Стандартная перадзагрузка</translation> @@ -2913,6 +2922,7 @@ <translation id="3202499879214571401">Прыпыніць трансляцыю экрана на прыладу "<ph name="DEVICE_NAME" />"</translation> <translation id="3202578601642193415">самыя новыя</translation> <translation id="3204648577100496185">Даныя, звязаныя з дадзенай праграмай, могуць быць выдалены з гэтай прылады</translation> +<translation id="3205140624385017621">Камеру могуць выкарыстоўваць праграмы і вэб-сайты з адпаведнымі дазволамі, а таксама сістэмныя службы. Для выкарыстання камеры, магчыма, трэба будзе перазапусціць праграму ці абнавіць старонку.</translation> <translation id="3207344462385471911">Вы бачыце рэкамендацыі пошукавых запытаў і скідкі, якія могуць быць вам цікавыя (на падставе вашых нядаўніх дзеянняў). <ph name="BREAK" /> <ph name="BREAK" /> @@ -3190,6 +3200,7 @@ <translation id="3434272557872943250">Калі для вашага дзіцяці ўключана налада "Дадатковыя дзеянні ў інтэрнэце і праграмах", то адпаведныя даныя могуць захоўвацца ў яго Уліковым запісе Google. Даведацца больш пра гэтыя налады і іх рэгуліроўку можна на сайце families.google.com.</translation> <translation id="3434475275396485144">Гэтай наладай кіруе адміністратар вашага тэлефона</translation> <translation id="3434512374684753970">Аўдыя і відэа</translation> +<translation id="3435381311628654443">Даць доступ праграмам і вэб-сайтам з дазволам на выкарыстанне мікрафона, а таксама сістэмным службам</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" запытвае ў вас <ph name="CODE_TYPE" /></translation> <translation id="3435738964857648380">Бяспека</translation> <translation id="343578350365773421">Скончылася папера</translation> @@ -3267,6 +3278,7 @@ <translation id="3491669675709357988">Для ўліковага запісу вашага дзіцяці не наладжаны бацькоўскі кантроль Family Link. Вы можаце дадаць функцыю бацькоўскага кантролю па завяршэнні наладкі. Інфармацыю пра бацькоўскі кантроль можна знайсці ў праграме "Агляд".</translation> <translation id="3491678231052507920">Сайты звычайна выкарыстоўваюць даныя і прылады віртуальнай рэальнасці для запуску сеансаў VR</translation> <translation id="3493043608231401654">Выдаліць "<ph name="TAB_TITLE" />" з групы ўкладак</translation> +<translation id="3493463599276143766">Няма вэб-сайтаў з дазволам на выкарыстанне камеры</translation> <translation id="3493486281776271508">Патрабуецца падключэнне да інтэрнэту</translation> <translation id="3493881266323043047">Тэрмін дзеяння</translation> <translation id="3495496470825196617">Рэжым сну падчас зарадкі</translation> @@ -3583,6 +3595,7 @@ <translation id="3733296813637058299">Мы ўсталюем для вас гэтыя праграмы. Больш праграм для сваёй прылады <ph name="DEVICE_TYPE" /> вы можаце знайсці ў Краме Play.</translation> <translation id="3735039640698208086">Падчас прайгравання аўдыя...</translation> <translation id="3735740477244556633">Парадак сартавання</translation> +<translation id="3735827758948958091">Нельга адкрыць файл "<ph name="FILE_NAMES" />", калі выкарыстоўваецца падключэнне з падлікам трафіка</translation> <translation id="3738632186060045350">Даныя на прыладзе <ph name="DEVICE_TYPE" /> будуць выдалены праз 24 гадзіны</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">Адкрыць праграму <ph name="APPLICATION" />?</translation> @@ -3851,6 +3864,7 @@ <translation id="3925573269917483990">Камера:</translation> <translation id="3925926055063465902">Іншыя карыстальнікі прылады таксама могуць выкарыстоўваць гэту сетку</translation> <translation id="3926002189479431949">Тэлефон са Smart Lock зменены</translation> +<translation id="3926410220776569451">Доступ да камеры заблакіраваны</translation> <translation id="3927932062596804919">Адмовіць</translation> <translation id="3928570707778085600">Захаваць змяненні ў "<ph name="FILE_OR_FOLDER_NAME" />"?</translation> <translation id="3928659086758780856">Мала чарніла</translation> @@ -3906,7 +3920,6 @@ <translation id="3966072572894326936">Выбраць іншую папку...</translation> <translation id="3966094581547899417">Падрабязныя звесткі пра хот-спот</translation> <translation id="3967822245660637423">Спампоўка завершана</translation> -<translation id="3967841595862839006">Выберыце мову і клавіятуру</translation> <translation id="3968739731834770921">Кана</translation> <translation id="3970114302595058915">Ідэнтыфікатар</translation> <translation id="397105322502079400">Ідзе разлік...</translation> @@ -4046,6 +4059,7 @@ <translation id="4078738236287221428">Дзейная</translation> <translation id="4078903002989614318">Параметры сартавання і спісу</translation> <translation id="4079140982534148664">Выкарыстоўваць палепшаную праверку правапісу</translation> +<translation id="4082333918978320301">Няма вэб-сайтаў з дазволам на выкарыстанне мікрафона</translation> <translation id="4084582735848141214">{COUNT,plural, =1{Файлы cookie дазволены на 1 сайце}one{Файлы cookie дазволены на # сайце}few{Файлы cookie дазволены на # сайтах}many{Файлы cookie дазволены на # сайтах}other{Файлы cookie дазволены на # сайта}}</translation> <translation id="4084682180776658562">Дадаць у закладкі</translation> <translation id="4084835346725913160">Закрыць укладку "<ph name="TAB_NAME" />"</translation> @@ -4195,6 +4209,7 @@ <translation id="4201546031411513170">У наладах заўсёды можна выбраць, што трэба сінхранізаваць.</translation> <translation id="4203065553461038553">Назва файла або шлях яго да месцазнаходжання занадта доўгія</translation> <translation id="4203769790323223880">Выкарыстанне камеры забаронена</translation> +<translation id="4204415812590935863">Зараз нельга стварыць тэму.</translation> <translation id="4205157409548006256">Пры наладжванні Linux адбылася памылка.</translation> <translation id="4206144641569145248">Прышэлец</translation> <translation id="4206323443866416204">Адпраўка водгуку</translation> @@ -4536,6 +4551,7 @@ <translation id="447252321002412580">Дапамажыце палепшыць функцыі і прадукцыйнасць Chrome</translation> <translation id="4472533928615930332">Згенерыраваны відарыс <ph name="INDEX" />, тэма: <ph name="SUBJECT" />, стыль: <ph name="STYLE" /></translation> <translation id="4472575034687746823">Пачаць</translation> +<translation id="4473559657152613417">Націсніце правай кнопкай мышы на ўкладку і выберыце "Дадаць укладку ў новую групу"</translation> <translation id="4473996011558324141">разлічваецца час</translation> <translation id="4474155171896946103">Дадаць у закладкі ўсе ўкладкі...</translation> <translation id="4475552974751346499">Пошук спамповак</translation> @@ -4587,7 +4603,6 @@ <translation id="4513872120116766993">Прагнастычныя падказкі пры напісанні тэксту</translation> <translation id="4513946894732546136">Водгук</translation> <translation id="4515872537870654449">Звярніцеся ў службу тэхпадтрымкі Dell. Калі вентылятар не працуе, док-станцыя выключыцца.</translation> -<translation id="4516008165284813420">Пераканайцеся, што ваша прылада (<ph name="DEVICE_TYPE" />) падключана да інтэрнэту, і паўтарыце спробу. Вы таксама можаце адкрыць старонку play.google.com/about/play-terms на іншай прыладзе.</translation> <translation id="4518840066030486079">Стыль рэжыму клавішы Shift</translation> <translation id="4519331665958994620">Сайты могуць запытваць дазвол на выкарыстанне камеры</translation> <translation id="4519605771716872386">Сінхранізацыя файлаў уключана</translation> @@ -4631,6 +4646,7 @@ <translation id="4547672827276975204">Вызначаць аўтаматычна</translation> <translation id="4548858987594081919">Укажыце сваё імя карыстальніка для гэтага сайта, каб даныя для ўваходу можна было захаваць у Менеджары пароляў Google</translation> <translation id="4549791035683739768">На вашым ключы бяспекі няма захаваных адбіткаў пальцаў</translation> +<translation id="4550737096585299960">Паўтарыце спробу праз некалькі хвілін.</translation> <translation id="4550926046134589611">Некаторыя спасылкі, якія падтрымліваюцца, па-ранейшаму будуць адкрывацца ў праграме "<ph name="APP_NAME" />".</translation> <translation id="4551379727767354516">Вашы нядаўнія тэмы, створаныя AI</translation> <translation id="4551763574344810652">Каб адрабіць, націсніце <ph name="MODIFIER_KEY_DESCRIPTION" /></translation> @@ -5022,6 +5038,7 @@ <translation id="4863769717153320198">Здаецца, гэта <ph name="WIDTH" /> × <ph name="HEIGHT" /> (стандартная)</translation> <translation id="4864369630010738180">Уваход...</translation> <translation id="4864805589453749318">Выберыце, хто з бацькоў дае дазвол дадаць навучальны ўліковы запіс.</translation> +<translation id="4864905533117889071"><ph name="SENSOR_NAME" /> (заблакіравана)</translation> <translation id="486505726797718946">Захавана ў памяці</translation> <translation id="486635084936119914">Аўтаматычна адкрываць пэўныя тыпы файлаў пасля спампоўвання</translation> <translation id="4867272607148176509">Бацькі могуць ухваляць і блакіраваць праграмы, усталёўваць абмежаванні па часе і кантраляваць прагляд вэб-старонак. Для доступу да большасці навучальных рэсурсаў пазней можна дадаць вучэбны ўліковы запіс.</translation> @@ -5254,6 +5271,7 @@ <translation id="5051461727068120271">Спампаваць неправераны файл</translation> <translation id="5051836348807686060">Праверка правапісу для выбраных моў не падтрымліваецца</translation> <translation id="5052499409147950210">Рэдагаванне сайта</translation> +<translation id="5052853071318006357">Націсніце правай кнопкай мышы на ўкладку і выберыце "Дадаць укладку ў новую групу"</translation> <translation id="5053233576223592551">Дадаць імя карыстальніка</translation> <translation id="505347685865235222">Група без назвы – <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193">Праглядзіце ўсе варыянты картак у раздзеле <ph name="BEGIN_LINK" />Наладзіць Chrome<ph name="END_LINK" /></translation> @@ -5290,6 +5308,7 @@ <translation id="5078638979202084724">Дадаць у закладкі ўсе ўкладкі</translation> <translation id="5078796286268621944">Няправільны PIN-код</translation> <translation id="5079010647467150187">Дадаць убудаваную сетку VPN...</translation> +<translation id="5079460277417557557">Цяпер вы можаце выкарыстоўваць захаваныя групы ўкладак на ўсіх камп'ютарах, дзе выкананы ўваход</translation> <translation id="5079699784114005398">Пасля ўключэння праграмы будуць даступныя на прыладах ChromeOS пасля таго, як вы ўвойдзеце ва Уліковы запіс Google. Вэб-праграмы, усталяваныя з браўзера Chrome, будуць сінхранізавацца, нават калі сінхранізацыя браўзера выключана.</translation> <translation id="508059534790499809">Абнаўленне білета Kerberos</translation> <translation id="5081124414979006563">&Адкрыць гасцявы профіль</translation> @@ -5353,6 +5372,7 @@ <translation id="5125967981703109366">Інфармацыя пра гэту картку</translation> <translation id="512642543295077915">пошук + Backspace</translation> <translation id="5126611267288187364">Прагляд змяненняў</translation> +<translation id="512761462447738469">Камеру могуць выкарыстоўваць праграмы і вэб-сайты з адпаведнымі дазволамі, а таксама сістэмныя службы</translation> <translation id="5127620150973591153">Абаронены ідэнтыфікатар падключэння: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Сінхранізацыя выключана</translation> <translation id="5127881134400491887">Кіраваць падключэннямі да сеткі</translation> @@ -5514,6 +5534,7 @@ <translation id="5261619498868361045">Назва кантэйнера не можа адсутнічаць.</translation> <translation id="5261683757250193089">Адкрыць у Вэб-краме</translation> <translation id="5261799091118902550">Гэты файл можа з'яўляцца вірусам або шкоднай праграмай. Вы можаце адправіць яго на праверку ў Google.</translation> +<translation id="5262334727506665688">Працягвайце захоўваць паролі ва Уліковым запісе Google</translation> <translation id="5262784498883614021">Падключацца да сеткі аўтаматычна</translation> <translation id="5263656105659419083">Каб хутка вярнуцца на бакавую панэль, уверсе справа націсніце "Замацаваць"</translation> <translation id="5264148714798105376">Гэта можа заняць каля хвіліны.</translation> @@ -6057,6 +6078,7 @@ <translation id="5691581861107245578">Атрымлівайце прапановы эмодзі на падставе тэксту, які вы ўводзіце</translation> <translation id="5691772641933328258">Адбітак пальца не распазнаны</translation> <translation id="5692183275898619210">Друкаванне завершана</translation> +<translation id="5693237475389615913">Кіраванне дазволамі сайтаў на выкарыстанне мікрафона ў Chrome</translation> <translation id="5693255400847650006">Выкарыстоўваецца мікрафон</translation> <translation id="5695184138696833495">ADB у праграмах для Android у Linux</translation> <translation id="5696143504434933566">Паскардзіцца на пашырэнне "<ph name="EXTENSION_NAME" />"</translation> @@ -6078,6 +6100,7 @@ <translation id="5708171344853220004">Галоўнае імя Microsoft</translation> <translation id="5709557627224531708">Зрабіць Chrome стандартным браўзерам</translation> <translation id="5711010025974903573">Журналы абслугоўвання</translation> +<translation id="5711324642850167289">Няма праграм з дазволам на выкарыстанне мікрафона</translation> <translation id="5711983031544731014">Не ўдалося разблакіраваць. Увядзіце пароль.</translation> <translation id="5712153969432126546">Часам сайты публікуюць PDF-файлы (напрыклад, дакументы, кантракты і формы)</translation> <translation id="571222594670061844">Сайты могуць паказваць запыты на ўваход ад сэрвісаў ідэнтыфікацыі</translation> @@ -6269,6 +6292,7 @@ <translation id="5862319196656206789">Наладзіць падключаныя прылады</translation> <translation id="5862731021271217234">Каб глядзець укладкі са сваіх іншых прылад, уключыце сінхранізацыю</translation> <translation id="5863195274347579748">Знешнія аксесуары могуць мець доступ да асабістых даных і абагульваць іх.</translation> +<translation id="5863263400083022538">Сістэмныя службы</translation> <translation id="5863445608433396414">Уключыць функцыі адладкі</translation> <translation id="5863515189965725638">Змяненне нумара IBAN</translation> <translation id="5864195618110239517">Выкарыстоўваць падключэнне з улікам трафіка</translation> @@ -6706,6 +6730,7 @@ <translation id="6207937957461833379">Краіна або рэгіён</translation> <translation id="6208521041562685716">Ідзе актывацыя мабільнай перадачы даных</translation> <translation id="6208725777148613371">Не ўдалося захаваць элемент у сэрвісе "<ph name="WEB_DRIVE" />": <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">Мікрафон могуць выкарыстоўваць праграмы і вэб-сайты з адпаведнымі дазволамі, а таксама сістэмныя службы</translation> <translation id="6209838773933913227">Абнаўленне кампанента</translation> <translation id="6209908325007204267">Прылада ўключае ў сябе ліцэнзію Chrome Enterprise, але ваша імя карыстальніка не звязана з карпаратыўным уліковым запісам. Стварыце карпаратыўны ўліковы запіс, наведаўшы старонку g.co/ChromeEnterpriseAccount з іншай прылады.</translation> <translation id="6210282067670792090">Выкарыстоўвайце ў адрасным радку гэта спалучэнне клавіш разам з камандамі, каб выкарыстоўваць канкрэтныя пошукавыя сістэмы і выконваць пошук на асобных сайтах</translation> @@ -7040,6 +7065,7 @@ <translation id="6478248366783946499">Захаваць небяспечны файл?</translation> <translation id="6479881432656947268">Наведаць Вэб-краму Chrome</translation> <translation id="6480327114083866287">Кіруе <ph name="MANAGER" /></translation> +<translation id="6481749622989211463">Абагульвайце файлы і іншае змесціва з прыладамі паблізу. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Лупа для поўнаэкраннага рэжыму</translation> <translation id="6483485061007832714">Адкрыццё спампоўкі</translation> <translation id="6483805311199035658">Адкрываецца <ph name="FILE" />...</translation> @@ -7052,6 +7078,7 @@ <translation id="649396225532207613">Гэты файл можа нанесці шкоду вашым асабістым уліковым запісам і ўліковым запісам у сацыяльных сетках</translation> <translation id="6494327278868541139">Паказаць падрабязныя звесткі аб палепшанай абароне</translation> <translation id="6494445798847293442">Не з'яўляецца цэнтрам сертыфікацыі</translation> +<translation id="6494483173119160146">На прыладзе адбылася непапраўная памылка. Выканайце скід прылады (усе карыстальніцкія даныя будуць сцёрты) і паўтарыце спробу.</translation> <translation id="6497784818439587832">Змяняйце маштаб дысплэя, каб паменшыць або павялічыць памеры аб'ектаў на экране</translation> <translation id="6497789971060331894">Адваротная прагортка мышшу</translation> <translation id="6498249116389603658">&Усе вашы мовы</translation> @@ -7293,6 +7320,7 @@ <translation id="6680650203439190394">Хуткасць</translation> <translation id="6683022854667115063">Навушнікі</translation> <translation id="6683087162435654533">Аднавіць усе ўкладкі</translation> +<translation id="6683433919380522900">Стан дазволу: <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Ідзе спампоўка апошняга абнаўлення</translation> <translation id="668599234725812620">Адкрыць Google Play</translation> <translation id="6686490380836145850">Закрыць укладкі справа</translation> @@ -8106,6 +8134,7 @@ <translation id="7330533963640151632">Налады функцыі "<ph name="FEATURE_NAME" />" для прылады, якой карыстаецца <ph name="USER_NAME" />, абагульваюцца ад імені ўліковага запісу <ph name="USER_EMAIL" />.</translation> <translation id="7331646370422660166">Alt + стрэлка ўніз</translation> <translation id="7332053360324989309">Вылучаны рабочы працэс: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Нельга запампаваць файлы, калі выкарыстоўваецца падключэнне з падлікам трафіка.</translation> <translation id="7333669215417470379">Рэзервовае капіраванне і аднаўленне праграм і налад</translation> <translation id="7335436113423103413">Дае магчымасць выкарыстоўваць функцыі наладжвання Chrome з дапамогай аб'яднанай бакавой панэлі на старонцы новай укладкі.</translation> <translation id="7335974957018254119">Для якіх моў выкарыстоўваць праверку правапісу</translation> @@ -8262,6 +8291,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Праверце 1 пашырэнне, якое было выдалена з Вэб-крамы Chrome}one{Праверце {NUM_EXTENSIONS} пашырэнне, якое было выдалена з Вэб-крамы Chrome}few{Праверце {NUM_EXTENSIONS} пашырэнні, якія былі выдалены з Вэб-крамы Chrome}many{Праверце {NUM_EXTENSIONS} пашырэнняў, якія былі выдалены з Вэб-крамы Chrome}other{Праверце {NUM_EXTENSIONS} пашырэння, якія былі выдалены з Вэб-крамы Chrome}}</translation> <translation id="7436921188514130341">На жаль, падчас перайменавання адбылася памылка.</translation> <translation id="7439519621174723623">Каб працягнуць, дадайце назву прылады</translation> +<translation id="7441736532026945583">Каб прыбраць групу з панэлі ўкладак, выберыце "Схаваць групу"</translation> <translation id="7441736921018636843">Для змянення гэтай налады <ph name="BEGIN_LINK" />скіньце сінхранізацыю<ph name="END_LINK" />, каб выдаліць фразу-пароль сінхранізацыі</translation> <translation id="7441830548568730290">Іншыя карыстальнікі</translation> <translation id="744341768939279100">Стварыць новы профіль</translation> @@ -8862,6 +8892,7 @@ <translation id="7887864092952184874">Мыш Bluetooth спалучана</translation> <translation id="7889371445710865055">Змена мовы галасавога ўводу</translation> <translation id="7890147169288018054">Прагляд звестак пра сетку (напрыклад, вашага IP- або MAC-адраса)</translation> +<translation id="7892005672811746207">Уключыце параметр "Захаваць групу"</translation> <translation id="7892384782944609022">Не ўдалося спалучыць. Выберыце прыладу, каб паўтарыць спробу.</translation> <translation id="7893008570150657497">Доступ да фота, музыкі і іншых файлаў мультымедыя на камп'ютары</translation> <translation id="7893153962594818789">Bluetooth выключаны на гэтай прыладзе <ph name="DEVICE_TYPE" />. Увядзіце пароль і ўключыце Bluetooth.</translation> @@ -9104,6 +9135,7 @@ <translation id="8064015586118426197">Chrome OS Flex</translation> <translation id="8064279191081105977">Група "<ph name="GROUP_NAME" />" – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Дыялогавае акно падключэння</translation> +<translation id="8070572887926783747">Дазвол на доступ да геаданых для праграмы "<ph name="APP_NAME" />"</translation> <translation id="8070662218171013510">Тактыльны водгук</translation> <translation id="8071432093239591881">Друкаваць як відарыс</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Даныя праграм – гэта любыя даныя, якія захоўваюцца праграмай (у залежнасці ад налад распрацоўшчыка), у тым ліку кантакты, паведамленні і фота.<ph name="END_PARAGRAPH1" /> @@ -9162,6 +9194,7 @@ <translation id="8109991406044913868">Тэма, створаная AI</translation> <translation id="8110393529211831722">Падпіска ўсталёўваецца толькі на гэту прыладу і не сінхранізуецца з іншымі прыладамі, на якіх вы ўвайшлі ва ўліковы запіс. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Ідзе спампоўванне спіса кантактаў...</translation> +<translation id="8114925369073821854">Дазвол на выкарыстанне мікрафона для праграмы "<ph name="APP_NAME" />"</translation> <translation id="8115139559594092084">З Google Дыска</translation> <translation id="8116972784401310538">&Менеджар закладак</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> запамінае вашы даныя для ўваходу і, калі магчыма, будзе выконваць уваход аўтаматычна. Калі гэтая функцыя выключана, ад вас будзе патрабавацца пацвярджэнне пры кожным уваходзе.</translation> @@ -9377,6 +9410,7 @@ <translation id="8275038454117074363">Імпартаваць</translation> <translation id="8275080796245127762">Выклікаць з прылады</translation> <translation id="8275339871947079271">Каб мець бяспечны доступ да пароля на ўсіх прыладах, дзе вы выканалі ўваход, захавайце яго ў сваім Уліковым запісе Google</translation> +<translation id="8276242035951017580">Няма праграм з дазволам на выкарыстанне камеры</translation> <translation id="8276560076771292512">Ачыстка кэша і халодная перазагрузка</translation> <translation id="8276850948802942358">Даведацца больш пра тое, як даць сайту часовы дазвол на выкарыстанне старонніх файлаў cookie</translation> <translation id="828180235270931531">Іншыя даступныя прынтары</translation> @@ -9395,6 +9429,7 @@ <translation id="8291942417224950075">Для асабістага карыстання</translation> <translation id="8293206222192510085">Дадаванне закладкі</translation> <translation id="8294431847097064396">Крыніца</translation> +<translation id="8294476140219241086">Упарадкаванне ўкладак</translation> <translation id="8294895455164415895">Адкрыць налады, каб дазволіць Chrome прапаноўваць групы ўкладак</translation> <translation id="8295449579927246485">Імгненны пераклад</translation> <translation id="8295450130892483256">Усталюйце Microsoft 365</translation> @@ -9507,6 +9542,7 @@ <translation id="8380266723152870797">Назва акна</translation> <translation id="8380941800586852976">Небяспечна</translation> <translation id="8381630473947706877">Уключыць функцыю "<ph name="FEATURE_NAME" />"</translation> +<translation id="8382197851871630452">Мясцовае надвор'е</translation> <translation id="8382677870544805359">Каб выкарыстоўваць карпаратыўныя функцыі, вам трэба будзе скінуць гэту прыладу да заводскіх налад.</translation> <translation id="8382715499079447151">Абаронены прагляд</translation> <translation id="8382913212082956454">Скапіраваць &адрас электроннай пошты</translation> @@ -9535,6 +9571,7 @@ <translation id="8397825320644530257">Адключыць падключаны тэлефон</translation> <translation id="8398877366907290961">Усё роўна працягнуць</translation> <translation id="8399282673057829204">Паглядзець пароль</translation> +<translation id="839949601275221554">На прыладзе адбылася памылка. Перазапусціце прыладу і паўтарыце спробу.</translation> <translation id="8401432541486058167">Укажыце PIN-код, звязаны з разумнай карткай.</translation> <translation id="8401772916834964810">{COUNT,plural, =0{Сёння Chrome зноў заблакіруе файлы cookie}=1{Заўтра Chrome зноў заблакіруе файлы cookie}one{Chrome зноў заблакіруе файлы cookie праз # дзень}few{Chrome зноў заблакіруе файлы cookie праз # дні}many{Chrome зноў заблакіруе файлы cookie праз # дзён}other{Chrome зноў заблакіруе файлы cookie праз # дня}}</translation> <translation id="8403618281196981152">Вашы даныя ў Chrome</translation> @@ -9696,6 +9733,7 @@ <translation id="8528962588711550376">Выконваецца ўваход.</translation> <translation id="8529578450330869579">Выкарыстоўвайце абароненую сістэму даменных імёнаў (DNS), каб тыя, у каго ёсць доступ да вашага інтэрнэт-трафіка, не маглі ўбачыць, якія сайты вы наведваеце. Для гэтага ўжываецца прызначаны адміністратарам пастаўшчык паслуг: <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" />.</translation> <translation id="8529925957403338845">Збой злучэння Імгненнага рэжыму мадэма</translation> +<translation id="8531367864749403520">Каб прыбраць групу з панэлі ўкладак, выберыце "Схаваць групу"</translation> <translation id="8531701051932785007">Палепшаны Бяспечны прагляд выключаны</translation> <translation id="8533670235862049797">"Бяспечны прагляд" уключаны</translation> <translation id="8534656636775144800">Памылка! Нешта пайшло не так падчас спробы далучыцца да дамена. Паўтарыце спробу.</translation> @@ -9822,6 +9860,7 @@ <translation id="8639635302972078117">Адпраўка даных пра выкарыстанне і дыягностыку. Зараз прылада аўтаматычна адпраўляе ў Google даныя дыягностыкі і даныя пра выкарыстанне прылады і праграм. Яны не будуць выкарыстаны для ідэнтыфікацыі асобы дзіцяці, але дапамогуць у паляпшэнні стабільнасці сістэмы і праграм і іншых удасканаленнях. Некаторыя згрупаваныя даныя таксама будуць карысныя для праграм і партнёраў Google, напрыклад распрацоўшчыкаў Android. Калі для вашага дзіцяці ўключана налада "Дадатковыя дзеянні ў інтэрнэце і праграмах", то адпаведныя даныя могуць захоўвацца ў яго Уліковым запісе Google.</translation> <translation id="8640575194957831802">Час апошняга адкрыцця</translation> <translation id="8641946446576357115">Выкарыстоўвайце паролі на сваіх прыладах iOS</translation> +<translation id="8642577642520207435">Дазвол на выкарыстанне камеры для праграмы "<ph name="APP_NAME" />"</translation> <translation id="8642900771896232685">2 секунды</translation> <translation id="8642947597466641025">Павялічыць тэкст</translation> <translation id="8643403533759285912">Выдаліць групу</translation> @@ -9856,6 +9895,7 @@ <translation id="8662978096466608964">Не ўдалося ўсталяваць шпалеры ў Chrome.</translation> <translation id="8663051876219324457">Дазволіць праграмам, вэб-сайтам і сістэмным службам выкарыстоўваць ваша месцазнаходжанне. Для вызначэння месцазнаходжання прылады могуць выкарыстоўвацца даныя Wi-Fi, мабільных сетак і датчыкаў. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="8663099077749055505">Заўсёды блакіраваць некалькі аўтаматычных спамповак на <ph name="HOST" /></translation> +<translation id="8664249499245357248">Націсніце правай кнопкай мышы на назву групы</translation> <translation id="8664389313780386848">&Прагляд зыходнага тэксту старонкі</translation> <translation id="8665110742939124773">Вы ўвялі няправільны код доступу. Паўтарыце спробу.</translation> <translation id="8665180165765946056">Рэзервовая копія створана</translation> @@ -10183,6 +10223,7 @@ <translation id="8900413463156971200">Уключыць сотавую сетку</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> патрабуе, каб вы стварылі рэзервовую копію сваіх даных і вярнулі прыладу <ph name="DEVICE_TYPE" /> сёння.}one{<ph name="MANAGER" /> патрабуе, каб вы стварылі рэзервовую копію сваіх даных і вярнулі прыладу <ph name="DEVICE_TYPE" /> да заканчэння тэрміну.}few{<ph name="MANAGER" /> патрабуе, каб вы стварылі рэзервовую копію сваіх даных і вярнулі прыладу <ph name="DEVICE_TYPE" /> да заканчэння тэрміну.}many{<ph name="MANAGER" /> патрабуе, каб вы стварылі рэзервовую копію сваіх даных і вярнулі прыладу <ph name="DEVICE_TYPE" /> да заканчэння тэрміну.}other{<ph name="MANAGER" /> патрабуе, каб вы стварылі рэзервовую копію сваіх даных і вярнулі прыладу <ph name="DEVICE_TYPE" /> да заканчэння тэрміну.}}</translation> <translation id="8902667442496790482">Адкрыць налады функцыі "Чытаць уголас"</translation> +<translation id="8903733144777177139">Доступ да мікрафона заблакіраваны</translation> <translation id="890616557918890486">Змяніць крыніцу</translation> <translation id="8907701755790961703">Выберыце краіну</translation> <translation id="8908420399006197927">Выключыць укладку з прапанаванай групы</translation> @@ -10220,6 +10261,7 @@ <translation id="8934732568177537184">Далей</translation> <translation id="8938800817013097409">Прылада USB-C (задні порт справа)</translation> <translation id="8940081510938872932">На вашым камп'ютары выконваецца занадта шмат працэсаў. Паўтарыце спробу пазней.</translation> +<translation id="8940228279218723234">Даць доступ праграмам і вэб-сайтам з дазволам на выкарыстанне камеры, а таксама сістэмным службам. Для выкарыстання камеры, магчыма, трэба будзе перазапусціць праграму ці абнавіць старонку.</translation> <translation id="8940381019874223173">З Google Фота</translation> <translation id="8940888110818450052">Спосабы ўваходу</translation> <translation id="8941173171815156065">Адклікаць дазвол "<ph name="PERMISSION" />"</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index ebb76d9..2a033e5 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Установена е връзка с телефон с Android</translation> <translation id="1523279371236772909">Прегледано през миналия месец</translation> <translation id="1523978563989812243">Машини за синтезиран говор</translation> -<translation id="1524430321211440688">Клавиатура</translation> <translation id="1524563461097350801">Не, благодаря</translation> <translation id="1525740877599838384">Определяне на местоположението само посредством Wi-Fi</translation> <translation id="152629053603783244">Рестартиране на Linux</translation> @@ -2214,7 +2213,7 @@ <translation id="2643698698624765890">Управлявайте разширенията си, като кликнете върху „Разширения“ в менюто „Прозорец“.</translation> <translation id="2645047101481282803">Устройството ви се управлява от <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Този раздел се предава към <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Протаномалия</translation> <translation id="2649045351178520408">ASCII с кодиране Base64, верига сертификати</translation> <translation id="265156376773362237">Стандартно предварит. зареждане</translation> @@ -3920,7 +3919,6 @@ <translation id="3966072572894326936">Изберете друга папка...</translation> <translation id="3966094581547899417">Подробности за точката за достъп</translation> <translation id="3967822245660637423">Изтеглянето завърши</translation> -<translation id="3967841595862839006">Избиране на език и клавиатура</translation> <translation id="3968739731834770921">кана</translation> <translation id="3970114302595058915">Идентификатор</translation> <translation id="397105322502079400">Изчислява се...</translation> @@ -4602,7 +4600,6 @@ <translation id="4513872120116766993">Предвиждащо писане</translation> <translation id="4513946894732546136">Отзиви</translation> <translation id="4515872537870654449">Обърнете се към Dell за обслужване. Докинг станцията ще се изключи, ако вентилаторът не работи.</translation> -<translation id="4516008165284813420">Проверете дали устройството ви <ph name="DEVICE_TYPE" /> е свързано с интернет и опитайте отново. Можете също да посетите play.google.com/about/play-terms от друго устройство.</translation> <translation id="4518840066030486079">Стил на режимa за клавиша Shift</translation> <translation id="4519331665958994620">Сайтовете могат да извеждат запитвания за използване на камерата ви</translation> <translation id="4519605771716872386">Синхронизирането на файловете е включено</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index c77e0db..3c58238 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Android ফোনে কানেক্ট করা আছে</translation> <translation id="1523279371236772909">গত মাসে দেখা হয়েছে</translation> <translation id="1523978563989812243">টেক্সট-টু-স্পিচ ইঞ্জিন</translation> -<translation id="1524430321211440688">কীবোর্ড</translation> <translation id="1524563461097350801">না থাক</translation> <translation id="1525740877599838384">লোকেশন নির্ধারণ করার জন্য ওয়াই-ফাই ব্যবহার করুন</translation> <translation id="152629053603783244">Linux রিস্টার্ট করুন</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">অন্য ফোল্ডার বেছে নিন...</translation> <translation id="3966094581547899417">হটস্পটের বিবরণ</translation> <translation id="3967822245660637423">ডাউনলোড সম্পূর্ণ</translation> -<translation id="3967841595862839006">আপনার ভাষা ও কীবোর্ড বেছে নিন</translation> <translation id="3968739731834770921">কানা</translation> <translation id="3970114302595058915">আইডি</translation> <translation id="397105322502079400">গণনা করা হচ্ছে...</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">লেখার সাজেশন</translation> <translation id="4513946894732546136">প্রতিক্রিয়া</translation> <translation id="4515872537870654449">সার্ভিসিংয়ের জন্য Dell-এর সাথে যোগাযোগ করুন। ফ্যান কাজ না করলে ডকিং স্টেশন বন্ধ হয়ে যাবে।</translation> -<translation id="4516008165284813420">আপনার <ph name="DEVICE_TYPE" /> ইন্টারনেটের সাথে কানেক্ট করা আছে কিনা ভালোভাবে দেখে নিয়ে আবার চেষ্টা করুন। এছাড়াও অন্য ডিভাইস থেকে আপনি play.google.com/about/play-terms ভিজিট করতে পারবেন।</translation> <translation id="4518840066030486079">Shift কী মোড স্টাইল</translation> <translation id="4519331665958994620">সাইট আপনার ক্যামেরা ব্যবহার করার অনুমতি চাইতে পারে</translation> <translation id="4519605771716872386">ফাইল সিঙ্ক করার প্রসেস চালু আছে</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index faf7bc4..7ea250a1 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -345,6 +345,7 @@ <translation id="1251578593170406502">Skeniranje mreža za prijenos podataka...</translation> <translation id="125220115284141797">Zadano</translation> <translation id="1252219782845132919">Sakrij grupu</translation> +<translation id="1252714168533640068">Da ponovo otvorite grupu, kliknite na naziv grupe</translation> <translation id="1252987234827889034">Došlo je do greške na profilu</translation> <translation id="1253664522045778676">Kliknite na rezultat i stranica će se otvoriti u trenutnoj kartici</translation> <translation id="1254593899333212300">Direktna internetska veza</translation> @@ -626,6 +627,7 @@ <translation id="1476347941828409626">&Upravljaj profilima u Chromeu</translation> <translation id="1476607407192946488">&Postavke jezika</translation> <translation id="1477446329585670721">Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.</translation> +<translation id="1477645000789043442">Automatski kreira grupe kartica na osnovu otvorenih kartica. Da koristite ovu funkciju, desnim klikom kliknite na karticu i kliknite na Organiziraj slične kartice.</translation> <translation id="1477654881618305065">Vaša organizacija vam ne dozvoljava da dijelite ovaj sadržaj. Kontaktirajte administratora ako vam je potrebna pomoć.</translation> <translation id="1478340334823509079">Detalji: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Instalacija nije omogućena</translation> @@ -684,7 +686,6 @@ <translation id="1521933835545997395">Povezano je s Android telefonom</translation> <translation id="1523279371236772909">Pregledano u proteklom mjesecu</translation> <translation id="1523978563989812243">Programi za pretvaranje teksta u govor</translation> -<translation id="1524430321211440688">Tastatura</translation> <translation id="1524563461097350801">Ne, hvala</translation> <translation id="1525740877599838384">Za određivanje lokacije koristi isključivo WiFi</translation> <translation id="152629053603783244">Ponovo pokrenite Linux</translation> @@ -883,6 +884,7 @@ <translation id="1648439345221797326">Ctrl + Shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Koristi WiFi, Bluetooth ili mobilnu mrežu za određivanje lokacije</translation> <translation id="164936512206786300">Okončaj uparivanje Bluetooth uređaja</translation> +<translation id="1650407365859096313">Otvaranje u novoj kartici; odobrenje je <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">Fajlovi na usluzi Moj disk će se automatski sinhronizirati s Chromebookom da im možete pristupati bez internetske veze. Možete promijeniti ovo bilo kada u Postavkama > Fajlovi.</translation> <translation id="1651008383952180276">Morate dvaput unijeti isti pristupni izraz</translation> <translation id="1651609627703324721">Ova kartica prikazuje VR sadržaj u virtuelnim naočalama</translation> @@ -1124,6 +1126,7 @@ <translation id="1828901632669367785">Štampaj pomoću sistemskog dijaloškog okvira...</translation> <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">&Umanji</translation> +<translation id="182973053761690772">Raspored obustave</translation> <translation id="1830550083491357902">Niste prijavljeni</translation> <translation id="1831848493690504725">Putem povezane mreže nije moguće uspostaviti vezu s Googleom. Pokušajte odabrati drugu mrežu ili provjerite postavke mreže ili proksija (ako koristite proksi server).</translation> <translation id="1832459821645506983">Pristajem</translation> @@ -1181,6 +1184,7 @@ <translation id="1871615898038944731">Vaš uređaj <ph name="DEVICE_TYPE" /> je ažuriran</translation> <translation id="1873920700418191231">Ponovno dozvoljavanje odobrenja za <ph name="WEBSITE" /></translation> <translation id="1874248162548993294">Dozvoljeno je prikazivanje svih oglasa</translation> +<translation id="1874794096607967241">Dozvolite pristup za aplikacije i web lokacije s odobrenjem za kameru i usluge sistema</translation> <translation id="1874874185178737347">Organiziraj kartice</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Premjesti karticu u drugi prozor}one{Premjesti kartice u drugi prozor}few{Premjesti kartice u drugi prozor}other{Premjesti kartice u drugi prozor}}</translation> <translation id="1875387611427697908">Ovo se može dodati samo iz usluge <ph name="CHROME_WEB_STORE" /></translation> @@ -1220,6 +1224,7 @@ <translation id="1901303067676059328">Odaberi &sve</translation> <translation id="1903542130902305074">Postavi</translation> <translation id="1904580727789512086">URL-ovi koje posjećujete pohranjuju se na vaš Google račun</translation> +<translation id="1904603806662441960">Upravljajte odobrenjima za kameru za web lokacije u Chromeu</translation> <translation id="1905375423839394163">Naziv Chromebook uređaja</translation> <translation id="1906181697255754968">Web lokacije obično pristupaju fajlovima i folderima na vašem uređaju radi funkcija kao što je automatsko snimanje napretka</translation> <translation id="1906488504371069394">Otkrijte više ekstenzija i tema u <ph name="BEGIN_LINK" />Chrome Web trgovini<ph name="END_LINK" /></translation> @@ -1360,6 +1365,7 @@ <translation id="200928901437634269">Koristite djetetov Google račun ili školski račun. Također možete postaviti roditeljski nadzor.</translation> <translation id="2009590708342941694">Alat za emoji sličice</translation> <translation id="2010501376126504057">Kompatibilni uređaji</translation> +<translation id="201217432804812273">Uključite "Pohranjivanje grupe"</translation> <translation id="2012935757369720523">Izbriši fajl</translation> <translation id="2013550551806600826">Isprobajte. Uključite ili isključite postavku, a zatim kližite s dva prsta na dodirnoj podlozi u testnom području. Ovo također možete pronaći kasnije u Postavkama > Uređaj > Miš i dodirna podloga.</translation> <translation id="2015232545623037616">PC i Chromecast na istoj WiFi mreži</translation> @@ -1783,6 +1789,7 @@ <translation id="2314165183524574721">Trenutna postavka vidljivosti je Skriveno</translation> <translation id="2314774579020744484">Jezik koji se koristi prilikom prevođenja stranica</translation> <translation id="2316129865977710310">Ne, hvala</translation> +<translation id="2316433409811863464">Prijenos aplikacije</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% završeno</translation> <translation id="2318143611928805047">Veličina papira</translation> <translation id="2318817390901984578">Da koristite Android aplikacije, napunite i ažurirajte uređaj <ph name="DEVICE_TYPE" />.</translation> @@ -1969,6 +1976,7 @@ <translation id="2454206500483040640">Podijeljeno</translation> <translation id="2454247629720664989">Ključna riječ</translation> <translation id="2454524890947537054">Odobriti zahtjev za web lokaciju?</translation> +<translation id="2454913962395846391">Automatska vremenska zona</translation> <translation id="245650153866130664">Označite "Zapamti lozinku" da automatski osvježite tiket. Vaša lozinka će se pohraniti samo na vaš uređaj.</translation> <translation id="2456794251167091176">Uvoz dovršen</translation> <translation id="2456827790665612305">Prestanite pratiti web lokaciju</translation> @@ -2927,6 +2935,7 @@ <translation id="3202499879214571401">Pauziranje emitiranja ekrana na uređaju <ph name="DEVICE_NAME" /></translation> <translation id="3202578601642193415">Najnovije</translation> <translation id="3204648577100496185">Podaci koji su povezani s ovom aplikacijom se mogu ukloniti s ovog uređaja</translation> +<translation id="3205140624385017621">Aplikacije i web lokacije s odobrenjima za kameru i usluge sistema mogu koristiti kameru. Da aplikacija ili stranica koristi kameru, možda ćete trebati ponovo pokrenuti aplikaciju odnosno osvježiti stranicu.</translation> <translation id="3207344462385471911">Vidite predložena pretraživanja i popuste za kupovinu koji vas mogu interesirati ovisno o vašoj nedavnoj aktivnosti. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3204,6 +3213,7 @@ <translation id="3434272557872943250">Ako je za vaše dijete uključena postavka za dodatnu Aktivnost na webu i u aplikacijama, ovi podaci mogu biti sačuvani na Google računu djeteta. Na stranici families.google.com saznajte više o ovim postavkama i kako ih prilagoditi.</translation> <translation id="3434475275396485144">Ovom postavkom upravlja administrator vašeg telefona</translation> <translation id="3434512374684753970">Zvuk i videozapis</translation> +<translation id="3435381311628654443">Dozvolite pristup za aplikacije i web lokacije s odobrenjem za mikrofon i usluge sistema</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" traži vaš <ph name="CODE_TYPE" /></translation> <translation id="3435738964857648380">Sigurnost</translation> <translation id="343578350365773421">Nema papira</translation> @@ -3281,6 +3291,7 @@ <translation id="3491669675709357988">Račun vašeg djeteta nije postavljen za roditeljski nadzor Family Linka. Možete dodati roditeljski nadzor kada završite postavljanje. Informacije o roditeljskom nadzoru možete pronaći u aplikaciji Istražite.</translation> <translation id="3491678231052507920">Web lokacije obično koriste vaše uređaje i podatke virtuelne realnosti da vam omoguće pristup VR sesijama</translation> <translation id="3493043608231401654">Uklanjanje kartice <ph name="TAB_TITLE" /> iz grupe kartica</translation> +<translation id="3493463599276143766">Nijednoj web lokaciji nije dozvoljeno da koristi kameru</translation> <translation id="3493486281776271508">Potrebna je internetska veza</translation> <translation id="3493881266323043047">Valjanost</translation> <translation id="3495496470825196617">Neaktivnost tokom punjenja</translation> @@ -3599,6 +3610,7 @@ <translation id="3733296813637058299">Instalirat ćemo te aplikacije za vas. Više aplikacija za uređaj <ph name="DEVICE_TYPE" /> možete pronaći u Play trgovini.</translation> <translation id="3735039640698208086">Prilikom reproduciranja zvuka...</translation> <translation id="3735740477244556633">Poredaj po</translation> +<translation id="3735827758948958091">Nije moguće otvoriti fajl <ph name="FILE_NAMES" /> na vezi s naplatom</translation> <translation id="3738632186060045350">Podaci na uređaju <ph name="DEVICE_TYPE" /> će se izbrisati za 24 sata</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">Otvoriti <ph name="APPLICATION" />?</translation> @@ -3867,6 +3879,7 @@ <translation id="3925573269917483990">Kamera:</translation> <translation id="3925926055063465902">Ovu mrežu mogu koristiti i drugi korisnici na ovom uređaju</translation> <translation id="3926002189479431949">Telefon za Smart Lock je promijenjen</translation> +<translation id="3926410220776569451">Pristup kameri je blokiran</translation> <translation id="3927932062596804919">Odbij</translation> <translation id="3928570707778085600">Sačuvati izmjene u <ph name="FILE_OR_FOLDER_NAME" />?</translation> <translation id="3928659086758780856">Nizak nivo tinte</translation> @@ -3922,7 +3935,6 @@ <translation id="3966072572894326936">Odaberite drugi folder...</translation> <translation id="3966094581547899417">Detalji o pristupnoj tački</translation> <translation id="3967822245660637423">Preuzimanje je završeno</translation> -<translation id="3967841595862839006">Odaberite jezik i tastaturu</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Računanje…</translation> @@ -4062,6 +4074,7 @@ <translation id="4078738236287221428">Agresivno</translation> <translation id="4078903002989614318">Sortiranje i izlistavanje opcija</translation> <translation id="4079140982534148664">Koristi naprednu provjeru pravopisa</translation> +<translation id="4082333918978320301">Nijednoj web lokaciji nije dozvoljeno da koristi mikrofon</translation> <translation id="4084582735848141214">{COUNT,plural, =1{Dozvoljena je 1 web lokacija}one{Dozvoljena je # web lokacija}few{Dozvoljene su # web lokacije}other{Dozvoljeno je # web lokacija}}</translation> <translation id="4084682180776658562">Oznaka</translation> <translation id="4084835346725913160">Zatvori <ph name="TAB_NAME" /></translation> @@ -4211,6 +4224,7 @@ <translation id="4201546031411513170">Uvijek možete odabrati šta želite sinhronizirati u postavkama.</translation> <translation id="4203065553461038553">Naziv fajla ili lokacije je predug</translation> <translation id="4203769790323223880">Kamera nije dozvoljena</translation> +<translation id="4204415812590935863">Trenutno nije moguće kreirati temu.</translation> <translation id="4205157409548006256">Došlo je do greške prilikom konfiguriranja Linuxa.</translation> <translation id="4206144641569145248">Vanzemaljac</translation> <translation id="4206323443866416204">Izvještaj o povratnim informacijama</translation> @@ -4552,6 +4566,7 @@ <translation id="447252321002412580">Pomozite nam da poboljšamo funkcije i performanse Chromea</translation> <translation id="4472533928615930332"><ph name="INDEX" />. generirana slika; predmet: <ph name="SUBJECT" />; stil: <ph name="STYLE" /></translation> <translation id="4472575034687746823">Započnite</translation> +<translation id="4473559657152613417">Desnim klikom kliknite na karticu i odaberite "Dodaj karticu u novu grupu"</translation> <translation id="4473996011558324141">procjenjivanje vremena</translation> <translation id="4474155171896946103">Označi sve kartice...</translation> <translation id="4475552974751346499">Pretražite preuzimanja</translation> @@ -4604,7 +4619,6 @@ <translation id="4513872120116766993">Predvidljivo pisanje</translation> <translation id="4513946894732546136">Povratne informacije</translation> <translation id="4515872537870654449">Kontaktirajte Dell za podršku. Priključna stanica će se isključiti ukoliko ventilator ne radi.</translation> -<translation id="4516008165284813420">Provjerite je li uređaj <ph name="DEVICE_TYPE" /> povezan s internetom i pokušajte ponovo. Također možete posjetiti play.google.com/about/play-terms na drugom uređaju.</translation> <translation id="4518840066030486079">Stil načina rada s tipkom Shift</translation> <translation id="4519331665958994620">Web lokacije mogu tražiti da koriste vašu kameru</translation> <translation id="4519605771716872386">Sinhronizacija fajlova je uključena</translation> @@ -4648,6 +4662,7 @@ <translation id="4547672827276975204">Postavi automatski</translation> <translation id="4548858987594081919">Da pomognete Google upravitelju lozinki da sačuva podatke za prijavu, dodajte korisničko ime za ovu web lokaciju</translation> <translation id="4549791035683739768">Na vašem sigurnosnom ključu nisu pohranjeni otisci prstiju</translation> +<translation id="4550737096585299960">Pokušajte ponovo za nekoliko minuta.</translation> <translation id="4550926046134589611">Neki podržani linkovi će se i dalje otvarati u aplikaciji <ph name="APP_NAME" />.</translation> <translation id="4551379727767354516">Vaše nedavne AI teme</translation> <translation id="4551763574344810652">Pritisnite tipku <ph name="MODIFIER_KEY_DESCRIPTION" /> da opozovete radnju</translation> @@ -5272,6 +5287,7 @@ <translation id="5051461727068120271">Preuzmi nepotvrđeni fajl</translation> <translation id="5051836348807686060">Alat za provjeru pravopisa nije podržan za odabrane jezike</translation> <translation id="5052499409147950210">Uredite web lokaciju</translation> +<translation id="5052853071318006357">Desnim klikom kliknite na karticu i odaberite "Dodaj karticu u novu grupu"</translation> <translation id="5053233576223592551">Dodaj korisničko ime</translation> <translation id="505347685865235222">Neimenovana grupa – <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193">Pogledajte sve opcije kartica u odjeljku <ph name="BEGIN_LINK" />Prilagodite Chrome<ph name="END_LINK" /></translation> @@ -5308,6 +5324,7 @@ <translation id="5078638979202084724">Označite sve kartice</translation> <translation id="5078796286268621944">Pogrešan PIN</translation> <translation id="5079010647467150187">Dodaj ugrađeni VPN...</translation> +<translation id="5079460277417557557">Sada možete koristiti sačuvane grupe kartica na računarima na kojima ste prijavljeni</translation> <translation id="5079699784114005398">Ako je ova opcija uključena, vaše aplikacije će biti dostupne na svim ChromeOS uređajima nakon što se prijavite s Google računom. Web aplikacije instalirane iz preglednika Chrome će se sinhronizirati čak i ako je sinhronizacija preglednika isključena.</translation> <translation id="508059534790499809">Osvježavanje Kerberos tiketa</translation> <translation id="5081124414979006563">&Otvori profil gosta</translation> @@ -5371,6 +5388,7 @@ <translation id="5125967981703109366">O ovoj kartici</translation> <translation id="512642543295077915">tipka za pretraživanje + Backspace</translation> <translation id="5126611267288187364">Pogledajte promjene</translation> +<translation id="512761462447738469">Aplikacije i web lokacije s odobrenjima za kameru i usluge sistema mogu koristiti kameru</translation> <translation id="5127620150973591153">ID sigurne veze: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Sinhronizacija je isključena</translation> <translation id="5127881134400491887">Upravljanje mrežnim vezama</translation> @@ -6076,6 +6094,7 @@ <translation id="5691581861107245578">Primajte prijedloge emoji sličica na osnovu sadržaja koji pišete</translation> <translation id="5691772641933328258">Otisak prsta nije prepoznat</translation> <translation id="5692183275898619210">Štampanje je završeno</translation> +<translation id="5693237475389615913">Upravljajte odobrenjima za mikrofon za web lokacije u Chromeu</translation> <translation id="5693255400847650006">Mikrofon je u upotrebi</translation> <translation id="5695184138696833495">ADB Android aplikacija na Linuxu</translation> <translation id="5696143504434933566">Prijavi zloupotrebu s ekstenzije "<ph name="EXTENSION_NAME" />"</translation> @@ -6097,6 +6116,7 @@ <translation id="5708171344853220004">Glavni Microsoft naziv</translation> <translation id="5709557627224531708">Postavite Chrome kao zadani preglednik</translation> <translation id="5711010025974903573">Zapisnici usluge</translation> +<translation id="5711324642850167289">Nijednoj aplikaciji nije dozvoljeno da koristi mikrofon</translation> <translation id="5711983031544731014">Nije moguće otključati. Unesite lozinku.</translation> <translation id="5712153969432126546">Web lokacije ponekad objavljuju PDF-ove, kao što su dokumenti, ugovori i obrasci</translation> <translation id="571222594670061844">Web lokacije vam mogu prikazati upite za prijavu koji potiču od usluga identiteta</translation> @@ -6288,6 +6308,7 @@ <translation id="5862319196656206789">Postavite povezane uređaje</translation> <translation id="5862731021271217234">Da dobijete svoje kartice s drugih uređaja, uključite sinhronizaciju</translation> <translation id="5863195274347579748">Vanjski dodaci će možda moći pristupati ličnim podacima ili ih dijeliti.</translation> +<translation id="5863263400083022538">Usluge sistema</translation> <translation id="5863445608433396414">Omogući funkcije za otklanjanje grešaka</translation> <translation id="5863515189965725638">Uredite IBAN</translation> <translation id="5864195618110239517">Koristi vezu s naplatom</translation> @@ -6727,6 +6748,7 @@ <translation id="6207937957461833379">Zemlja / Regija</translation> <translation id="6208521041562685716">Aktiviranje prijenosa podataka na mobilnoj mreži</translation> <translation id="6208725777148613371">Pohranjivanje na <ph name="WEB_DRIVE" /> nije uspjelo – <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">Aplikacije i web lokacije s odobrenjima za mikrofon i usluge sistema mogu koristiti mikrofon</translation> <translation id="6209838773933913227">Ažuriranje komponenti</translation> <translation id="6209908325007204267">Vaš uređaj uključuje nadogradnju na poslovnu verziju Chromea, ali vaše korisničko ime nije povezano s računom preduzeća. Kreirajte račun preduzeća putem web lokacije g.co/ChromeEnterpriseAccount na sekundarnom uređaju.</translation> <translation id="6210282067670792090">Na traci za adresu koristite ovu prečicu na tastaturi s prečicama za pretraživače i pretraživanje web lokacija</translation> @@ -7061,6 +7083,7 @@ <translation id="6478248366783946499">Zadržati opasan fajl?</translation> <translation id="6479881432656947268">Posjetite Chrome Web trgovinu</translation> <translation id="6480327114083866287">Računom upravlja <ph name="MANAGER" /></translation> +<translation id="6481749622989211463">Dijelite fajlove i drugo s uređajima u blizini. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Povećalo za cijeli ekran</translation> <translation id="6483485061007832714">Otvorite preuzimanje</translation> <translation id="6483805311199035658">Otvara se <ph name="FILE" />...</translation> @@ -7313,6 +7336,7 @@ <translation id="6680650203439190394">Brzina</translation> <translation id="6683022854667115063">Slušalice</translation> <translation id="6683087162435654533">V&rati sve kartice</translation> +<translation id="6683433919380522900">Odobrenje je <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Preuzimanje najnovijeg ažuriranja</translation> <translation id="668599234725812620">Otvori Google Play</translation> <translation id="6686490380836145850">Zatvori kartice s desne strane</translation> @@ -8127,6 +8151,7 @@ <translation id="7330533963640151632">Postavke funkcije <ph name="FEATURE_NAME" /> za uređaj koji koristi <ph name="USER_NAME" />, koji dijeli putem računa <ph name="USER_EMAIL" />.</translation> <translation id="7331646370422660166">Alt i strelica nadolje</translation> <translation id="7332053360324989309">Namjenski radnik: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Nije moguće otpremiti fajlove na vezi s naplatom.</translation> <translation id="7333669215417470379">Napravite sigurnosnu kopiju i vratite aplikacije i postavke</translation> <translation id="7335436113423103413">Omogućava sposobnost korištenja funkcionalnosti Prilagodite Chrome s unificirane bočne ploče na stranici Nova kartica.</translation> <translation id="7335974957018254119">Koristite provjeru pravopisa za</translation> @@ -8283,6 +8308,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Pregledajte 1 ekstenziju koja je uklonjena iz Chrome Web trgovine}one{Pregledajte {NUM_EXTENSIONS} ekstenziju koja je uklonjena iz Chrome Web trgovine}few{Pregledajte {NUM_EXTENSIONS} ekstenzije koje su uklonjene iz Chrome Web trgovine}other{Pregledajte {NUM_EXTENSIONS} ekstenzija koje su uklonjene iz Chrome Web trgovine}}</translation> <translation id="7436921188514130341">O, ne! Došlo je do greške prilikom promjene naziva.</translation> <translation id="7439519621174723623">Dodajte naziv uređaja da nastavite</translation> +<translation id="7441736532026945583">Odaberite "Sakrij grupu" da uklonite grupu iz trake kartice</translation> <translation id="7441736921018636843">Za promjenu ove postavke <ph name="BEGIN_LINK" />poništite sinhronizaciju<ph name="END_LINK" /> da uklonite pristupni izraz sinhronizacije</translation> <translation id="7441830548568730290">Drugi korisnici</translation> <translation id="744341768939279100">Izradi novi profil</translation> @@ -8883,6 +8909,7 @@ <translation id="7887864092952184874">Bluetooth miš je uparen</translation> <translation id="7889371445710865055">Promijenite jezik diktiranja</translation> <translation id="7890147169288018054">Prikaz informacija o mreži, kao što su vaša IP ili MAC adresa</translation> +<translation id="7892005672811746207">Uključite "Pohranjivanje grupe"</translation> <translation id="7892384782944609022">Uparivanje nije uspjelo. Odaberite uređaj da pokušate ponovo.</translation> <translation id="7893008570150657497">Pristupa fotografijama, muzici i drugim medijskim fajlovima s vašeg računara</translation> <translation id="7893153962594818789">Bluetooth je isključen na uređaju <ph name="DEVICE_TYPE" />. Unesite lozinku i zatim uključite Bluetooth.</translation> @@ -9126,6 +9153,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">Grupa <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Dijaloški okvir veze</translation> +<translation id="8070572887926783747">Odobrenje za lokaciju za aplikaciju <ph name="APP_NAME" /></translation> <translation id="8070662218171013510">Haptičke povratne informacije</translation> <translation id="8071432093239591881">Odštampaj kao sliku</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Podaci aplikacija mogu biti bilo koji podaci koje je aplikacija sačuvala (na osnovu postavki programera), uključujući podatke kao što su kontakti, poruke i fotografije.<ph name="END_PARAGRAPH1" /> @@ -9184,6 +9212,7 @@ <translation id="8109991406044913868">AI-kreirana tema</translation> <translation id="8110393529211831722">Pretplata je instalirana samo na ovom uređaju, a ne sinhronizira se s drugim uređajima pod vašim računom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Preuzimanje liste kontakata...</translation> +<translation id="8114925369073821854">Odobrenje za mikrofon za aplikaciju <ph name="APP_NAME" /></translation> <translation id="8115139559594092084">S Google Diska</translation> <translation id="8116972784401310538">&Upravitelj oznaka</translation> <translation id="8118276691321086429">Usluga <ph name="PASSWORD_MANAGER_BRAND" /> pamti kako ste se prijavili i automatski vas prijavljuje kada je moguće. Kada je isključena, svaki put će se tražiti potvrda.</translation> @@ -9399,6 +9428,7 @@ <translation id="8275038454117074363">Uvezi</translation> <translation id="8275080796245127762">Poziv s vašeg uređaja</translation> <translation id="8275339871947079271">Premjestite lozinku na Google račun da joj možete pristupiti na siguran način kad god ste prijavljeni</translation> +<translation id="8276242035951017580">Nijednoj aplikaciji nije dozvoljeno da koristi kameru</translation> <translation id="8276560076771292512">Isprazni keš memoriju i ponovo učitaj bez keš memorije</translation> <translation id="8276850948802942358">Više informacija o davanju web lokaciji privremenog odobrenja za korištenje kolačića treće strane</translation> <translation id="828180235270931531">Drugi dostupni štampači</translation> @@ -9417,6 +9447,7 @@ <translation id="8291942417224950075">Za ličnu upotrebu</translation> <translation id="8293206222192510085">Dodavanje oznake</translation> <translation id="8294431847097064396">Izvor</translation> +<translation id="8294476140219241086">Organizator kartica</translation> <translation id="8294895455164415895">Otvaranje postavki radi dozvoljavanja Chromeu da predlaže grupe kartica</translation> <translation id="8295449579927246485">Prijevod uživo</translation> <translation id="8295450130892483256">Instalirajte Microsoft 365</translation> @@ -9529,6 +9560,7 @@ <translation id="8380266723152870797">Naziv prozora</translation> <translation id="8380941800586852976">Opasno</translation> <translation id="8381630473947706877">Uključite funkciju <ph name="FEATURE_NAME" /></translation> +<translation id="8382197851871630452">Lokalno vrijeme</translation> <translation id="8382677870544805359">Morat ćete vratiti uređaj na fabričke postavke da koristite funkcije za preduzeća.</translation> <translation id="8382715499079447151">Zaštita od pregleda</translation> <translation id="8382913212082956454">Kopiraj adresu &e-pošte</translation> @@ -9719,6 +9751,7 @@ <translation id="8528962588711550376">Prijavljivanje.</translation> <translation id="8529578450330869579">Koristite sigurni Sistem naziva domena (DNS) da osobama koje imaju pristup vašem internetskom saobraćaju onemogućite da vide web lokacije koje posjećujete. Ovo koristi upravljanog pružaoca usluga na <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /></translation> <translation id="8529925957403338845">Trenutno dijeljenje internetske veze nije uspjelo</translation> +<translation id="8531367864749403520">Odaberite "Sakrij grupu" da uklonite grupu iz trake kartice</translation> <translation id="8531701051932785007">Poboljšano Sigurno pregledanje je isključeno</translation> <translation id="8533670235862049797">Sigurno pregledanje je uključeno</translation> <translation id="8534656636775144800">Ups! Došlo je do problema prilikom pokušaja pridruživanja domeni. Pokušajte ponovo.</translation> @@ -9845,6 +9878,7 @@ <translation id="8639635302972078117">Šaljite podatke o korištenju i dijagnostici. Ovaj uređaj trenutno automatski šalje Googleu podatke o dijagnostici, uređaju i korištenju aplikacija. Ovo se neće koristiti za identifikaciju vašeg djeteta i pomoći će stabilnosti sistema i aplikacije, kao i drugim unapređenjima. Neki zbirni podaci će također pomoći Googleovim aplikacijama i partnerima, kao što su Androidovi programeri. Ako je za vaše dijete uključena postavka za dodatnu Aktivnost na webu i u aplikacijama, ovi podaci mogu biti sačuvani na Google računu djeteta.</translation> <translation id="8640575194957831802">Posljednji put otvoreno</translation> <translation id="8641946446576357115">Koristite lozinke na svim iOS uređajima</translation> +<translation id="8642577642520207435">Odobrenje za kameru za aplikaciju <ph name="APP_NAME" /></translation> <translation id="8642900771896232685">2 sekunde</translation> <translation id="8642947597466641025">Uvećavanje teksta</translation> <translation id="8643403533759285912">Izbriši grupu</translation> @@ -9879,6 +9913,7 @@ <translation id="8662978096466608964">Chrome ne može postaviti pozadinsku sliku.</translation> <translation id="8663051876219324457">Dozvolite aplikacijama, web lokacijama i uslugama sistema da koriste vašu lokaciju. Lokacija može koristiti izvore kao što su WiFi, mobilne mreže i senzori da lakše procijeni lokaciju uređaja. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="8663099077749055505">Uvijek blokiraj više automatskih preuzimanja na host računaru <ph name="HOST" /></translation> +<translation id="8664249499245357248">Desnim klikom kliknite na naziv grupe</translation> <translation id="8664389313780386848">&Prikaz izvora stranice</translation> <translation id="8665110742939124773">Unijeli se neispravan pristupni kôd. Pokušajte ponovo.</translation> <translation id="8665180165765946056">Izrada sigurnosne kopije je završena</translation> @@ -10205,6 +10240,7 @@ <translation id="8900413463156971200">Omogući mobilnu mrežu</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{Domena <ph name="MANAGER" /> zahtijeva da napravite sigurnosnu kopiju podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> danas.}one{Domena <ph name="MANAGER" /> zahtijeva da napravite sigurnosnu kopiju podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> prije isteka roka.}few{Domena <ph name="MANAGER" /> zahtijeva da napravite sigurnosnu kopiju podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> prije isteka roka.}other{Domena <ph name="MANAGER" /> zahtijeva da napravite sigurnosnu kopiju podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> prije isteka roka.}}</translation> <translation id="8902667442496790482">Otvorite postavke funkcije Odaberite za govor</translation> +<translation id="8903733144777177139">Pristup mikrofonu je blokiran</translation> <translation id="890616557918890486">Promijeni izvor</translation> <translation id="8907701755790961703">Odaberite zemlju</translation> <translation id="8908420399006197927">Izuzmite karticu iz predložene grupe</translation> @@ -10242,6 +10278,7 @@ <translation id="8934732568177537184">Nastavi</translation> <translation id="8938800817013097409">USB-C uređaj (desni priključak na stražnjoj strani)</translation> <translation id="8940081510938872932">Vaš računar trenutno obavlja previše poslova. Pokušajte ponovo kasnije.</translation> +<translation id="8940228279218723234">Dozvolite pristup za aplikacije i web lokacije s odobrenjem za kameru i usluge sistema. Da aplikacija ili stranica koristi kameru, možda ćete trebati ponovo pokrenuti aplikaciju odnosno osvježiti stranicu.</translation> <translation id="8940381019874223173">Iz vaših Google Fotografija</translation> <translation id="8940888110818450052">Opcije prijave</translation> <translation id="8941173171815156065">Opozovi odobrenje "<ph name="PERMISSION" />"</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 0d8baad6..2a537a5 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Connectat al telèfon Android</translation> <translation id="1523279371236772909">S'ha vist el darrer mes</translation> <translation id="1523978563989812243">Motors de text a parla</translation> -<translation id="1524430321211440688">Teclat</translation> <translation id="1524563461097350801">No, gràcies</translation> <translation id="1525740877599838384">Utilitza només una xarxa Wi-Fi per determinar la ubicació</translation> <translation id="152629053603783244">Reinicia Linux</translation> @@ -3907,7 +3906,6 @@ <translation id="3966072572894326936">Tria una altra carpeta...</translation> <translation id="3966094581547899417">Detalls del punt d'accés Wi-Fi</translation> <translation id="3967822245660637423">S'ha completat la baixada</translation> -<translation id="3967841595862839006">Tria l'idioma i el teclat</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Identificador</translation> <translation id="397105322502079400">S’està calculant...</translation> @@ -4588,7 +4586,6 @@ <translation id="4513872120116766993">Escriptura predictiva</translation> <translation id="4513946894732546136">Comentaris</translation> <translation id="4515872537870654449">Contacta amb Dell per obtenir assistència tècnica. La base s'apagarà si el ventilador no funciona.</translation> -<translation id="4516008165284813420">Assegura't que el teu dispositiu (<ph name="DEVICE_TYPE" />) estigui connectat a Internet i torna-ho a provar. També pots visitar play.google.com/about/play-terms en un altre dispositiu.</translation> <translation id="4518840066030486079">Estil del mode de la tecla Maj</translation> <translation id="4519331665958994620">Els llocs web poden demanar permís per utilitzar la càmera</translation> <translation id="4519605771716872386">La sincronització de fitxers s'ha activat</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 53cbe0d..ab2b95f 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Připojeno k telefonu Android</translation> <translation id="1523279371236772909">Zobrazeno minulý měsíc</translation> <translation id="1523978563989812243">Moduly převodu textu na řeč</translation> -<translation id="1524430321211440688">Klávesnice</translation> <translation id="1524563461097350801">Ne, díky</translation> <translation id="1525740877599838384">K určování polohy používat pouze Wi-Fi</translation> <translation id="152629053603783244">Restartovat Linux</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Vybrat jinou složku...</translation> <translation id="3966094581547899417">Podrobnosti hotspotu</translation> <translation id="3967822245660637423">Stahování bylo dokončeno</translation> -<translation id="3967841595862839006">Vyberte jazyk a klávesnici</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Probíhá výpočet…</translation> @@ -4607,7 +4605,6 @@ <translation id="4513872120116766993">Předvídání psaní</translation> <translation id="4513946894732546136">Zpětná vazba</translation> <translation id="4515872537870654449">Požádejte společnost Dell o servis. Pokud nefunguje větrák, dok se vypne.</translation> -<translation id="4516008165284813420">Zkontrolujte, zda je zařízení <ph name="DEVICE_TYPE" /> připojené k internetu, a zkuste to znovu. Můžete také navštívit stránku play.google.com/about/play-terms na jiném zařízení.</translation> <translation id="4518840066030486079">Styl režimu klávesy Shift</translation> <translation id="4519331665958994620">Weby mohou žádat o použití fotoaparátu</translation> <translation id="4519605771716872386">Synchronizace souborů je zapnutá</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 6a9904b9..ad28637 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -685,7 +685,6 @@ <translation id="1521933835545997395">Wedi'i chysylltu â ffôn Android</translation> <translation id="1523279371236772909">Gwelwyd yn ystod y mis diwethaf</translation> <translation id="1523978563989812243">Peiriannau testun i leferydd</translation> -<translation id="1524430321211440688">Bysellfwrdd</translation> <translation id="1524563461097350801">Dim diolch</translation> <translation id="1525740877599838384">Defnyddio Wi-Fi yn unig i bennu lleoliad</translation> <translation id="152629053603783244">Ailgychwyn Linux</translation> @@ -3926,7 +3925,6 @@ <translation id="3966072572894326936">Dewis ffolder arall...</translation> <translation id="3966094581547899417">Manylion poethfan</translation> <translation id="3967822245660637423">Lawrlwytho wedi'i gwblhau</translation> -<translation id="3967841595862839006">Dewiswch eich iaith a'ch bysellfwrdd</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Dull adnabod</translation> <translation id="397105322502079400">Wrthi'n cyfrifo…</translation> @@ -4608,7 +4606,6 @@ <translation id="4513872120116766993">Ysgrifennu rhagfynegol</translation> <translation id="4513946894732546136">Adborth</translation> <translation id="4515872537870654449">Cysylltwch â Dell i gael gwasanaeth. Bydd y doc yn cau os nad yw'r ffan yn gweithio.</translation> -<translation id="4516008165284813420">Gwnewch yn siŵr bod eich <ph name="DEVICE_TYPE" /> wedi'i chysylltu â'r rhyngrwyd a rhowch gynnig arall arni. Gallwch hefyd ymweld â play.google.com/about/play-terms ar ddyfais arall.</translation> <translation id="4518840066030486079">Arddull Modd Bysell Shift</translation> <translation id="4519331665958994620">Gall gwefannau ofyn am ddefnyddio'ch camera</translation> <translation id="4519605771716872386">Cysoni ffeil wedi'i droi ymlaen</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index e3f265e..a6237978 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Forbundet til Android-telefon</translation> <translation id="1523279371236772909">Set inden for den seneste måned</translation> <translation id="1523978563989812243">Maskiner til oplæsning</translation> -<translation id="1524430321211440688">Tastatur</translation> <translation id="1524563461097350801">Nej tak</translation> <translation id="1525740877599838384">Brug kun Wi-Fi til at fastslå placeringen</translation> <translation id="152629053603783244">Genstart Linux</translation> @@ -3924,7 +3923,6 @@ <translation id="3966072572894326936">Vælg en anden mappe...</translation> <translation id="3966094581547899417">Oplysninger om hotspot</translation> <translation id="3967822245660637423">Download fuldført</translation> -<translation id="3967841595862839006">Vælg dit sprog og tastatur</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Id</translation> <translation id="397105322502079400">Beregner...</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">Skriveforslag</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Kontakt Dell for at få service. Dockingstationen slukker, hvis blæseren ikke fungerer.</translation> -<translation id="4516008165284813420">Sørg for, at din <ph name="DEVICE_TYPE" /> har forbindelse til internettet, og prøv igen. Du kan også gå til play.google.com/about/play-terms på en anden enhed.</translation> <translation id="4518840066030486079">Stilart for tilstand for Shift-tast</translation> <translation id="4519331665958994620">Websites kan anmode om tilladelse til at bruge dit kamera</translation> <translation id="4519605771716872386">Filsynkronisering er aktiveret</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 28e22ef..24d376e 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -676,7 +676,6 @@ <translation id="1521933835545997395">Mit Android-Smartphone verbunden</translation> <translation id="1523279371236772909">Im letzten Monat angesehen</translation> <translation id="1523978563989812243">Sprachausgabe-Engines</translation> -<translation id="1524430321211440688">Tastatur</translation> <translation id="1524563461097350801">Nein, danke</translation> <translation id="1525740877599838384">Zur Standortbestimmung nur WLAN nutzen</translation> <translation id="152629053603783244">Linux neu starten</translation> @@ -2200,7 +2199,7 @@ <translation id="2643698698624765890">Klicke zum Verwalten deiner Erweiterungen im Menü „Fenster“ auf „Erweiterungen“.</translation> <translation id="2645047101481282803">Das Gerät wird von <ph name="PROFILE_NAME" /> verwaltet</translation> <translation id="2645388244376970260">Dieser Tab wird auf „<ph name="DEVICE_NAME" />“ gestreamt</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Protanomalie</translation> <translation id="2649045351178520408">Base64-codierter ASCII-Code, Zertifikatkette</translation> <translation id="265156376773362237">Standard-Vorabladen</translation> @@ -3905,7 +3904,6 @@ <translation id="3966072572894326936">Anderen Ordner wählen...</translation> <translation id="3966094581547899417">Hotspot-Details</translation> <translation id="3967822245660637423">Download abgeschlossen</translation> -<translation id="3967841595862839006">Sprache und Tastatur wählen</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Wird berechnet...</translation> @@ -4586,7 +4584,6 @@ <translation id="4513872120116766993">Wortvorschläge</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Wende dich für eine Reparatur an Dell. Wenn der Lüfter nicht funktioniert, wird das Dock ausgeschaltet.</translation> -<translation id="4516008165284813420">Vergewissere dich, dass das Gerät <ph name="DEVICE_TYPE" /> mit dem Internet verbunden ist, und versuche es noch einmal. Du kannst play.google.com/about/play-terms auch auf einem anderen Gerät aufrufen.</translation> <translation id="4518840066030486079">Modusstil der Umschalttaste</translation> <translation id="4519331665958994620">Websites dürfen nachfragen, wenn sie meine Kamera verwenden möchten</translation> <translation id="4519605771716872386">Dateisynchronisierung aktiviert</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 65e61e06..180ad24 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Συνδέθηκε σε τηλέφωνο Android</translation> <translation id="1523279371236772909">Προβλήθηκε τον προηγούμενο μήνα</translation> <translation id="1523978563989812243">Μηχανές μετατροπής κειμένου σε ομιλία</translation> -<translation id="1524430321211440688">Πληκτρολόγιο</translation> <translation id="1524563461097350801">Όχι, ευχαριστώ</translation> <translation id="1525740877599838384">Χρήση μόνο Wi-Fi για καθορισμό τοποθεσίας</translation> <translation id="152629053603783244">Επανεκκίνηση του Linux</translation> @@ -2218,7 +2217,7 @@ <translation id="2643698698624765890">Διαχειριστείτε τις επεκτάσεις σας, κάνοντας κλικ στην επιλογή "Επεκτάσεις" στο μενού "Παράθυρο".</translation> <translation id="2645047101481282803">Η διαχείριση της συσκευής σας γίνεται από τον διαχειριστή <ph name="PROFILE_NAME" />.</translation> <translation id="2645388244376970260">Μετάδοση αυτής της καρτέλας στη συσκευή <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Πρωτανοπία</translation> <translation id="2649045351178520408">ASCII με κωδικοποίηση Base64, αλυσίδα πιστοποιητικού</translation> <translation id="265156376773362237">Βασική προφόρτωση</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Επιλέξτε άλλο φάκελο...</translation> <translation id="3966094581547899417">Λεπτομέρειες σημείου πρόσβασης Wi-Fi</translation> <translation id="3967822245660637423">Ολοκλήρωση λήψης</translation> -<translation id="3967841595862839006">Επιλέξτε γλώσσα και πληκτρολόγιο</translation> <translation id="3968739731834770921">Κάνα</translation> <translation id="3970114302595058915">Αναγνωριστικό</translation> <translation id="397105322502079400">Υπολογισμός…</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Πρόβλεψη γραφής</translation> <translation id="4513946894732546136">Σχόλια</translation> <translation id="4515872537870654449">Επικοινωνήστε με την Dell για επισκευή. Η βάση σύνδεσης θα απενεργοποιηθεί εάν ο ανεμιστήρας δεν λειτουργεί.</translation> -<translation id="4516008165284813420">Βεβαιωθείτε ότι η συσκευή <ph name="DEVICE_TYPE" /> είναι συνδεδεμένη στο διαδίκτυο και δοκιμάστε ξανά. Μπορείτε επίσης να επισκεφτείτε τη διεύθυνση play.google.com/about/play-terms σε άλλη συσκευή.</translation> <translation id="4518840066030486079">Στιλ λειτουργίας πλήκτρου Shift</translation> <translation id="4519331665958994620">Οι ιστότοποι μπορούν να ζητούν να χρησιμοποιήσουν την κάμερά σας</translation> <translation id="4519605771716872386">Ο συγχρονισμός αρχείων είναι ενεργοποιημένος</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index eb6de7b..09c5ee2 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Connected to Android phone</translation> <translation id="1523279371236772909">Viewed in the past month</translation> <translation id="1523978563989812243">Text-to-speech engines</translation> -<translation id="1524430321211440688">Keyboard</translation> <translation id="1524563461097350801">No, thanks</translation> <translation id="1525740877599838384">Use only Wi-Fi to determine location</translation> <translation id="152629053603783244">Restart Linux</translation> @@ -2218,7 +2217,7 @@ <translation id="2643698698624765890">Manage your extensions by clicking Extensions in the Window menu.</translation> <translation id="2645047101481282803">Your device is managed by <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Casting this tab to <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Protanomaly</translation> <translation id="2649045351178520408">Base64-encoded ASCII, certificate chain</translation> <translation id="265156376773362237">Standard preloading</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Choose another folder...</translation> <translation id="3966094581547899417">Hotspot details</translation> <translation id="3967822245660637423">Download complete</translation> -<translation id="3967841595862839006">Choose your language & keyboard</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Calculating...</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Predictive writing</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Contact Dell for service. The dock will shut down if the fan isn't working.</translation> -<translation id="4516008165284813420">Make sure that your <ph name="DEVICE_TYPE" /> is connected to the Internet and try again. You can also visit play.google.com/about/play-terms on another device.</translation> <translation id="4518840066030486079">Shift key mode style</translation> <translation id="4519331665958994620">Sites can ask to use your camera</translation> <translation id="4519605771716872386">File sync turned on</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index e99f997..ef7cf44b 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -676,7 +676,6 @@ <translation id="1521933835545997395">Conectado a un teléfono Android</translation> <translation id="1523279371236772909">Visto durante el mes pasado</translation> <translation id="1523978563989812243">Motores para texto a voz</translation> -<translation id="1524430321211440688">Teclado</translation> <translation id="1524563461097350801">No, gracias</translation> <translation id="1525740877599838384">Usar solo Wi-Fi para determinar la ubicación</translation> <translation id="152629053603783244">Reiniciar Linux</translation> @@ -3905,7 +3904,6 @@ <translation id="3966072572894326936">Seleccionar otra carpeta...</translation> <translation id="3966094581547899417">Detalles del hotspot</translation> <translation id="3967822245660637423">Descarga completa</translation> -<translation id="3967841595862839006">Seleccionar tu idioma y teclado</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Calculando...</translation> @@ -4586,7 +4584,6 @@ <translation id="4513872120116766993">Escritura predictiva</translation> <translation id="4513946894732546136">Comentario</translation> <translation id="4515872537870654449">Comunícate con Dell para obtener asistencia. El conector se apagará si el ventilador no funciona.</translation> -<translation id="4516008165284813420">Comprueba que tu <ph name="DEVICE_TYPE" /> esté conectada a Internet y vuelve a intentarlo También puedes visitar play.google.com/about/play-terms en otro dispositivo.</translation> <translation id="4518840066030486079">Cambiar el estilo del modo de la tecla</translation> <translation id="4519331665958994620">Permitir que los sitios soliciten permiso para usar la cámara</translation> <translation id="4519605771716872386">Se activó la sincronización de archivos</translation> @@ -7038,7 +7035,7 @@ <translation id="6474498546677193336">No se puede dejar de compartir esta carpeta porque una app la está usando. Dejará de compartirse la próxima vez que se cierre Linux.</translation> <translation id="6474884162850599008">Desconectar la cuenta de Google Drive</translation> <translation id="6475294023568239942">Libera espacio en el disco o cambia el tamaño del disco de Linux en Configuración.</translation> -<translation id="6476482583633999078">Velocidad de voz</translation> +<translation id="6476482583633999078">Velocidad de habla</translation> <translation id="6477822444490674459">No se admite la sincronización de notificaciones para teléfonos que tengan un perfil de trabajo. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="6478248366783946499">¿Deseas conservar el archivo peligroso?</translation> <translation id="6479881432656947268">Visitar Chrome Web Store.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index a7427a8..686f991 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -487,7 +487,7 @@ <translation id="137651782282853227">Las direcciones guardadas aparecerán aquí</translation> <translation id="1376771218494401509">Asignar nombre a &ventana...</translation> <translation id="1377600615067678409">Saltarpor ahora</translation> -<translation id="1378613616312864539"><ph name="NAME" /> controla esta configuración</translation> +<translation id="1378613616312864539"><ph name="NAME" /> controla esta opción</translation> <translation id="1378848228640136848">{NUM_COMPROMISED,plural, =0{No hay contraseñas vulneradas}=1{1 contraseña vulnerada}other{{NUM_COMPROMISED} contraseñas vulneradas}}</translation> <translation id="1380028686461971526">Conectarse automáticamente a la red</translation> <translation id="1381567580865186407">Lo que se diga en <ph name="LANGUAGE" /> se enviará a Google para procesarse</translation> @@ -679,7 +679,6 @@ <translation id="1521933835545997395">Conectado a teléfono Android</translation> <translation id="1523279371236772909">Visto el mes pasado</translation> <translation id="1523978563989812243">Motores de conversión de texto a voz</translation> -<translation id="1524430321211440688">Teclado</translation> <translation id="1524563461097350801">No, gracias</translation> <translation id="1525740877599838384">Usar solo redes Wi‑Fi para determinar la ubicación</translation> <translation id="152629053603783244">Reiniciar Linux</translation> @@ -3908,7 +3907,6 @@ <translation id="3966072572894326936">Seleccionar otra carpeta...</translation> <translation id="3966094581547899417">Detalles del punto de acceso</translation> <translation id="3967822245660637423">Descarga completa</translation> -<translation id="3967841595862839006">Seleccionar idioma y teclado</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Calculando...</translation> @@ -4589,7 +4587,6 @@ <translation id="4513872120116766993">Escritura predictiva</translation> <translation id="4513946894732546136">Comentarios</translation> <translation id="4515872537870654449">Ponte en contacto con Dell para obtener ayuda. La base se apagará si el ventilador no funciona.</translation> -<translation id="4516008165284813420">Comprueba que tu <ph name="DEVICE_TYPE" /> esté conectado a Internet y vuelve a intentarlo. También puedes acceder a play.google.com/about/play-terms en otro dispositivo.</translation> <translation id="4518840066030486079">Estilo del modo de la tecla Mayús</translation> <translation id="4519331665958994620">Los sitios pueden solicitar permiso para usar la cámara</translation> <translation id="4519605771716872386">Sincronización de archivos activada</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 00e64b9..359c1bd1 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Ühendatud Android-telefoniga</translation> <translation id="1523279371236772909">Vaadati sel kuul</translation> <translation id="1523978563989812243">Kõnesünteesi mootorid</translation> -<translation id="1524430321211440688">Klaviatuur</translation> <translation id="1524563461097350801">Ei, tänan</translation> <translation id="1525740877599838384">Asukoha määramine ainult WiFi-ühenduse kaudu</translation> <translation id="152629053603783244">Taaskäivita Linux</translation> @@ -3914,7 +3913,6 @@ <translation id="3966072572894326936">Vali muu kaust...</translation> <translation id="3966094581547899417">Kuumkoha üksikasjad</translation> <translation id="3967822245660637423">Allalaadimine on lõpule viidud</translation> -<translation id="3967841595862839006">Valige oma keel ja klaviatuur</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Arvutamine ...</translation> @@ -4595,7 +4593,6 @@ <translation id="4513872120116766993">Ennustamisega sisestamine</translation> <translation id="4513946894732546136">Tagasiside</translation> <translation id="4515872537870654449">Hooldusteenuse saamiseks võtke ühendust Delliga. Kui ventilaator ei tööta, siis lülitub dokk välja.</translation> -<translation id="4516008165284813420">Veenduge, et teie <ph name="DEVICE_TYPE" /> oleks internetiga ühendatud, ja proovige uuesti. Võite aadressi play.google.com/about/play-terms ka teises seadmes külastada.</translation> <translation id="4518840066030486079">Tõstuklahvi režiimi stiil</translation> <translation id="4519331665958994620">Saidid saavad küsida luba teie kaamera kasutamiseks</translation> <translation id="4519605771716872386">Failide sünkroonimine lülitati sisse</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 215c6df8..6f11694 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Android-eko telefono batera konektatuta</translation> <translation id="1523279371236772909">Azken hilabetean ikusi duzu</translation> <translation id="1523978563989812243">Testua ahots bihurtzeko eginbidearen motorrak</translation> -<translation id="1524430321211440688">Teklatua</translation> <translation id="1524563461097350801">Ez, eskerrik asko</translation> <translation id="1525740877599838384">Erabili soilik wifi-sarea kokapena zehazteko</translation> <translation id="152629053603783244">Berrabiarazi Linux</translation> @@ -3908,7 +3907,6 @@ <translation id="3966072572894326936">Aukeratu beste karpeta bat…</translation> <translation id="3966094581547899417">Wifi-gunearen xehetasunak</translation> <translation id="3967822245660637423">Deskargatzen amaitu da</translation> -<translation id="3967841595862839006">Aukeratu hizkuntza eta teklatua</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">IDa</translation> <translation id="397105322502079400">Kalkulatzen…</translation> @@ -4589,7 +4587,6 @@ <translation id="4513872120116766993">Idazketa iragarlea</translation> <translation id="4513946894732546136">Iritzia</translation> <translation id="4515872537870654449">Jarri Dell-ekin harremanetan laguntza teknikoa lortzeko. Oinarria itzali egingo da haizagailuak funtzionatzen ez badu.</translation> -<translation id="4516008165284813420">Ziurtatu <ph name="DEVICE_TYPE" /> Internetera konektatuta dagoela eta saiatu berriro. Halaber, beste gailu batekin bisita dezakezu play.google.com/about/play-terms.</translation> <translation id="4518840066030486079">Aldatu tekla moduaren estiloa</translation> <translation id="4519331665958994620">Webguneek kamera erabiltzea eska dezakete</translation> <translation id="4519605771716872386">Fitxategiak sinkronizatzeko aukera aktibatuta dago</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 1434f27..acf4046 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -680,7 +680,6 @@ <translation id="1521933835545997395">به تلفن Android متصل است</translation> <translation id="1523279371236772909">در ماه گذشته مشاهده شده</translation> <translation id="1523978563989812243">موتورهای نوشتار به گفتار</translation> -<translation id="1524430321211440688">صفحهکلید</translation> <translation id="1524563461097350801">نه، متشکرم</translation> <translation id="1525740877599838384">فقط از Wi-Fi برای تعیین مکان استفاده شود</translation> <translation id="152629053603783244">بازراهاندازی Linux</translation> @@ -755,7 +754,7 @@ <translation id="1574335334663388774">درحالحاضر نسخه <ph name="APP_VERSION" /> برنامه <ph name="APP_NAME" /> در این دستگاه نصب شده است</translation> <translation id="1575036763505533001">پانل کناری سفارشیسازی Chrome</translation> <translation id="1575741822946219011">زبانها و ورودیها</translation> -<translation id="1576594961618857597">چهرهنمای پیشفرض سفید</translation> +<translation id="1576594961618857597">چهرک پیشفرض سفید</translation> <translation id="1576729678809834061">گزارش این نتیجه جستجو</translation> <translation id="1578558981922970608">بستن اجباری</translation> <translation id="157931050206866263">درباره اسکن بدافزار بیشتر بدانید</translation> @@ -1232,7 +1231,7 @@ <translation id="1915307458270490472">قطع تماس</translation> <translation id="1915734383465415025">شماره فروشگاه</translation> <translation id="1916260783734263714">برگه کنونی</translation> -<translation id="1916502483199172559">چهرهنمای پیشفرض قرمز</translation> +<translation id="1916502483199172559">چهرک پیشفرض قرمز</translation> <translation id="1918141783557917887">&کوچک تر</translation> <translation id="1919872106782726755">برای راهاندازی اثر انگشت، از فرزندتان بخواهید حسگر اثر انگشت را در بالا گوشه راست صفحهکلید، کنار دکمه روشن/خاموش لمس کند. دادههای اثر انگشت فرزندتان بهصورت ایمن ذخیره میشود و هرگز از این <ph name="DEVICE_TYPE" /> خارج نمیشود.</translation> <translation id="192015196730532810">میتوانید گروه برگه خودتان را ایجاد کنید.</translation> @@ -2126,7 +2125,7 @@ <translation id="257088987046510401">طرحهای قسمت</translation> <translation id="2571655996835834626">تنظیماتی را تغییر دهید که دسترسی وبسایتها را به ویژگیهایی مثل کوکیها، جاوا اسکریپت، افزایه، موقعیت جغرافیایی، میکروفون، دوربین و غیره کنترل میکنند.</translation> <translation id="2572032849266859634">مجوز دسترسی فقط خواندنی به <ph name="VOLUME_NAME" /> صادر شد.</translation> -<translation id="2573276323521243649">برگشتن از صفحه انتخاب چهرهنما</translation> +<translation id="2573276323521243649">برگشتن از صفحه انتخاب چهرک</translation> <translation id="2573417407488272418">پیشاز ارتقا، برنامهها و فایلها را در «Files > فایلهای من» پشتیبانگیری کنید.</translation> <translation id="2573831315551295105">اختصاص دادن کلید به کنش «<ph name="ACTION" />»</translation> <translation id="2575247648642144396">وقتی برنامه افزودنی بتواند در صفحه کنونی کار کند این نماد قابل مشاهده خواهد بود. با کلیک کردن روی نماد یا با فشار دادن <ph name="EXTENSION_SHORTCUT" /> از این برنامه افزودنی استفاده کنید.</translation> @@ -2854,7 +2853,7 @@ <translation id="3132996321662585180">بازآوری روزانه</translation> <translation id="3133184011320864289">همگامسازی را روشن کنید تا به Chrome اجازه دهید گروههای برگه پیشنهاد دهد و برگههای شما را مرتب نگه دارد</translation> <translation id="3134393957315651797">وضعیت آزمایش را برای آزمایش <ph name="EXPERIMENT_NAME" /> انتخاب کنید. شرح آزمایش: <ph name="EXPERIMENT_DESCRIPTION" /></translation> -<translation id="3139925690611372679">چهرهنمای پیشفرض زرد</translation> +<translation id="3139925690611372679">چهرک پیشفرض زرد</translation> <translation id="3141093262818886744">درهرصورت باز شود</translation> <translation id="3141318088920353606">درحال گوش کردن...</translation> <translation id="3142562627629111859">گروه جدید</translation> @@ -2946,7 +2945,7 @@ <translation id="3222066309010235055">پیش رندر: <ph name="PRERENDER_CONTENTS_NAME" /></translation> <translation id="3222779980972075989">اتصال به <ph name="USB_VM_NAME" /></translation> <translation id="3223531857777746191">دکمه بازنشانی</translation> -<translation id="3225084153129302039">چهرهنمای پیشفرض بنفش</translation> +<translation id="3225084153129302039">چهرک پیشفرض بنفش</translation> <translation id="3225319735946384299">امضای کد</translation> <translation id="3226487301970807183">پنهان/نمایان کردن پانل کناری ترازشده بهچپ</translation> <translation id="322708765617468434">هروقت بخواهید میتوانید فرد دیگری را بعداز راهاندازی به دستگاه اضافه کنید. هر فرد میتواند تجربهاش را شخصیسازی کند و دادهها را خصوصی نگه دارد.</translation> @@ -3159,7 +3158,7 @@ <translation id="3399432415385675819">اعلانها غیرفعال خواهند شد</translation> <translation id="3400390787768057815"><ph name="WIDTH" /> × <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> هرتز) - درهمبافته</translation> <translation id="3401484564516348917">خواندن اطلاعات مربوط به مرورگر، سیستمعامل، دستگاه، نرمافزار نصبشده، فایلها و مقادیر رجیستری</translation> -<translation id="3402255108239926910">انتخاب چهرهنما</translation> +<translation id="3402255108239926910">انتخاب چهرک</translation> <translation id="3402585168444815892">درحال ثبتنام کردن در «حالت نمایشی»</translation> <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />، <ph name="TIME_LEFT" /></translation> <translation id="3404065873681873169">هیچ گذرواژهای برای این سایت ذخیره نشده است</translation> @@ -3920,7 +3919,6 @@ <translation id="3966072572894326936">انتخاب یک پوشه دیگر…</translation> <translation id="3966094581547899417">جزئیات نقطه اتصال</translation> <translation id="3967822245660637423">بارگیری کامل شد</translation> -<translation id="3967841595862839006">انتخاب زبان و صفحهکلید</translation> <translation id="3968739731834770921">کانا</translation> <translation id="3970114302595058915">شناسه</translation> <translation id="397105322502079400">در حال محاسبه…</translation> @@ -4602,7 +4600,6 @@ <translation id="4513872120116766993">پیشنهادهای نگارشی</translation> <translation id="4513946894732546136">بازخورد</translation> <translation id="4515872537870654449">برای سرویس با Dell تماس بگیرید. اگر پنکه کار نکند، پایه اتصال خاموش میشود.</translation> -<translation id="4516008165284813420">مطمئن شوید <ph name="DEVICE_TYPE" /> به اینترنت متصل است و دوباره امتحان کنید. همچنین میتوانید در دستگاه دیگری از play.google.com/about/play-terms بازدید کنید.</translation> <translation id="4518840066030486079">سبک حالت کلید تبدیل</translation> <translation id="4519331665958994620">سایتها میتوانند درخواست کنند از دوربین شما استفاده کنند</translation> <translation id="4519605771716872386">همگامسازی فایل روشن شد</translation> @@ -4636,7 +4633,7 @@ <translation id="4541706525461326392">درحال برداشتن نمایه. ممکن است چند دقیقه طول بکشد.</translation> <translation id="4542520061254486227">خواندن دادههای شما در <ph name="WEBSITE_1" /> و <ph name="WEBSITE_2" /></translation> <translation id="4543778593405494224">مدیر گواهینامه</translation> -<translation id="4544174279960331769">چهرهنمای پیشفرض آبی</translation> +<translation id="4544174279960331769">چهرک پیشفرض آبی</translation> <translation id="4545028762441890696">برای دوباره فعال کردن آن، مجوزهای جدید را بپذیرید:</translation> <translation id="4545759655004063573">به دلیل مجوزهای ناکافی ذخیره امکانپذیر نیست. لطفاً در محل دیگری ذخیره کنید.</translation> <translation id="4546345569117159016">دکمه راست</translation> @@ -5158,7 +5155,7 @@ <translation id="495164417696120157">{COUNT,plural, =1{یک فایل}one{# فایل}other{# فایل}}</translation> <translation id="495170559598752135">کنشها</translation> <translation id="4951966678293618079">هرگز گذرواژهها برای این سایت ذخیره نشود</translation> -<translation id="4953808748584563296">چهرهنمای پیشفرض نارنجی</translation> +<translation id="4953808748584563296">چهرک پیشفرض نارنجی</translation> <translation id="4955707703665801001">رؤیتپذیری <ph name="FEATURE_NAME" /></translation> <translation id="4955710816792587366">پین خودتان را انتخاب کنید</translation> <translation id="4959262764292427323">گذرواژهها در حساب Google شما ذخیره میشود تا بتوانید در همه دستگاههایتان از آنها استفاده کنید</translation> @@ -5488,7 +5485,7 @@ <translation id="5225324770654022472">نمایش میانبر برنامهها</translation> <translation id="52254442782792731">تنظیم رؤیتپذیری کنونی هنوز تنظیم نشده است</translation> <translation id="5225463052809312700">روشن کردن دوربین</translation> -<translation id="5227679487546032910">چهرهنمای پیشفرض آبی سیر</translation> +<translation id="5227679487546032910">چهرک پیشفرض آبی سیر</translation> <translation id="5228245824943774148"><ph name="NUM_DEVICES_CONNECTED" /> دستگاه متصل است</translation> <translation id="5228579091201413441">فعال کردن همگامسازی</translation> <translation id="5230190638672215545">برای دریافت «ươ»، «uow» را تایپ کنید</translation> @@ -8443,7 +8440,7 @@ <translation id="7566118625369982896">مدیریت پیوندهای برنامه Play</translation> <translation id="7566723889363720618">F12</translation> <translation id="756809126120519699">دادههای Chrome پاک شد</translation> -<translation id="756876171895853918">سفارشی کردن چهرهنما</translation> +<translation id="756876171895853918">سفارشی کردن چهرک</translation> <translation id="7568790562536448087">در حال بهروزرسانی</translation> <translation id="7569983096843329377">سیاه</translation> <translation id="7571643774869182231">فضای ذخیرهسازی برای بهروزرسانی کافی نیست</translation> @@ -9116,7 +9113,7 @@ <translation id="8061970399284390013">بررسی املا و دستور زبان</translation> <translation id="8061991877177392872">بهنظر میرسد ازقبل Voice Match را با «دستیار» در دستگاه دیگری راهاندازی کردهاید. از این قطعههای قبلاً ضبطشده میتوان برای ایجاد مدل صوتی در این دستگاه استفاده کرد.</translation> <translation id="8062844841289846053">{COUNT,plural, =1{۱ برگ کاغذ}one{{COUNT} برگ کاغذ}other{{COUNT} برگ کاغذ}}</translation> -<translation id="8063235345342641131">چهرهنمای پیشفرض سبز</translation> +<translation id="8063235345342641131">چهرک پیشفرض سبز</translation> <translation id="8063535366119089408">مشاهده فایل</translation> <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">گروه <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> @@ -9175,7 +9172,7 @@ <translation id="8104088837833760645">بارگیری نمایه سیمکارت داخلی</translation> <translation id="8107015733319732394">«فروشگاه Google Play» در <ph name="DEVICE_TYPE" /> شما درحال نصب شدن است. ممکن است این کار چند دقیقه طول بکشد.</translation> <translation id="810728361871746125">وضوح نمایشگر</translation> -<translation id="8109109153262930486">چهرهنمای پیشفرض</translation> +<translation id="8109109153262930486">چهرک پیشفرض</translation> <translation id="8109991406044913868">زمینه ساختهشده با هوش مصنوعی</translation> <translation id="8110393529211831722">اشتراک فقط در این دستگاه نصب شده است و با دیگر دستگاههای حسابتان همگامسازی نشده است. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="8110489095782891123">درحال بارگیری فهرست مخاطبین…</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 285fa7f8..660f803 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Yhdistetty Android-puhelimeen</translation> <translation id="1523279371236772909">Nähty viimeisen kuukauden aikana</translation> <translation id="1523978563989812243">Tekstistä puheeksi ‑moottorit</translation> -<translation id="1524430321211440688">Näppäimistö</translation> <translation id="1524563461097350801">Ei kiitos</translation> <translation id="1525740877599838384">Käytä vain Wi-Fi-yhteyttä sijainnin määrittämiseen</translation> <translation id="152629053603783244">Käynnistä Linux uudelleen</translation> @@ -2217,7 +2216,7 @@ <translation id="2643698698624765890">Hallinnoi laajennuksiasi valitsemalla Ikkuna-valikosta Laajennukset.</translation> <translation id="2645047101481282803"><ph name="PROFILE_NAME" /> ylläpitää laitettasi</translation> <translation id="2645388244376970260">Välilehteä striimataan tänne: <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome-käyttöjärjestelmä</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Protanomalia</translation> <translation id="2649045351178520408">Base64-koodattu ASCII, varmenneketju</translation> <translation id="265156376773362237">Vakioesilataus</translation> @@ -3919,7 +3918,6 @@ <translation id="3966072572894326936">Valitse toinen kansio...</translation> <translation id="3966094581547899417">Hotspotin tiedot</translation> <translation id="3967822245660637423">Lataus on valmis</translation> -<translation id="3967841595862839006">Kielen ja näppäimistön valinta</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Tunnus</translation> <translation id="397105322502079400">Lasketaan...</translation> @@ -4601,7 +4599,6 @@ <translation id="4513872120116766993">Ennakoiva tekstinsyöttö</translation> <translation id="4513946894732546136">Palaute</translation> <translation id="4515872537870654449">Ota yhteyttä Delliin. Teline sammuu, jos tuuletin ei toimi.</translation> -<translation id="4516008165284813420">Varmista, että <ph name="DEVICE_TYPE" /> on yhteydessä internetiin, ja yritä uudelleen. Voit myös siirtyä toisella laitteella osoitteeseen play.google.com/about/play-terms.</translation> <translation id="4518840066030486079">Vaihtonäppäintilan tyyli</translation> <translation id="4519331665958994620">Sivustot saavat pyytää kameran käyttölupaa</translation> <translation id="4519605771716872386">Tiedostojen synkronointi on päällä</translation> @@ -8865,7 +8862,7 @@ <translation id="7880823633812189969">Paikallinen data poistetaan uudelleenkäynnistyksen yhteydessä</translation> <translation id="7881066108824108340">DNS</translation> <translation id="7881483672146086348">Näytä tili</translation> -<translation id="7883792253546618164">Voit peruuttaa tilauksen milloin tahansa.</translation> +<translation id="7883792253546618164">Voit perua tilauksen milloin tahansa.</translation> <translation id="7884372232153418877">{NUM_SITES,plural, =1{Tarkista 1 sivusto, jolta on lähetetty paljon ilmoituksia viime aikoina}other{Tarkista {NUM_SITES} sivustoa, joilta on lähetetty paljon ilmoituksia viime aikoina}}</translation> <translation id="788453346724465748">Ladataan tilitietoja…</translation> <translation id="7886279613512920452">{COUNT,plural, =1{kohde}other{# kohdetta}}</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index dcfd73d..2c57182 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Nakakonekta sa Android phone</translation> <translation id="1523279371236772909">Tiningnan sa nakalipas na buwan</translation> <translation id="1523978563989812243">Mga engine para sa text-to-speech</translation> -<translation id="1524430321211440688">Keyboard</translation> <translation id="1524563461097350801">Hindi, Salamat na lang</translation> <translation id="1525740877599838384">Wi-Fi lang ang gamitin upang matukoy ang lokasyon</translation> <translation id="152629053603783244">I-restart ang Linux</translation> @@ -3924,7 +3923,6 @@ <translation id="3966072572894326936">Pumili ng isa pang folder...</translation> <translation id="3966094581547899417">Mga detalye ng hotspot</translation> <translation id="3967822245660637423">Tapos na ang pag-download</translation> -<translation id="3967841595862839006">Piliin ang iyong wika at keyboard</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Kinakalkula...</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">Paghula sa pagsusulat</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Makipag-ugnayan sa Dell para sa serbisyo. Magsa-shut down ang dock kung hindi gumagana ang fan.</translation> -<translation id="4516008165284813420">Tiyaking nakakonekta ang iyong <ph name="DEVICE_TYPE" /> sa internet at subukan ulit. Puwede mo ring bisitahin ang play.google.com/about/play-terms sa ibang device.</translation> <translation id="4518840066030486079">Shift Key Mode Style</translation> <translation id="4519331665958994620">Puwedeng hilingin ng mga site na gamitin ang iyong camera</translation> <translation id="4519605771716872386">Naka-on ang pag-sync ng file</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 8720526a..4dd2ccf0 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -680,7 +680,6 @@ <translation id="1521933835545997395">Connecté au téléphone Android</translation> <translation id="1523279371236772909">Consulté le mois dernier</translation> <translation id="1523978563989812243">Moteurs de synthèse vocale</translation> -<translation id="1524430321211440688">Clavier</translation> <translation id="1524563461097350801">Non, merci</translation> <translation id="1525740877599838384">Utiliser uniquement le réseau Wi-Fi pour déterminer l'emplacement</translation> <translation id="152629053603783244">Redémarrer Linux</translation> @@ -3911,7 +3910,6 @@ <translation id="3966072572894326936">Choisir un autre dossier...</translation> <translation id="3966094581547899417">Détails du point d'accès sans fil</translation> <translation id="3967822245660637423">Téléchargement terminé</translation> -<translation id="3967841595862839006">Choisir votre langue et votre clavier</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Identifiant</translation> <translation id="397105322502079400">Calcul en cours...</translation> @@ -4592,7 +4590,6 @@ <translation id="4513872120116766993">Rédaction prédictive</translation> <translation id="4513946894732546136">Commentaires</translation> <translation id="4515872537870654449">Communiquez avec Dell pour faire réparer votre appareil. La station d'accueil s'éteindra si le ventilateur ne fonctionne pas.</translation> -<translation id="4516008165284813420">Assurez-vous que votre appareil <ph name="DEVICE_TYPE" /> est connecté à Internet et réessayez. Vous pouvez également visiter play.google.com/about/play-terms sur un autre appareil.</translation> <translation id="4518840066030486079">Style de mode de la touche Maj</translation> <translation id="4519331665958994620">Les sites peuvent demander à utiliser votre caméra</translation> <translation id="4519605771716872386">Synchronisation des fichiers activée</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index a1d3dc5..6c4e8586 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -680,7 +680,6 @@ <translation id="1521933835545997395">Appareil connecté au téléphone Android</translation> <translation id="1523279371236772909">Consulté le mois dernier</translation> <translation id="1523978563989812243">Moteurs de synthèse vocale</translation> -<translation id="1524430321211440688">Clavier</translation> <translation id="1524563461097350801">Non, merci</translation> <translation id="1525740877599838384">N'utiliser que le Wi-Fi pour déterminer la position</translation> <translation id="152629053603783244">Redémarrer Linux</translation> @@ -3909,7 +3908,6 @@ <translation id="3966072572894326936">Choisir un autre dossier...</translation> <translation id="3966094581547899417">Détails du point d'accès</translation> <translation id="3967822245660637423">Téléchargement terminé</translation> -<translation id="3967841595862839006">Sélectionner votre langue et votre clavier</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Identifiant</translation> <translation id="397105322502079400">Calcul en cours…</translation> @@ -4590,7 +4588,6 @@ <translation id="4513872120116766993">Saisie prédictive</translation> <translation id="4513946894732546136">Commentaires</translation> <translation id="4515872537870654449">Contactez Dell pour faire réparer votre équipement. La station d'accueil ne peut pas fonctionner si le ventilateur n'est pas en état de marche.</translation> -<translation id="4516008165284813420">Vérifiez que votre <ph name="DEVICE_TYPE" /> est connecté à Internet, puis réessayez. Vous pouvez aussi accéder à play.google.com/about/play-terms sur un autre appareil.</translation> <translation id="4518840066030486079">Style du mode de la touche Maj</translation> <translation id="4519331665958994620">Les sites peuvent demander à utiliser votre caméra</translation> <translation id="4519605771716872386">Synchronisation des fichiers activée</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index bed2ec1..c5aca1d 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -678,7 +678,6 @@ <translation id="1521933835545997395">Conexión cun teléfono Android</translation> <translation id="1523279371236772909">Consultouse no último mes</translation> <translation id="1523978563989812243">Motores de conversión de texto a voz</translation> -<translation id="1524430321211440688">Teclado</translation> <translation id="1524563461097350801">Non, grazas</translation> <translation id="1525740877599838384">Utilizar só a wifi para determinar a localización</translation> <translation id="152629053603783244">Reiniciar Linux</translation> @@ -3910,7 +3909,6 @@ <translation id="3966072572894326936">Seleccionar outro cartafol...</translation> <translation id="3966094581547899417">Detalles da zona wifi</translation> <translation id="3967822245660637423">Descarga completa</translation> -<translation id="3967841595862839006">Escolle un idioma e un teclado</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Calculando...</translation> @@ -4591,7 +4589,6 @@ <translation id="4513872120116766993">Escritura preditiva</translation> <translation id="4513946894732546136">Dános a túa opinión</translation> <translation id="4515872537870654449">Ponte en contacto con Dell para recibir asistencia técnica. A base apagarase se o ventilador non funciona.</translation> -<translation id="4516008165284813420">Asegúrate de que o teu dispositivo (<ph name="DEVICE_TYPE" />) estea conectado a Internet e téntao de novo Tamén podes acceder a play.google.com/about/play-terms noutro dispositivo.</translation> <translation id="4518840066030486079">Estilo do modo da tecla Maiúsculas</translation> <translation id="4519331665958994620">Os sitios poden pedirche permiso para usar a cámara</translation> <translation id="4519605771716872386">Activouse a sincronización de ficheiros</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 80af613..820b5e49 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Android ફોન સાથે કનેક્ટેડ છે</translation> <translation id="1523279371236772909">ગયા મહિને જોઈ હતી</translation> <translation id="1523978563989812243">ટેક્સ્ટ ટૂ સ્પીચ એન્જિન</translation> -<translation id="1524430321211440688">કીબોર્ડ</translation> <translation id="1524563461097350801">ના, આભાર</translation> <translation id="1525740877599838384">સ્થાન નક્કી કરવા માટે માત્ર વાઇ-ફાઇનો ઉપયોગ કરો</translation> <translation id="152629053603783244">Linux ફરીથી ચાલુ કરો</translation> @@ -3920,7 +3919,6 @@ <translation id="3966072572894326936">બીજું ફોલ્ડર પસંદ કરો...</translation> <translation id="3966094581547899417">હૉટસ્પૉટની વિગતો</translation> <translation id="3967822245660637423">ડાઉનલોડ પૂર્ણ</translation> -<translation id="3967841595862839006">તમારી ભાષા અને કીબોર્ડ પસંદ કરો</translation> <translation id="3968739731834770921">કાના</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">ગણના કરી રહ્યું છે...</translation> @@ -4604,7 +4602,6 @@ <translation id="4513872120116766993">પૂર્વાનુમાનિત લેખન</translation> <translation id="4513946894732546136">પ્રતિસાદ</translation> <translation id="4515872537870654449">સર્વિસ માટે Dellનો સંપર્ક કરો. જો પંખો ચાલી રહ્યો ન હોય તો ડૉક શટ ડાઉન થઈ જશે.</translation> -<translation id="4516008165284813420">તમારી <ph name="DEVICE_TYPE" /> ઇન્ટરનેટ સાથે કનેક્ટ કરી હોવાની ખાતરી કરીને ફરી પ્રયાસ કરો. તમે બીજા કોઈ ડિવાઇસ પર પણ play.google.com/about/play-termsની મુલાકાત લઈ શકો છો.</translation> <translation id="4518840066030486079">શિફ્ટ કી મોડ શૈલી</translation> <translation id="4519331665958994620">સાઇટ તમારા કૅમેરાનો ઉપયોગ કરવાનું પૂછી શકે છે</translation> <translation id="4519605771716872386">ફાઇલનું સિંક ચાલુ કર્યું</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index ad82a4b7..fd001ef2 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Android फ़ोन से कनेक्ट किया गया</translation> <translation id="1523279371236772909">पिछले एक महीने में देखा गया</translation> <translation id="1523978563989812243">लिखाई को बोली में बदलने के इंजन</translation> -<translation id="1524430321211440688">कीबोर्ड</translation> <translation id="1524563461097350801">नहीं, रहने दें</translation> <translation id="1525740877599838384">स्थान तय करने के लिए सिर्फ़ वाई-फ़ाई का इस्तेमाल करें</translation> <translation id="152629053603783244">Linux को रीस्टार्ट करें</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">कोई अन्य फ़ोल्डर चुनें</translation> <translation id="3966094581547899417">हॉटस्पॉट के बारे में जानकारी</translation> <translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation> -<translation id="3967841595862839006">अपनी भाषा और कीबोर्ड चुनें</translation> <translation id="3968739731834770921">काना</translation> <translation id="3970114302595058915">आईडी</translation> <translation id="397105322502079400">गणना की जा रही है...</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">टाइप करने पर, शब्दों का अनुमान दिखाने की सुविधा</translation> <translation id="4513946894732546136">सुझाव/राय दें</translation> <translation id="4515872537870654449">मरम्मत के लिए Dell से संपर्क करें. अगर पंखा काम नहीं कर रहा है, तो डॉक बंद हो जाएगा.</translation> -<translation id="4516008165284813420">पक्का करें कि आपके <ph name="DEVICE_TYPE" /> को इंटरनेट से कनेक्ट किया गया हो. इसके बाद, फिर से कोशिश करें. आप चाहें, तो किसी अन्य डिवाइस से play.google.com/about/play-terms पर जाएं.</translation> <translation id="4518840066030486079">Shift बटन मोड स्टाइल</translation> <translation id="4519331665958994620">साइटें आपके कैमरे का इस्तेमाल करने के लिए पूछ सकती हैं</translation> <translation id="4519605771716872386">फ़ाइल सिंक करने की सुविधा चालू है</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 63cc069..b9f904b 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -343,6 +343,7 @@ <translation id="1251578593170406502">Traženje podatkovnih mreža...</translation> <translation id="125220115284141797">Zadano</translation> <translation id="1252219782845132919">Sakrij grupu</translation> +<translation id="1252714168533640068">Da biste ponovno otvorili grupu, kliknite naziv grupe</translation> <translation id="1252987234827889034">Došlo je do pogreške na profilu</translation> <translation id="1253664522045778676">Kliknite rezultat i stranica će se otvoriti na trenutnoj kartici</translation> <translation id="1254593899333212300">Izravna internetska veza</translation> @@ -623,6 +624,7 @@ <translation id="1476347941828409626">Upravljajte profili&ma na Chromeu</translation> <translation id="1476607407192946488">&Postavke jezika</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> zahtijeva da vaša pametna kartica ostane umetnuta.</translation> +<translation id="1477645000789043442">Automatski izrađuje grupe kartica na temelju otvorenih kartica. Da biste upotrebljavali tu značajku, kliknite karticu desnom tipkom, a zatim kliknite Organizirajte slične kartice.</translation> <translation id="1477654881618305065">Vaša organizacija ne dopušta vam dijeljenje ovog sadržaja. Ako vam je potrebna pomoć, obratite se svom administratoru.</translation> <translation id="1478340334823509079">Pojedinosti: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Instalacija nije omogućena</translation> @@ -681,7 +683,6 @@ <translation id="1521933835545997395">Povezano s Android telefonom</translation> <translation id="1523279371236772909">Pogledano u proteklih mjesec dana</translation> <translation id="1523978563989812243">Alati za pretvaranje teksta u govor</translation> -<translation id="1524430321211440688">Tipkovnica</translation> <translation id="1524563461097350801">Ne, hvala</translation> <translation id="1525740877599838384">Za utvrđivanje lokacije upotrebljava se samo Wi-Fi</translation> <translation id="152629053603783244">Ponovo pokrenite Linux</translation> @@ -880,6 +881,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Za utvrđivanje lokacije upotrebljava se Wi‑Fi, Bluetooth ili mobilne mreže</translation> <translation id="164936512206786300">Rasparivanje Bluetooth uređaja</translation> +<translation id="1650407365859096313">Otvara se u novoj kartici, dopuštenje je <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">Vaše datoteke na stranici Moj disk automatski će se sinkronizirati s vašim Chromebookom kako biste im mogli pristupati bez internetske veze. To uvijek možete promijeniti u odjeljku Postavke > Datoteke.</translation> <translation id="1651008383952180276">Morate dvaput unijeti istu šifru</translation> <translation id="1651609627703324721">VR sadržaj ove kartice prikazuje se putem maske</translation> @@ -1116,6 +1118,7 @@ <translation id="1828901632669367785">Ispis pomoću dijaloškog okvira sustava...</translation> <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">Zoom &Out (Smanji)</translation> +<translation id="182973053761690772">Raspored zalazaka sunca</translation> <translation id="1830550083491357902">Nije prijavljen</translation> <translation id="1831848493690504725">Ne možemo stupiti u kontakt s Googleom putem povezane mreže. Pokušajte odabrati drugu mrežu ili provjerite postavke mreže ili proxy postavke (ako koristite proxy).</translation> <translation id="1832459821645506983">U redu</translation> @@ -1172,6 +1175,7 @@ <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> je ažuriran</translation> <translation id="1873920700418191231">Ponovo odobrite dopuštenja za web-lokaciju <ph name="WEBSITE" /></translation> <translation id="1874248162548993294">Dopušteno je prikazivanje oglasa</translation> +<translation id="1874794096607967241">Dopustite pristup za aplikacije i web-lokacije s dopuštenjem za kameru i usluge sustava</translation> <translation id="1874874185178737347">Organiziranje kartica</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Premjesti karticu u neki drugi prozor}one{Premjesti kartice u neki drugi prozor}few{Premjesti kartice u neki drugi prozor}other{Premjesti kartice u neki drugi prozor}}</translation> <translation id="1875387611427697908">Može se dodati jedino s usluge <ph name="CHROME_WEB_STORE" /></translation> @@ -1211,6 +1215,7 @@ <translation id="1901303067676059328">Odaberi &sve</translation> <translation id="1903542130902305074">Postavi</translation> <translation id="1904580727789512086">URL-ovi koje posjećujete spremaju se na vaš Google račun</translation> +<translation id="1904603806662441960">Upravljanje dopuštenjima za kameru za web-lokacije u Chromeu</translation> <translation id="1905375423839394163">Naziv Chromebook uređaja</translation> <translation id="1906181697255754968">Web-lokacije obično pristupaju datotekama i mapama na vašem uređaju radi značajki poput automatskog spremanja vašeg rada</translation> <translation id="1906488504371069394">Otkrijte više proširenja i tema u <ph name="BEGIN_LINK" />Chrome web-trgovini<ph name="END_LINK" /></translation> @@ -1351,6 +1356,7 @@ <translation id="200928901437634269">Upotrijebite djetetov Google račun ili školski račun. Možete postaviti i roditeljski nadzor.</translation> <translation id="2009590708342941694">Alat za emojije</translation> <translation id="2010501376126504057">Kompatibilni uređaji</translation> +<translation id="201217432804812273">Uključivanje opcije Spremi grupu</translation> <translation id="2012935757369720523">Izbriši datoteku</translation> <translation id="2013550551806600826">Isprobajte. Uključite ili isključite postavku, a zatim se s dva prsta pomičite po dodirnoj podlozi u testnom području. Možete je pronaći i kasnije u odjeljku Postavke > Uređaj > Miš i dodirna podloga.</translation> <translation id="2015232545623037616">PC i Chromecast na istoj Wi-Fi mreži</translation> @@ -1772,6 +1778,7 @@ <translation id="2314165183524574721">Trenutačna postavka vidljivosti je skrivena</translation> <translation id="2314774579020744484">Jezik korišten pri prevođenju stranica</translation> <translation id="2316129865977710310">Ne, hvala</translation> +<translation id="2316433409811863464">Stream aplikacije</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% dovršeno</translation> <translation id="2318143611928805047">Veličina papira</translation> <translation id="2318817390901984578">Da biste upotrebljavali Android aplikacije, napunite i ažurirajte svoj <ph name="DEVICE_TYPE" />.</translation> @@ -1958,6 +1965,7 @@ <translation id="2454206500483040640">Podijeljeno</translation> <translation id="2454247629720664989">Ključna riječ</translation> <translation id="2454524890947537054">Želite li odobriti zahtjev za web-stranice?</translation> +<translation id="2454913962395846391">Automatska vremenska zona</translation> <translation id="245650153866130664">Da biste automatski osvježili tiket, potvrdite opciju "Zapamti zaporku". Vaša će se zaporka pohraniti samo na vašem uređaju.</translation> <translation id="2456794251167091176">Uvoz dovršen</translation> <translation id="2456827790665612305">Prestani pratiti web-lokaciju</translation> @@ -2916,6 +2924,7 @@ <translation id="3202499879214571401">Pauzirajte emitiranje zaslona na uređaj <ph name="DEVICE_NAME" /></translation> <translation id="3202578601642193415">Najnovije</translation> <translation id="3204648577100496185">Podaci povezani s tom aplikacijom možda će se ukloniti s ovog uređaja.</translation> +<translation id="3205140624385017621">Vašu kameru mogu upotrebljavati aplikacije i web-lokacije s dopuštenjima za kameru te usluge sustava. Da biste upotrebljavali kameru, možda ćete trebati ponovno pokrenuti aplikaciju ili osvježiti stranicu.</translation> <translation id="3207344462385471911">Prikazuju vam se predložena pretraživanja i popusti za kupnju koji bi vas mogli zanimati na temelju vaše nedavne aktivnosti. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3193,6 +3202,7 @@ <translation id="3434272557872943250">Ako je za vaše dijete uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun. Više o tim postavkama i načinu na koji ih možete prilagoditi saznajte na families.google.com.</translation> <translation id="3434475275396485144">Administrator vašeg telefona upravlja ovom postavkom</translation> <translation id="3434512374684753970">Slika i zvuk</translation> +<translation id="3435381311628654443">Dopustite pristup za aplikacije i web-lokacije s dopuštenjem za mikrofon i uslugama sustava</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" zahtijeva vaš <ph name="CODE_TYPE" /></translation> <translation id="3435738964857648380">Sigurnost</translation> <translation id="343578350365773421">Nema papira</translation> @@ -3270,6 +3280,7 @@ <translation id="3491669675709357988">Račun vašeg djeteta nije postavljen za roditeljski nadzor Family Linka. Roditeljski nadzor možete dodati kad dovršite postavljanje. Informacije o roditeljskom nadzoru možete pronaći u aplikaciji Istražite.</translation> <translation id="3491678231052507920">Web-lokacije obično upotrebljavaju uređaje i podatke virtualne stvarnosti da bi vam omogućile pristup VR sesijama</translation> <translation id="3493043608231401654">Ukloni <ph name="TAB_TITLE" /> iz grupe kartica</translation> +<translation id="3493463599276143766">Nijedna web-lokacija ne smije upotrebljavati vašu kameru</translation> <translation id="3493486281776271508">Potrebna je internetska veza</translation> <translation id="3493881266323043047">Valjanost</translation> <translation id="3495496470825196617">Neaktivnost tijekom punjenja</translation> @@ -3588,6 +3599,7 @@ <translation id="3733296813637058299">Instalirat ćemo te aplikacije za vas. Više aplikacija za svoj uređaj <ph name="DEVICE_TYPE" /> možete pronaći u Trgovini Play.</translation> <translation id="3735039640698208086">Pri reprodukciji zvuka...</translation> <translation id="3735740477244556633">Poredaj po</translation> +<translation id="3735827758948958091"><ph name="FILE_NAMES" /> nije moguće otvoriti na vezi s ograničenim prometom</translation> <translation id="3738632186060045350">Podaci uređaja <ph name="DEVICE_TYPE" /> izbrisat će se za 24 sata</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">Želite li otvoriti aplikaciju <ph name="APPLICATION" />?</translation> @@ -3856,6 +3868,7 @@ <translation id="3925573269917483990">Fotoaparat:</translation> <translation id="3925926055063465902">Drugi korisnici na ovom uređaju također mogu upotrebljavati mrežu</translation> <translation id="3926002189479431949">Telefon za Smart Lock promijenio se</translation> +<translation id="3926410220776569451">Blokiran je pristup kameri</translation> <translation id="3927932062596804919">Odbij</translation> <translation id="3928570707778085600">Želite li spremiti promjene u <ph name="FILE_OR_FOLDER_NAME" />?</translation> <translation id="3928659086758780856">Ponestaje tinte</translation> @@ -3911,7 +3924,6 @@ <translation id="3966072572894326936">Odabir druge mape...</translation> <translation id="3966094581547899417">Pojedinosti o žarišnoj točki</translation> <translation id="3967822245660637423">Preuzimanje dovršeno</translation> -<translation id="3967841595862839006">Odaberite jezik i tipkovnicu</translation> <translation id="3968739731834770921">kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Izračun u tijeku…</translation> @@ -4051,6 +4063,7 @@ <translation id="4078738236287221428">Agresivno</translation> <translation id="4078903002989614318">Opcije razvrstavanja i popisa</translation> <translation id="4079140982534148664">Koristi poboljšanu provjeru pravopisa</translation> +<translation id="4082333918978320301">Nijedna web-lokacija ne smije upotrebljavati vaš mikrofon</translation> <translation id="4084582735848141214">{COUNT,plural, =1{Dopuštena je 1 web-lokacija}one{Dopuštena je # web-lokacija}few{Dopuštene su # web-lokacije}other{Dopuštena je # web-lokacija}}</translation> <translation id="4084682180776658562">Oznaka</translation> <translation id="4084835346725913160">Zatvori karticu <ph name="TAB_NAME" /></translation> @@ -4200,6 +4213,7 @@ <translation id="4201546031411513170">Uvijek možete odabrati u postavkama što će se sinkronizirati.</translation> <translation id="4203065553461038553">Naziv datoteke ili lokacije je predug</translation> <translation id="4203769790323223880">Kamera nije dopuštena</translation> +<translation id="4204415812590935863">Tema se trenutačno ne može izraditi.</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> @@ -4541,6 +4555,7 @@ <translation id="447252321002412580">Pomozite poboljšati Chromeove značajke i izvedbu</translation> <translation id="4472533928615930332">Generirana slika <ph name="INDEX" /> za <ph name="SUBJECT" /> u stilu <ph name="STYLE" /></translation> <translation id="4472575034687746823">Početak korištenja</translation> +<translation id="4473559657152613417">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u novu grupu</translation> <translation id="4473996011558324141">procjena vremena</translation> <translation id="4474155171896946103">Označi sve kartice...</translation> <translation id="4475552974751346499">Pretraži preuzimanja</translation> @@ -4592,7 +4607,6 @@ <translation id="4513872120116766993">Prediktivno pisanje</translation> <translation id="4513946894732546136">Povratne informacije</translation> <translation id="4515872537870654449">Za servis se obratite Dellu. Priključna stanica isključit će se ako ventilator ne radi.</translation> -<translation id="4516008165284813420">Provjerite je li vaš uređaj <ph name="DEVICE_TYPE" /> povezan s internetom i pokušajte ponovo. Možete i posjetiti play.google.com/about/play-terms na nekom drugom uređaju.</translation> <translation id="4518840066030486079">Stil načina tipke Shift</translation> <translation id="4519331665958994620">Web-lokacije mogu tražiti dopuštenje za upotrebu kamere</translation> <translation id="4519605771716872386">Sinkronizacija datoteka uključena</translation> @@ -4636,6 +4650,7 @@ <translation id="4547672827276975204">Postavi automatski</translation> <translation id="4548858987594081919">Da biste pomogli Google upravitelju zaporki da spremi vaše podatke o prijavi, dodajte svoje korisničko ime za ovu web-lokaciju</translation> <translation id="4549791035683739768">Na vašem sigurnosnom ključu nema pohranjenih otisaka prstiju</translation> +<translation id="4550737096585299960">Pokušajte ponovno za nekoliko minuta.</translation> <translation id="4550926046134589611">Neke podržane veze i dalje će se otvarati u aplikaciji <ph name="APP_NAME" />.</translation> <translation id="4551379727767354516">Vaše nedavne AI teme</translation> <translation id="4551763574344810652">Pritisnite <ph name="MODIFIER_KEY_DESCRIPTION" /> za poništavanje</translation> @@ -5260,6 +5275,7 @@ <translation id="5051461727068120271">Preuzimanje nepotvrđene datoteke</translation> <translation id="5051836348807686060">Provjera pravopisa nije podržana za jezike koje ste odabrali</translation> <translation id="5052499409147950210">Uređivanje web-lokacije</translation> +<translation id="5052853071318006357">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u novu grupu</translation> <translation id="5053233576223592551">Dodaj korisničko ime</translation> <translation id="505347685865235222">Neimenovana grupa – <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193">Pogledajte sve opcije kartica u odjeljku <ph name="BEGIN_LINK" />Prilagodba Chromea<ph name="END_LINK" /></translation> @@ -5296,6 +5312,7 @@ <translation id="5078638979202084724">Označi sve kartice</translation> <translation id="5078796286268621944">Netočan PIN</translation> <translation id="5079010647467150187">Dodavanje ugrađenog VPN-a...</translation> +<translation id="5079460277417557557">Sada možete upotrebljavati spremljene grupe kartica na računalima na kojima ste prijavljeni</translation> <translation id="5079699784114005398">Kad uključite tu postavku, vaše će aplikacije biti dostupne na svim ChromeOS uređajima nakon što se prijavite Google računom. Web-aplikacije instalirane iz preglednika Chrome sinkronizirat će se čak i ako je sinkronizacija preglednika isključena.</translation> <translation id="508059534790499809">Osvježite Kerberosov tiket</translation> <translation id="5081124414979006563">&Otvori profil gosta</translation> @@ -5359,6 +5376,7 @@ <translation id="5125967981703109366">O ovoj kartici</translation> <translation id="512642543295077915">pretraživanje + backspace</translation> <translation id="5126611267288187364">Prikaz izmjena</translation> +<translation id="512761462447738469">Vašu kameru mogu upotrebljavati aplikacije i web-lokacije s dopuštenjima za kameru te usluge sustava.</translation> <translation id="5127620150973591153">ID sigurne veze: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Sinkronizacija je isključena</translation> <translation id="5127881134400491887">upravljati mrežnim vezama</translation> @@ -6062,6 +6080,7 @@ <translation id="5691581861107245578">Primajte prijedloge emojija na temelju onoga što upisujete</translation> <translation id="5691772641933328258">Otisak prsta nije prepoznat</translation> <translation id="5692183275898619210">Ispis je dovršen</translation> +<translation id="5693237475389615913">Upravljanje dopuštenjima za mikrofon web-lokacije u Chromeu</translation> <translation id="5693255400847650006">Upotrebljava se mikrofon</translation> <translation id="5695184138696833495">Linuxov ADB za Android aplikacije</translation> <translation id="5696143504434933566">Prijavi zloupotrebu za proširenje "<ph name="EXTENSION_NAME" />"</translation> @@ -6083,6 +6102,7 @@ <translation id="5708171344853220004">Microsoftov glavni naziv</translation> <translation id="5709557627224531708">Postavite Chrome kao zadani preglednik</translation> <translation id="5711010025974903573">Zapisnici usluge</translation> +<translation id="5711324642850167289">Nijedna aplikacija ne smije upotrebljavati mikrofon</translation> <translation id="5711983031544731014">Otključavanje nije moguće. Unesite svoju zaporku.</translation> <translation id="5712153969432126546">Web-lokacije ponekad objavljuju PDF-ove, primjerice dokumente, ugovore i obrasce</translation> <translation id="571222594670061844">Web-lokacije mogu prikazivati upite za prijavu s usluga za provjeru identiteta</translation> @@ -6274,6 +6294,7 @@ <translation id="5862319196656206789">Postavljanje povezanih uređaja</translation> <translation id="5862731021271217234">Da bi se prikazale kartice s vaših ostalih uređaja, uključite sinkronizaciju</translation> <translation id="5863195274347579748">Vanjski uređaji možda mogu pristupati osobnim podacima ili ih dijeliti.</translation> +<translation id="5863263400083022538">Usluge sustava</translation> <translation id="5863445608433396414">Omogući značajke za otklanjanje pogrešaka</translation> <translation id="5863515189965725638">Uređivanje IBAN-a</translation> <translation id="5864195618110239517">Koristi vezu s ograničenim prometom</translation> @@ -6712,6 +6733,7 @@ <translation id="6207937957461833379">Zemlja/regija</translation> <translation id="6208521041562685716">U tijeku je aktivacija mobilnih podataka</translation> <translation id="6208725777148613371">Spremanje na <ph name="WEB_DRIVE" /> nije uspjelo – <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">Aplikacije i web-lokacije s dopuštenjima za mikrofon i uslugama sustava mogu upotrebljavati vaš mikrofon</translation> <translation id="6209838773933913227">Ažuriranje komponenti</translation> <translation id="6209908325007204267">Vaš uređaj uključuje Nadogradnju za Chrome za poduzeća, no vaše korisničko ime nije povezano s računom tvrtke. Da biste izradili račun tvrtke, otvorite stranicu g.co/ChromeEnterpriseAccount na drugom uređaju.</translation> <translation id="6210282067670792090">U adresnoj traci upotrijebite ovaj tipkovni prečac s prečacima za tražilice i pretraživanje web-lokacije</translation> @@ -7046,6 +7068,7 @@ <translation id="6478248366783946499">Želite li zadržati opasnu datoteku?</translation> <translation id="6479881432656947268">Posjetite Chrome web-trgovinu</translation> <translation id="6480327114083866287">Upravlja <ph name="MANAGER" /></translation> +<translation id="6481749622989211463">Dijelite datoteke i drugo s uređajima u blizini. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Povećalo za cijeli zaslon</translation> <translation id="6483485061007832714">Otvorite preuzimanje</translation> <translation id="6483805311199035658">Otvaranje datoteke <ph name="FILE" />...</translation> @@ -7298,6 +7321,7 @@ <translation id="6680650203439190394">Brzina</translation> <translation id="6683022854667115063">Slušalice</translation> <translation id="6683087162435654533">V&raćanje svih kartica</translation> +<translation id="6683433919380522900">Dopuštenje je <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Preuzimanje najnovijeg ažuriranja</translation> <translation id="668599234725812620">Otvori Google Play</translation> <translation id="6686490380836145850">Zatvori kartice s desne strane</translation> @@ -8112,6 +8136,7 @@ <translation id="7330533963640151632">Postavke značajke <ph name="FEATURE_NAME" /> za uređaj na kojem <ph name="USER_NAME" /> dijeli putem računa <ph name="USER_EMAIL" />.</translation> <translation id="7331646370422660166">Alt + strelica prema dolje</translation> <translation id="7332053360324989309">Dodijeljeni radnik: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Datoteke se ne mogu prenijeti dok ste povezani s ograničenim prometom.</translation> <translation id="7333669215417470379">Sigurnosno kopiranje i vraćanje aplikacija i postavki</translation> <translation id="7335436113423103413">Omogućuje upotrebu funkcije Prilagodba Chromea s objedinjene bočne ploče na stranici Nova kartica.</translation> <translation id="7335974957018254119">Upotreba provjere pravopisa za</translation> @@ -8268,6 +8293,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Pregledajte jedno proširenje koje je uklonjeno iz Chrome Web Storea}one{Pregledajte {NUM_EXTENSIONS} proširenje koje je uklonjeno iz Chrome Web Storea}few{Pregledajte {NUM_EXTENSIONS} proširenja koja su uklonjena iz Chrome Web Storea}other{Pregledajte {NUM_EXTENSIONS} proširenja koja su uklonjena iz Chrome Web Storea}}</translation> <translation id="7436921188514130341">O, ne! Došlo je do pogreške prilikom preimenovanja.</translation> <translation id="7439519621174723623">Dodajte naziv uređaja za nastavak</translation> +<translation id="7441736532026945583">Odaberite Sakrij grupu da biste uklonili grupu s vrpce kartica</translation> <translation id="7441736921018636843">Da biste promijenili tu postavku, <ph name="BEGIN_LINK" />poništite sinkronizaciju<ph name="END_LINK" /> radi uklanjanja vaše šifre za sinkronizaciju</translation> <translation id="7441830548568730290">Ostali korisnici</translation> <translation id="744341768939279100">Izradi novi profil</translation> @@ -8868,6 +8894,7 @@ <translation id="7887864092952184874">Bluetooth miš uparen</translation> <translation id="7889371445710865055">Promjena jezika diktiranja</translation> <translation id="7890147169288018054">Pregled informacija o mreži, kao što su IP ili MAC adresa</translation> +<translation id="7892005672811746207">Uključivanje opcije Spremi grupu</translation> <translation id="7892384782944609022">Uparivanje nije uspjelo. Odaberite uređaj i pokušajte ponovo.</translation> <translation id="7893008570150657497">pristupiti fotografijama, glazbi i drugim medijima s vašeg računala</translation> <translation id="7893153962594818789">Bluetooth je isključen na ovom <ph name="DEVICE_TYPE" /> uređaju. Unesite zaporku i uključite Bluetooth.</translation> @@ -9111,6 +9138,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">Grupa <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Dijalog za povezivanje</translation> +<translation id="8070572887926783747">Dopuštenje za lokaciju za <ph name="APP_NAME" /></translation> <translation id="8070662218171013510">Dodirna povratna informacija</translation> <translation id="8071432093239591881">Ispiši kao sliku</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Podaci aplikacije mogu biti bilo koji podaci koje je aplikacija spremila (na temelju postavki razvojnog programera), uključujući potencijalno osjetljive podatke kao što su kontakti, poruke i fotografije.<ph name="END_PARAGRAPH1" /> @@ -9169,6 +9197,7 @@ <translation id="8109991406044913868">Tema koju je izradio AI</translation> <translation id="8110393529211831722">Pretplata je instalirana samo na ovom uređaju i ne sinkronizira se s drugim uređajima na vašem računu. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Preuzimanje popisa kontakata...</translation> +<translation id="8114925369073821854">Dopuštenje za mikrofon za <ph name="APP_NAME" /></translation> <translation id="8115139559594092084">S vašeg Google diska</translation> <translation id="8116972784401310538">&Upravitelj oznaka</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> pamti kako ste se prijavili i automatski vas prijavljuje kada je to moguće. Kada je ta značajka isključena, tražit će se potvrda svaki put.</translation> @@ -9384,6 +9413,7 @@ <translation id="8275038454117074363">Uvezi</translation> <translation id="8275080796245127762">Nazovi sa svojeg uređaja</translation> <translation id="8275339871947079271">Premjestite zaporku na svoj Google račun da biste joj sigurno pristupali na svakom uređaju na kojem ste prijavljeni</translation> +<translation id="8276242035951017580">Nijedna aplikacija ne smije upotrebljavati kameru</translation> <translation id="8276560076771292512">Pražnjenje predmemorije i tvrdo ponovno učitavanje</translation> <translation id="8276850948802942358">Saznajte više o davanju privremenog dopuštenja web-lokaciji za upotrebu kolačića trećih strana</translation> <translation id="828180235270931531">Ostali dostupni pisači</translation> @@ -9402,6 +9432,7 @@ <translation id="8291942417224950075">Za osobnu upotrebu</translation> <translation id="8293206222192510085">Dodaj oznaku</translation> <translation id="8294431847097064396">Izvor</translation> +<translation id="8294476140219241086">Organizator kartica</translation> <translation id="8294895455164415895">Otvorite postavke da biste Chromeu omogućili da predlaže grupe kartica</translation> <translation id="8295449579927246485">Prijevod uživo</translation> <translation id="8295450130892483256">Instalirajte Microsoft 365</translation> @@ -9514,6 +9545,7 @@ <translation id="8380266723152870797">Naziv prozora</translation> <translation id="8380941800586852976">Opasno</translation> <translation id="8381630473947706877">Uključivanje značajke <ph name="FEATURE_NAME" /></translation> +<translation id="8382197851871630452">Lokalna vremenska prognoza</translation> <translation id="8382677870544805359">Da biste mogli upotrebljavati značajke tvrtke, morat ćete vratiti uređaj na tvorničke postavke.</translation> <translation id="8382715499079447151">Zaštita prikaza</translation> <translation id="8382913212082956454">Kopiraj &adresu e-pošte</translation> @@ -9704,6 +9736,7 @@ <translation id="8528962588711550376">Prijava.</translation> <translation id="8529578450330869579">Koristite siguran Domain Name System (DNS) da biste osobama s pristupom vašem internetskom prometu onemogućili da vide koje web-lokacije posjećujete. Ova aplikacija upotrebljava upravljanog davatelja usluga na web-lokaciji <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /></translation> <translation id="8529925957403338845">Automatsko modemsko povezivanje nije uspjelo</translation> +<translation id="8531367864749403520">Odaberite Sakrij grupu da biste uklonili grupu s vrpce kartica</translation> <translation id="8531701051932785007">Isključeno je poboljšano sigurno pregledavanje</translation> <translation id="8533670235862049797">Uključeno je Sigurno pregledavanje</translation> <translation id="8534656636775144800">Ups! Došlo je do pogreške pri pokušaju pridruživanja domeni. Pokušajte ponovo.</translation> @@ -9830,6 +9863,7 @@ <translation id="8639635302972078117">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 se podaci neće upotrebljavati za identifikaciju vašeg djeteta, a pomoći će poboljšati sustav, stabilnost aplikacija i drugo. Neki skupni podaci pomoći će i Googleovim aplikacijama i partnerima, na primjer razvojnim programerima za Android. Ako je za vaše dijete uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na djetetov Google račun.</translation> <translation id="8640575194957831802">posljednje otvaranje</translation> <translation id="8641946446576357115">Upotreba zaporki na iOS uređajima</translation> +<translation id="8642577642520207435">Dopuštenje za kameru za <ph name="APP_NAME" /></translation> <translation id="8642900771896232685">Dvije sekunde</translation> <translation id="8642947597466641025">Uvećaj tekst</translation> <translation id="8643403533759285912">Izbriši grupu</translation> @@ -9864,6 +9898,7 @@ <translation id="8662978096466608964">Chrome ne može postaviti pozadinu.</translation> <translation id="8663051876219324457">Aplikacijama, web-lokacijama i uslugama sustava dopustite upotrebu lokacije. Za procjenu lokacije vašeg uređaja mogu se upotrebljavati izvori kao što su Wi-Fi, mobilne mreže i senzori. <ph name="LINK_BEGIN" />Saznaj više<ph name="LINK_END" /></translation> <translation id="8663099077749055505">Uvijek blokiraj višestruka automatska preuzimanja na hostu <ph name="HOST" /></translation> +<translation id="8664249499245357248">Desnom tipkom miša kliknite naziv grupe</translation> <translation id="8664389313780386848">&Pogledaj izvor stranice</translation> <translation id="8665110742939124773">Unijeli ste netočnu pristupnu šifru. Pokušajte ponovo.</translation> <translation id="8665180165765946056">Dovršeno je sigurnosno kopiranje</translation> @@ -10190,6 +10225,7 @@ <translation id="8900413463156971200">Omogućivanje mobilne mreže</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> traži da izradite sigurnosnu kopiju svojih podataka i danas vratite ovaj uređaj <ph name="DEVICE_TYPE" />.}one{<ph name="MANAGER" /> traži da izradite sigurnosnu kopiju svojih podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> prije roka.}few{<ph name="MANAGER" /> traži da izradite sigurnosnu kopiju svojih podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> prije roka.}other{<ph name="MANAGER" /> traži da izradite sigurnosnu kopiju svojih podataka i vratite ovaj uređaj <ph name="DEVICE_TYPE" /> prije roka.}}</translation> <translation id="8902667442496790482">Otvorite postavke Odabira za govor</translation> +<translation id="8903733144777177139">Blokiran je pristup mikrofonu</translation> <translation id="890616557918890486">Promijeni izvor</translation> <translation id="8907701755790961703">Odaberite zemlju</translation> <translation id="8908420399006197927">Izuzmite karticu iz predložene grupe</translation> @@ -10227,6 +10263,7 @@ <translation id="8934732568177537184">Nastavi</translation> <translation id="8938800817013097409">USB-C uređaj (desni priključak sa stražnje strane)</translation> <translation id="8940081510938872932">Vaše računalo trenutačno radi previše stvari. Pokušajte ponovo kasnije.</translation> +<translation id="8940228279218723234">Dopustite pristup za aplikacije i web-lokacije s dopuštenjem za kameru i usluge sustava. Da biste upotrebljavali kameru, možda ćete trebati ponovno pokrenuti aplikaciju ili osvježiti stranicu.</translation> <translation id="8940381019874223173">S vaših Google fotografija</translation> <translation id="8940888110818450052">Opcije prijave</translation> <translation id="8941173171815156065">Opoziv dopuštenja "<ph name="PERMISSION" />"</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 7687ae6..5674b9d 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Csatlakoztatva androidos telefonhoz</translation> <translation id="1523279371236772909">A múlt hónapban tekintette meg</translation> <translation id="1523978563989812243">Szövegfelolvasó motorok</translation> -<translation id="1524430321211440688">Billentyűzet</translation> <translation id="1524563461097350801">Köszönöm, nem</translation> <translation id="1525740877599838384">Csak a Wi-Fi használata a tartózkodási hely megállapításához</translation> <translation id="152629053603783244">Linux újraindítása</translation> @@ -3921,7 +3920,6 @@ <translation id="3966072572894326936">Válasszon másik mappát...</translation> <translation id="3966094581547899417">A hotspot részletei</translation> <translation id="3967822245660637423">A letöltés sikeres</translation> -<translation id="3967841595862839006">Nyelv és billentyűzet kiválasztása</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Azonosító</translation> <translation id="397105322502079400">Számítás…</translation> @@ -4603,7 +4601,6 @@ <translation id="4513872120116766993">Prediktív írás</translation> <translation id="4513946894732546136">Visszajelzés</translation> <translation id="4515872537870654449">Szervizelés ügyében vegye fel a kapcsolatot a Dell ügyfélszolgálatával. A dokk leáll, ha a ventilátor nem működik.</translation> -<translation id="4516008165284813420">Ellenőrizze a(z) <ph name="DEVICE_TYPE" /> internetkapcsolatát, majd próbálkozzon újra. Másik eszközön felkeresheti a play.google.com/about/play-terms oldalt is.</translation> <translation id="4518840066030486079">Shift billentyűmód stílusa</translation> <translation id="4519331665958994620">A webhelyek hozzáférést kérhetnek a kamerához</translation> <translation id="4519605771716872386">Fájlszinkronizálás bekapcsolva</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index b2e4e647..4c683ae 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Միացած է Android հեռախոսին</translation> <translation id="1523279371236772909">Դիտել եք անցած ամիս</translation> <translation id="1523978563989812243">Տեքստի հնչեցման գործիքներ</translation> -<translation id="1524430321211440688">Ստեղնաշար</translation> <translation id="1524563461097350801">Ոչ</translation> <translation id="1525740877599838384">Տեղորոշելու համար օգտագործել միայն Wi-Fi ցանցը</translation> <translation id="152629053603783244">Վերագործարկել Լինուքսը</translation> @@ -3906,7 +3905,6 @@ <translation id="3966072572894326936">Ընտրել մեկ այլ պանակ...</translation> <translation id="3966094581547899417">Թեժ կետի տվյալներ</translation> <translation id="3967822245660637423">Ներբեռնումն ավարտվեց</translation> -<translation id="3967841595862839006">Ընտրեք լեզուն և ստեղնաշարը</translation> <translation id="3968739731834770921">Կանա</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Հաշվարկում…</translation> @@ -4587,7 +4585,6 @@ <translation id="4513872120116766993">Տեքստի կանխատեսում</translation> <translation id="4513946894732546136">Հետադարձ կապ</translation> <translation id="4515872537870654449">Կապվեք Dell-ի սպասարկման ծառայության հետ։ Եթե հովացումը չաշխատի, դոկ-կայանը կանջատվի:</translation> -<translation id="4516008165284813420">Համոզվեք, որ ձեր <ph name="DEVICE_TYPE" /> սարքը միացած է համացանցին, և նորից փորձեք։ Կարող եք նաև այցելել play.google.com/about/play-terms էջ մեկ այլ սարքից։</translation> <translation id="4518840066030486079">Shift ստեղնի ռեժիմի ոճ</translation> <translation id="4519331665958994620">Կայքերը կարող են տեսախցիկն օգտագործելու թույլտվություն հայցել</translation> <translation id="4519605771716872386">Ֆայլերի համաժամացումը միացված է</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 8972e9e..3c6ac14 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Terhubung ke ponsel Android</translation> <translation id="1523279371236772909">Dilihat dalam sebulan terakhir</translation> <translation id="1523978563989812243">Mesin text-to-speech</translation> -<translation id="1524430321211440688">Keyboard</translation> <translation id="1524563461097350801">Lain Kali</translation> <translation id="1525740877599838384">Hanya gunakan Wi-Fi untuk menentukan lokasi</translation> <translation id="152629053603783244">Mulai ulang Linux</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Pilih folder lain...</translation> <translation id="3966094581547899417">Detail hotspot</translation> <translation id="3967822245660637423">Download selesai</translation> -<translation id="3967841595862839006">Pilih bahasa & keyboard</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Menghitung...</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Penulisan prediktif</translation> <translation id="4513946894732546136">Masukan</translation> <translation id="4515872537870654449">Hubungi Dell untuk perbaikan. Dok akan mati jika kipas tidak berfungsi.</translation> -<translation id="4516008165284813420">Pastikan <ph name="DEVICE_TYPE" /> Anda terhubung ke internet dan coba lagi. Anda juga dapat membuka play.google.com/about/play-terms di perangkat lain.</translation> <translation id="4518840066030486079">Gaya Mode Tombol Shift</translation> <translation id="4519331665958994620">Situs dapat meminta untuk menggunakan kamera Anda</translation> <translation id="4519605771716872386">Sinkronisasi file diaktifkan</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 267a735..c23ab15 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Tengt Android-síma</translation> <translation id="1523279371236772909">Skoðað undanfarinn mánuð</translation> <translation id="1523978563989812243">Talgervilsvélar</translation> -<translation id="1524430321211440688">Lyklaborð</translation> <translation id="1524563461097350801">Nei, takk</translation> <translation id="1525740877599838384">Nota aðeins Wi-Fi til að ákvarða staðsetningu</translation> <translation id="152629053603783244">Endurræsa Linux</translation> @@ -3924,7 +3923,6 @@ <translation id="3966072572894326936">Veldu aðra möppu...</translation> <translation id="3966094581547899417">Upplýsingar um heitan reit</translation> <translation id="3967822245660637423">Niðurhali lokið</translation> -<translation id="3967841595862839006">Veldu tungumál og lyklaborð</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Auðkenni</translation> <translation id="397105322502079400">Reiknar...</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">Textatillögur</translation> <translation id="4513946894732546136">Ábendingar</translation> <translation id="4515872537870654449">Hafðu samband við Dell til að fá aðstoð. Dokkan slekkur á sér ef viftan virkar ekki.</translation> -<translation id="4516008165284813420">Gakktu úr skugga um að <ph name="DEVICE_TYPE" /> sé nettengt og reyndu aftur. Þú getur einnig skoðað play.google.com/about/play-terms í öðru tæki.</translation> <translation id="4518840066030486079">Stillingastíll Shift-lykils</translation> <translation id="4519331665958994620">Vefsvæði geta beðið um að nota myndavélina þína</translation> <translation id="4519605771716872386">Kveikt á samstillingu skráa</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 8af67603..066e4871 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Connessione a smartphone Android attiva</translation> <translation id="1523279371236772909">Visualizzato nell'ultimo mese</translation> <translation id="1523978563989812243">Motori di sintesi vocale</translation> -<translation id="1524430321211440688">Tastiera</translation> <translation id="1524563461097350801">No, grazie</translation> <translation id="1525740877599838384">Usa solo la rete Wi-Fi per stabilire la posizione</translation> <translation id="152629053603783244">Riavvia Linux</translation> @@ -3908,7 +3907,6 @@ <translation id="3966072572894326936">Scegli un'altra cartella...</translation> <translation id="3966094581547899417">Dettagli hotspot</translation> <translation id="3967822245660637423">Download completato</translation> -<translation id="3967841595862839006">Scegli la lingua e la tastiera</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Calcolo in corso...</translation> @@ -4589,7 +4587,6 @@ <translation id="4513872120116766993">Scrittura predittiva</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Per assistenza, contatta Dell. Il dock si spegne se la ventola non funziona.</translation> -<translation id="4516008165284813420">Verifica che <ph name="DEVICE_TYPE" /> sia connesso a internet e riprova. Puoi anche visitare play.google.com/about/play-terms su un altro dispositivo.</translation> <translation id="4518840066030486079">Stile della modalità tasto Maiusc</translation> <translation id="4519331665958994620">I siti possono richiedere l'autorizzazione per utilizzare la videocamera</translation> <translation id="4519605771716872386">Sincronizzazione file attivata</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 3995d9e..3f46eed 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">מחובר לטלפון Android</translation> <translation id="1523279371236772909">נצפה בחודש האחרון</translation> <translation id="1523978563989812243">מנוע המרת טקסט לדיבור (TTS)</translation> -<translation id="1524430321211440688">מקלדת</translation> <translation id="1524563461097350801">לא, תודה</translation> <translation id="1525740877599838384">קביעת מיקום רק באמצעות Wi-Fi</translation> <translation id="152629053603783244">הפעלת Linux מחדש</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">בחירת תיקייה אחרת...</translation> <translation id="3966094581547899417">פרטי הנקודה לשיתוף אינטרנט (Hotspot)</translation> <translation id="3967822245660637423">ההורדה הושלמה</translation> -<translation id="3967841595862839006">בחר שפה ומקלדת</translation> <translation id="3968739731834770921">קאנה</translation> <translation id="3970114302595058915">מזהה</translation> <translation id="397105322502079400">מתבצע חישוב...</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">השלמה אוטומטית</translation> <translation id="4513946894732546136">משוב</translation> <translation id="4515872537870654449">יש לפנות אל Dell כדי לקבל סיוע. אביזר העגינה יכבה אם המאוורר לא פועל.</translation> -<translation id="4516008165284813420">כדאי לוודא שמכשיר <ph name="DEVICE_TYPE" /> מחובר לאינטרנט ולנסות שוב. אפשר גם לעבור לכתובת play.google.com/about/play-terms במכשיר אחר.</translation> <translation id="4518840066030486079">הסגנון של מקש Shift</translation> <translation id="4519331665958994620">אתרים יכולים לבקש הרשאה להשתמש במצלמה</translation> <translation id="4519605771716872386">סנכרון הקבצים מופעל</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 765fba0..7a6e1465 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Android スマートフォンに接続しました</translation> <translation id="1523279371236772909">過去 1 か月以内に表示</translation> <translation id="1523978563989812243">テキスト読み上げエンジン</translation> -<translation id="1524430321211440688">キーボード</translation> <translation id="1524563461097350801">スキップ</translation> <translation id="1525740877599838384">Wi-Fi のみを使用して現在地を特定する</translation> <translation id="152629053603783244">Linux を再起動</translation> @@ -3901,7 +3900,6 @@ <translation id="3966072572894326936">別のフォルダを選択...</translation> <translation id="3966094581547899417">アクセス ポイントの詳細</translation> <translation id="3967822245660637423">ダウンロード完了</translation> -<translation id="3967841595862839006">言語とキーボードの選択</translation> <translation id="3968739731834770921">かな</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">計算しています...</translation> @@ -4581,7 +4579,6 @@ <translation id="4513872120116766993">予測入力</translation> <translation id="4513946894732546136">フィードバック</translation> <translation id="4515872537870654449">サポートについては、Dell にお問い合わせください。ファンが動作しない場合、ドックはシャットダウンされます。</translation> -<translation id="4516008165284813420">お使いの <ph name="DEVICE_TYPE" /> がインターネットに接続されていることを確認してから、もう一度お試しください。別のデバイスで play.google.com/about/play-terms にアクセスすることもできます。</translation> <translation id="4518840066030486079">Shift キーモードのスタイル</translation> <translation id="4519331665958994620">サイトがカメラの使用を要求できるようにする</translation> <translation id="4519605771716872386">ファイルの同期がオンになっています</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 08656ff..0857bd1 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">დაკავშირებულია Android ტელეფონთან</translation> <translation id="1523279371236772909">ნანახია წინა თვეში</translation> <translation id="1523978563989812243">ტექსტის გახმოვანების ძრავები</translation> -<translation id="1524430321211440688">კლავიატურა</translation> <translation id="1524563461097350801">არა, გმადლობთ</translation> <translation id="1525740877599838384">მდებარეობის დასადგენად მხოლოდ Wi-Fi ქსელის გამოყენება</translation> <translation id="152629053603783244">Linux-ის გადატვირთვა</translation> @@ -3908,7 +3907,6 @@ <translation id="3966072572894326936">აირჩიეთ სხვა საქაღალდე...</translation> <translation id="3966094581547899417">უსადენო ქსელის დეტალები</translation> <translation id="3967822245660637423">ჩამოტვირთვა დასრულდა</translation> -<translation id="3967841595862839006">აირჩიეთ ენა და კლავიატურა</translation> <translation id="3968739731834770921">კანა</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">ანგარიშობს…</translation> @@ -4589,7 +4587,6 @@ <translation id="4513872120116766993">პროგნოზირებული წერა</translation> <translation id="4513946894732546136">უკუკავშირი</translation> <translation id="4515872537870654449">მომსახურების მისაღებად დაუკავშირდით Dell-ს. სამაგრი გამოირთვება, თუ ვენტილატორი არ იმუშავებს.</translation> -<translation id="4516008165284813420">დარწმუნდით, რომ თქვენი <ph name="DEVICE_TYPE" /> დაკავშირებულია ინტერნეტთან და ცადეთ ხელახლა. ამას გარდა, შეგიძლიათ მოინახულოთ play.google.com/about/play-terms სხვა მოწყობილობიდან.</translation> <translation id="4518840066030486079">Shift კლავიშის რეჟიმის სტილი</translation> <translation id="4519331665958994620">საიტებს შეუძლია თქვენი კამერის გამოყენების თხოვნა</translation> <translation id="4519605771716872386">ფაილების სინქრონიზაცია ჩართულია</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 5d5fb4b2..ee233709 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -676,7 +676,6 @@ <translation id="1521933835545997395">Android телефонына жалғанған.</translation> <translation id="1523279371236772909">Соңғы айда көрілген.</translation> <translation id="1523978563989812243">Мәтінді дыбыстау жүйелері</translation> -<translation id="1524430321211440688">Пернетақта</translation> <translation id="1524563461097350801">Жоқ, рақмет</translation> <translation id="1525740877599838384">Орынды анықтау үшін тек Wi-Fi желісін қолдану</translation> <translation id="152629053603783244">Linux жүйесін қайта қосу</translation> @@ -3905,7 +3904,6 @@ <translation id="3966072572894326936">Басқа қалтаны таңдау…</translation> <translation id="3966094581547899417">Хотспот мәліметтері</translation> <translation id="3967822245660637423">Жүктеп алынды</translation> -<translation id="3967841595862839006">Тіл мен пернетақтаны таңдаңыз</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Идентификатор</translation> <translation id="397105322502079400">Есептелуде…</translation> @@ -4586,7 +4584,6 @@ <translation id="4513872120116766993">Көмексөздер</translation> <translation id="4513946894732546136">Пікір жіберу</translation> <translation id="4515872537870654449">Dell қолдау қызметіне хабарласыңыз. Желдеткіш жұмыс істемесе, қондыру станциясы өшіп қалады.</translation> -<translation id="4516008165284813420"><ph name="DEVICE_TYPE" /> интернетке қосылғанына көз жеткізіп, әрекетті қайталап көріңіз. Басқа құрылғыдан play.google.com/about/play-terms сайтына кіруге де болады.</translation> <translation id="4518840066030486079">Shift пернесі режимінің стилі</translation> <translation id="4519331665958994620">Сайттар камераңызды пайдалануға рұқсат сұрай алады.</translation> <translation id="4519605771716872386">Файлды синхрондау қосулы</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index edfa430..ebddaacd 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -684,7 +684,6 @@ <translation id="1521933835545997395">បានភ្ជាប់ជាមួយទូរសព្ទ Android</translation> <translation id="1523279371236772909">បានមើលកាលពីខែមុន</translation> <translation id="1523978563989812243">ម៉ាស៊ីនបំប្លែងអត្ថបទទៅជាការនិយាយ</translation> -<translation id="1524430321211440688">ក្ដារចុច</translation> <translation id="1524563461097350801">ទេ អរគុណ</translation> <translation id="1525740877599838384">ប្រើតែ Wi-Fi ប៉ុណ្ណោះដើម្បីកំណត់ទីតាំង</translation> <translation id="152629053603783244">ចាប់ផ្ដើម Linux ឡើងវិញ</translation> @@ -3937,7 +3936,6 @@ <translation id="3966072572894326936">ជ្រើសរើសថតឯកសារដ៏ទៃទៀត...</translation> <translation id="3966094581547899417">ព័ត៌មានលម្អិតអំពីហតស្ប៉ត</translation> <translation id="3967822245660637423">ការទាញយកបានបញ្ចប់</translation> -<translation id="3967841595862839006">ជ្រើសភាសា និងក្តារចុចរបស់អ្នក</translation> <translation id="3968739731834770921">កាណា</translation> <translation id="3970114302595058915">លេខសម្គាល់</translation> <translation id="397105322502079400">កំពុងគណនា...</translation> @@ -4622,7 +4620,6 @@ <translation id="4513872120116766993">ការសរសេរតាមការទស្សន៍ទាយ</translation> <translation id="4513946894732546136">មតិ</translation> <translation id="4515872537870654449">សូមទាក់ទង Dell ដើម្បីទទួលបានសេវាកម្ម។ ឧបករណ៍ភ្ជាប់នឹងបិទ ប្រសិនបើកង្ហារមិនដំណើរការ។</translation> -<translation id="4516008165284813420">សូមប្រាកដថា <ph name="DEVICE_TYPE" /> របស់អ្នកបានភ្ជាប់អ៊ីនធឺណិត រួចព្យាយាមម្ដងទៀត។ អ្នកក៏អាចចូលទៅកាន់ play.google.com/about/play-terms នៅលើឧបករណ៍ផ្សេងផងដែរ។</translation> <translation id="4518840066030486079">រចនាប័ទ្មមុខងារគ្រាប់ចុច Shift</translation> <translation id="4519331665958994620">គេហទំព័រអាចស្នើសុំប្រើកាមេរ៉ារបស់អ្នក</translation> <translation id="4519605771716872386">បានបើកការធ្វើសមកាលកម្មឯកសារ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 5de7df4c..978029d3 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -344,6 +344,7 @@ <translation id="1251578593170406502">ಮೊಬೈಲ್ ಡೇಟಾ ನೆಟ್ವರ್ಕ್ಗಳಿಗಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="125220115284141797">ಡಿಫಾಲ್ಟ್</translation> <translation id="1252219782845132919">ಗುಂಪನ್ನು ಮರೆಮಾಡಿ</translation> +<translation id="1252714168533640068">ಗುಂಪನ್ನು ಪುನಃ ತೆರೆಯಲು, ಗುಂಪಿನ ಹೆಸರಿನ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ</translation> <translation id="1252987234827889034">ಪ್ರೊಫೈಲ್ ದೋಷ ಸಂಭವಿಸಿದೆ</translation> <translation id="1253664522045778676">ಫಲಿತಾಂಶವೊಂದರ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿದರೆ ಪುಟವು ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ</translation> <translation id="1254593899333212300">ನೇರ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ</translation> @@ -625,6 +626,7 @@ <translation id="1476347941828409626">Chrome ಪ್ರೊಫೈಲ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="1476607407192946488">&ಭಾಷೆ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="1477446329585670721"><ph name="DOMAIN" />, ನಿಮ್ಮ ಸ್ಮಾರ್ಟ್ ಕಾರ್ಡ್ ಅನ್ನು ಸೇರಿಸಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.</translation> +<translation id="1477645000789043442">ನಿಮ್ಮ ತೆರೆದ ಟ್ಯಾಬ್ಗಳ ಆಧಾರದ ಮೇಲೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಟ್ಯಾಬ್ ಗುಂಪುಗಳನ್ನು ರಚಿಸುತ್ತದೆ. ಈ ಫೀಚರ್ ಅನ್ನು ಬಳಸಲು, ಟ್ಯಾಬ್ ಮೇಲೆ ಬಲ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು 'ಇದೇ ರೀತಿಯ ಟ್ಯಾಬ್ಗಳನ್ನು ಆಯೋಜಿಸಿ' ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> <translation id="1477654881618305065">ಈ ವಿಷಯವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ನಿಮ್ಮ ಸಂಸ್ಥೆ ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ. ನಿಮಗೆ ಸಹಾಯದ ಅಗತ್ಯವಿದ್ದರೆ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="1478340334823509079">ವಿವರಗಳು: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">ಇನ್ಸ್ಟಾಲೇಶನ್ ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ</translation> @@ -684,7 +686,6 @@ <translation id="1521933835545997395">Android ಫೋನ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="1523279371236772909">ಕಳೆದ ತಿಂಗಳಲ್ಲಿ ವೀಕ್ಷಿಸಲಾಗಿದೆ</translation> <translation id="1523978563989812243">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಇಂಜಿನ್ಗಳು</translation> -<translation id="1524430321211440688">ಕೀಬೋರ್ಡ್</translation> <translation id="1524563461097350801">ಬೇಡ</translation> <translation id="1525740877599838384">ಸ್ಥಳವನ್ನು ನಿರ್ಧರಿಸಲು ವೈ-ಫೈ ಮಾತ್ರ ಬಳಸಿ</translation> <translation id="152629053603783244">Linux ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ</translation> @@ -883,6 +884,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">ಸ್ಥಳವನ್ನು ನಿರ್ಧರಿಸಲು ವೈ-ಫೈ ಅಥವಾ ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಬಳಸಿ</translation> <translation id="164936512206786300">ಬ್ಲೂಟೂತ್ ಸಾಧನದ ಜೋಡಿ ರದ್ದುಗೊಳಿಸಿ</translation> +<translation id="1650407365859096313">ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ, ಅನುಮತಿ <ph name="PERMISSION_STATE" /> ನಲ್ಲಿದೆ</translation> <translation id="1650801028905250434">ನನ್ನ ಡ್ರೈವ್ನಲ್ಲಿರುವ ನಿಮ್ಮ ಫೈಲ್ಗಳು ನಿಮ್ಮ Chromebook ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಿಂಕ್ ಆಗುತ್ತವೆ ಇದರಿಂದ ನೀವು ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಇಲ್ಲದೆ ಅವುಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಬಹುದು. ನೀವು ಇದನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಸೆಟ್ಟಿಂಗ್ಗಳು > ಫೈಲ್ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="1651008383952180276">ನೀವು ಒಂದೇ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ಎರಡು ಬಾರಿ ನಮೂದಿಸಬೇಕು</translation> <translation id="1651609627703324721">ಈ ಟ್ಯಾಬ್ ಹೆಡ್ಸೆಟ್ಗೆ VR ಕಂಟೆಂಟ್ ಅನ್ನು ಪ್ರಸ್ತುತಪಡಿಸುತ್ತಿದೆ</translation> @@ -1119,6 +1121,7 @@ <translation id="1828901632669367785">ಸಿಸ್ಟಂ ಸಂವಾದವನ್ನು ಬಳಸಿಕೊಂಡು ಮುದ್ರಿಸಿ...</translation> <translation id="1829129547161959350">ಪೆಂಗ್ವಿನ್</translation> <translation id="1829192082282182671">ಝೂಮ್ &ಔಟ್</translation> +<translation id="182973053761690772">ಸನ್ಸೆಟ್ ವೇಳಾಪಟ್ಟಿ</translation> <translation id="1830550083491357902">ಸೈನ್ ಇನ್ ಆಗಿಲ್ಲ</translation> <translation id="1831848493690504725">ಕನೆಕ್ಟ್ ಮಾಡಿದ ನೆಟ್ವರ್ಕ್ ಮೂಲಕ ನಾವು Google ಅನ್ನು ತಲುಪಲು ನಮಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಬೇರೆ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಥವಾ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು (ನೀವು ಪ್ರಾಕ್ಸಿಯನ್ನು ಬಳಸುತ್ತಿದ್ದರೆ) ಪರಿಶೀಲಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="1832459821645506983">ಹೌದು, ನಾನು ಸಮ್ಮತಿಸುತ್ತೇನೆ</translation> @@ -1175,6 +1178,7 @@ <translation id="1871615898038944731">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> ಗಾಗಿ ಪುನಃ ಅನುಮತಿಗಳನ್ನು ನೀಡಿ</translation> <translation id="1874248162548993294">ಯಾವುದೇ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation> +<translation id="1874794096607967241">ಕ್ಯಾಮರಾ ಅನುಮತಿಯ ಮತ್ತು ಸಿಸ್ಟಂ ಸೇವೆಗಳ ಮೂಲಕ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="1874874185178737347">ಟ್ಯಾಬ್ಗಳನ್ನು ವ್ಯವಸ್ಥಿತಗೊಳಿಸಿ</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ಟ್ಯಾಬ್ ಅನ್ನು ಬೇರೊಂದು ವಿಂಡೋಗೆ ಸರಿಸಿ}one{ಟ್ಯಾಬ್ಗಳನ್ನು ಬೇರೊಂದು ವಿಂಡೋಗೆ ಸರಿಸಿ}other{ಟ್ಯಾಬ್ಗಳನ್ನು ಬೇರೊಂದು ವಿಂಡೋಗೆ ಸರಿಸಿ}}</translation> <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" /> ಮೂಲಕ ಮಾತ್ರ ಇದನ್ನು ಸೇರಿಸಬಹುದಾಗಿದೆ</translation> @@ -1214,6 +1218,7 @@ <translation id="1901303067676059328">&ಎಲ್ಲ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="1903542130902305074">ಸೆಟಪ್</translation> <translation id="1904580727789512086">ನೀವು ಭೇಟಿ ನೀಡುವ URL ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲಾಗುತ್ತದೆ</translation> +<translation id="1904603806662441960">Chrome ನಲ್ಲಿ ಸೈಟ್ ಕ್ಯಾಮರಾ ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="1905375423839394163">Chromebook ಸಾಧನದ ಹೆಸರು</translation> <translation id="1906181697255754968">ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ, ನಿಮ್ಮ ಕೆಲಸವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಉಳಿಸುವಂತಹ ಫೀಚರ್ಗಳಿಗಾಗಿ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿರುವ ಫೈಲ್ಗಳು ಮತ್ತು ಫೋಲ್ಡರ್ಗಳನ್ನು ಪ್ರವೇಶಿಸುತ್ತವೆ</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome ವೆಬ್ ಸ್ಟೋರ್ನಲ್ಲಿ<ph name="END_LINK" /> ಇನ್ನಷ್ಟು ಎಕ್ಸ್ಟೆನ್ಶನ್ಗಳು ಮತ್ತು ಥೀಮ್ಗಳನ್ನು ಡಿಸ್ಕವರ್ ಮಾಡಿ</translation> @@ -1354,6 +1359,7 @@ <translation id="200928901437634269">ನಿಮ್ಮ ಮಗುವಿನ Google ಖಾತೆ ಅಥವಾ ಶಾಲಾ ಖಾತೆಯನ್ನು ಬಳಸಿ. ನೀವು ಪೋಷಕ ನಿಯಂತ್ರಣಗಳನ್ನು ಸಹ ಸೆಟ್ ಮಾಡಬಹುದು.</translation> <translation id="2009590708342941694">ಎಮೋಜಿ ಟೂಲ್</translation> <translation id="2010501376126504057">ಹೊಂದಾಣಿಕೆ ಸಾಧನಗಳು</translation> +<translation id="201217432804812273">"ಗುಂಪು ಸೇವ್ ಮಾಡಿ" ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> <translation id="2012935757369720523">ಫೈಲ್ ಅನ್ನು ಅಳಿಸಿ</translation> <translation id="2013550551806600826">ಇದನ್ನು ಬಳಸಿ ನೋಡಿ. ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಿ, ನಂತರ ಪರೀಕ್ಷಾ ಪ್ರದೇಶದಲ್ಲಿ ಎರಡು ಬೆರಳುಗಳಿಂದ ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ ಮೇಲೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ. ನೀವು ಇದನ್ನು ನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳು > ಸಾಧನ > ಮೌಸ್ ಮತ್ತು ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿಯೂ ಕಾಣಬಹುದು.</translation> <translation id="2015232545623037616">PC ಮತ್ತು Chromecast ಒಂದೇ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಕನೆಕ್ಟ್ ಆಗಿವೆ</translation> @@ -1777,6 +1783,7 @@ <translation id="2314165183524574721">ಪ್ರಸ್ತುತ ಗೋಚರತೆ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಲಾಗಿದೆ</translation> <translation id="2314774579020744484">ಪುಟಗಳನ್ನು ಅನುವಾದಿಸುವಾಗ ಬಳಸುವ ಭಾಷೆ</translation> <translation id="2316129865977710310">ಬೇಡ, ಧನ್ಯವಾದಗಳು</translation> +<translation id="2316433409811863464">ಆ್ಯಪ್ ಸ್ಟ್ರೀಮಿಂಗ್</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" /> % ಮುಗಿದಿದೆ</translation> <translation id="2318143611928805047">ಪೇಪರ್ ಗಾತ್ರ</translation> <translation id="2318817390901984578">Android ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬಳಸಲು, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಚಾರ್ಜ್ ಮಾಡಿ, ಅಪ್ಡೇಟ್ ಮಾಡಿ.</translation> @@ -1963,6 +1970,7 @@ <translation id="2454206500483040640">ವಿಭಜಿಸಲಾಗಿದೆ</translation> <translation id="2454247629720664989">ಕೀವರ್ಡ್</translation> <translation id="2454524890947537054">ವೆಬ್ ವಿನಂತಿಯನ್ನು ಅನುಮೋದಿಸಬೇಕೇ?</translation> +<translation id="2454913962395846391">ಸ್ವಯಂಚಾಲಿತ ಸಮಯವಲಯ</translation> <translation id="245650153866130664">ಟಿಕೆಟ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರಿಫ್ರೆಶ್ ಮಾಡಲು, "ಪಾಸ್ವರ್ಡ್ ನೆನಪಿಟ್ಟುಕೊಳ್ಳಿ" ಚೆಕ್ ಮಾರ್ಕ್ ಆರಿಸಿ. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="2456794251167091176">ಆಮದು ಪೂರ್ಣವಾಗಿದೆ</translation> <translation id="2456827790665612305">ಸೈಟ್ ಅನ್ನು ಅನುಸರಿಸಬೇಡಿ</translation> @@ -2921,6 +2929,7 @@ <translation id="3202499879214571401">ಸ್ಕ್ರೀನ್ <ph name="DEVICE_NAME" /> ಗೆ ಬಿತ್ತರಿಸುವುದನ್ನು ವಿರಾಮಗೊಳಿಸಿ</translation> <translation id="3202578601642193415">ನವನವೀನ</translation> <translation id="3204648577100496185">ಈ ಆ್ಯಪ್ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಡೇಟಾವನ್ನು ಈ ಸಾಧನದಿಂದ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ</translation> +<translation id="3205140624385017621">ಕ್ಯಾಮರಾ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್ಗಳು, ವೆಬ್ಸೈಟ್ಗಳು ಮತ್ತು ಸಿಸ್ಟಂ ಸೇವೆಗಳು ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಬಹುದು. ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು, ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕಾಗಬಹುದು ಅಥವಾ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="3207344462385471911">ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಚಟುವಟಿಕೆಯ ಆಧಾರದ ಮೇಲೆ ನಿಮಗೆ ಆಸಕ್ತಿಯಿರುವ ಸೂಚಿಸಿದ ಹುಡುಕಾಟಗಳು ಮತ್ತು ಶಾಪಿಂಗ್ ರಿಯಾಯಿತಿಗಳನ್ನು ನೀವು ನೋಡುತ್ತಿರುವಿರಿ. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3198,6 +3207,7 @@ <translation id="3434272557872943250">ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ, ಹೆಚ್ಚುವರಿ ವೆಬ್ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆಯನ್ನು ಆನ್ ಮಾಡಿದ್ದರೆ, ಈ ಡೇಟಾವನ್ನು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಬಹುದು. ಈ ಸೆಟ್ಟಿಂಗ್ಗಳ ಕುರಿತು ಮತ್ತು ಇವುಗಳನ್ನು ಹೇಗೆ ಹೊಂದಿಸುವುದು ಎಂಬ ಕುರಿತು families.google.com ನಲ್ಲಿ ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ.</translation> <translation id="3434475275396485144">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಮ್ಮ ಫೋನ್ನ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸುತ್ತಾರೆ</translation> <translation id="3434512374684753970">ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊ</translation> +<translation id="3435381311628654443">ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಯ ಮತ್ತು ಸಿಸ್ಟಂ ಸೇವೆಗಳ ಮೂಲಕ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ನಿಮ್ಮ <ph name="CODE_TYPE" /> ಅನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ</translation> <translation id="3435738964857648380">ಭದ್ರತೆ</translation> <translation id="343578350365773421">ಪೇಪರ್ ಖಾಲಿಯಾಗಿದೆ</translation> @@ -3275,6 +3285,7 @@ <translation id="3491669675709357988">ನಿಮ್ಮ ಮಗುವಿನ ಖಾತೆಯನ್ನು Family Link ಪೋಷಕ ನಿಯಂತ್ರಣಗಳಿಗಾಗಿ ಸೆಟಪ್ ಮಾಡಲಾಗಿಲ್ಲ. ನೀವು ಸೆಟಪ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ ನಂತರ ಪೋಷಕ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಬಹುದು. ಎಕ್ಸ್ಪ್ಲೋರ್ ಆ್ಯಪ್ನಲ್ಲಿ ಪೋಷಕ ನಿಯಂತ್ರಣಗಳ ಕುರಿತ ಮಾಹಿತಿಯನ್ನು ನೀವು ಕಾಣಬಹುದು.</translation> <translation id="3491678231052507920">ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ, ನಿಮ್ಮನ್ನು VR ಸೆಷನ್ಗೆ ಪ್ರವೇಶಿಸುವಂತೆ ಮಾಡಲು ನಿಮ್ಮ ವರ್ಚುವಲ್ ರಿಯಾಲಿಟಿ ಸಾಧನಗಳು ಹಾಗೂ ಡೇಟಾವನ್ನು ಬಳಸಿಕೊಳ್ಳುತ್ತವೆ</translation> <translation id="3493043608231401654">ಟ್ಯಾಬ್ ಗುಂಪಿನಿಂದ <ph name="TAB_TITLE" /> ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation> +<translation id="3493463599276143766">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಯಾವುದೇ ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಯಿಲ್ಲ</translation> <translation id="3493486281776271508">ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕದ ಅಗತ್ಯವಿದೆ</translation> <translation id="3493881266323043047">ವಾಯಿದೆ</translation> <translation id="3495496470825196617">ಚಾರ್ಜ್ ಆಗುವಾಗ ನಿಷ್ಕ್ರಿಯ ಶಕ್ತಿ</translation> @@ -3594,6 +3605,7 @@ <translation id="3733296813637058299">ನಿಮಗಾಗಿ ಆ ನಾವು ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುತ್ತೇವೆ. ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಗಾಗಿ ನೀವು ಹೆಚ್ಚಿನ ಆ್ಯಪ್ಗಳನ್ನು Play Store ನಲ್ಲಿ ಕಂಡುಕೊಳ್ಳಬಹುದು.</translation> <translation id="3735039640698208086">ಆಡಿಯೋ ಪ್ಲೇ ಆಗುತ್ತಿರುವಾಗ...</translation> <translation id="3735740477244556633">ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ</translation> +<translation id="3735827758948958091">ಮೀಟರ್ಡ್ ಕನೆಕ್ಷನ್ನಲ್ಲಿರುವಾಗ <ph name="FILE_NAMES" /> ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> ಡೇಟಾವನ್ನು 24 ಗಂಟೆಗಳಲ್ಲಿ ಅಳಿಸಲಾಗುತ್ತದೆ</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> ತೆರೆಯುವುದೇ?</translation> @@ -3862,6 +3874,7 @@ <translation id="3925573269917483990">ಕ್ಯಾಮರಾ:</translation> <translation id="3925926055063465902">ಈ ಸಾಧನದಲ್ಲಿರುವ ಇತರ ಬಳಕೆದಾರರು ಸಹ ಈ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಬಳಸಬಹುದು</translation> <translation id="3926002189479431949">Smart Lock ಫೋನ್ ಬದಲಾಯಿಸಲಾಗಿದೆ</translation> +<translation id="3926410220776569451">ಕ್ಯಾಮರಾ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="3927932062596804919">ನಿರಾಕರಿಸಿ</translation> <translation id="3928570707778085600"><ph name="FILE_OR_FOLDER_NAME" /> ಗೆ ಮಾಡಿರುವ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಬೇಕೆ?</translation> <translation id="3928659086758780856">ಇಂಕ್ ಪ್ರಮಾಣ ಕಡಿಮೆಯಿದೆ</translation> @@ -3917,7 +3930,6 @@ <translation id="3966072572894326936">ಮತ್ತೊಂದು ಫೋಲ್ಡರ್ ಆಯ್ಕೆ ಮಾಡಿ...</translation> <translation id="3966094581547899417">ಹಾಟ್ಸ್ಪಾಟ್ ವಿವರಗಳು</translation> <translation id="3967822245660637423">ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> -<translation id="3967841595862839006">ನಿಮ್ಮ ಭಾಷೆ ಮತ್ತು ಕೀಬೋರ್ಡ್ ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="3968739731834770921">ಕನಾ</translation> <translation id="3970114302595058915">ಐಡಿ</translation> <translation id="397105322502079400">ಎಣಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -4057,6 +4069,7 @@ <translation id="4078738236287221428">ಆಕ್ರಮಣಕಾರಿ</translation> <translation id="4078903002989614318">ವಿಂಗಡಣೆ ಮತ್ತು ಪಟ್ಟಿಯ ಆಯ್ಕೆಗಳು</translation> <translation id="4079140982534148664">ವರ್ಧಿತ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸಿ</translation> +<translation id="4082333918978320301">ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಬಳಸಲು ಯಾವುದೇ ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಯಿಲ್ಲ</translation> <translation id="4084582735848141214">{COUNT,plural, =1{1 ಸೈಟ್ ಅನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ}one{# ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ}other{# ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ}}</translation> <translation id="4084682180776658562">ಬುಕ್ಮಾರ್ಕ್</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> ಮುಚ್ಚಿ</translation> @@ -4206,6 +4219,7 @@ <translation id="4201546031411513170">ನೀವು ಏನನ್ನು ಸಿಂಕ್ ಮಾಡಬೇಕು ಎಂಬುದನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಯಾವಾಗ ಬೇಕಾದರೂ ಆರಿಸಿಕೊಳ್ಳಬಹುದು.</translation> <translation id="4203065553461038553">ಫೈಲ್ ಹೆಸರು ಅಥವಾ ಸ್ಥಳ ತುಂಬಾ ಉದ್ದವಾಗಿದೆ</translation> <translation id="4203769790323223880">ಕ್ಯಾಮರಾವನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ</translation> +<translation id="4204415812590935863">ಇದೀಗ ಥೀಮ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="4205157409548006256">Linux ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವಾಗ ದೋಷ ಕಂಡುಬಂದಿದೆ.</translation> <translation id="4206144641569145248">ಏಲಿಯನ್</translation> <translation id="4206323443866416204">ಪ್ರತಿಕ್ರಿಯೆ ವರದಿ</translation> @@ -4547,6 +4561,7 @@ <translation id="447252321002412580">Chrome ನ ವೈಶಿಷ್ಟ್ಯಗಳು ಹಾಗೂ ಕೆಲಸ ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation> <translation id="4472533928615930332"><ph name="SUBJECT" /> ನ <ph name="INDEX" /> ಚಿತ್ರವನ್ನು <ph name="STYLE" /> ಶೈಲಿಯಲ್ಲಿ ರಚಿಸಲಾಗಿದೆ</translation> <translation id="4472575034687746823">ಪ್ರಾರಂಭಿಸಿ</translation> +<translation id="4473559657152613417">ಟ್ಯಾಬ್ ಮೇಲೆ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿ ಹಾಗೂ "ಹೊಸ ಗುಂಪಿಗಾಗಿ ಟ್ಯಾಬ್ ಸೇರಿಸಿ" ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="4473996011558324141">ಸಮಯವನ್ನು ಅಂದಾಜು ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="4474155171896946103">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡು...</translation> <translation id="4475552974751346499">ಡೌನ್ಲೋಡ್ಗಳು ಹುಡುಕಿ</translation> @@ -4598,7 +4613,6 @@ <translation id="4513872120116766993">ಮುನ್ಸೂಚಕ ಬರವಣಿಗೆ</translation> <translation id="4513946894732546136">ಪ್ರತಿಕ್ರಿಯೆ</translation> <translation id="4515872537870654449">ದುರಸ್ತಿಗಾಗಿ ಡೆಲ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ. ಫ್ಯಾನ್ ಕೆಲಸ ಮಾಡದಿದ್ದರೆ ಡಾಕ್ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ.</translation> -<translation id="4516008165284813420">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಆಗಿದೆ ಎಂದು ಖಾತ್ರಿಪಡಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ. ನೀವು ಬೇರೊಂದು ಸಾಧನದಲ್ಲಿ play.google.com/about/play-terms ಗೆ ಸಹ ಭೇಟಿ ನೀಡಬಹುದು.</translation> <translation id="4518840066030486079">Shift ಕೀ ಮೋಡ್ ಸ್ಟೈಲ್</translation> <translation id="4519331665958994620">ಸೈಟ್ಗಳು ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಕೇಳಬಹುದು</translation> <translation id="4519605771716872386">ಫೈಲ್ ಸಿಂಕ್ ಆನ್ ಮಾಡಲಾಗಿದೆ</translation> @@ -4642,6 +4656,7 @@ <translation id="4547672827276975204">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹೊಂದಿಸಿ</translation> <translation id="4548858987594081919">ಸೈನ್-ಇನ್ ಮಾಹಿತಿಯನ್ನು ಸೇವ್ ಮಾಡಲು Google Password Manager ಗೆ ಸಹಾಯ ಮಾಡಲು, ಈ ಸೈಟ್ಗೆ ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ಸೇರಿಸಿ</translation> <translation id="4549791035683739768">ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಯಲ್ಲಿ ಯಾವುದೇ ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಳನ್ನು ಸಂಗ್ರಹಣೆ ಮಾಡಿಲ್ಲ</translation> +<translation id="4550737096585299960">ಕೆಲವು ನಿಮಿಷಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="4550926046134589611">ಕೆಲವು ಬೆಂಬಲಿಸಿದ ಲಿಂಕ್ಗಳು <ph name="APP_NAME" /> ನಲ್ಲಿ ಈಗಲೂ ಲಭ್ಯವಿರುತ್ತವೆ.</translation> <translation id="4551379727767354516">ನಿಮ್ಮ ಇತ್ತೀಚಿನ AI ಥೀಮ್ಗಳು</translation> <translation id="4551763574344810652">ರದ್ದುಮಾಡಲು <ph name="MODIFIER_KEY_DESCRIPTION" /> ಅನ್ನು ಒತ್ತಿರಿ</translation> @@ -5267,6 +5282,7 @@ <translation id="5051461727068120271">ಪರಿಶೀಲಿಸದ ಫೈಲ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="5051836348807686060">ನೀವು ಆಯ್ಕೆ ಮಾಡಿರುವ ಭಾಷೆಗಳಲ್ಲಿ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation> <translation id="5052499409147950210">ಸೈಟ್ ಎಡಿಟ್ ಮಾಡಿ</translation> +<translation id="5052853071318006357">ಟ್ಯಾಬ್ ಮೇಲೆ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿ ಹಾಗೂ "ಹೊಸ ಗುಂಪಿಗಾಗಿ ಟ್ಯಾಬ್ ಸೇರಿಸಿ" ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="5053233576223592551">ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ಸೇರಿಸಿ</translation> <translation id="505347685865235222">ಹೆಸರಿಸದ ಗುಂಪು - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />Chrome ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ<ph name="END_LINK" /> ಎಂಬಲ್ಲಿ ಎಲ್ಲಾ ಕಾರ್ಡ್ ಆಯ್ಕೆಗಳನ್ನು ನೋಡಿ</translation> @@ -5303,6 +5319,7 @@ <translation id="5078638979202084724">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ</translation> <translation id="5078796286268621944">ತಪ್ಪಾದ PIN</translation> <translation id="5079010647467150187">ಬಿಲ್ಟ್-ಇನ್ VPN ಸೇರಿಸಿ...</translation> +<translation id="5079460277417557557">ನೀವು ಈಗ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದ ಡೆಸ್ಕ್ಟಾಪ್ ಸಾಧನಗಳಾದ್ಯಂತ ಸೇವ್ ಮಾಡಿದ ಟ್ಯಾಬ್ ಗುಂಪುಗಳನ್ನು ಬಳಸಬಹುದು</translation> <translation id="5079699784114005398">ಆನ್ ಮಾಡಿದ ನಂತರ, ನಿಮ್ಮ Google ಖಾತೆಯ ಮೂಲಕ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದ ನಂತರ ನಿಮ್ಮ ಆ್ಯಪ್ಗಳು ಯಾವುದೇ ChromeOS ಸಾಧನಗಳಲ್ಲಿ ಲಭ್ಯವಿರುತ್ತವೆ. ಬ್ರೌಸರ್ ಸಿಂಕ್ ಅನ್ನು ಆಫ್ ಮಾಡಿದರೂ Chrome ಬ್ರೌಸರ್ನಿಂದ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾದ ವೆಬ್ ಆ್ಯಪ್ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="508059534790499809">Kerberos ಟಿಕೆಟ್ ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> <translation id="5081124414979006563">ಅತಿಥಿ ಪ್ರೊಫೈಲ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation> @@ -5366,6 +5383,7 @@ <translation id="5125967981703109366">ಈ ಕಾರ್ಡ್ನ ಕುರಿತು</translation> <translation id="512642543295077915">ಹುಡುಕಾಟ + backspace</translation> <translation id="5126611267288187364">ಬದಲಾವಣೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation> +<translation id="512761462447738469">ಕ್ಯಾಮರಾ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್ಗಳು, ವೆಬ್ಸೈಟ್ಗಳು ಮತ್ತು ಸಿಸ್ಟಂ ಸೇವೆಗಳು ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಬಹುದು</translation> <translation id="5127620150973591153">ಭದ್ರತಾ ಸಂಪರ್ಕ ಐಡಿ: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ</translation> <translation id="5127881134400491887">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> @@ -6072,6 +6090,7 @@ <translation id="5691581861107245578">ನೀವು ಏನನ್ನು ಟೈಪ್ ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂಬುದರ ಆಧಾರದ ಮೇಲೆ ಎಮೋಜಿಯ ಸಲಹೆಗಳನ್ನು ಪಡೆಯಿರಿ</translation> <translation id="5691772641933328258">ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> <translation id="5692183275898619210">ಪ್ರಿಂಟ್ ಮಾಡುವುದು ಪೂರ್ಣಗೊಂಡಿದೆ</translation> +<translation id="5693237475389615913">Chrome ನಲ್ಲಿ ಸೈಟ್ ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="5693255400847650006">ಮೈಕ್ರೊಫೋನ್ ಬಳಕೆಯಲ್ಲಿದೆ</translation> <translation id="5695184138696833495">Linux Android ಆ್ಯಪ್ ADB</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" ನಿಂದ ದುರುಪಯೋಗವನ್ನು ವರದಿ ಮಾಡಿ</translation> @@ -6093,6 +6112,7 @@ <translation id="5708171344853220004">Microsoft Principal ಹೆಸರು</translation> <translation id="5709557627224531708">Chrome ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ರೂಪದಲ್ಲಿ ಹೊಂದಿಸಿ</translation> <translation id="5711010025974903573">ಸೇವಾ ಲಾಗ್ಗಳು</translation> +<translation id="5711324642850167289">ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಬಳಸಲು ಯಾವುದೇ ಆ್ಯಪ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="5711983031544731014">ಅನ್ಲಾಕ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ.</translation> <translation id="5712153969432126546">ಸೈಟ್ಗಳು ಕೆಲವೊಮ್ಮೆ ಡಾಕ್ಯುಮೆಂಟ್ಗಳು, ಒಪ್ಪಂದಗಳು ಮತ್ತು ಫಾರ್ಮ್ಗಳಂತಹ PDF ಗಳನ್ನು ಪ್ರಕಟಿಸುತ್ತವೆ</translation> <translation id="571222594670061844">ಸೈಟ್ಗಳು ಗುರುತಿನ ಸೇವೆಗಳ ಸೈನ್ ಇನ್ ಪ್ರಾಂಪ್ಟ್ಗಳನ್ನು ತೋರಿಸಬಲ್ಲವು</translation> @@ -6284,6 +6304,7 @@ <translation id="5862319196656206789">ಕನೆಕ್ಟ್ ಮಾಡಿದ ಸಾಧನಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಿ</translation> <translation id="5862731021271217234">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಿಂದ ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation> <translation id="5863195274347579748">ಬಾಹ್ಯ ಪರಿಕರಗಳು ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಅಥವಾ ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗಬಹುದು.</translation> +<translation id="5863263400083022538">ಸಿಸ್ಟಂ ಸೇವೆಗಳು</translation> <translation id="5863445608433396414">ಡೀಬಗ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="5863515189965725638">IBAN ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="5864195618110239517">ಮಾಪನ ಮಾಡಿದ ಸಂಪರ್ಕವನ್ನು ಬಳಸಿ</translation> @@ -6723,6 +6744,7 @@ <translation id="6207937957461833379">ರಾಷ್ಟ್ರ/ಪ್ರದೇಶ</translation> <translation id="6208521041562685716">ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> ಗೆ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ - <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">ಮೈಕ್ರೋಫೋನ್ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳು ಹಾಗೂ ಸಿಸ್ಟಂ ಸೇವೆಗಳು ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸಬಹುದು</translation> <translation id="6209838773933913227">ಕಾಂಪೊನೆಂಟ್ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="6209908325007204267">ನಿಮ್ಮ ಸಾಧನವು Chrome ಎಂಟರ್ಪ್ರೈಸ್ ಅಪ್ಗ್ರೇಡ್ ಅನ್ನು ಒಳಗೊಂಡಿದೆ, ಆದರೆ ನಿಮ್ಮ ಬಳಕೆದಾರರ ಹೆಸರು ಯಾವುದೇ ಎಂಟರ್ಪ್ರೈಸ್ ಖಾತೆಯ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿಲ್ಲ. ಸೆಕೆಂಡರಿ ಸಾಧನದಲ್ಲಿ g.co/ChromeEnterpriseAccount ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ಎಂಟರ್ಪ್ರೈಸ್ ಖಾತೆಯನ್ನು ರಚಿಸಿ.</translation> <translation id="6210282067670792090">ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ, ಹುಡುಕಾಟ ಎಂಜಿನ್ಗಳು ಮತ್ತು ಸೈಟ್ ಹುಡುಕಾಟಕ್ಕಾಗಿ ಶಾರ್ಟ್ಕಟ್ಗಳ ಜೊತೆಗೆ ಈ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಬಳಸಿ</translation> @@ -7057,6 +7079,7 @@ <translation id="6478248366783946499">ಅಪಾಯಕಾರಿ ಫೈಲ್ ಇರಿಸುವುದೇ?</translation> <translation id="6479881432656947268">Chrome ವೆಬ್ ಸ್ಟೋರ್ಗೆ ಭೇಟಿ ನೀಡಿ</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation> +<translation id="6481749622989211463">ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಗಳೊಂದಿಗೆ ಫೈಲ್ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ಹಂಚಿಕೊಳ್ಳಿ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="6482559668224714696">ಪೂರ್ಣಪರದೆ ವರ್ಧಕ</translation> <translation id="6483485061007832714">ಡೌನ್ಲೋಡ್ ತೆರೆಯಿರಿ</translation> <translation id="6483805311199035658"><ph name="FILE" /> ತೆರೆಯುತ್ತಿದೆ...</translation> @@ -7307,6 +7330,7 @@ <translation id="6680650203439190394">ದರ</translation> <translation id="6683022854667115063">ಹೆಡ್ಫೋನ್ಗಳು</translation> <translation id="6683087162435654533">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಿ</translation> +<translation id="6683433919380522900">ಅನುಮತಿ <ph name="PERMISSION_STATE" /> ನಲ್ಲಿದೆ</translation> <translation id="6684827949542560880">ಇತ್ತೀಚಿನ ಅಪ್ಡೇಟ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="668599234725812620">Google Play ತೆರೆಯಿರಿ</translation> <translation id="6686490380836145850">ಬಲಗಡೆಗೆ ಟ್ಯಾಬ್ ಅನ್ನು ಮುಚ್ಚಿರಿ</translation> @@ -8122,6 +8146,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> ಖಾತೆಯ ಅಡಿಯಲ್ಲಿ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿರುವ <ph name="USER_EMAIL" /> ಅವರ ಸಾಧನಕ್ಕಾಗಿ <ph name="FEATURE_NAME" /> ಸೆಟ್ಟಿಂಗ್ಗಳು.</translation> <translation id="7331646370422660166">alt + ಡೌನ್ ಆ್ಯರೋ</translation> <translation id="7332053360324989309">ಮೀಸಲು ಕೆಲಸಗಾರ: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">ಮೀಟರ್ಡ್ ಕನೆಕ್ಷನ್ನಲ್ಲಿರುವಾಗ ಫೈಲ್ಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="7333669215417470379">ನಿಮ್ಮ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿ ಮತ್ತು ಮರುಸ್ಥಾಪಿಸಿ</translation> <translation id="7335436113423103413">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದಲ್ಲಿ ಏಕೀಕೃತ ಸೈಡ್ ಪ್ಯಾನೆಲ್ನಿಂದ Chrome ನ ಹೊಂದಾಣಿಕೆಯ ಕಾರ್ಯಚಟುವಟಿಕೆಯನ್ನು ಬಳಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="7335974957018254119">ಈ ಭಾಷೆಗಳಿಗಾಗಿ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸಿ</translation> @@ -8277,6 +8302,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome ವೆಬ್ ಸ್ಟೋರ್ನಿಂದ ತೆಗೆದುಹಾಕಲಾದ 1 ವಿಸ್ತರಣೆಯನ್ನು ಪರಿಶೀಲಿಸಿ}one{Chrome ವೆಬ್ ಸ್ಟೋರ್ನಿಂದ ತೆಗೆದುಹಾಕಲಾದ {NUM_EXTENSIONS} ವಿಸ್ತರಣೆಗಳನ್ನು ಪರಿಶೀಲಿಸಿ}other{Chrome ವೆಬ್ ಸ್ಟೋರ್ನಿಂದ ತೆಗೆದುಹಾಕಲಾದ {NUM_EXTENSIONS} ವಿಸ್ತರಣೆಗಳನ್ನು ಪರಿಶೀಲಿಸಿ}}</translation> <translation id="7436921188514130341">ಓಹ್, ಹೋಯ್ತು! ಮರುಹೆಸರಿಸುವ ಸಂದರ್ಭದಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ.</translation> <translation id="7439519621174723623">ಮುಂದುವರಿಸಲು ಸಾಧನದ ಹೆಸರನ್ನು ಸೇರಿಸಿ</translation> +<translation id="7441736532026945583">ನಿಮ್ಮ ಟ್ಯಾಬ್ ಸ್ಟ್ರೈಪ್ನಿಂದ ಗುಂಪನ್ನು ತೆಗೆದುಹಾಕಲು "ಗುಂಪನ್ನು ಮರೆಮಾಡಿ" ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="7441736921018636843">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು, ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲು <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಮರುಹೊಂದಿಸಿ<ph name="END_LINK" /></translation> <translation id="7441830548568730290">ಇತರ ಬಳಕೆದಾರರು</translation> <translation id="744341768939279100">ಹೊಸ ಪ್ರೊಫೈಲ್ ರಚಿಸಿ</translation> @@ -8876,6 +8902,7 @@ <translation id="7887864092952184874">ಬ್ಲೂಟೂತ್ ಮೌಸ್ ಜೋಡಿಯಾಗಿದೆ</translation> <translation id="7889371445710865055">ಉಕ್ತಲೇಖನ ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಿ</translation> <translation id="7890147169288018054">ನೆಟ್ವರ್ಕ್ ಮಾಹಿತಿಯನ್ನು ನೋಡಿ, ಉದಾಹರಣೆಗೆ ನಿಮ್ಮ IP ಅಥವಾ MAC ವಿಳಾಸ</translation> +<translation id="7892005672811746207">"ಗುಂಪು ಸೇವ್ ಮಾಡಿ" ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> <translation id="7892384782944609022">ಜೋಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಲು ಸಾಧನವನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation> <translation id="7893008570150657497">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಿಂದ ಫೋಟೋಗಳು, ಸಂಗೀತ ಮತ್ತು ಇತರೆ ಮಾಧ್ಯಮ ಪ್ರವೇಶಿಸಿ</translation> <translation id="7893153962594818789">ಈ <ph name="DEVICE_TYPE" /> ನಲ್ಲಿ ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ. ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ ಮತ್ತು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ.</translation> @@ -9116,6 +9143,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">ಗುಂಪು <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">ಕನೆಕ್ಷನ್ ಡೈಲಾಗ್</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> ಸ್ಥಳದ ಅನುಮತಿ</translation> <translation id="8070662218171013510">ಸ್ಪರ್ಶ ಪ್ರತಿಕ್ರಿಯೆ</translation> <translation id="8071432093239591881">ಚಿತ್ರದಂತೆ ಪ್ರಿಂಟ್ ಮಾಡಿ</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />ಆ್ಯಪ್ ಡೇಟಾವು ಸಂಪರ್ಕಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಫೋಟೋಗಳಂತಹ ಡೇಟಾ ಸೇರಿದಂತೆ, ಆ್ಯಪ್ ಉಳಿಸಿರುವಂತಹ (ಡೆವಲಪರ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆಧರಿಸಿ) ಯಾವುದೇ ಡೇಟಾ ಆಗಿರಬಹುದು.<ph name="END_PARAGRAPH1" /> @@ -9174,6 +9202,7 @@ <translation id="8109991406044913868">AI ರಚಿಸಿದ ಥೀಮ್</translation> <translation id="8110393529211831722">ಸಬ್ಸ್ಕ್ರಿಪ್ಶನ್ ಅನ್ನು ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು ನಿಮ್ಮ ಖಾತೆಯಡಿಯಲ್ಲಿರುವ ಇತರ ಸಾಧನಗಳ ಜೊತೆಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗಿಲ್ಲ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="8110489095782891123">ಸಂಪರ್ಕ ಪಟ್ಟಿಯನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿ</translation> <translation id="8115139559594092084">ನಿಮ್ಮ Google Drive ನಿಂದ</translation> <translation id="8116972784401310538">&ಬುಕ್ಮಾರ್ಕ್ ವ್ಯವಸ್ಥಾಪಕ</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> ನೀವು ಹೇಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದೀರಿ ಎಂಬುದನ್ನು ನೆನಪಿಸುತ್ತದೆ ಮತ್ತು ಸಾಧ್ಯವಾದಾಗ ನಿಮ್ಮನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡುತ್ತದೆ. ಆಫ್ ಆಗಿರುವಾಗ, ಪ್ರತಿ ಬಾರಿ ದೃಢೀಕರಣಕ್ಕಾಗಿ ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.</translation> @@ -9389,6 +9418,7 @@ <translation id="8275038454117074363">ಆಮದು</translation> <translation id="8275080796245127762">ನಿಮ್ಮ ಸಾಧನದಿಂದ ಕರೆ ಮಾಡಿ</translation> <translation id="8275339871947079271">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸರಿಸಿ, ಇದರಿಂದ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಲ್ಲೆಲ್ಲಾ ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಪ್ರವೇಶಿಸಬಹುದು</translation> +<translation id="8276242035951017580">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಯಾವುದೇ ಆ್ಯಪ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="8276560076771292512">ಖಾಲಿ ಕ್ಯಾಷ್ ಮತ್ತು ಹಾರ್ಡ್ ಮರುಲೋಡ್</translation> <translation id="8276850948802942358">ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್ಗೆ ತಾತ್ಕಾಲಿಕ ಅನುಮತಿಯನ್ನು ನೀಡುವ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> <translation id="828180235270931531">ಇತರ ಲಭ್ಯವಿರುವ ಪ್ರಿಂಟರ್ಗಳು</translation> @@ -9407,6 +9437,7 @@ <translation id="8291942417224950075">ವೈಯಕ್ತಿಕ ಬಳಕೆಗಾಗಿ</translation> <translation id="8293206222192510085">ಬುಕ್ಮಾರ್ಕ್ ಸೇರಿಸು</translation> <translation id="8294431847097064396">ಮೂಲ</translation> +<translation id="8294476140219241086">ಟ್ಯಾಬ್ ಆಯೋಜಕ</translation> <translation id="8294895455164415895">ಟ್ಯಾಬ್ ಗುಂಪುಗಳನ್ನು ಸೂಚಿಸುವುದಕ್ಕೆ Chrome ಅನ್ನು ಅನುಮತಿಸಲು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="8295449579927246485">ಲೈವ್ ಅನುವಾದ</translation> <translation id="8295450130892483256">Microsoft 365 ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ</translation> @@ -9519,6 +9550,7 @@ <translation id="8380266723152870797">ವಿಂಡೋ ಹೆಸರು</translation> <translation id="8380941800586852976">ಅಪಾಯಕಾರಿ</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> ಆನ್ ಮಾಡಿ</translation> +<translation id="8382197851871630452">ಸ್ಥಳೀಯ ಹವಾಮಾನ</translation> <translation id="8382677870544805359">ಎಂಟರ್ಪ್ರೈಸ್ ಫೀಚರ್ಗಳನ್ನು ಬಳಸಲು ನೀವು ಈ ಸಾಧನವನ್ನು ಫ್ಯಾಕ್ಟರಿ ರೀಸೆಟ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="8382715499079447151">ವೀಕ್ಷಣೆ ಸುರಕ್ಷತೆ</translation> <translation id="8382913212082956454">ಇಮೇಲ್ &ವಿಳಾಸವನ್ನು ನಕಲು ಮಾಡಿ</translation> @@ -9709,6 +9741,7 @@ <translation id="8528962588711550376">ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation> <translation id="8529578450330869579">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಟ್ರಾಫಿಕ್ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುವ ಜನರನ್ನು ನೀವು ಭೇಟಿ ನೀಡುವ ಸೈಟ್ಗಳನ್ನು ನೋಡದಂತೆ ತಡೆಯಲು ಸುರಕ್ಷಿತ ಡೊಮೇನ್ ಹೆಸರು ಸಿಸ್ಟಮ್ (DNS) ಅನ್ನು ಬಳಸಿ. ಇದು <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> ನಲ್ಲಿ ನಿರ್ವಹಿಸಲಾದ ಸೇವೆ ಒದಗಿಸುವವರನ್ನು ಬಳಸುತ್ತದೆ</translation> <translation id="8529925957403338845">ತತ್ಕ್ಷಣ ಟೆಥರಿಂಗ್ ಸಂಪರ್ಕ ವಿಫಲಗೊಂಡಿದೆ</translation> +<translation id="8531367864749403520">ನಿಮ್ಮ ಟ್ಯಾಬ್ ಸ್ಟ್ರೈಪ್ನಿಂದ ಗುಂಪನ್ನು ತೆಗೆದುಹಾಕಲು "ಗುಂಪನ್ನು ಮರೆಮಾಡಿ" ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="8531701051932785007">ವರ್ಧಿತ ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಆಫ್ ಆಗಿದೆ</translation> <translation id="8533670235862049797">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಆನ್ ಆಗಿದೆ</translation> <translation id="8534656636775144800">ಓಹ್! ಡೊಮೇನ್ ಅನ್ನು ಸೇರಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ ಏನೋ ದೋಷ ಸಂಭವಿಸಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> @@ -9835,6 +9868,7 @@ <translation id="8639635302972078117">ಬಳಕೆ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸಿ. ಪ್ರಸ್ತುತ, ಈ ಸಾಧನವು ಡಯಾಗ್ನಾಸ್ಟಿಕ್, ಸಾಧನ ಹಾಗೂ ಆ್ಯಪ್ ಬಳಕೆಯ ಡೇಟಾವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ Google ಗೆ ಕಳುಹಿಸುತ್ತಿದೆ. ನಿಮ್ಮ ಮಗುವನ್ನು ಗುರುತಿಸಲು ಈ ಡೇಟಾವನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ, ಹಾಗೂ ಇದು ಸಿಸ್ಟಂ ಮತ್ತು ಆ್ಯಪ್ನ ಸ್ಥಿರತೆ, ಹಾಗೂ ಇತರ ಸುಧಾರಣೆಗಳಿಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಒಟ್ಟುಗೂಡಿಸಲಾದ ಕೆಲವೊಂದು ಡೇಟಾ, Google ಆ್ಯಪ್ಗಳಿಗೆ ಮತ್ತು Android ಡೆವಲಪರ್ಗಳಂತಹ ಪಾಲುದಾರರಿಗೂ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ನಿಮ್ಮ ಮಗುವಿಗಾಗಿ, ಹೆಚ್ಚುವರಿ ವೆಬ್ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆಯನ್ನು ಆನ್ ಮಾಡಿದ್ದರೆ, ಈ ಡೇಟಾವನ್ನು ಅವರ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಬಹುದು.</translation> <translation id="8640575194957831802">ಕೊನೆಯದಾಗಿ ತೆರೆದಿರುವುದು</translation> <translation id="8641946446576357115">ನಿಮ್ಮ iOS ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಿ</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> ಕ್ಯಾಮರಾ ಅನುಮತಿ</translation> <translation id="8642900771896232685">2 ಸೆಕೆಂಡುಗಳು</translation> <translation id="8642947597466641025">ಪಠ್ಯವನ್ನು ದೊಡ್ಡದಾಗಿಸಿ</translation> <translation id="8643403533759285912">ಗುಂಪನ್ನು ಅಳಿಸಿ</translation> @@ -9869,6 +9903,7 @@ <translation id="8662978096466608964">Chrome ಗೆ ವಾಲ್ಪೇಪರ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="8663051876219324457">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಬಳಸಲು ಆ್ಯಪ್ಗಳು, ವೆಬ್ಸೈಟ್ಗಳು ಮತ್ತು ಸಿಸ್ಟಮ್ ಸೇವೆಗಳಿಗೆ ಅನುಮತಿಸಿ. ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಅಂದಾಜು ಮಾಡಲು ಸಹಾಯ ಮಾಡುವುದಕ್ಕಾಗಿ ಸ್ಥಳವು ವೈ-ಫೈ, ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು ಮತ್ತು ಸೆನ್ಸರ್ಗಳಂತಹ ಮೂಲಗಳನ್ನು ಬಳಸಬಹುದು. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> ರಲ್ಲಿ ಯಾವಾಗಲೂ ಬಹು ಸ್ವಯಂಚಾಲಿತ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸು</translation> +<translation id="8664249499245357248">ಗುಂಪಿನ ಹೆಸರಿನ ಮೇಲೆ ಬಲ ಕ್ಲಿಕ್ ಮಾಡಿ</translation> <translation id="8664389313780386848">ಫ್ರೇಮ್ ಮೂಲವನ್ನು &ವೀಕ್ಷಿಸಿ</translation> <translation id="8665110742939124773">ನೀವು ತಪ್ಪಾದ ಆ್ಯಕ್ಸೆಸ್ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8665180165765946056">ಬ್ಯಾಕಪ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> @@ -10194,6 +10229,7 @@ <translation id="8900413463156971200">ಸೆಲ್ಯುಲರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಬೇಕೆಂದು ಮತ್ತು ಇಂದೇ ಈ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ.}one{ಗಡುವಿನ ಮೊದಲು ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಬೇಕೆಂದು ಮತ್ತು ಇಂದೇ ಈ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ.}other{ಗಡುವಿನ ಮೊದಲು ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಬೇಕೆಂದು ಮತ್ತು ಇಂದೇ ಈ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕೆಂದು <ph name="MANAGER" /> ಬಯಸುತ್ತದೆ.}}</translation> <translation id="8902667442496790482">ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ಆಲಿಸಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ</translation> +<translation id="8903733144777177139">ಮೈಕ್ರೊಫೋನ್ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="890616557918890486">ಮೂಲವನ್ನು ಬದಲಿಸಿ</translation> <translation id="8907701755790961703">ದಯವಿಟ್ಟು ದೇಶವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="8908420399006197927">ಸೂಚಿಸಿದ ಗುಂಪಿನಿಂದ ಟ್ಯಾಬ್ ಅನ್ನು ಹೊರತುಪಡಿಸಿ</translation> @@ -10231,6 +10267,7 @@ <translation id="8934732568177537184">ಮುಂದುವರಿಸು</translation> <translation id="8938800817013097409">USB-C ಸಾಧನ (ಹಿಂಭಾಗದಲ್ಲಿನ ಬಲ ಪೋರ್ಟ್)</translation> <translation id="8940081510938872932">ಇದೀಗ ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅತಿ ಹೆಚ್ಚು ವಿಷಯಗಳನ್ನು ಸಲ್ಲಿಸುತ್ತಿದೆ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="8940228279218723234">ಕ್ಯಾಮರಾ ಅನುಮತಿಯ ಮತ್ತು ಸಿಸ್ಟಂ ಸೇವೆಗಳ ಮೂಲಕ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಅನುಮತಿಸಿ. ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು, ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕಾಗಬಹುದು ಅಥವಾ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="8940381019874223173">ನಿಮ್ಮ Google Photos ನಲ್ಲಿರುವುದು</translation> <translation id="8940888110818450052">ಸೈನ್ ಇನ್ ಆಯ್ಕೆಗಳು</translation> <translation id="8941173171815156065">'<ph name="PERMISSION" />' ಅನುಮತಿಯನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index cb9a12c..d95feeb 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Android 휴대전화에 연결됨</translation> <translation id="1523279371236772909">지난달에 확인함</translation> <translation id="1523978563989812243">텍스트 음성 변환 엔진</translation> -<translation id="1524430321211440688">키보드</translation> <translation id="1524563461097350801">나중에</translation> <translation id="1525740877599838384">위치 파악에 Wi-Fi만 사용</translation> <translation id="152629053603783244">Linux 다시 시작</translation> @@ -3925,7 +3924,6 @@ <translation id="3966072572894326936">다른 폴더 선택...</translation> <translation id="3966094581547899417">핫스팟 세부정보</translation> <translation id="3967822245660637423">다운로드 완료</translation> -<translation id="3967841595862839006">언어 및 키보드 선택</translation> <translation id="3968739731834770921">가나</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">계산 중...</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">예측 입력</translation> <translation id="4513946894732546136">문제 신고</translation> <translation id="4515872537870654449">Dell에 문의하여 서비스를 받으세요. 팬이 작동하지 않으면 도크가 종료됩니다.</translation> -<translation id="4516008165284813420"><ph name="DEVICE_TYPE" /> 기기가 인터넷에 연결되었는지 확인하고 다시 시도하세요. 다른 기기에서 play.google.com/about/play-terms 페이지를 방문할 수도 있습니다.</translation> <translation id="4518840066030486079">Shift 키 모드 스타일</translation> <translation id="4519331665958994620">사이트에서 카메라 사용을 요청할 수 있음</translation> <translation id="4519605771716872386">파일 동기화 사용 설정됨</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index a27c151..11f6448a29 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -343,6 +343,7 @@ <translation id="1251578593170406502">Мобилдик тармактар изделүүдө...</translation> <translation id="125220115284141797">Демейки</translation> <translation id="1252219782845132919">Топту жашыруу</translation> +<translation id="1252714168533640068">Топту кайра ачуу үчүн топтун аталышын чыкылдатыңыз</translation> <translation id="1252987234827889034">Профилдик ката кетти</translation> <translation id="1253664522045778676">Табылган нерсени чыкылдатсаңыз, барак учурдагы өтмөктө ачылат</translation> <translation id="1254593899333212300">Интернетке түз туташуу</translation> @@ -624,6 +625,7 @@ <translation id="1476347941828409626">Chrome профилдерин &тескөө</translation> <translation id="1476607407192946488">&Тил параметрлери</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> эрежелери боюнча акылдуу картаңыз салынып турушу керек.</translation> +<translation id="1477645000789043442">Ачык өтмөктөрүңүздүн негизинде автоматтык түрдө өтмөк топторун түзөт. Бул функцияны колдонуу үчүн өтмөктү оң баскыч менен чыкылдатып, Окшош өтмөктөрдү иретке келтирүү дегенди басыңыз.</translation> <translation id="1477654881618305065">Уюмуңуз бул маалыматты бөлүшүүгө тыюу салды. Эгер жардам керек болсо, администраторуңузга кайрылыңыз.</translation> <translation id="1478340334823509079">Чоо-жайы: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Орнотуу иштетилген эмес</translation> @@ -682,7 +684,6 @@ <translation id="1521933835545997395">Android телефонуна туташты</translation> <translation id="1523279371236772909">Өткөн айда көрүлдү</translation> <translation id="1523978563989812243">Кеп синтезаторлору</translation> -<translation id="1524430321211440688">Баскычтоп</translation> <translation id="1524563461097350801">Жок, рахмат</translation> <translation id="1525740877599838384">Жайгашкан жер Wi-Fi аркылуу гана аныкталсын</translation> <translation id="152629053603783244">Linux'ту өчүрүп күйгүзүү</translation> @@ -881,6 +882,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Жайгашкан жерди аныктоо үчүн Wi‑Fi же мобилдик тармактар колдонулсун</translation> <translation id="164936512206786300">Bluetooth түзмөгүн ажыратуу</translation> +<translation id="1650407365859096313">Жаңы өтмөктө ачат. Уруксат абалы: <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">Менин Drive'ымдагы файлдарыңыз Chromebook түзмөгүңүзгө автоматтык түрдө шайкештирилгендиктен, аларга Интернет байланышы жок кире аласыз. Муну каалаган убакта Параметрлер > Файлдар бөлүмүнөн өзгөртө аласыз.</translation> <translation id="1651008383952180276">Бир купуя сөз айкашын эки жолу киргизишиңиз керек</translation> <translation id="1651609627703324721">Бул өтмөктө VR режиминдеги материалдар гарнитурага өткөрүлөт</translation> @@ -1125,6 +1127,7 @@ <translation id="1828901632669367785">Система диалогу аркылуу басып чыгаруу…</translation> <translation id="1829129547161959350">Пингвин</translation> <translation id="1829192082282182671">Ки&чирейтүү</translation> +<translation id="182973053761690772">Күндүн баткан убагы</translation> <translation id="1830550083491357902">Кирген жоксуз</translation> <translation id="1831848493690504725">Туташкан тармак аркылуу Google'га кире албай жатабыз. Башка тармакты тандап, тармактын же проксинин параметрлерин (эгер проксини колдонуп жатсаңыз) текшерип көрүңүз.</translation> <translation id="1832459821645506983">Макул</translation> @@ -1182,6 +1185,7 @@ <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> түзмөгүңүз жаңырган</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> сайтына уруксаттарды кайра берүү</translation> <translation id="1874248162548993294">Бардык жарнамаларды көрсөтө алат</translation> +<translation id="1874794096607967241">Камера уруксаты берилген колдонмолорго, вебсайттарга жана тутум кызматтарына камераңызды колдонууга уруксат бериңиз</translation> <translation id="1874874185178737347">Өтмөктөрдү иретке келтирүү</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Өтмөктү башка терезеге жылдыруу}other{Өтмөктөрдү башка терезеге жылдыруу}}</translation> <translation id="1875387611427697908">Муну <ph name="CHROME_WEB_STORE" /> дарегинен гана кошсо болот</translation> @@ -1221,6 +1225,7 @@ <translation id="1901303067676059328">&Баарын тандоо</translation> <translation id="1903542130902305074">Тууралоо</translation> <translation id="1904580727789512086">Сиз кирген URL даректери Google аккаунтуңузга сакталат</translation> +<translation id="1904603806662441960">Chrome'до сайтка берилген камера уруксаттарын тескөө</translation> <translation id="1905375423839394163">Chromebook түзмөгүнүн аталышы</translation> <translation id="1906181697255754968">Сайттар адатта ишиңизди автоматтык түрдө сактоо сыяктуу функциялар үчүн түзмөгүңүздөгү файлдарды жана папкаларды колдонот</translation> <translation id="1906488504371069394">Дагы башка кеңейтүүлөрдү жана темаларды <ph name="BEGIN_LINK" />Chrome Интернет дүкөнүнөн<ph name="END_LINK" /> табасыз</translation> @@ -1361,6 +1366,7 @@ <translation id="200928901437634269">Балаңыздын Google аккаунтун же мектебинин аккаунтун колдонуңуз. Ошондой эле, ата-эненин көзөмөлүн тууралай аласыз.</translation> <translation id="2009590708342941694">"Быйтыкча" куралы</translation> <translation id="2010501376126504057">Шайкеш түзмөктөр</translation> +<translation id="201217432804812273">"Топту сактоо" параметрин күйгүзүңүз</translation> <translation id="2012935757369720523">файлды өчүрүү</translation> <translation id="2013550551806600826">Байкап көрүү. Параметрди күйгүзүп же өчүрүп, сенсордук тактаны эки манжаңыз менен сыдырып, сыноо аймагына өтүңүз. Муну кийинчерээк Параметрлер > Түзмөк > Чычкан жана сенсордук такта бөлүмүнөн таба аласыз.</translation> <translation id="2015232545623037616">Компьютер менен Chromecast бир Wi-Fi тармагына туташып турат</translation> @@ -1784,6 +1790,7 @@ <translation id="2314165183524574721">Учурдагы көрүнүү параметрлери жашырылган</translation> <translation id="2314774579020744484">Барактарды которууда колдонулган тилдер</translation> <translation id="2316129865977710310">Жок, рахмат</translation> +<translation id="2316433409811863464">Колдонмодон алып ойнотуу</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% аткарылды</translation> <translation id="2318143611928805047">Кагаз өлчөмү</translation> <translation id="2318817390901984578">Android колдонмолорун пайдалануу үчүн <ph name="DEVICE_TYPE" /> түзмөгүңүздү кубаттап, жаңыртыңыз.</translation> @@ -1970,6 +1977,7 @@ <translation id="2454206500483040640">Бөлүнгөн</translation> <translation id="2454247629720664989">Ачкыч сөз</translation> <translation id="2454524890947537054">Веб сурамын ырастайсызбы?</translation> +<translation id="2454913962395846391">Убакыт алкагын авто-аныктоо</translation> <translation id="245650153866130664">Билетти автоматтык түрдө жаңыртуу үчүн "Сырсөздү эстеп калуу" дегенди белгилеңиз. Сырсөз сиздин түзмөктө гана сакталат.</translation> <translation id="2456794251167091176">Өткөрүлүп алынды</translation> <translation id="2456827790665612305">Сайтка жазылууну токтотуу</translation> @@ -2928,6 +2936,7 @@ <translation id="3202499879214571401">Экранды <ph name="DEVICE_NAME" /> түзмөгүнө чыгарууну тындыруу</translation> <translation id="3202578601642193415">Эң акыркы</translation> <translation id="3204648577100496185">Бул колдонмого байланыштуу маалымат бул түзмөктөн өчүрүлүшү мүмкүн</translation> +<translation id="3205140624385017621">Камера уруксаты берилген колдонмолор, вебсайттар жана тутум кызматтары камераңызды колдоно алышат. Камераны колдонуу үчүн колдонмону өчүрүп күйгүзүңүз же баракты жаңыртыңыз.</translation> <translation id="3207344462385471911">Акыркы аракеттериңиздин негизинде сунушталган сизди кызыктырышы мүмкүн болгон нерселерди жана арзандатууларды көрүп жатасыз. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3205,6 +3214,7 @@ <translation id="3434272557872943250">Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул маалымат анын Google аккаунтуна сакталышы мүмкүн. Төмөнкү шилтеме менен өтүп, бул жөндөөлөр жана аларды кантип тууралоо керек экендиги жөнүндө кеңири маалымат алыңыз: families.google.com.</translation> <translation id="3434475275396485144">Бул параметрди телефонуңуздун администратору башкарат</translation> <translation id="3434512374684753970">Аудио жана видео</translation> +<translation id="3435381311628654443">Микрофон уруксаты берилген колдонмолорго, вебсайттарга жана тутум кызматтарына микрофонуңузду колдонууга уруксат бериңиз</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" сиздин <ph name="CODE_TYPE" /> кодуңузду сурап жатат</translation> <translation id="3435738964857648380">Коопсуздук</translation> <translation id="343578350365773421">Кагаз түгөндү</translation> @@ -3282,6 +3292,7 @@ <translation id="3491669675709357988">Балаңыздын аккаунту Family Link'теги Ата-эненин көзөмөлүндө жөндөлгөн эмес. Жөндөөнү бүтүргөндөн кийин Ата-эненин көзөмөлүн кошуп койсоңуз болот. Ата-эненин көзөмөлү жөнүндө маалыматты Изилдөө өтмөгүнөн көрө аласыз.</translation> <translation id="3491678231052507920">Сайттар VR cеанстарга кирүүңүз үчүн виртуалдык чындык түзмөктөрүңүздү жана маалыматтарды колдонот</translation> <translation id="3493043608231401654"><ph name="TAB_TITLE" /> өтмөгүн өтмөктөр тобунан өчүрүү</translation> +<translation id="3493463599276143766">Камераңызды колдоонууга уруксат берилген вебсайт жок</translation> <translation id="3493486281776271508">Интернет талап кылынат</translation> <translation id="3493881266323043047">Жарактуулук</translation> <translation id="3495496470825196617">Телефон колдонулбаганда кубатты сарптоо</translation> @@ -3600,6 +3611,7 @@ <translation id="3733296813637058299">Ал колдонмолорду орнотуп беребиз. Play Store'го өтүп, <ph name="DEVICE_TYPE" /> түзмөгүңүз үчүн дагы башка колдонмолорду таап алсаңыз болот.</translation> <translation id="3735039640698208086">Аудио ойнотулуп жатканда…</translation> <translation id="3735740477244556633">Төмөнкү боюнча иргөө</translation> +<translation id="3735827758948958091">Өлчөнгөн байланыш менен <ph name="FILE_NAMES" /> файлдарын ача албайсыз</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> түзмөгүндөгү дайындар 24 сааттын ичинде өчүрүлөт</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> колдонмосун ачуу керекпи?</translation> @@ -3868,6 +3880,7 @@ <translation id="3925573269917483990">Камера:</translation> <translation id="3925926055063465902">Бул түзмөктүн башка колдонуучулары да бул тармакты пайдалана алат</translation> <translation id="3926002189479431949">Smart Lock - телефон өзгөрүлдү</translation> +<translation id="3926410220776569451">Камераны колдонуу бөгөттөлдү</translation> <translation id="3927932062596804919">Четке кагуу</translation> <translation id="3928570707778085600">Өзгөртүүлөр <ph name="FILE_OR_FOLDER_NAME" /> файлына сакталсынбы?</translation> <translation id="3928659086758780856">Сыя аз калды</translation> @@ -3923,7 +3936,6 @@ <translation id="3966072572894326936">Башка куржун тандаңыз…</translation> <translation id="3966094581547899417">Байланыш түйүнү жөнүндө маалымат</translation> <translation id="3967822245660637423">Жүктөп алуу аяктады</translation> -<translation id="3967841595862839006">Тил жана баскычтопту тандаңыз</translation> <translation id="3968739731834770921">Кана</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Эсептелүүдө…</translation> @@ -4063,6 +4075,7 @@ <translation id="4078738236287221428">Агрессивдүү</translation> <translation id="4078903002989614318">Иреттөө жана тизме параметрлери</translation> <translation id="4079140982534148664">Жакшыртылган орфографиялык текшерүү функциясын колдонуу</translation> +<translation id="4082333918978320301">Микрофонуңузду колдоонууга уруксат берилген вебсайт жок</translation> <translation id="4084582735848141214">{COUNT,plural, =1{1 сайтка уруксат берилди}other{# сайтка уруксат берилди}}</translation> <translation id="4084682180776658562">Кыстарма</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> өтмөгүн жабуу</translation> @@ -4212,6 +4225,7 @@ <translation id="4201546031411513170">Эмнени шайкештирүү керек экенин жөндөөлөрдөн ар дайым тандай аласыз.</translation> <translation id="4203065553461038553">Файлдын аталышы же сакталган жери өтө узун</translation> <translation id="4203769790323223880">Камераны колдонууга тыюу салынды</translation> +<translation id="4204415812590935863">Азырынча тема түзүүгө болбойт.</translation> <translation id="4205157409548006256">Linux'ту конфигурациялоодо ката кетти.</translation> <translation id="4206144641569145248">Келгин</translation> <translation id="4206323443866416204">Пикир билдирүү</translation> @@ -4553,6 +4567,7 @@ <translation id="447252321002412580">Chrome'дун функцияларын жана өндүрүмдүүлүгүн өркүндөтүүгө жардам бериңиз</translation> <translation id="4472533928615930332"><ph name="SUBJECT" /> ичинен түзүлгөн сүрөт: <ph name="INDEX" />, стиль: <ph name="STYLE" /></translation> <translation id="4472575034687746823">Баштоо</translation> +<translation id="4473559657152613417">Өтмөктү чычкандын оң баскычы менен чыкылдатып, "Өтмөктү жаңы топко кошуу" дегенди тандаңыз</translation> <translation id="4473996011558324141">болжолдуу убакыт</translation> <translation id="4474155171896946103">Бардык өтмөктөрдү кыстарып коюу…</translation> <translation id="4475552974751346499">Жүктөлүп алынгандарды издөө</translation> @@ -4605,7 +4620,6 @@ <translation id="4513872120116766993">Сунуштар</translation> <translation id="4513946894732546136">Пикир билдирүү</translation> <translation id="4515872537870654449">Аны оңдоо үчүн Dell менен байланышыңыз. Эгер желдеткич иштебей жатса, док бекет жабылат.</translation> -<translation id="4516008165284813420"><ph name="DEVICE_TYPE" /> түзмөгүңүз Интернетке туташканын текшерип, кайталап көрүңүз. Башка түзмөктөн play.google.com/about/play-terms сайтына да кирсеңиз болот.</translation> <translation id="4518840066030486079">Shift баскычынын режиминин стили</translation> <translation id="4519331665958994620">Сайттар камераны сиздин уруксатыңыз менен колдоно алат</translation> <translation id="4519605771716872386">Файлдарды шайкештирүү күйгүзүлдү</translation> @@ -4649,6 +4663,7 @@ <translation id="4547672827276975204">Автоматтык түрдө коюлсун</translation> <translation id="4548858987594081919">Google Сырсөздөрдү башкаргычка кирүү маалыматыңызды сактоого жардам берүү үчүн бул сайтка колдонуучу атыңызды кошуңуз</translation> <translation id="4549791035683739768">Коопсуздук ачкычыңызда сакталган манжаларыңыздын издери жок</translation> +<translation id="4550737096585299960">Бир нече мүнөттөн кийин кайра аракет кылып көрүңүз.</translation> <translation id="4550926046134589611">Колдоого алынган айрым шилтемелер <ph name="APP_NAME" /> колдонмосунда ачыла берет.</translation> <translation id="4551379727767354516">Соңку ЖИ темаларыңыз</translation> <translation id="4551763574344810652">Артка кайтаруу үчүн "<ph name="MODIFIER_KEY_DESCRIPTION" />" баскычтарын басыңыз</translation> @@ -5273,6 +5288,7 @@ <translation id="5051461727068120271">Ырасталбаган файлды өчүрүү</translation> <translation id="5051836348807686060">Сиз тандаган тилдерде орфография текшерилбейт</translation> <translation id="5052499409147950210">Сайтты түзөтүү</translation> +<translation id="5052853071318006357">Өтмөктү чычкандын оң баскычы менен чыкылдатып, "Өтмөктү жаңы топко кошуу" дегенди тандаңыз</translation> <translation id="5053233576223592551">Колдонуучунун атын кошуу</translation> <translation id="505347685865235222">Аталышы жок топ – <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193">Картанын бардык параметрлерин <ph name="BEGIN_LINK" />Chrome'ду ыңгайлаштыруу<ph name="END_LINK" /> бөлүмүнөн караңыз</translation> @@ -5309,6 +5325,7 @@ <translation id="5078638979202084724">Бардык өтмөктөрдү кыстарып коюу</translation> <translation id="5078796286268621944">Туура эмес PIN</translation> <translation id="5079010647467150187">Камтылган VPN'ди кошуу...</translation> +<translation id="5079460277417557557">Эми аккаунтуңузга кирип турган компьютерлерде сакталган өтмөк топторун колдоно аласыз</translation> <translation id="5079699784114005398">Күйгүзүлгөндөн кийин Google аккаунтуңуз менен кирсеңиз, колдонмолоруңуз бардык ChromeOS түзмөктөрүндө жеткиликтүү болот. Chrome серепчисинен орнотулган веб колдонмолор серепчини шайкештирүү өчүк болсо да шайкештирилет.</translation> <translation id="508059534790499809">Kerberos билетин жаңыртуу</translation> <translation id="5081124414979006563">Конок профилин &ачуу</translation> @@ -5372,6 +5389,7 @@ <translation id="5125967981703109366">Бул карта жөнүндө маалымат</translation> <translation id="512642543295077915">издөө + backspace</translation> <translation id="5126611267288187364">Өзгөртүүлөрдү көрүү</translation> +<translation id="512761462447738469">Камера уруксаты берилген колдонмолор, вебсайттар жана тутум кызматтары камераңызды колдоно алышат</translation> <translation id="5127620150973591153">Коопсуз байланыш идентификатору: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Шайкештештирүү өчүк</translation> <translation id="5127881134400491887">Тармак туташууларын башкаруу</translation> @@ -6077,6 +6095,7 @@ <translation id="5691581861107245578">Терип жаткан тексттин негизинде сунушталган быйтыкчаларды алуу</translation> <translation id="5691772641933328258">Манжа изи таанылган жок</translation> <translation id="5692183275898619210">Басылып чыгарылды</translation> +<translation id="5693237475389615913">Chrome'до сайтка берилген микрофон уруксаттарын тескөө</translation> <translation id="5693255400847650006">Микрофон колдонулууда</translation> <translation id="5695184138696833495">Linux Android колдонмосунун ADB</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" адепсиздиги тууралуу кабарлоо</translation> @@ -6098,6 +6117,7 @@ <translation id="5708171344853220004">Microsoft Негизги аты</translation> <translation id="5709557627224531708">Chrome'ду демейки серепчи катары белгилөө</translation> <translation id="5711010025974903573">Оңдоо кызматынын таржымалдары</translation> +<translation id="5711324642850167289">Колдонмолорго микрофонуңузду колдонууга уруксат берилген эмес</translation> <translation id="5711983031544731014">Кулпусун ачуу мүмкүн эмес. Сырсөзүңүздү киргизиңиз.</translation> <translation id="5712153969432126546">Сайттар айрым учурларда документтер, келишимдер жана формалар сыяктуу PDF файлдарды жарыялашат</translation> <translation id="571222594670061844">Сайттар идентификациялык кызматтарда кирүү сурамдарын көрсөтүшү мүмкүн</translation> @@ -6289,6 +6309,7 @@ <translation id="5862319196656206789">Байланыштырылган түзмөктөрдү жөндөө</translation> <translation id="5862731021271217234">Өтмөктөрүңүздү башка түзмөктөрүңүздөн алуу үчүн шайкештирүүнү күйгүзүңүз</translation> <translation id="5863195274347579748">Тышкы аксессуарлар жеке маалыматты колдонуп же бөлүшүшү мүмкүн.</translation> +<translation id="5863263400083022538">Тутум кызматтары</translation> <translation id="5863445608433396414">Мүчүлүштүктөрдү аныктоо өзгөчөлүктөрүн иштетүү</translation> <translation id="5863515189965725638">IBAN'ды түзөтүү</translation> <translation id="5864195618110239517">Тарифтелген Интернет байланышты колдонуу</translation> @@ -6728,6 +6749,7 @@ <translation id="6207937957461833379">Өлкө / Дубан</translation> <translation id="6208521041562685716">Мобилдик дайындар жандырылууда</translation> <translation id="6208725777148613371">Төмөнкүгө сакталбай калды: <ph name="WEB_DRIVE" /> – <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">Микрофон уруксаты берилген колдонмолор, вебсайттар жана тутум кызматтары микрофонуңузду колдоно алышат</translation> <translation id="6209838773933913227">Компонентти жаңыртуу</translation> <translation id="6209908325007204267">Түзмөгүңүздө Chrome Enterprise Upgrade камтылган, бирок колдонуучунун аты ишкананын аккаунту менен байланышкан эмес. Кошумча түзмөгүңүздөн g.co/ChromeEnterpriseAccount бөлүмүнө өтүп, ишкана аккаунтун түзүңүз.</translation> <translation id="6210282067670792090">Дарек тилкесинде бул ыкчам баскычты издөө каражаттары жана сайттан издөө ыкчам баскычтары менен колдонуңуз</translation> @@ -7062,6 +7084,7 @@ <translation id="6478248366783946499">Бул коркунучтуу файл сакталсынбы?</translation> <translation id="6479881432656947268">Chrome Интернет дүкөнүнө баш багуу</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> башкарат</translation> +<translation id="6481749622989211463">Жакын жердеги түзмөктөр менен файлдарды жана башка нерселерди бөлүшүңүз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Толук экран режиминдеги лупа</translation> <translation id="6483485061007832714">Жүктөлүп алынган файлды ачуу</translation> <translation id="6483805311199035658"><ph name="FILE" /> ачылууда…</translation> @@ -7310,6 +7333,7 @@ <translation id="6680650203439190394">Баалоо</translation> <translation id="6683022854667115063">Гарнитура</translation> <translation id="6683087162435654533">Бардык өтмөктөрдү калыбына келтирүү</translation> +<translation id="6683433919380522900">Уруксат абалы: <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Акыркы жаңыртуу жүктөлүп алынууда</translation> <translation id="668599234725812620">Google Play'ди ачуу</translation> <translation id="6686490380836145850">Өтмөктөрдү оңго карай жабуу</translation> @@ -8123,6 +8147,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> түзмөгүнүн <ph name="FEATURE_NAME" /> параметрлерине ылайык файлдар <ph name="USER_EMAIL" /> аккаунту аркылуу бөлүшүлөт.</translation> <translation id="7331646370422660166">alt + ылдый жебе</translation> <translation id="7332053360324989309">Дайындалган жумушчу: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Өлчөнгөн байланыш менен файлдарды жүктөп бере албайсыз.</translation> <translation id="7333669215417470379">Колдонмолор менен параметрлердин камдык көчүрмөсүн сактап, калыбына келтириңиз</translation> <translation id="7335436113423103413">Жаңы өтмөк бетиндеги капталдагы бирдиктүү тилкеден Chrome'дун ыңгайлаштырылган функцияларын колдонуу мүмкүндүгүн иштетет.</translation> <translation id="7335974957018254119">Төмөнкүнүн орфографиясын текшерүү</translation> @@ -8279,6 +8304,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome Интернет дүкөнүнөн өчүрүлгөн 1 кеңейтүүнү карап чыгыңыз}other{Chrome Интернет дүкөнүнөн өчүрүлгөн {NUM_EXTENSIONS} кеңейтүүнү карап чыгыңыз}}</translation> <translation id="7436921188514130341">Ка-ап! Аталышы өзгөртүлүп жатканда ката кетти.</translation> <translation id="7439519621174723623">Улантуу үчүн түзмөктүн аталышын кошуңуз</translation> +<translation id="7441736532026945583">Топту өтмөктөр тактасынан алып салуу үчүн "Топту жашыруу" параметрин тандаңыз</translation> <translation id="7441736921018636843">Бул параметрди өзгөртүү үчүн <ph name="BEGIN_LINK" />шайкештирүү параметрлерин баштапкы абалга келтирип<ph name="END_LINK" />, купуя сөз айкашын алып салыңыз</translation> <translation id="7441830548568730290">Башка колдонуучулар</translation> <translation id="744341768939279100">Жаңы профиль түзүү</translation> @@ -8879,6 +8905,7 @@ <translation id="7887864092952184874">Bluetooth чычканы жупташты</translation> <translation id="7889371445710865055">Текстти айтып киргизүү тилин өзгөртүү</translation> <translation id="7890147169288018054">IP же MAC дареги сыяктуу тармактын маалыматын көрүү</translation> +<translation id="7892005672811746207">"Топту сактоо" параметрин күйгүзүңүз</translation> <translation id="7892384782944609022">Жупташпай калды. Кайра аракет кылуу үчүн түзмөктү тандаңыз.</translation> <translation id="7893008570150657497">Сүрөттөрдү, музыканы жана башка медиа файлдарын компьютериңиз аркылуу колдонуу мүмкүнчүлүгүн алыңыз</translation> <translation id="7893153962594818789"><ph name="DEVICE_TYPE" /> түзмөгүндөгү Bluetooth өчүк. Сырсөзүңүздү киргизип туруп, Bluetooth'ду күйгүзүңүз.</translation> @@ -9121,6 +9148,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977"><ph name="GROUP_NAME" /> тобу – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Байланыш диалогу</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> колдонмосунун Жайгашкан жерди аныктоо уруксаты</translation> <translation id="8070662218171013510">Сенсордук жооп</translation> <translation id="8071432093239591881">Сүрөт форматында басып чыгаруу</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Колдонмо дайындарына иштеп чыгуучунун параметрлеринин негизинде сакталган бардык нерселер, анын ичинде байланыштар, билдирүүлөр жана сүрөттөр сыяктуу дайындар кириши мүмкүн.<ph name="END_PARAGRAPH1" /> @@ -9179,6 +9207,7 @@ <translation id="8109991406044913868">ЖИ түзгөн тема</translation> <translation id="8110393529211831722">Жазылуу ушул түзмөккө гана орнотулат жана аккаунтуңузга кирип турган башка түзмөктөр менен шайкештирилбейт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Байланыштар тизмеси жүктөлүп алынууда...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> колдонмосунун микрофон уруксаты</translation> <translation id="8115139559594092084">Google Drive'дан</translation> <translation id="8116972784401310538">&Кыстармаларды башкаргыч</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> аккаунтка кантип киргениңизди эстеп калып, сизди, мүмкүн болгондо, автоматтык түрдө киргизип турат. Өчүрүлсө, аккаунтка кирген сайын сырсөздү ырастоого туура келет.</translation> @@ -9394,6 +9423,7 @@ <translation id="8275038454117074363">Импорттоо</translation> <translation id="8275080796245127762">Түзмөктөрүңүздөн чалуу</translation> <translation id="8275339871947079271">Сырсөзүңүздү Google аккаунтуңузга жылдырып, аккаунтуңузга киргенде, аны коопсуз колдонуңуз</translation> +<translation id="8276242035951017580">Колдонмолорго камераңызды колдонууга уруксат берилген эмес</translation> <translation id="8276560076771292512">Кешти бошотуу жана өчүрүп кайра жүктөө</translation> <translation id="8276850948802942358">Сайтка үчүнчү тараптын cookie файлдарын убактылуу колдонууга уруксат берүү жөнүндө маалымат алуу</translation> <translation id="828180235270931531">Башка жеткиликтүү принтерлер</translation> @@ -9412,6 +9442,7 @@ <translation id="8291942417224950075">Жеке колдонуу үчүн</translation> <translation id="8293206222192510085">Кыстарма кошуу</translation> <translation id="8294431847097064396">Булак</translation> +<translation id="8294476140219241086">Өтмөктү иретке келтиргич</translation> <translation id="8294895455164415895">Chrome'го өтмөк топторун сунуштоого уруксат берүү үчүн параметрлерди ачыңыз</translation> <translation id="8295449579927246485">Дароо которуу</translation> <translation id="8295450130892483256">Microsoft 365 колдонмосун орнотуу</translation> @@ -9524,6 +9555,7 @@ <translation id="8380266723152870797">Терезенин аталышы</translation> <translation id="8380941800586852976">Коркунучтуу</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> түзмөгүн күйгүзүү</translation> +<translation id="8382197851871630452">Жергиликтүү аба ырайы</translation> <translation id="8382677870544805359">Корпоративдик функцияларды колдонуу үчүн бул түзмөктү баштапкы абалга кайтаруу керек.</translation> <translation id="8382715499079447151">Көрүүдөн коргоо</translation> <translation id="8382913212082956454">&Электрондук почта дарегин көчүрүү</translation> @@ -9714,6 +9746,7 @@ <translation id="8528962588711550376">Кирүү.</translation> <translation id="8529578450330869579">Интернет трафигиңизге кирүү мүмкүнчүлүгү бар адамдар сиз кирген сайттарды көрбөшү үчүн коопсуз Домендердин аталыштарынын тутумун (DNS) колдонуңуз. <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> сайтындагы көзөмөлдөнгөн кызмат көрсөтүүчү колдонулат</translation> <translation id="8529925957403338845">Ыкчам байланыш түйүнү аркылуу Интернетке туташуу ишке ашкан жок</translation> +<translation id="8531367864749403520">Топту өтмөктөр тактасынан алып салуу үчүн "Топту жашыруу" параметрин тандаңыз</translation> <translation id="8531701051932785007">Өркүндөтүлгөн коопсуз серептөө өчүк</translation> <translation id="8533670235862049797">Коопсуз серептөө күйүк</translation> <translation id="8534656636775144800">Ой! Доменге туташуу учурунда бир жерден ката кетти. Кайталап көрүңүз.</translation> @@ -9840,6 +9873,7 @@ <translation id="8639635302972078117">Колдонуу жана мүчүлүштүктөрдү аныктоо маалыматын жөнөтүү. Учурда бул түзмөк мүчүлүштүктөрдү аныктоо маалыматын, түзмөктүн жана колдонмонун иштетилиши жөнүндө маалыматты Google'га автоматтык түрдө жөнөтүп жатат. Бул маалымат балаңыздын өздүгүн аныктоо үчүн колдонулбайт жана тутум менен колдонмонун кыйла туруктуу иштешин камсыз кылууга жана башка нерселерди жакшыртууга көмөктөшөт. Айрым маалыматтар тобу Google колдонмолоруна жана Android'дин иштеп чыгуучулары сыяктуу өнөктөштөрүнө да жардам берет. Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул маалымат анын Google аккаунтуна сакталышы мүмкүн.</translation> <translation id="8640575194957831802">Акыркы жолу ачылган</translation> <translation id="8641946446576357115">Сырсөздөрүңүздү iOS түзмөктөрүңүздө колдонуңуз</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> колдонмосунун камера уруксаты</translation> <translation id="8642900771896232685">2 секунд</translation> <translation id="8642947597466641025">Текстти чоңураак кылуу</translation> <translation id="8643403533759285912">Топту өчүрүү</translation> @@ -9874,6 +9908,7 @@ <translation id="8662978096466608964">Chrome тушкагазды коё албайт.</translation> <translation id="8663051876219324457">Колдонмолорго, вебсайттарга жана тутум кызматтарына турган жериңизди колдонууга уруксат бериңиз. Түзмөктүн жайгашкан жери Wi‑Fi, мобилдик тармактар жана сенсорлор аркылуу аныкталат. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> бетинде автоматтык түрдө бир нече жүктөп алуу аракеттери ар дайым бөгөттөлсүн</translation> +<translation id="8664249499245357248">Топтун аталышын оң баскыч менен чыкылдатыңыз</translation> <translation id="8664389313780386848">Барак булагын карап &көрүү</translation> <translation id="8665110742939124773">Туура эмес кирүү кодун киргиздиңиз. Кайталаңыз.</translation> <translation id="8665180165765946056">Баары жүктөлдү</translation> @@ -10198,6 +10233,7 @@ <translation id="8900413463156971200">Мобилдик тармакты күйгүзүү</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> дайын-даректериңиздин камдык көчүрмөсүн сактап, бул <ph name="DEVICE_TYPE" /> түзмөгүн бүгүн кайтарууну талап кылууда.}other{<ph name="MANAGER" /> дайын-даректериңиздин камдык көчүрмөсүн сактап, бул <ph name="DEVICE_TYPE" /> түзмөгүн мөөнөтү бүткөнгө чейин кайтарууну талап кылууда.}}</translation> <translation id="8902667442496790482">"Басып туруп угуу" кызматынын параметрлерин ачуу</translation> +<translation id="8903733144777177139">Микрофонду колдонуу мүмкүнчүлүгү бөгөттөлгөн</translation> <translation id="890616557918890486">Булагын өзгөртүү</translation> <translation id="8907701755790961703">Өлкө тандаңыз</translation> <translation id="8908420399006197927">Өтмөктү сунушталган топтон чыгаруу</translation> @@ -10235,6 +10271,7 @@ <translation id="8934732568177537184">Улантуу</translation> <translation id="8938800817013097409">USB-C түзмөгү (аркасындагы оң жактагы оюкча)</translation> <translation id="8940081510938872932">Учурда компьютериңиз өтө эле көп иштерди аткарып жатат. Бир аздан кийин дагы аракет кылып көрүңүз.</translation> +<translation id="8940228279218723234">Камера уруксаты берилген колдонмолорго, вебсайттарга жана тутум кызматтарына камераңызды колдонууга уруксат бериңиз. Камераны колдонуу үчүн колдонмону өчүрүп күйгүзүңүз же баракты жаңыртыңыз.</translation> <translation id="8940381019874223173">Google Фотоңуздагы сүрөттөр</translation> <translation id="8940888110818450052">Аккаунтка кирүү параметрлери</translation> <translation id="8941173171815156065">"<ph name="PERMISSION" />" уруксатын жоюу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 9d39afbd..955013e4 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -343,6 +343,7 @@ <translation id="1251578593170406502">ກຳລັງສະແກນຫາເຄືອຂ່າຍອິນເຕີເນັດມືຖື...</translation> <translation id="125220115284141797">ຄ່າເລີ່ມຕົ້ນ</translation> <translation id="1252219782845132919">ເຊື່ອງກຸ່ມ</translation> +<translation id="1252714168533640068">ເພື່ອເປີດກຸ່ມຄືນໃໝ່, ໃຫ້ຄລິກໃສ່ຊື່ກຸ່ມ</translation> <translation id="1252987234827889034">ເກີດຄວາມຜິດພາດກັບໂປຣໄຟລ໌</translation> <translation id="1253664522045778676">ຄລິກໃສ່ຜົນການຊອກຫາໃດໜຶ່ງແລ້ວໜ້າຈະເປີດໃນແຖບປັດຈຸບັນຂອງທ່ານ</translation> <translation id="1254593899333212300">ການເຊື່ອມຕໍ່ອິນເຕີເນັດໂດຍກົງ</translation> @@ -624,6 +625,7 @@ <translation id="1476347941828409626">&ຈັດການໂປຣໄຟລ໌ Chrome</translation> <translation id="1476607407192946488">ການຕັ້ງຄ່າ&ພາສາ</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> ກຳນົດໃຫ້ທ່ານສຽບບັດອັດສະລິຍະຄາໄວ້.</translation> +<translation id="1477645000789043442">ສ້າງກຸ່ມແຖບໂດຍອັດຕະໂນມັດໂດຍອີງຕາມແຖບທີ່ເປີດຢູ່ຂອງທ່ານ. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ຄລິກຂວາໃສ່ແຖບ ແລະ ຄລິກຈັດລະບຽບແຖບທີ່ຄ້າຍກັນ.</translation> <translation id="1477654881618305065">ອົງການຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ທ່ານແບ່ງປັນເນື້ອຫານີ້. ຫາກທ່ານຕ້ອງການຄວາມຊ່ວຍເຫຼືອ, ໃຫ້ຕິດຕໍ່ຫາຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.</translation> <translation id="1478340334823509079">ລາຍລະອຽດ: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">ບໍ່ໄດ້ເປີດນຳໃຊ້ການຕິດຕັ້ງ</translation> @@ -680,7 +682,6 @@ <translation id="1521933835545997395">ເຊື່ອມຕໍ່ກັບໂທລະສັບ Android ແລ້ວ</translation> <translation id="1523279371236772909">ເບິ່ງແລ້ວໃນເດືອນທີ່ຜ່ານມາ</translation> <translation id="1523978563989812243">ເຄື່ອງມືການປ່ຽນຂໍ້ຄວາມເປັນສຽງເວົ້າ</translation> -<translation id="1524430321211440688">ແປ້ນພິມ</translation> <translation id="1524563461097350801">ບໍ່, ຂອບໃຈ</translation> <translation id="1525740877599838384">ໃຊ້ແຕ່ Wi-Fi ເພື່ອກຳນົດສະຖານທີ່</translation> <translation id="152629053603783244">ຣີສະຕາດ Linux</translation> @@ -879,6 +880,7 @@ <translation id="1648439345221797326">Ctrl + Shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">ໃຊ້ Wi‑Fi, Bluetooth ຫຼື ເຄືອຂ່າຍມືຖືເພື່ອກຳນົດສະຖານທີ່</translation> <translation id="164936512206786300">ຍົກເລີກການຈັບຄູ່ອຸປະກອນ Bluetooth</translation> +<translation id="1650407365859096313">ເປີດໃນແຖບໃໝ່, ການອະນຸຍາດແມ່ນ <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">ໄຟລ໌ຂອງທ່ານໃນໄດຣຟ໌ຂອງຂ້ອຍຈະຊິ້ງກັບ Chromebook ຂອງທ່ານໂດຍອັດຕະໂນມັດ ເພື່ອໃຫ້ທ່ານສາມາດເຂົ້າເຖິງໄດ້ໂດຍບໍ່ຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ. ທ່ານສາມາດປ່ຽນສິ່ງນີ້ຕອນໃດກໍໄດ້ໃນການຕັ້ງຄ່າ > ໄຟລ໌.</translation> <translation id="1651008383952180276">ທ່ານຕ້ອງປ້ອນວະລີຜ່ານອັນດຽວກັນສອງເທື່ອ</translation> <translation id="1651609627703324721">ແຖບນີ້ກຳລັງນໍາສະເໜີເນື້ອຫາ VR ໄປຫາຊຸດຫູຟັງ</translation> @@ -1123,6 +1125,7 @@ <translation id="1828901632669367785">ພິມດ້ວຍການໃຊ້ກ່ອງລະບົບ...</translation> <translation id="1829129547161959350">ນົກເພັນກວິນ</translation> <translation id="1829192082282182671">ຊູມອອກ</translation> +<translation id="182973053761690772">ກຳນົດເວລາປິດຕົວ</translation> <translation id="1830550083491357902">ບໍ່ລົງຊື່ເຂົ້າໃຊ້</translation> <translation id="1831848493690504725">ພວກເຮົາບໍ່ສາມາດຕິດຕໍ່ Google ຜ່ານເຄືອຂ່າຍທີ່ມີການເຊື່ອມຕໍ່ໄດ້. ກະລຸນາລອງເຄືອຂ່າຍອື່ນ ຫຼື ກວດເບິ່ງການຕັ້ງຄ່າເຄືອຂ່າຍຂອງທ່ານ ຫຼື ການຕັ້ງຄ່າພຣັອກຊີ (ຖ້າທ່ານກໍາລັງໃຊ້ພຣັອກຊີ).</translation> <translation id="1832459821645506983">ແມ່ນແລ້ວ, ຂ້ອຍເຂົ້າຮ່ວມ</translation> @@ -1179,6 +1182,7 @@ <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> ຂອງທ່ານໃໝ່ຫຼ້າສຸດແລ້ວ</translation> <translation id="1873920700418191231">ອະນຸຍາດສິດການອະນຸຍາດອີກຄັ້ງສຳລັບ <ph name="WEBSITE" /></translation> <translation id="1874248162548993294">ໄດ້ຮັບອະນຸຍາດໃຫ້ສະແດງໂຄສະນາຕ່າງໆ</translation> +<translation id="1874794096607967241">ອະນຸຍາດສິດເຂົ້າເຖິງສຳລັບແອັບ ແລະ ເວັບໄຊທີ່ມີການອະນຸຍາດກ້ອງ ແລະ ບໍລິການຂອງລະບົບ</translation> <translation id="1874874185178737347">ຈັດລະບຽບແຖບ</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ຍ້າຍແຖບໄປໃສ່ໜ້າຈໍອື່ນ}other{ຍ້າຍແຖບໄປໃສ່ໜ້າຈໍອື່ນ}}</translation> <translation id="1875387611427697908">ສາມາດເພີ່ມອັນນີ້ໄດ້ຈາກ <ph name="CHROME_WEB_STORE" /> ເທົ່ານັ້ນ</translation> @@ -1218,6 +1222,7 @@ <translation id="1901303067676059328">ເລືອກທັງຫມົດ</translation> <translation id="1903542130902305074">ຕັ້ງຄ່າ</translation> <translation id="1904580727789512086">URL ທີ່ທ່ານເຂົ້ານັ້ນຖືກບັນທຶກໄປໃສ່ບັນຊີ Google ທ່ານແລ້ວ</translation> +<translation id="1904603806662441960">ຈັດການການອະນຸຍາດກ້ອງສຳລັບເວັບໄຊໃນ Chrome</translation> <translation id="1905375423839394163">ຊື່ອຸປະກອນ Chromebook</translation> <translation id="1906181697255754968">ໂດຍປົກກະຕິແລ້ວ ເວັບໄຊຈະເຂົ້າເຖິງໄຟລ໌ ແລະ ໂຟນເດີໃນອຸປະກອນຂອງທ່ານສຳລັບຄຸນສົມບັດ ເຊັ່ນ: ການບັນທຶກວຽກຂອງທ່ານໄວ້ໂດຍອັດຕະໂນມັດ</translation> <translation id="1906488504371069394">ຄົ້ນພົບສ່ວນຂະຫຍາຍ ແລະ ຮູບແບບສີສັນເພີ່ມເຕີມຢູ່ <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /></translation> @@ -1358,6 +1363,7 @@ <translation id="200928901437634269">ໃຊ້ບັນຊີ Google ຂອງລູກທ່ານ ຫຼື ບັນຊີໂຮງຮຽນ. ທ່ານສາມາດຕັ້ງການຄວບຄຸມຂອງພໍ່ແມ່ໄດ້ນຳ.</translation> <translation id="2009590708342941694">ເຄື່ອງມືອີໂມຈິ</translation> <translation id="2010501376126504057">ອຸປະກອນທີ່ເຂົ້າກັນໄດ້</translation> +<translation id="201217432804812273">ເປີດ "ບັນທຶກກຸ່ມ"</translation> <translation id="2012935757369720523">ລຶບໄຟລ໌</translation> <translation id="2013550551806600826">ລອງໃຊ້ເບິ່ງ. ເປີດ ຫຼື ປິດການຕັ້ງຄ່າ, ຈາກນັ້ນໃຊ້ 2 ນິ້ວເລື່ອນເທິງແຜ່ນສຳຜັດຂອງທ່ານໃນບໍລິເວນທີ່ທົດສອບ. ນອກຈາກນັ້ນ, ທ່ານຍັງສາມາດຊອກຫາສິ່ງນີ້ໃນພາຍຫຼັງໄດ້ໃນການຕັ້ງຄ່າ > ອຸປະກອນ > ເມົ້າ ແລະ ແຜ່ນສຳຜັດ.</translation> <translation id="2015232545623037616">PC ແລະ Chromecast ຢູ່ເຄືອຂ່າຍ Wi-Fi ດຽວກັນ</translation> @@ -1783,6 +1789,7 @@ <translation id="2314165183524574721">ການຕັ້ງຄ່າການສະແດງໃນປັດຈຸບັນແມ່ນເຊື່ອງໄວ້</translation> <translation id="2314774579020744484">ພາສາທີ່ໃຊ້ເມື່ອແປໜ້າຕ່າງໆ</translation> <translation id="2316129865977710310">ບໍ່, ຂອບໃຈ</translation> +<translation id="2316433409811863464">ການສະຕຣີມແອັບ</translation> <translation id="2317842250900878657">ສຳເລັດແລ້ວ <ph name="PROGRESS_PERCENT" />%</translation> <translation id="2318143611928805047">ຂະຫນາດເຈ້ຍ</translation> <translation id="2318817390901984578">ເພື່ອໃຊ້ແອັບ Android, ກະລຸນາສາກ ແລະ ອັບເດດ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ.</translation> @@ -1969,6 +1976,7 @@ <translation id="2454206500483040640">ແບ່ງແລ້ວ</translation> <translation id="2454247629720664989">ຄໍາສໍາຄັນ</translation> <translation id="2454524890947537054">ອະນຸມັດຄຳຮ້ອງຂໍເວັບໄຊບໍ?</translation> +<translation id="2454913962395846391">ເຂດເວລາອັດຕະໂນມັດ</translation> <translation id="245650153866130664">ເພື່ອໂຫຼດຂໍ້ມູນປີ້ໃໝ່ໂດຍອັດຕະໂນມັດ, ກະລຸນາໝາຍເອົາ “ຈື່ລະຫັດຜ່ານ”. ລະຫັດຜ່ານຂອງທ່ານຈະຖືກເກັບໄວ້ໃນອຸປະກອນຂອງທ່ານເທົ່ານັ້ນ.</translation> <translation id="2456794251167091176">ການນຳເຂົ້າສຳເລັດແລ້ວ</translation> <translation id="2456827790665612305">ເຊົາຕິດຕາມເວັບໄຊ</translation> @@ -2927,6 +2935,7 @@ <translation id="3202499879214571401">ຢຸດສົ່ງສັນຍານໜ້າຈໍໄປຫາ <ph name="DEVICE_NAME" /> ຊົ່ວຄາວ</translation> <translation id="3202578601642193415">ໃໝ່ສຸດ</translation> <translation id="3204648577100496185">ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບແອັບນີ້ອາດຖືກລຶບອອກຈາກອຸປະກອນນີ້</translation> +<translation id="3205140624385017621">ແອັບ ແລະ ເວັບໄຊທີ່ມີການອະນຸຍາດກ້ອງ ແລະ ບໍລິການຂອງລະບົບສາມາດໃຊ້ກ້ອງຂອງທ່ານໄດ້. ເພື່ອໃຊ້ກ້ອງ, ທ່ານອາດຕ້ອງຣີສະຕາດແອັບ ຫຼື ໂຫຼດຂໍ້ມູນໜ້າຄືນໃໝ່.</translation> <translation id="3207344462385471911">ທ່ານກຳລັງເຫັນການຊອກຫາ ແລະ ສ່ວນຫຼຸດການຊື້ເຄື່ອງທີ່ແນະນຳທີ່ອາດສົນໃຈທ່ານໂດຍອ້າງອີງຈາກການເຄື່ອນໄຫວຫຼ້າສຸດຂອງທ່ານ. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3204,6 +3213,7 @@ <translation id="3434272557872943250">ຖ້າເປີດການຕັ້ງຄ່າການເຄື່ອນໄຫວເວັບ ແລະ ແອັບເພີ່ມເຕີມສໍາລັບລູກຂອງທ່ານ, ລະບົບອາດຈະບັນທຶກຂໍ້ມູນນີ້ໄວ້ໃນບັນຊີ Google ຂອງເຂົາເຈົ້າ. ສຶກສາເພີ່ມເຕີມກ່ຽວກັບການຕັ້ງຄ່າເຫຼົ່ານີ້ ແລະ ວິທີປັບການຕັ້ງຄ່າໄດ້ທີ່ families.google.com.</translation> <translation id="3434475275396485144">ການຕັ້ງຄ່ານີ້ແມ່ນຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງໂທລະສັບຂອງທ່ານ</translation> <translation id="3434512374684753970">ສຽງ ແລະ ວິດີໂອ</translation> +<translation id="3435381311628654443">ອະນຸຍາດສິດເຂົ້າເຖິງສຳລັບແອັບ ແລະ ເວັບໄຊທີ່ມີການອະນຸຍາດໄມໂຄຣໂຟນ ແລະ ບໍລິການຂອງລະບົບ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ກຳລັງຮ້ອງຂໍ <ph name="CODE_TYPE" /> ຂອງທ່ານ</translation> <translation id="3435738964857648380">ຄວາມປອດໄພ</translation> <translation id="343578350365773421">ເຈ້ຍໝົດ</translation> @@ -3281,6 +3291,7 @@ <translation id="3491669675709357988">ບໍ່ໄດ້ຕັ້ງຄ່າບັນຊີຂອງລູກທ່ານສຳລັບການຄວບຄຸມຂອງພໍ່ແມ່ໃນ Family Link. ທ່ານສາມາດເພີ່ມການຄວບຄຸມຂອງພໍ່ແມ່ເມື່ອທ່ານສຳເລັດການຕັ້ງຄ່າແລ້ວ. ທ່ານຈະເຫັນຂໍ້ມູນກ່ຽວກັບການຄວບຄຸມຂອງພໍ່ແມ່ໃນແອັບສຳຫຼວດ.</translation> <translation id="3491678231052507920">ໂດຍປົກກະຕິແລ້ວ ເວັບໄຊຈະໃຊ້ອຸປະກອນເວີຊົວ ຣິອາລິຕີ ແລະ ຂໍ້ມູນເພື່ອຊ່ວຍທ່ານເຂົ້າເຊດຊັນ VR</translation> <translation id="3493043608231401654">ລຶບ <ph name="TAB_TITLE" /> ອອກຈາກກຸ່ມແຖບ</translation> +<translation id="3493463599276143766">ບໍ່ມີເວັບໄຊທີ່ໄດ້ຮັບອະນຸຍາດໃຫ້ໃຊ້ກ້ອງຂອງທ່ານ</translation> <translation id="3493486281776271508">ຈຳເປັນຕ້ອງເຊື່ອມຕໍ່ອິນເຕີເນັດ</translation> <translation id="3493881266323043047">ຄວາມຖືກຕ້ອງ</translation> <translation id="3495496470825196617">ພັກເຄື່ອງໃນຂະນະທີ່ສາກ</translation> @@ -3599,6 +3610,7 @@ <translation id="3733296813637058299">ພວກເຮົາຈະຕິດຕັ້ງແອັບເຫຼົ່ານີ້ໃຫ້ທ່ານ. ທ່ານສາມາດຊອກຫາແອັບເພີ່ມເຕີມສຳລັບ <ph name="DEVICE_TYPE" /> ຂອງທ່ານໄດ້ໃນ Play Store.</translation> <translation id="3735039640698208086">ໃນເວລາຫຼິ້ນສຽງ...</translation> <translation id="3735740477244556633">ຈັດຮຽງຕາມ</translation> +<translation id="3735827758948958091">ບໍ່ສາມາດເປີດ <ph name="FILE_NAMES" /> ໄດ້ໃນລະຫວ່າງທີ່ໃຊ້ການເຊື່ອມຕໍ່ທີ່ມີການວັດແທກ</translation> <translation id="3738632186060045350">ຂໍ້ມູນ <ph name="DEVICE_TYPE" /> ຈະຖືກລຶບໃນ 24 ຊົ່ວໂມງ</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">ເປີດ <ph name="APPLICATION" /> ບໍ?</translation> @@ -3867,6 +3879,7 @@ <translation id="3925573269917483990">ກ້ອງຖ່າຍຮູບ</translation> <translation id="3925926055063465902">ມີຜູ້ໃຊ້ອື່ນຢູ່ອຸປະກອນນີ້ທີ່ສາມາດໃຊ້ເຄືອຂ່າຍນີ້ໄດ້ນຳ</translation> <translation id="3926002189479431949">ໂທລະສັບລັອກອັດສະລິຍະປ່ຽນແປງແລ້ວ</translation> +<translation id="3926410220776569451">ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບຖືກບລັອກ</translation> <translation id="3927932062596804919">ປະຕິເສດ</translation> <translation id="3928570707778085600">ບັນທຶກການປ່ຽນແປງໄວ້ໃນ <ph name="FILE_OR_FOLDER_NAME" /> ບໍ?</translation> <translation id="3928659086758780856">ໝຶກເຫຼືອໜ້ອຍ</translation> @@ -3922,7 +3935,6 @@ <translation id="3966072572894326936">ເລືອກໂຟລເດີອື່ນ...</translation> <translation id="3966094581547899417">ລາຍລະອຽດຮັອດສະປອດ</translation> <translation id="3967822245660637423">ດາວໂຫຼດສຳເລັດ</translation> -<translation id="3967841595862839006">ເລືອກພາສາ ແລະ ແປ້ນພິມຂອງທ່ານ</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">ກໍາລັງຄິດໄລ່...</translation> @@ -4062,6 +4074,7 @@ <translation id="4078738236287221428">ບັງຄັບແຄສ</translation> <translation id="4078903002989614318">ຕົວເລືອກການຈັດຮຽງ ແລະ ລາຍຊື່</translation> <translation id="4079140982534148664">ໃຊ້ການກວດການສະກົດຄຳທີ່ປັບປຸງດີຂຶ້ນແລ້ວ</translation> +<translation id="4082333918978320301">ບໍ່ມີເວັບໄຊທີ່ໄດ້ຮັບອະນຸຍາດໃຫ້ໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານ</translation> <translation id="4084582735848141214">{COUNT,plural, =1{ມີ 1 ເວັບໄຊທີ່ອະນຸຍາດ}other{ມີ # ເວັບໄຊທີ່ອະນຸຍາດ}}</translation> <translation id="4084682180776658562">ບຸກມາກຄ໌</translation> <translation id="4084835346725913160">ປິດ <ph name="TAB_NAME" /></translation> @@ -4211,6 +4224,7 @@ <translation id="4201546031411513170">ທ່ານສາມາດເລືອກສິ່ງທີ່ຈະຊິ້ງຂໍ້ມູນໄດ້ທຸກເທື່ອໃນການຕັ້ງຄ່າ.</translation> <translation id="4203065553461038553">ຊື່ໄຟລ໌ ຫຼື ສະຖານທີ່ຍາວເກີນໄປ</translation> <translation id="4203769790323223880">ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ກ້ອງຖ່າຍຮູບ</translation> +<translation id="4204415812590935863">ບໍ່ສາມາດສ້າງຮູບແບບສີສັນໄດ້ໃນຕອນນີ້.</translation> <translation id="4205157409548006256">ເກີດຄວາມຜິດພາດໃນຂະນະທີ່ກຳລັງຕັ້ງຄ່າ Linux.</translation> <translation id="4206144641569145248">ມະນຸດຕ່າງດາວ</translation> <translation id="4206323443866416204">ລາຍງານຄຳຕິຊົມ</translation> @@ -4552,6 +4566,7 @@ <translation id="447252321002412580">ຊ່ວຍປັບປຸງຄຸນສົມບັດ ແລະ ປະສິດທິພາບຂອງ Chrome</translation> <translation id="4472533928615930332">ສ້າງຮູບ <ph name="INDEX" /> ຂອງ <ph name="SUBJECT" />, ໃນແບບ <ph name="STYLE" /> ແລ້ວ</translation> <translation id="4472575034687746823">ເລີ່ມຕົ້ນ</translation> +<translation id="4473559657152613417">ຄລິກຂວາໃສ່ແຖບ ແລ້ວເລືອກ "ເພີ່ມແຖບໃສ່ກຸ່ມໃໝ່"</translation> <translation id="4473996011558324141">ກຳລັງປະເມີນເວລາ</translation> <translation id="4474155171896946103">ໃສ່ບຸກມາກຄ໌ທຸກແຖບ...</translation> <translation id="4475552974751346499">ຄົ້ນຫາການດາວໂຫຼດ</translation> @@ -4604,7 +4619,6 @@ <translation id="4513872120116766993">ການຂຽນແບບຄາດເດົາ</translation> <translation id="4513946894732546136">ຄໍາຄິດເຫັນ</translation> <translation id="4515872537870654449">ຕິດຕໍ່ Dell ສຳລັບການບໍລິການ. ແທ່ນສາກຈະປິດເຄື່ອງຖ້າພັດລົມໃຊ້ບໍ່ໄດ້.</translation> -<translation id="4516008165284813420">ກະລຸນາກວດໃຫ້ແນ່ໃຈວ່າ <ph name="DEVICE_TYPE" /> ຂອງທ່ານເຊື່ອມຕໍ່ກັບອິນເຕີເນັດແລ້ວລອງໃໝ່. ນອກຈາກນັ້ນ, ທ່ານຍັງສາມາດເຂົ້າໄປ play.google.com/about/play-terms ຢູ່ອຸປະກອນອື່ນໄດ້ນຳ.</translation> <translation id="4518840066030486079">ຮູບແບບໂໝດປຸ່ມ Shift</translation> <translation id="4519331665958994620">ເວັບໄຊສາມາດຂໍໃຊ້ກ້ອງຂອງທ່ານໄດ້</translation> <translation id="4519605771716872386">ການຊິ້ງໄຟລ໌ເປີດຢູ່</translation> @@ -4648,6 +4662,7 @@ <translation id="4547672827276975204">ຕັ້ງຄ່າໂດຍອັດຕະໂນມັດ</translation> <translation id="4548858987594081919">ເພື່ອຊ່ວຍຕົວຈັດການລະຫັດຜ່ານ Google ໃຫ້ບັນທຶກຂໍ້ມູນການເຂົ້າສູ່ລະບົບຂອງທ່ານ, ໃຫ້ເພີ່ມຊື່ຜູ້ໃຊ້ຂອງທ່ານສຳລັບເວັບໄຊນີ້ໄວ້</translation> <translation id="4549791035683739768">ກະແຈຄວາມປອດໄພຂອງທ່ານບໍ່ມີລາຍນິ້ວມືທີ່ເກັບຮັກສາໄວ້</translation> +<translation id="4550737096585299960">ກະລຸນາລອງໃໝ່ໃນອີກສອງສາມນາທີ.</translation> <translation id="4550926046134589611">ລິ້ງທີ່ຮອງຮັບບາງຢ່າງຈະຍັງຄົງເປີດໃນ <ph name="APP_NAME" />.</translation> <translation id="4551379727767354516">ຮູບແບບສີສັນ AI ຫຼ້າສຸດຂອງທ່ານ</translation> <translation id="4551763574344810652">ກົດ <ph name="MODIFIER_KEY_DESCRIPTION" /> ເພື່ອຍົກເລີກ</translation> @@ -5272,6 +5287,7 @@ <translation id="5051461727068120271">ດາວໂຫຼດໄຟລ໌ທີ່ບໍ່ໄດ້ຮັບການຢັ້ງຢືນ</translation> <translation id="5051836348807686060">ບໍ່ຮອງຮັບການກວດການສະກົດຄຳສຳລັບພາສາທີ່ທ່ານເລືອກ</translation> <translation id="5052499409147950210">ແກ້ໄຂເວັບໄຊ</translation> +<translation id="5052853071318006357">ຄລິກຂວາໃສ່ແຖບ ແລ້ວເລືອກ "ເພີ່ມແຖບໃສ່ກຸ່ມໃໝ່"</translation> <translation id="5053233576223592551">ເພີ່ມຊື່ຜູ້ໃຊ້</translation> <translation id="505347685865235222">ກຸ່ມບໍ່ມີຊື່ - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193">ເບິ່ງຕົວເລືອກບັດທັງໝົດໃນ <ph name="BEGIN_LINK" />ປັບແຕ່ງ Chrome<ph name="END_LINK" /></translation> @@ -5308,6 +5324,7 @@ <translation id="5078638979202084724">ໃສ່ບຸກມາກຄ໌ທຸກແຖບ</translation> <translation id="5078796286268621944">PIN ບໍ່ຖືກຕ້ອງ</translation> <translation id="5079010647467150187">ເພີ່ມ VPN ໃນຕົວ...</translation> +<translation id="5079460277417557557">ຕອນນີ້ທ່ານສາມາດໃຊ້ກຸ່ມແຖບທີ່ບັນທຶກໄວ້ໃນທົ່ວທຸກອຸປະກອນເດັສທັອບທີ່ເຂົ້າສູ່ລະບົບຂອງທ່ານໄດ້ແລ້ວ</translation> <translation id="5079699784114005398">ເມື່ອເປີດໄວ້, ແອັບຂອງທ່ານຈະພ້ອມໃຫ້ນຳໃຊ້ຢູ່ທຸກອຸປະກອນ ChromeOS ຫຼັງຈາກທີ່ທ່ານເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ Google ຂອງທ່ານ. ລະບົບຈະຊິ້ງເວັບແອັບທີ່ຕິດຕັ້ງຈາກໂປຣແກຣມທ່ອງເວັບ Chrome ເຖິງແມ່ນວ່າການຊິ້ງຂອງໂປຣແກຣມທ່ອງເວັບຈະຖືກປິດໄວ້ກໍຕາມ.</translation> <translation id="508059534790499809">ໂຫຼດຂໍ້ມູນປີ້ Kerberos ໃໝ່</translation> <translation id="5081124414979006563">&ເປີດໂປຣໄຟລ໌ແຂກ</translation> @@ -5371,6 +5388,7 @@ <translation id="5125967981703109366">ກ່ຽວກັບບັດນີ້</translation> <translation id="512642543295077915">ຊອກຫາ + ປຸ່ມ backspace</translation> <translation id="5126611267288187364">ເບິ່ງການປ່ຽນແປງ</translation> +<translation id="512761462447738469">ແອັບ ແລະ ເວັບໄຊທີ່ມີການອະນຸຍາດກ້ອງ ແລະ ບໍລິການຂອງລະບົບສາມາດໃຊ້ກ້ອງຂອງທ່ານໄດ້</translation> <translation id="5127620150973591153">ໄອດີການເຊື່ອມຕໍ່ທີ່ປອດໄພ: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">ຊິງຄ໌ປິດ</translation> <translation id="5127881134400491887">ຈັດການເລື່ອງການເຊື່ອມຕໍ່ເຄືອຂ່າຍ</translation> @@ -6075,6 +6093,7 @@ <translation id="5691581861107245578">ຮັບການແນະນຳອີໂມຈິທີ່ອີງໃສ່ສິ່ງທີ່ທ່ານກຳລັງພິມ</translation> <translation id="5691772641933328258">ບໍ່ຮູ້ຈັກລາຍນິ້ວມື</translation> <translation id="5692183275898619210">ການພິມສຳເລັດແລ້ວ</translation> +<translation id="5693237475389615913">ຈັດການການອະນຸຍາດໄມໂຄຣໂຟນສຳລັບເວັບໄຊໃນ Chrome</translation> <translation id="5693255400847650006">ມີການໃຊ້ໄມໂຄຣໂຟນຢູ່</translation> <translation id="5695184138696833495">ADB ຂອງແອັບ Android ໃນ Linux</translation> <translation id="5696143504434933566">ລາຍງານການໃຊ້ໃນທາງທີ່ຜິດຈາກ "<ph name="EXTENSION_NAME" />"</translation> @@ -6096,6 +6115,7 @@ <translation id="5708171344853220004">ຊື່ສໍາຄັນຂອງ Microsoft</translation> <translation id="5709557627224531708">ຕັ້ງຄ່າ Chrome ເປັນໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນ</translation> <translation id="5711010025974903573">ບັນທຶກບໍລິການ</translation> +<translation id="5711324642850167289">ບໍ່ມີແອັບທີ່ໄດ້ຮັບອະນຸຍາດໃຫ້ໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານ</translation> <translation id="5711983031544731014">ບໍ່ສາມາດປົດລັອກໄດ້. ປ້ອນລະຫັດຜ່ານຂອງທ່ານເຂົ້າໄປ.</translation> <translation id="5712153969432126546">ບາງເທື່ອເວັບໄຊຈະເຜີຍແຜ່ PDF ຕ່າງໆ ເຊັ່ນ: ເອກະສານ, ສັນຍາ ແລະ ແບບຟອມ</translation> <translation id="571222594670061844">ເວັບໄຊສາມາດສະແດງຂໍ້ຄວາມການເຂົ້າສູ່ລະບົບຈາກບໍລິການຕົວຕົນຕ່າງໆໄດ້</translation> @@ -6287,6 +6307,7 @@ <translation id="5862319196656206789">ຕັ້ງຄ່າອຸປະກອນທີ່ເຊື່ອມຕໍ່</translation> <translation id="5862731021271217234">ເພື່ອໂຫຼດແຖບຂອງທ່ານຈາກອຸປະກອນອື່ນ, ກະລຸນາເປີດການຊິ້ງຂໍ້ມູນກ່ອນ</translation> <translation id="5863195274347579748">ອຸປະກອນເສີມພາຍນອກອາດຈະສາມາດເຂົ້າເຖິງ ຫຼື ແບ່ງປັນຂໍ້ມູນສ່ວນຕົວໄດ້.</translation> +<translation id="5863263400083022538">ບໍລິການຂອງລະບົບ</translation> <translation id="5863445608433396414">ເປີດໃຊ້ງານຄຸນສົມບັດແກ້ໄຂບັນຫາ</translation> <translation id="5863515189965725638">ແກ້ໄຂ IBAN</translation> <translation id="5864195618110239517">ໃຊ້ການເຊື່ອມຕໍ່ແບບວັດແທກປະລິມານອິນເຕີເນັດ</translation> @@ -6726,6 +6747,7 @@ <translation id="6207937957461833379">ປະເທດ/ພາກພື້ນ</translation> <translation id="6208521041562685716">ກຳລັງເປີດນຳໃຊ້ອິນເຕີເນັດມືຖື</translation> <translation id="6208725777148613371">ບັນທຶກໄປໃສ່ <ph name="WEB_DRIVE" /> ບໍ່ສຳເລັດ - <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">ແອັບ ແລະ ເວັບໄຊທີ່ມີການອະນຸຍາດໄມໂຄຣໂຟນ ແລະ ບໍລິການຂອງລະບົບສາມາດໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານໄດ້</translation> <translation id="6209838773933913227">ກຳລັງອັບເດດອົງປະກອບ</translation> <translation id="6209908325007204267">ອຸປະກອນຂອງທ່ານຮວມມີການອັບເກຣດ Chrome Enterprise, ແຕ່ຊື່ຜູ້ໃຊ້ຂອງທ່ານບໍ່ເຊື່ອມໂຍງກັບບັນຊີວິສາຫະກິດ. ກະລຸນາສ້າງບັນຊີວິສາຫະກິດໂດຍການເຂົ້າຫາ g.co/ChromeEnterpriseAccount ໃນອຸປະກອນສຳຮອງ.</translation> <translation id="6210282067670792090">ໃນແຖບທີ່ຢູ່, ໃຫ້ໃຊ້ຄີລັດກັບທາງລັດຕ່າງໆສຳລັບໂປຣແກຣມຊອກຫາ ແລະ ການຊອກຫາເວັບໄຊ</translation> @@ -7060,6 +7082,7 @@ <translation id="6478248366783946499">ເກັບໄຟລ໌ອັນຕະລາຍໄວ້ບໍ?</translation> <translation id="6479881432656947268">ເຂົ້າເບິ່ງ Chrome Web Store</translation> <translation id="6480327114083866287">ຈັດການໂດຍ <ph name="MANAGER" /></translation> +<translation id="6481749622989211463">ແບ່ງປັນໄຟລ໌ ແລະ ອື່ນໆກັບອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="6482559668224714696">ແວ່ນຂະຫຍາຍເຕັມຈໍ</translation> <translation id="6483485061007832714">ເປີດການດາວໂຫຼດ</translation> <translation id="6483805311199035658">ກໍາລັງເປີດ <ph name="FILE" />...</translation> @@ -7308,6 +7331,7 @@ <translation id="6680650203439190394">ໃຫ້ຄະແນນ</translation> <translation id="6683022854667115063">ຫູຟັງ</translation> <translation id="6683087162435654533">ກູ້&ທຸກແຖບຄືນມາ</translation> +<translation id="6683433919380522900">ການອະນຸຍາດແມ່ນ <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">ກຳລັງດາວໂຫຼດການອັບເດດຫຼ້າສຸດ</translation> <translation id="668599234725812620">ເປີດ Google Play</translation> <translation id="6686490380836145850">ປິດແຖບໄປທາງຂວາ</translation> @@ -8121,6 +8145,7 @@ <translation id="7330533963640151632">ການຕັ້ງຄ່າ <ph name="FEATURE_NAME" /> ສຳລັບອຸປະກອນຂອງ <ph name="USER_NAME" /> ທີ່ແບ່ງປັນໂດຍໃຊ້ບັນຊີ <ph name="USER_EMAIL" />.</translation> <translation id="7331646370422660166">Alt + ລູກສອນລົງ</translation> <translation id="7332053360324989309">ຜູ້ເຮັດວຽກສະເພາະຢ່າງ: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">ບໍ່ສາມາດອັບໂຫຼດໄຟລ໌ໄດ້ໃນລະຫວ່າງທີ່ໃຊ້ການເຊື່ອມຕໍ່ທີ່ມີການວັດແທກ.</translation> <translation id="7333669215417470379">ສຳຮອງຂໍ້ມູນ ແລະ ກູ້ຄືນແອັບ ແລະ ການຕັ້ງຄ່າຂອງທ່ານ</translation> <translation id="7335436113423103413">ເປີດການນຳໃຊ້ຄວາມສາມາດໃນການໃຊ້ການປັບແຕ່ງຟັງຊັນການເຮັດວຽກຂອງ Chrome ຈາກແຜງຄວບຄຸມດ້ານຂ້າງແບບຮວມໃນໜ້າແຖບໃໝ່.</translation> <translation id="7335974957018254119">ໃຊ້ການກວດການສະກົດຄໍາສຳລັບ</translation> @@ -8276,6 +8301,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{ກວດສອບສ່ວນຂະຫຍາຍ 1 ລາຍການທີ່ຖືກລຶບອອກຈາກ Chrome Web Store}other{ກວດສອບສ່ວນຂະຫຍາຍ {NUM_EXTENSIONS} ລາຍການທີ່ຖືກລຶບອອກຈາກ Chrome Web Store}}</translation> <translation id="7436921188514130341">ໂອ໋ຍ, ໂຊກຮ້າຍແທ້! ເກີດຄວາມຜິດພາດຂຶ້ນໃນເວລາປ່ຽນຊື່.</translation> <translation id="7439519621174723623">ເພີ່ມຊື່ອຸປະກອນເພື່ອສືບຕໍ່</translation> +<translation id="7441736532026945583">ເລືອກ "ເຊື່ອງກຸ່ມ" ເພື່ອລຶບກຸ່ມອອກຈາກລາຍແຖບຂອງທ່ານ</translation> <translation id="7441736921018636843">ເພື່ອປ່ຽນການຕັ້ງຄ່ານີ້, ກະລຸນາ <ph name="BEGIN_LINK" />ຣີເຊັດການຊິ້ງຂໍ້ມູນ<ph name="END_LINK" /> ເພື່ອລຶບລະຫັດຜ່ານການຊິ້ງຂໍ້ມູນຂອງທ່ານອອກ</translation> <translation id="7441830548568730290">ຜູ້ໃຊ້ອື່ນ</translation> <translation id="744341768939279100">ສ້າງໂປຣໄຟລ໌ໃຫມ່</translation> @@ -8875,6 +8901,7 @@ <translation id="7887864092952184874">ເມົາສ໌ Bluetooth ຈັບຄູ່ແລ້ວ</translation> <translation id="7889371445710865055">ປ່ຽນພາສາການປ້ອນຂໍ້ມູນດ້ວຍສຽງ</translation> <translation id="7890147169288018054">ເບິ່ງຂໍ້ມູນເຄືອຂ່າຍ ເຊັ່ນ: ທີ່ຢູ່ IP ຫຼື MAC</translation> +<translation id="7892005672811746207">ເປີດ "ບັນທຶກກຸ່ມ"</translation> <translation id="7892384782944609022">ບໍ່ສາມາດຈັບຄູ່ໄດ້. ເລືອກອຸປະກອນເພື່ອລອງໃໝ່.</translation> <translation id="7893008570150657497">ເຂົ້າຫາຮູບ, ເພງ, ແລະມີເດຍອື່ນໆຈາກຄອມພິວເຕີຂອງທ່ານ</translation> <translation id="7893153962594818789">Bluetooth ຖືກປິດຢູ່ໃນ <ph name="DEVICE_TYPE" /> ນີ້. ກະລຸນາປ້ອນລະຫັດຜ່ານຂອງທ່ານ ແລະ ເປີດ Bluetooth.</translation> @@ -9117,6 +9144,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">ກຸ່ມ <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">ກ່ອງໂຕ້ຕອບການເຊື່ອມຕໍ່</translation> +<translation id="8070572887926783747">ການອະນຸຍາດສະຖານທີ່ຂອງ <ph name="APP_NAME" /></translation> <translation id="8070662218171013510">ການຕອບສະໜອງສຳຜັດ</translation> <translation id="8071432093239591881">ພິມເປັນຮູບພາບ</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />ຂໍ້ມູນແອັບສາມາດເປັນຂໍ້ມູນໃດໆກໍໄດ້ທີ່ແອັບໄດ້ບັນທຶກໄວ້ (ອີງຕາມການຕັ້ງຄ່າຂອງຜູ້ພັດທະນາ), ເຊິ່ງຮວມທັງລາຍຊື່ຜູ້ຕິດຕໍ່, ຂໍ້ຄວາມ ແລະ ຮູບພາບ.<ph name="END_PARAGRAPH1" /> @@ -9175,6 +9203,7 @@ <translation id="8109991406044913868">ຮູບແບບສີສັນທີ່ສ້າງໂດຍ AI</translation> <translation id="8110393529211831722">ການສະໝັກສະມາຊິກແມ່ນຕິດຕັ້ງຢູ່ໃນອຸປະກອນນີ້ເທົ່ານັ້ນ ແລະ ບໍ່ໄດ້ຊິ້ງກັບອຸປະກອນອື່ນໆພາຍໃຕ້ບັນຊີຂອງທ່ານ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="8110489095782891123">ກຳລັງດາວໂຫຼດລາຍຊື່ຜູ້ຕິດຕໍ່...</translation> +<translation id="8114925369073821854">ການອະນຸຍາດໄມໂຄຣໂຟນຂອງ <ph name="APP_NAME" /></translation> <translation id="8115139559594092084">ຈາກ Google Drive ຂອງທ່ານ</translation> <translation id="8116972784401310538">ຕົວຈັດການບຸກມາກຄ໌</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> ຈະຈື່ວິທີທີ່ທ່ານເຂົ້າສູ່ລະບົບ ແລະ ຈະເຂົ້າສູ່ລະບົບໃຫ້ທ່ານໂດຍອັດຕະໂນມັດເມື່ອເປັນໄປໄດ້. ເມື່ອປິດການຕັ້ງຄ່ານີ້, ລະບົບຈະຂໍໃຫ້ທ່ານຢືນຢັນທຸກໆເທື່ອ.</translation> @@ -9390,6 +9419,7 @@ <translation id="8275038454117074363">ນໍາເຂົ້າ</translation> <translation id="8275080796245127762">ໂທຈາກອຸປະກອນຂອງທ່ານ</translation> <translation id="8275339871947079271">ຍ້າຍລະຫັດຜ່ານຂອງທ່ານໄປໃສ່ບັນຊີ Google ຂອງທ່ານເພື່ອເຂົ້າເຖິງມັນໄດ້ຢ່າງປອດໄພຢູ່ທຸກບ່ອນທີ່ທ່ານເຂົ້າສູ່ລະບົບ</translation> +<translation id="8276242035951017580">ບໍ່ມີແອັບທີ່ໄດ້ຮັບອະນຸຍາດໃຫ້ໃຊ້ກ້ອງຂອງທ່ານ</translation> <translation id="8276560076771292512">ແຄຊ໌ຫວ່າງເປົ່າ ແລະໂຫຼດໃໝ່ຍາກ</translation> <translation id="8276850948802942358">ສຶກສາເພີ່ມເຕີມກ່ຽວກັບການໃຫ້ສິດການອະນຸຍາດຊົ່ວຄາວແກ່ເວັບໄຊເພື່ອໃຊ້ຄຸກກີ້ພາກສ່ວນທີສາມ</translation> <translation id="828180235270931531">ເຄື່ອງພິມອື່ນໆທີ່ມີຢູ່</translation> @@ -9408,6 +9438,7 @@ <translation id="8291942417224950075">ສຳລັບໃຊ້ສ່ວນຕົວ</translation> <translation id="8293206222192510085">ເພີ່ມບຸກມາກຄ໌</translation> <translation id="8294431847097064396">ແຫຼ່ງທີ່ມາ</translation> +<translation id="8294476140219241086">ຕົວຈັດລະບຽບແຖບ</translation> <translation id="8294895455164415895">ເປີດການຕັ້ງຄ່າເພື່ອໃຫ້ Chrome ແນະນຳກຸ່ມແຖບ</translation> <translation id="8295449579927246485">ແປດ່ວນ</translation> <translation id="8295450130892483256">ຕິດຕັ້ງ Microsoft 365</translation> @@ -9520,6 +9551,7 @@ <translation id="8380266723152870797">ຊື່ໜ້າຈໍ</translation> <translation id="8380941800586852976">ອັນຕະລາຍ</translation> <translation id="8381630473947706877">ເປີດ <ph name="FEATURE_NAME" /></translation> +<translation id="8382197851871630452">ສະພາບອາກາດໃນທ້ອງຖິ່ນ</translation> <translation id="8382677870544805359">ທ່ານຈະຕ້ອງຣີເຊັດອຸປະກອນນີ້ເປັນຄ່າຈາກໂຮງງານເພື່ອໃຊ້ຄຸນສົມບັດສຳລັບອົງກອນ.</translation> <translation id="8382715499079447151">ການປົກປ້ອງການເບິ່ງ</translation> <translation id="8382913212082956454">ກັອບປີ້ທີ່ຢູ່ອີເມວ</translation> @@ -9710,6 +9742,7 @@ <translation id="8528962588711550376">ກໍາລັງລົງຊື່ເຂົ້າໃຊ້.</translation> <translation id="8529578450330869579">ໃຊ້ລະບົບຊື່ໂດເມນທີ່ປອດໄພ (DNS) ເພື່ອປ້ອງກັນບໍ່ໃຫ້ຄົນທີ່ມີສິດເຂົ້າເຖິງອິນເຕີເນັດຂອງທ່ານເບິ່ງວ່າທ່ານເຂົ້າເບິ່ງເວັບໄຊໃດ. ການດຳເນີນການນີ້ຈະໃຊ້ຜູ້ໃຫ້ບໍລິການທີ່ມີການຈັດການຢູ່ <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /></translation> <translation id="8529925957403338845">ການເຊື່ອມຕໍ່ການປ່ອຍສັນຍາທັນທີບໍ່ສຳເລັດ</translation> +<translation id="8531367864749403520">ເລືອກ "ເຊື່ອງກຸ່ມ" ເພື່ອລຶບກຸ່ມອອກຈາກລາຍແຖບຂອງທ່ານ</translation> <translation id="8531701051932785007">Safe Browsing ທີ່ປັບປຸງດີຂຶ້ນຖືກປິດໄວ້ຢູ່</translation> <translation id="8533670235862049797">Safe Browsing ເປີດຢູ່</translation> <translation id="8534656636775144800">ອຸ້ຍ! ມີບາງຢ່າງຜິດພາດໃນເວລາພະຍາຍາມເຂົ້າຮ່ວມໂດເມນ. ກະລຸນາລອງອີກຄັ້ງ.</translation> @@ -9836,6 +9869,7 @@ <translation id="8639635302972078117">ສົ່ງຂໍ້ມູນການນຳໃຊ້ ແລະ ການວິເຄາະ. ອຸປະກອນນີ້ກຳລັງສົ່ງຂໍ້ມູນການວິເຄາະ, ຂໍ້ມູນອຸປະກອນ ແລະ ການໃຊ້ແອັບໃຫ້ Google ໂດຍອັດຕະໂນມັດໃນຂະນະນີ້. ຂໍ້ມູນນີ້ຈະບໍ່ຖືກໃຊ້ເພື່ອລະບຸຕົວລູກຂອງທ່ານ ແລະ ຈະຊ່ວຍປັບປຸງຄວາມສະຖຽນຂອງລະບົບ ແລະ ແອັບ ແລະ ການປັບປຸງອື່ນໆ. ບາງຂໍ້ມູນແບບຮວມກັນຍັງຈະຊ່ວຍແອັບ ແລະ ຮຸ້ນສ່ວນຂອງ Google ນຳອີກ ເຊັ່ນ: ຜູ້ພັດທະນາ Android. ຖ້າເປີດການຕັ້ງຄ່າການເຄື່ອນໄຫວເວັບ ແລະ ແອັບເພີ່ມເຕີມສໍາລັບລູກຂອງທ່ານ, ລະບົບອາດຈະບັນທຶກຂໍ້ມູນນີ້ໄວ້ໃນບັນຊີ Google ຂອງເຂົາເຈົ້າ.</translation> <translation id="8640575194957831802">ເປີດຫຼ້າສຸດ</translation> <translation id="8641946446576357115">ໃຊ້ລະຫັດຜ່ານຂອງທ່ານຢູ່ອຸປະກອນ iOS ທ່ານ</translation> +<translation id="8642577642520207435">ການອະນຸຍາດກ້ອງຖ່າຍຮູບຂອງ <ph name="APP_NAME" /></translation> <translation id="8642900771896232685">2 ວິນາທີ</translation> <translation id="8642947597466641025">ເຮັດໃຫ້ຂໍ້ຄວາມໃຫຍ່ຂຶ້ນ</translation> <translation id="8643403533759285912">ລຶບກຸ່ມ</translation> @@ -9870,6 +9904,7 @@ <translation id="8662978096466608964">Chrome ບໍ່ສາມາດຕັ້ງພາບພື້ນຫຼັງໜ້າຈໍໄດ້.</translation> <translation id="8663051876219324457">ອະນຸຍາດໃຫ້ແອັບ, ເວັບໄຊ ແລະ ບໍລິການຂອງລະບົບໃຊ້ສະຖານທີ່ຂອງທ່ານ. ສະຖານທີ່ອາດໃຊ້ຂໍ້ມູນຈາກແຫຼ່ງທີ່ມາຕ່າງໆ ເຊັ່ນ: Wi‑Fi, ເຄືອຂ່າຍມືຖື ແລະ ເຊັນເຊີເພື່ອຊ່ວຍຄາດຄະເນສະຖານທີ່ຂອງອຸປະກອນຂອງທ່ານ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="8663099077749055505">ບລັອກການດາວໂຫຼດອັດຕະໂນມັດຫຼາຍອັນຢູ່ໃນ <ph name="HOST" /> ສະເໝີ</translation> +<translation id="8664249499245357248">ຄລິກຂວາໃສ່ຊື່ກຸ່ມ</translation> <translation id="8664389313780386848">ເບິ່ງແຫຼ່ງທີ່ມາຂອງໜ້າ</translation> <translation id="8665110742939124773">ທ່ານລະບຸລະຫັດການເຂົ້າຫາບໍ່ຖືກຕ້ອງ. ລອງໃໝ່.</translation> <translation id="8665180165765946056">ສຳຮອງຂໍ້ມູນສຳເລັດແລ້ວ</translation> @@ -10194,6 +10229,7 @@ <translation id="8900413463156971200">ເປີດການນຳໃຊ້ເຄືອຂ່າຍມືຖື</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> ກຳນົດໃຫ້ທ່ານສຳຮອງຂໍ້ມູນຂອງທ່ານໄວ້ ແລະ ສົ່ງ <ph name="DEVICE_TYPE" /> ນີ້ຄືນໃນມື້ນີ້.}other{<ph name="MANAGER" /> ກຳນົດໃຫ້ທ່ານສຳຮອງຂໍ້ມູນຂອງທ່ານໄວ້ ແລະ ສົ່ງ <ph name="DEVICE_TYPE" /> ນີ້ຄືນກ່ອນເວລາທີ່ກຳນົດໄວ້.}}</translation> <translation id="8902667442496790482">ເປີດການຕັ້ງຄ່າເລືອກເພື່ອເວົ້າ</translation> +<translation id="8903733144777177139">ສິດເຂົ້າເຖິງໄມໂຄຣໂຟນຖືກບລັອກ</translation> <translation id="890616557918890486">ປ່ຽນແຫຼ່ງ</translation> <translation id="8907701755790961703">ກະລຸນາເລືອກປະເທດ</translation> <translation id="8908420399006197927">ບໍ່ຮວມແຖບຈາກກຸ່ມທີ່ແນະນຳ</translation> @@ -10231,6 +10267,7 @@ <translation id="8934732568177537184">ສືບຕໍ່</translation> <translation id="8938800817013097409">ອຸປະກອນ USB-C (ຜອດດ້ານຂວາຢູ່ເບື້ອງຫຼັງ)</translation> <translation id="8940081510938872932">ຄອມພິວເຕີຂອງທ່ານກໍາລັງເຮັດຫຼາຍສິ່ງຫຼາຍຢ່າງເກີນໄປດຽວນີ້. ລອງໃໝ່ອີກພາຍຫຼັງ.</translation> +<translation id="8940228279218723234">ອະນຸຍາດສິດເຂົ້າເຖິງສຳລັບແອັບ ແລະ ເວັບໄຊທີ່ມີການອະນຸຍາດກ້ອງ ແລະ ບໍລິການຂອງລະບົບ. ເພື່ອໃຊ້ກ້ອງ, ທ່ານອາດຕ້ອງຣີສະຕາດແອັບ ຫຼື ໂຫຼດຂໍ້ມູນໜ້າຄືນໃໝ່.</translation> <translation id="8940381019874223173">ຈາກ Google ຮູບພາບຂອງທ່ານ</translation> <translation id="8940888110818450052">ຕົວເລືອກການເຂົ້າສູ່ລະບົບ</translation> <translation id="8941173171815156065">ຖອນໃບອະນຸຍາດ '<ph name="PERMISSION" />' ຄືນ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 1e520557..ffd97b50 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -685,7 +685,6 @@ <translation id="1521933835545997395">Susieta su „Android“ telefonu</translation> <translation id="1523279371236772909">Žiūrėta pastarąjį mėnesį</translation> <translation id="1523978563989812243">Teksto į kalbą varikliai</translation> -<translation id="1524430321211440688">Klaviatūra</translation> <translation id="1524563461097350801">Ačiū, ne</translation> <translation id="1525740877599838384">Naudoti tik „Wi‑Fi“ vietovei nustatyti</translation> <translation id="152629053603783244">Iš naujo paleisti „Linux“</translation> @@ -2221,7 +2220,7 @@ <translation id="2643698698624765890">„Lango“ meniu spustelėję „Plėtiniai“, tvarkykite plėtinius.</translation> <translation id="2645047101481282803">Įrenginį tvarko <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Šis skirtukas perduodamas į „<ph name="DEVICE_NAME" />“</translation> -<translation id="2645435784669275700">„Chrome“ OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Protanomalija</translation> <translation id="2649045351178520408">„Base64“ užkoduotas ASCII, sertifikato grandinė</translation> <translation id="265156376773362237">Įprastas išankstinis įkėlimas</translation> @@ -3926,7 +3925,6 @@ <translation id="3966072572894326936">Pasirinkti kitą aplanką...</translation> <translation id="3966094581547899417">Išsami viešosios interneto prieigos taško informacija</translation> <translation id="3967822245660637423">Atsisiuntimas baigtas</translation> -<translation id="3967841595862839006">Kalbos ir klaviatūros pasirinkimas</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Skaičiuojama...</translation> @@ -4608,7 +4606,6 @@ <translation id="4513872120116766993">Numatomi rašymo pasiūlymai</translation> <translation id="4513946894732546136">Atsiliepimai</translation> <translation id="4515872537870654449">Susisiekite su „Dell“ dėl techninės priežiūros paslaugų. Jei ventiliatorius neveikia, dokas išsijungs.</translation> -<translation id="4516008165284813420">Įsitikinkite, kad „<ph name="DEVICE_TYPE" />“ prijungtas prie interneto, ir bandykite dar kartą. Be to, galite apsilankyti adresu play.google.com/about/play-terms kitame įrenginyje.</translation> <translation id="4518840066030486079">Klavišo „Shift“ režimo stilius</translation> <translation id="4519331665958994620">Svetainėse gali būti prašoma naudoti jūsų fotoaparatą</translation> <translation id="4519605771716872386">Failų sinchronizavimas įjungtas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 6860862..285fbe82 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Izveidots savienojums ar Android tālruni</translation> <translation id="1523279371236772909">Skatīts pēdējā mēneša laikā</translation> <translation id="1523978563989812243">Teksta pārvēršanas runā programmas</translation> -<translation id="1524430321211440688">Tastatūra</translation> <translation id="1524563461097350801">Nē, paldies</translation> <translation id="1525740877599838384">Izmantot tikai Wi-Fi tīklu, lai noteiktu atrašanās vietu</translation> <translation id="152629053603783244">Restartēt operētājsistēmu Linux</translation> @@ -3910,7 +3909,6 @@ <translation id="3966072572894326936">Izvēlēties citu mapi...</translation> <translation id="3966094581547899417">Informācija par tīklāju</translation> <translation id="3967822245660637423">Lejupielāde pabeigta</translation> -<translation id="3967841595862839006">Valodas un tastatūras izvēlēšanās</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Aprēķina...</translation> @@ -4591,7 +4589,6 @@ <translation id="4513872120116766993">Rakstīšanas prognozēšana</translation> <translation id="4513946894732546136">Atsauksmes</translation> <translation id="4515872537870654449">Sazinieties ar Dell klientu apkalpošanas dienestu. Ja ventilators nedarbosies, doks izslēgsies.</translation> -<translation id="4516008165284813420">Pārbaudiet, vai jūsu ierīce (<ph name="DEVICE_TYPE" />) ir savienota ar internetu, un mēģiniet vēlreiz. Varat arī apmeklēt vietni play.google.com/about/play-terms citā ierīcē.</translation> <translation id="4518840066030486079">Pārslēgšanas taustiņa režīma stils</translation> <translation id="4519331665958994620">Neļaut vietnēm pieprasīt piekļuvi kamerai</translation> <translation id="4519605771716872386">Failu sinhronizācija ir ieslēgta.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 1f7954e7..ef24442 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Поврзано со телефон со Android</translation> <translation id="1523279371236772909">Прегледано во изминатиот месец</translation> <translation id="1523978563989812243">Екстензии за „Од текст во говор“</translation> -<translation id="1524430321211440688">Тастатура</translation> <translation id="1524563461097350801">Не, фала</translation> <translation id="1525740877599838384">Користи само Wi-Fi за утврдување на локацијата</translation> <translation id="152629053603783244">Рестартирај го Linux</translation> @@ -2219,7 +2218,7 @@ <translation id="2643698698624765890">Уредувајте ги наставките со кликнување на Наставки во менито Прозорец.</translation> <translation id="2645047101481282803">Со уредот управува <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Се емитува картичкава на <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Протаномалија</translation> <translation id="2649045351178520408">Base64-шифриран ASCII, ланец на сертификати</translation> <translation id="265156376773362237">Стандардно вчитување однапред</translation> @@ -3924,7 +3923,6 @@ <translation id="3966072572894326936">Одберете друга папка...</translation> <translation id="3966094581547899417">Детали за точка на пристап</translation> <translation id="3967822245660637423">Преземањето е завршено</translation> -<translation id="3967841595862839006">Изберете ги јазикот и тастатурата</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Се пресметува…</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">Предвидливо пишување</translation> <translation id="4513946894732546136">Повратни информации</translation> <translation id="4515872537870654449">Контактирајте со Dell за сервисирање. Приклучокот ќе се исклучи ако вентилаторот не работи.</translation> -<translation id="4516008165284813420">Проверете дали уредот <ph name="DEVICE_TYPE" /> е поврзан на интернет, па обидете се повторно. Може и да одите на play.google.com/about/play-terms на друг уред.</translation> <translation id="4518840066030486079">Стил на режим на копчето Shift</translation> <translation id="4519331665958994620">Сајтовите може да прашуваат дали да ја користат камерата</translation> <translation id="4519605771716872386">Синхронизацијата на датотеките е вклучена</translation> @@ -5208,7 +5205,7 @@ <translation id="4992443049233195791">Поставки за датотеките Microsoft 365</translation> <translation id="4992458225095111526">Потврди фабричко ресетирање</translation> <translation id="4992473555164495036">Администраторот ги ограничил достапните методи за внесување.</translation> -<translation id="4992869834339068470">Помогнете да се подобрат функциите и изведбата на Chrome OS. Податоците се збирни и со високо ниво заштита.</translation> +<translation id="4992869834339068470">Помогнете да се подобрат функциите и изведбата на ChromeOS. Податоците се збирни и со високо ниво на заштита.</translation> <translation id="4994426888044765950">Ако задржите притиснато дадено копче, знакот на копчето ќе се повтори</translation> <translation id="4994754230098574403">Се поставува</translation> <translation id="4995293419989417004">Дознајте повеќе за темите за реклами</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 39d0bdd..ae1fd9a 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -343,6 +343,7 @@ <translation id="1251578593170406502">മൊബൈൽ ഡാറ്റാ നെറ്റ്വർക്കുകൾക്കായി സ്കാൻ ചെയ്യുന്നു...</translation> <translation id="125220115284141797">ഡിഫോൾട്ട്</translation> <translation id="1252219782845132919">ഗ്രൂപ്പ് മറയ്ക്കുക</translation> +<translation id="1252714168533640068">ഗ്രൂപ്പ് വീണ്ടും തുറക്കാൻ, ഗ്രൂപ്പിന്റെ പേരിൽ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="1252987234827889034">പ്രൊഫൈലിൽ പ്രശ്നമുണ്ടായി</translation> <translation id="1253664522045778676">ഫലത്തിൽ ക്ലിക്ക് ചെയ്യുക, അപ്പോൾ നിങ്ങളുടെ നിലവിലെ ടാബിൽ പേജ് തുറക്കും</translation> <translation id="1254593899333212300">നേരിട്ടുള്ള ഇന്റര്നെറ്റ് കണക്ഷന്</translation> @@ -623,6 +624,7 @@ <translation id="1476347941828409626">Chrome പ്രൊഫൈലുകൾ മാനേജ് ചെയ്യുക</translation> <translation id="1476607407192946488">&ഭാഷ ക്രമീകരണം</translation> <translation id="1477446329585670721"><ph name="DOMAIN" />-ൽ തുടരുന്നതിന് നിങ്ങളുടെ സ്മാർട്ട് കാർഡ് ഇൻസേർട്ട് ചെയ്ത നിലയിൽ തുടരേണ്ടതുണ്ട്.</translation> +<translation id="1477645000789043442">നിങ്ങളുടെ തുറന്നിരിക്കുന്ന ടാബുകളെ അടിസ്ഥാനമാക്കി സ്വയമേവ ടാബ് ഗ്രൂപ്പുകൾ സൃഷ്ടിക്കുന്നു. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ, ഒരു ടാബിൽ വലത്-ക്ലിക്ക് ചെയ്ത് സമാന ടാബുകൾ 'ഓർഗനൈസ് ചെയ്യുക' ക്ലിക്ക് ചെയ്യുക.</translation> <translation id="1477654881618305065">ഈ ഉള്ളടക്കം പങ്കിടാൻ നിങ്ങളുടെ സ്ഥാപനം അനുവദിക്കുന്നില്ല. നിങ്ങൾക്ക് സഹായം ആവശ്യമുണ്ടെങ്കിൽ, നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="1478340334823509079">വിശദാംശങ്ങൾ: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">ഇൻസ്റ്റലേഷൻ പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ല</translation> @@ -678,7 +680,6 @@ <translation id="1521933835545997395">Android ഫോണിലേക്ക് കണക്റ്റ് ചെയ്തു</translation> <translation id="1523279371236772909">കഴിഞ്ഞ മാസം കണ്ടു</translation> <translation id="1523978563989812243">ടെക്സ്റ്റ് ടു സ്പീച്ച് എഞ്ചിനുകൾ</translation> -<translation id="1524430321211440688">കീബോർഡ്</translation> <translation id="1524563461097350801">വേണ്ട</translation> <translation id="1525740877599838384">ലൊക്കേഷൻ നിർണ്ണയിക്കാൻ വൈഫൈ മാത്രം ഉപയോഗിക്കുക</translation> <translation id="152629053603783244">Linux റീസ്റ്റാർട്ട് ചെയ്യുക</translation> @@ -877,6 +878,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">ലൊക്കേഷൻ നിർണ്ണയിക്കാൻ വൈഫൈ അല്ലെങ്കിൽ മൊബൈൽ നെറ്റ്വര്ക്കുകൾ ഉപയോഗിക്കുക</translation> <translation id="164936512206786300">Bluetooth ഉപകരണം ജോടി പിരിക്കുക</translation> +<translation id="1650407365859096313">പുതിയ ടാബിൽ തുറക്കുന്നു, <ph name="PERMISSION_STATE" /> എന്നതാണ് അനുമതി</translation> <translation id="1650801028905250434">'എന്റെ ഡ്രൈവ്' എന്നതിലെ ഫയലുകൾ നിങ്ങളുടെ Chromebook-ലേക്ക് സ്വയമേവ സമന്വയിപ്പിക്കും, അതുവഴി ഇന്റർനെറ്റ് കണക്ഷനില്ലാതെ തന്നെ നിങ്ങൾക്ക് അവ ആക്സസ് ചെയ്യാനാകും. ക്രമീകരണം > Files എന്നതിൽ ഏതുസമയത്തും നിങ്ങൾക്കിത് മാറ്റാം.</translation> <translation id="1651008383952180276">ഒരേ പാസ്ഫ്രെയ്സ് തന്നെ നിങ്ങള് രണ്ടുതവണ നല്കേണ്ടതുണ്ട്</translation> <translation id="1651609627703324721">ഈ ടാബ് ഒരു ഹെഡ്സെറ്റിലേക്ക് VR ഉള്ളടക്കം അവതരിപ്പിക്കുന്നു</translation> @@ -1113,6 +1115,7 @@ <translation id="1828901632669367785">സിസ്റ്റം ഡയലോഗ് ഉപയോഗിച്ച് പ്രിന്റ് ചെയ്യുക...</translation> <translation id="1829129547161959350">പെൻഗ്വിൻ</translation> <translation id="1829192082282182671">സൂം &ഔട്ട് ചെയ്യുക</translation> +<translation id="182973053761690772">സൂര്യാസ്തമയ ഷെഡ്യൂൾ</translation> <translation id="1830550083491357902">പ്രവേശിച്ചിട്ടില്ല</translation> <translation id="1831848493690504725">കണക്റ്റ് ചെയ്ത നെറ്റ്വർക്കിലൂടെ ഞങ്ങൾക്ക് Google-ലേക്ക് എത്തിച്ചേരാനാകുന്നില്ല. മറ്റൊരു നെറ്റ്വർക്ക് തിരഞ്ഞെടുക്കാനോ നിങ്ങളുടെ നെറ്റ്വർക്ക് ക്രമീകരണമോ പ്രോക്സി ക്രമീകരണമോ പരിശോധിക്കാനോ ശ്രമിക്കുക (നിങ്ങൾ ഒരു പ്രോക്സിയാണ് ഉപയോഗിക്കുന്നതെങ്കിൽ).</translation> <translation id="1832459821645506983">ഞാൻ സമ്മതിക്കുന്നു</translation> @@ -1169,6 +1172,7 @@ <translation id="1871615898038944731">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> അപ്ടുഡേറ്റാണ്</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> എന്നതിന് വീണ്ടും അനുമതികൾ നൽകുക</translation> <translation id="1874248162548993294">എല്ലാ പരസ്യങ്ങളും കാണിക്കുന്നത് അനുവദിച്ചിരിക്കുന്നു</translation> +<translation id="1874794096607967241">ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും ക്യാമറാ ആക്സസിനും സിസ്റ്റം സേവനങ്ങൾക്കും അനുമതി നൽകൂ.</translation> <translation id="1874874185178737347">ടാബുകൾ ഓർഗനൈസ് ചെയ്യുക</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ടാബ് മറ്റൊരു വിൻഡോയിലേക്ക് നീക്കുക}other{ടാബുകൾ മറ്റൊരു വിൻഡോയിലേക്ക് നീക്കുക}}</translation> <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" />-ല് നിന്ന് മാത്രമേ ഇത് ചേർക്കാനാവൂ</translation> @@ -1208,6 +1212,7 @@ <translation id="1901303067676059328">എല്ലാം &തിരഞ്ഞെടുക്കൂ</translation> <translation id="1903542130902305074">സജ്ജീകരിക്കൽ</translation> <translation id="1904580727789512086">നിങ്ങൾ സന്ദർശിക്കുന്ന URL-കൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കുന്നു</translation> +<translation id="1904603806662441960">Chrome-ൽ സൈറ്റിനുള്ള ക്യാമറാ അനുമതികൾ മാനേജ് ചെയ്യുക</translation> <translation id="1905375423839394163">Chromebook ഉപകരണ നാമം</translation> <translation id="1906181697255754968">നിങ്ങളുടെ വർക്ക് സ്വയമേവ സംരക്ഷിക്കുന്നത് പോലുള്ള ഫീച്ചറുകൾക്ക്, സൈറ്റുകൾ സാധാരണയായി നിങ്ങളുടെ ഉപകരണത്തിലെ ഫയലുകളും ഫോൾഡറുകളും ആക്സസ് ചെയ്യാറുണ്ട്</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome വെബ് സ്റ്റോറിൽ<ph name="END_LINK" /> കൂടുതൽ വിപുലീകരണങ്ങളും തീമുകളും കണ്ടെത്തുക</translation> @@ -1348,6 +1353,7 @@ <translation id="200928901437634269">നിങ്ങളുടെ കുട്ടിയുടെ Google Account അല്ലെങ്കിൽ ഒരു സ്കൂൾ അക്കൗണ്ട് ഉപയോഗിക്കുക. നിങ്ങൾക്ക് രക്ഷാകർതൃ നിയന്ത്രണങ്ങളും സജ്ജീകരിക്കാം.</translation> <translation id="2009590708342941694">ഇമോജി ടൂൾ</translation> <translation id="2010501376126504057">അനുയോജ്യമായ ഉപകരണങ്ങൾ</translation> +<translation id="201217432804812273">"ഗ്രൂപ്പ് സംരക്ഷിക്കുക" ഓണാക്കുക</translation> <translation id="2012935757369720523">ഫയൽ ഇല്ലാതാക്കുക</translation> <translation id="2013550551806600826">ഇത് പരീക്ഷിച്ചുനോക്കൂ. ക്രമീകരണം ഓണാക്കുകയോ ഓഫാക്കുകയോ ചെയ്യുക, തുടർന്ന് പരീക്ഷണ ഏരിയയിലെ ടച്ച്പാഡിൽ രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് സ്ക്രോൾ ചെയ്യുക. നിങ്ങൾക്ക് ഇത് പിന്നീട് ക്രമീകരണം > ഉപകരണം > മൗസും ടച്ച്പാഡും എന്നതിൽ കണ്ടെത്തുകയും ചെയ്യാം.</translation> <translation id="2015232545623037616">സമാന Wi-Fi നെറ്റ്വർക്കിലെ PC, Chromecast എന്നിവ</translation> @@ -1768,6 +1774,7 @@ <translation id="2314165183524574721">നിലവിലെ ദൃശ്യപരതാ ക്രമീകരണം മറച്ചിരിക്കുന്നു</translation> <translation id="2314774579020744484">പേജുകൾ വിവർത്തനം ചെയ്യുമ്പോൾ ഉപയോഗിച്ച ഭാഷ</translation> <translation id="2316129865977710310">വേണ്ട, നന്ദി</translation> +<translation id="2316433409811863464">ആപ്പ് സ്ട്രീമിംഗ്</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% പൂർത്തിയായി</translation> <translation id="2318143611928805047">പേപ്പർ വലുപ്പം</translation> <translation id="2318817390901984578">Android ആപ്പുകൾ ഉപയോഗിക്കുന്നതിന്, നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ചാർജ് ചെയ്തശേഷം അപ്ഡേറ്റ് ചെയ്യുക.</translation> @@ -1954,6 +1961,7 @@ <translation id="2454206500483040640">വിഭജിച്ചിരിക്കുന്നു</translation> <translation id="2454247629720664989">കീവേഡ്</translation> <translation id="2454524890947537054">വെബ് അഭ്യർത്ഥന അംഗീകരിക്കണോ?</translation> +<translation id="2454913962395846391">സ്വയമേവ ഉള്ള സമയ മേഖല</translation> <translation id="245650153866130664">ഒരു ടിക്കറ്റ് സ്വയമേവ റീഫ്രഷ് ചെയ്യാൻ “പാസ്വേഡ് ഓർക്കുക” പരിശോധിക്കുക. നിങ്ങളുടെ പാസ്വേഡ് നിങ്ങളുടെ ഉപകരണത്തിൽ മാത്രമേ സംരക്ഷിക്കുകയുള്ളൂ.</translation> <translation id="2456794251167091176">ഇമ്പോർട്ടുചെയ്യൽ പൂർത്തിയായി</translation> <translation id="2456827790665612305">സൈറ്റ് അൺഫോളോ ചെയ്യൂ</translation> @@ -2912,6 +2920,7 @@ <translation id="3202499879214571401"><ph name="DEVICE_NAME" /> എന്നതിലേക്ക് സ്ക്രീൻ കാസ്റ്റ് ചെയ്യുന്നത് താൽക്കാലികമായി നിർത്തുക</translation> <translation id="3202578601642193415">ഏറ്റവും പുതിയ</translation> <translation id="3204648577100496185">ഈ ആപ്പുമായി ബന്ധപ്പെട്ട ഡാറ്റ ഈ ഉപകരണത്തിൽ നിന്ന് നീക്കം ചെയ്തേക്കാം</translation> +<translation id="3205140624385017621">ക്യാമറ അനുമതികളുള്ള ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും സിസ്റ്റം സേവനങ്ങൾക്കും നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാകും. ക്യാമറ ഉപയോഗിക്കുന്നതിന്, നിങ്ങൾ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്യുകയോ പേജ് റീഫ്രഷ് ചെയ്യുകയോ വേണ്ടി വന്നേക്കാം.</translation> <translation id="3207344462385471911">നിങ്ങളുടെ സമീപകാല ആക്റ്റിവിറ്റി അനുസരിച്ച് നിങ്ങൾക്ക് ഇഷ്ടമാകാനിടയുള്ള, നിർദ്ദേശിക്കുന്ന തിരയലുകളും ഷോപ്പിംഗ് കിഴിവുകളും നിങ്ങൾ കാണുന്നു. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3189,6 +3198,7 @@ <translation id="3434272557872943250">നിങ്ങളുടെ കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. ഈ ക്രമീകരണത്തെ കുറിച്ചും അതെങ്ങനെയാണ് ക്രമപ്പെടുത്തുന്നത് എന്നതിനെ കുറിച്ചും families.google.com എന്നതിൽ കൂടുതലറിയുക.</translation> <translation id="3434475275396485144">നിങ്ങളുടെ ഫോണിന്റെ അഡ്മിൻ ആണ് ഈ ക്രമീകരണം മാനേജ് ചെയ്യുന്നത്</translation> <translation id="3434512374684753970">ഓഡിയോയും വീഡിയോയും</translation> +<translation id="3435381311628654443">ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും മൈക്രോഫോൺ ആക്സസിനും സിസ്റ്റം സേവനങ്ങൾക്കും അനുമതി നൽകൂ.</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" നിങ്ങളുടെ <ph name="CODE_TYPE" /> അഭ്യർത്ഥിക്കുന്നു</translation> <translation id="3435738964857648380">സുരക്ഷ</translation> <translation id="343578350365773421">പേപ്പറില്ല</translation> @@ -3266,6 +3276,7 @@ <translation id="3491669675709357988">നിങ്ങളുടെ കുട്ടിയുടെ അക്കൗണ്ടിൽ Family Link-ന്റെ രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ സജ്ജീകരിച്ചിട്ടില്ല. സജ്ജീകരണം പൂർത്തിയാക്കിക്കഴിഞ്ഞാൽ നിങ്ങൾക്ക് രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ ചേർക്കാൻ കഴിയും. Explore ആപ്പിൽ രക്ഷാകർതൃ നിയന്ത്രണങ്ങളെ കുറിച്ചുള്ള വിവരങ്ങൾ നിങ്ങൾക്ക് കാണാം.</translation> <translation id="3491678231052507920">VR സെഷനുകളിൽ പ്രവേശിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നതിന് സൈറ്റുകൾ സാധാരണയായി നിങ്ങളുടെ വെർച്വൽ റിയാലിറ്റി ഉപകരണങ്ങളും ഡാറ്റയും ഉപയോഗിക്കാറുണ്ട്</translation> <translation id="3493043608231401654">ടാബ് ഗ്രൂപ്പിൽ നിന്ന് <ph name="TAB_TITLE" /> നീക്കം ചെയ്യുക</translation> +<translation id="3493463599276143766">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ വെബ്സൈറ്റുകൾക്കൊന്നും അനുവാദമില്ല</translation> <translation id="3493486281776271508">ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്</translation> <translation id="3493881266323043047">സാധുത</translation> <translation id="3495496470825196617">ചാർജ് ചെയ്യുമ്പോൾ ഉറക്ക മോഡിലാക്കുക</translation> @@ -3584,6 +3595,7 @@ <translation id="3733296813637058299">ആ ആപ്പുകൾ ഞങ്ങൾ നിങ്ങൾക്കായി ഇൻസ്റ്റാൾ ചെയ്യും. നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഉപകരണത്തിനുള്ള കൂടുതൽ ആപ്പുകൾ Play Store-ൽ കണ്ടെത്താം.</translation> <translation id="3735039640698208086">ഓഡിയോ പ്ലേ ചെയ്യുമ്പോൾ...</translation> <translation id="3735740477244556633">ഇപ്രകാരം അടുക്കുക</translation> +<translation id="3735827758948958091">മീറ്റർ ചെയ്ത കണക്ഷനിലായിരിക്കുമ്പോൾ <ph name="FILE_NAMES" /> തുറക്കാനാകില്ല</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> ഡാറ്റ 24 മണിക്കൂറിനുള്ളിൽ ഇല്ലാതാക്കും</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> തുറക്കണോ?</translation> @@ -3852,6 +3864,7 @@ <translation id="3925573269917483990">ക്യാമറ:</translation> <translation id="3925926055063465902">ഈ ഉപകരണത്തിലെ മറ്റ് ഉപയോക്താക്കൾക്കും ഈ നെറ്റ്വർക്ക് ഉപയോഗിക്കാനാകും</translation> <translation id="3926002189479431949">Smart Lock ഫോൺ മാറി</translation> +<translation id="3926410220776569451">ക്യാമറാ ആക്സസ് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="3927932062596804919">നിരസിക്കൂ</translation> <translation id="3928570707778085600"><ph name="FILE_OR_FOLDER_NAME" /> മാറ്റങ്ങൾ എന്നതിലേക്ക് സംരക്ഷിക്കണോ?</translation> <translation id="3928659086758780856">മഷി കുറവാണ്</translation> @@ -3906,7 +3919,6 @@ <translation id="3966072572894326936">മറ്റൊരു ഫോള്ഡര് തിരഞ്ഞെടുക്കൂ...</translation> <translation id="3966094581547899417">ഹോട്ട്സ്പോട്ടിന്റെ വിശദാംശങ്ങൾ</translation> <translation id="3967822245660637423">ഡൗൺലോഡ് പൂർത്തിയായി</translation> -<translation id="3967841595862839006">നിങ്ങളുടെ ഭാഷയും കീബോർഡും തിരഞ്ഞെടുക്കുക</translation> <translation id="3968739731834770921">കാന</translation> <translation id="3970114302595058915">ഐഡി</translation> <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation> @@ -4046,6 +4058,7 @@ <translation id="4078738236287221428">അഗ്രസ്സീവ്</translation> <translation id="4078903002989614318">അടുക്കുന്നതിന്റെയും ലിസ്റ്റ് ചെയ്യുന്നതിന്റെയും ഓപ്ഷനുകൾ</translation> <translation id="4079140982534148664">മെച്ചപ്പെട്ട സ്പെൽ ചെക്ക് ഉപയോഗിക്കുക</translation> +<translation id="4082333918978320301">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ വെബ്സൈറ്റുകൾക്കൊന്നും അനുവാദമില്ല</translation> <translation id="4084582735848141214">{COUNT,plural, =1{ഒരു സൈറ്റ് അനുവദനീയം}other{# സൈറ്റുകൾ അനുവദനീയം}}</translation> <translation id="4084682180776658562">ബുക്മാര്ക്ക്</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> അടയ്ക്കുക</translation> @@ -4195,6 +4208,7 @@ <translation id="4201546031411513170">എന്തൊക്കെ സമന്വയിക്കണമെന്നത് ക്രമീകരണത്തിൽ നിങ്ങൾക്ക് എപ്പോഴും തിരഞ്ഞെടുക്കാം.</translation> <translation id="4203065553461038553">ഫയലിന്റെ പേരോ ലൊക്കേഷനോ വളരെ നീണ്ടതാണ്</translation> <translation id="4203769790323223880">ക്യാമറ ആക്സസ് അനുവദിച്ചില്ല</translation> +<translation id="4204415812590935863">ഇപ്പോൾ ഒരു തീം സൃഷ്ടിക്കാനാകില്ല.</translation> <translation id="4205157409548006256">Linux കോൺഫിഗർ ചെയ്യുന്നതിനിടെ പിശകുണ്ടായി.</translation> <translation id="4206144641569145248">അന്യഗ്രഹജീവി</translation> <translation id="4206323443866416204">ഫീഡ്ബാക്ക് റിപ്പോർട്ട്</translation> @@ -4536,6 +4550,7 @@ <translation id="447252321002412580">Chrome-ന്റെ ഫീച്ചറുകളും പ്രകടനവും മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation> <translation id="4472533928615930332"><ph name="STYLE" /> സ്റ്റൈലിൽ <ph name="SUBJECT" /> എന്ന വിഷയവുമായി ബന്ധപ്പെട്ട <ph name="INDEX" />-ാമത്തെ ചിത്രം സൃഷ്ടിച്ചു</translation> <translation id="4472575034687746823">ആരംഭിക്കാം</translation> +<translation id="4473559657152613417">ഒരു ടാബിൽ വലത്-ക്ലിക്ക് ചെയ്ത് "പുതിയ ഗ്രൂപ്പിലേക്ക് ടാബ് ചേർക്കുക" ക്ലിക്ക് ചെയ്യുക</translation> <translation id="4473996011558324141">സമയം കണക്കാക്കുന്നു</translation> <translation id="4474155171896946103">എല്ലാ ടാബുകളും ബുക്ക്മാര്ക്ക് ചെയ്യുക...</translation> <translation id="4475552974751346499">ഡൌണ്ലോഡുകള് തിരയുക</translation> @@ -4587,7 +4602,6 @@ <translation id="4513872120116766993">എഴുത്ത് പ്രവചിക്കൽ</translation> <translation id="4513946894732546136">ഫീഡ്ബാക്ക്</translation> <translation id="4515872537870654449">സർവീസ് ചെയ്യാൻ Dell-നെ ബന്ധപ്പെടുക. ഫാൻ പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ ഡോക്ക് ഷട്ട് ഡൗൺ ആകും.</translation> -<translation id="4516008165284813420">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക. നിങ്ങൾക്ക് മറ്റൊരു ഉപകരണത്തിൽ play.google.com/about/play-terms സന്ദർശിക്കുകയും ചെയ്യാം.</translation> <translation id="4518840066030486079">Shift കീ മോഡ് സ്റ്റൈൽ</translation> <translation id="4519331665958994620">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കാം</translation> <translation id="4519605771716872386">ഫയൽ സമന്വയിപ്പിക്കൽ ഓണാക്കി</translation> @@ -4631,6 +4645,7 @@ <translation id="4547672827276975204">സ്വയമേവ സജ്ജമാക്കുക</translation> <translation id="4548858987594081919">സൈൻ ഇൻ വിവരങ്ങൾ സംരക്ഷിക്കാൻ, Google Password Manager എന്നതിനെ സഹായിക്കുന്നതിന്, ഈ സൈറ്റിനായി നിങ്ങളുടെ ഉപയോക്തൃനാമം ചേർക്കുക</translation> <translation id="4549791035683739768">നിങ്ങളുടെ സുരക്ഷാ കീയിൽ സംരക്ഷിച്ച ഫിംഗർപ്രിന്റുകളൊന്നുമില്ല</translation> +<translation id="4550737096585299960">അൽപ്പസമയത്തിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4550926046134589611"><ph name="APP_NAME" /> ആപ്പിൽ ചില പിന്തുണാ ലിങ്കുകൾ തുടർന്നും തുറക്കാനാകും.</translation> <translation id="4551379727767354516">നിങ്ങളുടെ സമീപകാല AI തീമുകൾ</translation> <translation id="4551763574344810652">പഴയപടിയാക്കാൻ <ph name="MODIFIER_KEY_DESCRIPTION" /> അമർത്തുക</translation> @@ -5255,6 +5270,7 @@ <translation id="5051461727068120271">പരിശോധിച്ചുറപ്പിക്കാത്ത ഫയൽ ഡൗൺലോഡ് ചെയ്യുക</translation> <translation id="5051836348807686060">നിങ്ങൾ തിരഞ്ഞെടുത്ത ഭാഷകൾക്ക് സ്പെൽ ചെക്ക് പിന്തുണയ്ക്കുന്നില്ല</translation> <translation id="5052499409147950210">സൈറ്റ് എഡിറ്റ് ചെയ്യുക</translation> +<translation id="5052853071318006357">ഒരു ടാബിൽ വലത്-ക്ലിക്ക് ചെയ്ത് "പുതിയ ഗ്രൂപ്പിലേക്ക് ടാബ് ചേർക്കുക" ക്ലിക്ക് ചെയ്യുക</translation> <translation id="5053233576223592551">ഉപയോക്തൃനാമം ചേർക്കുക</translation> <translation id="505347685865235222">പേരില്ലാത്ത ഗ്രൂപ്പ് - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />Chrome ഇഷ്ടാനുസൃതമാക്കുക<ph name="END_LINK" /> എന്നതിൽ എല്ലാ കാർഡ് ഓപ്ഷനുകളും കാണുക</translation> @@ -5291,6 +5307,7 @@ <translation id="5078638979202084724">എല്ലാ ടാബുകളും ബുക്ക്മാര്ക്ക് ചെയ്യുക</translation> <translation id="5078796286268621944">തെറ്റായ PIN</translation> <translation id="5079010647467150187">ബിൽറ്റ് ഇൻ VPN ചേർക്കുക...</translation> +<translation id="5079460277417557557">നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന ഡെസ്ക്ടോപ്പ് ഉപകരണങ്ങളിലുടനീളം സംരക്ഷിച്ച ടാബ് ഗ്രൂപ്പുകൾ ഇപ്പോൾ ഉപയോഗിക്കാം</translation> <translation id="5079699784114005398">ഓണാക്കിക്കഴിഞ്ഞാൽ, നിങ്ങളുടെ Google Account ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുന്ന എല്ലാ ChromeOS ഉപകരണങ്ങളിലും ആപ്പുകൾ ലഭ്യമാകും. ബ്രൗസർ സമന്വയം ഓഫാക്കിയാൽ പോലും Chrome ബ്രൗസറിൽ നിന്ന് ഇൻസ്റ്റാൾ ചെയ്ത വെബ് ആപ്പുകൾ സമന്വയിപ്പിക്കും.</translation> <translation id="508059534790499809">Kerberos ടിക്കറ്റ് റീഫ്രഷ് ചെയ്യുക</translation> <translation id="5081124414979006563">അതിഥി പ്രൊഫൈൽ തുറക്കുക</translation> @@ -5354,6 +5371,7 @@ <translation id="5125967981703109366">ഈ കാർഡിനെ കുറിച്ച്</translation> <translation id="512642543295077915">തിരയൽ + backspace</translation> <translation id="5126611267288187364">മാറ്റങ്ങൾ കാണുക</translation> +<translation id="512761462447738469">ക്യാമറ അനുമതികളുള്ള ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും സിസ്റ്റം സേവനങ്ങൾക്കും നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാകും</translation> <translation id="5127620150973591153">സുരക്ഷിത കണക്ഷൻ ഐഡി: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">സമന്വയം ഓഫാണ്</translation> <translation id="5127881134400491887">നെറ്റ്വർക്ക് കണക്ഷനുകൾ നിയന്ത്രിക്കുക</translation> @@ -6060,6 +6078,7 @@ <translation id="5691581861107245578">നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്നതിന്റെ അടിസ്ഥാനത്തിൽ ഇമോജി നിർദ്ദേശങ്ങൾ നേടുക</translation> <translation id="5691772641933328258">വിരലടയാളം തിരിച്ചറിഞ്ഞില്ല</translation> <translation id="5692183275898619210">പ്രിന്റ് ചെയ്യൽ പൂർത്തിയായി</translation> +<translation id="5693237475389615913">Chrome-ൽ സൈറ്റിനുള്ള മൈക്രോഫോൺ അനുമതികൾ മാനേജ് ചെയ്യുക</translation> <translation id="5693255400847650006">മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation> <translation id="5695184138696833495">Linux Android ആപ്പ് ADB</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" എന്നതിൽ നിന്നുള്ള ദുരുപയോഗം റിപ്പോർട്ട് ചെയ്യുക</translation> @@ -6081,6 +6100,7 @@ <translation id="5708171344853220004">Microsoft പ്രിന്സിപ്പല് നാമം</translation> <translation id="5709557627224531708">Chrome-നെ നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> <translation id="5711010025974903573">സേവന ലോഗുകൾ</translation> +<translation id="5711324642850167289">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ ആപ്പുകൾക്കൊന്നും അനുവാദമില്ല</translation> <translation id="5711983031544731014">അൺലോക്ക് ചെയ്യാനായില്ല. നിങ്ങളുടെ പാസ്വേഡ് നൽകുക.</translation> <translation id="5712153969432126546">സൈറ്റുകൾ ചിലപ്പോൾ ഡോക്യുമെന്റുകളും കരാറുകളും ഫോമുകളും പോലുള്ള PDF-കൾ പ്രസിദ്ധീകരിക്കുന്നു</translation> <translation id="571222594670061844">സൈറ്റുകൾക്ക് സമാന സേവനങ്ങളിൽ നിന്നുള്ള സൈൻ ഇൻ നിർദ്ദേശങ്ങൾ കാണിക്കാം</translation> @@ -6272,6 +6292,7 @@ <translation id="5862319196656206789">കണക്റ്റ് ചെയ്തിരിക്കുന്ന ഉപകരണങ്ങൾ സജ്ജീകരിക്കുക</translation> <translation id="5862731021271217234">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിൽ നിന്നുള്ള ടാബുകൾ ലഭിക്കാൻ, സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> <translation id="5863195274347579748">ബാഹ്യ ആക്സസറികൾക്ക് വ്യക്തിപരമായ ഡാറ്റ ആക്സസ് ചെയ്യാനോ പങ്കിടാനോ കഴിഞ്ഞേക്കാം.</translation> +<translation id="5863263400083022538">സിസ്റ്റം സേവനങ്ങൾ</translation> <translation id="5863445608433396414">ഡീബഗ് ചെയ്യൽ ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="5863515189965725638">IBAN എഡിറ്റ് ചെയ്യുക</translation> <translation id="5864195618110239517">മീറ്റർ ചെയ്ത കണക്ഷന് ഉപയോഗിക്കുക</translation> @@ -6712,6 +6733,7 @@ <translation id="6207937957461833379">രാജ്യം/പ്രവിശ്യ</translation> <translation id="6208521041562685716">മൊബൈൽ ഡാറ്റ സജീവമാക്കുന്നു</translation> <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> എന്നതിലേക്ക് സംരക്ഷിക്കാനായില്ല - <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">മൈക്രോഫോൺ അനുമതികളുള്ള ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും സിസ്റ്റം സേവനങ്ങൾക്കും നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാനാകും</translation> <translation id="6209838773933913227">കമ്പോണന്റ് അപ്ഡേറ്റ് ചെയ്യുന്നു</translation> <translation id="6209908325007204267">നിങ്ങളുടെ ഉപകരണത്തിൽ Chrome എന്റർപ്രൈസ് അപ്ഗ്രേഡ് ഉൾപ്പെടുന്നു, എന്നാൽ നിങ്ങളുടെ ഉപയോക്തൃനാമം ഒരു എന്റർപ്രൈസ് അക്കൗണ്ടുമായി ബന്ധപ്പെട്ടതല്ല. മറ്റൊരു ഉപകരണത്തിൽ g.co/ChromeEnterpriseAccount സന്ദർശിച്ച് എന്റർപ്രൈസ് അക്കൗണ്ട് സൃഷ്ടിക്കുക.</translation> <translation id="6210282067670792090">വിലാസ ബാറിൽ, തിരയൽ യന്ത്രങ്ങൾക്കും സൈറ്റ് തിരയലിനുമുള്ള കുറുക്കുവഴികൾക്കൊപ്പം ഈ കീബോർഡ് കുറുക്കുവഴികൾ ഉപയോഗിക്കുക</translation> @@ -7046,6 +7068,7 @@ <translation id="6478248366783946499">അപകടകരമായ ഫയൽ സൂക്ഷിക്കണോ?</translation> <translation id="6479881432656947268">Chrome വെബ് സ്റ്റോർ സന്ദർശിക്കുക</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> മാനേജ് ചെയ്യുന്നത്</translation> +<translation id="6481749622989211463">സമീപമുള്ള ഉപകരണങ്ങളുമായി ഫയലുകളും മറ്റും പങ്കിടുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="6482559668224714696">പൂർണ്ണസ്ക്രീൻ മാഗ്നിഫയർ</translation> <translation id="6483485061007832714">ഡൗൺലോഡ് തുറക്കുക</translation> <translation id="6483805311199035658"><ph name="FILE" /> തുറക്കുന്നു...</translation> @@ -7294,6 +7317,7 @@ <translation id="6680650203439190394">റേറ്റ് ചെയ്യുക</translation> <translation id="6683022854667115063">ഹെഡ്ഫോണുകൾ</translation> <translation id="6683087162435654533">എല്ലാ ടാബുകളും പുനഃസ്ഥാപിക്കുക</translation> +<translation id="6683433919380522900"><ph name="PERMISSION_STATE" /> എന്നതാണ് അനുമതി</translation> <translation id="6684827949542560880">ഏറ്റവും പുതിയ അപ്ഡേറ്റ് ഡൗൺലോഡ് ചെയ്യുന്നു</translation> <translation id="668599234725812620">Google Play തുറക്കുക</translation> <translation id="6686490380836145850">വലത്തേക്കുള്ള ടാബുകള് അടയ്ക്കുക</translation> @@ -8108,6 +8132,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> എന്നയാളുടെ ഉപകരണത്തിന്റെ <ph name="FEATURE_NAME" /> ക്രമീകരണം <ph name="USER_EMAIL" /> എന്ന അക്കൗണ്ടിന് കീഴിൽ പങ്കിടുന്നു.</translation> <translation id="7331646370422660166">alt + താഴേക്കുള്ള അമ്പടയാളം</translation> <translation id="7332053360324989309">ഡെഡിക്കേറ്റഡ് വർക്കർ: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">മീറ്റർ ചെയ്ത കണക്ഷനിലായിരിക്കുമ്പോൾ ഫയലുകൾ അപ്ലോഡ് ചെയ്യാനാകില്ല.</translation> <translation id="7333669215417470379">നിങ്ങളുടെ ആപ്പുകളും ക്രമീകരണവും ബാക്കപ്പ് ചെയ്ത് പുനഃസ്ഥാപിക്കുക</translation> <translation id="7335436113423103413">പുതിയ ടാബ് പേജിലെ ഏകീകൃത സൈഡ് പാനലിൽ നിന്ന് Chrome ഇഷ്ടാനുസൃതമാക്കൽ ഫംഗ്ഷണാലിറ്റി ഉപയോഗിക്കാനുള്ള കഴിവ് പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation> <translation id="7335974957018254119">സ്പെൽ ചെക്ക് ഉപയോഗിക്കേണ്ട ഭാഷകൾ</translation> @@ -8263,6 +8288,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome വെബ് സ്റ്റോറിൽ നിന്ന് നീക്കം ചെയ്ത ഒരു വിപുലീകരണം അവലോകനം ചെയ്യുക}other{Chrome വെബ് സ്റ്റോറിൽ നിന്ന് നീക്കം ചെയ്ത {NUM_EXTENSIONS} വിപുലീകരണങ്ങൾ അവലോകനം ചെയ്യുക}}</translation> <translation id="7436921188514130341">ക്ഷമിക്കണം! പേരുമാറ്റുന്നതിനിടെ ഒരു പിശകുണ്ടായി.</translation> <translation id="7439519621174723623">തുടരുന്നതിന് ഒരു ഉപകരണ നാമം ചേർക്കുക</translation> +<translation id="7441736532026945583">തുറന്ന് വച്ചിട്ടുള്ള ടാബുകളിൽ നിന്ന് ഗ്രൂപ്പ് നീക്കം ചെയ്യാൻ "ഗ്രൂപ്പ് മറയ്ക്കുക" തിരഞ്ഞെടുക്കുക</translation> <translation id="7441736921018636843">ഈ ക്രമീകരണം മാറ്റാന്, നിങ്ങളുടെ സമന്വയ പാസ്ഫ്രെയ്സ് നീക്കം ചെയ്യുന്നതിന് <ph name="BEGIN_LINK" />സമന്വയം പുനഃസജ്ജീകരിക്കുക<ph name="END_LINK" /></translation> <translation id="7441830548568730290">മറ്റ് ഉപയോക്താക്കൾ</translation> <translation id="744341768939279100">ഒരു പുതിയ പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> @@ -8863,6 +8889,7 @@ <translation id="7887864092952184874">Bluetooth മൗസ് ജോടിയാക്കി</translation> <translation id="7889371445710865055">കേട്ടെഴുത്തിന്റെ ഭാഷ മാറ്റുക</translation> <translation id="7890147169288018054">നിങ്ങളുടെ IP അല്ലെങ്കിൽ MAC വിലാസം പോലുള്ള നെറ്റ്വർക്ക് വിവരങ്ങൾ കാണുക</translation> +<translation id="7892005672811746207">"ഗ്രൂപ്പ് സംരക്ഷിക്കുക" ഓണാക്കുക</translation> <translation id="7892384782944609022">ജോടിയാക്കാനായില്ല. വീണ്ടും ശ്രമിക്കാൻ ഉപകരണം തിരഞ്ഞെടുക്കുക.</translation> <translation id="7893008570150657497">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്നും ഫോട്ടോകൾ, സംഗീതം, മറ്റ് മീഡിയകൾ എന്നിവ ആക്സസ് ചെയ്യുക</translation> <translation id="7893153962594818789"><ph name="DEVICE_TYPE" /> ഉപകരണത്തിൽ Bluetooth ഓഫാണ്. നിങ്ങളുടെ പാസ്വേഡ് നൽകുക, ശേഷം Bluetooth ഓണാക്കുക.</translation> @@ -9106,6 +9133,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">ഗ്രൂപ്പ് <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">കണക്ഷൻ ഡയലോഗ്</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> എന്നതിനുള്ള ലൊക്കേഷൻ അനുമതി</translation> <translation id="8070662218171013510">തൊട്ടുളള ഫീഡ്ബാക്ക്</translation> <translation id="8071432093239591881">ചിത്രമായി പ്രിന്റ് ചെയ്യുക</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />ആപ്പ് ഡാറ്റ എന്നത്, കോൺടാക്റ്റുകൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ എന്നിവ പോലെ രഹസ്യ സ്വഭാവമുള്ള ഡാറ്റ ഉൾപ്പെടെ ഒരു ആപ്പ് സംരക്ഷിച്ച (ഡെവലപ്പർ ക്രമീകരണം അടിസ്ഥാനമാക്കി) ഏത് ഡാറ്റയുമാകാം.<ph name="END_PARAGRAPH1" /> @@ -9164,6 +9192,7 @@ <translation id="8109991406044913868">AI സൃഷ്ടിച്ച തീം</translation> <translation id="8110393529211831722">ഈ ഉപകരണത്തിൽ മാത്രമാണ് സബ്സ്ക്രിപ്ഷൻ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നത്, നിങ്ങളുടെ അക്കൗണ്ടിന് കീഴിലുള്ള മറ്റ് ഉപകരണങ്ങളുമായി സമന്വയിപ്പിച്ചിട്ടില്ല. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="8110489095782891123">കോൺടാക്റ്റ് ലിസ്റ്റ് ഡൗൺലോഡ് ചെയ്യുന്നു...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> എന്നതിനുള്ള മൈക്രോഫോൺ അനുമതി</translation> <translation id="8115139559594092084">നിങ്ങളുടെ Google Drive-ൽ നിന്ന്</translation> <translation id="8116972784401310538">&ബുക്മാര്ക്ക് മാനേജര്</translation> <translation id="8118276691321086429">നിങ്ങൾ സൈൻ ഇൻ ചെയ്തതെങ്ങനെയെന്ന് <ph name="PASSWORD_MANAGER_BRAND" /> ഓർത്ത് വയ്ക്കുന്നു, സാധ്യമാകുമ്പോൾ നിങ്ങളെ സ്വയമേവ സൈൻ ഇൻ ചെയ്യിക്കും. ഓഫായിരിക്കുമ്പോൾ, ഓരോ തവണയും സ്ഥിരീകരിക്കാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.</translation> @@ -9379,6 +9408,7 @@ <translation id="8275038454117074363">ഇറക്കുമതിചെയ്യുക</translation> <translation id="8275080796245127762">നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് കോൾ ചെയ്യുക</translation> <translation id="8275339871947079271">സൈൻ ഇൻ ചെയ്യുന്നിടത്തെല്ലാം പാസ്വേഡ് സുരക്ഷിതമായി ആക്സസ് ചെയ്യാൻ അത് നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് നീക്കുക</translation> +<translation id="8276242035951017580">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ ആപ്പുകൾക്കൊന്നും അനുവാദമില്ല</translation> <translation id="8276560076771292512">കാഷെ ശൂന്യമാക്കി വേഗത്തിൽ വീണ്ടും ലോഡ് ചെയ്യുക</translation> <translation id="8276850948802942358">മൂന്നാം കക്ഷി കുക്കികൾ ഉപയോഗിക്കാൻ സൈറ്റിന് താൽക്കാലിക അനുമതി നൽകുന്നതിനെക്കുറിച്ച് കൂടുതലറിയുക</translation> <translation id="828180235270931531">ലഭ്യമായ മറ്റ് പ്രിന്ററുകൾ</translation> @@ -9397,6 +9427,7 @@ <translation id="8291942417224950075">വ്യക്തിപരമായ ഉപയോഗത്തിനുള്ളത്</translation> <translation id="8293206222192510085">ബുക്ക്മാര്ക്ക് ചേര്ക്കുക</translation> <translation id="8294431847097064396">ഉറവിടം</translation> +<translation id="8294476140219241086">ടാബ് ഓർഗനൈസർ</translation> <translation id="8294895455164415895">ടാബ് ഗ്രൂപ്പുകൾ നിർദ്ദേശിക്കാൻ Chrome-നെ അനുവദിക്കുന്നതിന് ക്രമീകരണം തുറക്കുക</translation> <translation id="8295449579927246485">തത്സമയ വിവർത്തനം</translation> <translation id="8295450130892483256">Microsoft 365 ഇൻസ്റ്റാൾ ചെയ്യുക</translation> @@ -9509,6 +9540,7 @@ <translation id="8380266723152870797">വിൻഡോയുടെ പേര്</translation> <translation id="8380941800586852976">അപകടകരമായത്</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> ഓണാക്കുക</translation> +<translation id="8382197851871630452">പ്രാദേശിക കാലാവസ്ഥ</translation> <translation id="8382677870544805359">എന്റർപ്രൈസ് ഫീച്ചറുകൾ ഉപയോഗിക്കുന്നതിന് നിങ്ങൾ ഈ ഉപകരണം ഫാക്ടറി റീസെറ്റ് ചെയ്യണം.</translation> <translation id="8382715499079447151">കാണുന്നതിൽ നിന്നുള്ള പരിരക്ഷ</translation> <translation id="8382913212082956454">&ഇമെയിൽ വിലാസം പകർത്തുക</translation> @@ -9699,6 +9731,7 @@ <translation id="8528962588711550376">പ്രവേശിക്കുന്നു.</translation> <translation id="8529578450330869579">നിങ്ങളുടെ ഇന്റർനെറ്റ് ട്രാഫിക്കിലേക്ക് ആക്സസുള്ള ആളുകൾ നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റുകൾ കാണുന്നത് തടയാൻ, സുരക്ഷിതമായ ഡൊമെയ്ൻ നാമ സിസ്റ്റം (DNS) ഉപയോഗിക്കുക. ഇത്, <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> എന്നതിലെ മാനേജ് ചെയ്യപ്പെടുന്ന സേവന ദാതാവിനെ ഉപയോഗിക്കുന്നു</translation> <translation id="8529925957403338845">തൽക്ഷണ ടെതറിംഗ് കണക്ഷൻ പരാജയപ്പെട്ടു</translation> +<translation id="8531367864749403520">തുറന്ന് വച്ചിട്ടുള്ള ടാബുകളിൽ നിന്ന് ഗ്രൂപ്പ് നീക്കം ചെയ്യാൻ "ഗ്രൂപ്പ് മറയ്ക്കുക" തിരഞ്ഞെടുക്കുക</translation> <translation id="8531701051932785007">മെച്ചപ്പെടുത്തിയ സുരക്ഷിത ബ്രൗസിംഗ് ഓഫാണ്</translation> <translation id="8533670235862049797">സുരക്ഷിത ബ്രൗസിംഗ് ഓണാണ്</translation> <translation id="8534656636775144800">ക്ഷമിക്കണം! ഡൊമെയ്നിൽ ചേരാൻ ശ്രമിക്കുമ്പോൾ എന്തോ കുഴപ്പമുണ്ടായി. വീണ്ടും ശ്രമിക്കുക.</translation> @@ -9825,6 +9858,7 @@ <translation id="8639635302972078117">ഉപയോഗവും പ്രശ്നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഈ ഉപകരണം നിലവിൽ സ്വയമേവ Google-ന് അയയ്ക്കുന്നുണ്ട്. നിങ്ങളുടെ കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തലുകൾ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. നിങ്ങളുടെ കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം.</translation> <translation id="8640575194957831802">അവസാനം തുറന്നത്</translation> <translation id="8641946446576357115">iOS ഉപകരണങ്ങളിൽ നിങ്ങളുടെ പാസ്വേഡുകൾ ഉപയോഗിക്കുക</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> എന്നതിനുള്ള ക്യാമറാ അനുമതി</translation> <translation id="8642900771896232685">2 സെക്കൻഡ്</translation> <translation id="8642947597466641025">പാഠത്തെ വലുതാക്കുക</translation> <translation id="8643403533759285912">ഗ്രൂപ്പ് ഇല്ലാതാക്കുക</translation> @@ -9859,6 +9893,7 @@ <translation id="8662978096466608964">Chrome-ന് വാൾപേപ്പർ സജ്ജമാക്കാൻ കഴിയില്ല.</translation> <translation id="8663051876219324457">നിങ്ങളുടെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ ആപ്പുകൾ, വെബ്സൈറ്റുകൾ, സിസ്റ്റം സേവനങ്ങൾ എന്നിവയെ അനുവദിക്കുക. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ കണക്കാക്കാൻ സഹായിക്കുന്നതിന് വൈഫൈ, മൊബൈൽ നെറ്റ്വർക്കുകൾ, സെൻസറുകൾ എന്നിവ പോലുള്ള ഉറവിടങ്ങൾ, ലൊക്കേഷൻ ഉപയോഗിച്ചേക്കാം. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" />-ൽ എല്ലായ്പ്പോഴും ഒന്നിലേറെ യാന്ത്രിക ഡൗൺലോഡുകൾ തടയുക</translation> +<translation id="8664249499245357248">ഗ്രൂപ്പിന്റെ പേരിൽ വലത്-ക്ലിക്ക് ചെയ്യുക</translation> <translation id="8664389313780386848">&പേജ് ഉറവിടം കാണുക</translation> <translation id="8665110742939124773">നിങ്ങൾ നൽകിയ ആക്സസ് കോഡ് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8665180165765946056">ബാക്കപ്പെടുക്കൽ പൂർത്തിയായി</translation> @@ -10182,6 +10217,7 @@ <translation id="8900413463156971200">സെല്ലുലാർ നെറ്റ്വർക്ക് പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{നിങ്ങളുടെ ഡാറ്റ ബാക്കപ്പ് ചെയ്ത് ഈ <ph name="DEVICE_TYPE" /> ഇന്ന് തന്നെ തിരികെ നൽകാൻ <ph name="MANAGER" /> നിങ്ങളോട് ആവശ്യപ്പെടുന്നു.}other{സമയപരിധി അവസാനിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ ഡാറ്റ ബാക്കപ്പ് ചെയ്ത് ഈ <ph name="DEVICE_TYPE" /> തിരികെ നൽകാൻ <ph name="MANAGER" /> നിങ്ങളോട് ആവശ്യപ്പെടുന്നു.}}</translation> <translation id="8902667442496790482">'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക' ക്രമീകരണം തുറക്കുക</translation> +<translation id="8903733144777177139">മൈക്രോഫോൺ ആക്സസ് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="890616557918890486">ഉറവിടം മാറ്റുക</translation> <translation id="8907701755790961703">ഒരു രാജ്യം തിരഞ്ഞെടുക്കുക</translation> <translation id="8908420399006197927">നിർദ്ദേശിച്ച ഗ്രൂപ്പിൽ നിന്ന് ടാബ് ഒഴിവാക്കുക</translation> @@ -10219,6 +10255,7 @@ <translation id="8934732568177537184">തുടരുക</translation> <translation id="8938800817013097409">USB-C ഉപകരണം (പുറകിൽ വലതുവശത്തെ പോർട്ട്)</translation> <translation id="8940081510938872932">നിങ്ങളുടെ കമ്പ്യൂട്ടർ ഇപ്പോൾ വളരെയധികം കാര്യങ്ങൾ ചെയ്യുന്നു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="8940228279218723234">ആപ്പുകൾക്കും വെബ്സൈറ്റുകൾക്കും ക്യാമറാ ആക്സസിനും സിസ്റ്റം സേവനങ്ങൾക്കും അനുമതി നൽകൂ. ക്യാമറ ഉപയോഗിക്കുന്നതിന്, നിങ്ങൾ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്യുകയോ പേജ് റീഫ്രഷ് ചെയ്യുകയോ വേണ്ടി വന്നേക്കാം.</translation> <translation id="8940381019874223173">നിങ്ങളുടെ Google Photos-ൽ നിന്ന്</translation> <translation id="8940888110818450052">സൈൻ ഇൻ ഓപ്ഷനുകൾ</translation> <translation id="8941173171815156065">'<ph name="PERMISSION" />' എന്ന അനുമതി റദ്ദാക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index a1f814d..7795a21f 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Android утсанд холбогдсон</translation> <translation id="1523279371236772909">Өнгөрсөн сард үзсэн</translation> <translation id="1523978563989812243">Бичвэрийг-ярианд-хувиргах хөдөлгүүр</translation> -<translation id="1524430321211440688">Гар</translation> <translation id="1524563461097350801">Үгүй, баярлалаа</translation> <translation id="1525740877599838384">Байршлыг тогтоохын тулд зөвхөн Wi-Fi ашиглах</translation> <translation id="152629053603783244">Linux-г дахин эхлүүлэх</translation> @@ -3918,7 +3917,6 @@ <translation id="3966072572894326936">Өөр хавтас сонгох ...</translation> <translation id="3966094581547899417">Сүлжээний цэгийн дэлгэрэнгүй</translation> <translation id="3967822245660637423">Татаж авч дууслаа</translation> -<translation id="3967841595862839006">Хэл, гараа сонгоно уу</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Тооцоолж байна ...</translation> @@ -4600,7 +4598,6 @@ <translation id="4513872120116766993">Бичих үгсийг урьдчилан санал болгох</translation> <translation id="4513946894732546136">Санал дүгнэлт</translation> <translation id="4515872537870654449">Үйлчилгээ авахын тулд Dell-тэй холбоо барина уу. Сэнс ажиллахгүй байвал холбогч унтрах болно.</translation> -<translation id="4516008165284813420">Таны <ph name="DEVICE_TYPE" /> интернэтэд холбогдсон эсэхийг шалгаад, дахин оролдоно уу. Та мөн өөр төхөөрөмж дээрээс play.google.com/about/play-terms-д зочлох боломжтой.</translation> <translation id="4518840066030486079">Shift товчлуурын горимын загвар</translation> <translation id="4519331665958994620">Сайтууд таны камерыг ашиглахыг хүсэх боломжтой</translation> <translation id="4519605771716872386">Файлын синкийг асаасан</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 68543bf..fe359fad 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Android फोनशी कनेक्ट केले आहे</translation> <translation id="1523279371236772909">गेल्या महिन्यामध्ये पाहिला होता</translation> <translation id="1523978563989812243">टेक्स्ट टू स्पीच इंजिने</translation> -<translation id="1524430321211440688">कीबोर्ड</translation> <translation id="1524563461097350801">नाही, नको</translation> <translation id="1525740877599838384">स्थान निर्धारित करण्यासाठी फक्त वाय-फाय वापरा</translation> <translation id="152629053603783244">Linux रीस्टार्ट करा</translation> @@ -3922,7 +3921,6 @@ <translation id="3966072572894326936">अन्य फोल्डर निवडा...</translation> <translation id="3966094581547899417">हॉटस्पॉट तपशील</translation> <translation id="3967822245660637423">पूर्ण डाउनलोड करा</translation> -<translation id="3967841595862839006">तुमची भाषा आणि कीबोर्ड निवडा</translation> <translation id="3968739731834770921">काना</translation> <translation id="3970114302595058915">आयडी</translation> <translation id="397105322502079400">गणना करत आहे...</translation> @@ -4602,7 +4600,6 @@ <translation id="4513872120116766993">अंदाजानुसार लिखाण</translation> <translation id="4513946894732546136">फीडबॅक</translation> <translation id="4515872537870654449">सेवेसाठी Dell शी संपर्क साधा. फॅन काम करत नसल्यास डॉक बंद होईल.</translation> -<translation id="4516008165284813420">तुमचे <ph name="DEVICE_TYPE" /> इंटरनेटशी कनेक्ट केलेले आहे याची खात्री करा आणि पुन्हा प्रयत्न करा. तुम्ही दुसऱ्या डिव्हाइसवर play.google.com/about/play-terms लादेखील भेट देऊ शकता.</translation> <translation id="4518840066030486079">शिफ्ट की मोड शैली</translation> <translation id="4519331665958994620">साइट तुमचा कॅमेरा वापरण्यासाठी विचारू शकतात</translation> <translation id="4519605771716872386">फाइल सिंक सुरू केले</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 2e9271a..753a7f37 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -359,7 +359,7 @@ <translation id="126387934568812801">Sertakan tangkapan skrin ini dan tajuk bagi tab yang terbuka</translation> <translation id="1264083566674525434">Edit kebenaran laman</translation> <translation id="1264337193001759725">Untuk melihat log UI rangkaian, lihat: <ph name="DEVICE_LOG_LINK" /></translation> -<translation id="1265279736024499987">Apl dan tetapan anda akan disegerakkan pada semua peranti Chrome OS Flex yang anda gunakan untuk log masuk dengan akaun Google anda. Untuk mendapatkan pilihan penyegerakan penyemak imbas, pergi ke <ph name="LINK_BEGIN" />tetapan Chrome<ph name="LINK_END" />.</translation> +<translation id="1265279736024499987">Apl dan tetapan anda akan disegerakkan pada semua peranti Chrome OS Flex yang anda gunakan untuk log masuk dengan Google Account anda. Untuk mendapatkan pilihan penyegerakan penyemak imbas, pergi ke <ph name="LINK_BEGIN" />tetapan Chrome<ph name="LINK_END" />.</translation> <translation id="126710816202626562">Bahasa terjemahan:</translation> <translation id="1267649802567297774">Imej <ph name="INDEX" /> daripada <ph name="SUBJECT" /> yang dijana dalam gaya <ph name="STYLE" /> dengan perasaan <ph name="MOOD" />.</translation> <translation id="126768002343224824">16x</translation> @@ -682,7 +682,6 @@ <translation id="1521933835545997395">Disambungkan pada telefon Android</translation> <translation id="1523279371236772909">Dilihat pada bulan lalu</translation> <translation id="1523978563989812243">Enjin teks ke pertuturan</translation> -<translation id="1524430321211440688">Papan kekunci</translation> <translation id="1524563461097350801">Tidak Perlu</translation> <translation id="1525740877599838384">Gunakan Wi-Fi sahaja untuk menentukan lokasi</translation> <translation id="152629053603783244">Mulakan semula Linux</translation> @@ -2218,7 +2217,7 @@ <translation id="2643698698624765890">Uruskan sambungan anda dengan mengklik Extensions dalam menu Window.</translation> <translation id="2645047101481282803">Peranti anda diurus oleh <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Menghantar tab ini ke <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Protanomali</translation> <translation id="2649045351178520408">Base64 terkod ASCII, rangkaian sijil</translation> <translation id="265156376773362237">Pramuat standard</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Pilih folder lain...</translation> <translation id="3966094581547899417">Butiran tempat liputan</translation> <translation id="3967822245660637423">Muat turun selesai</translation> -<translation id="3967841595862839006">Pilih bahasa & papan kekunci anda</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Mengira...</translation> @@ -4223,7 +4221,7 @@ <translation id="4210048056321123003">Memuat turun mesin maya</translation> <translation id="4210380525132844778">Sebab: <ph name="RULE" /> ditemukan dalam senarai "<ph name="LIST_NAME" />".</translation> <translation id="421182450098841253">&Tunjukkan Bar Penanda Halaman</translation> -<translation id="4211851069413100178">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pemilik. Pemilik mungkin memilih untuk menghantar data diagnostik dan penggunaan bagi peranti ini kepada Google. Jika tetapan Aktiviti Web & Apl tambahan anda dihidupkan, data ini mungkin disimpan ke akaun Google anda. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation> +<translation id="4211851069413100178">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pemilik. Pemilik mungkin memilih untuk menghantar data diagnostik dan penggunaan bagi peranti ini kepada Google. Jika tetapan Aktiviti Web & Apl tambahan anda dihidupkan, data ini mungkin disimpan ke Google Account anda. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation> <translation id="4211904048067111541">Berhenti menggunakan dengan apl Android</translation> <translation id="42126664696688958">Eksport</translation> <translation id="42137655013211669">Akses kepada sumber ini dilarang oleh pelayan.</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Penulisan ramalan</translation> <translation id="4513946894732546136">Maklum balas</translation> <translation id="4515872537870654449">Hubungi Dell untuk penyelenggaraan. Dok akan dimatikan jika kipas tidak berfungsi.</translation> -<translation id="4516008165284813420">Pastikan <ph name="DEVICE_TYPE" /> anda disambungkan kepada Internet dan cuba lagi. Anda juga boleh melawati play.google.com/about/play-terms pada peranti lain.</translation> <translation id="4518840066030486079">Gaya Mod Kekunci Shift</translation> <translation id="4519331665958994620">Laman boleh meminta untuk menggunakan kamera anda</translation> <translation id="4519605771716872386">Penyegerakan fail dihidupkan</translation> @@ -4679,7 +4676,7 @@ <translation id="4567533462991917415">Anda boleh menambahkan lagi orang pada bila-bila masa selepas persediaan. Setiap orang boleh memperibadikan akaun mereka dan merahsiakan data.</translation> <translation id="4567772783389002344">Tambah perkataan</translation> <translation id="4568025708905928793">Kunci keselamatan sedang diminta</translation> -<translation id="4568213207643490790">Maaf, akaun Google tidak dibenarkan pada peranti ini.</translation> +<translation id="4568213207643490790">Maaf, Google Account tidak dibenarkan pada peranti ini.</translation> <translation id="4569747168316751899">Apabila melahu</translation> <translation id="4570201855944865395">Justifikasi untuk meminta sambungan ini:</translation> <translation id="4572779512957829735">Masukkan PIN untuk kunci keselamatan anda</translation> @@ -5242,7 +5239,7 @@ <translation id="5021750053540820849">Belum dikemas kini</translation> <translation id="5022206631034207923">Skrin kunci, kawalan</translation> <translation id="5024511550058813796">Sejarah anda boleh didapati pada semua peranti tersegerak anda supaya anda boleh meneruskan perkara yang sedang anda lakukan</translation> -<translation id="5026492829171796515">Log masuk untuk menambah akaun Google</translation> +<translation id="5026492829171796515">Log masuk untuk menambah Google Account</translation> <translation id="5026806129670917316">Hidupkan Wi-Fi</translation> <translation id="5026874946691314267">Jangan tunjukkannya lagi</translation> <translation id="5027550639139316293">Sijil E-mel</translation> @@ -7510,7 +7507,7 @@ <translation id="6826872289184051766">Sahkan melalui USB</translation> <translation id="6827121912381363404">Benarkan semua sambungan untuk membaca dan menukar <ph name="PERMITTED_SITE" /></translation> <translation id="6827422464708099620">Pilih untuk melihat lebih banyak pilihan</translation> -<translation id="6827517233063803343">Apl dan tetapan anda akan disegerakkan pada semua peranti Chrome OS yang anda gunakan untuk log masuk dengan akaun Google anda. Untuk mendapatkan pilihan penyegerakan penyemak imbas, pergi ke <ph name="LINK_BEGIN" />tetapan Chrome<ph name="LINK_END" />.</translation> +<translation id="6827517233063803343">Apl dan tetapan anda akan disegerakkan pada semua peranti Chrome OS yang anda gunakan untuk log masuk dengan Google Account anda. Untuk mendapatkan pilihan penyegerakan penyemak imbas, pergi ke <ph name="LINK_BEGIN" />tetapan Chrome<ph name="LINK_END" />.</translation> <translation id="6827767090350758381">Versi lama Apl Chrome tidak akan dibuka pada peranti Windows selepas Disember 2022. Hubungi pentadbir anda untuk mengemas kini kepada versi baharu atau mengalih keluar apl ini.</translation> <translation id="6828153365543658583">Hadkan log masuk bagi pengguna berikut:</translation> <translation id="6828182567531805778">Masukkan ungkapan laluan anda untuk menyegerakkan data anda</translation> @@ -9426,7 +9423,7 @@ <translation id="8300374739238450534">Biru malam</translation> <translation id="8301242268274839723">Sentuh penderia cap jari di penjuru kiri sebelah bawah papan kekunci anda. Data cap jari anda disimpan dengan selamat dan tidak sekali-kali dihantar keluar daripada <ph name="DEVICE_TYPE" /> anda.</translation> <translation id="8303616404642252802">{COUNT,plural, =1{Alamat}other{# alamat}}</translation> -<translation id="8304383784961451596">Anda tidak akan dibenarkan untuk menggunakan peranti ini. Sila hubungi pentadbir untuk mendapatkan kebenaran log masuk atau log masuk menggunakan akaun Google yang diawasi oleh Family Link.</translation> +<translation id="8304383784961451596">Anda tidak akan dibenarkan untuk menggunakan peranti ini. Sila hubungi pentadbir untuk mendapatkan kebenaran log masuk atau log masuk menggunakan Google Account yang diawasi oleh Family Link.</translation> <translation id="8306063480506363120">Alih keluar akses Drive</translation> <translation id="8306430106790753902">Laluan Rangkaian ChromeOS</translation> <translation id="8306885873692337975">Dapatkan ciri terkini dan peningkatan keselamatan.</translation> @@ -10574,7 +10571,7 @@ <translation id="9173063514323762371">&Sembunyikan Bar Penanda Halaman</translation> <translation id="917350715406657904">Anda telah mencapai had masa yang telah ditetapkan oleh ibu/bapa anda untuk <ph name="APP_NAME" />. Anda boleh menggunakan aplikasi ini selama <ph name="TIME_LIMIT" /> esok.</translation> <translation id="9174401638287877180">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anak anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini tidak akan digunakan untuk mengenal pasti anak anda dan akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. Jika tetapan Aktiviti Web & Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan pada Akaun Googlenya.</translation> -<translation id="9176476835295860688">Hantar data penggunaan dan diagnostik. Pada masa ini, peranti ini menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pemilik. Jika tetapan Aktiviti Web & Apl tambahan anda dihidupkan, data ini mungkin disimpan ke akaun Google anda. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation> +<translation id="9176476835295860688">Hantar data penggunaan dan diagnostik. Pada masa ini, peranti ini menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. <ph name="BEGIN_LINK1" />Tetapan<ph name="END_LINK1" /> ini dikuatkuasakan oleh pemilik. Jika tetapan Aktiviti Web & Apl tambahan anda dihidupkan, data ini mungkin disimpan ke Google Account anda. <ph name="BEGIN_LINK2" />Ketahui Lebih Lanjut<ph name="END_LINK2" /></translation> <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Peranti Bluetooth disambungkan</translation> <translation id="9178061802301856367">Padamkan data log masuk</translation> <translation id="9179243438030184085">Gunakan butang Kongsi pada bahagian bawah kad untuk berkongsi salinan kata laluan anda dengan seseorang dalam kumpulan keluarga anda</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 5e96064..f7baee18 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Android ဖုန်းသို့ ချိတ်ဆက်ထားသည်</translation> <translation id="1523279371236772909">ယခင်လတွင် ကြည့်ထားသည်</translation> <translation id="1523978563989812243">စာ-မှ-စကား အင်ဂျင်များ</translation> -<translation id="1524430321211440688">ကီးဘုတ်</translation> <translation id="1524563461097350801">မလိုပါ</translation> <translation id="1525740877599838384">တည်နေရာ သိရှိနိုင်ရန် Wi-Fi ကိုသာ အသုံးပြုပါ</translation> <translation id="152629053603783244">Linux ကို ပြန်လည်စတင်ရန်</translation> @@ -3921,7 +3920,6 @@ <translation id="3966072572894326936">နောက် ဖိုလ်ဒါ တစ်ခုကို ရွေးရန်...</translation> <translation id="3966094581547899417">ဟော့စပေါ့အသေးစိတ်</translation> <translation id="3967822245660637423">ဒေါင်းလုဒ်လုပ်ခြင်း ပြည့်စုံပါပြီ</translation> -<translation id="3967841595862839006">သင့်ဘာသာစကားနှင့် ကီးဘုတ်ကို ရွေးချယ်ပါ</translation> <translation id="3968739731834770921">ကာန</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">တွက်ချက်နေ...</translation> @@ -4603,7 +4601,6 @@ <translation id="4513872120116766993">ခန့်မှန်းရေးသားမှု</translation> <translation id="4513946894732546136">အကြံပြုချက်</translation> <translation id="4515872537870654449">ဝန်ဆောင်မှုအတွက် Dell ကို ဆက်သွယ်ပါ။ ပန်ကာအလုပ်မလုပ်လျှင် အထိုင်ပိတ်သွားပါမည်။</translation> -<translation id="4516008165284813420">သင့် <ph name="DEVICE_TYPE" /> ကို အင်တာနက်ချိတ်ထားခြင်း ရှိ၊ မရှိ သေချာအောင်လုပ်ပြီး ထပ်စမ်းကြည့်ပါ။ အခြားစက်တွင်လည်း play.google.com/about/play-terms ကို ဝင်ကြည့်နိုင်သည်။</translation> <translation id="4518840066030486079">Shift ကီးမုဒ် ပုံစံ</translation> <translation id="4519331665958994620">ဝဘ်ဆိုက်များက သင့်ကင်မရာအသုံးပြုလိုပါက ခွင့်တောင်းနိုင်သည်</translation> <translation id="4519605771716872386">ဖိုင်စင့်ခ်လုပ်ခြင်း ဖွင့်ထားသည်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 84e7d1c..e6d2359 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -339,6 +339,7 @@ <translation id="1251578593170406502">मोबाइल डेटा नेटवर्क स्यान गरिँदै छ...</translation> <translation id="125220115284141797">डिफल्ट</translation> <translation id="1252219782845132919">समूह लुकाउनुहोस्</translation> +<translation id="1252714168533640068">यो समूह पुनः खोल्न समूहको नाममा क्लिक गर्नुहोस्</translation> <translation id="1252987234827889034">प्रोफाइल सम्बन्धी त्रुटि भयो</translation> <translation id="1253664522045778676">कुनै परिणाममा क्लिक गर्नुहोस् र सो पेज तपाईंको हालको ट्याबमा खुल्ने छ</translation> <translation id="1254593899333212300">प्रत्यक्ष इन्टरनेट जडान</translation> @@ -620,6 +621,7 @@ <translation id="1476347941828409626">Chrome का प्रोफाइलहरू व्यवस्थापन गर्नुहोस्</translation> <translation id="1476607407192946488">&भाषा सेटिङहरू</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> का अनुसार तपाईंले आफ्नो स्मार्ट कार्ड इन्सर्ट गरिराख्नु पर्ने हुन्छ।</translation> +<translation id="1477645000789043442">तपाईंका खुला ट्याबहरूका आधारमा स्वतः ट्याब समूह बनाउँछ। यो सुविधा प्रयोग गर्न कुनै ट्याबमा राइट क्लिक गर्नुहोस् र "उस्तै खालका ट्याबहरू व्यवस्थित गर्नुहोस्" मा क्लिक गर्नुहोस्।</translation> <translation id="1477654881618305065">तपाईंको सङ्गठनले तपाईंलाई यो सामग्री सेयर गर्ने अनुमति दिएको छैन। तपाईंलाई मद्दत चाहिन्छ भने आफ्ना एड्मिनलाई सम्पर्क गर्नुहोस्।</translation> <translation id="1478340334823509079">विवरणहरू: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">स्थापना गर्ने सेवा सक्षम पारिएको छैन</translation> @@ -678,7 +680,6 @@ <translation id="1521933835545997395">Android फोनमा कनेक्ट गरिएको छ</translation> <translation id="1523279371236772909">गत महिना हेरिएको</translation> <translation id="1523978563989812243">टेक्स्ट-टू-स्पिचका इन्जिनहरू</translation> -<translation id="1524430321211440688">किबोर्ड</translation> <translation id="1524563461097350801">पर्दैन, धन्यवाद</translation> <translation id="1525740877599838384">स्थान निर्धारण गर्न Wi-Fi मात्र प्रयोग गर्नुहोस्</translation> <translation id="152629053603783244">Linux पुनः सुरु गर्नुहोस्</translation> @@ -875,6 +876,7 @@ <translation id="1648439345221797326">ctrl + सिफ्ट + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">स्थान निर्धारण गर्न Wi-Fi वा मोबाइल नेटवर्कहरूको प्रयोग गर्नुहोस्</translation> <translation id="164936512206786300">ब्लुटुथ यन्त्रको जोडा हटाउनुहोस्</translation> +<translation id="1650407365859096313">नयाँ ट्याबमा खुल्छ, अनुमतिअन्तर्गत <ph name="PERMISSION_STATE" /> तोकिएको छ</translation> <translation id="1650801028905250434">तपाईं "मेरो ड्राइभ" मा रहेका फाइलहरू इन्टरनेटविनै प्रयोग गर्न सक्नुहोस् भन्नाका लागि ती फाइलहरू तपाईंको Chromebook मा स्वतः सिंक हुने छन्। तपाईं जुनसुकै बेला "सेटिङ > फाइलहरू" मा गई यो कुरा परिवर्तन गर्न सक्नुहुन्छ।</translation> <translation id="1651008383952180276">तपाईंले अनिवार्य रूपले उही पासफ्रेज दुई पटक प्रविष्ट गर्नुपर्छ</translation> <translation id="1651609627703324721">यो ट्याबले हेडसेटमा VR सामग्री प्रस्तुत गर्दै छ</translation> @@ -1111,6 +1113,7 @@ <translation id="1828901632669367785">प्रणाली संवाद प्रयोग गर्दै प्रिन्ट गर्नुहोस्...</translation> <translation id="1829129547161959350">पेन्गुइन</translation> <translation id="1829192082282182671">जुम &घटाउनुहोस्</translation> +<translation id="182973053761690772">सूर्यास्त हुने समयमा आधारित समयतालिका</translation> <translation id="1830550083491357902">साइन इन भएको छैन</translation> <translation id="1831848493690504725">हामीले हालको नेटवर्कमार्फत Google का सर्भरमा कनेक्ट गर्न सकेनौँ। अर्कै नेटवर्क छनौट गरी हेर्नुहोस् वा आफ्नो नेटवर्कका सेटिङ वा प्रोक्सीसम्बन्धी सेटिङको जाँच गर्नुहोस् (तपाईं प्रोक्सी प्रयोग गर्दै हुनुहुन्छ भने)।</translation> <translation id="1832459821645506983">अँ, म सहमत छु</translation> @@ -1167,6 +1170,7 @@ <translation id="1871615898038944731">तपाईंको <ph name="DEVICE_TYPE" /> अद्यावधिक छ</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> लाई फेरि अनुमति दिनुहोस्</translation> <translation id="1874248162548993294">जुनसुकै विज्ञापनहरू देखाउने अनुमति दिइएका साइटहरू</translation> +<translation id="1874794096607967241">क्यामेरा प्रयोग गर्ने अनुमति दिइएका एप तथा वेबसाइट र सिस्टमका सेवाहरूलाई क्यामेरा प्रयोग गर्न दिइयोस्</translation> <translation id="1874874185178737347">ट्याबहरू व्यवस्थित गर्नुहोस्</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ट्याब सारेर अर्को विन्डोमा लैजानुहोस्}other{ट्याबहरू सारेर अर्को विन्डोमा लैजानुहोस्}}</translation> <translation id="1875387611427697908">यसलाई <ph name="CHROME_WEB_STORE" /> बाट मात्रै थप्न सकिन्छ</translation> @@ -1206,6 +1210,7 @@ <translation id="1901303067676059328">&सबै चयन गर्नुहोस्</translation> <translation id="1903542130902305074">सेटअप गर्नुहोस्</translation> <translation id="1904580727789512086">तपाईंले खोल्ने URL हरू तपाईंको Google खातामा सेभ गरिन्छन्</translation> +<translation id="1904603806662441960">Chrome मा साइटलाई दिइएका क्यामेरा प्रयोग गर्ने अनुमतिहरू व्यवस्थापन गर्नुहोस्</translation> <translation id="1905375423839394163">Chromebook को डिभाइसको नाम</translation> <translation id="1906181697255754968">तपाईंको कार्य स्वतः सुरक्षित गर्नेलगायतका सुविधाहरू प्रदान गर्न साइटहरूले सामान्यतया तपाईंको डिभाइसमा भएका फाइल र फोल्डरहरू प्रयोग गर्छन्</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome वेब स्टोर<ph name="END_LINK" />मा गई थप एक्स्टेन्सन र थिमहरू भेट्टाउनुहोस्</translation> @@ -1346,6 +1351,7 @@ <translation id="200928901437634269">आफ्ना बच्चाको Google खाता वा कुनै स्कुलको खाता प्रयोग गर्नुहोस्। तपाईं अभिभावकीय नियन्त्रणहरू सेट गर्न पनि सक्नुहुन्छ।</translation> <translation id="2009590708342941694">इमोजी टुल</translation> <translation id="2010501376126504057">मिल्दा यन्त्रहरू</translation> +<translation id="201217432804812273">"समूह सेभ गर्नुहोस्" अन गर्नुहोस्</translation> <translation id="2012935757369720523">फाइल मेटाउनुहोस्</translation> <translation id="2013550551806600826">प्रयोग गरी हेर्नुहोस्। सेटिङ अन वा अफ गर्नुहोस्। त्यसपछि परीक्षण क्षेत्रमा भएको टचप्याडमा दुई औँला प्रयोग गरी स्क्रोल गर्नुहोस्। तपाईं पछि "सेटिङ > डिभाइस > माउस र टचप्याड" मा गई यो सेटिङ मिलाउन सक्नुहुन्छ।</translation> <translation id="2015232545623037616">कम्प्युटर र Chromecast एउटै Wi-Fi नेटवर्कमा कनेक्ट गरिएका छन्</translation> @@ -1766,6 +1772,7 @@ <translation id="2314165183524574721">हालको भिजिबिलिटी सेटिङ यस प्रकार छ: लुकाइएको</translation> <translation id="2314774579020744484">पृष्ठहरू अनुवाद गर्दा प्रयोग हुने भाषा</translation> <translation id="2316129865977710310">पर्दैन, धन्यवाद</translation> +<translation id="2316433409811863464">एप स्ट्रिमिङ</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% सम्पन्न भयो</translation> <translation id="2318143611928805047">कागज परिमाण</translation> <translation id="2318817390901984578">Android एपहरू प्रयोग गर्न, आफ्नो <ph name="DEVICE_TYPE" /> लाई चार्ज गर्दै अपडेट गर्नुहोस्।</translation> @@ -1952,6 +1959,7 @@ <translation id="2454206500483040640">पार्टिसन गरिएको</translation> <translation id="2454247629720664989">कुञ्जीशब्द</translation> <translation id="2454524890947537054">वेबसाइट खोल्न पाऊँ भनी गरिएको अनुरोध अनुमोदन गर्ने हो?</translation> +<translation id="2454913962395846391">स्वतः प्रामाणिक समय</translation> <translation id="245650153866130664">टिकट स्वत: पुन: ताजा गर्न “पासवर्ड सम्झनुहोस्” भन्ने विकल्प चिन्हमार्फत चयन गर्नुहोस्। तपाईंको पासवर्ड तपाईंको डिभाइसमा मात्र भण्डार हुने छ।</translation> <translation id="2456794251167091176">इम्पोर्ट गर्ने कार्य पूरा भयो</translation> <translation id="2456827790665612305">साइट अनफलो गर्नुहोस्</translation> @@ -2911,6 +2919,7 @@ <translation id="3202499879214571401"><ph name="DEVICE_NAME" /> मा स्क्रिन कास्ट गर्ने कार्य पज गर्नुहोस्</translation> <translation id="3202578601642193415">नवीनतम</translation> <translation id="3204648577100496185">यो डिभाइसबाट यस एपसँग सम्बन्धित डेटा हटाइन सक्छ</translation> +<translation id="3205140624385017621">क्यामेरा प्रयोग गर्ने अनुमति दिइएका एप तथा वेबसाइट र सिस्टमका सेवाहरूले तपाईंको डिभाइसको क्यामेरा प्रयोग गर्न सक्छन्। क्यामेरा प्रयोग गर्न तपाईंले यो एप रिस्टार्ट गर्नु पर्ने वा यो पेज रिफ्रेस गर्नु पर्ने हुन सक्छ।</translation> <translation id="3207344462385471911">तपाईंलाई तपाईंले हालसालै गरेका क्रियाकलापका आधारमा तपाईंलाई मन पर्न सक्ने सिफारिस गरिएका खोज तथा किनमेल गर्दा पाइने छुटसम्बन्धी जानकारी देखाइँदै छ। <ph name="BREAK" /> <ph name="BREAK" /> @@ -3188,6 +3197,7 @@ <translation id="3434272557872943250">तपाईंका बच्चाका खातामा वेब तथा एपसम्बन्धी अतिरिक्त गतिविधिको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सेभ गरिन सक्छ। families.google.com मा गएर यी सेटिङहरू र यिनलाई मिलाउने तरिकाबारे थप जान्नुहोस्।</translation> <translation id="3434475275396485144">तपाईंको फोनका एड्मिन यो सेटिङ मिलाउनुहुन्छ।</translation> <translation id="3434512374684753970">अडियो तथा भिडियो</translation> +<translation id="3435381311628654443">माइक्रोफोन प्रयोग गर्ने अनुमति दिइएका एप तथा वेबसाइट र सिस्टमका सेवाहरूलाई माइक्रोफोन प्रयोग गर्न दिइयोस्</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ले तपाईंको <ph name="CODE_TYPE" /> को अनुरोध गर्दैछ</translation> <translation id="3435738964857648380">सुरक्षा</translation> <translation id="343578350365773421">पाना सकियो</translation> @@ -3265,6 +3275,7 @@ <translation id="3491669675709357988">तपाईंका बच्चाको खातामा Family Link का अभिभावकीय नियन्त्रणहरू सेटअप गरिएका छैनन्। तपाईंले सेटअप पूरा गरिसकेपछि तपाईं बच्चाको खातामा अभिभावकीय नियन्त्रणहरू थप्न सक्नुहुन्छ। तपाईं एक्स्प्लोर एपमा अभिभावकीय नियन्त्रणसम्बन्धी जानकारी फेला पार्न सक्नुहुन्छ।</translation> <translation id="3491678231052507920">साइटहरू तपाईंलाई VR सत्रमा प्रवेश गर्ने अनुमति दिन सामान्यतया तपाईंका भर्चुअल रियालिटी चल्ने यन्त्र र तिनमा भएका डेटा प्रयोग गर्छन्</translation> <translation id="3493043608231401654">ट्याब समूहबाट <ph name="TAB_TITLE" /> हटाउनुहोस्</translation> +<translation id="3493463599276143766">कुनै पनि वेबसाइटलाई तपाईंको डिभाइसको क्यामेरा प्रयोग गर्ने अनुमति दिइएको छैन</translation> <translation id="3493486281776271508">इन्टरनेट जडान आवश्यक छ</translation> <translation id="3493881266323043047">वैधता</translation> <translation id="3495496470825196617">चार्ज भइरहेका बेला स्लिप मोडमा लैजानुहोस्</translation> @@ -3583,6 +3594,7 @@ <translation id="3733296813637058299">हामी तपाईंका लागि ती एपहरू इन्स्टल गरिदिने छौँ। तपाईं Play स्टोरमा गई आफ्नो <ph name="DEVICE_TYPE" /> मा चल्ने थप एपहरू फेला पार्न सक्नुहुन्छ।</translation> <translation id="3735039640698208086">अडियो बजाइरहेको बेला...</translation> <translation id="3735740477244556633">यसअनुसार क्रमबद्ध गर्नुहोस्</translation> +<translation id="3735827758948958091">सीमा तोकिएको इन्टरनेटमा कनेक्ट गरिएका बेला <ph name="FILE_NAMES" /> खोल्न सकिँदैन</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> मा भएको डेटा २४ घन्टापछि मेटाइने छ</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> खोल्ने हो?</translation> @@ -3851,6 +3863,7 @@ <translation id="3925573269917483990">क्यामेरा:</translation> <translation id="3925926055063465902">यो डिभाइस चलाउने अन्य प्रयोगकर्ताहरू पनि यो नेटवर्क प्रयोग गर्न सक्छन्</translation> <translation id="3926002189479431949">Smart Lock फोन परिवर्तन भयो</translation> +<translation id="3926410220776569451">क्यामेरा प्रयोग गर्न रोक लगाइएको छ</translation> <translation id="3927932062596804919">अस्वीकार गर्नुहोस्</translation> <translation id="3928570707778085600"><ph name="FILE_OR_FOLDER_NAME" /> मा गरिएका परिवर्तनहरू सुरक्षित गर्ने हो?</translation> <translation id="3928659086758780856">प्रिन्टरको मसी सकिनै लागेको छ</translation> @@ -3905,7 +3918,6 @@ <translation id="3966072572894326936">अर्को फोल्डर रोज्नुहोस्...</translation> <translation id="3966094581547899417">हटस्पटका विवरणहरू</translation> <translation id="3967822245660637423">डाउनलोड पूर्ण भयो</translation> -<translation id="3967841595862839006">आफ्नो भाषा र किबोर्ड छान्नुहोस्</translation> <translation id="3968739731834770921">काना</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">हिसाब गर्दै...</translation> @@ -4045,6 +4057,7 @@ <translation id="4078738236287221428">आक्रामक</translation> <translation id="4078903002989614318">क्रमबद्ध र सूचीबद्ध गर्ने विकल्पहरू</translation> <translation id="4079140982534148664">हिज्जे जाँचसम्बन्धी परिष्कृत सुविधा प्रयोग गर्नुहोस्</translation> +<translation id="4082333918978320301">कुनै पनि वेबसाइटलाई तपाईंको डिभाइसको माइक्रोफोन प्रयोग गर्ने अनुमति दिइएको छैन</translation> <translation id="4084582735848141214">{COUNT,plural, =1{एउटा साइटलाई कुकी प्रयोग गर्ने अनुमति दिइएको छ}other{# वटा साइटलाई कुकी प्रयोग गर्ने अनुमति दिइएको छ}}</translation> <translation id="4084682180776658562">बुकमार्क</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" />बन्द गर्नुहोस्</translation> @@ -4194,6 +4207,7 @@ <translation id="4201546031411513170">तपाईं जुनसुकै बेला सेटिङहरूमा गई सिंक गर्ने कुरा छनौट गर्न सक्नुहुन्छ।</translation> <translation id="4203065553461038553">फाइलको नाम वा लोकेसन धेरै लामो छ</translation> <translation id="4203769790323223880">क्यामेरा प्रयोग गर्ने अनुमति दिइएको छैन</translation> +<translation id="4204415812590935863">अहिले नै कुनै थिम बनाउन सकिएन।</translation> <translation id="4205157409548006256">Linux कन्फिगर गर्दै गर्दा त्रुटि भयो।</translation> <translation id="4206144641569145248">अन्य ग्रहबासी</translation> <translation id="4206323443866416204">प्रतिक्रियाको रिपोर्ट</translation> @@ -4535,6 +4549,7 @@ <translation id="447252321002412580">Chrome का सुविधा तथा कार्यसम्पादन सुधार्न मद्दत गर्नुहोस्</translation> <translation id="4472533928615930332"><ph name="STYLE" /> शैली भएको <ph name="SUBJECT" /> को सिर्जना गरिएको फोटो <ph name="INDEX" /></translation> <translation id="4472575034687746823">सुरु गर्नुहोस्</translation> +<translation id="4473559657152613417">कुनै ट्याबमा राइट क्लिक गर्नुहोस् र "यो ट्याब नयाँ समूहमा हाल्नुहोस्" चयन गर्नुहोस्</translation> <translation id="4473996011558324141">समय अनुमान गरिँदै छ</translation> <translation id="4474155171896946103">सबै ट्याबहरूलाई बुकमार्क गर्नुहोस्...</translation> <translation id="4475552974751346499">डाउनलोडहरू खोज्नुहोस्</translation> @@ -4586,7 +4601,6 @@ <translation id="4513872120116766993">पूर्वानुमानयुक्त लेखन</translation> <translation id="4513946894732546136">पृष्ठपोषण</translation> <translation id="4515872537870654449">मर्मतका लागि Dell मा सम्पर्क गर्नुहोस्। पङ्खाले काम गरिरहेको छैन भने डक बन्द हुने छ।</translation> -<translation id="4516008165284813420">आफ्नो <ph name="DEVICE_TYPE" /> इन्टरनेटमा कनेक्ट गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्। तपाईं अर्को डिभाइसबाट पनि play.google.com/about/play-terms मा जान सक्नुहुन्छ।</translation> <translation id="4518840066030486079">सिफ्ट की मोडको शैली</translation> <translation id="4519331665958994620">साइटहरूले तपाईंको क्यामेरा प्रयोग गर्ने अनुमति माग्न सक्छन्</translation> <translation id="4519605771716872386">फाइल सिंक गर्ने सुविधा अन गरिएको छ</translation> @@ -4630,6 +4644,7 @@ <translation id="4547672827276975204">स्वतः सेट गर्नुहोस्</translation> <translation id="4548858987594081919">Google पासवर्ड म्यानेजरलाई साइन इन गर्न प्रयोग गरिने तपाईंको जानकारी सेभ गर्न दिन यो साइटको युजरनेम हाल्नुहोस्</translation> <translation id="4549791035683739768">तपाईंको सुरक्षा साँचोमा कुनै पनि फिंगरप्रिन्ट भण्डारण गरिएको छैन</translation> +<translation id="4550737096585299960">कृपया केही मिनेटपछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="4550926046134589611">खोल्न मिल्ने केही लिंकहरू अझै पनि <ph name="APP_NAME" /> मा खुल्ने छन्।</translation> <translation id="4551379727767354516">तपाईंले हालसालै AI प्रयोग गरी सिर्जना गरेका थिमहरू</translation> <translation id="4551763574344810652">अन्डू गर्न <ph name="MODIFIER_KEY_DESCRIPTION" /> थिच्नुहोस्</translation> @@ -5254,6 +5269,7 @@ <translation id="5051461727068120271">पुष्टि नगरिएको फाइल डाउनलोड गर्नुहोस्</translation> <translation id="5051836348807686060">तपाईंले चयन गर्नुभएको भाषामा हिज्जे परीक्षण गर्ने सुविधा प्रयोग गर्न मिल्दैन</translation> <translation id="5052499409147950210">साइट सम्पादन गर्नुहोस्</translation> +<translation id="5052853071318006357">कुनै ट्याबमा राइट क्लिक गर्नुहोस् र "यो ट्याब नयाँ समूहमा हाल्नुहोस्" चयन गर्नुहोस्</translation> <translation id="5053233576223592551">युजरनेम हाल्नुहोस्</translation> <translation id="505347685865235222">नाम नभएको समूह - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />Chrome कस्टमाइज गर्नुहोस्<ph name="END_LINK" /> मा गई कार्डसम्बन्धी सबै विकल्पहरू हेर्नुहोस्</translation> @@ -5290,6 +5306,7 @@ <translation id="5078638979202084724">सबै ट्याबहरू पृष्ठमञ्जूषा गर्नुहोस्</translation> <translation id="5078796286268621944">गलत PIN</translation> <translation id="5079010647467150187">अन्तर्निर्मित VPN हाल्नुहोस्...</translation> +<translation id="5079460277417557557">तपाईं अब आफूले साइन इन गरेका सबै डेस्कटप डिभाइसमा सेभ गरिएका ट्याब समूहहरू प्रयोग गर्न सक्नुहुन्छ</translation> <translation id="5079699784114005398">तपाईंले सिंक गर्ने सुविधा अन गर्नुभयो भने तपाईं जुन जुन ChromeOS डिभाइसमा आफ्नो Google खातामार्फत साइन इन गर्नुहुन्छ ती डिभाइसहरूमा तपाईंका एपहरू उपलब्ध हुने छन्। Chrome ब्राउजरबाट इन्स्टल गरिएका वेब एपहरू भने ब्राउजर सिंक अफ गरिएको अवस्थामा पनि सिंक गरिने छन्।</translation> <translation id="508059534790499809">Kerberos को टिक पुन: ताजा गर्नुहोस्</translation> <translation id="5081124414979006563">अतिथि प्रोफाइल खोल्नुहोस्</translation> @@ -5353,6 +5370,7 @@ <translation id="5125967981703109366">यस कार्डका बारेमा</translation> <translation id="512642543295077915">सर्च + ब्याकस्पेस</translation> <translation id="5126611267288187364">परिवर्तनहरू हेर्नुहोस्</translation> +<translation id="512761462447738469">क्यामेरा प्रयोग गर्ने अनुमति दिइएका एप तथा वेबसाइट र सिस्टमका सेवाहरूले तपाईंको डिभाइसको क्यामेरा प्रयोग गर्न सक्छन्</translation> <translation id="5127620150973591153">सुरक्षित कनेक्सन ID: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">सिंक अफ छ</translation> <translation id="5127881134400491887">नेटवर्क जडानहरू व्यवस्थित गर्नुहोस्</translation> @@ -6058,6 +6076,7 @@ <translation id="5691581861107245578">आफूले टाइप गरिरहेका कुराका आधारमा इमोजीसम्बन्धी सिफारिसहरू प्राप्त गर्नुहोस्</translation> <translation id="5691772641933328258">फिंगरप्रिन्ट पहिचान गरिएन</translation> <translation id="5692183275898619210">छाप्ने काम सम्पन्न भयो</translation> +<translation id="5693237475389615913">Chrome मा साइटलाई दिइएका माइक्रोफोन प्रयोग गर्ने अनुमतिहरू व्यवस्थापन गर्नुहोस्</translation> <translation id="5693255400847650006">माइक्रोफोन प्रयोग भइरहेको छ</translation> <translation id="5695184138696833495">Linux मा Android एपको ADB</translation> <translation id="5696143504434933566"><ph name="EXTENSION_NAME" /> को दुरुपयोगबारे रिपोर्ट गर्नुहोस्</translation> @@ -6079,6 +6098,7 @@ <translation id="5708171344853220004">Microsoft</translation> <translation id="5709557627224531708">Chrome लाई आफ्नो डिफल्ट ब्राउजरका रूपमा सेट गर्नुहोस्</translation> <translation id="5711010025974903573">सेवासम्बन्धी लगहरू</translation> +<translation id="5711324642850167289">कुनै पनि एपलाई तपाईंको माइक्रोफोन प्रयोग गर्ने अनुमति दिइएको छैन</translation> <translation id="5711983031544731014">अनलक गर्न सकिएन। आप्नो पासवर्ड प्रविष्टि गर्नुहोस्।</translation> <translation id="5712153969432126546">साइटहरूले कहिलेकाहीँ कागजात, करार तथा फाराम जस्ता PDF फाइलहरू प्रकाशित गर्छन्</translation> <translation id="571222594670061844">साइटहरूले पहिचान सेवा प्रदायकहरूबाट प्राप्त साइन इन प्रम्प्टहरू देखाउन सक्छन्</translation> @@ -6270,6 +6290,7 @@ <translation id="5862319196656206789">कनेक्ट गरिएका यन्त्रहरू सेटअप गर्नुहोस्</translation> <translation id="5862731021271217234">आफ्ना अन्य यन्त्रहरूबाट आफ्ना ट्याबहरू प्राप्त गर्न सिंक गर्ने सुविधा अन गर्नुहोस्</translation> <translation id="5863195274347579748">बाह्य सहायक सामग्रीहरू व्यक्तिगत जानकारी हेर्न, प्रयोग गर्न वा सेयर गर्न सक्छन्।</translation> +<translation id="5863263400083022538">सिस्टमका सेवाहरू</translation> <translation id="5863445608433396414">डिबग सुविधाहरू सक्षम गर्नुहोस्</translation> <translation id="5863515189965725638">IBAN परिवर्तन गर्नुहोस्</translation> <translation id="5864195618110239517">डेटाको सीमा भएको इन्टरनेट प्रयोग गर्नुहोस्</translation> @@ -6708,6 +6729,7 @@ <translation id="6207937957461833379">देश / क्षेत्र</translation> <translation id="6208521041562685716">मोबाइल डेटा सक्रिय गरिँदै छ</translation> <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> मा सेभ गर्न सकिएन - <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">माइक्रोफोन प्रयोग गर्ने अनुमति दिइएका एप तथा वेबसाइट र सिस्टमका सेवाहरूले तपाईंको डिभाइसको माइक्रोफोन प्रयोग गर्न सक्छन्</translation> <translation id="6209838773933913227">कम्पोनेन्टहरू अपडेट हुँदै छन्</translation> <translation id="6209908325007204267">तपाईंको डिभाइसमा स्तरवृद्धि गरी Chrome Enterprise बनाउने सुविधा उपलब्ध छ तर तपाईंको प्रयोगकर्ता नाम भने कुनै पनि इन्टरप्राइजको खातासँग सम्बन्धित छैन। कृपया कुनै सहायक यन्त्रमार्फत g.co/ChromeEnterpriseAccount मा गई इन्टरप्राइज खाता बनाउनुहोस्।</translation> <translation id="6210282067670792090">एड्रेस बारमा सर्च इन्जिन र साइटमा खोज्ने विभिन्न सर्टकट समावेश भएको यो किबोर्ड सर्टकट प्रयोग गर्नुहोस्</translation> @@ -7042,6 +7064,7 @@ <translation id="6478248366783946499">खतरनाक फाइल राख्ने हो?</translation> <translation id="6479881432656947268">Chrome वेब स्टोरमा जानुहोस्</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> ले व्यवस्थापन गर्छ</translation> +<translation id="6481749622989211463">नजिकैका डिभाइसहरूसँग फाइल तथा अन्य सामग्री सेयर गर्नुहोस्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="6482559668224714696">फुल स्क्रिन म्याग्निफायर</translation> <translation id="6483485061007832714">डाउनलोड खोल्नुहोस्</translation> <translation id="6483805311199035658"><ph name="FILE" /> खोल्दै...</translation> @@ -7290,6 +7313,7 @@ <translation id="6680650203439190394">मूल्याङ्कन गर्नुहोस्</translation> <translation id="6683022854667115063">हेडफोन</translation> <translation id="6683087162435654533">सबै ट्याबहरू रिस्टोर गर्नुहोस्</translation> +<translation id="6683433919380522900">अनुमतिअन्तर्गत <ph name="PERMISSION_STATE" /> तोकिएको छ</translation> <translation id="6684827949542560880">नवीनतम अपडेट डाउनलोड गर्दै</translation> <translation id="668599234725812620">Google Play खोल्नुहोस्</translation> <translation id="6686490380836145850">दायाँ तिरका ट्याबहरू बन्द गर्नुहोस्</translation> @@ -8103,6 +8127,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> को डिभाइसमा <ph name="USER_EMAIL" /> खाता प्रयोग गरी सेयर गरिएका <ph name="FEATURE_NAME" /> का सेटिङ।</translation> <translation id="7331646370422660166">alt + डाउन एरो</translation> <translation id="7332053360324989309">यसै कामको लागि तोकिएको कर्मचारी: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">सीमा तोकिएको इन्टरनेटमा कनेक्ट गरिएका बेला फाइल अपलोड गर्न सकिँदैन।</translation> <translation id="7333669215417470379">आफ्ना एप र सेटिङहरू ब्याकअप र रिस्टोर गर्नुहोस्</translation> <translation id="7335436113423103413">यसले "नयाँ ट्याब" पेजमा भएको एकीकृत साइड प्यानलबाट Chrome कस्टमाइज गर्ने सुविधा अन गर्छ।</translation> <translation id="7335974957018254119">यी भाषाहरूका लागि हिज्जे जाँच प्रयोग गर्नुहोस्</translation> @@ -8259,6 +8284,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome वेब स्टोरबाट हटाइएको एउटा एक्स्टेन्सनको समीक्षा गर्नुहोस्}other{Chrome वेब स्टोरबाट हटाइएका {NUM_EXTENSIONS} वटा एक्स्टेन्सनहरूको समीक्षा गर्नुहोस्}}</translation> <translation id="7436921188514130341">ओहो! पुनः नामकरण गर्ने क्रममा कुनै त्रुटि भयो।</translation> <translation id="7439519621174723623">जारी राख्न कुनै डिभाइसको नाम राख्नुहोस्</translation> +<translation id="7441736532026945583">तपाईंको ट्याब स्ट्रिपबाट यो समूह हटाउन "समूह लुकाउनुहोस्" चयन गर्नुहोस्</translation> <translation id="7441736921018636843">यो सेटिङ परिवर्तन गर्ने प्रयोजनका लागि आफ्नो सिंकसम्बन्धी पासफ्रेज हटाउन <ph name="BEGIN_LINK" />सिंक गर्ने सेवा रिसेट गर्नुहोस्<ph name="END_LINK" /></translation> <translation id="7441830548568730290">अन्य प्रयोगकर्ताहरू</translation> <translation id="744341768939279100">एउटा नयाँ प्रोफाइल बनाउनुहोस्</translation> @@ -8859,6 +8885,7 @@ <translation id="7887864092952184874">ब्लुटुथ माउस जोडा मिलाइएको</translation> <translation id="7889371445710865055">स्पिच-टु-टेक्स्ट सुविधाको भाषा बदल्नुहोस्</translation> <translation id="7890147169288018054">आफ्नो IP वा म्याक एड्रेस जस्ता नेटवर्कसम्बन्धी जानकारी हेर्नुहोस्</translation> +<translation id="7892005672811746207">"समूह सेभ गर्नुहोस्" अन गर्नुहोस्</translation> <translation id="7892384782944609022">कनेक्ट गर्न सकिएन। फेरि प्रयास गर्न डिभाइस चयन गर्नुहोस्।</translation> <translation id="7893008570150657497">तपाइँको कम्प्युटरबाट तस्बिरहरू, सङ्गीत, र हन्य मिडिया पहुँच गर्नुहोस्</translation> <translation id="7893153962594818789">यस <ph name="DEVICE_TYPE" /> मा ब्लुटुथ अफ छ। आफ्नो पासवर्ड हाल्नुहोस् र ब्लुटुथ अन गर्नुहोस्।</translation> @@ -9101,6 +9128,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">समूह <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">कनेक्सन डायलग</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> लाई लोकेसन प्रयोग गर्ने अनुमति</translation> <translation id="8070662218171013510">हेप्टिक फिडब्याक</translation> <translation id="8071432093239591881">छविको रूपमा प्रिन्ट गर्नुहोस्</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />एपका डेटा भनेको सम्पर्क, सन्देश र तस्बिरहरू जस्ता डेटालगायत कुनै अनुप्रयोगले सुरक्षित गरेको (विकासकर्ताको सेटिङहरूका आधारमा) जुनसुकै डेटा हुन सक्छ।<ph name="END_PARAGRAPH1" /> @@ -9159,6 +9187,7 @@ <translation id="8109991406044913868">AI प्रयोग गरी सिर्जना गरिएको थिम</translation> <translation id="8110393529211831722">यो डिभाइसमा मात्र सदस्यता इन्स्टल गरिएको छ। साथै, उक्त सदस्यता तपाईंको खातामार्फत साइन इन गरिएका अन्य डिभाइसहरूमा सिंक गरिएको छैन। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="8110489095782891123">सम्पर्क ठेगानाको सूची डाउनलोड गरिँदै छ...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> लाई माइक्रोफोन प्रयोग गर्ने अनुमति</translation> <translation id="8115139559594092084">तपाईंको Google Drive बाट</translation> <translation id="8116972784401310538">&बुकमार्क व्यवस्थापक</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> ले तपाईंले कसरी साइन इन गर्नुभयो भन्ने कुरा याद गर्छ र सम्भव हुँदा तपाईंलाई स्वतः साइन इन गराउँछ। यो सुविधा अफ भएका बेलामा तपाईंलाई हरेक पटक पुष्टि गर्न लगाइने छ।</translation> @@ -9374,6 +9403,7 @@ <translation id="8275038454117074363">आयात गर्नुहोस्</translation> <translation id="8275080796245127762">तपाईंको यन्त्रबाट कल गर्नुहोस्</translation> <translation id="8275339871947079271">जुनसुकै यन्त्र प्रयोग गरेर साइन गर्दा पनि आफ्नो पासवर्ड सुरक्षित रूपमा प्रयोग गर्न उक्त पासवर्ड सारेर आफ्नो Google खातामा लैजानुहोस्</translation> +<translation id="8276242035951017580">कुनै पनि एपलाई तपाईंको क्यामेरा प्रयोग गर्ने अनुमति दिइएको छैन</translation> <translation id="8276560076771292512">क्यास खालि गर्नुहोस् र हार्ड पुन: लोड गर्नुहोस्</translation> <translation id="8276850948802942358">साइटलाई तेस्रो पक्षीय कुकीहरू प्रयोग गर्ने अनुमति दिने तरिकाका बारेमा थप जान्नुहोस्</translation> <translation id="828180235270931531">उपलब्ध अन्य प्रिन्टरहरू</translation> @@ -9392,6 +9422,7 @@ <translation id="8291942417224950075">व्यक्तिगत प्रयोगका लागि</translation> <translation id="8293206222192510085">बुकमार्क थप्नुहोस्</translation> <translation id="8294431847097064396">स्रोत</translation> +<translation id="8294476140219241086">ट्याब अर्गनाइजर</translation> <translation id="8294895455164415895">Chrome लाई ट्याब समूहहरूका बारेमा सुझाव दिने अनुमति दिन सेटिङ खोल्नुहोस्</translation> <translation id="8295449579927246485">लाइभ अनुवाद</translation> <translation id="8295450130892483256">Microsoft 365 इन्स्टल गर्नुहोस्</translation> @@ -9504,6 +9535,7 @@ <translation id="8380266723152870797">विन्डोको नाम</translation> <translation id="8380941800586852976">खतरनाक</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> अन गर्नुहोस्</translation> +<translation id="8382197851871630452">स्थानीय मौसम</translation> <translation id="8382677870544805359">तपाईं इन्टरप्राइजसम्बन्धी सुविधाहरू प्रयोग गर्न चाहनुहुन्छ भने तपाईंले यो डिभाइस फ्याक्ट्री रिसेट गर्नु पर्ने हुन्छ।</translation> <translation id="8382715499079447151">सुरक्षित रूपमा हेर्ने सुविधा</translation> <translation id="8382913212082956454">&इमेल ठेगानाको प्रतिलिपी बनाउनुहोस्</translation> @@ -9694,6 +9726,7 @@ <translation id="8528962588711550376">साइन इन गर्दै।</translation> <translation id="8529578450330869579">तपाईंको इन्टरनेट ट्राफिक प्रयोग गर्न सक्ने मान्छेहरूलाई तपाईं कुन कुन साइटहरू खोल्नुहुन्छ भन्ने कुरा हेर्न नदिन सुरक्षित डोमेन नेम सिस्टम (DNS) प्रयोग गर्नुहोस्। यसले <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> मा भएको व्यवस्थापन गरिएको सेवा प्रदायक प्रयोग गर्छ</translation> <translation id="8529925957403338845">तात्कालिक टेदरिङको जडान असफल भयो</translation> +<translation id="8531367864749403520">तपाईंको ट्याब स्ट्रिपबाट यो समूह हटाउन "समूह लुकाउनुहोस्" चयन गर्नुहोस्</translation> <translation id="8531701051932785007">परिष्कृत Safe Browsing अफ छ</translation> <translation id="8533670235862049797">Safe Browsing अन छ</translation> <translation id="8534656636775144800">हत्तेरिका! डोमेनमा सामेल हुने प्रयास गर्दा कुनै समस्या आयो। कृपया फेरि प्रयास गर्नुहोस्।</translation> @@ -9820,6 +9853,7 @@ <translation id="8639635302972078117">प्रयोग तथा निदानसम्बन्धी डेटा पठाउनुहोस्। यो यन्त्रले हाल निदान, डिभाइस र एपको प्रयोगसम्बन्धी डेटा स्वतः Google लाई पठाइरहेको छ। यस्तो डेटा तपाईंका बच्चाको पहिचान गर्ने प्रयोजनका लागि प्रयोग गरिने छैन र यसले सिस्टम तथा एपको स्थिरता र अन्य कुराहरूमा सुधार ल्याउन मद्दत गर्ने छ। केही समग्र डेटाले Google का एप तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई पनि मद्दत गर्ने छन्। तपाईंका बच्चाका खातामा वेब तथा एपसम्बन्धी अतिरिक्त गतिविधिको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सेभ गरिन सक्छ।</translation> <translation id="8640575194957831802">पछिल्लो पटक खोलिएको</translation> <translation id="8641946446576357115">आफ्ना iOS डिभाइसहरूमा पासवर्ड प्रयोग गर्नुहोस्</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> लाई क्यामेरा प्रयोग गर्ने अनुमति</translation> <translation id="8642900771896232685">२ सेकेन्ड</translation> <translation id="8642947597466641025">पाठ ठुलो बानउनुहोस्</translation> <translation id="8643403533759285912">समूह मेटाउनुहोस्</translation> @@ -9854,6 +9888,7 @@ <translation id="8662978096466608964">Chrome ले वालपेपर सेट गर्न सक्दैन।</translation> <translation id="8663051876219324457">एप, वेबसाइट र सिस्टमका सेवाहरूलाई आफ्नो डिभाइसको लोकेसन प्रयोग गर्न दिनुहोस्। तपाईंको डिभाइसको अनुमानित लोकेसन पत्ता लगाउन लोकेसन सेवाले Wi‑Fi, मोबाइल नेटवर्क र सेन्सरलगायतका स्रोतहरू प्रयोग गर्न सक्छ। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> मा सधै धेरै स्वचालित डाउनलोडहरू ब्लक गर्छ</translation> +<translation id="8664249499245357248">समूहको नाममा राइट क्लिक गर्नुहोस्</translation> <translation id="8664389313780386848">पाना स्रोत &हेर्नुहोस्</translation> <translation id="8665110742939124773">तपाईंले गलत एक्सेस कोड हाल्नुभएको छ। फेरि प्रयास गर्नुहोस्।</translation> <translation id="8665180165765946056">ब्याकअप सम्पन्न भयो</translation> @@ -10178,6 +10213,7 @@ <translation id="8900413463156971200">सेलुलर नेटवर्क सक्षम पार्नुहोस्</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> का अनुसार तपाईंले आजै आफ्नो डेटा ब्याकअप गरी यो <ph name="DEVICE_TYPE" /> फिर्ता गर्नु पर्ने हुन्छ।}other{<ph name="MANAGER" /> का अनुसार तपाईंले म्याद सकिनुअघि नै आफ्नो डेटा ब्याकअप गरी यो <ph name="DEVICE_TYPE" /> फिर्ता गर्नु पर्ने हुन्छ।}}</translation> <translation id="8902667442496790482">सेलेक्ट टु स्पिक नामक सेवाका सेटिङहरू खोल्नुहोस्</translation> +<translation id="8903733144777177139">माइक्रोफोन प्रयोग गर्न रोक लगाइएको छ</translation> <translation id="890616557918890486">स्रोत परिवर्तन गर्नुहोस्</translation> <translation id="8907701755790961703">कृपया एउटा देश चयन गर्नुह</translation> <translation id="8908420399006197927">सिफारिस गरिएको समूहबाट ट्याब हटाउनुहोस्</translation> @@ -10215,6 +10251,7 @@ <translation id="8934732568177537184">जारी राख्नुहोस्</translation> <translation id="8938800817013097409">USB-C यन्त्र (पछाडिको दायाँ पोर्ट)</translation> <translation id="8940081510938872932">तपाईंको कम्प्युटरले अहिले धेरै कुराहरू गरिरहेको छ। पछि पुन: प्रयास गर्नुहोस्।</translation> +<translation id="8940228279218723234">क्यामेरा प्रयोग गर्ने अनुमति दिइएका एप तथा वेबसाइट र सिस्टमका सेवाहरूलाई क्यामेरा प्रयोग गर्न दिइयोस्। क्यामेरा प्रयोग गर्न तपाईंले यो एप रिस्टार्ट गर्नु पर्ने वा यो पेज रिफ्रेस गर्नु पर्ने हुन सक्छ।</translation> <translation id="8940381019874223173">तपाईंको Google Photos बाट प्राप्त गरिएका</translation> <translation id="8940888110818450052">साइन इन गर्ने विकल्पहरू</translation> <translation id="8941173171815156065">अनुमति '<ph name="PERMISSION" />' उल्टाउँनुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 554f349..d1432a3 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Verbonden met Android-telefoon</translation> <translation id="1523279371236772909">Bekeken in de afgelopen maand</translation> <translation id="1523978563989812243">Machines voor tekst-naar-spraak</translation> -<translation id="1524430321211440688">Toetsenbord</translation> <translation id="1524563461097350801">Nee, bedankt</translation> <translation id="1525740877599838384">Alleen wifi gebruiken om de locatie te bepalen</translation> <translation id="152629053603783244">Linux opnieuw opstarten</translation> @@ -3908,7 +3907,6 @@ <translation id="3966072572894326936">Een andere map kiezen...</translation> <translation id="3966094581547899417">Hotspotdetails</translation> <translation id="3967822245660637423">Downloaden voltooid</translation> -<translation id="3967841595862839006">Kies je taal en toetsenbord</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Berekenen...</translation> @@ -4588,7 +4586,6 @@ <translation id="4513872120116766993">Voorspellend schrijven</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Neem contact op met Dell voor service. Het dock wordt uitgezet als de ventilator niet werkt.</translation> -<translation id="4516008165284813420">Zorg dat je <ph name="DEVICE_TYPE" /> verbinding heeft met internet en probeer het opnieuw. Je kunt ook op een ander apparaat naar play.google.com/about/play-terms gaan.</translation> <translation id="4518840066030486079">Modusstijl Shift-toets</translation> <translation id="4519331665958994620">Sites kunnen toegang tot je camera vragen</translation> <translation id="4519605771716872386">Bestandssynchronisatie staat aan</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index f456de68..88f5c12 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Koblet til Android-telefon</translation> <translation id="1523279371236772909">Vist den siste måneden</translation> <translation id="1523978563989812243">Motorer for tekst til tale</translation> -<translation id="1524430321211440688">Tastatur</translation> <translation id="1524563461097350801">Nei takk</translation> <translation id="1525740877599838384">Bruk bare Wifi til å fastslå posisjonen</translation> <translation id="152629053603783244">Start Linux på nytt</translation> @@ -3916,7 +3915,6 @@ <translation id="3966072572894326936">Velg en annen mappe...</translation> <translation id="3966094581547899417">Informasjon om wifi-sone</translation> <translation id="3967822245660637423">Nedlasting fullført</translation> -<translation id="3967841595862839006">Velg språket og tastaturet ditt</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Beregner …</translation> @@ -4597,7 +4595,6 @@ <translation id="4513872120116766993">Prediktiv skriving</translation> <translation id="4513946894732546136">Google Feedback</translation> <translation id="4515872537870654449">Kontakt Dell for service. Dokken slår seg av hvis viften ikke virker.</translation> -<translation id="4516008165284813420">Sørg for at <ph name="DEVICE_TYPE" /> er koblet til internett, og prøv på nytt. Du kan også gå til play.google.com/about/play-terms på en annen enhet.</translation> <translation id="4518840066030486079">Type modus for Shift-tast</translation> <translation id="4519331665958994620">Nettsteder kan be om å få bruke kameraet ditt</translation> <translation id="4519605771716872386">Filsynkronisering er slått på</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 34681f1e..ba71a2e 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -678,7 +678,6 @@ <translation id="1521933835545997395">Android ଫୋନ ସହ କନେକ୍ଟ କରାଯାଇଛି</translation> <translation id="1523279371236772909">ଗତ ମାସରେ ଦେଖାଯାଇଛି</translation> <translation id="1523978563989812243">ଟେକ୍ସଟ୍-ଟୁ-ସ୍ପିଚ୍ ଇଞ୍ଜିନଗୁଡ଼ିକ</translation> -<translation id="1524430321211440688">କୀ'ବୋର୍ଡ</translation> <translation id="1524563461097350801">ନାହିଁ, ଥାଉ</translation> <translation id="1525740877599838384">ଲୋକେସନ୍ ସ୍ଥିର କରିବାକୁ କେବଳ ୱାଇ-ଫାଇ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="152629053603783244">Linux ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation> @@ -959,7 +958,7 @@ <translation id="1718835860248848330">ଶେଷ ଘଣ୍ଟାକର</translation> <translation id="1719312230114180055">ଟିପ୍ପଣୀ: ଆପଣଙ୍କର ଟିପଚିହ୍ନ ଏକ ଜଟିଳ ପାସ୍ୱର୍ଡ କିମ୍ବା PIN ଠାରୁ କମ୍ ସୁରକ୍ଷିତ ହୋଇପାରେ।</translation> <translation id="1720318856472900922">TLS WWW ସର୍ଭର୍ ପ୍ରାମାଣିକତା</translation> -<translation id="172123215662733643"><ph name="VISUAL_SEARCH_PROVIDER" /> ମାଧ୍ୟମରେ ଇମେଜଗୁଡ଼ିକୁ ସନ୍ଧାନ କରନ୍ତୁ</translation> +<translation id="172123215662733643"><ph name="VISUAL_SEARCH_PROVIDER" /> ମାଧ୍ୟମରେ ଇମେଜଗୁଡ଼ିକୁ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="1722460139690167654"><ph name="ENROLLMENT_DOMAIN" /> ଦ୍ଵାରା ଆପଣଙ୍କର <ph name="BEGIN_LINK" /> <ph name="DEVICE_TYPE" /> ପରିଚାଳିତ ହେଉଛି<ph name="END_LINK" /></translation> <translation id="1723824996674794290">&ନୂତନ ୱିଣ୍ଡୋ</translation> <translation id="1724801751621173132">ଇନପୁଟ ମୋଡ</translation> @@ -1368,7 +1367,7 @@ <translation id="2023042679320690325">ଡାଟା ଉଲ୍ଲଙ୍ଘନ ବିରୁଦ୍ଧରେ <ph name="BRAND" /> ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ। 24 ଘଣ୍ଟା ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="2023167225947895179">ପିନ୍କୁ ଅନୁମାନ କରିବା ସହଜ ହୋଇପାରେ</translation> <translation id="202352106777823113">ଡାଉନ୍ଲୋଡ୍ ଅଧିକ ସମୟ ନେଉଥିଲା ଏବଂ ନେଟ୍ୱାର୍କ ଦ୍ୱାରା ବନ୍ଦ କରାଯାଇଥିଲା।</translation> -<translation id="2024195579772565064">ସନ୍ଧାନ ଇଞ୍ଜିନକୁ ଡିଲିଟ କରନ୍ତୁ</translation> +<translation id="2024195579772565064">ସର୍ଚ୍ଚ ଇଞ୍ଜିନକୁ ଡିଲିଟ କରନ୍ତୁ</translation> <translation id="202500043506723828">EID</translation> <translation id="2025632980034333559"><ph name="APP_NAME" /> କ୍ରାସ୍ ହୋଇଯାଇଛି। ଏକ୍ସଟେନ୍ସନ୍କୁ ରିଲୋଡ୍ କରିବା ପାଇଁ ଏହି ବେଲୁନ୍ରେ କ୍ଲିକ୍ କରନ୍ତୁ।</translation> <translation id="2028449514182362831">ମୋସନ୍ ସେନ୍ସର୍ ଆବଶ୍ୟକ କରୁଥିବା ଫିଚରଗୁଡ଼ିକ କାମ କରିବ ନାହିଁ</translation> @@ -1571,7 +1570,7 @@ <translation id="2169062631698640254">ଯେକୌଣସି ମତେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="2173302385160625112">ଆପଣଙ୍କ ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଯାଞ୍ଚ କରନ୍ତୁ</translation> <translation id="2173801458090845390">ଏହି ଡିଭାଇସ୍ରେ ଅଧିଗ୍ରହଣ ID ଯୋଗ କରନ୍ତୁ</translation> -<translation id="2175384018164129879">ସନ୍ଧାନ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସନ୍ଧାନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="2175384018164129879">ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସର୍ଚ୍ଚକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="217576141146192373">ପ୍ରିଣ୍ଟର୍ ଯୋଗ କରିବାକୁ ଅକ୍ଷମ। ଦୟାକରି ଆପଣଙ୍କ ପ୍ରିଣ୍ଟର୍ର କନ୍ଫିଗ୍ରେସନ୍ ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="2175927920773552910">QR କୋଡ୍</translation> <translation id="2177306523871626993">ଟେକ୍ସଟ ଚିହ୍ନଟକରଣ ଫାଇଲଗୁଡ଼ିକୁ ଡାଉନଲୋଡ କରାଯାଉଛି… <ph name="PERCENT" />%</translation> @@ -2189,7 +2188,7 @@ <translation id="2635094637295383009">Twitter</translation> <translation id="2635276683026132559">ସାଇନ୍-ଇନ୍ ହେଉଛି</translation> <translation id="2636266464805306348">ୱିଣ୍ଡୋ ଟାଇଟେଲ</translation> -<translation id="2637313651144986786">ସନ୍ଧାନ ଟାବ...</translation> +<translation id="2637313651144986786">ସର୍ଚ୍ଚ ଟାବ...</translation> <translation id="2637400434494156704">ଭୁଲ ପିନ୍। ଆପଣଙ୍କର ଗୋଟିଏ ପ୍ରଚେଷ୍ଟା ବାକି ଅଛି।</translation> <translation id="2637594967780188166">କ୍ରାସ ରିପୋର୍ଟ ଏବଂ ଡାଏଗ୍ନୋଷ୍ଟିକ ଓ ବ୍ୟବହାର ଡାଟା ChromeOSକୁ ପଠାନ୍ତୁ</translation> <translation id="2638662041295312666">ସାଇନ୍-ଇନ୍ ଛବି</translation> @@ -2516,7 +2515,7 @@ <translation id="2876336351874743617">ଟିପଚିହ୍ନ 2</translation> <translation id="2876369937070532032">ଆପଣଙ୍କର ସୁରକ୍ଷା ବିପଦରେ ଥିବା ବେଳେ, Googleକୁ ଆପଣ ଯାଇଥିବା କିଛି ପୃଷ୍ଠାର URL ପଠାଏ</translation> <translation id="2876484123356705658">ସମୟ ରେଞ୍ଜ ବାଛନ୍ତୁ</translation> -<translation id="2876556152483133018">ସାଇଟ୍ ସନ୍ଧାନ</translation> +<translation id="2876556152483133018">ସାଇଟ ସର୍ଚ୍ଚ</translation> <translation id="2877467134191447552">ଆପଣ ୱେବସାଇଟ୍ ଏବଂ ଆପଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ଅତିରିକ୍ତ ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ଯୋଗ କରିପାରିବେ।</translation> <translation id="2878782256107578644">ସ୍କାନ୍ ଚାଲୁଛି, ବର୍ତ୍ତମାନ ଖୋଲିବେ କି?</translation> <translation id="2878889940310164513">ସେଲ୍ୟୁଲାର୍ ଯୋଗ କରନ୍ତୁ...</translation> @@ -2535,7 +2534,7 @@ <translation id="2889064240420137087">ଏହା ମାଧ୍ୟମରେ ଲିଙ୍କ୍ ଖୋଲନ୍ତୁ...</translation> <translation id="2890206081124517553">ସମଗ୍ର ଡିଭାଇସରେ ଆପଣଙ୍କ ଡେସ୍କଟପ ପୃଷ୍ଠପଟକୁ ମନେ ରଖନ୍ତୁ</translation> <translation id="2891464434568738544">ବର୍ତ୍ତମାନ କୌଣସି ସାଇଟ ଉପଲବ୍ଧ ନାହିଁ। ଏହି ତାଲିକାରେ ଯୋଗ କରିବାକୁ ଏକ ସାଇଟକୁ ଭିଜିଟ କରନ୍ତୁ।</translation> -<translation id="2891566119238851894">ସାଇଡ ପ୍ୟାନେଲରେ ସନ୍ଧାନ ଖୋଲନ୍ତୁ। ସାଇଡ ପ୍ୟାନେଲରେ ସନ୍ଧାନ ଖୋଲା ନାହିଁ।</translation> +<translation id="2891566119238851894">ସାଇଡ ପେନେଲରେ ସର୍ଚ୍ଚ ଖୋଲନ୍ତୁ। ସାଇଡ ପେନେଲରେ ସର୍ଚ୍ଚ ଖୋଲା ନାହିଁ।</translation> <translation id="2891922230654533301"><ph name="APP_NAME" />ରେ ସାଇନ୍ ଇନ୍ କରିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ବ୍ୟବହାର କରିବେ?</translation> <translation id="2893013536106749396">ଆପଣଙ୍କ ପାଇଁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଜିନିଷଗୁଡ଼ିକ ବିଷୟରେ ଆପଣଙ୍କୁ ଅପଡେଟ ରଖୁଥିବା କାର୍ଡଗୁଡ଼ିକୁ ବାଛନ୍ତୁ</translation> <translation id="2893168226686371498">ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍</translation> @@ -3495,7 +3494,7 @@ <translation id="3678156199662914018">ପରିବର୍ଦ୍ଧନ: <ph name="EXTENSION_NAME" /></translation> <translation id="3678188444105291936">ଏହି ୱିଣ୍ଡୋରେ ଆପଣ ଦେଖୁଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ ବ୍ରାଉଜର୍ ଇତିହାସରେ ଦେଖାଯିବ ନାହିଁ ଏବଂ ଆପଣ ସାଇନ୍ ଆଉଟ୍ କରିବା ପରେ କମ୍ପ୍ୟୁଟରରେ ସେଗୁଡ଼ିକ କୁକୀ ପରି ଅନ୍ୟ ଟ୍ରେସ୍ ଛାଡ଼ିବ ନାହିଁ। ଆପଣ ଡାଉନଲୋଡ୍ କରିଥିବା ଫାଇଲଗୁଡ଼ିକ କିମ୍ବା ତିଆରି କରିଥିବା ବୁକମାର୍କଗୁଡ଼ିକ ସଂରକ୍ଷିତ କରାଯାଇପାରିବ ନାହିଁ।</translation> <translation id="3679126865530709868">ବିଲ୍ଟ-ଇନ ଟଚପେଡ</translation> -<translation id="368019053277764111">ସାଇଡ ପ୍ୟାନେଲରେ ସନ୍ଧାନ ଖୋଲନ୍ତୁ</translation> +<translation id="368019053277764111">ସାଇଡ ପେନେଲରେ ସର୍ଚ୍ଚ ଖୋଲନ୍ତୁ</translation> <translation id="3680683624079082902">ଟେକ୍ସଟ୍-ଟୁ-ସ୍ପିଚ୍ ଭଏସ୍</translation> <translation id="3681311097828166361">ଆପଣଙ୍କର ମତାମତ ପାଇଁ ଧନ୍ୟବାଦ। ଆପଣ ବର୍ତ୍ତମାନ ଅଫ୍ଲାଇନ୍ ଅଛନ୍ତି, ଏବଂ ଆପଣଙ୍କ ରିପୋର୍ଟ ପରେ ପଠାଯିବ।</translation> <translation id="3681548574519135185">ଫୋକସ ରିଂ</translation> @@ -3905,7 +3904,6 @@ <translation id="3966072572894326936">ଅନ୍ୟ ଫୋଲ୍ଡର୍ ଚୟନ କରନ୍ତୁ...</translation> <translation id="3966094581547899417">ହଟସ୍ପଟର ବିବରଣୀ</translation> <translation id="3967822245660637423">ଡାଉନ୍ଲୋଡ୍ ଶେଷ ହୋଇଛି</translation> -<translation id="3967841595862839006">ଆପଣଙ୍କ ଭାଷା ଓ କୀବୋର୍ଡକୁ ବାଛନ୍ତୁ</translation> <translation id="3968739731834770921">କାନା</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">ଗଣନା କରାଯାଉଛି…</translation> @@ -4365,7 +4363,7 @@ <translation id="4341905082470253054">TPM ସ୍ଥିତି ଯାଞ୍ଚ କରାଯାଉଛି...</translation> <translation id="434198521554309404">ଦ୍ରୁତ। ସୁରକ୍ଷିତ। ସହଜ।</translation> <translation id="4342417854108207000">ଆପଣଙ୍କ ଡିଭାଇସରେ ଫାଇଲ କିମ୍ବା ଫୋଲ୍ଡରଗୁଡ଼ିକୁ ଏଡିଟ କରିବା ପାଇଁ ଅନୁମତି ଦିଆଯାଇଛି</translation> -<translation id="4343250402091037179">ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ସାଇଟ କିମ୍ବା Chromeର କିଛି ଅଂଶ ସନ୍ଧାନ କରିବାକୁ, ଠିକଣା ବାରରେ ଏହାର ସର୍ଟକଟ ଟାଇପ କରିବା ପରେ ଆପଣଙ୍କ ପସନ୍ଦର କୀବୋର୍ଡ ସର୍ଟକଟ ଟାଇପ କରନ୍ତୁ।</translation> +<translation id="4343250402091037179">ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ସାଇଟ କିମ୍ବା Chromeର କିଛି ଅଂଶ ସର୍ଚ୍ଚ କରିବାକୁ, ଠିକଣା ବାରରେ ଏହାର ସର୍ଟକଟ ଟାଇପ କରିବା ପରେ ଆପଣଙ୍କ ପସନ୍ଦର କୀବୋର୍ଡ ସର୍ଟକଟ ଟାଇପ କରନ୍ତୁ।</translation> <translation id="4345457680916430965"><ph name="APP" />ରେ &ଖୋଲନ୍ତୁ</translation> <translation id="4345587454538109430">କନ୍ଫିଗର୍ କରନ୍ତୁ...</translation> <translation id="4345732373643853732">ସର୍ଭର୍କୁ ଉପଯୋଗକର୍ତ୍ତାନାମ ଜଣା ନାହିଁ</translation> @@ -4587,7 +4585,6 @@ <translation id="4513872120116766993">ପୂର୍ବାନୁମାନ ଲିଖିତ ପରାମର୍ଶ</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">ସେବା ପାଇଁ Dell ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ। ଯଦି ଫ୍ୟାନ୍ କାମ କରୁ ନାହିଁ, ତେବେ ଡକ୍ ବନ୍ଦ ହୋଇଯିବ।</translation> -<translation id="4516008165284813420">ଆପଣଙ୍କ <ph name="DEVICE_TYPE" /> ଇଣ୍ଟରନେଟ ସହ କନେକ୍ଟ ଥିବା ସୁନିଶ୍ଚିତ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ। ଆପଣ ଅନ୍ୟ ଏକ ଡିଭାଇସରେ play.google.com/about/play-termsକୁ ମଧ୍ୟ ଭିଜିଟ କରିପାରିବେ।</translation> <translation id="4518840066030486079">Shift କୀ ମୋଡ ଷ୍ଟାଇଲ</translation> <translation id="4519331665958994620">ସାଇଟଗୁଡ଼ିକ ଆପଣଙ୍କ କ୍ୟାମେରା ବ୍ୟବହାର କରିବାକୁ ପଚାରିପାରିବ</translation> <translation id="4519605771716872386">ଫାଇଲ ସିଙ୍କ ଚାଲୁ କରାଯାଇଛି</translation> @@ -4794,7 +4791,7 @@ <translation id="4673785607287397025">କନେକ୍ଟ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଆପଣଙ୍କ Chromecast ଏବଂ କମ୍ପ୍ୟୁଟର ସମାନ ନେଟୱାର୍କରେ ଥିବା ସୁନିଶ୍ଚିତ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4675065861091108046"><ph name="ORIGIN" />ରେ ସମସ୍ତ ଏକ୍ସଟେନସନକୁ ଅନୁମତି ଦେବା ପାଇଁ ଆପଣ ପୂର୍ବରୁ ବାଛିଛନ୍ତି</translation> <translation id="467510802200863975">ପାସ୍ୱାର୍ଡ ମେଳ ହେଉ ନାହିଁ</translation> -<translation id="4675828034887792601">ସାଇଟଗୁଡ଼ିକୁ ସନ୍ଧାନ କରିବା ପାଇଁ ସର୍ଟକଟଗୁଡ଼ିକୁ ତିଆରି କରନ୍ତୁ ଏବଂ ଆପଣଙ୍କ ସନ୍ଧାନ ଇଞ୍ଜିନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="4675828034887792601">ସାଇଟଗୁଡ଼ିକୁ ସର୍ଚ୍ଚ କରିବା ପାଇଁ ସର୍ଟକଟଗୁଡ଼ିକୁ ତିଆରି କରନ୍ତୁ ଏବଂ ଆପଣଙ୍କ ସର୍ଚ୍ଚ ଇଞ୍ଜିନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="4676595058027112862">ଫୋନ୍ ହବ୍, ଅଧିକ ଜାଣନ୍ତୁ</translation> <translation id="4677772697204437347">GPU ମେମୋରୀ</translation> <translation id="467809019005607715">Google Slides</translation> @@ -5392,7 +5389,7 @@ <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> ପାଇଁ ଉନ୍ନତ ସେଟିଂସ୍</translation> <translation id="5154702632169343078">ବିଷୟ</translation> <translation id="5154917547274118687">ମେମୋରୀ</translation> -<translation id="5155327081870541046">ଆପଣ ସନ୍ଧାନ କରିବାକୁ ଚାହୁଁଥିବା ସାଇଟ ପାଇଁ ଠିକଣା ବାରରେ ସର୍ଟକଟ ଲେଖନ୍ତୁ ଯେପରି "@bookmarks"। ତା'ପରେ, ଆପଣଙ୍କ ପସନ୍ଦର କୀବୋର୍ଡ ସର୍ଟକଟକୁ ଦବାଇ ଆପଣଙ୍କ ସନ୍ଧାନ ଶବ୍ଦ ଲେଖନ୍ତୁ।</translation> +<translation id="5155327081870541046">ଆପଣ ସର୍ଚ୍ଚ କରିବାକୁ ଚାହୁଁଥିବା ସାଇଟ ପାଇଁ ଠିକଣା ବାରରେ ସର୍ଟକଟ ଲେଖନ୍ତୁ ଯେପରି "@bookmarks"। ତା'ପରେ, ଆପଣଙ୍କ ପସନ୍ଦର କୀବୋର୍ଡ ସର୍ଟକଟକୁ ଦବାଇ ଆପଣଙ୍କ ସର୍ଚ୍ଚ ଶବ୍ଦ ଲେଖନ୍ତୁ।</translation> <translation id="5156638757840305347">କର୍ସର ଦେଖାଗଲେ କିମ୍ବା ମୁଭ ହେଲେ ଏହା ହାଇଲାଇଟ ହୋଇଥାଏ</translation> <translation id="5157250307065481244">ସାଇଟ ବିବରଣୀ ଭ୍ୟୁ କରନ୍ତୁ</translation> <translation id="5157701529792771331">କେପସନଗୁଡ଼ିକୁ ସ୍ୱତଃ ଅନୁବାଦ କରେ</translation> @@ -6187,7 +6184,7 @@ <translation id="5799478978078236781"><ph name="DEVICE_TYPE" /> ଟିପ୍, ଅଫର୍ ଓ ଅପଡେଟଗୁଡ଼ିକ ପାଆନ୍ତୁ ଏବଂ ମତାମତ ସେୟାର୍ କରନ୍ତୁ।</translation> <translation id="5799508265798272974">Linux ଭର୍ଚୁଆଲ୍ ମେସିନ୍: <ph name="LINUX_VM_NAME" /></translation> <translation id="5800020978570554460">ଶେଷ ଡାଉନ୍ଲୋଡ୍ ପରେ ଗନ୍ତବ୍ୟ ଫାଇଲ୍କୁ ଖଣ୍ଡ ଖଣ୍ଡ କରି ଛୋଟ କରିଦିଆଯାଇଛି ବା କାଢ଼ି ଦିଆଯାଇଛି।</translation> -<translation id="5800351251499368110">ସାଇଡ ପ୍ୟାନେଲରେ ସନ୍ଧାନ ବନ୍ଦ କରନ୍ତୁ। ସାଇଡ ପ୍ୟାନେଲରେ ସନ୍ଧାନ ଖୋଲା ଅଛି।</translation> +<translation id="5800351251499368110">ସାଇଡ ପେନେଲରେ ସର୍ଚ୍ଚ ବନ୍ଦ କରନ୍ତୁ। ସାଇଡ ପେନେଲରେ ସର୍ଚ୍ଚ ଖୋଲା ଅଛି।</translation> <translation id="5800703268655655701">ଲାଇଟ କିମ୍ବା ଡାର୍କ ଥିମକୁ ଚୟନ କରନ୍ତୁ</translation> <translation id="5801051031414037185">ଫୋନ ସେଟ ଅପ କରନ୍ତୁ</translation> <translation id="5801568494490449797">ପସନ୍ଦ</translation> @@ -6587,7 +6584,7 @@ <translation id="6119008366402292080">କୌଣସି ପ୍ରିଣ୍ଟର ଉପଲବ୍ଧ ନାହିଁ</translation> <translation id="6119927814891883061">ଡିଭାଇସର ନାମ <ph name="DEVICE_NAME" /> ଦିଅନ୍ତୁ</translation> <translation id="6119972796024789243">ରଙ୍ଗ ସଂଶୋଧନ</translation> -<translation id="6120707837086723438">ଆପଣ ରେସିପିଗୁଡ଼ିକ ପାଇଁ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ସନ୍ଧାନ କାର୍ଯ୍ୟକଳାପ ଆଧାରରେ ପ୍ରସ୍ତାବିତ ରେସିପିଗୁଡ଼ିକୁ ଦେଖୁଛନ୍ତି। +<translation id="6120707837086723438">ଆପଣ ରେସିପିଗୁଡ଼ିକ ପାଇଁ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ସର୍ଚ୍ଚ କାର୍ଯ୍ୟକଳାପ ଆଧାରରେ ପ୍ରସ୍ତାବିତ ରେସିପିଗୁଡ଼ିକୁ ଦେଖୁଛନ୍ତି। <ph name="BREAK" /> <ph name="BREAK" /> ଆପଣ କାର୍ଡ ମେନୁରୁ ସେଟିଂସକୁ ପରିଚାଳନା କରିପାରିବେ କିମ୍ବା "Chromeକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ"ରେ ଅଧିକ ବିକଳ୍ପ ଦେଖିପାରିବେ।</translation> @@ -6709,7 +6706,7 @@ <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> - <ph name="INTERRUPT_REASON" />ରେ ସେଭ୍ କରିବାରେ ବିଫଳ ହୋଇଛି</translation> <translation id="6209838773933913227">କମ୍ପୋନେଟ୍ ଅପଡେଟ୍ ହେଉଛି</translation> <translation id="6209908325007204267">ଆପଣଙ୍କ ଡିଭାଇସରେ ଏକ Chrome ଏଣ୍ଟରପ୍ରାଇଜ୍ ଅପଗ୍ରେଡ୍ ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି, କିନ୍ତୁ ଆପଣଙ୍କ ଉପଯୋଗକର୍ତ୍ତାନାମ କୌଣସି ଏଣ୍ଟରପ୍ରାଇଜ୍ ଆକାଉଣ୍ଟ ସହ ସମ୍ବନ୍ଧିତ ନୁହେଁ। ଏକ ଦ୍ୱିତୀୟ ଡିଭାଇସରେ g.co/ChromeEnterpriseAccountରେ ଯାଇ, ଦୟାକରି ଏକ ଏଣ୍ଟରପ୍ରାଇଜ୍ ଆକାଉଣ୍ଟ ତିଆରି କରନ୍ତୁ।</translation> -<translation id="6210282067670792090">ସନ୍ଧାନ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସନ୍ଧାନ ପାଇଁ ଠିକଣା ବାରରେ ସର୍ଟକଟଗୁଡ଼ିକ ସହ ଏହି କୀବୋର୍ଡ ସର୍ଟକଟ ବ୍ୟବହାର କରନ୍ତୁ</translation> +<translation id="6210282067670792090">ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସର୍ଚ୍ଚ ପାଇଁ ଠିକଣା ବାରରେ ସର୍ଟକଟଗୁଡ଼ିକ ସହ ଏହି କୀବୋର୍ଡ ସର୍ଟକଟ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="621172521139737651">{COUNT,plural, =0{ସମସ୍ତ URLକୁ &ନୂଆ ଟାବ୍ ଗ୍ରୁପରେ ଖୋଲନ୍ତୁ}=1{&ନୂଆ ଟାବ୍ ଗ୍ରୁପରେ ଖୋଲନ୍ତୁ}other{ସମସ୍ତ ({COUNT})ଟି URLକୁ &ନୂଆ ଟାବ୍ ଗ୍ରୁପରେ ଖୋଲନ୍ତୁ}}</translation> <translation id="6212039847102026977">ଅତ୍ୟାଧୁନିକ ନେଟ୍ୱର୍କ ଗୁଣାବଳୀ ଦେଖାନ୍ତୁ</translation> <translation id="6212168817037875041">ଡିସ୍ପ୍ଲେ ବନ୍ଦ କରନ୍ତୁ</translation> @@ -7273,7 +7270,7 @@ <translation id="666731172850799929"><ph name="APP_NAME" />ରେ ଖୋଲନ୍ତୁ</translation> <translation id="6669195257625975787">ଆପଣ ଦେଖୁଥିବା ସାଇଟ ପରି ସମାନ ଢଙ୍ଗରେ ଡାଟାକୁ ବିଚାର କରାଯାଏ</translation> <translation id="6670142487971298264"><ph name="APP_NAME" /> ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ଅଛି</translation> -<translation id="6670767097276846646">କିଛି ଏକ୍ସଟେନସନ୍ Chromeରେ ସନ୍ଧାନ ଇଞ୍ଜିନଗୁଡ଼ିକ ଯୋଗ କରିପାରେ</translation> +<translation id="6670767097276846646">କିଛି ଏକ୍ସଟେନସନ Chromeରେ ସର୍ଚ୍ଚ ଇଞ୍ଜିନଗୁଡ଼ିକ ଯୋଗ କରିପାରେ</translation> <translation id="6670983860904543332">ସ୍ୱତଃ ଅପଡେଟ ଆପଣଙ୍କୁ ନବୀନତମ ଫିଚରଗୁଡ଼ିକ ପ୍ରଦାନ କରେ। ବର୍ତ୍ତମାନର ଅପଡେଟଗୁଡ଼ିକରୁ ହାଇଲାଇଟ୍ସ ଏକ୍ସପ୍ଲୋର କରନ୍ତୁ।</translation> <translation id="6671320560732140690">{COUNT,plural, =1{ଏକ ଠିକଣା}other{#ଟି ଠିକଣା}}</translation> <translation id="6671497123040790595"><ph name="MANAGER" /> ଦ୍ୱାରା ପରିଚାଳନା ସେଟ୍ ଅପ୍ କରାଯାଉଛି</translation> @@ -7680,7 +7677,7 @@ <translation id="6972754398087986839">ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="697312151395002334">ପପ୍-ଅପଗୁଡ଼ିକ ପଠାଇ ରିଡାଇରେକ୍ଟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାକୁ ଅନୁମତି ଦିଆଯାଇଛି</translation> <translation id="6973611239564315524">Debian 10 (Buster)ର ଏକ ଅପଗ୍ରେଡ୍ ଉପଲବ୍ଧ ଅଛି</translation> -<translation id="69739764870135975">ଯଦି Google ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ମଧ୍ୟ ହୋଇଥାଏ, ତେବେ ଆପଣ ଆହୁରି ଭଲ, ପ୍ରାସଙ୍ଗିକ ପରାମର୍ଶ ଦେଖିବେ</translation> +<translation id="69739764870135975">ଯଦି Google ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ମଧ୍ୟ ହୋଇଥାଏ, ତେବେ ଆପଣ ଆହୁରି ଭଲ, ପ୍ରାସଙ୍ଗିକ ପରାମର୍ଶ ଦେଖିବେ</translation> <translation id="697508444536771064">Linuxକୁ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="6978121630131642226">ସର୍ଚ୍ଚ ଇଞ୍ଜିନଗୁଡ଼ିକ</translation> <translation id="6978717888677691380">ଆପଣ ବ୍ଲକ କରିଥିବା ସାଇଟଗୁଡ଼ିକ</translation> @@ -7986,7 +7983,7 @@ <translation id="7231260028442989757">ଆପଣଙ୍କ ଫୋନର ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ, ଖାରଜ କରନ୍ତୁ ଏବଂ ପ୍ରତ୍ୟୁତ୍ତର ଦିଅନ୍ତୁ</translation> <translation id="7231347196745816203">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />କୁ ଅନଲକ କରିବା ପାଇଁ ଆପଣଙ୍କ ଫୋନ ବ୍ୟବହାର କରନ୍ତୁ।</translation> <translation id="7232750842195536390">ରିନେମ୍ ପ୍ରକ୍ରିୟା ବିଫଳ ହୋଇଛି</translation> -<translation id="723343421145275488"><ph name="VISUAL_SEARCH_PROVIDER" /> ମାଧ୍ୟମରେ ଇମେଜଗୁଡ଼ିକୁ ସନ୍ଧାନ କରନ୍ତୁ</translation> +<translation id="723343421145275488"><ph name="VISUAL_SEARCH_PROVIDER" /> ମାଧ୍ୟମରେ ଇମେଜଗୁଡ଼ିକୁ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="7234010996000898150">Linuxର ରିଷ୍ଟୋର୍ ବାତିଲ୍ ହେଉଛି</translation> <translation id="7235716375204803342">କାର୍ଯ୍ୟକଳାପଗୁଡ଼ିକୁ ଅଣାଯାଉଛି...</translation> <translation id="7235737137505019098">ଆପଣଙ୍କର ସୁରକ୍ଷା କୀ'ରେ ଆଉ ଅଧିକ ଆକାଉଣ୍ଟ ପାଇଁ ପର୍ଯ୍ୟାପ୍ତ ଖାଲି ସ୍ଥାନ ନାହିଁ।</translation> @@ -8139,7 +8136,7 @@ <translation id="7357271391997763660">ପାସୱାର୍ଡ ଯାଞ୍ଚ କରିବେ?</translation> <translation id="735745346212279324">VPN ବିଚ୍ଛିନ୍ନ ହୋଇଛି</translation> <translation id="7358324924540718595">ଆଜି ପାଇଁ ମେମୋରୀ ଲୁଚାଯାଇଛି</translation> -<translation id="7358338787722390626">ସାଇଡ ପ୍ୟାନେଲରେ ସନ୍ଧାନ ବନ୍ଦ କରନ୍ତୁ</translation> +<translation id="7358338787722390626">ସାଇଡ ପେନେଲରେ ସର୍ଚ୍ଚ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="735994578317267253">ଯେ କୌଣସି ChromeOS ଡିଭାଇସରେ ଆପଣଙ୍କ ଆପ୍ସ, ସେଟିଂସ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପାଆନ୍ତୁ</translation> <translation id="7360233684753165754"><ph name="PRINTER_NAME" />କୁ <ph name="PAGE_NUMBER" />ଟି ପୃଷ୍ଠା</translation> <translation id="7360257054721917104">ସେଭ କରାଯାଇଥିବା ଡେସ୍କ ଏବଂ ଟେମ୍ପଲେଟଗୁଡ଼ିକୁ ଦେଖିବା। ନାଭିଗେଟ କରିବା ପାଇଁ ଟାବକୁ ଦବାନ୍ତୁ।</translation> @@ -8184,7 +8181,7 @@ <translation id="7385854874724088939">ମୁଦ୍ରଣ କରିବାକୁ ଚେଷ୍ଟା କରିବା ସମୟରେ କିଛି ଭୂଲ ହେଉଛି । ଦୟାକରି ଆପଣଙ୍କର ପ୍ରିଣ୍ଟର୍ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁନଃ ଚେଷ୍ଟା କରନ୍ତୁ ।</translation> <translation id="7387107590792462040">ଇନଷ୍ଟଲେସନ ଚାଲିଥିବା ବେଳେ ଦୟାକରି ଅପେକ୍ଷା କରନ୍ତୁ</translation> <translation id="7387273928653486359">ଗ୍ରହଣଯୋଗ୍ୟ</translation> -<translation id="7387951778417998929">ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ବ୍ୟତୀତ ଅନ୍ୟ କୌଣସି ସନ୍ଧାନ ଇଞ୍ଜିନ ବ୍ୟବହାର କରିବାକୁ, ଠିକଣା ବାରରେ ଏହାର ସର୍ଟକଟ ଟାଇପ କରିବା ପରେ ଆପଣଙ୍କ ପସନ୍ଦର କୀବୋର୍ଡ ସର୍ଟକଟ ଟାଇପ କରନ୍ତୁ। ଆପଣ ଏଠାରେ ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ମଧ୍ୟ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> +<translation id="7387951778417998929">ଡିଫଲ୍ଟ ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ବ୍ୟତୀତ ଅନ୍ୟ କୌଣସି ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ବ୍ୟବହାର କରିବାକୁ, ଠିକଣା ବାରରେ ଏହାର ସର୍ଟକଟ ଟାଇପ କରିବା ପରେ ଆପଣଙ୍କ ପସନ୍ଦର କୀବୋର୍ଡ ସର୍ଟକଟ ଟାଇପ କରନ୍ତୁ। ଆପଣ ଏଠାରେ ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ମଧ୍ୟ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="7388209873137778229">କେବଳ ସମର୍ଥିତ ଡିଭାଇସଗୁଡ଼ିକ ଦେଖାଯାଇଛି।</translation> <translation id="7388615499319468910">ବିଜ୍ଞାପନଗୁଡ଼ିକ କିପରି ପରଫର୍ମ କରେ ତାହା ସାଇଟଗୁଡ଼ିକ ଏବଂ ବିଜ୍ଞାପନଦାତାମାନେ ବୁଝିପାରିବେ। ଏହି ସେଟିଂ ବନ୍ଦ ଅଛି।</translation> <translation id="738903649531469042">ପଢ଼ିବା ତାଲିକାରେ ଟାବ୍ ଯୋଗ କରନ୍ତୁ</translation> @@ -8452,7 +8449,7 @@ <translation id="7595453277607160340">Android ଆପ୍ସ ବ୍ୟବହାର କରିବା ଏବଂ ଆପଣଙ୍କର <ph name="DEVICE_TYPE" /> ସଠିକ୍ ଭାବେ କାର୍ଯ୍ୟ ଜାରି ରଖିବା, ଏଥିପାଇଁ ପୁଣିଥରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ ଏବଂ ଅପ୍ଡେଟ୍ କରନ୍ତୁ।</translation> <translation id="7595547011743502844"><ph name="ERROR" /> (ତ୍ରୁଟି କୋଡ୍ <ph name="ERROR_CODE" />)।</translation> <translation id="7599527631045201165">ଡିଭାଇସ୍ର ନାମ ବହୁତ ଲମ୍ବା ଅଟେ ପୁଣି ଚେଷ୍ଟା କରିବାକୁ ଏକ ଛୋଟ ନାମଟିଏ ଲେଖନ୍ତୁ।</translation> -<translation id="7600054753482800821">ସନ୍ଧାନ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସନ୍ଧାନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="7600054753482800821">ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସର୍ଚ୍ଚକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> ଆଦୌ ଅନୁବାଦ କରନ୍ତୁ ନାହିଁ</translation> <translation id="760197030861754408">ସଂଯୋଗ କରିବାକୁ <ph name="LANDING_PAGE" />କୁ ଯାଆନ୍ତୁ</translation> <translation id="7602079150116086782">ଅନ୍ୟ ଡିଭାଇସ୍ଗୁଡ଼ିକରୁ କୌଣସି ଟାବ୍ ନାହିଁ</translation> @@ -9086,7 +9083,7 @@ <translation id="8054609631325628928">ସେବାକୁ ସକ୍ରିୟ କରିବାରେ ସାହାଯ୍ୟ କରିବା ପାଇଁ ଏହି ନମ୍ବରଗୁଡ଼ିକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ</translation> <translation id="8054883179223321715">ନିର୍ଦ୍ଦିଷ୍ଟ ଭିଡିଓ ସାଇଟଗୁଡ଼ିକ ପାଇଁ ଉପଲବ୍ଧ</translation> <translation id="8054921503121346576">USB କୀବୋର୍ଡ ସଂଯୁକ୍ତ କରାଗଲା</translation> -<translation id="8057414620575339583">ସାଇଡ ସନ୍ଧାନ</translation> +<translation id="8057414620575339583">ସାଇଡ ସର୍ଚ୍ଚ</translation> <translation id="8058655154417507695">ମିଆଦ ଶେଷ ହେଉଥିବା ବର୍ଷ</translation> <translation id="8058986560951482265">ଜର୍କି</translation> <translation id="8059417245945632445">&ଡିଭାଇସ୍ ଯାଞ୍ଚ କରନ୍ତୁ</translation> @@ -9606,7 +9603,7 @@ <translation id="8459333762072051247">ସାଇନ ଇନର ସ୍ଥିତି</translation> <translation id="8460448946170646641">ମୁଖ୍ୟ ଗୋପନୀୟତା ଏବଂ ସୁରକ୍ଷା ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକର ସମୀକ୍ଷା କରନ୍ତୁ</translation> <translation id="8460490661223303637">ମେମୋରୀ ସେଭ୍ କରିବା ପାଇଁ, Chrome କିଛି ବିଷୟବସ୍ତୁକୁ କାଢ଼ି ଦେଇଛି</translation> -<translation id="8460932807646981183">ସନ୍ଧାନ ଇଞ୍ଜିନ୍ ଏବଂ ସାଇଟ୍ ସନ୍ଧାନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="8460932807646981183">ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସର୍ଚ୍ଚକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="84613761564611563">ନେଟ୍ୱର୍କ କନ୍ଫିଗର୍ UI ଅନୁରୋଧ କରାଗଲା, ଦୟାକରି, ଅପେକ୍ଷା କରନ୍ତୁ...</translation> <translation id="8461914792118322307">ପ୍ରକ୍ସି</translation> <translation id="8461973047386722744">କୌଣସି ପାସୱାର୍ଡ ମିଳିଲା ନାହିଁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 52b7877..a9af1b0 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -344,6 +344,7 @@ <translation id="1251578593170406502">ਮੋਬਾਈਲ ਡਾਟਾ ਨੈੱਟਵਰਕਾਂ ਲਈ ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="125220115284141797">ਪੂਰਵ-ਨਿਰਧਾਰਤ</translation> <translation id="1252219782845132919">ਗਰੁੱਪ ਲੁਕਾਓ</translation> +<translation id="1252714168533640068">ਗਰੁੱਪ ਨੂੰ ਮੁੜ-ਖੋਲ੍ਹਣ ਲਈ, ਗਰੁੱਪ ਦੇ ਨਾਮ 'ਤੇ ਕਲਿੱਕ ਕਰੋ</translation> <translation id="1252987234827889034">ਪ੍ਰੋਫਾਈਲ ਗੜਬੜ ਵਾਪਰ ਗਈ</translation> <translation id="1253664522045778676">ਕਿਸੇ ਨਤੀਜੇ 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਪੰਨਾ ਤੁਹਾਡੀ ਮੌਜੂਦਾ ਟੈਬ 'ਤੇ ਖੁੱਲ੍ਹੇਗਾ</translation> <translation id="1254593899333212300">ਸਿੱਧਾ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ</translation> @@ -625,6 +626,7 @@ <translation id="1476347941828409626">Chrome ਪ੍ਰੋਫਾਈਲਾਂ ਦਾ &ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="1476607407192946488">&ਭਾਸ਼ਾ ਸੈਟਿੰਗਾਂ</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਸਮਾਰਟ ਕਾਰਡ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।</translation> +<translation id="1477645000789043442">ਤੁਹਾਡੀਆਂ ਖੁੱਲ੍ਹੀਆਂ ਟੈਬਾਂ ਦੇ ਆਧਾਰ 'ਤੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਟੈਬ ਗਰੁੱਪ ਬਣਾਉਂਦਾ ਹੈ। ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਟੈਬ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਮਿਲਦੀਆਂ-ਜੁਲਦੀਆਂ ਟੈਬਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="1477654881618305065">ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਨੂੰ ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦੀ। ਜੇ ਤੁਹਾਨੂੰ ਮਦਦ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।</translation> <translation id="1478340334823509079">ਵੇਰਵੇ: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">ਸਥਾਪਨਾ ਚਾਲੂ ਨਹੀਂ ਕੀਤੀ ਹੋਈ ਹੈ</translation> @@ -683,7 +685,6 @@ <translation id="1521933835545997395">Android ਫ਼ੋਨ ਨਾਲ ਕਨੈਕਟ ਹੈ</translation> <translation id="1523279371236772909">ਪਿਛਲੇ ਮਹੀਨੇ ਦੇਖੀ ਗਈ</translation> <translation id="1523978563989812243">ਲਿਖਤ-ਤੋਂ-ਬੋਲੀ ਇੰਜਣ</translation> -<translation id="1524430321211440688">ਕੀ-ਬੋਰਡ</translation> <translation id="1524563461097350801">ਨਹੀਂ, ਧੰਨਵਾਦ</translation> <translation id="1525740877599838384">ਟਿਕਾਣੇ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਸਿਰਫ਼ ਵਾਈ-ਫਾਈ ਵਰਤੋ</translation> <translation id="152629053603783244">Linux ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</translation> @@ -882,6 +883,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">ਟਿਕਾਣੇ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਵਾਈ‑ਫਾਈ ਜਾਂ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵਰਤੋ</translation> <translation id="164936512206786300">ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਦਾ ਜੋੜਾਬੱਧ ਹਟਾਓ</translation> +<translation id="1650407365859096313">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹਦਾ ਦਾ, ਇਜਾਜ਼ਤ <ph name="PERMISSION_STATE" /> ਹੈ</translation> <translation id="1650801028905250434">'ਮੇਰੀ ਡਰਾਈਵ' ਵਿੱਚ ਮੌਜੂਦ ਤੁਹਾਡੀਆਂ ਫ਼ਾਈਲਾਂ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤੁਹਾਡੇ Chromebook ਨਾਲ ਸਿੰਕ ਹੋ ਜਾਣਗੀਆਂ, ਤਾਂ ਜੋ ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਤੱਕ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਦੇ ਬਿਨਾਂ ਪਹੁੰਚ ਕਰ ਸਕੋ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ > Files ਵਿੱਚ ਜਾ ਕੇ ਕਦੇ ਵੀ ਇਸਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="1651008383952180276">ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੱਕੋ ਪਾਸਫਰੇਜ਼ ਦੋ ਵਾਰ ਦਾਖਲ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ</translation> <translation id="1651609627703324721">ਇਹ ਟੈਬ ਕਿਸੇ ਹੈੱਡਸੈੱਟ ਵਿੱਚ VR ਸਮੱਗਰੀ ਨੂੰ ਪੇਸ਼ ਕਰ ਰਹੀ ਹੈ</translation> @@ -1126,6 +1128,7 @@ <translation id="1828901632669367785">ਸਿਸਟਮ ਵਿੰਡੋ ਵਰਤਦੇ ਹੋਏ ਪ੍ਰਿੰਟ ਕਰੋ...</translation> <translation id="1829129547161959350">ਪੈਂਗਵਿਨ</translation> <translation id="1829192082282182671">ਜ਼ੂਮ &ਘਟਾਓ</translation> +<translation id="182973053761690772">ਸੂਰਜ ਡੁੱਬਣ ਦੇ ਸਮੇਂ 'ਤੇ ਆਧਾਰਿਤ ਸਮਾਂ-ਸੂਚੀ</translation> <translation id="1830550083491357902">ਸਾਈਨ ਇਨ ਨਹੀਂ ਕੀਤਾ</translation> <translation id="1831848493690504725">ਅਸੀਂ ਕਨੈਕਟ ਕੀਤੇ ਨੈੱਟਵਰਕ ਰਾਹੀਂ Google ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੇ। ਕੋਈ ਵੱਖਰਾ ਨੈੱਟਵਰਕ ਚੁਣ ਤੇ ਜਾਂ ਆਪਣੀਆਂ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਜਾਂ ਪ੍ਰੌਕਸੀ ਸੈਟਿੰਗਾਂ (ਜੇ ਤੁਸੀਂ ਪ੍ਰੌਕਸੀ ਵਰਤ ਰਹੇ ਹੋ) ਦੀ ਜਾਂਚ ਕਰ ਕੇ ਦੇਖੋ।</translation> <translation id="1832459821645506983">ਹਾਂ, ਮੈਂ ਸਹਿਮਤ ਹਾਂ</translation> @@ -1183,6 +1186,7 @@ <translation id="1871615898038944731">ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> ਅੱਪ ਟੂ ਡੇਟ ਹੈ</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> ਲਈ ਇਜਾਜ਼ਤਾਂ ਦੀ ਦੁਬਾਰਾ ਆਗਿਆ ਦਿਓ</translation> <translation id="1874248162548993294">ਕੋਈ ਵੀ ਵਿਗਿਆਪਨ ਦਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> +<translation id="1874794096607967241">ਕੈਮਰਾ ਇਜਾਜ਼ਤ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਦੇ ਨਾਲ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿਓ</translation> <translation id="1874874185178737347">ਟੈਬਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ਟੈਬ ਨੂੰ ਕਿਸੇ ਹੋਰ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ}one{ਟੈਬ ਨੂੰ ਕਿਸੇ ਹੋਰ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ}other{ਟੈਬਾਂ ਨੂੰ ਕਿਸੇ ਹੋਰ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ}}</translation> <translation id="1875387611427697908">ਇਸਨੂੰ ਸਿਰਫ਼ <ph name="CHROME_WEB_STORE" /> ਤੋੋਂ ਹੀ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</translation> @@ -1222,6 +1226,7 @@ <translation id="1901303067676059328">&ਸਾਰੇ ਚੁਣੋ</translation> <translation id="1903542130902305074">ਸੈੱਟਅੱਪ ਕਰੋ</translation> <translation id="1904580727789512086">ਉਹ URL ਤੁਹਾਡੇ Google ਖਾਤੇ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤੇ ਜਾਂਦੇ ਹਨ, ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ ਗਏ ਹੋ</translation> +<translation id="1904603806662441960">Chrome ਵਿੱਚ ਸਾਈਟ ਕੈਮਰਾ ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="1905375423839394163">Chromebook ਡੀਵਾਈਸ ਦਾ ਨਾਮ</translation> <translation id="1906181697255754968">ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਤੁਹਾਡੇ ਕੰਮ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਰੱਖਿਅਤ ਕਰਨ ਜਿਹੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਈ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿਚਲੀਆਂ ਫ਼ਾਈਲਾਂ ਅਤੇ ਫੋਲਡਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਦੀਆਂ ਹਨ</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> 'ਤੇ ਹੋਰ ਐਕਸਟੈਂਸ਼ਨਾਂ ਅਤੇ ਥੀਮ ਖੋਜੋ</translation> @@ -1362,6 +1367,7 @@ <translation id="200928901437634269">ਆਪਣੇ ਬੱਚੇ ਦੇ Google ਖਾਤੇ ਜਾਂ ਸਕੂਲ ਖਾਤੇ ਨੂੰ ਵਰਤੋ। ਤੁਸੀਂ ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ ਵੀ ਸੈੱਟ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="2009590708342941694">ਇਮੋਜੀ ਟੂਲ</translation> <translation id="2010501376126504057">ਅਨੁਰੂਪ ਡੀਵਾਈਸ</translation> +<translation id="201217432804812273">"ਗਰੁੱਪ ਨੂੰ ਰੱਖਿਅਤ ਕਰੋ" ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="2012935757369720523">ਫ਼ਾਈਲ ਨੂੰ ਮਿਟਾਓ</translation> <translation id="2013550551806600826">ਇਸਨੂੰ ਅਜ਼ਮਾਓ। ਸੈਟਿੰਗ ਨੂੰ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ, ਫਿਰ ਟੈਸਟ ਖੇਤਰ ਵਿੱਚ ਆਪਣੇ ਟੱਚਪੈਡ 'ਤੇ ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਸਕ੍ਰੋਲ ਕਰੋ। ਤੁਸੀਂ ਇਸਨੂੰ ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ > ਡੀਵਾਈਸ > ਮਾਊਸ ਅਤੇ ਟੱਚਪੈਡ 'ਤੇ ਵੀ ਲੱਭ ਸਕਦੇ ਹੋ।</translation> <translation id="2015232545623037616">PC ਅਤੇ Chromecast ਇੱਕੋ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ 'ਤੇ ਹਨ</translation> @@ -1785,6 +1791,7 @@ <translation id="2314165183524574721">ਮੌਜੂਦਾ ਦਿਖਣਯੋਗਤਾ ਸੈਟਿੰਗ 'ਲੁਕੀ ਹੋਈ' 'ਤੇ ਸੈੱਟ ਹੈ</translation> <translation id="2314774579020744484">ਪੰਨਿਆਂ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਵੇਲੇ ਵਰਤੀ ਜਾਂਦੀ ਭਾਸ਼ਾ</translation> <translation id="2316129865977710310">ਨਹੀਂ ਧੰਨਵਾਦ</translation> +<translation id="2316433409811863464">ਐਪ ਸਟ੍ਰੀਮਿੰਗ</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% ਹੋ ਗਿਆ</translation> <translation id="2318143611928805047">ਪੇਪਰ ਦਾ ਆਕਾਰ</translation> <translation id="2318817390901984578">Android ਐਪਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਆਪਣੀ <ph name="DEVICE_TYPE" /> ਨੂੰ ਚਾਰਜ ਅਤੇ ਅੱਪਡੇਟ ਕਰੋ।</translation> @@ -1971,6 +1978,7 @@ <translation id="2454206500483040640">ਵੰਡੀਆਂ ਗਈਆਂ</translation> <translation id="2454247629720664989">ਪ੍ਰਮੁੱਖ-ਸ਼ਬਦ</translation> <translation id="2454524890947537054">ਕੀ ਵੈੱਬ ਬੇਨਤੀ ਨੂੰ ਮਨਜ਼ੂਰੀ ਦੇਣੀ ਹੈ?</translation> +<translation id="2454913962395846391">ਸਵੈਚਲਿਤ ਸਮਾਂ ਖੇਤਰ</translation> <translation id="245650153866130664">ਟਿਕਟ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਰਿਫ੍ਰੈਸ਼ ਕਰਨ ਲਈ, “ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ” ਦੀ ਜਾਂਚ ਕਰੋ। ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਸਿਰਫ਼ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="2456794251167091176">ਆਯਾਤ ਕਰਨਾ ਪੂਰਾ ਹੋਇਆ</translation> <translation id="2456827790665612305">ਸਾਈਟ ਦਾ ਅਨੁਸਰਣ ਕਰਨਾ ਬੰਦ ਕਰੋ</translation> @@ -2930,6 +2938,7 @@ <translation id="3202499879214571401"><ph name="DEVICE_NAME" /> 'ਤੇ ਸਕ੍ਰੀਨ ਨੂੰ ਕਾਸਟ ਕਰਨ ਤੋਂ ਰੋਕੋ</translation> <translation id="3202578601642193415">ਵੱਧ ਨਵਾਂ</translation> <translation id="3204648577100496185">ਸ਼ਾਇਦ ਇਸ ਐਪ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟੇ ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇ</translation> +<translation id="3205140624385017621">ਕੈਮਰਾ ਇਜਾਜ਼ਤਾਂ ਵਾਲੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ। ਕੈਮਰਾ ਵਰਤਣ ਲਈ, ਤੁਹਾਨੂੰ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਜਾਂ ਪੰਨੇ ਨੂੰ ਰਿਫ੍ਰੈਸ਼ ਕਰਨ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ।</translation> <translation id="3207344462385471911">ਤੁਹਾਨੂੰ ਆਪਣੀ ਹਾਲੀਆ ਸਰਗਰਮੀ ਦੇ ਆਧਾਰ 'ਤੇ ਸੁਝਾਈਆਂ ਗਈਆਂ ਖੋਜਾਂ ਅਤੇ ਖਰੀਦਦਾਰੀ ਸੰਬੰਧੀ ਛੋਟਾਂ ਦਿਖਾਈ ਦੇ ਰਹੀਆਂ ਹਨ ਜੋ ਤੁਹਾਨੂੰ ਦਿਲਚਸਪ ਲੱਗ ਸਕਦੀਆਂ ਹਨ। <ph name="BREAK" /> <ph name="BREAK" /> @@ -3207,6 +3216,7 @@ <translation id="3434272557872943250">ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। families.google.com 'ਤੇ ਇਹਨਾਂ ਸੈਟਿੰਗਾਂ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨ ਦੇ ਤਰੀਕੇ ਬਾਰੇ ਹੋਰ ਜਾਣੋ।</translation> <translation id="3434475275396485144">ਇਸ ਸੈਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="3434512374684753970">ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ</translation> +<translation id="3435381311628654443">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਇਜਾਜ਼ਤ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਦੇ ਨਾਲ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿਓ</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" ਵੱਲੋਂ ਤੁਹਾਡੇ <ph name="CODE_TYPE" /> ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="3435738964857648380">ਸੁਰੱਖਿਆ</translation> <translation id="343578350365773421">ਕਾਗਜ਼ ਖਤਮ ਹੋਏ</translation> @@ -3284,6 +3294,7 @@ <translation id="3491669675709357988">ਤੁਹਾਡੇ ਬੱਚੇ ਦੇ ਖਾਤੇ ਦਾ Family Link ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ ਲਈ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ। ਇੱਕ ਵਾਰ ਸੈੱਟਅੱਪ ਪੂਰਾ ਕਰਨ ਤੋਂ ਬਾਅਦ ਤੁਸੀਂ ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕਰ ਸਕਦੇ ਹੋ। ਤੁਸੀਂ Explore ਐਪ ਵਿੱਚ ਮਾਪਿਆਂ ਦੇ ਕੰਟਰੋਲ ਬਾਰੇ ਜਾਣਕਾਰੀ ਲੱਭ ਸਕਦੇ ਹੋ।</translation> <translation id="3491678231052507920">ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਤੁਹਾਡੇ ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ ਡੀਵਾਈਸਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਵਰਤਦੀਆਂ ਹਨ ਤਾਂ ਜੋ ਤੁਸੀਂ VR ਸੈਸ਼ਨਾਂ ਵਿੱਚ ਦਾਖਲ ਹੋ ਸਕੋ</translation> <translation id="3493043608231401654">ਟੈਬ ਗਰੁੱਪ ਵਿੱਚੋਂ <ph name="TAB_TITLE" /> ਨੂੰ ਹਟਾਓ</translation> +<translation id="3493463599276143766">ਕਿਸੇ ਵੀ ਵੈੱਬਸਾਈਟ ਨੂੰ ਤੁਹਾਡੇ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ</translation> <translation id="3493486281776271508">ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਲੋੜੀਂਦਾ ਹੈ</translation> <translation id="3493881266323043047">ਪ੍ਰਮਾਣਿਕਤਾ</translation> <translation id="3495496470825196617">ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੌਰਾਨ ਸਲੀਪ ਮੋਡ 'ਤੇ ਜਾਓ</translation> @@ -3602,6 +3613,7 @@ <translation id="3733296813637058299">ਅਸੀਂ ਤੁਹਾਡੇ ਲਈ ਉਹ ਐਪਾਂ ਸਥਾਪਤ ਕਰਾਂਗੇ। ਤੁਸੀਂ Play Store ਵਿੱਚ ਆਪਣੇ <ph name="DEVICE_TYPE" /> ਲਈ ਹੋਰ ਐਪਾਂ ਲੱਭ ਸਕਦੇ ਹੋ।</translation> <translation id="3735039640698208086">ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਚਲਾਉਣ ਦੌਰਾਨ...</translation> <translation id="3735740477244556633">ਇਸ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> +<translation id="3735827758948958091">ਮੀਟਰਬੱਧ ਕਨੈਕਸ਼ਨ 'ਤੇ ਹੋਣ ਦੌਰਾਨ <ph name="FILE_NAMES" /> ਨੂੰ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> ਡਾਟਾ 24 ਘੰਟਿਆਂ ਦੇ ਅੰਦਰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">ਕੀ <ph name="APPLICATION" /> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?</translation> @@ -3870,6 +3882,7 @@ <translation id="3925573269917483990">ਕੈਮਰਾ:</translation> <translation id="3925926055063465902">ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਮੌਜੂਦ ਹੋਰ ਵਰਤੋਂਕਾਰ ਵੀ ਇਸ ਨੈੱਟਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਨ</translation> <translation id="3926002189479431949">'ਸਮਾਰਟ ਲਾਕ' ਫ਼ੋਨ ਬਦਲਿਆ</translation> +<translation id="3926410220776569451">ਕੈਮਰਾ ਪਹੁੰਚ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="3927932062596804919">ਅਸਵੀਕਾਰ ਕਰੋ</translation> <translation id="3928570707778085600">ਕੀ ਤਬਦੀਲੀਆਂ ਨੂੰ <ph name="FILE_OR_FOLDER_NAME" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?</translation> <translation id="3928659086758780856">ਸਿਆਹੀ ਘੱਟ ਹੈ</translation> @@ -3925,7 +3938,6 @@ <translation id="3966072572894326936">ਦੂਜਾ ਫੋਲਡਰ ਚੁਣੋ...</translation> <translation id="3966094581547899417">ਹੌਟਸਪੌਟ ਦੇ ਵੇਰਵੇ</translation> <translation id="3967822245660637423">ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ</translation> -<translation id="3967841595862839006">ਆਪਣੀ ਭਾਸ਼ਾ ਅਤੇ ਕੀ-ਬੋਰਡ ਚੁਣੋ</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ਆਈ.ਡੀ.</translation> <translation id="397105322502079400">ਅਨੁਮਾਨ ਲਗਾ ਰਿਹਾ ਹੈ...</translation> @@ -4065,6 +4077,7 @@ <translation id="4078738236287221428">ਆਕਰਮਣਸ਼ੀਲ</translation> <translation id="4078903002989614318">ਕ੍ਰਮ-ਬੱਧ ਕਰਨ ਅਤੇ ਸੂਚੀ ਸੰਬੰਧੀ ਵਿਕਲਪ</translation> <translation id="4079140982534148664">ਵਿਸਤ੍ਰਿਤ ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਵਰਤੋ</translation> +<translation id="4082333918978320301">ਕਿਸੇ ਵੀ ਵੈੱਬਸਾਈਟ ਨੂੰ ਤੁਹਾਡੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ</translation> <translation id="4084582735848141214">{COUNT,plural, =1{1 ਸਾਈਟ ਨੂੰ ਆਗਿਆ ਦਿੱਤੀ ਗਈ}one{# ਸਾਈਟ ਨੂੰ ਆਗਿਆ ਦਿੱਤੀ ਗਈ}other{# ਸਾਈਟਾਂ ਨੂੰ ਆਗਿਆ ਦਿੱਤੀ ਗਈ}}</translation> <translation id="4084682180776658562">ਬੁੱਕਮਾਰਕ</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> ਨੂੰ ਬੰਦ ਕਰੋ</translation> @@ -4214,6 +4227,7 @@ <translation id="4201546031411513170">ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਹਮੇਸ਼ਾਂ ਇਹ ਚੁਣ ਸਕਦੇ ਹੋ ਕਿ ਕਿਸਦਾ ਸਿੰਕ ਕਰਨਾ ਹੈ।</translation> <translation id="4203065553461038553">ਫ਼ਾਈਲ ਦਾ ਨਾਮ ਜਾਂ ਟਿਕਾਣਾ ਬਹੁਤ ਵੱਡਾ ਹੈ</translation> <translation id="4203769790323223880">ਕੈਮਰੇ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> +<translation id="4204415812590935863">ਫ਼ਿਲਹਾਲ ਥੀਮ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਦਾ।</translation> <translation id="4205157409548006256">Linux ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਦੌਰਾਨ ਗੜਬੜ ਹੋਈ।</translation> <translation id="4206144641569145248">ਏਲੀਅਨ</translation> <translation id="4206323443866416204">ਵਿਚਾਰ ਰਿਪੋਰਟ</translation> @@ -4555,6 +4569,7 @@ <translation id="447252321002412580">Chrome ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ</translation> <translation id="4472533928615930332"><ph name="STYLE" /> ਸਟਾਈਲ ਵਿੱਚ <ph name="SUBJECT" /> ਦਾ ਬਣਾਇਆ ਗਿਆ ਚਿੱਤਰ <ph name="INDEX" /></translation> <translation id="4472575034687746823">ਸ਼ੁਰੂਆਤ ਕਰੋ</translation> +<translation id="4473559657152613417">ਟੈਬ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ ਅਤੇ "ਨਵੇਂ ਗਰੁੱਪ ਵਿੱਚ ਟੈਬ ਸ਼ਾਮਲ ਕਰੋ" ਨੂੰ ਚੁਣੋ</translation> <translation id="4473996011558324141">ਅੰਦਾਜ਼ਨ ਸਮਾਂ</translation> <translation id="4474155171896946103">ਸਾਰੀਆਂ ਟੈਬਾਂ ਬੁੱਕਮਾਰਕ ਕਰੋ...</translation> <translation id="4475552974751346499">ਡਾਊਨਲੋਡਾਂ ਖੋਜੋ</translation> @@ -4607,7 +4622,6 @@ <translation id="4513872120116766993">ਲਿਖਣ ਵੇਲੇ ਸ਼ਬਦਾਂ ਦਾ ਪੂਰਵ-ਅਨੁਮਾਨ</translation> <translation id="4513946894732546136">ਵਿਚਾਰ</translation> <translation id="4515872537870654449">ਸੇਵਾ ਲਈ Dell ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਇਹ ਡੌਕ, ਪੱਖੇ ਦੇ ਕੰਮ ਨਾ ਕਰਨ 'ਤੇ ਬੰਦ ਹੋ ਜਾਵੇਗਾ।</translation> -<translation id="4516008165284813420">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡਾ <ph name="DEVICE_TYPE" /> ਇੰਟਰਨੈੱਟ ਨਾਲ ਹੋਵੇ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ play.google.com/about/play-terms 'ਤੇ ਵੀ ਜਾ ਸਕਦੇ ਹੋ।</translation> <translation id="4518840066030486079">Shift ਕੁੰਜੀ ਮੋਡ ਸਟਾਈਲ</translation> <translation id="4519331665958994620">ਸਾਈਟਾਂ ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤਣ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="4519605771716872386">ਫ਼ਾਈਲ ਸਿੰਕ ਚਾਲੂ ਕੀਤਾ ਗਿਆ</translation> @@ -4651,6 +4665,7 @@ <translation id="4547672827276975204">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਸੈੱਟ ਕਰੋ</translation> <translation id="4548858987594081919">ਤੁਹਾਡੀ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਵਿੱਚ Google Password Manager ਦੀ ਮਦਦ ਕਰਨ ਲਈ, ਇਸ ਸਾਈਟ ਵਾਸਤੇ ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="4549791035683739768">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਵਿੱਚ ਕੋਈ ਵੀ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation> +<translation id="4550737096585299960">ਕਿਰਪਾ ਕਰਕੇ ਕੁਝ ਮਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="4550926046134589611">ਕੁਝ ਸਮਰਥਿਤ ਲਿੰਕ ਹਾਲੇ ਵੀ <ph name="APP_NAME" /> ਵਿੱਚ ਖੁੱਲ੍ਹਣਗੇ।</translation> <translation id="4551379727767354516">AI ਨਾਲ ਬਣਾਏ ਗਏ ਤੁਹਾਡੇ ਹਾਲੀਆ ਥੀਮ</translation> <translation id="4551763574344810652">ਅਣਕੀਤਾ ਕਰਨ ਲਈ <ph name="MODIFIER_KEY_DESCRIPTION" /> ਨੂੰ ਦਬਾਓ</translation> @@ -5275,6 +5290,7 @@ <translation id="5051461727068120271">ਗੈਰ-ਪੁਸ਼ਟੀਕਿਰਤ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ</translation> <translation id="5051836348807686060">ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਦੀ ਸੁਵਿਧਾ ਤੁਹਾਡੇ ਵੱਲੋਂ ਚੁਣੀਆਂ ਭਾਸ਼ਾਵਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation> <translation id="5052499409147950210">ਸਾਈਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> +<translation id="5052853071318006357">ਟੈਬ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ ਅਤੇ "ਨਵੇਂ ਗਰੁੱਪ ਵਿੱਚ ਟੈਬ ਸ਼ਾਮਲ ਕਰੋ" ਨੂੰ ਚੁਣੋ</translation> <translation id="5053233576223592551">ਵਰਤੋਂਕਾਰ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="505347685865235222">ਬੇਨਾਮ ਗਰੁੱਪ - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />Chrome ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ<ph name="END_LINK" /> ਵਿੱਚ ਕਾਰਡਾਂ ਦੇ ਸਾਰੇ ਵਿਕਲਪ ਦੇਖੋ</translation> @@ -5311,6 +5327,7 @@ <translation id="5078638979202084724">ਸਾਰੀਆਂ ਟੈਬਾਂ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ</translation> <translation id="5078796286268621944">ਗ਼ਲਤ PIN</translation> <translation id="5079010647467150187">ਅੰਦਰ-ਮੌਜੂਦ VPN ਸ਼ਾਮਲ ਕਰੋ...</translation> +<translation id="5079460277417557557">ਤੁਸੀਂ ਹੁਣ ਆਪਣੇ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਡੈਸਕਟਾਪ ਡੀਵਾਈਸਾਂ ਵਿੱਚ ਸੁਰੱਖਿਅਤ ਕੀਤੇ ਟੈਬ ਗਰੁੱਪਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="5079699784114005398">ਚਾਲੂ ਹੋਣ 'ਤੇ, ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਿਸੇ ਵੀ ChromeOS ਡੀਵਾਈਸ 'ਤੇ ਆਪਣੇ Google ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ 'ਤੇ ਤੁਹਾਡੀਆਂ ਐਪਾਂ ਉਸ ਡੀਵਾਈਸ 'ਤੇ ਉਪਲਬਧ ਹੋਣਗੀਆਂ। Chrome ਬ੍ਰਾਊਜ਼ਰ ਤੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਵੈੱਬ ਐਪਾਂ ਨੂੰ ਸਿੰਕ ਕੀਤਾ ਜਾਵੇਗਾ, ਭਾਵੇਂ ਬ੍ਰਾਊਜ਼ਰ ਸਿੰਕ ਬੰਦ ਹੋਵੇ।</translation> <translation id="508059534790499809">Kerberos ਟਿਕਟ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="5081124414979006563">ਮਹਿਮਾਨ ਪ੍ਰੋਫਾਈਲ &ਖੋਲ੍ਹੋ</translation> @@ -5374,6 +5391,7 @@ <translation id="5125967981703109366">ਇਸ ਕਾਰਡ ਬਾਰੇ</translation> <translation id="512642543295077915">ਖੋਜ + ਬੈਕਸਪੇਸ</translation> <translation id="5126611267288187364">ਤਬਦੀਲੀਆਂ ਦੇਖੋ</translation> +<translation id="512761462447738469">ਕੈਮਰਾ ਇਜਾਜ਼ਤਾਂ ਵਾਲੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="5127620150973591153">ਸੁਰੱਖਿਅਤ ਕਨੈਕਸ਼ਨ ਆਈਡੀ: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">ਸਿੰਕ ਬੰਦ ਹੈ</translation> <translation id="5127881134400491887">ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> @@ -6079,6 +6097,7 @@ <translation id="5691581861107245578">ਜੋ ਵੀ ਤੁਸੀਂ ਟਾਈਪ ਕਰ ਰਹੇ ਹੋ ਉਸ ਆਧਾਰ 'ਤੇ ਇਮੋਜੀ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="5691772641933328258">ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪਛਾਣ ਨਹੀਂ ਹੋਈ</translation> <translation id="5692183275898619210">ਪ੍ਰਿੰਟ ਕਰਨਾ ਪੂਰਾ ਹੋਇਆ</translation> +<translation id="5693237475389615913">Chrome ਵਿੱਚ ਸਾਈਟ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਇਜਾਜ਼ਤਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="5693255400847650006">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਤੋਂ ਵਿੱਚ ਹੈ</translation> <translation id="5695184138696833495">Linux Android ਐਪ ADB</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" ਤੋਂ ਦੁਰਵਿਵਹਾਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ</translation> @@ -6100,6 +6119,7 @@ <translation id="5708171344853220004">Microsoft ਪ੍ਰਿੰਸੀਪਲ ਨਾਮ</translation> <translation id="5709557627224531708">Chrome ਨੂੰ ਆਪਣੇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ ਵਜੋਂ ਸੈੱਟ ਕਰੋ</translation> <translation id="5711010025974903573">ਸੇਵਾ ਲੌਗ</translation> +<translation id="5711324642850167289">ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ</translation> <translation id="5711983031544731014">ਅਣਲਾਕ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਆਪਣਾ ਪਾਸਵਰਡ ਦਰਜ ਕਰੋ।</translation> <translation id="5712153969432126546">ਸਾਈਟਾਂ ਕਈ ਵਾਰ ਦਸਤਾਵੇਜ਼, ਇਕਰਾਰਨਾਮਿਆਂ ਅਤੇ ਫ਼ਾਰਮਾਂ ਵਰਗੇ PDF ਪ੍ਰਕਾਸ਼ਿਤ ਕਰਦੀਆਂ ਹਨ</translation> <translation id="571222594670061844">ਸਾਈਟਾਂ ਪਛਾਣ ਸੰਬੰਧੀ ਸੇਵਾਵਾਂ ਵੱਲੋਂ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੇ ਉਤਪ੍ਰੇਰਕਾਂ ਨੂੰ ਦਿਖਾ ਸਕਦੀਆਂ ਹਨ</translation> @@ -6291,6 +6311,7 @@ <translation id="5862319196656206789">ਕਨੈਕਟ ਕੀਤੇ ਡੀਵਾਈਸਾਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ</translation> <translation id="5862731021271217234">ਆਪਣੇ ਹੋਰ ਡੀਵਾਈਸਾਂ ਤੋਂ ਆਪਣੀਆਂ ਟੈਬਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਸਿੰਕ ਚਾਲੂ ਕਰੋ</translation> <translation id="5863195274347579748">ਬਾਹਰੀ ਐਕਸੈਸਰੀਆਂ ਸ਼ਾਇਦ ਨਿੱਜੀ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਜਾਂ ਉਸਨੂੰ ਸਾਂਝਾ ਕਰ ਸਕਣ।</translation> +<translation id="5863263400083022538">ਸਿਸਟਮ ਸੇਵਾਵਾਂ</translation> <translation id="5863445608433396414">ਡੀਬੱਗਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="5863515189965725638">IBAN ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="5864195618110239517">ਮੀਟਰਡ ਕਨੈਕਸ਼ਨ ਵਰਤੋ</translation> @@ -6730,6 +6751,7 @@ <translation id="6207937957461833379">ਦੇਸ਼ / ਖੇਤਰ</translation> <translation id="6208521041562685716">ਮੋਬਾਈਲ ਡਾਟਾ ਕਿਰਿਆਸ਼ੀਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ - <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਇਜਾਜ਼ਤਾਂ ਵਾਲੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਤੁਹਾਡੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="6209838773933913227">ਕੰਪੋਨੈਂਟ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="6209908325007204267">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਇੱਕ Chrome ਐਂਟਰਪ੍ਰਾਈਜ਼ ਅੱਪਗ੍ਰੇਡ ਸ਼ਾਮਲ ਹੈ, ਪਰ ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਐਂਟਰਪ੍ਰਾਈਜ਼ ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਸੈਕੰਡਰੀ ਡੀਵਾਈਸ ਵਿੱਚ g.co/ChromeEnterpriseAccount 'ਤੇ ਜਾ ਕੇ ਇੱਕ ਐਂਟਰਪ੍ਰਾਈਜ਼ ਖਾਤਾ ਬਣਾਓ।</translation> <translation id="6210282067670792090">ਪਤਾ ਬਾਰ ਵਿੱਚ, ਖੋਜ ਇੰਜਣਾਂ ਅਤੇ ਸਾਈਟ ਖੋਜ ਲਈ ਸ਼ਾਰਟਕੱਟਾਂ ਨਾਲ ਇਸ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> @@ -7064,6 +7086,7 @@ <translation id="6478248366783946499">ਕੀ ਖਤਰਨਾਕ ਫ਼ਾਈਲ ਨੂੰ ਰੱਖਣਾ ਹੈ?</translation> <translation id="6479881432656947268">Chrome Web Store 'ਤੇ ਜਾਓ</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਗਿਆ</translation> +<translation id="6481749622989211463">ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ ਨਾਲ ਫ਼ਾਈਲਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="6482559668224714696">ਪੂਰੀ-ਸਕ੍ਰੀਨ ਵੱਡਦਰਸ਼ੀ</translation> <translation id="6483485061007832714">ਡਾਊਨਲੋਡ ਖੋਲ੍ਹੋ</translation> <translation id="6483805311199035658"><ph name="FILE" /> ਨੂੰ ਖੋਲ੍ਹ ਰਿਹਾ ਹੈ...</translation> @@ -7314,6 +7337,7 @@ <translation id="6680650203439190394">ਦਰ</translation> <translation id="6683022854667115063">ਹੈੱਡਫ਼ੋਨ</translation> <translation id="6683087162435654533">ਸਾਰੀਆਂ ਟੈਬਾਂ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰੋ</translation> +<translation id="6683433919380522900">ਇਜਾਜ਼ਤ <ph name="PERMISSION_STATE" /> ਹੈ</translation> <translation id="6684827949542560880">ਨਵੀਨਤਮ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="668599234725812620">Google Play ਖੋਲ੍ਹੋ</translation> <translation id="6686490380836145850">ਟੈਬਸ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਬੰਦ ਕਰੋ</translation> @@ -8128,6 +8152,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> ਦੇ ਡੀਵਾਈਸ ਲਈ <ph name="FEATURE_NAME" /> ਸੈਟਿੰਗਾਂ ਨੂੰ, <ph name="USER_EMAIL" /> ਖਾਤੇ ਦੇ ਅਧੀਨ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="7331646370422660166">alt + ਹੇਠਾਂ ਤੀਰ</translation> <translation id="7332053360324989309">ਸਮਰਪਿਤ ਕਰਮਚਾਰੀ: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">ਮੀਟਰਬੱਧ ਕਨੈਕਸ਼ਨ 'ਤੇ ਹੋਣ ਦੌਰਾਨ ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ।</translation> <translation id="7333669215417470379">ਆਪਣੀਆਂ ਐਪਾਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਦਾ ਬੈਕਅੱਪ ਲਓ ਅਤੇ ਇਨ੍ਹਾਂ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰੋ</translation> <translation id="7335436113423103413">ਨਵੇਂ ਟੈਬ ਪੰਨੇ 'ਤੇ ਯੂਨੀਫਾਈਡ ਸਾਈਡ ਪੈਨਲ ਤੋਂ ਵਿਉਂਤਬੱਧ Chrome ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।</translation> <translation id="7335974957018254119">ਇਹਨਾਂ ਲਈ ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਵਰਤੋ</translation> @@ -8284,6 +8309,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome Web Store ਤੋਂ ਹਟਾਈ ਗਈ 1 ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਸਮੀਖਿਆ ਕਰੋ}one{Chrome Web Store ਤੋਂ ਹਟਾਈ ਗਈ {NUM_EXTENSIONS} ਐਕਸਟੈਂਸ਼ਨ ਦੀ ਸਮੀਖਿਆ ਕਰੋ}other{Chrome Web Store ਤੋਂ ਹਟਾਈਆਂ ਗਈਆਂ {NUM_EXTENSIONS} ਐਕਸਟੈਂਸ਼ਨਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ}}</translation> <translation id="7436921188514130341">ਓਹੋ! ਨਾਮ ਬਦਲਣ ਦੌਰਾਨ ਗੜਬੜ ਹੋ ਗਈ।</translation> <translation id="7439519621174723623">ਜਾਰੀ ਰੱਖਣ ਲਈ ਇੱਕ ਡੀਵਾਈਸ ਦਾ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ</translation> +<translation id="7441736532026945583">ਆਪਣੀ ਟੈਬ ਪੱਟੀ ਤੋਂ ਗਰੁੱਪ ਨੂੰ ਹਟਾਉਣ ਲਈ "ਗਰੁੱਪ ਲੁਕਾਓ" ਨੂੰ ਚੁਣੋ</translation> <translation id="7441736921018636843">ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣ ਲਈ, ਆਪਣਾ ਸਿੰਕ ਪਾਸਫਰੇਜ਼ ਹਟਾਉਣ ਵਾਸਤੇ <ph name="BEGIN_LINK" />ਸਿੰਕ ਰੀਸੈੱਟ ਕਰੋ<ph name="END_LINK" /></translation> <translation id="7441830548568730290">ਹੋਰ ਵਰਤੋਂਕਾਰ</translation> <translation id="744341768939279100">ਇੱਕ ਨਵਾਂ ਪ੍ਰੋਫਾਈਲ ਬਣਾਓ</translation> @@ -8883,6 +8909,7 @@ <translation id="7887864092952184874">ਬਲੂਟੁੱਥ ਮਾਊਸ ਜੋੜਾਬੱਧ ਕੀਤਾ</translation> <translation id="7889371445710865055">ਡਿਕਟੇਸ਼ਨ ਸੰਬੰਧੀ ਭਾਸ਼ਾ ਬਦਲੋ</translation> <translation id="7890147169288018054">ਨੈੱਟਵਰਕ ਜਾਣਕਾਰੀ ਦੇਖੋ, ਜਿਵੇਂ ਕਿ ਤੁਹਾਡਾ IP ਜਾਂ MAC ਪਤਾ</translation> +<translation id="7892005672811746207">"ਗਰੁੱਪ ਨੂੰ ਰੱਖਿਅਤ ਕਰੋ" ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="7892384782944609022">ਜੋੜਾਬੱਧ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਡੀਵਾਈਸ ਚੁਣੋ।</translation> <translation id="7893008570150657497">ਆਪਣੇ ਕੰਪਿਊਟਰ ਤੋਂ ਫ਼ੋਟੋਆਂ, ਸੰਗੀਤ ਅਤੇ ਹੋਰ ਮੀਡੀਆ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="7893153962594818789">ਬਲੂਟੁੱਥ ਇਸ <ph name="DEVICE_TYPE" /> 'ਤੇ ਬੰਦ ਹੈ। ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ, ਅਤੇ ਬਲੂਟੁੱਥ ਨੂੰ ਚਾਲੂ ਕਰੋ।</translation> @@ -9125,6 +9152,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977"><ph name="GROUP_NAME" /> ਗਰੁੱਪ - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">ਕਨੈਕਸ਼ਨ ਵਿੰਡੋ</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> ਟਿਕਾਣੇ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ</translation> <translation id="8070662218171013510">ਛੋਹ ਪ੍ਰਤੀਕਰਮ</translation> <translation id="8071432093239591881">ਚਿੱਤਰ ਵਜੋਂ ਪ੍ਰਿੰਟ ਕਰੋ</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />ਐਪ ਡਾਟਾ ਕਿਸੇ ਐਪ ਵੱਲੋਂ (ਵਿਕਾਸਕਾਰ ਸੈਟਿੰਗਾਂ 'ਤੇ ਅਧਾਰਿਤ) ਰੱਖਿਅਤ ਕੀਤਾ ਕੋਈ ਵੀ ਡਾਟਾ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਸੰਪਰਕਾਂ, ਸੁਨੇਹਿਆਂ ਅਤੇ ਫ਼ੋਟੋਆਂ ਵਰਗਾ ਡਾਟਾ ਸ਼ਾਮਲ ਹੈ।<ph name="END_PARAGRAPH1" /> @@ -9183,6 +9211,7 @@ <translation id="8109991406044913868">AI ਨਾਲ ਬਣਾਇਆ ਗਿਆ ਥੀਮ</translation> <translation id="8110393529211831722">ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਸਿਰਫ਼ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਸਥਾਪਤ ਕੀਤੀ ਗਈ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਖਾਤੇ ਦੇ ਅਧੀਨ ਹੋਰ ਡੀਵਾਈਸਾਂ ਨਾਲ ਸਿੰਕ ਨਹੀਂ ਕੀਤੀ ਗਈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="8110489095782891123">ਸੰਪਰਕ ਸੂਚੀ ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ</translation> <translation id="8115139559594092084">ਤੁਹਾਡੇ Google Drive ਤੋਂ</translation> <translation id="8116972784401310538">&ਬੁੱਕਮਾਰਕ ਪ੍ਰਬੰਧਕ</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> ਯਾਦ ਰੱਖਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕਿਵੇਂ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਹੈ ਅਤੇ ਸੰਭਵ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ ਆਪਣੇ ਆਪ ਸਾਈਨ-ਇਨ ਕਰਦਾ ਹੈ। ਬੰਦ ਹੋਣ 'ਤੇ, ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਤਸਦੀਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।</translation> @@ -9398,6 +9427,7 @@ <translation id="8275038454117074363">ਆਯਾਤ ਕਰੋ</translation> <translation id="8275080796245127762">ਆਪਣੇ ਡੀਵਾਈਸ ਤੋਂ ਕਾਲ ਕਰੋ</translation> <translation id="8275339871947079271">ਆਪਣੇ ਪਾਸਵਰਡ ਨੂੰ Google ਖਾਤੇ ਵਿੱਚ ਲਿਜਾਓ ਤਾਂ ਕਿ ਤੁਸੀਂ ਕਿਤੇ ਵੀ ਸਾਈਨ-ਇਨ ਕਰਕੇ ਉਸਨੂੰ ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ ਵਰਤ ਸਕੋ</translation> +<translation id="8276242035951017580">ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ</translation> <translation id="8276560076771292512">ਕੈਸ਼ੇ ਅਤੇ ਹਾਰਡ ਰੀਲੋਡ ਖਾਲੀ ਕਰੋ</translation> <translation id="8276850948802942358">ਕਿਸੇ ਸਾਈਟ ਨੂੰ ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਅਸਥਾਈ ਇਜਾਜ਼ਤ ਦੇਣ ਬਾਰੇ ਹੋਰ ਜਾਣੋ</translation> <translation id="828180235270931531">ਹੋਰ ਉਪਲਬਧ ਪ੍ਰਿੰਟਰ</translation> @@ -9416,6 +9446,7 @@ <translation id="8291942417224950075">ਨਿੱਜੀ ਵਰਤੋਂ ਲਈ</translation> <translation id="8293206222192510085">ਬੁੱਕਮਾਰਕ ਸ਼ਾਮਿਲ ਕਰੋ</translation> <translation id="8294431847097064396">ਸ੍ਰੋਤ</translation> +<translation id="8294476140219241086">ਟੈਬ ਪ੍ਰਬੰਧਕ</translation> <translation id="8294895455164415895">Chrome ਨੂੰ ਟੈਬ ਗਰੁੱਪਾਂ ਦੇ ਸੁਝਾਅ ਦੇਣ ਦੀ ਆਗਿਆ ਦੇਣ ਲਈ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ</translation> <translation id="8295449579927246485">ਲਾਈਵ ਅਨੁਵਾਦ</translation> <translation id="8295450130892483256">Microsoft 365 ਨੂੰ ਸਥਾਪਤ ਕਰੋ</translation> @@ -9528,6 +9559,7 @@ <translation id="8380266723152870797">ਵਿੰਡੋ ਦਾ ਨਾਮ</translation> <translation id="8380941800586852976">ਖਤਰਨਾਕ</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> +<translation id="8382197851871630452">ਸਥਾਨਕ ਮੌਸਮ</translation> <translation id="8382677870544805359">ਐਂਟਰਪ੍ਰਾਈਜ਼ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਲੋੜ ਪਵੇਗੀ।</translation> <translation id="8382715499079447151">ਦੇਖਣ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ</translation> <translation id="8382913212082956454">&ਈਮੇਲ ਪਤਾ ਕਾਪੀ ਕਰੋ</translation> @@ -9718,6 +9750,7 @@ <translation id="8528962588711550376">ਸਾਈਨ ਇਨ ਕਰ ਰਿਹਾ ਹੈ।</translation> <translation id="8529578450330869579">ਤੁਹਾਡੇ ਇੰਟਰਨੈੱਟ ਟਰੈਫ਼ਿਕ ਤੱਕ ਪਹੁੰਚ ਵਾਲੇ ਲੋਕਾਂ ਤੋਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀਆਂ ਗਈਆਂ ਸਾਈਟਾਂ ਨੂੰ ਦੇਖਣ ਤੋਂ ਰੋਕਣ ਲਈ ਸੁਰੱਖਿਅਤ ਡੋਮੇਨ ਨੇਮ ਪ੍ਰਣਾਲੀ (DNS) ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> 'ਤੇ ਪ੍ਰਬੰਧਿਤ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ</translation> <translation id="8529925957403338845">ਤਤਕਾਲ ਟੈਦਰਿੰਗ ਕਨੈਕਸ਼ਨ ਅਸਫਲ ਰਿਹਾ</translation> +<translation id="8531367864749403520">ਆਪਣੀ ਟੈਬ ਪੱਟੀ ਤੋਂ ਗਰੁੱਪ ਨੂੰ ਹਟਾਉਣ ਲਈ "ਗਰੁੱਪ ਲੁਕਾਓ" ਨੂੰ ਚੁਣੋ</translation> <translation id="8531701051932785007">ਵਿਸਤ੍ਰਿਤ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਬੰਦ ਹੈ</translation> <translation id="8533670235862049797">ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਚਾਲੂ ਹੈ</translation> <translation id="8534656636775144800">ਓਹੋ! ਡੋਮੇਨ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ ਕੁਝ ਗਲਤ ਹੋਇਆ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> @@ -9844,6 +9877,7 @@ <translation id="8639635302972078117">ਵਰਤੋਂ ਅਤੇ ਤਸ਼ਖੀਸ ਡਾਟਾ ਭੇਜੋ। ਇਹ ਡੀਵਾਈਸ ਇਸ ਵੇਲੇ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸ, ਡੀਵਾਈਸ ਅਤੇ ਐਪ ਵਰਤੋਂ ਡਾਟਾ Google ਨੂੰ ਭੇਜ ਰਿਹਾ ਹੈ। ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਬੱਚੇ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਨਹੀਂ ਕੀਤੀ ਜਾਵੇਗੀ ਅਤੇ ਸਿਸਟਮ ਅਤੇ ਐਪ ਸਥਿਰਤਾ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਮਿਲੇਗੀ। ਕੁਝ ਏਕੀਕ੍ਰਿਤ ਜਾਣਕਾਰੀ Google ਐਪਾਂ ਅਤੇ ਪਾਰਟਨਰਾਂ, ਜਿਵੇਂ ਕਿ Android ਵਿਕਾਸਕਾਰਾਂ ਦੀ ਵੀ ਮਦਦ ਕਰੇਗੀ। ਜੇ ਤੁਹਾਡੇ ਬੱਚੇ ਲਈ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਉਹਨਾਂ ਦੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> <translation id="8640575194957831802">ਆਖਰੀ ਵਾਰ ਖੋਲ੍ਹਣ ਦਾ ਸਮਾਂ</translation> <translation id="8641946446576357115">ਆਪਣੇ iOS ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ ਵਰਤੋ</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> ਕੈਮਰੇ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ</translation> <translation id="8642900771896232685">2 ਸਕਿੰਟ</translation> <translation id="8642947597466641025">ਟੈਕਸਟ ਨੂੰ ਵੱਡਾ ਕਰੋ</translation> <translation id="8643403533759285912">ਗਰੁੱਪ ਮਿਟਾਓ</translation> @@ -9878,6 +9912,7 @@ <translation id="8662978096466608964">Chrome ਵਾਲਪੇਪਰ ਸੈੱਟ ਨਹੀਂ ਕਰ ਸਕਦਾ।</translation> <translation id="8663051876219324457">ਐਪਾਂ, ਵੈੱਬਸਾਈਟਾਂ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਨੂੰ ਆਪਣੇ ਟਿਕਾਣੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ। ਟਿਕਾਣਾ ਸੇਵਾ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ ਵਾਈ-ਫਾਈ, ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਅਤੇ ਸੈਂਸਰਾਂ ਵਰਗੇ ਸਰੋਤਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀ ਹੈ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> ਤੇ ਮਲਟੀਪਲ ਆਟੋਮੈਟਿਕ ਡਾਊਨਲੋਡਸ ਨੂੰ ਹਮੇਸ਼ਾਂ ਬਲੌਕ ਕਰੋ</translation> +<translation id="8664249499245357248">ਗਰੁੱਪ ਦੇ ਨਾਮ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰੋ</translation> <translation id="8664389313780386848">&ਸਫ਼ਾ ਸ੍ਰੋਤ ਦੇਖੋ</translation> <translation id="8665110742939124773">ਤੁਸੀਂ ਗਲਤ ਪਹੁੰਚ ਕੋਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="8665180165765946056">ਬੈਕਅੱਪ ਪੂਰਾ ਹੋਇਆ</translation> @@ -10203,6 +10238,7 @@ <translation id="8900413463156971200">ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> ਲਈ ਤੁਹਾਨੂੰ ਆਪਣੇ ਡਾਟੇ ਦਾ ਬੈਕਅੱਪ ਲੈਣ ਅਤੇ ਇਸ <ph name="DEVICE_TYPE" /> ਨੂੰ ਅੱਜ ਹੀ ਵਾਪਸ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।}one{<ph name="MANAGER" /> ਲਈ ਤੁਹਾਨੂੰ ਆਪਣੇ ਡਾਟੇ ਦਾ ਬੈਕਅੱਪ ਲੈਣ ਅਤੇ ਸਮਾਂ-ਸੀਮਾ ਤੋਂ ਪਹਿਲਾਂ ਇਸ <ph name="DEVICE_TYPE" /> ਨੂੰ ਵਾਪਸ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।}other{<ph name="MANAGER" /> ਲਈ ਤੁਹਾਨੂੰ ਆਪਣੇ ਡਾਟੇ ਦਾ ਬੈਕਅੱਪ ਲੈਣ ਅਤੇ ਸਮਾਂ-ਸੀਮਾ ਤੋਂ ਪਹਿਲਾਂ ਇਸ <ph name="DEVICE_TYPE" /> ਨੂੰ ਵਾਪਸ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।}}</translation> <translation id="8902667442496790482">'ਚੁਣੋ ਅਤੇ ਸੁਣੋ' ਸੈਟਿੰਗਾਂ ਦਾ ਪੰਨਾ ਖੋਲ੍ਹੋ</translation> +<translation id="8903733144777177139">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਪਹੁੰਚ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="890616557918890486">ਸਰੋਤ ਬਦਲੋ</translation> <translation id="8907701755790961703">ਕਿਰਪਾ ਕਰਕੇ ਕੋਈ ਦੇਸ਼ ਚੁਣੋ</translation> <translation id="8908420399006197927">ਸੁਝਾਏ ਗਏ ਗਰੁੱਪ ਵਿੱਚੋਂ ਟੈਬ ਨੂੰ ਬਾਹਰ ਰੱਖੋ</translation> @@ -10240,6 +10276,7 @@ <translation id="8934732568177537184">ਜਾਰੀ ਰੱਖੋ</translation> <translation id="8938800817013097409">USB-C ਡੀਵਾਈਸ (ਪਿੱਛੇ ਸੱਜਾ ਪੋਰਟ)</translation> <translation id="8940081510938872932">ਤੁਹਾਡਾ ਕੰਪਿਊਟਰ ਹੁਣ ਕਈ ਚੀਜ਼ਾਂ ਕਰ ਰਿਹਾ ਹੈ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> +<translation id="8940228279218723234">ਕੈਮਰਾ ਇਜਾਜ਼ਤ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਦੇ ਨਾਲ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿਓ। ਕੈਮਰਾ ਵਰਤਣ ਲਈ, ਤੁਹਾਨੂੰ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਜਾਂ ਪੰਨੇ ਨੂੰ ਰਿਫ੍ਰੈਸ਼ ਕਰਨ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ।</translation> <translation id="8940381019874223173">ਤੁਹਾਡੀਆਂ Google Photos ਤੋਂ</translation> <translation id="8940888110818450052">ਸਾਈਨ-ਇਨ ਕਰਨ ਦੇ ਵਿਕਲਪ</translation> <translation id="8941173171815156065">ਅਨੁਮਤੀ '<ph name="PERMISSION" />' ਰੱਦ ਕਰੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 887f50b..7f3eb7a 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Połączono z telefonem z Androidem</translation> <translation id="1523279371236772909">Wyświetlono w zeszłym miesiącu</translation> <translation id="1523978563989812243">Mechanizmy zamiany tekstu na mowę</translation> -<translation id="1524430321211440688">Klawiatura</translation> <translation id="1524563461097350801">Nie, dziękuję</translation> <translation id="1525740877599838384">Do określania lokalizacji używaj tylko Wi-Fi</translation> <translation id="152629053603783244">Uruchom ponownie Linuksa</translation> @@ -2187,7 +2186,7 @@ <translation id="2643698698624765890">Aby zarządzać zainstalowanymi rozszerzeniami, kliknij Rozszerzenia w menu Okno.</translation> <translation id="2645047101481282803">Twoim urządzeniem zarządza <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Przesyłam tę kartę na: <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Protanomalia</translation> <translation id="2649045351178520408">Plik ASCII z kodowaniem Base64, łańcuch certyfikatów</translation> <translation id="265156376773362237">Wczytywanie standardowe</translation> @@ -3890,7 +3889,6 @@ <translation id="3966072572894326936">Wybierz inny folder...</translation> <translation id="3966094581547899417">Szczegóły hotspota</translation> <translation id="3967822245660637423">Pobieranie zakończone</translation> -<translation id="3967841595862839006">Wybierz język i klawiaturę</translation> <translation id="3968739731834770921">Tryb znaków kana</translation> <translation id="3970114302595058915">Identyfikator</translation> <translation id="397105322502079400">Obliczanie...</translation> @@ -4571,7 +4569,6 @@ <translation id="4513872120116766993">Przewidywanie tekstu podczas pisania</translation> <translation id="4513946894732546136">Twoja opinia</translation> <translation id="4515872537870654449">Skontaktuj się z serwisem firmy Dell. Jeśli wentylator nie działa, stacja dokująca się wyłączy.</translation> -<translation id="4516008165284813420">Sprawdź, czy urządzenie <ph name="DEVICE_TYPE" /> jest połączone z internetem, i spróbuj ponownie. Możesz też wejść na stronę play.google.com/about/play-terms na innym urządzeniu.</translation> <translation id="4518840066030486079">Styl trybu klawisza Shift</translation> <translation id="4519331665958994620">Strony mogą prosić o dostęp do kamery</translation> <translation id="4519605771716872386">Synchronizacja plików jest włączona</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 8ae27cc4..dbfddbe5 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -683,7 +683,6 @@ <translation id="1521933835545997395">Conectado ao smartphone Android</translation> <translation id="1523279371236772909">Visualizado no último mês</translation> <translation id="1523978563989812243">Mecanismos da conversão de texto em voz</translation> -<translation id="1524430321211440688">Teclado</translation> <translation id="1524563461097350801">Agora não</translation> <translation id="1525740877599838384">Usar apenas o Wi-Fi para determinar a localização</translation> <translation id="152629053603783244">Reiniciar Linux</translation> @@ -3924,7 +3923,6 @@ <translation id="3966072572894326936">Escolher outra pasta...</translation> <translation id="3966094581547899417">Detalhes do ponto de acesso</translation> <translation id="3967822245660637423">Download concluído</translation> -<translation id="3967841595862839006">Escolher idioma e teclado</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Código</translation> <translation id="397105322502079400">Calculando...</translation> @@ -4606,7 +4604,6 @@ <translation id="4513872120116766993">Escrita preditiva</translation> <translation id="4513946894732546136">Comentários</translation> <translation id="4515872537870654449">Fale com a Dell para consertar. A base será desligada se a ventilação não estiver funcionando.</translation> -<translation id="4516008165284813420">Verifique se o <ph name="DEVICE_TYPE" /> está conectado à Internet e tente de novo. Você também pode acessar play.google.com/about/play-terms em outro dispositivo.</translation> <translation id="4518840066030486079">Estilo do modo da tecla Shift</translation> <translation id="4519331665958994620">Os sites podem pedir para usar a câmera</translation> <translation id="4519605771716872386">Sincronização de arquivos ativada</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index c398c86..d08945d0 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Ligado ao telemóvel Android</translation> <translation id="1523279371236772909">Visto no mês passado</translation> <translation id="1523978563989812243">Motores da conversão de texto em voz</translation> -<translation id="1524430321211440688">Teclado</translation> <translation id="1524563461097350801">Não</translation> <translation id="1525740877599838384">Usar apenas Wi-Fi para determinar a localização</translation> <translation id="152629053603783244">Reiniciar Linux</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Escolher outra pasta...</translation> <translation id="3966094581547899417">Detalhes da zona Wi-Fi</translation> <translation id="3967822245660637423">Transferência concluída</translation> -<translation id="3967841595862839006">Escolher o idioma e o teclado</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">A calcular...</translation> @@ -4607,7 +4605,6 @@ <translation id="4513872120116766993">Escrita preditiva</translation> <translation id="4513946894732546136">Comentários</translation> <translation id="4515872537870654449">Contacte a Dell para obter assistência. A estação de carregamento será encerrada se a ventoinha não estiver a funcionar.</translation> -<translation id="4516008165284813420">Certifique-se de que o seu <ph name="DEVICE_TYPE" /> está ligado à Internet e tente novamente. Também pode aceder a play.google.com/about/play-terms noutro dispositivo.</translation> <translation id="4518840066030486079">Estilo do modo com tecla Shift</translation> <translation id="4519331665958994620">Os sites podem solicitar a utilização da câmara</translation> <translation id="4519605771716872386">Sincronização de ficheiros ativada</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index a7ff336d..eaec9da 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -680,7 +680,6 @@ <translation id="1521933835545997395">Conectat la telefonul Android</translation> <translation id="1523279371236772909">Afișat în ultima lună</translation> <translation id="1523978563989812243">Motoare pentru redarea vocală a textului</translation> -<translation id="1524430321211440688">Tastatură</translation> <translation id="1524563461097350801">Nu, mulțumesc</translation> <translation id="1525740877599838384">Folosește numai rețeaua Wi-Fi pentru a detecta locația</translation> <translation id="152629053603783244">Repornește Linux</translation> @@ -3909,7 +3908,6 @@ <translation id="3966072572894326936">Alegeți alt dosar...</translation> <translation id="3966094581547899417">Detalii despre hotspot</translation> <translation id="3967822245660637423">Descărcare finalizată</translation> -<translation id="3967841595862839006">Alege limba și tastatura</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Se calculează...</translation> @@ -4590,7 +4588,6 @@ <translation id="4513872120116766993">Scriere predictivă</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Contactează Dell pentru service. Dispozitivul de andocare se va închide dacă ventilatorul nu funcționează.</translation> -<translation id="4516008165284813420">Verifică dacă <ph name="DEVICE_TYPE" /> este conectat la internet și încearcă din nou În plus, poți accesa play.google.com/about/play-terms de pe alt dispozitiv.</translation> <translation id="4518840066030486079">Stilul modului pentru tasta Shift</translation> <translation id="4519331665958994620">Site-urile pot solicita permisiunea de a folosi camera</translation> <translation id="4519605771716872386">Sincronizarea fișierelor este activată</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index f5042c2..f58f6d3 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Подключено к телефону Android</translation> <translation id="1523279371236772909">Просмотрено в прошлом месяце</translation> <translation id="1523978563989812243">Синтезаторы речи</translation> -<translation id="1524430321211440688">Клавиатура</translation> <translation id="1524563461097350801">Нет, спасибо</translation> <translation id="1525740877599838384">Использовать для определения местоположения только Wi-Fi</translation> <translation id="152629053603783244">Перезагрузить Linux</translation> @@ -2828,7 +2827,7 @@ <translation id="3119948370277171654">Укажите тип транслируемого контента или URL.</translation> <translation id="3122464029669770682">Процессор</translation> <translation id="3122496702278727796">Не удалось создать каталог данных</translation> -<translation id="3122810280993140148">Эта функция создает особые темы на основе выбранного вами объекта, настроения, визуального стиля и цвета. Чтобы использовать ее, откройте новую вкладку и нажмите "Настроить Chrome".</translation> +<translation id="3122810280993140148">Эта функция создает особые темы с выбранным вами объектом, настроением, стилем и цветом. Чтобы использовать ее, откройте новую вкладку и нажмите "Настроить Chrome".</translation> <translation id="3122883569442693641">Подробнее</translation> <translation id="3124111068741548686">USER-дескрипторы</translation> <translation id="3124332159330678621">Придайте Chrome новый вид</translation> @@ -3910,7 +3909,6 @@ <translation id="3966072572894326936">Выбрать другую папку...</translation> <translation id="3966094581547899417">Сведения о точке доступа</translation> <translation id="3967822245660637423">Скачивание завершено.</translation> -<translation id="3967841595862839006">Выберите язык и клавиатуру</translation> <translation id="3968739731834770921">Кана</translation> <translation id="3970114302595058915">Идентификатор</translation> <translation id="397105322502079400">Вычисление…</translation> @@ -4591,7 +4589,6 @@ <translation id="4513872120116766993">Подсказки</translation> <translation id="4513946894732546136">Отзыв</translation> <translation id="4515872537870654449">Обратитесь в службу поддержки Dell. Если вентилятор не заработает, док-станция будет выключена.</translation> -<translation id="4516008165284813420">Убедитесь, что устройство <ph name="DEVICE_TYPE" /> подключено к интернету, и повторите попытку. Вы также можете открыть страницу play.google.com/about/play-terms на другом устройстве.</translation> <translation id="4518840066030486079">Стиль режима клавиши Shift</translation> <translation id="4519331665958994620">Разрешить сайтам отправлять запрос на использование камеры</translation> <translation id="4519605771716872386">Синхронизация файлов включена</translation> @@ -9785,7 +9782,7 @@ <translation id="8601206103050338563">Клиентская аутентификация TLS WWW</translation> <translation id="8602674530529411098">Приложения (бета-версия)</translation> <translation id="8602851771975208551">Одна из программ на вашем компьютере установила приложение, которое может влиять на работу Chrome.</translation> -<translation id="8604513817270995005">Эта функция помогает создавать короткие тексты в интернете, например писать отзывы. Подсказки генерируются с учетом вводимого текста и содержимого веб-страницы. Чтобы использовать эту функцию, нажмите правой кнопкой мыши на текстовое поле.</translation> +<translation id="8604513817270995005">Эта функция помогает создавать короткие тексты в интернете, например писать отзывы. Тесты создаются по вашему запросу и с учетом содержимого веб-страницы. Чтобы использовать эту функцию, нажмите правой кнопкой мыши на текстовое поле.</translation> <translation id="8605428685123651449">Память SQLite</translation> <translation id="8607171490667464784">Когда устройство неактивно и работает от батареи</translation> <translation id="8607828412110648570">Устройство Bluetooth должно быть в режиме подключения и находиться рядом. Устанавливайте соединение только с надежными устройствами. Подключенные устройства видны во всех аккаунтах на этом Chromebook. <ph name="BEGIN_LINK_LEARN_MORE" />Подробнее…<ph name="END_LINK_LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 4a922054..2eaaa31f 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Android දුරකථනයට සම්බන්ධයි</translation> <translation id="1523279371236772909">පසුගිය මාසයේ බැලූ</translation> <translation id="1523978563989812243">කථනයට පාඨය එන්ජිම්</translation> -<translation id="1524430321211440688">යතුරු පුවරුව</translation> <translation id="1524563461097350801">එපා, ස්තූතියි</translation> <translation id="1525740877599838384">ස්ථානය තීරණය කිරීම සඳහා Wi-Fi පමණක් භාවිතා කරන්න</translation> <translation id="152629053603783244">ලිනක්ස් යළි අරඹන්න</translation> @@ -3913,7 +3912,6 @@ <translation id="3966072572894326936">වෙනත් ෆෝල්ඩරයක් තෝරන්න...</translation> <translation id="3966094581547899417">හොට්ස්පොට් විස්තර</translation> <translation id="3967822245660637423">බාගැනීම සම්පූර්ණයි</translation> -<translation id="3967841595862839006">ඔබේ භාෂාව සහ යතුරු පුවරුව තෝරන්න</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">ගණනය කරමින්...</translation> @@ -4594,7 +4592,6 @@ <translation id="4513872120116766993">පුරෝකථනමය ලිවීම</translation> <translation id="4513946894732546136">ප්රතිපෝෂණ</translation> <translation id="4515872537870654449">සේවය සඳහා Dell සම්බන්ධ කර ගන්න. විදුලි පංකාව ක්රියා නොකරන්නේ නම්, ඩොක් එක වැසේ.</translation> -<translation id="4516008165284813420">ඔබේ <ph name="DEVICE_TYPE" /> අන්තර්ජාලයට සම්බන්ධ බව සහතික කර ගෙන නැවත උත්සාහ කරන්න. ඔබට වෙනත් උපාංගයකින් play.google.com/about/play-terms වෙත ද පිවිසිය හැක.</translation> <translation id="4518840066030486079">Shift යතුරු ප්රකාර විලාසය</translation> <translation id="4519331665958994620">අඩවි ඔබගේ කැමරාව භාවිත කිරීමට ඉල්ලිය හැකිය</translation> <translation id="4519605771716872386">ගොනු සමමුහුර්ත කිරීම ක්රියාත්මක කර ඇත</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index e643dfd..61a85218 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -681,7 +681,6 @@ <translation id="1521933835545997395">Pripojené k telefónu s Androidom</translation> <translation id="1523279371236772909">Zobrazené v uplynulom mesiaci</translation> <translation id="1523978563989812243">Nástroje prevodu textu na reč</translation> -<translation id="1524430321211440688">Klávesnica</translation> <translation id="1524563461097350801">Nie, ďakujem</translation> <translation id="1525740877599838384">Na zistenie polohy používať iba Wi-Fi</translation> <translation id="152629053603783244">Reštartovať Linux</translation> @@ -3910,7 +3909,6 @@ <translation id="3966072572894326936">Vybrať iný priečinok...</translation> <translation id="3966094581547899417">Podrobnosti o hotspote</translation> <translation id="3967822245660637423">Sťahovanie dokončené</translation> -<translation id="3967841595862839006">Výber jazyka a klávesnice</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Identifikátor</translation> <translation id="397105322502079400">Prebieha výpočet...</translation> @@ -4591,7 +4589,6 @@ <translation id="4513872120116766993">Predvídanie písania</translation> <translation id="4513946894732546136">Spätná väzba</translation> <translation id="4515872537870654449">Ak potrebujete servis, kontaktujte spoločnosť Dell. Ak ventilátor nefunguje, dok sa vypne.</translation> -<translation id="4516008165284813420">Skontrolujte, či je zariadenie <ph name="DEVICE_TYPE" /> pripojené k internetu, a skúste to znova. Môžete prejsť na play.google.com/about/play-terms v inom zariadení.</translation> <translation id="4518840066030486079">Štýl režimu klávesa Shift</translation> <translation id="4519331665958994620">Weby môžu žiadať o použitie kamery</translation> <translation id="4519605771716872386">Synchronizácia súborov je zapnutá</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index b1226ef..2d7c27c 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -685,7 +685,6 @@ <translation id="1521933835545997395">Povezava s telefonom Android je vzpostavljena</translation> <translation id="1523279371236772909">Ogledano v zadnjem mesecu</translation> <translation id="1523978563989812243">Motorji pretvorbe besedila v govor</translation> -<translation id="1524430321211440688">Tipkovnica</translation> <translation id="1524563461097350801">Ne, hvala</translation> <translation id="1525740877599838384">Uporaba samo omrežja Wi-Fi za določanje lokacije</translation> <translation id="152629053603783244">Znova zaženi Linux</translation> @@ -3926,7 +3925,6 @@ <translation id="3966072572894326936">Izberite drugo mapo ...</translation> <translation id="3966094581547899417">Podrobnosti dostopne točke</translation> <translation id="3967822245660637423">Prenos končan</translation> -<translation id="3967841595862839006">Izbira jezika in tipkovnice</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Izračunavanje …</translation> @@ -4608,7 +4606,6 @@ <translation id="4513872120116766993">Predvidevanje besedila</translation> <translation id="4513946894732546136">Povratne informacije</translation> <translation id="4515872537870654449">Če potrebujete servisne storitve, se obrnite na družbo Dell. Če ventilator ne deluje, se bo priklopna postaja izklopila.</translation> -<translation id="4516008165284813420">Prepričajte se, da je naprava <ph name="DEVICE_TYPE" /> povezana v internet, in poskusite znova. Odprete lahko tudi play.google.com/about/play-terms v drugi napravi.</translation> <translation id="4518840066030486079">Slog načina tipke Shift</translation> <translation id="4519331665958994620">Spletna mesta lahko zahtevajo uporabo kamere.</translation> <translation id="4519605771716872386">Sinhronizacija datotek je vklopljena</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 212a8505..e305965 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -676,7 +676,6 @@ <translation id="1521933835545997395">Lidhur me telefonin me Android</translation> <translation id="1523279371236772909">Shikuar muajin e kaluar</translation> <translation id="1523978563989812243">Motorët e "tekstit në ligjërim"</translation> -<translation id="1524430321211440688">Tastiera</translation> <translation id="1524563461097350801">Jo, faleminderit</translation> <translation id="1525740877599838384">Përdor vetëm Wi-Fi për të përcaktuar vendndodhjen</translation> <translation id="152629053603783244">Rinis Linux</translation> @@ -3906,7 +3905,6 @@ <translation id="3966072572894326936">Zgjidh një dosje tjetër...</translation> <translation id="3966094581547899417">Detajet e zonës së qasjes për internet</translation> <translation id="3967822245660637423">Shkarkimi përfundoi</translation> -<translation id="3967841595862839006">Zgjidh gjuhën dhe tastierën</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Po llogarit...</translation> @@ -4587,7 +4585,6 @@ <translation id="4513872120116766993">Parashikimi i shkrimit</translation> <translation id="4513946894732546136">Komente</translation> <translation id="4515872537870654449">Kontakto me Dell për shërbim. Stacioni do të mbyllet nëse ventilatori nuk funksionon.</translation> -<translation id="4516008165284813420">Sigurohu që pajisja jote <ph name="DEVICE_TYPE" /> është e lidhur me internetin dhe provo përsëri. Mund të vizitosh gjithmonë play.google.com/about/play-terms në një pajisje tjetër.</translation> <translation id="4518840066030486079">Stili i modalitetit të tastit "Shift"</translation> <translation id="4519331665958994620">Sajtet mund të kërkojnë të përdorin kamerën tënde</translation> <translation id="4519605771716872386">Sinkronizimi i skedarëve u aktivizua</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index ca0105ad..3533815 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -678,7 +678,6 @@ <translation id="1521933835545997395">Povezano sa Android telefonom</translation> <translation id="1523279371236772909">Pregledali ste prethodnog meseca</translation> <translation id="1523978563989812243">Mehanizmi za pretvaranje teksta u govor</translation> -<translation id="1524430321211440688">Tastatura</translation> <translation id="1524563461097350801">Ne, hvala</translation> <translation id="1525740877599838384">Koristi samo WiFi za određivanje lokacije</translation> <translation id="152629053603783244">Restartuj Linux</translation> @@ -3906,7 +3905,6 @@ <translation id="3966072572894326936">Odaberi drugi folder...</translation> <translation id="3966094581547899417">Detalji o hotspotu</translation> <translation id="3967822245660637423">Preuzimanje je dovršeno</translation> -<translation id="3967841595862839006">Izaberite jezik i tastaturu</translation> <translation id="3968739731834770921">kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Izračunavanje...</translation> @@ -4587,7 +4585,6 @@ <translation id="4513872120116766993">Pisanje sa predviđanjem</translation> <translation id="4513946894732546136">Povratne informacije</translation> <translation id="4515872537870654449">Obratite se Dell-u za uslugu. Bazna stanica će se isključiti ako ventilator ne radi.</translation> -<translation id="4516008165284813420">Uverite se da je uređaj <ph name="DEVICE_TYPE" /> povezan na internet i probajte ponovo. Možete i da posetite play.google.com/about/play-terms na drugom uređaju.</translation> <translation id="4518840066030486079">Režim stila tastera Shift</translation> <translation id="4519331665958994620">Sajtovi mogu da traže da koriste kameru</translation> <translation id="4519605771716872386">Sinhronizacija fajlova je uključena</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index bcda323a..8ffc9722 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -678,7 +678,6 @@ <translation id="1521933835545997395">Повезано са Android телефоном</translation> <translation id="1523279371236772909">Прегледали сте претходног месеца</translation> <translation id="1523978563989812243">Механизми за претварање текста у говор</translation> -<translation id="1524430321211440688">Тастатура</translation> <translation id="1524563461097350801">Не, хвала</translation> <translation id="1525740877599838384">Користи само WiFi за одређивање локације</translation> <translation id="152629053603783244">Рестартуј Linux</translation> @@ -3906,7 +3905,6 @@ <translation id="3966072572894326936">Одабери други фолдер...</translation> <translation id="3966094581547899417">Детаљи о хотспоту</translation> <translation id="3967822245660637423">Преузимање је довршено</translation> -<translation id="3967841595862839006">Изаберите језик и тастатуру</translation> <translation id="3968739731834770921">кана</translation> <translation id="3970114302595058915">ИД</translation> <translation id="397105322502079400">Израчунавање...</translation> @@ -4587,7 +4585,6 @@ <translation id="4513872120116766993">Писање са предвиђањем</translation> <translation id="4513946894732546136">Повратне информације</translation> <translation id="4515872537870654449">Обратите се Dell-у за услугу. Базна станица ће се искључити ако вентилатор не ради.</translation> -<translation id="4516008165284813420">Уверите се да је уређај <ph name="DEVICE_TYPE" /> повезан на интернет и пробајте поново. Можете и да посетите play.google.com/about/play-terms на другом уређају.</translation> <translation id="4518840066030486079">Режим стила тастера Shift</translation> <translation id="4519331665958994620">Сајтови могу да траже да користе камеру</translation> <translation id="4519605771716872386">Синхронизација фајлова је укључена</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 741db37..681f2a3f 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Ansluten till Android-telefon</translation> <translation id="1523279371236772909">Visades under den senaste månaden</translation> <translation id="1523978563989812243">Motorer för text till tal</translation> -<translation id="1524430321211440688">Tangentbord</translation> <translation id="1524563461097350801">Nej tack</translation> <translation id="1525740877599838384">Fastställ platsen enbart utifrån wifi</translation> <translation id="152629053603783244">Starta om Linux</translation> @@ -1469,7 +1468,7 @@ <translation id="2091887806945687916">Ljud</translation> <translation id="2092356157625807382"><ph name="BEGIN_H3" />Felsökningsfunktioner<ph name="END_H3" /> <ph name="BR" /> - Du kan aktivera felsökningsfunktionerna på Chrome OS-enheten så att du kan installera och testa egen kod på den. Med dessa funktioner kan du<ph name="BR" /> + Du kan aktivera felsökningsfunktionerna på ChromeOS-enheten så att du kan installera och testa egen kod på den. Med dessa funktioner kan du<ph name="BR" /> <ph name="BEGIN_LIST" /> <ph name="LIST_ITEM" />ta bort rootfs-verifieringen så att du kan ändra filer i operativsystemet <ph name="LIST_ITEM" />aktivera SSH-åtkomst till enheten med standardtestnycklarna så att du kan använda enheten med verktyg som <ph name="BEGIN_CODE" />cros flash<ph name="END_CODE" /> @@ -1477,7 +1476,7 @@ <ph name="LIST_ITEM" />ange ett anpassat lösenord för inloggning både som utvecklare och rot på systemet så att du kan logga in manuellt på enheten med SSH <ph name="END_LIST" /> <ph name="BR" /> - När felsökningsfunktionerna har aktiverats förblir de flesta av dem aktiverade även om du gör en Powerwash eller raderar data på en företagshanterad enhet. Om du vill inaktivera alla felsökningsfunktionerna helt återställer du Chrome OS (https://support.google.com/chromebook/answer/1080595). + När felsökningsfunktionerna har aktiverats förblir de flesta av dem aktiverade även om du gör en Powerwash eller raderar data på en företagshanterad enhet. Om du vill inaktivera alla felsökningsfunktionerna helt återställer du ChromeOS (https://support.google.com/chromebook/answer/1080595). <ph name="BR" /> <ph name="BR" /> Mer information om felsökningsfunktionerna finns på:<ph name="BR" /> @@ -1757,7 +1756,7 @@ <ph name="LIST_ITEM" />ange ett anpassat lösenord för inloggning både som utvecklare och rot på systemet så att du kan logga in manuellt på enheten med SSH <ph name="END_LIST" /> <ph name="BR" /> - När felsökningsfunktionerna har aktiverats förblir de flesta av dem aktiverade även om du gör en Powerwash eller raderar data på en företagshanterad enhet. Om du vill inaktivera alla felsökningsfunktionerna helt återställer du Chrome OS (https://support.google.com/chromebook/answer/1080595). + När felsökningsfunktionerna har aktiverats förblir de flesta av dem aktiverade även om du gör en Powerwash eller raderar data på en företagshanterad enhet. Om du vill inaktivera alla felsökningsfunktionerna helt återställer du ChromeOS (https://support.google.com/chromebook/answer/1080595). <ph name="BR" /> <ph name="BR" /> Mer information om felsökningsfunktionerna finns på:<ph name="BR" /> @@ -2488,7 +2487,7 @@ <translation id="2841013758207633010">Tid</translation> <translation id="2841837950101800123">Leverantör</translation> <translation id="2842013086666334835">Logga in på <ph name="NETWORK_ID" /></translation> -<translation id="2843560154284403323">Du måste uppdatera Chrome OS innan konfigureringen av Linux kan slutföras.</translation> +<translation id="2843560154284403323">Du måste uppdatera ChromeOS innan konfigureringen av Linux kan slutföras.</translation> <translation id="2843698124892775282"><ph name="MEMORY_SAVINGS" /> har frigjorts</translation> <translation id="2844169650293029770">USB-C-enhet (främre porten på vänster sida)</translation> <translation id="2844809857160214557">Visa och hantera utskriftsjobb</translation> @@ -2970,8 +2969,8 @@ <translation id="3240426699337459095">Länken har kopierats</translation> <translation id="3241638166094654466">Celler i varje rad:</translation> <translation id="3241680850019875542">Välj rotkatalogen för tillägget som ska paketeras. Om du vill uppdatera ett tillägg väljer du också den privata nyckel som ska återanvändas.</translation> -<translation id="3242289508736283383">En app med manifestattributet kiosk_only måste installeras i kioskläget i Chrome OS</translation> -<translation id="3242665648857227438">Den här profilen använder proxyinställningarna i Chrome OS.</translation> +<translation id="3242289508736283383">En app med manifestattributet kiosk_only måste installeras i kioskläget i ChromeOS</translation> +<translation id="3242665648857227438">Den här profilen använder proxyinställningarna i ChromeOS.</translation> <translation id="3243017971870859287">Läsa serienummer för ChromeOS Flex-enheter och komponenter</translation> <translation id="324366796737464147">Brusreducering</translation> <translation id="3244294424315804309">Ljud fortsatt av</translation> @@ -3441,7 +3440,7 @@ <translation id="3619294456800709762">Webbplatser kan öppna bild-i-bild automatiskt</translation> <translation id="3620136223548713675">Geolokalisering</translation> <translation id="3621202678540785336">Ingång</translation> -<translation id="3621807901162200696">Hjälp oss att förbättra funktioner och prestanda i Chrome OS</translation> +<translation id="3621807901162200696">Hjälp oss att förbättra funktioner och prestanda i ChromeOS</translation> <translation id="362266093274784978">{COUNT,plural, =1{en app}other{# appar}}</translation> <translation id="362333465072914957">Väntar på att CA ska utfärda ett certifikat</translation> <translation id="3623598555687153298">Då rensas <ph name="TOTAL_USAGE" /> data som har lagrats av webbplatserna som visas</translation> @@ -3653,7 +3652,7 @@ <translation id="3771290962915251154">Inställningen är inaktiverad eftersom föräldrakontroller används</translation> <translation id="3771294271822695279">Videofiler</translation> <translation id="3771851622616482156">Du loggas ut från den här webbplatsen, även på öppna flikar</translation> -<translation id="3772046291955677288">Jag har läst och godkänner <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Chrome och Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="3772046291955677288">Jag har läst och godkänner <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Chrome och ChromeOS<ph name="END_LINK2" />.</translation> <translation id="3774059845329307709">Serienummer</translation> <translation id="3774166835015494435">Nya bilder och aviseringar</translation> <translation id="3775432569830822555">SSL-servercertifikat</translation> @@ -3692,7 +3691,7 @@ <translation id="3798632811625902122">Bluetooth-enheten <ph name="DEVICE" /> vill ha behörighet att parkoppla.</translation> <translation id="3798670284305777884">Högtalare (inbyggd)</translation> <translation id="3799128412641261490">Inställningar för brytarstyrning</translation> -<translation id="3800828618615365228">Ytterligare villkor för Google Chrome och Chrome OS</translation> +<translation id="3800828618615365228">Ytterligare villkor för Google Chrome och ChromeOS</translation> <translation id="3802486193901166966">Det här tillägget kräver inga särskilda behörigheter och har ingen extra webbplatsåtkomst.</translation> <translation id="380329542618494757">Namn</translation> <translation id="3803345858388753269">Bildkvalitet</translation> @@ -3743,7 +3742,7 @@ <translation id="3826440694796503677">Administratören har inaktiverat möjligheten att lägga till fler Google-konton</translation> <translation id="3827774300009121996">&Helskärm</translation> <translation id="3828029223314399057">Sök efter bokmärken</translation> -<translation id="3828953470056652895">Jag har läst och godkänner <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och Chrome OS<ph name="END_LINK2" /> samt <ph name="BEGIN_LINK3" />användarvillkoren för Play<ph name="END_LINK3" />.</translation> +<translation id="3828953470056652895">Jag har läst och godkänner <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och ChromeOS<ph name="END_LINK2" /> samt <ph name="BEGIN_LINK3" />användarvillkoren för Play<ph name="END_LINK3" />.</translation> <translation id="3829530269338026191"><ph name="WINDOW_TITLE" /> – Hög minnesanvändning – <ph name="MEMORY_VALUE" /></translation> <translation id="3829765597456725595">SMB-filresurs</translation> <translation id="3830470485672984938">Använd en annan nyckel</translation> @@ -3848,7 +3847,7 @@ <translation id="3915280005470252504">Röstsökning</translation> <translation id="3916233823027929090">Säkerhetskontrollen är klar</translation> <translation id="3916445069167113093">Den här typen av fil kan skada datorn. Vill du behålla <ph name="FILE_NAME" /> ändå?</translation> -<translation id="3917184139185490151">Datorn innehåller en säker modul som används för att implementera flera viktiga säkerhetsfunktioner i Chrome OS. Besök hjälpcentret för Chromebook om du vill läsa mer: https://support.google.com/chromebook/?p=sm</translation> +<translation id="3917184139185490151">Datorn innehåller en säker modul som används för att implementera flera viktiga säkerhetsfunktioner i ChromeOS. Besök hjälpcentret för Chromebook om du vill läsa mer: https://support.google.com/chromebook/?p=sm</translation> <translation id="3917644013202553949">Det finns inte tillräckligt med lagringsutrymme för att synkronisera dina filer. Försök att frigöra utrymme.</translation> <translation id="3919145445993746351">Aktivera synkronisering om du vill ha tilläggen på alla dina datorer</translation> <translation id="3919229493046408863">Inaktivera avisering när det finns enheter i närheten</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Välj en annan mapp...</translation> <translation id="3966094581547899417">Information om surfzon</translation> <translation id="3967822245660637423">Nedladdning slutförd</translation> -<translation id="3967841595862839006">Välj språk och tangentbord</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Id</translation> <translation id="397105322502079400">Beräknar ...</translation> @@ -4137,7 +4135,7 @@ <translation id="4132969033912447558">Återuppta <ph name="FILE_NAME" /></translation> <translation id="4133076602192971179">Öppna appen och ändra lösenordet</translation> <translation id="4134838386867070505">Steg 1 av 4: Beskriv problemet</translation> -<translation id="4135746311382563554">Ytterligare användarvillkor för Google Chrome och Chrome OS</translation> +<translation id="4135746311382563554">Ytterligare användarvillkor för Google Chrome och ChromeOS</translation> <translation id="4136203100490971508">Nattljuset släcks automatiskt vid soluppgången</translation> <translation id="41365691917097717">Om du fortsätter aktiveras felsökning med ADB för Android-appar som du skapar och testar. Observera att den här åtgärden tillåter att Android-appar som inte har verifierats av Google installeras. Du måste återställa enheten till standardinställningarna för att inaktivera detta.</translation> <translation id="4137923333452716643">Markera texten som du vill öppna i läsläget</translation> @@ -4398,7 +4396,7 @@ <translation id="4354344420232759511">Webbplatser du besöker visas här</translation> <translation id="435527878592612277">Välj foto</translation> <translation id="4356100841225547054">Stäng av ljudet</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="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 ChromeOS på Listnr. Loggarna raderas permanent efter 90 dagar.</translation> <translation id="4358361163731478742">Inga appar har stöd för val av appspråk</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> @@ -4569,7 +4567,7 @@ <translation id="4482990632723642375">Nyligen stängd flik</translation> <translation id="4487489714832036847">På en Chromebook används appar i stället för vanliga program. Skaffa produktivitetsappar, underhållningsappar och mycket annat.</translation> <translation id="4488257340342212116">Får använda kameran</translation> -<translation id="4490086832405043258">Använd proxyinställningarna i Chrome OS för den här profilen.</translation> +<translation id="4490086832405043258">Använd proxyinställningarna i ChromeOS för den här profilen.</translation> <translation id="4490798467014431984">Tillägg tillåts inte på den här webbplatsen</translation> <translation id="449126573531210296">Kryptera synkroniserade lösenord med ditt Google-konto</translation> <translation id="449232563137139956">Webbplatser med bilder brukar kunna ha dem som illustrationer, t.ex. foton i en onlinebutik eller nyhetsartikel</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Skrivförslag</translation> <translation id="4513946894732546136">Feedback</translation> <translation id="4515872537870654449">Kontakta Dell för service. Dockningsstationen stängs av om fläkten inte fungerar.</translation> -<translation id="4516008165284813420">Se till att <ph name="DEVICE_TYPE" /> är ansluten till internet och försök igen. Du kan även besöka play.google.com/about/play-terms på en annan enhet.</translation> <translation id="4518840066030486079">Format för skifttangentsläget</translation> <translation id="4519331665958994620">Webbplatser får begära åtkomst till kameran</translation> <translation id="4519605771716872386">Filsynkronisering har aktiverats</translation> @@ -5288,7 +5285,7 @@ <translation id="5062930723426326933">Inloggningen misslyckades. Anslut till internet och försök igen.</translation> <translation id="5063480226653192405">Användning</translation> <translation id="5065775832226780415">Smart Lock</translation> -<translation id="5066100345385738837">Inställningar för att hantera säker DNS i Chrome OS</translation> +<translation id="5066100345385738837">Inställningar för att hantera säker DNS i ChromeOS</translation> <translation id="5066891009360243320">Den här webbplatsen har blockerats från att använda dina MIDI-enheter.</translation> <translation id="5067399438976153555">Alltid på</translation> <translation id="5067867186035333991">Fråga om <ph name="HOST" /> vill använda din mikrofon</translation> @@ -5473,7 +5470,7 @@ <translation id="5206215183583316675">Vill du radera <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Fel vid import av certifikat</translation> <translation id="5207949376430453814">Markera textmarkören</translation> -<translation id="520840839826327499"><ph name="SERVICE_NAME" /> vill kontrollera om du använder en Chrome OS-enhet som uppfyller villkoren.</translation> +<translation id="520840839826327499"><ph name="SERVICE_NAME" /> vill kontrollera om du använder en ChromeOS-enhet som uppfyller villkoren.</translation> <translation id="5208926629108082192">Information om enhetens mobilnätverk</translation> <translation id="5208988882104884956">Halvbreda</translation> <translation id="5209320130288484488">Det gick inte att hitta några enheter</translation> @@ -5622,7 +5619,7 @@ <translation id="532943162177641444">Konfigurera den trådlösa surfzonen som den här enheten ska kunna använda genom att trycka på aviseringen på din <ph name="PHONE_NAME" />.</translation> <translation id="5329858601952122676">&Ta bort</translation> <translation id="5331069282670671859">Du har inga certifikat i den här kategorin</translation> -<translation id="5331568967879689647">Systemapp i Chrome OS</translation> +<translation id="5331568967879689647">Systemapp i ChromeOS</translation> <translation id="5331975486040154427">USB-C-enhet (bakre porten på vänster sida)</translation> <translation id="5333896723098573627">Om du vill ta bort appar öppnar du Inställningar > Google Play Butik > Hantera Android-inställningar > Appar eller Apphanteraren. Tryck sedan på appen du vill avinstallera (du kanske måste svepa åt höger eller vänster för att hitta appen). Tryck sedan på Avinstallera eller Inaktivera.</translation> <translation id="5334113802138581043">Mikrofonåtkomst</translation> @@ -6869,7 +6866,7 @@ <translation id="6314819609899340042">Du har aktiverat felsökningsfunktioner på den här <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten.</translation> <translation id="6315170314923504164">Mikrofon</translation> <translation id="6315493146179903667">Flytta fram alla</translation> -<translation id="6316432269411143858">Innehåll i villkor för Google Chrome OS</translation> +<translation id="6316432269411143858">Innehåll i villkor för Google ChromeOS</translation> <translation id="6317369057005134371">Väntar på appfönstret ...</translation> <translation id="6318125393809743217">Ta med filen policies.json med principkonfigurationer.</translation> <translation id="6318407754858604988">Nedladdning påbörjad</translation> @@ -6924,7 +6921,7 @@ <translation id="6363990818884053551">Verifiera din identitet för att starta synkroniseringen</translation> <translation id="6365069501305898914">Facebook</translation> <translation id="6365411474437319296">Lägg till familj och vänner</translation> -<translation id="6367097275976877956">Vill du aktivera ChromeVox, den inbyggda skärmläsaren för Chrome OS? I så fall trycker du på blanksteg.</translation> +<translation id="6367097275976877956">Vill du aktivera ChromeVox, den inbyggda skärmläsaren för ChromeOS? I så fall trycker du på blanksteg.</translation> <translation id="6367985768157257101">Vill du ta emot med Närdelning?</translation> <translation id="6368157733310917710">Adresser och annat</translation> <translation id="6368276408895187373">Aktiverad – <ph name="VARIATION_NAME" /></translation> @@ -6963,7 +6960,7 @@ <translation id="6400360390396538896">Alltid på <ph name="ORIGIN" /></translation> <translation id="6401118106417399952">Enhetens EID är <ph name="EID_NUMBER" /> och enhetens serienummer är <ph name="SERIAL_NUMBER" />. Dessa nummer kan användas för att aktivera tjänsten.</translation> <translation id="6401458660421980302">Om du vill skicka den här fliken till en annan enhet loggar du in i Chrome på den enheten</translation> -<translation id="6401597285454423070">Datorn innehåller säkerhetsenheten TPM (Trusted Platform Module), som används för att implementera flera viktiga säkerhetsfunktioner i Chrome OS. Besök hjälpcentret för Chromebook om du vill läsa mer: https://support.google.com/chromebook/?p=tpm</translation> +<translation id="6401597285454423070">Datorn innehåller säkerhetsenheten TPM (Trusted Platform Module), som används för att implementera flera viktiga säkerhetsfunktioner i ChromeOS. Besök hjälpcentret för Chromebook om du vill läsa mer: https://support.google.com/chromebook/?p=tpm</translation> <translation id="6404511346730675251">Redigera bokmärke</translation> <translation id="6406303162637086258">Simulera omstart av webbläsaren</translation> <translation id="6406506848690869874">Synkronisera</translation> @@ -7337,7 +7334,7 @@ <translation id="6703212423117969852">Du kan försöka igen senare i Chrome.</translation> <translation id="6703254819490889819">Återställ säkerhetskopia</translation> <translation id="6703613667804166784">Den här filen kan skada dina personliga konton och sociala nätverkskonton, bland annat <ph name="USER_EMAIL" /></translation> -<translation id="6707122714992751648">Köra diagnostiska test av Chrome OS</translation> +<translation id="6707122714992751648">Köra diagnostiska test av ChromeOS</translation> <translation id="6707389671160270963">SSL-klientcertifikat</translation> <translation id="6709002550153567782">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> och 1 flik till}other{<ph name="PAGE_TITLE" /> och # flikar till}}</translation> <translation id="6709133671862442373">Nyheter</translation> @@ -7388,11 +7385,11 @@ <translation id="674632704103926902">Aktivera "tryck och dra"</translation> <translation id="67465227497040338">Visa lösenord för <ph name="DOMAIN" /></translation> <translation id="6748465660675848252">Du kan fortsätta, men endast synkroniserade uppgifter och inställningar återställs. All lokal data kommer att gå förlorad.</translation> -<translation id="6748980958975836188">Jag har läst och godkänner <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> samt <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6748980958975836188">Jag har läst och godkänner <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> samt <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och ChromeOS<ph name="END_LINK2" />.</translation> <translation id="6749473226660745022">Foton</translation> <translation id="6750757184909117990">Inaktivera mobilnätverk</translation> <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation> -<translation id="6756157672127672536">Med appen Filer kommer du snabbt åt filer som du har sparat på Google Drive, externa lagringsenheter eller din Chrome OS-enhet.</translation> +<translation id="6756157672127672536">Med appen Filer kommer du snabbt åt filer som du har sparat på Google Drive, externa lagringsenheter eller din ChromeOS-enhet.</translation> <translation id="6756643207511618722">Talmotorer</translation> <translation id="6757431299485455321">Hjälp andra enheter att hitta surfzonen.</translation> <translation id="6758056191028427665">Berätta hur vi sköter oss.</translation> @@ -7510,7 +7507,7 @@ <translation id="6826872289184051766">Verifiera via USB</translation> <translation id="6827121912381363404">Ge alla tillägg behörighet att läsa och ändra <ph name="PERMITTED_SITE" /></translation> <translation id="6827422464708099620">Välj för att visa fler alternativ</translation> -<translation id="6827517233063803343">Appar och inställningar synkroniseras på alla Chrome OS-enheter där du är inloggad på ditt Google-konto. Alternativ för synkronisering av webbläsaren finns i <ph name="LINK_BEGIN" />Chrome-inställningarna<ph name="LINK_END" />.</translation> +<translation id="6827517233063803343">Appar och inställningar synkroniseras på alla ChromeOS-enheter där du är inloggad på ditt Google-konto. Alternativ för synkronisering av webbläsaren finns i <ph name="LINK_BEGIN" />Chrome-inställningarna<ph name="LINK_END" />.</translation> <translation id="6827767090350758381">Äldre versioner av Chrome-appar öppnas inte på Windows-enheter efter december 2022. Kontakta administratören om att uppdatera till en ny version eller ta bort appen.</translation> <translation id="6828153365543658583">Begränsa inloggning till följande användare:</translation> <translation id="6828182567531805778">Ange lösenfrasen för att synkronisera data</translation> @@ -7610,7 +7607,7 @@ <translation id="6902066522699286937">Röst att förhandsgranska</translation> <translation id="6902336033320348843">Avsnittet stöds inte: <ph name="ERROR_LINE" /></translation> <translation id="6902837902700739466">Anslut enheten till domänen</translation> -<translation id="6903022061658753260">Din data synkroniseras i alla Chrome-webbläsare där du har aktiverat synkronisering för det här kontot. Synkroniseringsalternativen i Chrome OS hittar du i <ph name="LINK_BEGIN" />inställningarna för Chrome OS<ph name="LINK_END" />.</translation> +<translation id="6903022061658753260">Din data synkroniseras i alla Chrome-webbläsare där du har aktiverat synkronisering för det här kontot. Synkroniseringsalternativen i ChromeOS hittar du i <ph name="LINK_BEGIN" />inställningarna för ChromeOS<ph name="LINK_END" />.</translation> <translation id="6903590427234129279">Öppna alla (<ph name="URL_COUNT" />)</translation> <translation id="6903907808598579934">Aktivera synkronisering</translation> <translation id="6903916726032521638">Sök efter <ph name="QUERY_CLUSTER_NAME" /></translation> @@ -7623,7 +7620,7 @@ <translation id="691289340230098384">Inställningar för textning</translation> <translation id="6914812290245989348">Visa inga varningar innan du besöker osäkra webbplatser</translation> <translation id="6916590542764765824">Hantera tillägg</translation> -<translation id="6918677045355889289">Uppdatering av Chrome OS krävs</translation> +<translation id="6918677045355889289">Uppdatering av ChromeOS krävs</translation> <translation id="6919354101107095996">Försök att logga in på webbplatsen. Ladda sedan ned igen</translation> <translation id="6919952941889172531">Vill du även aktivera Förbättrad säker webbsökning för den här Chrome-profilen?</translation> <translation id="6920989436227028121">Öppna som en vanlig flik</translation> @@ -7667,7 +7664,7 @@ <translation id="6954936693361896459">Casta den här fliken i stället</translation> <translation id="6955446738988643816">Kontrollera popup</translation> <translation id="6955535239952325894">Inställningen är inaktiverad för hanterade webbläsare</translation> -<translation id="6955698182324067397">Du aktiverar felsökningsfunktioner i Chrome OS som konfigurerar sshd daemon och aktiverar start från USB-enheter.</translation> +<translation id="6955698182324067397">Du aktiverar felsökningsfunktioner i ChromeOS som konfigurerar sshd daemon och aktiverar start från USB-enheter.</translation> <translation id="6955893174999506273">Tilldela 1 brytare till</translation> <translation id="6957044667612803194">Säkerhetsnyckeln har inte stöd för pinkoder</translation> <translation id="6960133692707095572">Besök utan biljett</translation> @@ -8827,8 +8824,8 @@ <translation id="7849264908733290972">Öppna &bild i ny flik</translation> <translation id="784934925303690534">Tidsintervall</translation> <translation id="7849656116606005620">Påminnelse: Spårningsskydd är aktiverat</translation> -<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />Du kan tillåta att rapporter skickas till oss automatiskt från Chrome OS-enheter, vilket hjälper oss att prioritera vad som bör åtgärdas och förbättras i Chrome OS. Dessa rapporter kan innehålla information som när Chrome OS kraschar, vilka funktioner du använder, hur mycket minne som du brukar använda, diagnostikdata om Android-appar och data om användning. Viss samlad data används även till att förbättra appar från Google och produkter från Googles partners, till exempel Android-utvecklare.<ph name="END_PARAGRAPH1" /> - <ph name="BEGIN_PARAGRAPH2" />Du kan när som helst ge eller dra tillbaka ditt tillstånd till att rapporterna skickas. Detta gör du i inställningarna på Chrome OS-enheten. Om du administrerar en domän kan du ändra inställningen i administratörskonsolen.<ph name="END_PARAGRAPH2" /> +<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />Du kan tillåta att rapporter skickas till oss automatiskt från ChromeOS-enheter, vilket hjälper oss att prioritera vad som bör åtgärdas och förbättras i ChromeOS. Dessa rapporter kan innehålla information som när ChromeOS kraschar, vilka funktioner du använder, hur mycket minne som du brukar använda, diagnostikdata om Android-appar och data om användning. Viss samlad data används även till att förbättra appar från Google och produkter från Googles partners, till exempel Android-utvecklare.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Du kan när som helst ge eller dra tillbaka ditt tillstånd till att rapporterna skickas. Detta gör du i inställningarna på ChromeOS-enheten. Om du administrerar en domän kan du ändra inställningen i administratörskonsolen.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Om inställningen Webb- och appaktivitet har aktiverats för ditt Google-konto kan Android-datan sparas i Google-kontot. Du kan visa din data, radera den och ändra inställningarna på account.google.com.<ph name="END_PARAGRAPH3" /></translation> <translation id="7851021205959621355"><ph name="BEGIN_BOLD" />Obs!<ph name="END_BOLD" /> Någon med en liknande röst eller en inspelning av din röst kan få åtkomst till dina personliga resultat eller assistenten. För att spara batteri kan du välja att ”Hey Google” endast är aktiverat när enheten är ansluten till en strömkälla. Detta gör du i Assistent-inställningarna.</translation> <translation id="7851457902707056880">Inloggning kan bara göras med ägarkontot. Starta om och logga in med ägarkontot. Datorn kommer att startas om automatiskt om 30 sekunder.</translation> @@ -9160,7 +9157,7 @@ <ph name="BEGIN_PARAGRAPH3" />Appdata är all data som har sparats i en app (utifrån utvecklarens inställningar), till exempel kontakter, meddelanden och foton.<ph name="END_PARAGRAPH3" /> <ph name="BEGIN_PARAGRAPH4" />Säkerhetskopierad data tar inte upp något av ditt lagringsutrymme på Drive.<ph name="END_PARAGRAPH4" /> <ph name="BEGIN_PARAGRAPH5" />Du kan inaktivera den här tjänsten i inställningarna.<ph name="END_PARAGRAPH5" /></translation> -<translation id="8095439028686936591">Chrome OS är uppdaterat</translation> +<translation id="8095439028686936591">ChromeOS är uppdaterat</translation> <translation id="8096740438774030488">Viloläge vid batteridrift</translation> <translation id="80974698889265265">Pinkoderna matchar inte</translation> <translation id="809792523045608178"><ph name="IDS_SHORT_PRODUCT_NAME" /> använder proxyinställningar från ett tillägg</translation> @@ -9222,7 +9219,7 @@ <translation id="8146177459103116374">Om du redan är registrerad på den här enheten kan du <ph name="LINK2_START" />logga in som en befintlig användare<ph name="LINK2_END" />.</translation> <translation id="8146287226035613638">Lägg till och rangordna önskade språk. När det är möjligt visas text på webbplatser på de önskade språken. Dessa inställningar synkroniseras med inställningarna för webbläsaren. <ph name="BEGIN_LINK_LEARN_MORE" />Läs mer<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="8146793085009540321">Inloggningen misslyckades. Kontakta administratören eller försök igen.</translation> -<translation id="8147346945017130012">Skicka felrapporter samt diagnostik- och användningsdata automatiskt till Google och hjälp oss att förbättra funktioner och prestanda i Chrome och Chrome OS.</translation> +<translation id="8147346945017130012">Skicka felrapporter samt diagnostik- och användningsdata automatiskt till Google och hjälp oss att förbättra funktioner och prestanda i Chrome och ChromeOS.</translation> <translation id="8147900440966275470"><ph name="NUM" /> flikar hittades</translation> <translation id="814870937590541483">Fler åtgärder för Google Drive-filer</translation> <translation id="8148760431881541277">Begränsa inloggning</translation> @@ -9568,7 +9565,7 @@ <translation id="8412136526970428322">Behörighet till <ph name="PERMISSION" /> och <ph name="COUNT" /> till har tillåtits</translation> <translation id="8412682423093430245">Aktivera synkronisering av historiken i inställningarna om du vill låta Chrome föreslå flikgrupper och organisera dina flikar</translation> <translation id="8413795581997394485">Skyddar mot skadliga webbplatser, nedladdningar och tillägg. När du besöker en webbplats skickas en obfuskerad del av webbadressen till Google via en integritetsserver som döljer din IP-adress. Om en webbplats gör något misstänkt skickas också fullständiga webbadresser och delar av sidinnehållet.</translation> -<translation id="8413956290606243087">Vill du aktivera ChromeVox, den inbyggda skärmläsaren för Chrome OS?</translation> +<translation id="8413956290606243087">Vill du aktivera ChromeVox, den inbyggda skärmläsaren för ChromeOS?</translation> <translation id="8414249071344507766">Minnen döljs i två dagar</translation> <translation id="8414396119627470038">Logga in på <ph name="SITE_ETLD_PLUS_ONE" /> med <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> <translation id="8414685983518053656">Anteckningar</translation> @@ -9816,7 +9813,7 @@ <translation id="8624315169751085215">Kopiera till Urklipp</translation> <translation id="8624354461147303341">Få erbjudanden</translation> <translation id="8624944202475729958"><ph name="PROFILE_NAME" />: <ph name="ERROR_DESCRIPTION" /></translation> -<translation id="8625124982056504555">Läsa serienummer för Chrome OS-enheter och komponenter</translation> +<translation id="8625124982056504555">Läsa serienummer för ChromeOS-enheter och komponenter</translation> <translation id="862542460444371744">&Tillägg</translation> <translation id="8625663000550647058">Får inte använda mikrofonen</translation> <translation id="8625916342247441948">Tillåt inte att webbplatser ansluter till HID-enheter</translation> @@ -9892,7 +9889,7 @@ <translation id="8673026256276578048">Sök på webben ...</translation> <translation id="867329473311423817">Tillåts hantera fönster på alla skärmar</translation> <translation id="8673383193459449849">Serverfel</translation> -<translation id="8674903726754070732">Tyvärr är din dator konfigurerad med ett felaktigt maskinvaru-ID. Detta förhindrar att Chrome OS uppdateras med de senaste säkerhetskorrigeringarna och datorn <ph name="BEGIN_BOLD" />kan vara utsatt för skadlig programvara<ph name="END_BOLD" />.</translation> +<translation id="8674903726754070732">Tyvärr är din dator konfigurerad med ett felaktigt maskinvaru-ID. Detta förhindrar att ChromeOS uppdateras med de senaste säkerhetskorrigeringarna och datorn <ph name="BEGIN_BOLD" />kan vara utsatt för skadlig programvara<ph name="END_BOLD" />.</translation> <translation id="8675704450909805533">Installationsprogram hittade ingen giltig destination för installationen av <ph name="DEVICE_OS" />.</translation> <translation id="8676152597179121671">{COUNT,plural, =1{Video}other{# videor}}</translation> <translation id="8676276370198826499">Registrera dig för <ph name="SITE_ETLD_PLUS_ONE" /> med <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> @@ -10135,7 +10132,7 @@ <translation id="8855977033756560989">Denna Chromebook Enterprise-enhet levereras med Chrome Enterprise Upgrade. Registrera enheten med ett konto i Google Administratörskonsol om du vill dra nytta av företagsfunktionerna.</translation> <translation id="8856028055086294840">Återställa appar och sidor</translation> <translation id="885701979325669005">Lagring</translation> -<translation id="885746075120788020">När du är inloggad med ditt Google-konto har du tillgång till dina sparade inställningar och din sparade aktivitet på alla Chrome OS-enheter. Du kan välja vad som ska synkroniseras i inställningarna.</translation> +<translation id="885746075120788020">När du är inloggad med ditt Google-konto har du tillgång till dina sparade inställningar och din sparade aktivitet på alla ChromeOS-enheter. Du kan välja vad som ska synkroniseras i inställningarna.</translation> <translation id="8858010757866773958">{NUM_SUB_APP_INSTALLS,plural, =1{Vill du installera appen?}other{Vill du installera apparna?}}</translation> <translation id="8858369206579825206">Integritetsinställningar</translation> <translation id="8859174528519900719">Underram: <ph name="SUBFRAME_SITE" /></translation> @@ -10276,7 +10273,7 @@ <translation id="8966809848145604011">Andra profiler</translation> <translation id="8967427617812342790">Lägg till i läslistan</translation> <translation id="8967548289042494261">Ta bort <ph name="VM_NAME" /></translation> -<translation id="8968527460726243404">Systemavbildningsskrivare för Chrome OS</translation> +<translation id="8968527460726243404">Systemavbildningsskrivare för ChromeOS</translation> <translation id="8968766641738584599">Spara kortet</translation> <translation id="8968906873893164556">Välj det konto som du vill använda för konfigureringen</translation> <translation id="8970887620466824814">Något gick fel.</translation> @@ -10391,7 +10388,7 @@ <translation id="9037965129289936994">Visa original</translation> <translation id="9038489124413477075">Namnlös mapp</translation> <translation id="9039014462651733343">{NUM_ATTEMPTS,plural, =1{Du har ett försök kvar.}other{Du har # försök kvar.}}</translation> -<translation id="9040473193163777637">Vill du aktivera ChromeVox, den inbyggda skärmläsaren för Chrome OS? I så fall håller du båda volymknapparna nedtryckta i fem sekunder.</translation> +<translation id="9040473193163777637">Vill du aktivera ChromeVox, den inbyggda skärmläsaren för ChromeOS? I så fall håller du båda volymknapparna nedtryckta i fem sekunder.</translation> <translation id="9040661932550800571">Vill du uppdatera lösenordet för <ph name="ORIGIN" />?</translation> <translation id="9041692268811217999">Administratören har inaktiverat åtkomsten till lokala filer på datorn</translation> <translation id="904224458472510106">Åtgärden kan inte ångras</translation> @@ -10617,7 +10614,7 @@ <translation id="922152298093051471">Anpassa Chrome</translation> <translation id="923467487918828349">Visa alla</translation> <translation id="923900195646492191">{NUM_EXTENSIONS,plural, =1{Öppna Tillägg för att hantera den}other{Öppna Tillägg för att hantera dem}}</translation> -<translation id="924818813611903184">Hantera språk i inställningarna för Chrome OS</translation> +<translation id="924818813611903184">Hantera språk i inställningarna för ChromeOS</translation> <translation id="925270020047573546">Den här enheten har inte stöd för att casta ljud från skrivbordet.</translation> <translation id="925575170771547168"><ph name="TOTAL_USAGE" /> data som har lagrats av webbplatser raderas</translation> <translation id="930193457234051160">WebUI-uppdatering för Chrome 2023</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 43868de..ff2ccee 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Imeunganishwa kwenye simu ya Android</translation> <translation id="1523279371236772909">Ilitazamwa mwezi uliopita</translation> <translation id="1523978563989812243">Mitambo ya kusoma maandishi kwa sauti</translation> -<translation id="1524430321211440688">Kibodi</translation> <translation id="1524563461097350801">Hapana</translation> <translation id="1525740877599838384">Tumia Wi-Fi pekee ili kutambua mahali</translation> <translation id="152629053603783244">Zima Kisha Uwashe Linux</translation> @@ -3920,7 +3919,6 @@ <translation id="3966072572894326936">Chagua folda nyingine...</translation> <translation id="3966094581547899417">Maelezo ya mtandao pepe</translation> <translation id="3967822245660637423">Imemaliza kupakua</translation> -<translation id="3967841595862839006">Chagua lugha na kibodi yako</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Kitambulisho</translation> <translation id="397105322502079400">Inakokotoa...</translation> @@ -4600,7 +4598,6 @@ <translation id="4513872120116766993">Utabiri wa maandishi</translation> <translation id="4513946894732546136">Mwitiko</translation> <translation id="4515872537870654449">Wasiliana na Dell ili upate huduma. Kituo kitajifunga ikiwa feni haifanyi kazi.</translation> -<translation id="4516008165284813420">Hakikisha kuwa umeunganisha <ph name="DEVICE_TYPE" /> kwenye intaneti kisha ujaribu tena. Unaweza pia kutembelea play.google.com/about/play-terms kwenye kifaa kingine.</translation> <translation id="4518840066030486079">Mtindo wa Hali ya Kitufe cha Shift</translation> <translation id="4519331665958994620">Tovuti zinaweza kuomba ruhusa ya kutumia kamera yako</translation> <translation id="4519605771716872386">Kipengele cha kusawazisha faili kimewashwa</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 308a52f..06113f12 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Android மொபைலுடன் இணைக்கப்பட்டுள்ளது</translation> <translation id="1523279371236772909">கடந்த மாதத்தில் பார்வையிடப்பட்டது</translation> <translation id="1523978563989812243">’உரையிலிருந்து பேச்சு’ இன்ஜின்கள்</translation> -<translation id="1524430321211440688">கீபோர்டு</translation> <translation id="1524563461097350801">வேண்டாம்</translation> <translation id="1525740877599838384">இருப்பிடத்தைக் கண்டறிய, வைஃபையை மட்டும் பயன்படுத்து</translation> <translation id="152629053603783244">Linuxஸை மீண்டும் தொடங்கு</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">வேறு ஃபோல்டரைத் தேர்வு செய்க...</translation> <translation id="3966094581547899417">ஹாட்ஸ்பாட் விவரங்கள்</translation> <translation id="3967822245660637423">பதிவிறக்கம் முடிந்தது</translation> -<translation id="3967841595862839006">மொழி & கீபோர்டைத் தேர்ந்தெடுக்கவும்</translation> <translation id="3968739731834770921">கனா</translation> <translation id="3970114302595058915">ஐடி</translation> <translation id="397105322502079400">கணக்கிடுகிறது...</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">சொல் கணிப்புகள்</translation> <translation id="4513946894732546136">கருத்து</translation> <translation id="4515872537870654449">சிக்கலை சரிசெய்ய Dell நிறுவனத்தைத் தொடர்பு கொள்ளவும். ஃபேன் வேலை செய்யவில்லை எனில் டாக்கின் இயக்கம் நிறுத்தப்படும்.</translation> -<translation id="4516008165284813420">இணையத்துடன் <ph name="DEVICE_TYPE" /> இணைக்கப்பட்டுள்ளதை உறுதிசெய்துகொண்டு மீண்டும் முயலவும். வேறொரு சாதனத்திலும் play.google.com/about/play-terms என்ற பக்கத்தைப் பார்க்கலாம்.</translation> <translation id="4518840066030486079">Shift பட்டன் பயன்முறை ஸ்டைல்</translation> <translation id="4519331665958994620">கேமராவைப் பயன்படுத்த முயலும்போது தளங்கள் அனுமதி கேட்க வேண்டும்</translation> <translation id="4519605771716872386">ஃபைல் ஒத்திசைவு இயக்கப்பட்டுள்ளது</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 351622e..735c71d 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -684,7 +684,6 @@ <translation id="1521933835545997395">Android ఫోన్కు కనెక్ట్ చేయబడింది</translation> <translation id="1523279371236772909">గత నెలలో చూశారు</translation> <translation id="1523978563989812243">టెక్ట్స్-టు-స్పీచ్ ఇంజిన్లు</translation> -<translation id="1524430321211440688">కీబోర్డ్</translation> <translation id="1524563461097350801">వద్దు, ధన్యవాదాలు</translation> <translation id="1525740877599838384">స్థానాన్ని గుర్తించడానికి Wi-Fiని మాత్రమే ఉపయోగించండి</translation> <translation id="152629053603783244">Linuxను రీస్టార్ట్ చేయండి</translation> @@ -3935,7 +3934,6 @@ <translation id="3966072572894326936">మరొక ఫోల్డర్ను ఎంచుకోండి...</translation> <translation id="3966094581547899417">హాట్స్పాట్ వివరాలు</translation> <translation id="3967822245660637423">డౌన్లోడ్ పూర్తయింది</translation> -<translation id="3967841595862839006">మీ భాష & కీబోర్డ్ను ఎంచుకోండి</translation> <translation id="3968739731834770921">కన</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">గణిస్తోంది...</translation> @@ -4620,7 +4618,6 @@ <translation id="4513872120116766993">సూచనాత్మక వ్రాత</translation> <translation id="4513946894732546136">ఫీడ్బ్యాక్</translation> <translation id="4515872537870654449">సేవ పొందడానికి డెల్ను సంప్రదించండి. ఫ్యాన్ పని చేయలేదంటే, ఈ డాక్ షట్ డౌన్ అవుతుంది.</translation> -<translation id="4516008165284813420">మీ <ph name="DEVICE_TYPE" /> పరికరం ఇంటర్నెట్కు కనెక్ట్ అయ్యి ఉందని నిర్ధారించుకుని, మళ్లీ ట్రై చేయండి. మరొక పరికరంలో మీరు play.google.com/about/play-terms లింక్కు కూడా వెళ్లవచ్చు.</translation> <translation id="4518840066030486079">Shift కీ మోడ్ స్టయిల్</translation> <translation id="4519331665958994620">మీ కెమెరాను ఉపయోగించడానికి సైట్లు అడగవచ్చు</translation> <translation id="4519605771716872386">ఫైల్ సింక్ ఆన్ చేయబడింది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 22f5c32e5..195d7ed 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">เชื่อมต่อกับโทรศัพท์ Android แล้ว</translation> <translation id="1523279371236772909">ดูในเดือนที่ผ่านมา</translation> <translation id="1523978563989812243">เครื่องมือการอ่านออกเสียงข้อความ</translation> -<translation id="1524430321211440688">แป้นพิมพ์</translation> <translation id="1524563461097350801">ไม่เป็นไร ขอบคุณ</translation> <translation id="1525740877599838384">ใช้ Wi-Fi เพื่อระบุตำแหน่งเท่านั้น</translation> <translation id="152629053603783244">รีสตาร์ท Linux</translation> @@ -2203,7 +2202,7 @@ <translation id="2643698698624765890">จัดการส่วนขยายของคุณโดยคลิกที่ "ส่วนขยาย" ในเมนู "หน้าต่าง"</translation> <translation id="2645047101481282803">อุปกรณ์ของคุณจัดการโดย <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">กำลังแคสต์แท็บนี้ไปยัง <ph name="DEVICE_NAME" /></translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">ตาบอดสีแดง</translation> <translation id="2649045351178520408">Base64-encoded ASCII, กลุ่มใบรับรอง (Certificate Chain)</translation> <translation id="265156376773362237">การโหลดล่วงหน้าแบบมาตรฐาน</translation> @@ -3908,7 +3907,6 @@ <translation id="3966072572894326936">เลือกโฟลเดอร์อื่น...</translation> <translation id="3966094581547899417">รายละเอียดของฮอตสปอต</translation> <translation id="3967822245660637423">ดาวน์โหลดเสร็จสมบูรณ์</translation> -<translation id="3967841595862839006">เลือกภาษาและแป้นพิมพ์</translation> <translation id="3968739731834770921">คะนะ</translation> <translation id="3970114302595058915">รหัส</translation> <translation id="397105322502079400">กำลังคำนวณ...</translation> @@ -4589,7 +4587,6 @@ <translation id="4513872120116766993">การเขียนแบบช่วยคาดเดา</translation> <translation id="4513946894732546136">ข้อเสนอแนะ</translation> <translation id="4515872537870654449">ติดต่อ Dell เพื่อส่งซ่อม แท่นชาร์จจะปิดหากพัดลมไม่ทำงาน</translation> -<translation id="4516008165284813420">ตรวจสอบว่า <ph name="DEVICE_TYPE" /> เชื่อมต่ออินเทอร์เน็ตแล้วลองอีกครั้ง หรือไปที่ play.google.com/about/play-terms บนอุปกรณ์อื่นก็ได้</translation> <translation id="4518840066030486079">รูปแบบโหมดแป้น Shift</translation> <translation id="4519331665958994620">เว็บไซต์ขอใช้กล้องของคุณได้</translation> <translation id="4519605771716872386">การซิงค์ไฟล์เปิดอยู่</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 308e54e..4c792f18 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">Android telefona bağlanıldı</translation> <translation id="1523279371236772909">Geçen ay görüntülendi</translation> <translation id="1523978563989812243">Metin okuma motorları</translation> -<translation id="1524430321211440688">Klavye</translation> <translation id="1524563461097350801">Hayır, Teşekkürler</translation> <translation id="1525740877599838384">Konumu belirlemek için yalnızca kablosuz ağ kullan</translation> <translation id="152629053603783244">Linux'u yeniden başlat</translation> @@ -3906,7 +3905,6 @@ <translation id="3966072572894326936">Başka bir klasör seçin...</translation> <translation id="3966094581547899417">Hotspot ayrıntıları</translation> <translation id="3967822245660637423">İndirme tamamlandı</translation> -<translation id="3967841595862839006">Dilinizi ve klavyenizi seçin</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">Kimlik</translation> <translation id="397105322502079400">Hesaplanıyor...</translation> @@ -4587,7 +4585,6 @@ <translation id="4513872120116766993">Tahmine dayalı yazım</translation> <translation id="4513946894732546136">Geri Bildirim</translation> <translation id="4515872537870654449">Servis için Dell ile iletişime geçin. Fan çalışmıyorsa yuva kapanır.</translation> -<translation id="4516008165284813420"><ph name="DEVICE_TYPE" /> cihazınızın internete bağlı olduğundan emin olup tekrar deneyin. Ayrıca, başka bir cihazda play.google.com/about/play-terms adresini de ziyaret edebilirsiniz.</translation> <translation id="4518840066030486079">Üst Karakter Tuşu Mod Stili</translation> <translation id="4519331665958994620">Siteler kameranızı kullanmak isteyebilir</translation> <translation id="4519605771716872386">Dosya senkronizasyonu açık</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 9a2dfd1..10848ea 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -685,7 +685,6 @@ <translation id="1521933835545997395">Підключено до телефона Android</translation> <translation id="1523279371236772909">Переглянуто минулого місяця</translation> <translation id="1523978563989812243">Системи синтезу мовлення</translation> -<translation id="1524430321211440688">Клавіатура</translation> <translation id="1524563461097350801">Ні, дякую</translation> <translation id="1525740877599838384">Визначати місцезнаходження лише за допомогою Wi-Fi</translation> <translation id="152629053603783244">Перезапустити Linux</translation> @@ -2221,7 +2220,7 @@ <translation id="2643698698624765890">Керуйте своїми розширеннями, натиснувши вкладку "Розширення" в меню Window (Вікно).</translation> <translation id="2645047101481282803">Вашим пристроєм керує <ph name="PROFILE_NAME" /></translation> <translation id="2645388244376970260">Ця вкладка транслюється на пристрій "<ph name="DEVICE_NAME" />"</translation> -<translation id="2645435784669275700">ОС Chrome</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">Протаномалія</translation> <translation id="2649045351178520408">ASCII Base64-кодування, ланцюжок сертифікатів</translation> <translation id="265156376773362237">Звичайне попереднє завантаження</translation> @@ -3230,7 +3229,7 @@ <translation id="3446274660183028131">Щоб установити Windows, запустіть додаток Parallels Desktop.</translation> <translation id="344630545793878684">Переглядати ваші дані на декількох веб-сайтах</translation> <translation id="3446548199318150462">Вмикає новий дизайн Сhrome для комп’ютера. Також потрібно ввімкнути бічну панель "Налаштувати Chrome".</translation> -<translation id="3447644283769633681">Заблокувати всі файли cookie третіх сторін</translation> +<translation id="3447644283769633681">Заблокувати всі сторонні файли cookie</translation> <translation id="3447797901512053632">Вкладка "<ph name="TAB_NAME" />" транслюється на пристрій "<ph name="DEVICE_NAME" />"</translation> <translation id="3448492834076427715">Оновити обліковий запис</translation> <translation id="3449393517661170867">Нове вікно з вкладками</translation> @@ -3926,7 +3925,6 @@ <translation id="3966072572894326936">Вибрати іншу папку...</translation> <translation id="3966094581547899417">Відомості про точку доступу</translation> <translation id="3967822245660637423">Завантажено</translation> -<translation id="3967841595862839006">Виберіть мову та клавіатуру</translation> <translation id="3968739731834770921">Кана</translation> <translation id="3970114302595058915">ІДЕНТИФІКАТОР</translation> <translation id="397105322502079400">Обчислення...</translation> @@ -4608,7 +4606,6 @@ <translation id="4513872120116766993">Передбачення тексту</translation> <translation id="4513946894732546136">Відгуки</translation> <translation id="4515872537870654449">Зверніться в Dell за обслуговуванням. Док-станція припинить роботу, якщо вентилятор не працює.</translation> -<translation id="4516008165284813420">Переконайтеся, що <ph name="DEVICE_TYPE" /> підключено до Інтернету, і повторіть спробу. Ви також можете відкрити сторінку play.google.com/about/play-terms на іншому пристрої.</translation> <translation id="4518840066030486079">Стиль режиму клавіші Shift</translation> <translation id="4519331665958994620">Сайти можуть просити доступ до камери</translation> <translation id="4519605771716872386">Синхронізацію файлів увімкнено</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index b21d2808..ff87617 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -341,6 +341,7 @@ <translation id="1251578593170406502">موبائل ڈیٹا نیٹ ورکس کو اسکین کیا جا رہا ہے...</translation> <translation id="125220115284141797">ڈیفالٹ</translation> <translation id="1252219782845132919">گروپ چھپائیں</translation> +<translation id="1252714168533640068">گروپ کو دوبارہ کھولنے کے لیے، گروپ کے نام پر کلک کریں</translation> <translation id="1252987234827889034">پروفائل کی خرابی پیش آگئی</translation> <translation id="1253664522045778676">نتیجہ پر کلک کریں اور صفحہ آپ کے موجودہ ٹیب میں کھلے گا</translation> <translation id="1254593899333212300">براہ راست انٹرنیٹ کنکشن</translation> @@ -621,6 +622,7 @@ <translation id="1476347941828409626">Chrome پروفائلز کا &نظم کریں</translation> <translation id="1476607407192946488">&زبان کی ترتیبات</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> آپ سے اپنا اسمارٹ کارڈ داخل کئے رکھنے کا تقاضا کرتا ہے۔</translation> +<translation id="1477645000789043442">آپ کے کھلے ٹیبز کی بنیاد پر خودکار طور پر ٹیب گروپس تخلیق کرتی ہے۔ اس خصوصیت کو استعمال کرنے کے لیے، ٹیب پر دائیں کلک کریں اور ملتے جلتے ٹیبز کو منظم کریں پر کلک کریں۔</translation> <translation id="1477654881618305065">آپ کی تنظیم آپ کو اس مواد کا اشتراک کرنے کی اجازت نہیں دیتی ہے۔ اگر آپ کو مدد درکار ہے تو اپنے منتظم سے رابطہ کریں۔</translation> <translation id="1478340334823509079">تفصیلات: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">انسٹالیشن فعال نہیں ہے</translation> @@ -679,7 +681,6 @@ <translation id="1521933835545997395">Android فون سے منسلک ہے</translation> <translation id="1523279371236772909">پچھلے مہینے میں دیکھا گیا</translation> <translation id="1523978563989812243">ٹیکسٹ ٹو اسپیچ کے انجنز</translation> -<translation id="1524430321211440688">کی بورڈ</translation> <translation id="1524563461097350801">نہیں شکریہ</translation> <translation id="1525740877599838384">مقام کا تعین کرنے کے لیے صرف Wi-Fi کا استعمال کریں</translation> <translation id="152629053603783244">Linux ری اسٹارٹ کریں</translation> @@ -878,6 +879,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">مقام کا تعین کرنے کے لیے Wi‑Fi یا موبائل نیٹ ورکس کا استعمال کریں</translation> <translation id="164936512206786300">بلوٹوتھ آلہ کا جوڑا ختم کریں</translation> +<translation id="1650407365859096313">نئے ٹیب میں کھلتا ہے، اجازت <ph name="PERMISSION_STATE" /> ہے</translation> <translation id="1650801028905250434">'میری ڈرائیو' میں موجود آپ کی فائلیں آپ کے Chromebook سے خودکار طور پر مطابقت پذیر ہو جائیں گی تاکہ آپ انٹرنیٹ کنکشن کے بغیر ان تک رسائی حاصل کر سکیں۔ آپ اسے ترتیبات > فائلز میں کسی بھی وقت تبدیل کر سکتے ہیں۔</translation> <translation id="1651008383952180276">آپ کو وہی پاس فریز دوبار درج کرنا ہوگا</translation> <translation id="1651609627703324721">یہ ٹیب ایک ہیڈ سیٹ پر VR مواد پیش کر رہا ہے</translation> @@ -1114,6 +1116,7 @@ <translation id="1828901632669367785">سسٹم ڈائیلاگ کا استعمال کرکے پرنٹ کریں…</translation> <translation id="1829129547161959350">پینگوئن</translation> <translation id="1829192082282182671">زوم &آؤٹ کریں</translation> +<translation id="182973053761690772">غروب آفتاب کا شیڈول</translation> <translation id="1830550083491357902">سائن ان نہیں</translation> <translation id="1831848493690504725">ہم منسلک نیٹ ورک کے ذریعے Google تک نہیں پہنچ سکتے۔ کسی مختلف نیٹ ورک کا انتخاب کرنے یا اپنے نیٹ ورک کی ترتیبات یا پراکسی ترتیبات (اگر آپ پراکسی استعمال کر رہے ہیں) کو چیک کرنے کی کوشش کریں۔</translation> <translation id="1832459821645506983">ہاں، میں تیار ہوں</translation> @@ -1170,6 +1173,7 @@ <translation id="1871615898038944731">آپ کا <ph name="DEVICE_TYPE" /> اپ ٹو ڈیٹ ہے</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> کے لیے اجازتوں کو دوبارہ اجازت دیں</translation> <translation id="1874248162548993294">کوئی بھی اشتہار دکھانے کی اجازت ہے</translation> +<translation id="1874794096607967241">کیمرے کی اجازت اور سسٹم سروسز کے ساتھ ایپس اور ویب سائٹس تک رسائی کی اجازت دیں</translation> <translation id="1874874185178737347">ٹیبز کو منظم کریں</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ٹیب کو دوسری ونڈو میں منتقل کریں}other{ٹیبز کو دوسری ونڈو میں منتقل کریں}}</translation> <translation id="1875387611427697908">اس کو صرف <ph name="CHROME_WEB_STORE" /> سے شامل کیا جا سکتا ہے</translation> @@ -1209,6 +1213,7 @@ <translation id="1901303067676059328">&سبھی کو منتخب کریں</translation> <translation id="1903542130902305074">سیٹ اپ کریں</translation> <translation id="1904580727789512086">آپ کے ملاحظہ کردہ URLs آپ کے Google اکاؤنٹ میں محفوظ ہوتے ہیں</translation> +<translation id="1904603806662441960">Chrome میں سائٹ کے کیمرے کی اجازتوں کا نظم کریں</translation> <translation id="1905375423839394163">Chromebook آلہ کا نام</translation> <translation id="1906181697255754968">سائٹس عام طور پر آپ کے آلہ پر موجود فائلز اور فولڈز تک آپ کا کام خودکار طور پر محفوظ کرنے جیسی خصوصیات کے لیے رسائی کرتی ہیں</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome ویب اسٹور<ph name="END_LINK" /> پر مزید ایکسٹینشنز اور تھیمز دریافت کریں</translation> @@ -1349,6 +1354,7 @@ <translation id="200928901437634269">اپنے بچے کا Google اکاؤنٹ یا اسکول اکاؤنٹ استعمال کریں۔ آپ پیرنٹل کنٹرولز بھی سیٹ کر سکتے ہیں۔</translation> <translation id="2009590708342941694">ایموجی ٹول</translation> <translation id="2010501376126504057">موافق آلات</translation> +<translation id="201217432804812273">"گروپ محفوظ کریں" کو آن کریں</translation> <translation id="2012935757369720523">فائل حذف کریں</translation> <translation id="2013550551806600826">اسے آزمائیں ترتیبات کو آن یا آف کریں، پھر ٹیسٹ ایریا میں اپنے ٹچ پیڈ پر دو انگلیوں کی مدد سے اسکرول کریں۔ آپ بعد میں اسے ترتیبات > آلہ > ماؤس اور ٹچ پیڈ میں بھی دیکھ سکتے ہیں۔</translation> <translation id="2015232545623037616">PC اور Chromecast ایک ہی Wi-Fi نیٹ ورک پر</translation> @@ -1771,6 +1777,7 @@ <translation id="2314165183524574721">موجودہ نظر آنے کی ترتیب پوشیدہ ہے</translation> <translation id="2314774579020744484">صفحات کا ترجمہ کرتے وقت استعمال کی جانے والی زبان</translation> <translation id="2316129865977710310">نہیں، شکریہ</translation> +<translation id="2316433409811863464">ایپ کی سلسلہ بندی</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% مکمل</translation> <translation id="2318143611928805047">کاغذ کا سائز</translation> <translation id="2318817390901984578">Android ایپس استعمال کرنے کیلئے، اپنے <ph name="DEVICE_TYPE" /> کو چارج اور اپ ڈیٹ کریں۔</translation> @@ -1957,6 +1964,7 @@ <translation id="2454206500483040640">تقسیم کی گئی</translation> <translation id="2454247629720664989">کلیدی لفظ</translation> <translation id="2454524890947537054">ویب کی درخواست کو منظوری دیں؟</translation> +<translation id="2454913962395846391">خودکار ٹائم زون</translation> <translation id="245650153866130664">خودکار طور پر ٹکٹ ریفریش کرنے کے لیے “پاس ورڈ یاد رکھیں” کو نشان زد کریں۔ آپ کا پاس ورڈ صرف آپ کے آلہ میں محفوظ ہوگا۔</translation> <translation id="2456794251167091176">درآمد مکمل ہو گئی</translation> <translation id="2456827790665612305">سائٹ کی پیروی ختم کریں</translation> @@ -2915,6 +2923,7 @@ <translation id="3202499879214571401"><ph name="DEVICE_NAME" /> پر اسکرین کو کاسٹ کرنا شروع کریں</translation> <translation id="3202578601642193415">جدید ترین</translation> <translation id="3204648577100496185">اس ایپ سے وابستہ ڈیٹا کو اس آلہ سے ہٹایا جا سکتا ہے۔</translation> +<translation id="3205140624385017621">کیمرے کی اجازتوں والی ایپس اور ویب سائٹس اور سسٹم سروسز آپ کا کیمرا استعمال کر سکتی ہیں۔ کیمرا استعمال کرنے کے لیے، آپ کو ایپ کو دوبارہ شروع کرنے یا صفحہ کو ریفریش کرنے کی ضرورت پڑ سکتی ہے۔</translation> <translation id="3207344462385471911">آپ تجویز کردہ تلاشیں اور خریداری کی رعایتیں دیکھ رہے ہیں جو آپ کی حالیہ سرگرمی کی بنیاد پر آپ کی دلچسپی کا باعث بن سکتی ہیں۔ <ph name="BREAK" /> <ph name="BREAK" /> @@ -3192,6 +3201,7 @@ <translation id="3434272557872943250">اگر آپ کے بچے کیلئے ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو اس کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔ families.google.com پر ان ترتیبات اور ان کو ایڈجسٹ کرنے کے طریقے کے بارے میں مزید جانيں۔</translation> <translation id="3434475275396485144">یہ ترتیب آپ کے فون کے منتظم کے زیر انتظام ہے</translation> <translation id="3434512374684753970">آڈیو اور ویڈیو</translation> +<translation id="3435381311628654443">مائیکروفون کی اجازت اور سسٹم سروسز کے ساتھ ایپس اور ویب سائٹس تک رسائی کی اجازت دیں</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" آپ کے <ph name="CODE_TYPE" /> کی درخواست کر رہا ہے</translation> <translation id="3435738964857648380">سیکیورٹی</translation> <translation id="343578350365773421">کاغذ ختم ہو گیا</translation> @@ -3269,6 +3279,7 @@ <translation id="3491669675709357988">Family Link پیرنٹل کنٹرولز کے لیے آپ کے بچہ کا اکاؤنٹ سیٹ اپ نہیں کیا گیا ہے۔ سیٹ اپ مکمل کرنے کے بعد آپ پیرنٹل کنٹرولز کو شامل کر سکتے ہیں۔ آپ کو Explore ایپ میں پیرنٹل کنٹرولز سے متعلق معلومات ملے گی۔</translation> <translation id="3491678231052507920">آپ کو VR سیشنز میں داخل ہونے کی اجازت دینے کے لیے سائٹس عام طور پر ورچوئل رئیلٹی آلات اور ڈیٹا استعمال کرتی ہیں</translation> <translation id="3493043608231401654">ٹیب گروپ سے <ph name="TAB_TITLE" /> ہٹائیں</translation> +<translation id="3493463599276143766">کسی بھی ویب سائٹ کو آپ کا کیمرا استعمال کرنے کی اجازت نہیں ہے</translation> <translation id="3493486281776271508">انٹرنیٹ کنکشن کی ضرورت ہے</translation> <translation id="3493881266323043047">درستگی</translation> <translation id="3495496470825196617">چارجنگ کے دوران پاور معطل کریں</translation> @@ -3587,6 +3598,7 @@ <translation id="3733296813637058299">ہم آپ کیلئے وہ ایپس انسٹال کریں گے۔ آپ Play اسٹور میں اپنے <ph name="DEVICE_TYPE" /> کیلئے مزید ایپس تلاش کر سکتے ہیں۔</translation> <translation id="3735039640698208086">آڈیو چلاتے وقت…</translation> <translation id="3735740477244556633">ترتیب دیں بلحاظ</translation> +<translation id="3735827758948958091">میٹرڈ کنکشن کے دوران <ph name="FILE_NAMES" /> نہیں کھل سکتی</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> آلہ کا ڈیٹا 24 گھنٹے کے اندر حذف کر دیا جائے گا</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> کھولیں؟</translation> @@ -3855,6 +3867,7 @@ <translation id="3925573269917483990">کیمرا:</translation> <translation id="3925926055063465902">اس آلے پر موجود دیگر صارفین بھی اس نیٹ ورک کو استعمال کر سکتے ہیں</translation> <translation id="3926002189479431949">Smart Lock فون تبدیل ہوگیا</translation> +<translation id="3926410220776569451">کیمرے تک رسائی مسدود ہے</translation> <translation id="3927932062596804919">مسترد کریں</translation> <translation id="3928570707778085600"><ph name="FILE_OR_FOLDER_NAME" /> میں تبدیلیاں محفوظ کریں؟</translation> <translation id="3928659086758780856">سیاہی کم ہے</translation> @@ -3910,7 +3923,6 @@ <translation id="3966072572894326936">دوسرا فولڈر منتخب کریں…</translation> <translation id="3966094581547899417">ہاٹ اسپاٹ کی تفصیلات</translation> <translation id="3967822245660637423">ڈاؤن لوڈ مکمل ہوگیا ہے</translation> -<translation id="3967841595862839006">اپنی زبان اور کی بورڈ منتخب کریں</translation> <translation id="3968739731834770921">کانا</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">حساب لگایا جا رہا ہے…</translation> @@ -4050,6 +4062,7 @@ <translation id="4078738236287221428">پرجوش</translation> <translation id="4078903002989614318">ترتیب دینے اور فہرست کے اختیارات</translation> <translation id="4079140982534148664">املا کی بہتر جانچ استعمال کریں</translation> +<translation id="4082333918978320301">کسی بھی ویب سائٹ کو آپ کا مائیکروفون استعمال کرنے کی اجازت نہیں ہے</translation> <translation id="4084582735848141214">{COUNT,plural, =1{1 سائٹ کی اجازت ہے}other{# سائٹس کی اجازت ہے}}</translation> <translation id="4084682180776658562">بُک مارک</translation> <translation id="4084835346725913160"><ph name="TAB_NAME" /> کو بند کریں</translation> @@ -4199,6 +4212,7 @@ <translation id="4201546031411513170">آپ ترتیبات میں کسی بھی وقت اس بات کا انتخاب کر سکتے ہیں کہ کس چیز کی مطابقت پذیری کرنی ہے۔</translation> <translation id="4203065553461038553">فائل کا نام یا مقام کافی بڑا ہے</translation> <translation id="4203769790323223880">کیمرے کی اجازت نہیں ہے</translation> +<translation id="4204415812590935863">ابھی تھیم نہیں بنا سکتے۔</translation> <translation id="4205157409548006256">Linux کنفیگر کرنے میں ایک خرابی تھی۔</translation> <translation id="4206144641569145248">ایلیئن</translation> <translation id="4206323443866416204">تاثرات کی رپورٹ</translation> @@ -4540,6 +4554,7 @@ <translation id="447252321002412580">Chrome کی خصوصیات اور کارکردگی کو بہتر بنانے میں مدد کریں</translation> <translation id="4472533928615930332"><ph name="STYLE" /> اسٹائل میں <ph name="SUBJECT" /> کی تخلیق کردہ تصویر <ph name="INDEX" /></translation> <translation id="4472575034687746823">شروع کریں</translation> +<translation id="4473559657152613417">ٹیب پر دایاں کلک کریں اور "نئے گروپ میں ٹیب شامل کریں" کو منتخب کریں</translation> <translation id="4473996011558324141">وقت کا اندازہ لگا یا جا رہا ہے</translation> <translation id="4474155171896946103">سبھی ٹیبز کو بُک مارک کریں…</translation> <translation id="4475552974751346499">ڈاؤن لوڈز تلاش کریں</translation> @@ -4591,7 +4606,6 @@ <translation id="4513872120116766993">لکھنے میں لفظ کی پیشین گوئی</translation> <translation id="4513946894732546136">تاثرات</translation> <translation id="4515872537870654449">سروس کیلئے Dell سے رابطہ کریں۔ پنکھے کے کام نہ کرنے کی صورت میں ڈاک بند ہو جائے گا۔</translation> -<translation id="4516008165284813420">یقینی بنائیں کہ آپ کا <ph name="DEVICE_TYPE" /> انٹرنیٹ سے منسلک ہے اور دوبارہ کوشش کریں۔ آپ کسی دوسرے آلے پر play.google.com/about/play-terms بھی ملاحظہ کر سکتے ہیں۔</translation> <translation id="4518840066030486079">شفٹ کلید موڈ اسٹائل</translation> <translation id="4519331665958994620">سائٹس آپ کا کیمرا استعمال کرنے کیلئے پوچھ سکتی ہیں</translation> <translation id="4519605771716872386">فائل کی مطابقت پذیری آن ہے</translation> @@ -4635,6 +4649,7 @@ <translation id="4547672827276975204">خودکار طور پر سیٹ کریں</translation> <translation id="4548858987594081919">Google پاس ورڈ مینیجر کو اپنی سائن ان معلومات محفوظ کرنے میں مدد کرنے کے لئے، اس سائٹ کے لئے اپنا صارف نام شامل کریں</translation> <translation id="4549791035683739768">آپ کی سیکیورٹی کلید میں کوئی فنگر پرنٹ اسٹور نہیں ہے</translation> +<translation id="4550737096585299960">براہ کرم چند منٹ میں دوبارہ کوشش کریں۔</translation> <translation id="4550926046134589611">کچھ تعاون یافتہ لنکس اب بھی <ph name="APP_NAME" /> میں کھلیں گے۔</translation> <translation id="4551379727767354516">آپ کی حالیہ AI تھیمز</translation> <translation id="4551763574344810652">کالعدم کرنے کے لیے <ph name="MODIFIER_KEY_DESCRIPTION" /> دبائيں</translation> @@ -5259,6 +5274,7 @@ <translation id="5051461727068120271">غیر تصدیق شدہ فائل ڈاؤن لوڈ کریں</translation> <translation id="5051836348807686060">املا کی جانچ آپ کی منتخب زبانوں کے لیے تعاون یافتہ نہیں ہے</translation> <translation id="5052499409147950210">سائٹ میں ترمیم کریں</translation> +<translation id="5052853071318006357">ٹیب پر دایاں کلک کریں اور "نئے گروپ میں ٹیب شامل کریں" کو منتخب کریں</translation> <translation id="5053233576223592551">صارف نام شامل کریں</translation> <translation id="505347685865235222">بغیر نام کے گروپ - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />حسب ضرورت Chrome<ph name="END_LINK" /> میں کارڈ کے تمام اختیارات دیکھیں</translation> @@ -5295,6 +5311,7 @@ <translation id="5078638979202084724">سبھی ٹیبز کو بُک مارک کریں</translation> <translation id="5078796286268621944">غلط PIN</translation> <translation id="5079010647467150187">پہلے سے موجود VPN کو شامل کریں...</translation> +<translation id="5079460277417557557">اب آپ اپنے سائن ان کردہ ڈیسک ٹاپ آلات پر محفوظ کردہ ٹیب گروپس استعمال کر سکتے ہیں</translation> <translation id="5079699784114005398">آن ہونے کے بعد، اپنے Google اکاؤنٹ سے سائن ان کرنے پر آپ کی ایپس کسی بھی ChromeOS آلات پر دستیاب ہوں گی۔ Chrome براؤزر سے انسٹال کردہ ویب ایپس کی مطابقت پذیری ہو جائے گی چاہے براؤزر کی مطابقت پذیری آف ہی کیوں نہ ہو۔</translation> <translation id="508059534790499809">Kerberos ٹکٹ ریفریش کریں</translation> <translation id="5081124414979006563">مہمان پروفائل &کھولیں</translation> @@ -5358,6 +5375,7 @@ <translation id="5125967981703109366">اس کارڈ کے بارے میں</translation> <translation id="512642543295077915">search + backspace</translation> <translation id="5126611267288187364">تبدیلیاں دیکھیں</translation> +<translation id="512761462447738469">کیمرے کی اجازتوں والی ایپس اور ویب سائٹس اور سسٹم سروسز آپ کا کیمرا استعمال کر سکتی ہیں</translation> <translation id="5127620150973591153">محفوظ کنکشن ID: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Sync آف ہے</translation> <translation id="5127881134400491887">نیٹ ورک کنکشنز کا نظم کریں</translation> @@ -6062,6 +6080,7 @@ <translation id="5691581861107245578">آپ جو ٹائپ کر رہے ہیں اس کی بنیاد پر ایموجی کی تجاویز حاصل کریں</translation> <translation id="5691772641933328258">فنگر پرنٹ کی شناخت نہیں ہو سکی</translation> <translation id="5692183275898619210">پرنٹنگ مکمل ہو گئی</translation> +<translation id="5693237475389615913">Chrome میں سائٹ کے مائیکروفون کی اجازتوں کا نظم کریں</translation> <translation id="5693255400847650006">مائیکروفون استعمال میں ہے</translation> <translation id="5695184138696833495">Linux Android ایپ ADB</translation> <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" کی جانب سے بیجا استعمال کی اطلاع دیں</translation> @@ -6083,6 +6102,7 @@ <translation id="5708171344853220004">Microsoft کا اصولی نام</translation> <translation id="5709557627224531708">Chrome کو اپنے ڈیفالٹ براؤزر کے بطور سیٹ کریں</translation> <translation id="5711010025974903573">سروس لاگز</translation> +<translation id="5711324642850167289">کسی بھی ایپ کو آپ کا مائیکروفون استعمال کرنے کی اجازت نہیں ہے</translation> <translation id="5711983031544731014">غیر مقفل کرنے سے قاصر۔ اپنا پاس ورڈ درج کریں۔</translation> <translation id="5712153969432126546">سائٹس کبھی کبھار دستاویزات، معاہدوں اور فارمز جیسی PDFs شائع کرتی ہیں</translation> <translation id="571222594670061844">سائٹس شناختی سروسز سے سائن ان پرامپٹس دکھا سکتی ہیں</translation> @@ -6274,6 +6294,7 @@ <translation id="5862319196656206789">منسلک کردہ آلات سیٹ اپ کریں</translation> <translation id="5862731021271217234">اپنے دیگر آلات سے اپنے ٹیبز حاصل کرنے کیلئے، سِنک کو آن کریں</translation> <translation id="5863195274347579748">بیرونی لوازمات ذاتی ڈیٹا تک رسائی کرنے یا اس کا اشتراک کرنے کے اہل ہو سکتے ہیں۔</translation> +<translation id="5863263400083022538">سسٹم کی سروسز</translation> <translation id="5863445608433396414">ڈیبگنگ خصوصیات کو فعال کریں</translation> <translation id="5863515189965725638">IBAN میں ترمیم کریں</translation> <translation id="5864195618110239517">میٹرڈ کنکشن کا استعمال کریں</translation> @@ -6713,6 +6734,7 @@ <translation id="6207937957461833379">ملک/علاقہ</translation> <translation id="6208521041562685716">موبائل ڈیٹا فعال کیا جا رہا ہے</translation> <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> - <ph name="INTERRUPT_REASON" /> میں محفوظ کرنے میں ناکام ہو گیا</translation> +<translation id="6209135795240627482">مائیکروفون کی اجازتوں والی ایپس اور ویب سائٹس اور سسٹم سروسز آپ کا مائیکروفون استعمال کر سکتی ہیں</translation> <translation id="6209838773933913227">کمپونینٹ اپ ڈیٹ ہو رہا ہے</translation> <translation id="6209908325007204267">آپ کے آلے میں Chrome انٹرپرائز اپ گریڈ شامل ہے، لیکن آپ کا صارف نام انٹرپرائز اکاؤنٹ سے وابستہ نہیں ہے۔ براہ کرم کسی ثانوی آلہ پر g.co/ChromeEnterpriseAccount ملاحظہ کرکے انٹرپرائز اکاؤنٹ بنائیں۔</translation> <translation id="6210282067670792090">ایڈریس بار میں، اس کی بورڈ شارٹ کٹ کو سرچ انجن اور سائٹ کی تلاش کے لیے شارٹ کٹ کے ساتھ استعمال کریں</translation> @@ -7047,6 +7069,7 @@ <translation id="6478248366783946499">خطرناک فائل رکھیں؟</translation> <translation id="6479881432656947268">Chrome ویب اسٹور پر جائیں</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> کے زیر انتظام ہے</translation> +<translation id="6481749622989211463">قریبی آلات کے ساتھ فائلیں اور مزید کا اشتراک کریں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="6482559668224714696">پوری اسکرین مکبّر</translation> <translation id="6483485061007832714">ڈاؤن لوڈ کھولیں</translation> <translation id="6483805311199035658"><ph name="FILE" /> کھل رہی ہے…</translation> @@ -7059,7 +7082,7 @@ <translation id="649396225532207613">یہ فائل آپ کے ذاتی اور سوشل نیٹ ورک اکاؤنٹس کو نقصان پہنچا سکتی ہے</translation> <translation id="6494327278868541139">بہتر کردہ تحفظ کی تفصیلات دکھائیں</translation> <translation id="6494445798847293442">سرٹیفیکیشن ادارہ نہیں ہے</translation> -<translation id="6494483173119160146">آلے میں ایک نا قابل بازیابی کی خرابی پیش آگئی۔ براہ کرم اپنا آلہ ری سیٹ کریں (اس سے صارف کا تمام ڈیٹا مٹ جائے گا) اور دوبارہ کوشش کریں۔</translation> +<translation id="6494483173119160146">آلے میں ایک ناقابل بازیابی کی خرابی پیش آگئی۔ براہ کرم اپنا آلہ ری سیٹ کریں (اس سے صارف کا تمام ڈیٹا مٹ جائے گا) اور دوبارہ کوشش کریں۔</translation> <translation id="6497784818439587832">اپنی اسکرین پر موجود آئٹمز کو چھوٹا یا بڑا کرنے کے لیے ڈسپلے کا سائز تبدیل کریں</translation> <translation id="6497789971060331894">ماؤس کی معکوس اسکرولنگ</translation> <translation id="6498249116389603658">&آپ کی سبھی زبانیں</translation> @@ -7295,6 +7318,7 @@ <translation id="6680650203439190394">درجہ بندی کریں</translation> <translation id="6683022854667115063">ہیڈ فونز</translation> <translation id="6683087162435654533">تمام ٹیبز کو بحال کریں</translation> +<translation id="6683433919380522900">اجازت <ph name="PERMISSION_STATE" /> ہے</translation> <translation id="6684827949542560880">تازہ ترین اپ ڈیٹ ڈاؤن لوڈ کیا جارہا ہے</translation> <translation id="668599234725812620">Google Play کھولیں</translation> <translation id="6686490380836145850">دائیں جانب والے ٹیبز بند کریں</translation> @@ -8108,6 +8132,7 @@ <translation id="7330533963640151632"><ph name="USER_EMAIL" /> اکاؤنٹ کے تحت اشتراک کرتے ہوئے <ph name="USER_NAME" /> کے آلہ کیلئے <ph name="FEATURE_NAME" /> کی ترتیبات۔</translation> <translation id="7331646370422660166">alt + نیچے تیر کا نشان</translation> <translation id="7332053360324989309">سرشار کارکن: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">میٹرڈ کنکشن کے دوران فائلیں اپ لوڈ نہیں کی جا سکتیں۔</translation> <translation id="7333669215417470379">اپنی ایپس اور ترتیبات کا بیک اپ لیں اور بحال کریں</translation> <translation id="7335436113423103413">نئے ٹیب صفحہ پر یونیفائیڈ سائیڈ پینل سے حسب ضرورت Chrome فعالیت کو استعمال کرنے کی اہلیت کو فعال کرتا ہے۔</translation> <translation id="7335974957018254119">درج ذیل کے لیے املا کی جانچ کا استعمال کریں</translation> @@ -8264,6 +8289,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{1 ایکسٹینشن کا جائزہ لیں جسے Chrome ویب اسٹور سے ہٹا دیا گیا تھا}other{{NUM_EXTENSIONS} ایکسٹینشنز کا جائزہ لیں جنہیں Chrome ویب اسٹور سے ہٹا دیا گیا تھا}}</translation> <translation id="7436921188514130341">افوہ! نام کی تبدیلی کے دوران ایک خرابی تھی۔</translation> <translation id="7439519621174723623">جاری رکھنے کیلئے ایک آلے کا نام شامل کریں</translation> +<translation id="7441736532026945583">اپنی ٹیب اسٹرپ سے گروپ کو ہٹانے کے لیے "گروپ چھپائیں" کو منتخب کریں</translation> <translation id="7441736921018636843">اس ترتیب کو تبدیل کرنے کے لیے، اپنی مطابقت پذیری کے پاس فریز کو ہٹانے کے لیے <ph name="BEGIN_LINK" />مطابقت پذیری کو ری سیٹ کریں<ph name="END_LINK" /></translation> <translation id="7441830548568730290">دیگر صارفین</translation> <translation id="744341768939279100">ایک نیا پروفائل بنائیں</translation> @@ -8864,6 +8890,7 @@ <translation id="7887864092952184874">بلوٹوتھ ماؤس کا جوڑا بنا دیا گیا</translation> <translation id="7889371445710865055">املاء کی زبان کو تبدیل کریں</translation> <translation id="7890147169288018054">نیٹ ورک کی معلومات دیکھیں، جیسے آپ کا IP یا MAC پتہ</translation> +<translation id="7892005672811746207">"گروپ محفوظ کریں" کو آن کریں</translation> <translation id="7892384782944609022">جوڑا نہیں بنایا جا سکا۔ دوبارہ کوشش کرنے کے لیے آلے کا انتخاب کریں۔</translation> <translation id="7893008570150657497">اپنے کمپیوٹر سے تصاویر، موسیقی اور دیگر میڈیا تک رسائی حاصل کریں</translation> <translation id="7893153962594818789">اس <ph name="DEVICE_TYPE" /> پر بلوٹوتھ آف ہے۔ اپنا پاس ورڈ درج کریں اور بلوٹوتھ آن کریں۔</translation> @@ -9106,6 +9133,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977">گروپ <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">کنکشن کا ڈائیلاگ</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> کے لیے مقام کی اجازت</translation> <translation id="8070662218171013510">تاثرات بذریعہ تھپتھپاہٹ</translation> <translation id="8071432093239591881">بطور تصویر پرنٹ کریں</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />ایپ ڈیٹا کوئی بھی ایسا ڈیٹا ہو سکتا ہے جسے کسی ایپ نے رابطے، پیغامات اور تصاویر جیسے ڈیٹا سمیت (ڈویلپر کی ترتیبات کی بنیاد پر) محفوظ کیا ہو۔<ph name="END_PARAGRAPH1" /> @@ -9164,6 +9192,7 @@ <translation id="8109991406044913868">AI کی تخلیق کردہ تھیم</translation> <translation id="8110393529211831722">سبسکرپشن صرف اس آلے پر انسٹال ہے اور آپ کے اکاؤنٹ کے تحت دیگر آلات کے ساتھ مطابقت پذیر نہیں ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="8110489095782891123">رابطے کی فہرست ڈاؤن لوڈ ہو رہی ہے...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> کے لیے مائکروفون کی اجازت</translation> <translation id="8115139559594092084">آپ کے Google Drive سے</translation> <translation id="8116972784401310538">&بک مارک مینیجر</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> آپ کے سائن ان کرنے کے طریقے کو یاد رکھتا ہے اور ممکن ہونے پر آپ کو خودکار طور پر سائن ان کرتا ہے۔ آف ہونے پر، آپ سے ہر بار توثیق کرنے کیلئے کہا جائے گا۔</translation> @@ -9379,6 +9408,7 @@ <translation id="8275038454117074363">درآمد کریں</translation> <translation id="8275080796245127762">اپنے آلہ سے کال کریں</translation> <translation id="8275339871947079271">اپنے پاس ورڈ کو اپنے Google اکاؤنٹ میں منتقل کریں تاکہ آپ جہاں بھی سائن ان ہوں وہاں اس تک محفوظ طریقے سے رسائی حاصل کر سکیں</translation> +<translation id="8276242035951017580">کسی بھی ایپ کو آپ کا کیمرا استعمال کرنے کی اجازت نہیں ہے</translation> <translation id="8276560076771292512">خالی کیش اور ہارڈ ری لوڈ</translation> <translation id="8276850948802942358">فریق ثالث کوکیز استعمال کرنے کے لیے سائٹ کو عارضی اجازت دینے کے بارے میں مزید جانیں</translation> <translation id="828180235270931531">دیگر دستیاب پرنٹرز</translation> @@ -9397,6 +9427,7 @@ <translation id="8291942417224950075">ذاتی استعمال کیلئے</translation> <translation id="8293206222192510085">بُک مارک شامل کریں</translation> <translation id="8294431847097064396">ماخذ</translation> +<translation id="8294476140219241086">ٹیب آرگنائزر</translation> <translation id="8294895455164415895">Chrome کو ٹیب گروپس کی تجویز کرنے کی اجازت دینے کے لیے ترتیبات کھولیں</translation> <translation id="8295449579927246485">لائیو ترجمہ</translation> <translation id="8295450130892483256">Microsoft 365 انسٹال کریں</translation> @@ -9509,6 +9540,7 @@ <translation id="8380266723152870797">ونڈو کا نام</translation> <translation id="8380941800586852976">خطرناک</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> آن کریں</translation> +<translation id="8382197851871630452">مقامی موسم</translation> <translation id="8382677870544805359">انٹرپرائز کی خصوصیات کا استعمال کرنے کے لیے آپ کو اس آلہ کو فیکٹری ری سیٹ کرنا ہوگا۔</translation> <translation id="8382715499079447151">دیکھنے کا تحفظ</translation> <translation id="8382913212082956454">&ای میل پتہ کاپی کریں</translation> @@ -9699,6 +9731,7 @@ <translation id="8528962588711550376">سائن ان کیا جا رہا ہے۔</translation> <translation id="8529578450330869579">اپنے انٹرنیٹ ٹریفک تک رسائی والے لوگوں کو اپنی ملاحظہ کردہ سائٹس دیکھنے سے روکنے کیلئے محفوظ ڈومین ناموں کا نظام (DNS) استعمال کریں۔ یہ <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> پر نظم کردہ سروس فراہم کنندہ کا استعمال کرتا ہے</translation> <translation id="8529925957403338845">فوری ٹیدرنگ کا کنکشن ناکام ہو گیا</translation> +<translation id="8531367864749403520">اپنی ٹیب اسٹرپ سے گروپ کو ہٹانے کے لیے "گروپ چھپائیں" کو منتخب کریں</translation> <translation id="8531701051932785007">بہتر کردہ محفوظ براؤزنگ آف ہے</translation> <translation id="8533670235862049797">محفوظ براؤزنگ آن ہے</translation> <translation id="8534656636775144800">افوہ! ڈومین میں شامل ہونے کی کوشش کرتے وقت کچھ غلط ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔</translation> @@ -9825,6 +9858,7 @@ <translation id="8639635302972078117">استعمال اور ڈائیگناسٹک کا ڈیٹا بھیجیں۔ فی الوقت یہ آلہ خود کار طور پر ڈائیگناسٹک، آلے اور ایپ کے استعمال کا ڈیٹا Google کو بھیج رہا ہے۔ اس کا استعمال آپ کے بچے کی شناخت کیلئے نہیں کیا جائے گا اور اس سے سسٹم اور ایپ کے استحکام اور دیگر بہتریوں میں مدد ملے گی۔ کچھ مجموعی ڈیٹا Google ایپس اور پارٹنرز، جیسے Android ڈیولپرز، کی مدد بھی کرے گا۔ اگر آپ کے بچے کیلئے ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو اس کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔</translation> <translation id="8640575194957831802">آخری بار کھولا ہوا</translation> <translation id="8641946446576357115">اپنے iOS آلات پر اپنے پاس ورڈز استعمال کریں</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> کے لیے کیمرے کی اجازت</translation> <translation id="8642900771896232685">2 سیکنڈز</translation> <translation id="8642947597466641025">متن کو اور بڑا بنائیں</translation> <translation id="8643403533759285912">گروپ حذف کریں</translation> @@ -9859,6 +9893,7 @@ <translation id="8662978096466608964">Chrome وال پیپر کو سیٹ نہیں کر سکتا ہے۔</translation> <translation id="8663051876219324457">ایپس، ویب سائٹس اور سسٹم سروسز کو اپنا مقام استعمال کرنے کی اجازت دیں۔ آپ کے آلہ کے مقام کا تعین کرنے میں مدد کرنے کے لیے، مقام Wi‑Fi، موبائل نیٹ ورکس اور سینسرز جیسے وسائل کا استعمال کر سکتا ہے۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> پر متعدد خودکار ڈاؤن لوڈز کو ہمیشہ مسدود کریں</translation> +<translation id="8664249499245357248">گروپ کے نام پر دائیں کلک کریں</translation> <translation id="8664389313780386848">صفحہ کا ماخذ &دیکھیں</translation> <translation id="8665110742939124773">آپ نے ایک غلط رسائی کوڈ درج کیا ہے۔ دوبارہ کوشش کریں۔</translation> <translation id="8665180165765946056">بیک اپ مکمل ہو گیا</translation> @@ -10183,6 +10218,7 @@ <translation id="8900413463156971200">سیلولر کو فعال کریں</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> کا تقاضہ ہے کہ آپ اپنے ڈیٹا کا بیک اپ لیں اور اس <ph name="DEVICE_TYPE" /> کو آج ہی واپس کریں۔}other{<ph name="MANAGER" /> کا تقاضہ ہے کہ آپ اپنے ڈیٹا کا بیک اپ ليں اور آخری تاریخ سے پہلے اس <ph name="DEVICE_TYPE" /> کو واپس کریں۔}}</translation> <translation id="8902667442496790482">'سننے کیلئے منتخب کریں' کی ترتیبات کھولیں</translation> +<translation id="8903733144777177139">مائیکروفون تک رسائی مسدود ہے</translation> <translation id="890616557918890486">ماخذ تبدیل کریں</translation> <translation id="8907701755790961703">براہ کرم ایک ملک منتخب کریں</translation> <translation id="8908420399006197927">تجویز کردہ گروپ سے ٹیب کو خارج کریں</translation> @@ -10220,6 +10256,7 @@ <translation id="8934732568177537184">جاری رکھیں</translation> <translation id="8938800817013097409">USB-C آلہ (پیچھے موجود دایاں پورٹ)</translation> <translation id="8940081510938872932">آپ کا کمپیوٹر اس وقت کافی ساری چیزیں کر رہا ہے۔ بعد میں دوبارہ کوشش کریں۔</translation> +<translation id="8940228279218723234">کیمرے کی اجازت اور سسٹم سروسز کے ساتھ ایپس اور ویب سائٹس تک رسائی کی اجازت دیں۔ کیمرا استعمال کرنے کے لیے، آپ کو ایپ کو دوبارہ شروع کرنے یا صفحہ کو ریفریش کرنے کی ضرورت پڑ سکتی ہے۔</translation> <translation id="8940381019874223173">آپ کی Google تصاویر سے</translation> <translation id="8940888110818450052">سائن ان کے اختیارات</translation> <translation id="8941173171815156065">اجازت '<ph name="PERMISSION" />' کو کالعدم کریں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index be70bd7..fb45416 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -341,6 +341,7 @@ <translation id="1251578593170406502">Mobil internet tarmoqlari tekshirilmoqda...</translation> <translation id="125220115284141797">Asosiy</translation> <translation id="1252219782845132919">Guruhni yashirish</translation> +<translation id="1252714168533640068">Guruhni qayta ochish uchun gurun nomini bosing</translation> <translation id="1252987234827889034">Profil xatoligi yuz berdi</translation> <translation id="1253664522045778676">Kerakli natijani bosing va sahifa joriy varaqda ochiladi</translation> <translation id="1254593899333212300">Internetga to‘g‘ridan-to‘g‘ri ulanish</translation> @@ -622,6 +623,7 @@ <translation id="1476347941828409626">Chrome profillarini boshqarish</translation> <translation id="1476607407192946488">Til sozlamalari</translation> <translation id="1477446329585670721"><ph name="DOMAIN" /> smart karta kiritilishini talab qilmoqda.</translation> +<translation id="1477645000789043442">Ochiq varaqlar asosida varaqlar guruhi avtomatik yaratiladi. Bu funksiyadan foydalanish uchun varaq ustiga oʻng klik bosib, Oʻxshash varaqlarni tartiblash ustiga bosing.</translation> <translation id="1477654881618305065">Bu kontentni. ulashish tashkilotingiz tomonidan taqiqlanadi. Yodam uchun administratorga murojaat qiling.</translation> <translation id="1478340334823509079">Batafsil ma’lumotlar: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">O‘rnatishga ruxsat berilmagan</translation> @@ -677,7 +679,6 @@ <translation id="1521933835545997395">Android telefoniga ulandi</translation> <translation id="1523279371236772909">Oxirgi oyda koʻrilgan</translation> <translation id="1523978563989812243">Matnni nutqqa aylantirish tizimlari</translation> -<translation id="1524430321211440688">Klaviatura</translation> <translation id="1524563461097350801">Kerak emas</translation> <translation id="1525740877599838384">Joylashuvni aniqlash uchun faqat Wi-Fi tarmoqdan foydalanish</translation> <translation id="152629053603783244">Linuxni qaytadan ishga tushirish</translation> @@ -876,6 +877,7 @@ <translation id="1648439345221797326">ctrl + shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Joylashuvni aniqlash uchun Wi-Fi, Bluetooth yoki mobil tarmoqlardan foydalanish</translation> <translation id="164936512206786300">Bluetooth qurilmani uzish</translation> +<translation id="1650407365859096313">Yangi varaqda ochiladi, ruxsat: <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">My Drive jildidagi fayllar Chromebook qurilmangizga avtomatik sinxronlanadi va ularni internetsiz ham ochish mumkin. Buni istalgan vaqtda Sozlamalar > Fayllar orqali oʻzgartirish mumkin.</translation> <translation id="1651008383952180276">Siz kodli iborani ikki marta bir xil kiritishingiz kerak.</translation> <translation id="1651609627703324721">Bu varaq garnituraga VR kontent namoyish qilmoqda</translation> @@ -1112,6 +1114,7 @@ <translation id="1828901632669367785">Tizim muloqot oynasi yordamida chop etish...</translation> <translation id="1829129547161959350">Pingvin</translation> <translation id="1829192082282182671">&Kichiklashtirish</translation> +<translation id="182973053761690772">Kun botishi jadvali</translation> <translation id="1830550083491357902">Kirish bajarilmagan</translation> <translation id="1831848493690504725">Ulangan tarmoq orqali Google bilan bogʻlana olmayapmiz. Boshqa tarmoqni tanlang, tarmoq sozlamalari yoki proksi sozlamalarini (agar proksi ishlatsangiz) tekshiring.</translation> <translation id="1832459821645506983">Ha, roziman</translation> @@ -1169,6 +1172,7 @@ <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> qurilmangizdagi Chromium OS versiyasi yangi</translation> <translation id="1873920700418191231"><ph name="WEBSITE" /> uchun yana ruxsat berish</translation> <translation id="1874248162548993294">Reklama chiqarishga ruxsat berilgan</translation> +<translation id="1874794096607967241">Ilova va saytlar hamda tizim xizmatlariga kameradan foydalanishga ruxsat berish</translation> <translation id="1874874185178737347">Varaqlarni tartiblash</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Varaqni boshqa oynaga olish}other{Varaqlarni boshqa oynaga olish}}</translation> <translation id="1875387611427697908">Buni faqat <ph name="CHROME_WEB_STORE" /> sahifasidan qo‘shish mumkin</translation> @@ -1208,6 +1212,7 @@ <translation id="1901303067676059328">Hammasini belgilash</translation> <translation id="1903542130902305074">Sozlash</translation> <translation id="1904580727789512086">Tashrif qilingan URL manzillar Google hisobingizda saqlanadi</translation> +<translation id="1904603806662441960">Saytning kameraga ruxsatini Chrome orqali boshqarish</translation> <translation id="1905375423839394163">Chromebook qurilmasi nomi</translation> <translation id="1906181697255754968">Saytlar odatda yopilmagan ishlaringizni saqlash maqsadida qurilmangizdagi fayllar va jildlar bilan ishlaydi</translation> <translation id="1906488504371069394"><ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> doʻkonida koʻplab kengaytma va mavzular bilan tanishing</translation> @@ -1348,6 +1353,7 @@ <translation id="200928901437634269">Farzandingizning Google yoki maktab hisobidan foydalaning. Ota-ona nazoratini ham oʻrnatish mumkin.</translation> <translation id="2009590708342941694">Emoji vositasi</translation> <translation id="2010501376126504057">Mos qurilmalar</translation> +<translation id="201217432804812273">"Guruhni saqlash" funksiyasini yoqing</translation> <translation id="2012935757369720523">Faylni oʻchirish</translation> <translation id="2013550551806600826">Sinang. Bu sozlamadan foydalanish uchun sensorli panel sinov maydonida ikki barmoq bilan varaqlang. Buni keyinroq Sozlamalar > Qurilma > Sichqoncha va sensorli panel orqali moslash mumkin.</translation> <translation id="2015232545623037616">Kompyuter va Chromecast bir xil Wi-Fi tarmoqqa ulangan</translation> @@ -1771,6 +1777,7 @@ <translation id="2314165183524574721">Ayni vaqtda hech kimga koʻrinmaslik sozlangan</translation> <translation id="2314774579020744484">Tarjima qilishda ishlatiladigan til</translation> <translation id="2316129865977710310">Kerak emas</translation> +<translation id="2316433409811863464">Ilovalar strimingi</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% bajarildi</translation> <translation id="2318143611928805047">Qog‘oz hajmi</translation> <translation id="2318817390901984578">Android ilovalardan foydalanish uchun <ph name="DEVICE_TYPE" /> qurilmasini quvvatlang va uning tizimini yangilang.</translation> @@ -1957,6 +1964,7 @@ <translation id="2454206500483040640">Boʻlingan</translation> <translation id="2454247629720664989">Kalit so‘z</translation> <translation id="2454524890947537054">Veb soʻrovga ruxsat berilsinmi?</translation> +<translation id="2454913962395846391">Avtomatik vaqt mintaqasi</translation> <translation id="245650153866130664">Chiptani avtomatik yangilash uchun “Parol eslab qolinsin” bandini belgilang. Parolingiz faqat qurilmangizga saqlanadi.</translation> <translation id="2456794251167091176">Import qilindi</translation> <translation id="2456827790665612305">Saytga obunani bekor qilish</translation> @@ -2915,6 +2923,7 @@ <translation id="3202499879214571401">Ekranning <ph name="DEVICE_NAME" /> qurilmasiga translatsiyasini pauza qilish</translation> <translation id="3202578601642193415">Eng yangi</translation> <translation id="3204648577100496185">Bu ilovaga aloqador maʼlumotlar ushbu qurilmadan tozalanadi.</translation> +<translation id="3205140624385017621">Ruxsat berilgan ilova va saytlar hamda tizim xizmatlari kameradan foydalanishi mumkin. Kameradan foydalanish uchun ilovani qayta oching yoki sahifani yangilang.</translation> <translation id="3207344462385471911">Sizga qiziq boʻlishi mumkin qidiruv va xarid chegirmalari takliflari oxirgi faoliyatingiz asosida chiqadi. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3192,6 +3201,7 @@ <translation id="3434272557872943250">Agar farzandingiz uchun Veb va ilovalardagi kengaytirilgan faoliyat tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi. Bu parametr va uni sozlash haqidagi batafsil axborotni families.google.com sahifasidan olish mumkin.</translation> <translation id="3434475275396485144">Bu sozlama telefoningiz administratori tomonidan boshqariladi</translation> <translation id="3434512374684753970">Audio va video</translation> +<translation id="3435381311628654443">Ilova va saytlar hamda tizim xizmatlariga mikorofondan foydalanishga ruxsat berish</translation> <translation id="3435688026795609344">“<ph name="EXTENSION_NAME" />” kengaytmasi <ph name="CODE_TYPE" /> kod turini so‘rayapti</translation> <translation id="3435738964857648380">Xavfsizlik</translation> <translation id="343578350365773421">Qogʻoz tugagan</translation> @@ -3269,6 +3279,7 @@ <translation id="3491669675709357988">Farzandingizning hisobi Family Link ota-ona nazorati uchun sozlanmagan. Sozlash tugashi bilan ota-ona nazoratini kirtishingiz mumkin. Ota-ona nazorati haqidagi axborotini “Tanishuv” ilovasi orqali topish mumkin.</translation> <translation id="3491678231052507920">Saytlar odatda VR seanslarga kirishingizda virtual reallik qurilmalari va maʼlumotlaridan foydalanadi</translation> <translation id="3493043608231401654">Varaqlar guruhidan <ph name="TAB_TITLE" /> sahifasini olib tashlash</translation> +<translation id="3493463599276143766">Hech qaysi sayt kameradan foydalana olmaydi</translation> <translation id="3493486281776271508">Internet bilan aloqa zarur</translation> <translation id="3493881266323043047">Yaroqlilik muddati</translation> <translation id="3495496470825196617">Quvvatlash vaqtidagi uyqu rejimi</translation> @@ -3587,6 +3598,7 @@ <translation id="3733296813637058299">Bu ilovalarni siz uchun oʻrnatib beramiz. <ph name="DEVICE_TYPE" /> qurilmangiz uchun yana boshqa ilovalarni Play Marketdan topishingiz mumkin.</translation> <translation id="3735039640698208086">Audio ijro etilayotganda...</translation> <translation id="3735740477244556633">Saralash tartibi</translation> +<translation id="3735827758948958091"><ph name="FILE_NAMES" /> fayli pulli ulanish orqali ochilmaydi</translation> <translation id="3738632186060045350"><ph name="DEVICE_TYPE" /> axborotlari 24 soat ichida tozalanadi</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094"><ph name="APPLICATION" /> ochilsinmi?</translation> @@ -3855,6 +3867,7 @@ <translation id="3925573269917483990">Kamera:</translation> <translation id="3925926055063465902">Qurilmadagi boshqa foydalanuvchilar ham bu tarmoqni ishlatadi</translation> <translation id="3926002189479431949">Smart Lock – telefon o‘zgardi</translation> +<translation id="3926410220776569451">Kameraga ruxsat bloklandi</translation> <translation id="3927932062596804919">Taqiqlash</translation> <translation id="3928570707778085600"><ph name="FILE_OR_FOLDER_NAME" /> oʻzgarishlari saqlansinmi?</translation> <translation id="3928659086758780856">Siyoh kam qolgan</translation> @@ -3910,7 +3923,6 @@ <translation id="3966072572894326936">Boshqa jildni tanlang...</translation> <translation id="3966094581547899417">Hotspot axboroti</translation> <translation id="3967822245660637423">Yuklab olindi</translation> -<translation id="3967841595862839006">Til va klaviaturani tanlang</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Hisoblanmoqda...</translation> @@ -4050,6 +4062,7 @@ <translation id="4078738236287221428">Har doim</translation> <translation id="4078903002989614318">Saralash sozlamalari</translation> <translation id="4079140982534148664">Kengaytirilgan imlo tekshiruvini ishlatish</translation> +<translation id="4082333918978320301">Hech qaysi sayt mikrofondan foydalana olmaydi</translation> <translation id="4084582735848141214">{COUNT,plural, =1{1 ta saytga ruxsat berilgan}other{# ta saytga ruxsat berilgan}}</translation> <translation id="4084682180776658562">Xatcho‘p</translation> <translation id="4084835346725913160">“<ph name="TAB_NAME" />” oynasini yopish</translation> @@ -4199,6 +4212,7 @@ <translation id="4201546031411513170">Nimani sinxronlashni istalgan vaqtda sozlamalar orqali tanlash mumkin.</translation> <translation id="4203065553461038553">Fayl nomi yoki joylashuvi juda uzun</translation> <translation id="4203769790323223880">Kameradan foydalanishga ruxsat berilmagan</translation> +<translation id="4204415812590935863">Hozirda mavzu yaratish imkonsiz.</translation> <translation id="4205157409548006256">Linux tizimini yangilashda xatolik yuz berdi.</translation> <translation id="4206144641569145248">O‘zga sayyoralik</translation> <translation id="4206323443866416204">Fikr-mulohaza</translation> @@ -4540,6 +4554,7 @@ <translation id="447252321002412580">Chrome funksiyalari va unumdorligini yaxshilashga yordam bering</translation> <translation id="4472533928615930332">Yaratilgan rasm: <ph name="INDEX" />/<ph name="SUBJECT" />, uslub: <ph name="STYLE" /></translation> <translation id="4472575034687746823">Boshlash</translation> +<translation id="4473559657152613417">Varaq ustida oʻng klikni bosib, “Varaqni yangi guruhga kiritish” bandini tanlang</translation> <translation id="4473996011558324141">qolgan vaqt</translation> <translation id="4474155171896946103">Barcha ichki oynalarni xatcho‘plarga qo‘shish...</translation> <translation id="4475552974751346499">Yuklamalardan qidirish</translation> @@ -4592,7 +4607,6 @@ <translation id="4513872120116766993">Matn kiritishda takliflar</translation> <translation id="4513946894732546136">Fikr-mulohaza</translation> <translation id="4515872537870654449">Yordam uchun Dell kompaniyasiga murojaat qiling. Ventilyator ishlamasa, dok avtomatik oʻchadi.</translation> -<translation id="4516008165284813420"><ph name="DEVICE_TYPE" /> internetga ulanganini tekshiring va qayta urining. Shuningdek, boshqa qurilma orqali play.google.com/about/play-terms sahifasini ochish mumkin.</translation> <translation id="4518840066030486079">Shift tugmasi modifikatori uslubi</translation> <translation id="4519331665958994620">Saytlar kameradan foydalanishga ruxsat soʻrashi mumkin</translation> <translation id="4519605771716872386">Fayllar sinxronizatsiyasi yoqildi</translation> @@ -4636,6 +4650,7 @@ <translation id="4547672827276975204">Avtomatik aniqlansin</translation> <translation id="4548858987594081919">Google Parollar menejeriga kirish maʼlumotlaringizni saqlashga yordam berish uchun ushbu sayt uchun foydalanuvchi nomini kiriting</translation> <translation id="4549791035683739768">Elektron kalitingizda barmoq izlari topilmadi</translation> +<translation id="4550737096585299960">Bir necha daqiqadan keyin qayta urining.</translation> <translation id="4550926046134589611">Ayrim tegishli havolalar <ph name="APP_NAME" /> ilovasida ochilaveradi.</translation> <translation id="4551379727767354516">Oxirgi AI mavzular</translation> <translation id="4551763574344810652">Bekor qilish uchun <ph name="MODIFIER_KEY_DESCRIPTION" /> ni bosing</translation> @@ -5260,6 +5275,7 @@ <translation id="5051461727068120271">Tekshirilmagan faylni yuklab olish</translation> <translation id="5051836348807686060">Tanlangan tilda imlo tekshirilmaydi</translation> <translation id="5052499409147950210">Saytni tahrirlash</translation> +<translation id="5052853071318006357">Varaq ustida oʻng klikni bosib, “Varaqni yangi guruhga kiritish” bandini tanlang</translation> <translation id="5053233576223592551">Foydalanuvchi nomini kiritish</translation> <translation id="505347685865235222">Nomsiz guruh – <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193"><ph name="BEGIN_LINK" />Chromeni moslash<ph name="END_LINK" /> sahifasidagi barcha kartochka sozlamalarini ochish</translation> @@ -5296,6 +5312,7 @@ <translation id="5078638979202084724">Barcha ichki oynalarni xatcho‘plarga qo‘shish</translation> <translation id="5078796286268621944">Noto‘g‘ri PIN-kod</translation> <translation id="5079010647467150187">Ichki oʻrnatilgan VPN kiritish...</translation> +<translation id="5079460277417557557">Endi saqlangan varaqlar guruhini hisobga kirilgan kompyuterlarda ochish mumkin</translation> <translation id="5079699784114005398">Yoqilsa, ilovalaringiz Google hisobidan kirilgan barcha ChromeOS qurilmalarida chiqadi. Chrome brauzeri orqali oʻrnatilgan veb ilovalar brauzer sinxronlanishi oʻchiq boʻlsa ham sinxronlanadi.</translation> <translation id="508059534790499809">Kerberos chiptasini yangilash</translation> <translation id="5081124414979006563">Mehmon profilini ochish</translation> @@ -5359,6 +5376,7 @@ <translation id="5125967981703109366">Bu kartochka haqida</translation> <translation id="512642543295077915">qidiruv + backspace</translation> <translation id="5126611267288187364">Oʻzgarishlar</translation> +<translation id="512761462447738469">Ruxsat berilgan ilova va saytlar hamda tizim xizmatlari kameradan foydalanishi mumkin</translation> <translation id="5127620150973591153">Xavfsiz ulanish identifikatori: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Sinxronizatsiya o‘chiq</translation> <translation id="5127881134400491887">Tarmoq ulanishlari boshqaruvi</translation> @@ -6064,6 +6082,7 @@ <translation id="5691581861107245578">Kiritilayotgan matn asosida emojilar taklif qilinsin</translation> <translation id="5691772641933328258">Barmoq izi aniqlanmadi</translation> <translation id="5692183275898619210">Chop etildi</translation> +<translation id="5693237475389615913">Saytning mikrofonga ruxsatini Chrome orqali boshqarish</translation> <translation id="5693255400847650006">Mikrofon ishlatilmoqda</translation> <translation id="5695184138696833495">Linux tizimida Android ilovalar uchun ADB vositasi</translation> <translation id="5696143504434933566">“<ph name="EXTENSION_NAME" />” ustidan shikoyat qilish</translation> @@ -6085,6 +6104,7 @@ <translation id="5708171344853220004">Microsoft qatnashchisining ismi</translation> <translation id="5709557627224531708">Chromeni standart brauzer etib tayinlang</translation> <translation id="5711010025974903573">Xizmat jurnali</translation> +<translation id="5711324642850167289">Hech qaysi ilova mikrofondan foydalana olmaydi</translation> <translation id="5711983031544731014">Qulfdan chiqarib bo‘lmadi. Parolni kiriting.</translation> <translation id="5712153969432126546">Baʼzan saytlar hujjatlar, shartnomalar va shakllarni PDF formatda chop etadi.</translation> <translation id="571222594670061844">Saytlar shaxsni tasdiqlash xizmatlariga kirish oynalarini chiqarishi mumkin</translation> @@ -6276,6 +6296,7 @@ <translation id="5862319196656206789">Ulangan qurilmalarni sozlash</translation> <translation id="5862731021271217234">Boshqa qurilmalardagi brauzer sahifalarini ko‘rish uchun sinxronizatsiyani yoqing</translation> <translation id="5863195274347579748">Tashqi aksessuarlar shaxsiy maʼlumotlarga kirishi yoki ulashishi mumkin.</translation> +<translation id="5863263400083022538">Tizim xizmatlari</translation> <translation id="5863445608433396414">Nosozliklarni ko‘rib chiqish funksiyalarini yoqish</translation> <translation id="5863515189965725638">IBAN raqamini tahrirlash</translation> <translation id="5864195618110239517">Trafik hisoblanadigan ulanishdan foydalanish</translation> @@ -6715,6 +6736,7 @@ <translation id="6207937957461833379">Mamlakat / hudud</translation> <translation id="6208521041562685716">Mobil tarmoq faollashtirilmoqda</translation> <translation id="6208725777148613371"><ph name="WEB_DRIVE" /> omboriga saqlanmadi, sababi: <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">Ruxsat berilgan ilova va saytlar hamda tizim xizmatlari mikrofondan foydalanishi mumkin.</translation> <translation id="6209838773933913227">Komponent yangilanmoqda</translation> <translation id="6209908325007204267">Bu qurilmada Chrome korporativ litsenziyasi bor, lekin qurilmadagi foydalanuvchi nomi korporativ hisobga tegishli emas. Boshqa qurilma orqali g.co/ChromeEnterpriseAccount sahifasidan korporativ hisob oching.</translation> <translation id="6210282067670792090">Qidiruv tizimlari yoki sayt orqali qidirish uchun manzillar qatorida quyidagi buyruq va tezkor tugmalardan foydalaning</translation> @@ -7049,6 +7071,7 @@ <translation id="6478248366783946499">Xavfli fayl yuklab olinsinmi?</translation> <translation id="6479881432656947268">Chrome Web Store doʻkonini ochish</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> tomonidan boshqariladi</translation> +<translation id="6481749622989211463">Atrofdagi qurilmalarga fayl va boshqalarni ulashish <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Butun ekran rejimidagi lupa</translation> <translation id="6483485061007832714">Yuklanmani ochish</translation> <translation id="6483805311199035658"><ph name="FILE" /> ochilmoqda...</translation> @@ -7297,6 +7320,7 @@ <translation id="6680650203439190394">Nutq tezligi</translation> <translation id="6683022854667115063">Quloqliklar</translation> <translation id="6683087162435654533">Barcha varaqlarni tiklash</translation> +<translation id="6683433919380522900">Ruxsat: <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Eng oxirgi yangilanish yuklab olinmoqda</translation> <translation id="668599234725812620">Play Marketni ochish</translation> <translation id="6686490380836145850">O‘ng tomondagi ichki oynalarni yopish</translation> @@ -8110,6 +8134,7 @@ <translation id="7330533963640151632"><ph name="USER_NAME" /> qurilmasi uchun <ph name="FEATURE_NAME" /> sozlamalari <ph name="USER_EMAIL" /> hisobi ostida yuboriladi.</translation> <translation id="7331646370422660166">alt + pastga strelka</translation> <translation id="7332053360324989309">Dedicated Worker: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Fayllar pulli ulanish orqali yuklanmaydi</translation> <translation id="7333669215417470379">Ilova va sozlamalarni zaxiralash va tiklash</translation> <translation id="7335436113423103413">Yangi varaq sahifasida Chrome umumlashgan yon panel funksiyasini moslash imkoniyatini beradi.</translation> <translation id="7335974957018254119">Imlo tekshiruvi quyidagilar uchun ishlatilsin:</translation> @@ -8266,6 +8291,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Chrome Web Store xizmatidan olib tashlangan 1 ta kengaytmani tekshiring}other{Chrome Web Store xizmatidan olib tashlangan {NUM_EXTENSIONS} ta kengaytmani tekshiring}}</translation> <translation id="7436921188514130341">Ana xolos! Nomni o‘zgartirishda xatolik yuz berdi.</translation> <translation id="7439519621174723623">Davom etish uchun qurilma kiriting</translation> +<translation id="7441736532026945583">Guruhni varaqlar panelidan olish uchun "Guruhni yashirish" bandini tanlang</translation> <translation id="7441736921018636843">Bu sozlamani o‘zgartirish uchun, avval, <ph name="BEGIN_LINK" />sinxronizatsiyani tiklang<ph name="END_LINK" /> va parolini olib tashlang</translation> <translation id="7441830548568730290">Boshqa foydalanuvchilar</translation> <translation id="744341768939279100">Yangi profil yaratish</translation> @@ -8865,6 +8891,7 @@ <translation id="7887864092952184874">Bluetooth sichqonchasi ulandi</translation> <translation id="7889371445710865055">Ovoz bilan yozish tilini oʻzgartirish</translation> <translation id="7890147169288018054">IP yoki MAC manzillar kabi tarmoq axborotini koʻrish</translation> +<translation id="7892005672811746207">"Guruhni saqlash" funksiyasini yoqing</translation> <translation id="7892384782944609022">Ulanmadi. Qurilmani tanlang va qayta urining.</translation> <translation id="7893008570150657497">Kompyuteringizdagi rasmlar, musiqa va boshqa media fayllarga ruxsat</translation> <translation id="7893153962594818789"><ph name="DEVICE_TYPE" /> qurilmasida Bluetooth o‘chiq. Parolingizni kiriting va Bluetooth adapterini yoqing.</translation> @@ -9107,6 +9134,7 @@ <translation id="8064015586118426197">ChromeOS Flex</translation> <translation id="8064279191081105977"><ph name="GROUP_NAME" /> guruhi – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Ulanish oynasi</translation> +<translation id="8070572887926783747"><ph name="APP_NAME" /> joylashuv axborotiga ruxsat</translation> <translation id="8070662218171013510">Sezgir aloqa</translation> <translation id="8071432093239591881">Rasm sifatida chop etish</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Ilovaga tegishli axborotlar – bu, ilovalar tomonidan saqlangan (dasturchi o‘rnatgan sozlamalarga asoslanib) kontaktlar, xabarlar va rasmlar kabi maʼlumotlar<ph name="END_PARAGRAPH1" /> @@ -9165,6 +9193,7 @@ <translation id="8109991406044913868">AI bilan yaratilgan mavzu</translation> <translation id="8110393529211831722">Obuna faqat shu qurilmaga oʻrnatilgan va hisobingiz ostidagi boshqa qurilmalar bilan sinxronlanmaydi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Kontaktlar roʻyxati yuklab olinmoqda...</translation> +<translation id="8114925369073821854"><ph name="APP_NAME" /> mikrofonga ruxsat</translation> <translation id="8115139559594092084">Google Drive omboringizdan</translation> <translation id="8116972784401310538">&Xatcho‘plar menejeri</translation> <translation id="8118276691321086429"><ph name="PASSWORD_MANAGER_BRAND" /> hisobga qanday kirganingizni eslab qoladi va avtomatik kiritishga urinadi. Yoqilmasa, har safar tasdiqlash talab etiladi.</translation> @@ -9380,6 +9409,7 @@ <translation id="8275038454117074363">Import</translation> <translation id="8275080796245127762">Qurilmangizdan telefon qilish</translation> <translation id="8275339871947079271">Istalgan joydan xavfsiz kirish uchun parolingizni Google hisobingizga saqlang</translation> +<translation id="8276242035951017580">Hech qaysi ilova kameradan foydalana olmaydi</translation> <translation id="8276560076771292512">Keshni tozalash va qurilmani qaytadan ishga tushirish</translation> <translation id="8276850948802942358">Saytga tashqi cookie fayllaridan foydalanishga vaqtinchalik ruxsat berish haqida batafsil</translation> <translation id="828180235270931531">Boshqa mavjud printerlar</translation> @@ -9398,6 +9428,7 @@ <translation id="8291942417224950075">Shaxsiy foydalanish uchun</translation> <translation id="8293206222192510085">Xatcho‘p qo‘shish</translation> <translation id="8294431847097064396">Manba</translation> +<translation id="8294476140219241086">Varaqlar tartiblagichi</translation> <translation id="8294895455164415895">Chrome varaqlar guruhini taklif qilishi uchun sozlamalarni oching</translation> <translation id="8295449579927246485">Jonli tarjima</translation> <translation id="8295450130892483256">Microsoft 365 ilovasini oʻrnatish</translation> @@ -9510,6 +9541,7 @@ <translation id="8380266723152870797">Oyna nomi</translation> <translation id="8380941800586852976">Xavfli</translation> <translation id="8381630473947706877"><ph name="FEATURE_NAME" /> funksiyasini yoqish</translation> +<translation id="8382197851871630452">Mahalliy ob-havo</translation> <translation id="8382677870544805359">Korporativ funksiyalardan foydalanish uchun qurilma sozlamalarini asliga qaytarish lozim.</translation> <translation id="8382715499079447151">Xavfsiz koʻrish</translation> <translation id="8382913212082956454">&E-pochta manzilini nusxalash</translation> @@ -9700,6 +9732,7 @@ <translation id="8528962588711550376">Tizimga kirilmoqda.</translation> <translation id="8529578450330869579">Xavfsiz domen nomlari tizimi (DNS) serverlarini belgilang, shunda Internet trafigingizga kirish imkoniga ega boʻlganlar siz kirgan saytlarni koʻra olmaydi. Bunda boshqariladigan <ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /> provayderi ishlatiladi</translation> <translation id="8529925957403338845">Tezkor modemga ulanib bo‘lmadi</translation> +<translation id="8531367864749403520">Guruhni varaqlar panelidan olish uchun "Guruhni yashirish" bandini tanlang</translation> <translation id="8531701051932785007">Saytlarni kuchaytirilgan rejimda xavfsiz kezish faolsizlantirildi</translation> <translation id="8533670235862049797">Saytlarni xavfsiz kezish rejimi yoniq</translation> <translation id="8534656636775144800">Domenga ulanishda xatolik yuz berdi. Qaytadan urining.</translation> @@ -9826,6 +9859,7 @@ <translation id="8639635302972078117">Foydalanish statistikasi va diagnostika axborotini yuborish. Bu qurilma hozirda qurilma va ilovalardan foydalanish haqidagi hamda diagnostika axborotini avtomatik tarzda Google kompaniyasiga yubormoqda. Ushbu axborotdan farzandingiz shaxsini aniqlash uchun foydalanilmaydi. Ular tizim va ilovalar barqarorligi kabilarni yaxshilash uchun ishlatiladi. Ayrim toʻplangan maʼlumotlar Android dasturchilar kabi hamkorlarimizga ham oʻz ilovalari va mahsulotlarini yanada yaxshilashga yordam beradi. Agar farzandingiz uchun Veb va ilovalardagi kengaytirilgan faoliyat tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi.</translation> <translation id="8640575194957831802">Oxirgi marta ochilgan</translation> <translation id="8641946446576357115">Parollaringizdan iOS qurilmalaringizda foydalaning</translation> +<translation id="8642577642520207435"><ph name="APP_NAME" /> kameraga ruxsat</translation> <translation id="8642900771896232685">2 soniya</translation> <translation id="8642947597466641025">Matnni yiriklashtirish</translation> <translation id="8643403533759285912">Guruhni olib tashlash</translation> @@ -9860,6 +9894,7 @@ <translation id="8662978096466608964">Chrome bu rasmni orqa fonga o‘rnata olmadi.</translation> <translation id="8663051876219324457">Ilova, sayt va tizim xizmatlari joylashuvingizni koʻrishiga ruxsat bering Joylashuvni aniqlash xizmati bu qurilmaning joylashuvini bilish uchun Wi-Fi, mobil tarmoqlar va sensorlar kabi manbalardan foydalanadi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="8663099077749055505"><ph name="HOST" /> saytida bir nechta fayl avtomatik yuklab olinishi doim taqiqlansin</translation> +<translation id="8664249499245357248">Guruh nomiga oʻng klik bosing</translation> <translation id="8664389313780386848">&Sahifa kodini ko‘rish</translation> <translation id="8665110742939124773">Ruxsat kodi xato kiritildi. Qayta urining.</translation> <translation id="8665180165765946056">Zaxiralandi</translation> @@ -10184,6 +10219,7 @@ <translation id="8900413463156971200">Mobil tarmoqni yoqish</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> maʼlumotlaringizni zaxiralash va bu <ph name="DEVICE_TYPE" /> qurilmasini bugunoq qaytarishingizni talab qilmoqda.}other{<ph name="MANAGER" /> maʼlumotlaringizni zaxiralash va bu <ph name="DEVICE_TYPE" /> qurilmasini bugunoq qaytarishingizni talab qilmoqda.}}</translation> <translation id="8902667442496790482">Teginib tinglash sozlamalarini ochish</translation> +<translation id="8903733144777177139">Mikrofonga ruxsat bloklandi</translation> <translation id="890616557918890486">Manbani almashtirish</translation> <translation id="8907701755790961703">Mamlakatni tanlang</translation> <translation id="8908420399006197927">Varaqni tavsiya etilgan guruhdan chiqarib tashlash</translation> @@ -10221,6 +10257,7 @@ <translation id="8934732568177537184">Davom etish</translation> <translation id="8938800817013097409">USB-C qurilma (orqa tomondagi o‘ng port)</translation> <translation id="8940081510938872932">Ayni paytda kompyuteringiz o‘ta ko‘p ishlarni bajarmoqda. Keyinroq urinib ko‘ring.</translation> +<translation id="8940228279218723234">Ilova va saytlar hamda tizim xizmatlariga kameradan foydalanishga ruxsat berish. Kameradan foydalanish uchun ilovani qayta oching yoki sahifani yangilang.</translation> <translation id="8940381019874223173">Google Photos xizmatidan</translation> <translation id="8940888110818450052">Kirish parametrlari</translation> <translation id="8941173171815156065">“<ph name="PERMISSION" />” ruxsatnomalarini bekor qilish</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 62e6bc3..47d66a16 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">Đã kết nối với điện thoại Android</translation> <translation id="1523279371236772909">Từng xem trong tháng trước</translation> <translation id="1523978563989812243">Các công cụ chuyển văn bản sang lời nói</translation> -<translation id="1524430321211440688">Bàn phím</translation> <translation id="1524563461097350801">Không, cảm ơn</translation> <translation id="1525740877599838384">Chỉ sử dụng Wi-Fi để xác định vị trí</translation> <translation id="152629053603783244">Khởi động lại Linux</translation> @@ -3923,7 +3922,6 @@ <translation id="3966072572894326936">Chọn một thư mục khác...</translation> <translation id="3966094581547899417">Thông tin chi tiết về điểm phát sóng</translation> <translation id="3967822245660637423">Đã tải xuống xong</translation> -<translation id="3967841595862839006">Chọn ngôn ngữ và bàn phím của bạn</translation> <translation id="3968739731834770921">Kana</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">Đang tính...</translation> @@ -4605,7 +4603,6 @@ <translation id="4513872120116766993">Gợi ý khi viết</translation> <translation id="4513946894732546136">Phản hồi</translation> <translation id="4515872537870654449">Hãy liên hệ với Dell để được bảo dưỡng. Đế sạc sẽ tắt nếu quạt không hoạt động.</translation> -<translation id="4516008165284813420">Hãy đảm bảo <ph name="DEVICE_TYPE" /> đã kết nối với Internet rồi thử lại. Bạn cũng có thể truy cập play.google.com/about/play-terms trên một thiết bị khác.</translation> <translation id="4518840066030486079">Kiểu chế độ phím Shift</translation> <translation id="4519331665958994620">Các trang web có thể yêu cầu sử dụng máy ảnh của bạn</translation> <translation id="4519605771716872386">Tính năng đồng bộ hoá tệp đã bật</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index cf6c4dc1..21689e9a 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -674,7 +674,6 @@ <translation id="1521933835545997395">已连接到 Android 手机</translation> <translation id="1523279371236772909">过去一个月内看过</translation> <translation id="1523978563989812243">文字转语音引擎</translation> -<translation id="1524430321211440688">键盘</translation> <translation id="1524563461097350801">不用了</translation> <translation id="1525740877599838384">仅根据 Wi-Fi 确定位置</translation> <translation id="152629053603783244">重启 Linux</translation> @@ -2195,7 +2194,7 @@ <translation id="2643698698624765890">您可以通过点击“窗口”菜单中的“扩展程序”,管理您的扩展程序。</translation> <translation id="2645047101481282803">您的设备由 <ph name="PROFILE_NAME" /> 管理</translation> <translation id="2645388244376970260">正在将此标签页投放到“<ph name="DEVICE_NAME" />”</translation> -<translation id="2645435784669275700">Chrome 操作系统</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="264897126871533291">红色弱</translation> <translation id="2649045351178520408">Base64 编码 ASCII,证书链</translation> <translation id="265156376773362237">标准预加载</translation> @@ -3204,7 +3203,7 @@ <translation id="3446274660183028131">请启动 Parallels Desktop 以安装 Windows。</translation> <translation id="344630545793878684">读取您在一些网站上的数据</translation> <translation id="3446548199318150462">启用全新桌面版设计。此外,还必须启用“自定义 Chrome 侧边栏”。</translation> -<translation id="3447644283769633681">拦截所有第三方 Cookie</translation> +<translation id="3447644283769633681">阻止所有第三方 Cookie</translation> <translation id="3447797901512053632">正在将“<ph name="TAB_NAME" />”投放到“<ph name="DEVICE_NAME" />”</translation> <translation id="3448492834076427715">更新账号</translation> <translation id="3449393517661170867">打开新的标签页窗口</translation> @@ -3899,7 +3898,6 @@ <translation id="3966072572894326936">选择其他文件夹...</translation> <translation id="3966094581547899417">热点详情</translation> <translation id="3967822245660637423">下载完毕</translation> -<translation id="3967841595862839006">选择语言和键盘</translation> <translation id="3968739731834770921">假名</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">正在计算...</translation> @@ -4580,7 +4578,6 @@ <translation id="4513872120116766993">预测性撰写</translation> <translation id="4513946894732546136">反馈</translation> <translation id="4515872537870654449">请联系戴尔以获取帮助。如果风扇停止工作,基座将会关闭。</translation> -<translation id="4516008165284813420">请确保您的 <ph name="DEVICE_TYPE" /> 已连接到互联网,然后重试您还可以在另一部设备上访问 play.google.com/about/play-terms。</translation> <translation id="4518840066030486079">Shift 键模式样式</translation> <translation id="4519331665958994620">网站可以请求使用您的摄像头</translation> <translation id="4519605771716872386">已开启文件同步</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 1ea4cc0..b428f5ea 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -682,7 +682,6 @@ <translation id="1521933835545997395">已連線至 Android 手機</translation> <translation id="1523279371236772909">上個月看過</translation> <translation id="1523978563989812243">「文字轉語音」引擎</translation> -<translation id="1524430321211440688">鍵盤</translation> <translation id="1524563461097350801">不用了,謝謝</translation> <translation id="1525740877599838384">只使用 Wi-Fi 確定位置</translation> <translation id="152629053603783244">重新啟動 Linux</translation> @@ -3921,7 +3920,6 @@ <translation id="3966072572894326936">選擇其他資料夾…</translation> <translation id="3966094581547899417">熱點詳情</translation> <translation id="3967822245660637423">下載完成</translation> -<translation id="3967841595862839006">選擇語言和鍵盤</translation> <translation id="3968739731834770921">假名</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">計算中…</translation> @@ -4601,7 +4599,6 @@ <translation id="4513872120116766993">預測輸入內容</translation> <translation id="4513946894732546136">意見反映</translation> <translation id="4515872537870654449">請聯絡 Dell 以取得支援服務。風扇故障時,插座會停止運作。</translation> -<translation id="4516008165284813420">請確定你的 <ph name="DEVICE_TYPE" /> 已連線到互聯網,然後再試一次。你亦可使用其他裝置前往 play.google.com/about/play-terms。</translation> <translation id="4518840066030486079">Shift 鍵模式樣式</translation> <translation id="4519331665958994620">網站可要求使用攝錄機</translation> <translation id="4519605771716872386">已開啟檔案同步處理功能</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 85a5db7..1ece4255 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -679,7 +679,6 @@ <translation id="1521933835545997395">已連線到 Android 手機</translation> <translation id="1523279371236772909">過去一個月看過</translation> <translation id="1523978563989812243">文字轉語音的引擎</translation> -<translation id="1524430321211440688">鍵盤</translation> <translation id="1524563461097350801">不用了,謝謝</translation> <translation id="1525740877599838384">僅使用 Wi-Fi 判斷所在位置</translation> <translation id="152629053603783244">重新啟動 Linux</translation> @@ -3907,7 +3906,6 @@ <translation id="3966072572894326936">選擇其他資料夾...</translation> <translation id="3966094581547899417">無線基地台詳細資料</translation> <translation id="3967822245660637423">下載完成</translation> -<translation id="3967841595862839006">選擇語言和鍵盤</translation> <translation id="3968739731834770921">假名</translation> <translation id="3970114302595058915">ID</translation> <translation id="397105322502079400">計算中…</translation> @@ -4588,7 +4586,6 @@ <translation id="4513872120116766993">預測書寫建議</translation> <translation id="4513946894732546136">意見回饋</translation> <translation id="4515872537870654449">請聯絡 Dell 以取得支援服務。風扇故障時,座架將會停止運作。</translation> -<translation id="4516008165284813420">請確認 <ph name="DEVICE_TYPE" /> 已連上網際網路,然後再試一次。你也可以使用其他裝置前往 play.google.com/about/play-terms。</translation> <translation id="4518840066030486079">Shift 鍵模式樣式</translation> <translation id="4519331665958994620">網站可以要求使用你的攝影機</translation> <translation id="4519605771716872386">檔案同步處理功能已開啟</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index b1a5579..7042ffe 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -344,6 +344,7 @@ <translation id="1251578593170406502">Iskena amanethiwekhi wedatha yeselula...</translation> <translation id="125220115284141797">Zenzekela</translation> <translation id="1252219782845132919">Fihla iqembu</translation> +<translation id="1252714168533640068">Ukuze uvule kabusha iqembu, chofoza egameni leqembu</translation> <translation id="1252987234827889034">Kuvele iphutha lephrofayela</translation> <translation id="1253664522045778676">Chofoza kumphumela futhi ikhasi lizovuleka kuthebhu yakho yamanje</translation> <translation id="1254593899333212300">Qondisa ukuxhumeka kwe-inthanethi</translation> @@ -625,6 +626,7 @@ <translation id="1476347941828409626">&Phatha amaphrofayela e-Chrome</translation> <translation id="1476607407192946488">&Izilungiselelo zolimi</translation> <translation id="1477446329585670721">I-<ph name="DOMAIN" /> idinga ukuba ugcine ikhadi lakho elimsathi lifakiwe.</translation> +<translation id="1477645000789043442">Isungula amaqembu amathebhu ngokuzenzakalelayo kuye ngamathebhu owavulile. Ukuze usebenzise lesi sakhi, chofoza ithebhu ngesokudla segundane bese uchofoza okuthi Hlela amathebhu afanayo.</translation> <translation id="1477654881618305065">Inhlangano yakho ayikuvumeli ukuthi wabelane ngalokhu okuqukethwe. Uma udinga usizo, xhumana nomlawuli wakho.</translation> <translation id="1478340334823509079">Imininingwane: <ph name="FILE_NAME" /></translation> <translation id="1478607704480248626">Ukufakwa akunikiwe amandla</translation> @@ -681,7 +683,6 @@ <translation id="1521933835545997395">Ixhumeke kufoni ye-Android</translation> <translation id="1523279371236772909">Kubukwe enyangeni edlule</translation> <translation id="1523978563989812243">Izinjini zokuguqula-umbhalo-ube-inkulumo</translation> -<translation id="1524430321211440688">Ikhibhodi</translation> <translation id="1524563461097350801">Cha, Ngiyabonga</translation> <translation id="1525740877599838384">Sebenzisa kuphela i-Wi-Fi ukuze unqume indawo</translation> <translation id="152629053603783244">Qala kabusha i-Linux</translation> @@ -880,6 +881,7 @@ <translation id="1648439345221797326">U-ctrl + u-shift + <ph name="TOP_ROW_KEY" /></translation> <translation id="1648528859488547844">Sebenzisa i-Wi-Fi noma amanethiwekhi eselula ukuze unqume indawo</translation> <translation id="164936512206786300">Susa ukubhangqa idivayisi ye-Bluetooth</translation> +<translation id="1650407365859096313">Ivula kuthebhu entsha, Imvume ithi <ph name="PERMISSION_STATE" /></translation> <translation id="1650801028905250434">Amafayela akho kokuthi Idrayivu Yami azovumelaniswa ku-Chromebook yakho ngokuzenzekelayo ukuze ukwazi ukuwafinyelela ngaphandle koxhumano lwe-inthanethi. Ungashintsha lokhu noma kunini kokuthi Amasethingi > Amafayela.</translation> <translation id="1651008383952180276">Kuzomele ufake umusho wokungena ofanayo kabili</translation> <translation id="1651609627703324721">Le thebhu yethula okuqukethwe kwe-VR ku-earphone</translation> @@ -1124,6 +1126,7 @@ <translation id="1828901632669367785">Phrinta usebenzisa ingxoxo yesistimu...</translation> <translation id="1829129547161959350">I-penguin</translation> <translation id="1829192082282182671">&Hlehlisa isithombe</translation> +<translation id="182973053761690772">Ishejuli yokushona kwelanga</translation> <translation id="1830550083491357902">Ayingenile ngemvume</translation> <translation id="1831848493690504725">Asikwazi ukufinyelela i-Google ngenethiwekhi exhunyiwe. Zama ukukhetha inethiwekhi ehlukile noma ukuhlola amasethingi enethiwekhi yakho noma amasethingi ommeleli (uma usebenzisa ummeleli).</translation> <translation id="1832459821645506983">Yebo, ngingenile</translation> @@ -1181,6 +1184,7 @@ <translation id="1871615898038944731">I-<ph name="DEVICE_TYPE" /> yakho isesikhathini samanje</translation> <translation id="1873920700418191231">Vumela izimvume futhi ze-<ph name="WEBSITE" /></translation> <translation id="1874248162548993294">Ivumelekile ukubonisa noma yiziphi izikhangiso</translation> +<translation id="1874794096607967241">Vumela ama-app namawebhusayithi anemvume yemakrofoni namasevisi esistimu ukuthi akwazi ukufinyelela</translation> <translation id="1874874185178737347">Hlela Amathebhu</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Hambisa ithebhu kwelinye iwindi}one{Hambisa amathebhu kwelinye iwindi}other{Hambisa amathebhu kwelinye iwindi}}</translation> <translation id="1875387611427697908">Lokhu kungangezwa kuphela kusukela ku-<ph name="CHROME_WEB_STORE" /></translation> @@ -1220,6 +1224,7 @@ <translation id="1901303067676059328">Khetha &konke</translation> <translation id="1903542130902305074">Setha</translation> <translation id="1904580727789512086">Ama-URL owavakashelayo alondolozwe ku-akhawunti yakho ye-Google</translation> +<translation id="1904603806662441960">Lawula izimvume zekhamera yamasayithi ku-Chrome</translation> <translation id="1905375423839394163">Igama ledivayisi ye-Chromebook</translation> <translation id="1906181697255754968">Amasayithi avamise ukufinyelela kumafayela namafolda kudivayisi yakho kuzici ezifana nokulondoloza ngokuzenzakalela umsebenzi wakho</translation> <translation id="1906488504371069394">Vumbulula izandiso ezengeziwe namatimu <ph name="BEGIN_LINK" />Esitolo Sewebhu Se-Chrome<ph name="END_LINK" /></translation> @@ -1360,6 +1365,7 @@ <translation id="200928901437634269">Sebenzisa i-Google Account yengane yakho noma i-akhawunti yesikole. Ungakwazi futhi ukusetha izilawuli zomzali.</translation> <translation id="2009590708342941694">Ithuluzi Le-Emoji</translation> <translation id="2010501376126504057">Amadivayisi ahambisanayo</translation> +<translation id="201217432804812273">Vula okuthi "Londoloza Iqembu"</translation> <translation id="2012935757369720523">Sula ifayela</translation> <translation id="2013550551806600826">Yizame. Vula noma uvale isethingi, bese uskrola ngeminwe emibili kuphedi yakho yokuthinta endaweni yokuhlola. Ungaphinda uthole lokhu kamuva kokuthi Amasethingi > Idivayisi > I-mouse nephedi yokuthinta.</translation> <translation id="2015232545623037616">I-PC ne-Chromecast kunethiwekhi efanayo ye-Wi-Fi</translation> @@ -1785,6 +1791,7 @@ <translation id="2314165183524574721">Isethingi lamanje lokubonakala lifihliwe</translation> <translation id="2314774579020744484">Ulimi olusetshenziswe uma kuhunyushwa amakhasi</translation> <translation id="2316129865977710310">Cha, ngiyabonga</translation> +<translation id="2316433409811863464">Ukusakaza I-app</translation> <translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% owenziwe</translation> <translation id="2318143611928805047">Usayizi wephepha</translation> <translation id="2318817390901984578">Ukuze usebenzise izinhlelo zokusebenza ze-Android, shaja uphinde ubuyekeze i-<ph name="DEVICE_TYPE" /> yakho.</translation> @@ -1971,6 +1978,7 @@ <translation id="2454206500483040640">Kuhlukanisiwe</translation> <translation id="2454247629720664989">Igama elingukhiye</translation> <translation id="2454524890947537054">Gunyaza isicelo sewebhu?</translation> +<translation id="2454913962395846391">Izoni yesikhathi ezenzakalelayo</translation> <translation id="245650153866130664">Ukuze uvuselele ngokuzenzakalela ithikithi, hlola okuthi "Khumbula iphasiwedi." Iphasiwedi yakho izogcinwa kudivayisi yakho kuphela.</translation> <translation id="2456794251167091176">Ukungenisa kuqedile</translation> <translation id="2456827790665612305">Yekela ukulandela isayithi</translation> @@ -2929,6 +2937,7 @@ <translation id="3202499879214571401">Misa ukusakaza isikrini ku-<ph name="DEVICE_NAME" /></translation> <translation id="3202578601642193415">Okusha kakhulu</translation> <translation id="3204648577100496185">Idatha ehlotshaniswa nale app ingase isuswe kule divayisi</translation> +<translation id="3205140624385017621">Ama-app namawebhusayithi anezimvume zekhamera, kanye namasevisi esistimu angayisebenzisa ikhamera yakho. Ukuze usebenzise ikhamera, ungase udinge ukuyiqala kabusha i-app noma ukuvuselela ikhasi.</translation> <translation id="3207344462385471911">Ubona ukusesha okuphakanyisiwe kanye nezephulelo zokuthenga ongase uzithande ngokusekelwe ezenzweni zakho zakamuva. <ph name="BREAK" /> <ph name="BREAK" /> @@ -3206,6 +3215,7 @@ <translation id="3434272557872943250">Uma isilungiselelo esingeziwe sewebhu nesohlelo lokusebenza sivulelwe ingane yakho, le datha ingalondolozwa ku-akhawunti yakhe ye-Google. Funda kabanzi ngalezi zilungiselelo nendlela yokuzilungisa kwethi families.google.com.</translation> <translation id="3434475275396485144">Le sethingi iphethwe ngumlawuli wefoni yakho</translation> <translation id="3434512374684753970">Umsindo Nevidiyo</translation> +<translation id="3435381311628654443">Vumela ama-app namawebhusayithi anemvume yemakrofoni namasevisi esistimu ukuthi akwazi ukufinyelela</translation> <translation id="3435688026795609344">I-"<ph name="EXTENSION_NAME" />" icela i-<ph name="CODE_TYPE" /> yakho</translation> <translation id="3435738964857648380">Ukuvikela</translation> <translation id="343578350365773421">Kuphele amaphepha</translation> @@ -3283,6 +3293,7 @@ <translation id="3491669675709357988">I-akhawunti yengane yakho ayisethiwe ngezilawuli zomzali ze-Family Link. Ungakwazi ukwengeza izilawuli zomzali ngemva kokuqedela ukusetha. Uzothola ulwazi lwezilawuli zomzali kuhlelo lokusebenza Lokuhlola.</translation> <translation id="3491678231052507920">Amasayithi avamise ukusebenzisa amadivayisi ako ento engekho ngokoqobo nedatha ukuze uvunyelwe ukuthi ungene kumaseshini e-VR</translation> <translation id="3493043608231401654">Susa i-<ph name="TAB_TITLE" /> kuyiqembu lethebhu</translation> +<translation id="3493463599276143766">Awekho amawebhusayithi avumelekile ukusebenzisa ikhamera yakho</translation> <translation id="3493486281776271508">Ukuxhumeka kwe-inthanethi kuyadingeka</translation> <translation id="3493881266323043047">Ukuqinisekisa</translation> <translation id="3495496470825196617">Amandla angenzi lutho lapho ishaja</translation> @@ -3601,6 +3612,7 @@ <translation id="3733296813637058299">Sizokufakela lawo ma-app. Ungathola ama-app amaningi we-<ph name="DEVICE_TYPE" /> yakho ku-Google Play Isitolo.</translation> <translation id="3735039640698208086">Uma idlala umsindo...</translation> <translation id="3735740477244556633">Hlunga nge-</translation> +<translation id="3735827758948958091">Ayikwazi ukuvula i-<ph name="FILE_NAMES" /> uma usaxhume ku-inthanethi ekala ngamamitha</translation> <translation id="3738632186060045350">Idatha ye-<ph name="DEVICE_TYPE" /> izosuswa emahoreni angama-24</translation> <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">Vula i-<ph name="APPLICATION" />?</translation> @@ -3869,6 +3881,7 @@ <translation id="3925573269917483990">Ikhamela:</translation> <translation id="3925926055063465902">Abanye abasebenzisi kule divayisi bangasebenzisa le nethiwekhi</translation> <translation id="3926002189479431949">Ifoni ye-Smart Lock iguquliwe</translation> +<translation id="3926410220776569451">Ukufinyelela kwekhamera kuvinjiwe</translation> <translation id="3927932062596804919">Phika</translation> <translation id="3928570707778085600">Ilondoloze ushintsho ku-<ph name="FILE_OR_FOLDER_NAME" />?</translation> <translation id="3928659086758780856">Uyinki sewuyaphela</translation> @@ -3923,7 +3936,6 @@ <translation id="3966072572894326936">Khetha enye ifolda...</translation> <translation id="3966094581547899417">Imininingwane ye-Hotspot</translation> <translation id="3967822245660637423">Ukulanda kuqedile</translation> -<translation id="3967841595862839006">Khetha ulwimi lakho nekhibhodi</translation> <translation id="3968739731834770921">I-Kana</translation> <translation id="3970114302595058915">I-ID</translation> <translation id="397105322502079400">Iyabala...</translation> @@ -4063,6 +4075,7 @@ <translation id="4078738236287221428">Udlame</translation> <translation id="4078903002989614318">Ukuhlunga kanye nokukhethwa kukho kohlu</translation> <translation id="4079140982534148664">Sebenzisa Ukuhlola Kwesipele Okuthuthukisiwe</translation> +<translation id="4082333918978320301">Awekho amawebhusayithi avumelekile ukusebenzisa imakrofoni yakho</translation> <translation id="4084582735848141214">{COUNT,plural, =1{Isayithi eli-1 livunyelwe}one{Amasayithi angu-# avunyelwe}other{Amasayithi angu-# avunyelwe}}</translation> <translation id="4084682180776658562">Ibhukhimakhi</translation> <translation id="4084835346725913160">Vala <ph name="TAB_NAME" /></translation> @@ -4212,6 +4225,7 @@ <translation id="4201546031411513170">Ungahlala ukhetha ukuthi yini okumele ivunyelaniswe kuzilungiselelo.</translation> <translation id="4203065553461038553">Igama lefayela noma indawo yinde kakhulu</translation> <translation id="4203769790323223880">Ikhamera ayivunyelwe</translation> +<translation id="4204415812590935863">Ayikwazi ukusungula itimu njengamanje.</translation> <translation id="4205157409548006256">Kube nephutha ngenkathi kulungiselelwa i-Linux.</translation> <translation id="4206144641569145248">I-alien</translation> <translation id="4206323443866416204">Umbiko wokuphendula</translation> @@ -4553,6 +4567,7 @@ <translation id="447252321002412580">Siza ukuthuthukisa izici ze-Chrome nokusebenza</translation> <translation id="4472533928615930332">Kukhiqizwe isithombe <ph name="INDEX" /> se-<ph name="SUBJECT" />, ngesitayela esithi <ph name="STYLE" /></translation> <translation id="4472575034687746823">Qalisa</translation> +<translation id="4473559657152613417">Chofoza ithebhu usebenzisa esokudla segundane bese ukhetha okuthi "Engeza Ithebhu Eqenjini Elisha"</translation> <translation id="4473996011558324141">ukulinganisela isikhathi</translation> <translation id="4474155171896946103">Beka uphawu lokubekisa wonke amathebhu...</translation> <translation id="4475552974751346499">Sesha ukulandwa</translation> @@ -4605,7 +4620,6 @@ <translation id="4513872120116766993">Ukubhala kokubikezela</translation> <translation id="4513946894732546136">Impendulo</translation> <translation id="4515872537870654449">Xhumana ne-Dell ukuze uthole isevisi. Idokhu izovala uma ifeni ingasebenzi.</translation> -<translation id="4516008165284813420">Qiniseka ukuthi i-<ph name="DEVICE_TYPE" /> yakho ixhumekile ku-inthanethi bese uyazama futhi. Ungaphinda uvakashele okuthi play.google.com/about/play-terms kwenye idivayisi.</translation> <translation id="4518840066030486079">Isitayela Semodi Yokhiye We-Shift</translation> <translation id="4519331665958994620">Amasayithi angacela ukusebenzisa ikhamera yakho</translation> <translation id="4519605771716872386">Ukuvumelanisa ifayela kuvuliwe</translation> @@ -4649,6 +4663,7 @@ <translation id="4547672827276975204">Setha ngokuzenzakalela</translation> <translation id="4548858987594081919">Ukuze usize Umphathi Wephasiwedi ye-Google ukuthi alondoloze ulwazi lwakho lokungena ngemvume, engeza igama lakho lomsebenzisi lale sayithi</translation> <translation id="4549791035683739768">Ukhiye wakho wokuqinisekisa ubunikazi awunazo izigxivizo zeminwe ezigciniwe</translation> +<translation id="4550737096585299960">Sicela uzame futhi ngemva kwemizuzu embalwa.</translation> <translation id="4550926046134589611">Amanye amalinki asekelwayo asazovuleka ku-<ph name="APP_NAME" />.</translation> <translation id="4551379727767354516">Amatimu e-AI akho amuva</translation> <translation id="4551763574344810652">Cindezela ku-<ph name="MODIFIER_KEY_DESCRIPTION" /> ukuze uhlehlise</translation> @@ -5273,6 +5288,7 @@ <translation id="5051461727068120271">Dawuniloda ifayela elingaqinisekisiwe</translation> <translation id="5051836348807686060">Ukuhlolwa kokupeleta akusekelwe kuzilimi ozikhethile</translation> <translation id="5052499409147950210">Hlela isayithi</translation> +<translation id="5052853071318006357">Chofoza ithebhu usebenzisa esokudla segundane bese ukhetha okuthi "Engeza ithebhu eqenjini elisha"</translation> <translation id="5053233576223592551">Faka Igama lomsebenzisi</translation> <translation id="505347685865235222">Iqembu elingaqanjiwe - <ph name="GROUP_CONTENT_STRING" /></translation> <translation id="5054374119096692193">Bona konke okukhethwayo kwekhadi kokuthi <ph name="BEGIN_LINK" />Yenza ngokwezifiso I-Chrome<ph name="END_LINK" /></translation> @@ -5309,6 +5325,7 @@ <translation id="5078638979202084724">Beka uphawu lokubekisa kuwo wonke amathebhu</translation> <translation id="5078796286268621944">Iphinikhodi engalungile</translation> <translation id="5079010647467150187">Faka i-VPN eyakhelwe ngaphakathi...</translation> +<translation id="5079460277417557557">Manje usungasebenzisa amaqembu amathebhu alondoloziwe kumadivayisi akho edeskithophu ongene ngemvume kuwo</translation> <translation id="5079699784114005398">Uma sekuvuliwe, ama-app akho azotholakala kunoma yimaphi amadivayisi e-ChromeOS ngemva kokungena ngemvume nge-Google Account yakho. Ama-app ewebhu afakwe kubhrawuza ye-Chrome izovunyelaniswa noma ukuvumelanisa kwebhrawuza kuvaliwe.</translation> <translation id="508059534790499809">Vuselela ithikithi le-Kerberos</translation> <translation id="5081124414979006563">&Vula Iphrofayela Yesivakashi</translation> @@ -5372,6 +5389,7 @@ <translation id="5125967981703109366">Mayelana naleli khadi</translation> <translation id="512642543295077915">sesha + backspace</translation> <translation id="5126611267288187364">Buka ushintsho</translation> +<translation id="512761462447738469">Ama-app namawebhusayithi anezimvume zekhamera, kanye namasevisi esistimu angayisebenzisa ikhamera yakho.</translation> <translation id="5127620150973591153">I-ID yoxumo oluphephile: <ph name="TOKEN" /></translation> <translation id="5127805178023152808">Ukuvumelanisa kuvaliwe</translation> <translation id="5127881134400491887">Phatha ukuxhumeka kwenethiwekhi</translation> @@ -6078,6 +6096,7 @@ <translation id="5691581861107245578">Thola iziphakamiso ze-emoji ngokusekelwe kulokho okuthayipayo</translation> <translation id="5691772641933328258">Isigxivizo somunwe asaziwa</translation> <translation id="5692183275898619210">Ukuphrinta kuqediwe</translation> +<translation id="5693237475389615913">Lawula izimvume zemakrofoni yamasayithi ku-Chrome</translation> <translation id="5693255400847650006">Imakrofoni iyasebenza</translation> <translation id="5695184138696833495">I-ADB yohlelo lokusebenza le-Linux Android</translation> <translation id="5696143504434933566">Bika ukuhlukumeza kusuka ku-"<ph name="EXTENSION_NAME" />"</translation> @@ -6099,6 +6118,7 @@ <translation id="5708171344853220004">Igama lothisha nhloko we-Microsoft</translation> <translation id="5709557627224531708">Setha i-Chrome njengesiphequluli sakho esizenzakalelayo</translation> <translation id="5711010025974903573">Amalogu wesevisi</translation> +<translation id="5711324642850167289">Awekho ama-app avumelekile sebenzisa imakrofoni yakho</translation> <translation id="5711983031544731014">Ayikwazi ukuvula. Faka phasiwedi yakho.</translation> <translation id="5712153969432126546">Amasayithi ngezinye izikhathi ashicilela ama-PDF, njengamadokhumenti, izinkontileka, namafomu</translation> <translation id="571222594670061844">Amasayithi angabonisa imiyalo yokungena ngemvume kusukela kumasevisi kamazisi</translation> @@ -6290,6 +6310,7 @@ <translation id="5862319196656206789">Setha amadivayisi axhunyiwe</translation> <translation id="5862731021271217234">Ukuze uthole amathebhu akho kusukela kwamanye amadivayisi akho, vula ukuvumelanisa</translation> <translation id="5863195274347579748">Izinsiza zangaphandle zingakwazi ukufinyelela noma ukwabelana ngedatha yomuntu siqu.</translation> +<translation id="5863263400083022538">Amasevisi esistimu</translation> <translation id="5863445608433396414">Nika amandla izici zokususa amaphutha</translation> <translation id="5863515189965725638">Hlela i-IBAN</translation> <translation id="5864195618110239517">Sebenzisa ukuxhuma okwenziwe imitha</translation> @@ -6729,6 +6750,7 @@ <translation id="6207937957461833379">Izwe / Isifunda</translation> <translation id="6208521041562685716">Idatha yeselula iyasetshenziswa</translation> <translation id="6208725777148613371">Yehlulekile ukulondoloza ku-<ph name="WEB_DRIVE" /> - <ph name="INTERRUPT_REASON" /></translation> +<translation id="6209135795240627482">Ama-app namawebhusayithi anezimvume zemakrofoni, kanye namasevisi esistimu angayisebenzisa imakrofoni yakho</translation> <translation id="6209838773933913227">Ibuyekeza ingxenye</translation> <translation id="6209908325007204267">Idivayisi yakho ibandakanya Ukuthuthukiswa kwe-Chrome Enterprise, kodwa igama lomsebenzisi lakho alihlobene ne-akhawunti yebhizinisi. Sicela udale i-akhawunti yebhizinisi ngokuvakashela ethi, g.co/ChromeEnterpriseAccount edivayisini yesibili.</translation> <translation id="6210282067670792090">Kubha yekheli, sebenzisa isinqamuleli sekhibhodi ngezinqamuleli zezinjini zokusesha nokusesha isayithi</translation> @@ -7063,6 +7085,7 @@ <translation id="6478248366783946499">Gcina ifayela eliyingozi?</translation> <translation id="6479881432656947268">Vakashela Isitolo Sewebhu Se-Chrome</translation> <translation id="6480327114083866287">Iphethwe yi-<ph name="MANAGER" /></translation> +<translation id="6481749622989211463">Yabelana ngamafayela nokunye namadivayisi aseduze <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="6482559668224714696">Isikhulisi sesikrini esidokhiwe</translation> <translation id="6483485061007832714">Vula ukulandwa</translation> <translation id="6483805311199035658">Ivula i-<ph name="FILE" />...</translation> @@ -7313,6 +7336,7 @@ <translation id="6680650203439190394">Linganisela</translation> <translation id="6683022854667115063">Ama-headphone</translation> <translation id="6683087162435654533">Phindisela Wonke Amathebhu</translation> +<translation id="6683433919380522900">Imvume ithi <ph name="PERMISSION_STATE" /></translation> <translation id="6684827949542560880">Ilanda isibuyekezo sakamuva</translation> <translation id="668599234725812620">Vula i-Google Play</translation> <translation id="6686490380836145850">Vala amathebhu ngakwesokudla</translation> @@ -8126,6 +8150,7 @@ <translation id="7330533963640151632">Amasethingi e-<ph name="FEATURE_NAME" /> edivayisi ka-<ph name="USER_NAME" />, ukwabelana ngaphansi kwe-akhawunti ethi <ph name="USER_EMAIL" />.</translation> <translation id="7331646370422660166">alt + umcibisholo waphansi</translation> <translation id="7332053360324989309">Isisebenzi Ezikhuthele: <ph name="SCRIPT_URL" /></translation> +<translation id="7333388112938984914">Ayikwazi ukulayisha amafayela uma usaxhume ku-inthanethi ekala ngamamitha.</translation> <translation id="7333669215417470379">Yenza isipele futhi ubuyisele ama-app akho namasethingi</translation> <translation id="7335436113423103413">Inika amandla ikhono lokusebenzisa i-Chrome Ngendlela oyifisayo ukusuka kuphaneli eseceleni ehlanganiswe Ekhasini Lethebhu Entsha.</translation> <translation id="7335974957018254119">Sebenzisela ukuhlola isipele ku-</translation> @@ -8282,6 +8307,7 @@ <translation id="7436452443388501706">{NUM_EXTENSIONS,plural, =1{Buyekeza isandiso esi-1 esehlisiwe Kusitolo Sewebhu se-Chrome}one{Buyekeza izandiso ezingu-{NUM_EXTENSIONS} ezehlisiwe Kusitolo Sewebhu se-Chrome}other{Buyekeza izandiso ezingu-{NUM_EXTENSIONS} ezehlisiwe Kusitolo Sewebhu se-Chrome}}</translation> <translation id="7436921188514130341">Hawu, iphutha! Kube nephutha ngesikhathi sokuqamba kabusha.</translation> <translation id="7439519621174723623">Engeza igama ledivayisi ukuze uqhubeke</translation> +<translation id="7441736532026945583">Khetha okuthi "Fihla Iqembu" ukuze ususe iqembu emugqeni wamathebhu akho</translation> <translation id="7441736921018636843">Ukuze ushintshe lesi silungiselelo, <ph name="BEGIN_LINK" />setha kabusha ukuvumelanisa<ph name="END_LINK" /> ukuze ususe umshwana wakho wokuvumelanisa</translation> <translation id="7441830548568730290">Abanye abasebenzisi</translation> <translation id="744341768939279100">Dala iphrofayela entsha</translation> @@ -8881,6 +8907,7 @@ <translation id="7887864092952184874">Igundane le-Bluetooth libhanqiwe</translation> <translation id="7889371445710865055">Shintsha ulimi Lokubizela</translation> <translation id="7890147169288018054">Bona ulwazi lwenethiwekhi, njengekheli lakho le-IP noma le-MAC</translation> +<translation id="7892005672811746207">Vula okuthi "Londoloza iqembu"</translation> <translation id="7892384782944609022">Ayikwazanga ukubhangqa. Khetha idivayisi ukuze uqale futhi.</translation> <translation id="7893008570150657497">Finyelela kuzithombe, umculo, nenye imidiya kusuka kukhompyutha yakho</translation> <translation id="7893153962594818789">I-Bluetooth ivalekile kule <ph name="DEVICE_TYPE" />. Faka iphasiwedi yakho, bese uvule i-Bluetooth.</translation> @@ -9123,6 +9150,7 @@ <translation id="8064015586118426197">I-ChromeOS Flex</translation> <translation id="8064279191081105977">Iqembu le-<ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /> - <ph name="COLLAPSED_STATE" /></translation> <translation id="8066444921260601116">Ibhokisi lokuxhuma</translation> +<translation id="8070572887926783747">Imvume yendawo ku-<ph name="APP_NAME" /></translation> <translation id="8070662218171013510">Impendulo ezwakalayo</translation> <translation id="8071432093239591881">Phrinta njengesithombe</translation> <translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Idatha yohlelo lokusebenza kungaba inoma iyiphi idatha leyo uhlelo lokusebenza eyilondolozile (ngokususelwe kuzilungiselelo zikanjiniyela), kufaka phakathi idatha efana noxhumana nabo, imilayezo, nezithombe.<ph name="END_PARAGRAPH1" /> @@ -9181,6 +9209,7 @@ <translation id="8109991406044913868">Itimu esingulwe nge-AI</translation> <translation id="8110393529211831722">Ukubhalisa kufakwe kule divayisi kuphela futhi akuvunyelaniswanga namanye amadivayisi ngaphansi kwe-akhawunti yakho. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="8110489095782891123">Ilanda uhlu loxhumana nabo...</translation> +<translation id="8114925369073821854">Imvume yemakrofoni ku-<ph name="APP_NAME" /></translation> <translation id="8115139559594092084">Kusuka ku-Google Drive yakho</translation> <translation id="8116972784401310538">I&siphathi sebhukhimakhi</translation> <translation id="8118276691321086429">I-<ph name="PASSWORD_MANAGER_BRAND" /> ikhumbula ukuthi ungene kanjani ngemvume futhi ukungenise ngokuzenzekelayo uma kwenzeka. Uma uvaliwe, uzocelwa isiqinisekiso njalo.</translation> @@ -9396,6 +9425,7 @@ <translation id="8275038454117074363">Ngenisa</translation> <translation id="8275080796245127762">Ikholi esuka kudivayisi yakho</translation> <translation id="8275339871947079271">Hambisa iphasiwedi yakho ku-akhawunti yakho ye-Google ukuze ufinyelele kuyo ngokuvikelekile noma kuphi lapho ongene khona ngemvume</translation> +<translation id="8276242035951017580">Awekho ama-app avumelekile sebenzisa ikhamera yakho</translation> <translation id="8276560076771292512">Inqolobane engenalutho nokulayisha kabusha okunzima</translation> <translation id="8276850948802942358">Funda kabanzi mayelana nokunikeza isayithi imvume yesikhashana yokusebenzisa amakhukhi ezinkampani ezingahlangene ngqo</translation> <translation id="828180235270931531">Amanye amaphrinta atholakalayo</translation> @@ -9414,6 +9444,7 @@ <translation id="8291942417224950075">Okokusebenzisa komuntu siqu</translation> <translation id="8293206222192510085">Engeza ibhukhimakhi</translation> <translation id="8294431847097064396">Umthombo</translation> +<translation id="8294476140219241086">Isihleli samathebhu</translation> <translation id="8294895455164415895">Vula amasethingi ukuze uvumele i-Chrome isikisele amaqembu ethebhu</translation> <translation id="8295449579927246485">Ukuhumusha Okubukhoma</translation> <translation id="8295450130892483256">Faka i-Microsoft 365</translation> @@ -9526,6 +9557,7 @@ <translation id="8380266723152870797">Igama lewindi</translation> <translation id="8380941800586852976">Okuyingozi</translation> <translation id="8381630473947706877">Vula i-<ph name="FEATURE_NAME" /></translation> +<translation id="8382197851871630452">Isimo sezulu sendawo</translation> <translation id="8382677870544805359">Kuzodingeka usethe kabusha njengasekuqaleni le divayisi ukuze usebenzise izakhi zebhizinisi.</translation> <translation id="8382715499079447151">Isivikelo sokubuka</translation> <translation id="8382913212082956454">Kopisha ikheli le-&imeyili</translation> @@ -9716,6 +9748,7 @@ <translation id="8528962588711550376">Ingena ngemvume.</translation> <translation id="8529578450330869579">Sebenzisa Isistimu Yokwetha Isizinda (DNS) evikelekile ukuze uvimbele abantu abanokufinyelela kuthrafikhi ye-inthanethi yakho ukuba babone ukuthi imaphi amasayithi owavakashelayo. Lokhu kusebenzisa umhlinzeki wesevisi olawulwayo ku-<ph name="DNS_SERVER_TEMPLATE_WITH_IDENTIFIER" /></translation> <translation id="8529925957403338845">Ukuxhumeka okusheshayo kokusebenzisa ifoni njengemodemu kuhlulekile</translation> +<translation id="8531367864749403520">Khetha okuthi "Fihla iqembu" ukuze ususe iqembu emugqeni wamathebhu akho</translation> <translation id="8531701051932785007">Ukuphequlula Ngokuphepha Okugqamile kuvaliwe</translation> <translation id="8533670235862049797">Ukuphequlula Ngokuphepha kuvuliwe</translation> <translation id="8534656636775144800">Eshu! Kukhona okungahambanga kahle ngenkathi uzama ukujoyina isizinda. Sicela uzame futhi.</translation> @@ -9842,6 +9875,7 @@ <translation id="8639635302972078117">Thumela idatha yokusetshenziswa neyokuxilonga. Le divayisi manje ithumela ngokuzenzakalela idatha yokuxilonga, yedivayisi, neyokusetshenziswa kwedatha ku-Google. Lokhu ngeke kusetshenziselwe ukukhomba ingane yakho futhi kuzosiza ukuzinza kwesistimu nokohlelo lokusebenza nokunye ukuthuthukiswa. Enye idatha izophinda isize izinhlelo zokusebenza ze-Google nozakwethu, abafana nonjiniyela be-Android. Uma isilungiselelo esingeziwe sewebhu nesohlelo lokusebenza sivulelwe ingane yakho, le datha ingalondolozwa ku-akhawunti yakhe ye-Google.</translation> <translation id="8640575194957831802">Kugcine ukuvulwa</translation> <translation id="8641946446576357115">Sebenzisa Amaphasiwedi Wakho Kumadivayisi Wakho we-iOS</translation> +<translation id="8642577642520207435">Imvume yekhamera ku-<ph name="APP_NAME" /></translation> <translation id="8642900771896232685">2 amasekhondi</translation> <translation id="8642947597466641025">Yenza umbhalo ube mkhulu</translation> <translation id="8643403533759285912">Sula Iqembu</translation> @@ -9876,6 +9910,7 @@ <translation id="8662978096466608964">I-Chrome ayikwazi ukusetha isithombe sangemuva.</translation> <translation id="8663051876219324457">Vumela ama-app, amawebhusayithi, namasevisi esistimu ukusebenzisa indawo yakho. Indawo ingasebenzisa imithombo enjenge-Wi-Fi, amanethiwekhi weselula, nezinzwa ukusiza ekulinganiseleni indawo yedivaysi yakho. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation> <translation id="8663099077749055505">Hlala uvimba ukulanda okuzenzakalelayo okuningi ku-<ph name="HOST" /></translation> +<translation id="8664249499245357248">Chofoza ngesokudla segundane egameni leqembu</translation> <translation id="8664389313780386848">&Buka umthombo wekhasi</translation> <translation id="8665110742939124773">Ufake ikhodi yokufinyelela engalungile. Zama futhi.</translation> <translation id="8665180165765946056">Ukwenza isipele kuphelele</translation> @@ -10201,6 +10236,7 @@ <translation id="8900413463156971200">Nika amandla iselula</translation> <translation id="8902059453911237649">{NUM_DAYS,plural, =1{I-<ph name="MANAGER" /> idinga ukuba wenze ikhophi yasenqolobaneni yedatha yakho bese ubuyisa le-<ph name="DEVICE_TYPE" /> namuhla.}one{I-<ph name="MANAGER" /> idinga ukuba wenze ikhophi yasenqolobaneni yedatha yakho bese ubuyisa le-<ph name="DEVICE_TYPE" /> ngaphambi komnqamulajuqu.}other{I-<ph name="MANAGER" /> idinga ukuba wenze ikhophi yasenqolobaneni yedatha yakho bese ubuyisa le-<ph name="DEVICE_TYPE" /> ngaphambi komnqamulajuqu.}}</translation> <translation id="8902667442496790482">Vula izilungiselelo khetha ukuze ukhulume</translation> +<translation id="8903733144777177139">Ukufinyelela kwemakrofoni kuvinjiwe</translation> <translation id="890616557918890486">Guqula umthombo</translation> <translation id="8907701755790961703">Sicela ukhethe izwe</translation> <translation id="8908420399006197927">Khipha ithebhu evela eqenjini elisikiselwe</translation> @@ -10238,6 +10274,7 @@ <translation id="8934732568177537184">Qhubeka</translation> <translation id="8938800817013097409">Idivayisi ye-USB-C (imbobo engakwesokudla ngemuva)</translation> <translation id="8940081510938872932">Ikhompyutha yakho yenza izinto eziningi kakhulu khona manje. Zama futhi emuva kwesikhathi.</translation> +<translation id="8940228279218723234">Vumela ama-app namawebhusayithi anemvume yemakrofoni namasevisi esistimu ukuthi akwazi ukufinyelela. Ukuze usebenzise ikhamera, ungase udinge ukuyiqala kabusha i-app noma ukuvuselela ikhasi.</translation> <translation id="8940381019874223173">Kusukela ku-Google Photos yakho</translation> <translation id="8940888110818450052">Okungakhethwa kukho kokungena ngemvume</translation> <translation id="8941173171815156065">Vuselela imvume ye-'<ph name="PERMISSION" />'</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index c1c6a3a5..9e06376b 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -86,7 +86,7 @@ <translation id="234869673307233423">يتعذّر على Chrome التحقّق من كلمات المرور. يُرجى إعادة المحاولة.</translation> <translation id="235650106824528204">يمكن لمشرف الملف الشخصي للعمل إزالة أي بيانات مرتبطة بمتصفِّح Chrome والتي يتم إنشاؤها أثناء استخدام هذا الملف الشخصي (مثل إنشاء الإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى).<ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">متابعة</translation> -<translation id="2401189691232800402">نظام التشغيل Chrome</translation> +<translation id="2401189691232800402">نظام التشغيل ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{كانت إضافة واحدة أو أكثر من إضافات Chrome تصل إلى جهاز HID واحد}=1{تصل إضافة واحدة أو أكثر من إضافات Chrome إلى جهاز HID واحد}two{تصل إضافة واحدة أو أكثر من إضافات Chrome إلى جهازَي HID}few{تصل إضافة واحدة أو أكثر من إضافات Chrome إلى # أجهزة HID}many{تصل إضافة واحدة أو أكثر من إضافات Chrome إلى # جهاز HID}other{تصل إضافة واحدة أو أكثر من إضافات Chrome إلى # جهاز HID}}</translation> <translation id="2424440923901031101">تنتهك هذه الإضافة "سياسة سوق Chrome الإلكتروني"، وقد تكون غير آمنة. يُرجى إزالة هذه الإضافة من Chrome كي لا تتمكّن من الاطّلاع على بياناتك وتغييرها، بما في ذلك معلوماتك الشخصية، على المواقع الإلكترونية التي تزورها.</translation> <translation id="2467438592969358367">يرغب Google Chrome في تصدير كلمات مرورك، لذا يُرجى كتابة كلمة مرور Windows للسماح بذلك.</translation> @@ -106,7 +106,7 @@ <translation id="2597976513418770460">يمكنك الاطّلاع على بياناتك في متصفِّح Chrome من خلال <ph name="ACCOUNT_EMAIL" />.</translation> <translation id="259935314519650377">تعذَّر إجراء تخزين مؤقت للمثبّت الذي تم تنزيله. الخطأ: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">يتعذّر على Chrome البحث عن تحديثات. يُرجى التحقّق من اتصال الإنترنت.</translation> -<translation id="2645435784669275700">نظام التشغيل Chrome</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">يتحقّق Chrome بانتظام من استخدام الإعدادات الأكثر أمانًا في متصفِّحك. وسنُعلمك في حال كان عليك اتخاذ إجراء.</translation> <translation id="2652691236519827073">فتح الرابط في علامة تبويب جديدة في Chrome</translation> <translation id="2665296953892887393">يمكنك المساعدة في تحسين Google Chrome عن طريق إرسال تقارير الأعطال و<ph name="UMA_LINK" /> إلى Google</translation> @@ -353,7 +353,7 @@ <translation id="6851981911629679515">يمكنك تفعيل ميزة "الحماية الإضافية" في محرك JavaScript وWebAssembly من Chrome.</translation> <translation id="6881299373831449287">جارٍ تحديث Chrome.</translation> <translation id="6885412569789873916">تطبيقات الإصدار التجريبي من Chrome</translation> -<translation id="6933858244219479645">نظام التشغيل Chrome</translation> +<translation id="6933858244219479645">نظام التشغيل ChromeOS</translation> <translation id="6938166777909186039">للحصول على تحديثات Google Chrome في المستقبل، يجب استخدام جهاز يعمل بنظام التشغيل Windows 10 أو إصدار أحدث. يعمل هذا الكمبيوتر بنظام التشغيل Windows 8.1.</translation> <translation id="6943584222992551122">سيتم حذف بيانات تصفُّح هذا المستخدم من هذا الجهاز. لاسترداد البيانات، يُرجى تسجيل الدخول إلى Chrome بصفتك <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">قاعدة الوارد إلى الإصدار التجريبي من Google Chrome للسماح بحركة مرور mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index ad834ec0..d2c9d64 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -162,6 +162,7 @@ <translation id="3426646014273736870">Yaddaşa Qənaət Chrome'u daha sürətli etdi</translation> <translation id="3428747202529429621">Daxil olduğunuzda Chrome'da sizi qoruyur və digər Google tətbiqlərində təhlükəsizliyinizi artırmaq üçün istifadə edilə bilər</translation> <translation id="3434246496373299699">Google Hesabınız ilə daxil olduqda Chrome parollarınızı yoxlaya bilər</translation> +<translation id="3450887623636316740">Bu fayl təhlükəli ola bilər<ph name="LINE_BREAK" />Parolu təqdim etsəniz, Chrome bu endirməni yoxlaya bilər. Fayl haqqında məlumat Google güvənli baxışa göndərilir, lakin fayl kontenti və parol cihazda qalır.</translation> <translation id="3451115285585441894">Chrome'a əlavə olunur...</translation> <translation id="345171907106878721">Özünüzü Chrome'a əlavə edin</translation> <translation id="3453763134178591239">ChromeOS şərtləri</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index f6a0797..3230162 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Хто выкарыстоўвае Chrome?</translation> <translation id="1142745911746664600">Не ўдаецца абнавіць Chrome</translation> <translation id="1149651794389918149">Увайдзіце ў Chrome. Калі вам трэба ўвайсці ва ўліковы запіс толькі адзін раз, вы можаце <ph name="GUEST_LINK_BEGIN" />карыстацца прыладай як госць<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Пра Chrome OS</translation> +<translation id="1152920704813762236">Пра ChromeOS</translation> <translation id="1154147086299354128">&Адкрыць у браўзеры Chrome</translation> <translation id="1194807384646768652">Браўзер Chrome заблакіраваў спампоўку, бо гэты тып файлаў спампоўваюць рэдка і ён можа быць небяспечным</translation> <translation id="1203500561924088507">Дзякуй, што ўсталявалі <ph name="BUNDLE_NAME" />. Каб завяршыць усталяванне, перазапусціце браўзер.</translation> @@ -87,7 +87,7 @@ <translation id="234869673307233423">Браўзеру Chrome не ўдаецца праверыць паролі. Паўтарыце спробу пазней.</translation> <translation id="235650106824528204">Любыя даныя Chrome, створаныя пры выкарыстанні гэтага профілю (напрыклад, закладкі, гісторыя, паролі і іншыя налады), могуць быць выдалены адміністратарам працоўнага профілю. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Працягнуць</translation> -<translation id="2401189691232800402">Сістэма Chrome OS</translation> +<translation id="2401189691232800402">Сістэма ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Адно або некалькі пашырэнняў Chrome мелі доступ да 1 прылады з чалавека-машынным інтэрфейсам}=1{Адно або некалькі пашырэнняў Chrome маюць доступ да 1 прылады з чалавека-машынным інтэрфейсам}one{Адно або некалькі пашырэнняў Chrome маюць доступ да # прылады з чалавека-машынным інтэрфейсам}few{Адно або некалькі пашырэнняў Chrome маюць доступ да # прылад з чалавека-машынным інтэрфейсам}many{Адно або некалькі пашырэнняў Chrome маюць доступ да # прылад з чалавека-машынным інтэрфейсам}other{Адно або некалькі пашырэнняў Chrome маюць доступ да # прылады з чалавека-машынным інтэрфейсам}}</translation> <translation id="2424440923901031101">Гэта пашырэнне парушае палітыку Вэб-крамы Chrome і можа быць небяспечным. Выдаліце яго з Chrome, каб яно больш не магло бачыць і змяняць даныя на сайтах, якія вы наведваеце, уключаючы вашу асабістую інфармацыю.</translation> <translation id="2467438592969358367">Google Chrome запытвае дазвол на экспартаванне вашых пароляў. Каб дазволіць гэта, увядзіце пароль Windows.</translation> @@ -107,7 +107,7 @@ <translation id="2597976513418770460">Атрымайце доступ да даных браўзера Chrome, звязаных з уліковым запісам <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Не ўдалося кэшаваць спампаваны ўсталёўшчык. Памылка: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Браўзеру Chrome не ўдаецца праверыць наяўнасць абнаўленняў. Паспрабуйце праверыць падключэнне да інтэрнэту.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome пастаянна сочыць за тым, каб у вашым браўзеры былі самыя бяспечныя налады. Мы паведамім вам, калі нешта будзе патрабаваць вашай увагі.</translation> <translation id="2652691236519827073">Адкрыць спасылку ў новай &укладцы Chrome</translation> <translation id="2665296953892887393">Дапамажыце палепшыць Google Chrome, адпраўляючы ў Google справаздачы аб збоях і <ph name="UMA_LINK" /></translation> @@ -164,6 +164,7 @@ <translation id="3426646014273736870">Дзякуючы Эканоміі памяці браўзер Chrome стаў працаваць яшчэ хутчэй</translation> <translation id="3428747202529429621">Абараняе вас у браўзеры Chrome і можа выкарыстоўвацца для паляпшэння бяспекі ў іншых праграмах Google, калі вы ўвайшлі ва ўліковы запіс</translation> <translation id="3434246496373299699">Chrome зможа праверыць паролі толькі пасля таго, як вы ўвойдзеце ва Уліковы запіс Google</translation> +<translation id="3450887623636316740">Гэты файл можа быць небяспечным<ph name="LINE_BREAK" />Chrome можа праверыць спампоўку, калі вы ўведзяце пароль. Інфармацыя пра файл перадаецца ў Google Бяспечны прагляд, але змесціва файла і пароль застаюцца на прыладзе.</translation> <translation id="3451115285585441894">Ідзе дадаванне ў Chrome...</translation> <translation id="345171907106878721">Дадаць мяне ў Chrome</translation> <translation id="3453763134178591239">Умовы выкарыстання Chrome OS</translation> @@ -356,7 +357,7 @@ <translation id="6851981911629679515">Уключыць дадатковую абарону рухавіка JavaScript і WebAssembly у Chrome</translation> <translation id="6881299373831449287">Ідзе абнаўленне браўзера Chrome</translation> <translation id="6885412569789873916">Праграмы бэта-версіі Chrome</translation> -<translation id="6933858244219479645">Сістэма Chrome OS</translation> +<translation id="6933858244219479645">Сістэма ChromeOS</translation> <translation id="6938166777909186039">Каб атрымліваць наступныя абнаўленні Google Chrome, вам патрэбная версія Windows 10 ці пазнейшая. На гэтым камп'ютары выкарыстоўваецца Windows 8.1.</translation> <translation id="6943584222992551122">Даныя аб прагледжаных гэтым карыстальнікам старонках будуць выдалены з прылады. Каб аднавіць гэтыя даныя, увайдзіце ў Chrome як <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Уваходнае правіла для бэта-версіі Google Chrome, якое дазваляе трафік mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 652c99d2..22a9592 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">Кой използва Chrome?</translation> <translation id="1142745911746664600">Chrome не може да се актуализира</translation> <translation id="1149651794389918149">Влезте в Chrome. Ако искате да влезете в профил само веднъж, можете <ph name="GUEST_LINK_BEGIN" />да използвате устройството като гост<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Всичко за Chrome OS</translation> +<translation id="1152920704813762236">Всичко за ChromeOS</translation> <translation id="1154147086299354128">&Отваряне в Chrome</translation> <translation id="1194807384646768652">Chrome блокира това изтегляне, защото файловият тип не се изтегля често и може да е опасен</translation> <translation id="1203500561924088507">Благодарим ви, че инсталирахте <ph name="BUNDLE_NAME" />. Трябва да рестартирате браузъра си, преди да използвате това приложение.</translation> @@ -86,7 +86,7 @@ <translation id="234869673307233423">Chrome не може да провери паролите ви. Опитайте пак по-късно.</translation> <translation id="235650106824528204">Данните в Chrome, които са генерирани при използването на този служебен потребителски профил (напр. създаването на отметки, историята, паролите и други настройки), могат да бъдат премахнати от администратора му. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Напред</translation> -<translation id="2401189691232800402">Система Chrome OS</translation> +<translation id="2401189691232800402">Система ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Едно или повече разширения за Chrome са осъществявали достъп до 1 HID устройство}=1{Едно или повече разширения за Chrome осъществяват достъп до 1 HID устройство}other{Едно или повече разширения за Chrome осъществяват достъп до # HID устройства}}</translation> <translation id="2424440923901031101">Това разширение нарушава правилата на уеб магазина на Chrome и може да е опасно. Премахнете го от Chrome, така че повече да не може да преглежда и променя данните ви в посещаваните от вас сайтове, включително личната ви информация.</translation> <translation id="2467438592969358367">Google Chrome иска да експортира паролите ви. За да разрешите това, въведете паролата си за Windows.</translation> @@ -106,7 +106,7 @@ <translation id="2597976513418770460">Използвайте нещата си в браузъра Chrome от <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Кеширането на изтеглената инсталационна програма не бе успешно. Грешка: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome не може да провери за актуализации. Проверете връзката си с интернет.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Браузърът Chrome редовно проверява дали настройките му са най-безопасните. Ще ви уведомим, ако е необходим преглед от ваша страна.</translation> <translation id="2652691236519827073">Отваряне на връзката в нов &раздел на Chrome</translation> <translation id="2665296953892887393">Помогнете ни да подобрим Google Chrome, като ни изпращате <ph name="UMA_LINK" /> му и сигнали за сривове</translation> @@ -351,7 +351,7 @@ <translation id="6851981911629679515">Включване на допълнителната защита в машината на Chrome за JavaScript и WebAssembly</translation> <translation id="6881299373831449287">Chrome се актуализира</translation> <translation id="6885412569789873916">Приложения за Chrome бета</translation> -<translation id="6933858244219479645">Система Chrome OS</translation> +<translation id="6933858244219479645">Система ChromeOS</translation> <translation id="6938166777909186039">За да получавате бъдещи актуализации на Google Chrome, трябва да използвате Windows 10 или по-нова версия. Компютърът ви работи с Windows 8.1.</translation> <translation id="6943584222992551122">Данните за сърфирането на този човек ще бъдат изтрити от устройството. За да ги възстановите, влезте в Chrome като <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Правило за Google Chrome бета за допускане на входящия трафик за mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index e719d2b..a40b710 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -165,6 +165,7 @@ <translation id="3426646014273736870">Ušteda memorije ubrzava rada Chromea</translation> <translation id="3428747202529429621">Štiti vas u Chromeu i može se koristiti da poboljša vašu sigurnost u drugim Google aplikacijama kada ste prijavljeni</translation> <translation id="3434246496373299699">Chrome može provjeravati vaše lozinke kada se prijavite pomoću Google računa</translation> +<translation id="3450887623636316740">Fajl je možda opasan<ph name="LINE_BREAK" />Chrome može provjeriti ovo preuzimanje za vas ako unesete lozinku. Informacije o fajlu se šalju na Sigurno pregledanje na Googleu, ali sadržaj fajla i lozinka ostaju na vašem uređaju.</translation> <translation id="3451115285585441894">Dodavanje u Chrome...</translation> <translation id="345171907106878721">Dodajte sebe na Chrome</translation> <translation id="3453763134178591239">Uslovi korištenja ChromeOS-a</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 831ca2b..a603ccf5 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -84,7 +84,7 @@ <translation id="234869673307233423">Chrome no pot comprovar les teves contrasenyes. Torna-ho a provar més tard.</translation> <translation id="235650106824528204">L'administrador del perfil de treball pot suprimir qualsevol dada de Chrome que es generi durant l'ús d'aquest perfil, com ara les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Continua</translation> -<translation id="2401189691232800402">Sistema Chrome OS</translation> +<translation id="2401189691232800402">Sistema ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Una o més extensions de Chrome estaven accedint a 1 dispositiu d'interfície humana}=1{Una o més extensions de Chrome estan accedint a 1 dispositiu d'interfície humana}other{Una o més extensions de Chrome estan accedint a # dispositius d'interfície humana}}</translation> <translation id="2424440923901031101">Aquesta extensió infringeix la política de Chrome Web Store i podria no ser segura. Suprimeix-la de Chrome perquè ja no pugui veure ni canviar les teves dades als llocs web que visitis, inclosa la teva informació personal.</translation> <translation id="2467438592969358367">Google Chrome vol exportar les teves contrasenyes. Escriu la contrasenya de Windows per permetre-ho.</translation> @@ -349,7 +349,7 @@ <translation id="6851981911629679515">Activa la protecció addicional al motor JavaScript i WebAssembly de Chrome</translation> <translation id="6881299373831449287">S'està actualitzant Chrome</translation> <translation id="6885412569789873916">Aplicacions de Chrome Beta</translation> -<translation id="6933858244219479645">Sistema Chrome OS</translation> +<translation id="6933858244219479645">Sistema ChromeOS</translation> <translation id="6938166777909186039">Per obtenir actualitzacions de Google Chrome en el futur, necessitaràs Windows 10 o una versió posterior. Aquest ordinador utilitza Windows 8.1.</translation> <translation id="6943584222992551122">Les dades de navegació d'aquesta persona se suprimiran d'aquest dispositiu. Per recuperar-les, inicia la sessió a Chrome com a <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Regla d'entrada de Google Chrome Beta per permetre el trànsit d'mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index a57bae7..1b38ff25 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -84,7 +84,7 @@ <translation id="234869673307233423">Chrome kann deine Passwörter nicht prüfen. Versuche es später noch einmal.</translation> <translation id="235650106824528204">Alle Chrome-Daten, die während der Nutzung dieses Profils erstellt werden, wie Lesezeichen, Verlauf, Passwörter und andere Einstellungen, können vom Administrator des Arbeitsprofils entfernt werden. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Weiter</translation> -<translation id="2401189691232800402">Chrome OS-System</translation> +<translation id="2401189691232800402">ChromeOS-System</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Auf 1 HID-Gerät wurde von mindestens einer Chrome-Erweiterung zugegriffen}=1{Auf 1 HID-Gerät wird von mindestens einer Chrome-Erweiterung zugegriffen}other{Auf # HID-Geräte wird von mindestens einer Chrome-Erweiterung zugegriffen}}</translation> <translation id="2424440923901031101">Diese Erweiterung verstößt gegen die Chrome Web Store-Richtlinien und ist möglicherweise nicht sicher. Entferne sie aus Chrome, damit sie deine Daten auf von dir besuchten Websites nicht mehr abrufen oder ändern kann, auch nicht deine personenbezogenen Daten.</translation> <translation id="2467438592969358367">Google Chrome möchte deine Passwörter exportieren. Wenn du dies zulassen möchtest, gib dein Windows-Passwort ein.</translation> @@ -104,7 +104,7 @@ <translation id="2597976513418770460">Über <ph name="ACCOUNT_EMAIL" /> auf deine Chrome-Browserinhalte zugreifen</translation> <translation id="259935314519650377">Die heruntergeladene Installationsdatei konnte nicht im Cache gespeichert werden. Fehler: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome kann nicht nach Aktualisierungen suchen. Überprüfe deine Internetverbindung.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome prüft regelmäßig, ob dein Browser die sichersten Einstellungen hat. Solltest du etwas überprüfen müssen, informieren wir dich.</translation> <translation id="2652691236519827073">Link in neuem Chrome-Tab öffnen</translation> <translation id="2665296953892887393">Absturzberichte und <ph name="UMA_LINK" /> zur Verbesserung von Google Chrome an Google senden</translation> @@ -278,7 +278,7 @@ <translation id="5524761631371622910">Wenn Tests aktiviert sind und Chrome dich zufällig für einen aktiven Test angemeldet hat, hat dein Browserverlauf Einfluss auf die unten stehenden, geschätzten Interessen und darauf, welche Werbung dir gezeigt wird. Zum Schutz deiner Daten löscht Chrome jeden Monat fortlaufend deine Interessen.</translation> <translation id="5530733413481476019">Chrome noch schneller machen</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5572786658631721382">Wenn dies deaktiviert ist, werden weiterhin Vorschläge angezeigt, die Chrome lokal bereitstellt</translation> +<translation id="5572786658631721382">Wenn dies deaktiviert ist, werden weiterhin Vorschläge angezeigt, die von Chrome lokal bereitgestellt werden</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ist möglicherweise schädlich und wurde daher von Chrome blockiert.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Dein Administrator empfiehlt dir, Chrome neu zu starten, um dieses Update durchzuführen}=1{Dein Administrator empfiehlt dir, Chrome neu zu starten, um dieses Update durchzuführen. Dein Inkognitofenster wird nicht wieder geöffnet.}other{Dein Administrator empfiehlt dir, Chrome neu zu starten, um dieses Update durchzuführen. Deine # Inkognitofenster werden nicht wieder geöffnet.}}</translation> <translation id="5686916850681061684">Du kannst Google Chrome anpassen und Einstellungen festlegen. Etwas erfordert deine Aufmerksamkeit – klicke hier, um mehr zu erfahren.</translation> @@ -349,7 +349,7 @@ <translation id="6851981911629679515">Zusätzlichen Schutz in der JavaScript- und WebAssembly-Engine von Chrome aktivieren</translation> <translation id="6881299373831449287">Chrome wird aktualisiert</translation> <translation id="6885412569789873916">Chrome Beta-Apps</translation> -<translation id="6933858244219479645">Chrome OS-System</translation> +<translation id="6933858244219479645">ChromeOS-System</translation> <translation id="6938166777909186039">Du benötigst Windows 10 oder höher, um zukünftige Google Chrome-Updates zu erhalten. Dieser Computer verwendet Windows 8.1.</translation> <translation id="6943584222992551122">Die Browserdaten dieser Person werden von diesem Gerät gelöscht. Um die Daten wiederherzustellen, melde dich als <ph name="USER_EMAIL" /> in Chrome an.</translation> <translation id="6967962315388095737">Eingangsregel für die Zulassung von mDNS-Verkehr in Google Chrome Beta.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 7655f58f..d9593091 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">Ποιος χρησιμοποιεί το Chrome;</translation> <translation id="1142745911746664600">Δεν είναι δυνατή η ενημέρωση του Chrome</translation> <translation id="1149651794389918149">Συνδεθείτε στο Chrome. Εάν θέλετε να συνδεθείτε σε έναν λογαριασμό μόνο μία φορά, μπορείτε να <ph name="GUEST_LINK_BEGIN" />χρησιμοποιήσετε τη συσκευή ως επισκέπτης<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Σχετικά με το Chrome OS</translation> +<translation id="1152920704813762236">Σχετικά με το ChromeOS</translation> <translation id="1154147086299354128">&Άνοιγμα στο Chrome</translation> <translation id="1194807384646768652">Το Chrome απέκλεισε αυτή τη λήψη επειδή δεν πραγματοποιείται συχνά λήψη αυτού του τύπου αρχείου και ενδέχεται να είναι επικίνδυνος</translation> <translation id="1203500561924088507">Ευχαριστούμε για την εγκατάσταση. Πρέπει να επανεκκινήσετε το πρόγραμμα περιήγησής σας πριν από τη χρήση του <ph name="BUNDLE_NAME" />.</translation> @@ -86,7 +86,7 @@ <translation id="234869673307233423">Το Chrome δεν μπορεί να ελέγξει τους κωδικούς πρόσβασής σας. Δοκιμάστε ξανά αργότερα.</translation> <translation id="235650106824528204">Τυχόν δεδομένα Chrome που δημιουργούνται κατά τη χρήση αυτού του προφίλ (όπως η δημιουργία σελιδοδεικτών, ιστορικού, κωδικών πρόσβασης και άλλων ρυθμίσεων) μπορούν να καταργηθούν από τον διαχειριστή του προφίλ εργασίας. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Συνέχεια</translation> -<translation id="2401189691232800402">Σύστημα Chrome OS</translation> +<translation id="2401189691232800402">Σύστημα ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Αποκτήθηκε πρόσβαση σε 1 συσκευή HID από μία ή περισσότερες επεκτάσεις Chrome}=1{Αποκτήθηκε πρόσβαση σε 1 συσκευή HID από μία ή περισσότερες επεκτάσεις Chrome}other{Αποκτήθηκε πρόσβαση σε # συσκευές HID από μία ή περισσότερες επεκτάσεις Chrome}}</translation> <translation id="2424440923901031101">Αυτή η επέκταση παραβαίνει την πολιτική του Chrome Web Store και μπορεί να μην είναι ασφαλής. Καταργήστε την από το Chrome, ώστε να μην μπορεί πλέον να βλέπει και να αλλάζει τα δεδομένα σας σε ιστοτόπους που επισκέπτεστε, συμπεριλαμβανομένων των προσωπικών στοιχείων σας.</translation> <translation id="2467438592969358367">Το Google Chrome θέλει να εξαγάγει τους κωδικούς πρόσβασής σας. Για να το επιτρέψετε αυτό, πληκτρολογήστε τον κωδικό πρόσβασης για τα Windows.</translation> @@ -106,7 +106,7 @@ <translation id="2597976513418770460">Λήψη του περιεχομένου του προγράμματος περιήγησης Chrome από <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Απέτυχε η αποθήκευση του ληφθέντος προγράμματος εγκατάστασης στην κρυφή μνήμη. Σφάλμα: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Το Chrome δεν μπορεί να ελέγξει για ενημερώσεις. Δοκιμάστε να ελέγξετε τη σύνδεσή σας στο διαδίκτυο.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Το Chrome ελέγχει τακτικά για να διασφαλίζει ότι το πρόγραμμα περιήγησης που χρησιμοποιείτε έχει τις πιο ασφαλείς ρυθμίσεις. Θα σας ενημερώνουμε, αν χρειάζεται να ελέγξετε κάτι.</translation> <translation id="2652691236519827073">Άνοιγμα Συνδέσμου σε Νέα καρτέ&λα Chrome</translation> <translation id="2665296953892887393">Βοηθήστε μας να κάνουμε το Google Chrome καλύτερο, αποστέλλωντας αναφορές σφαλμάτων και <ph name="UMA_LINK" /> στην Google</translation> @@ -353,7 +353,7 @@ <translation id="6851981911629679515">Ενεργοποιήστε την πρόσθετη προστασία στη μηχανή JavaScript και WebAssembly του Chrome</translation> <translation id="6881299373831449287">Ενημέρωση Chrome</translation> <translation id="6885412569789873916">Εφαρμογές Chrome Beta</translation> -<translation id="6933858244219479645">Σύστημα Chrome OS</translation> +<translation id="6933858244219479645">Σύστημα ChromeOS</translation> <translation id="6938166777909186039">Για τη λήψη μελλοντικών ενημερώσεων του Google Chrome, θα χρειαστείτε Windows 10 ή νεότερη έκδοση. Αυτός ο υπολογιστής χρησιμοποιεί Windows 8.1.</translation> <translation id="6943584222992551122">Τα δεδομένα περιήγησης αυτού του ατόμου θα διαγραφούν από αυτήν τη συσκευή. Για να επαναφέρετε τα δεδομένα, συνδεθείτε στο Chrome ως <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Εισερχόμενος κανόνας για το Google Chrome Beta για να επιτρέπεται η κυκλοφορία του mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 9a0d892..b2fad34 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Who's using Chrome?</translation> <translation id="1142745911746664600">Can't update Chrome</translation> <translation id="1149651794389918149">Sign in to Chrome. If you'd just like to sign in an account once, you can <ph name="GUEST_LINK_BEGIN" />use the device as guest<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">About Chrome OS</translation> +<translation id="1152920704813762236">About ChromeOS</translation> <translation id="1154147086299354128">&Open in Chrome</translation> <translation id="1194807384646768652">Chrome blocked this download because the file type isn't commonly downloaded and it may be dangerous</translation> <translation id="1203500561924088507">Thanks for installing. You must restart your browser before using <ph name="BUNDLE_NAME" />.</translation> @@ -87,7 +87,7 @@ <translation id="234869673307233423">Chrome can't check your passwords. Try again later.</translation> <translation id="235650106824528204">Any Chrome data that is generated during the use of this profile (such as the creation of bookmarks, history, passwords and other settings) can be removed by the work profile administrator. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Continue</translation> -<translation id="2401189691232800402">Chrome OS system</translation> +<translation id="2401189691232800402">ChromeOS system</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{1 HID device was being accessed by one or more Chrome extensions}=1{1 HID device is being accessed by one or more Chrome extensions}other{# HID devices are being accessed by one or more Chrome extensions}}</translation> <translation id="2424440923901031101">This extension violates the Chrome Web Store policy and might be unsafe. Remove it from Chrome so that it can no longer see and change your data on sites that you visit, including your personal info.</translation> <translation id="2467438592969358367">Google Chrome wants to export your passwords. Type your Windows password to allow this.</translation> @@ -107,7 +107,7 @@ <translation id="2597976513418770460">Get your Chrome browser stuff from <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Failed to cache the downloaded installer. Error: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome can't check for updates. Try checking your Internet connection.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome regularly checks to make sure your browser has the safest settings. We'll let you know if anything needs your review.</translation> <translation id="2652691236519827073">Open Link in New Chrome &tab</translation> <translation id="2665296953892887393">Help make Google Chrome better by sending crash reports and <ph name="UMA_LINK" /> to Google</translation> @@ -356,7 +356,7 @@ <translation id="6851981911629679515">Turn on additional protection in Chrome’s JavaScript and WebAssembly engine</translation> <translation id="6881299373831449287">Updating Chrome</translation> <translation id="6885412569789873916">Chrome Beta apps</translation> -<translation id="6933858244219479645">Chrome OS system</translation> +<translation id="6933858244219479645">ChromeOS system</translation> <translation id="6938166777909186039">To get future Google Chrome updates, you'll need Windows 10 or later. This computer is using Windows 8.1.</translation> <translation id="6943584222992551122">This person's browsing data will be deleted from this device. To recover the data, sign in to Chrome as <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Inbound rule for Google Chrome Beta to allow mDNS traffic.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index b321afa..9be5bbba 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Nor erabiltzen ari da Chrome?</translation> <translation id="1142745911746664600">Ezin da eguneratu Chrome</translation> <translation id="1149651794389918149">Hasi saioa Chrome-n. Saioa behin bakarrik hasi nahi baduzu, <ph name="GUEST_LINK_BEGIN" />erabili gailua gonbidatu gisa<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Chrome OS-ri buruz</translation> +<translation id="1152920704813762236">ChromeOS-i buruz</translation> <translation id="1154147086299354128">&Ireki Chrome-n</translation> <translation id="1194807384646768652">Chrome-k deskarga hau blokeatu du, fitxategi mota normalean deskargatzen ez delako eta agian arriskutsua delako</translation> <translation id="1203500561924088507">Eskerrik asko instalatzeagatik. <ph name="BUNDLE_NAME" /> erabiltzeko, arakatzailea berrabiarazi behar duzu.</translation> @@ -87,7 +87,7 @@ <translation id="234869673307233423">Chrome-k ezin ditu egiaztatu pasahitzak. Saiatu geroago.</translation> <translation id="235650106824528204">Laneko profilaren administratzaileak kendu egin ditzake profil hau erabiltzean sortutako Chrome-ko datuak (adibidez, sortutako laster-markak, historia, pasahitzak eta bestelako ezarpenak). <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Egin aurrera</translation> -<translation id="2401189691232800402">Chrome OS sistema</translation> +<translation id="2401189691232800402">ChromeOS sistema</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Chrome-rako luzapen bat edo gehiago giza interfazeko gailu bat erabiltzen ari ziren}=1{Chrome-rako luzapen bat edo gehiago giza interfazeko gailu bat erabiltzen ari dira}other{Chrome-rako luzapen bat edo gehiago giza interfazeko # gailu erabiltzen ari dira}}</translation> <translation id="2424440923901031101">Luzapenak Chrome Web Store-ren gidalerroak urratzen ditu, eta agian ez da segurua. Ken ezazu Chrome-tik, bisitatzen dituzun webguneetan zure datuak ikusi eta aldatu ezin izan ditzan, informazio pertsonala barne.</translation> <translation id="2467438592969358367">Google Chrome-k pasahitzak esportatu nahi ditu. Hori baimentzeko, idatzi Windows pasahitza.</translation> @@ -356,7 +356,7 @@ <translation id="6851981911629679515">Aktibatu babes gehigarria Chrome-ren JavaScript eta WebAssembly motorrean</translation> <translation id="6881299373831449287">Chrome eguneratzen</translation> <translation id="6885412569789873916">Chrome Beta aplikazioak</translation> -<translation id="6933858244219479645">Chrome OS sistema</translation> +<translation id="6933858244219479645">ChromeOS sistema</translation> <translation id="6938166777909186039">Etorkizunean Google Chrome-ren eguneratzeak eskuratzeko, Windows 10 edo berriago bat beharko duzu. Ordenagailu hau Windows 8.1 erabiltzen ari da.</translation> <translation id="6943584222992551122">Pertsona honen arakatze-datuak gailutik ezabatuko dira. Datuak berreskuratzeko, hasi saioa Chrome-n <ph name="USER_EMAIL" /> gisa.</translation> <translation id="6967962315388095737">Google Chrome Beta-k mDNS trafikoa baimentzeko sarrerako araua.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 9734846e..61300cd 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">Kuka käyttää Chromea?</translation> <translation id="1142745911746664600">Chromen päivitys epäonnistui</translation> <translation id="1149651794389918149">Kirjaudu Chromeen. Jos haluat kirjautua tilille vain kerran, voit <ph name="GUEST_LINK_BEGIN" />käyttää laitetta vieraana<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Tietoa ChromeOS:stä</translation> +<translation id="1152920704813762236">ChromeOS</translation> <translation id="1154147086299354128">Avaa Chr&omessa</translation> <translation id="1194807384646768652">Chrome on estänyt tämän latauksen, koska tiedostotyyppiä ei ladata usein, ja se saattaa olla haitallinen</translation> <translation id="1203500561924088507">Kiitos asennuksesta. Selain pitää käynnistää uudelleen ennen kuin <ph name="BUNDLE_NAME" /> otetaan käyttöön.</translation> @@ -84,7 +84,7 @@ <translation id="234869673307233423">Chrome ei voi tarkistaa salasanojasi. Yritä myöhemmin uudelleen.</translation> <translation id="235650106824528204">Työprofiilin järjestelmänvalvoja voi poistaa tämän profiilin käytön aikana luotua Chrome-dataa (esim. kirjanmerkit, historia, salasanat ja muut asetukset). <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Jatka</translation> -<translation id="2401189691232800402">Chrome-käyttöjärjestelmä</translation> +<translation id="2401189691232800402">ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Yhdellä tai useammalla Chrome-laajennuksella oli pääsy yhdelle HID-laitteelle}=1{Yhdellä tai useammalla Chrome-laajennuksella on pääsy yhdelle HID-laitteelle}other{Yhdellä tai useammalla Chrome-laajennuksella on pääsy # HID-laitteelle}}</translation> <translation id="2424440923901031101">Tämä laajennus rikkoo Chrome Web Storen käytäntöä ja saattaa olla vaarallinen. Poista se Chromesta, jotta se ei enää voi nähdä tai muuttaa dataasi sivustoilla, joilla vierailet, mukaan lukien henkilökohtaisia tietojasi.</translation> <translation id="2467438592969358367">Google Chrome yrittää viedä salasanojasi tiedostoon. Salli tämä kirjoittamalla Windows-salasanasi.</translation> @@ -104,7 +104,7 @@ <translation id="2597976513418770460">Käytä tililtä <ph name="ACCOUNT_EMAIL" /> löytyvää Chrome-selaimen sisältöä</translation> <translation id="259935314519650377">Ladatun asennusohjelman siirtäminen välimuistiin epäonnistui. Virhe: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome ei voi tarkistaa päivityksiä. Tarkista internetyhteytesi.</translation> -<translation id="2645435784669275700">Chrome-käyttöjärjestelmä</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome tarkistaa säännöllisesti, että selaimen asetukset ovat mahdollisimman turvalliset. Ilmoitamme, jos jotain on tarkistettava.</translation> <translation id="2652691236519827073">Avaa linkki uudella Chromen välilehdellä</translation> <translation id="2665296953892887393">Auta parantamaan Google Chromea lähettämällä kaatumisilmoitukset ja <ph name="UMA_LINK" /> Googlelle</translation> @@ -349,7 +349,7 @@ <translation id="6851981911629679515">Laita lisäsuojaus päälle Chromen JavaScript- ja WebAssembly-moottorissa</translation> <translation id="6881299373831449287">Päivitetään Chromea</translation> <translation id="6885412569789873916">Chromen betaversion sovellukset</translation> -<translation id="6933858244219479645">Chrome-käyttöjärjestelmä</translation> +<translation id="6933858244219479645">ChromeOS</translation> <translation id="6938166777909186039">Jotta saat tulevia Google Chromen päivityksiä, sinulla on oltava Windows 10 tai uudempi. Tietokoneen käyttöjärjestelmä on Windows 8.1.</translation> <translation id="6943584222992551122">Käyttäjän selaustiedot poistetaan tältä laitteelta. Jos haluat palauttaa tiedot myöhemmin, kirjaudu Chromeen käyttäjänä <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Google Chromen betaversion saapuvien yhteyksien sääntö, joka sallii mDNS-liikenteen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 390839e..03cc8d0 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Qui utilise Chrome?</translation> <translation id="1142745911746664600">Impossible de mettre à jour Google Chrome</translation> <translation id="1149651794389918149">Connectez-vous à Chrome. Si vous ne souhaitez vous connecter qu'une seule fois à un compte, vous pouvez <ph name="GUEST_LINK_BEGIN" />utiliser l'appareil en tant qu'invité<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">À propos de Chrome OS</translation> +<translation id="1152920704813762236">À propos de ChromeOS</translation> <translation id="1154147086299354128">&Ouvrir dans Chrome</translation> <translation id="1194807384646768652">Chrome a bloqué ce téléchargement, car le type de fichier n'est pas souvent téléchargé et pourrait être dangereux</translation> <translation id="1203500561924088507">Merci pour l'installation. Vous devez redémarrer votre navigateur avant d'utiliser <ph name="BUNDLE_NAME" />.</translation> @@ -87,7 +87,7 @@ <translation id="234869673307233423">Chrome ne peut pas vérifier vos mots de passe. Réessayez plus tard.</translation> <translation id="235650106824528204">L'administrateur du profil professionnel peut retirer toutes les données Chrome générées durant l'utilisation de ce profil (comme la création de favoris, l'historique, les mots de passe et d'autres paramètres). <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Continuer</translation> -<translation id="2401189691232800402">Système Chrome OS</translation> +<translation id="2401189691232800402">Système ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Une ou plusieurs extensions Chrome ont accédé à 1 appareil HID}=1{Une ou plusieurs extensions Chrome ont accédé à 1 appareil HID}one{Une ou plusieurs extensions Chrome ont accédé à # appareils HID}other{Une ou plusieurs extensions Chrome ont accédé à # appareils HID}}</translation> <translation id="2424440923901031101">Cette extension enfreint la politique de la boutique en ligne Chrome Web Store et peut être dangereuse. Retirez-la de Chrome afin qu'elle ne puisse plus voir ni modifier vos données sur les sites que vous visitez, y compris vos renseignements personnels.</translation> <translation id="2467438592969358367">Google Chrome veut exporter vos mots de passe. Pour autoriser cette action, entrez votre mot de passe Windows.</translation> @@ -356,7 +356,7 @@ <translation id="6851981911629679515">Activez une protection supplémentaire dans le moteur JavaScript et WebAssembly de Chrome</translation> <translation id="6881299373831449287">Mise à jour de Chrome</translation> <translation id="6885412569789873916">Applications Chrome bêta</translation> -<translation id="6933858244219479645">Système Chrome OS</translation> +<translation id="6933858244219479645">Système ChromeOS</translation> <translation id="6938166777909186039">Pour recevoir les futures mises à jour de Google Chrome, vous devrez disposer de Windows 10 ou d'une version ultérieure. Cet ordinateur fonctionne sous Windows 8.1.</translation> <translation id="6943584222992551122">Les données de navigation de cette personne seront supprimées de cet appareil. Pour les récupérer, connectez-vous à Chrome en tant que <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Règle de trafic entrant pour Google Chrome bêta autorisant le trafic mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index f047a7d..86b3acd3 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -161,6 +161,7 @@ <translation id="3426646014273736870">Štednja memorije učinila je Chrome bržim</translation> <translation id="3428747202529429621">Štiti vas na Chromeu i može se upotrebljavati za poboljšanje vaše sigurnosti u drugim Googleovim aplikacijama kada ste prijavljeni</translation> <translation id="3434246496373299699">Chrome može provjeriti vaše zaporke kad se prijavite Google računom</translation> +<translation id="3450887623636316740">Datoteka može biti opasna<ph name="LINE_BREAK" />Chrome može provjeriti to preuzimanje za vas ako unesete zaporku. Podaci o datoteci šalju se Google sigurnom pregledavanju, ali sadržaj i zaporka datoteke ostaju na vašem uređaju.</translation> <translation id="3451115285585441894">Dodavanje u Chrome...</translation> <translation id="345171907106878721">Dodajte sebe kao korisnika Chromea</translation> <translation id="3453763134178591239">Uvjeti za Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index 52ff3f4c..5601626 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -162,6 +162,7 @@ <translation id="3426646014273736870">ಮೆಮೊರಿ ಸೇವರ್ನಿಂದಾಗಿ Chrome ನ ವೇಗ ಇನ್ನೂ ಹೆಚ್ಚಾಗಿದೆ</translation> <translation id="3428747202529429621">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗ, Chrome ನಲ್ಲಿ ನಿಮ್ಮನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸುತ್ತದೆ ಮತ್ತು ಇತರ Google ಆ್ಯಪ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಸುರಕ್ಷತೆಯನ್ನು ಸುಧಾರಿಸಲು ಬಳಸಬಹುದು</translation> <translation id="3434246496373299699">ನೀವು Google ಖಾತೆಯ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗ, Chrome ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಬಲ್ಲದು</translation> +<translation id="3450887623636316740">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಬಹುದು<ph name="LINE_BREAK" />ನೀವು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಒದಗಿಸಿದರೆ Chrome ನಿಮಗಾಗಿ ಈ ಡೌನ್ಲೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಬಹುದು. ಫೈಲ್ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು Google Safe Browsing ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಫೈಲ್ನ ವಿಷಯಗಳು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಉಳಿಯುತ್ತದೆ.</translation> <translation id="3451115285585441894">Chrome ಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="345171907106878721">ನಿಮ್ಮನ್ನು Chrome ಗೆ ಸೇರಿಸಿಕೊಳ್ಳಿ</translation> <translation id="3453763134178591239">ChromeOS ನಿಯಮಗಳು</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index 5dc7cec..c24e386 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -165,6 +165,7 @@ <translation id="3426646014273736870">Эстутумду үнөмдөгүч аркылуу Chrome тезирээк иштеп калды</translation> <translation id="3428747202529429621">Аккаунтуңузга киргенде Chrome'до жана башка Google колдонмолорунда коопсуздугуңузду коргоп турат</translation> <translation id="3434246496373299699">Google аккаунтуңуз менен киргенде Chrome сырсөздөрүңүздү текшерет</translation> +<translation id="3450887623636316740">Бул файл кооптуу болушу мүмкүн<ph name="LINE_BREAK" />Эгер сырсөздү көрсөтсөңүз, Chrome бул жүктөлүп алынган файды текшере алат. Файл тууралуу маалымат Google Коопсуз серептөө кызматына жөнөтүлөт, бирок файлдын мазмуну жана сырсөз түзмөгүңүздө калат.</translation> <translation id="3451115285585441894">Chrome'го кошулууда…</translation> <translation id="345171907106878721">Өзүңүздү Chrome'го кошуңуз</translation> <translation id="3453763134178591239">ChromeOS шарттары</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 961afaa..bec24d25 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -165,6 +165,7 @@ <translation id="3426646014273736870">ຕົວປະຢັດໜ່ວຍຄວາມຈຳເຮັດໃຫ້ Chrome ໄວຂຶ້ນ</translation> <translation id="3428747202529429621">ຮັກສາໃຫ້ທ່ານປອດໄພໃນ Chrome ແລະ ອາດຈະຖືກໃຊ້ເພື່ອປັບປຸງຄວາມປອດໄພໃນແອັບອື່ນຂອງ Google ເມື່ອທ່ານເຂົ້າສູ່ລະບົບ</translation> <translation id="3434246496373299699">Chrome ສາມາດກວດເບິ່ງລະຫັດຜ່ານຂອງທ່ານ ເມື່ອທ່ານເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ Google ຂອງທ່ານໄດ້</translation> +<translation id="3450887623636316740">ໄຟລ໌ນີ້ອາດເປັນອັນຕະລາຍ<ph name="LINE_BREAK" />Chrome ສາມາດກວດສອບການດາວໂຫຼດນີ້ໃຫ້ທ່ານໄດ້ຫາກທ່ານລະບຸລະຫັດຜ່ານ. ຂໍ້ມູນກ່ຽວກັບໄຟລ໌ຈະຖືກສົ່ງໄປຫາ Google Safe Browsing, ແຕ່ເນື້ອຫາໄຟລ໌ ແລະ ລະຫັດຜ່ານຈະຍັງຢູ່ໃນອຸປະກອນຂອງທ່ານ.</translation> <translation id="3451115285585441894">ກໍາລັງເພີ່ມໃສ່ Chrome...</translation> <translation id="345171907106878721">ເພີ່ມທ່ານເອງໃສ່ Chrome</translation> <translation id="3453763134178591239">ຂໍ້ກຳນົດ ChromeOS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index adacb3c..ddc9c1b 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Kas naudoja „Chrome“?</translation> <translation id="1142745911746664600">Nepavyko atnaujinti „Chrome“</translation> <translation id="1149651794389918149">Prisijunkite prie „Chrome“. Jei prie paskyros norite prisijungti tik vieną kartą, galite <ph name="GUEST_LINK_BEGIN" />naudoti įrenginį kaip svečias<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Apie „Chrome“ OS</translation> +<translation id="1152920704813762236">Apie „ChromeOS“</translation> <translation id="1154147086299354128">&Atidaryti naudojant „Chrome“</translation> <translation id="1194807384646768652">„Chrome“ užblokavo šį atsisiuntimą, nes šio tipo failas nėra dažnai atsisiunčiamas ir jis gali būti pavojingas</translation> <translation id="1203500561924088507">Dėkojame už diegimą. Turite iš naujo paleisti naršyklę, prieš naudodami „<ph name="BUNDLE_NAME" />“.</translation> @@ -88,7 +88,7 @@ <translation id="234869673307233423">„Chrome“ negali patikrinti jūsų slaptažodžių. Vėliau bandykite dar kartą.</translation> <translation id="235650106824528204">Visus „Chrome“ duomenis, sugeneruotus naudojant šį profilį (pvz., sukurtas žymes, istoriją, slaptažodžius ir kitus nustatymus), gali pašalinti darbo profilio administratorius. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Tęskite</translation> -<translation id="2401189691232800402">„Chrome“ OS sistema</translation> +<translation id="2401189691232800402">„ChromeOS“ sistema</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Vienas ŽSĮ įrenginys buvo pasiekiamas naudojant vieną ar daugiau „Chrome“ plėtinių}=1{Vienas ŽSĮ įrenginys pasiekiamas naudojant vieną ar daugiau „Chrome“ plėtinių}one{# ŽSĮ įrenginys pasiekiamas naudojant vieną ar daugiau „Chrome“ plėtinių}few{# ŽSĮ įrenginiai pasiekiami naudojant vieną ar daugiau „Chrome“ plėtinių}many{# ŽSĮ įrenginio pasiekiama naudojant vieną ar daugiau „Chrome“ plėtinių}other{# ŽSĮ įrenginių pasiekiama naudojant vieną ar daugiau „Chrome“ plėtinių}}</translation> <translation id="2424440923901031101">Šis plėtinys pažeidžia „Chrome“ internetinės parduotuvės politiką ir gali būti nesaugus. Pašalinkite jį iš „Chrome“, kad jis nebematytų ir negalėtų pakeisti jūsų duomenų svetainėse, kuriose lankotės, įskaitant jūsų asmens informaciją.</translation> <translation id="2467438592969358367">„Google Chrome“ nori eksportuoti jūsų slaptažodžius. Įveskite „Windows“ slaptažodį, kad tai leistumėte.</translation> @@ -108,7 +108,7 @@ <translation id="2597976513418770460">Gaukite „Chrome“ naršyklės informaciją iš <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Nepavyko talpykloje išsaugoti atsisiųstos diegimo programos. Klaida: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">„Chrome“ negali tikrinti naujinių. Pabandykite patikrinti interneto ryšį.</translation> -<translation id="2645435784669275700">„Chrome“ OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">„Chrome“ reguliariai tikrina, ar naršyklės nustatymai yra saugiausi. Pranešime, jei reikės ką nors peržiūrėti.</translation> <translation id="2652691236519827073">Atidaryti nuorodą naujame „Chrome“ &skirtuke</translation> <translation id="2665296953892887393">Padėkite tobulinti „Google Chrome“ siųsdami „Google“ strigčių ataskaitas ir <ph name="UMA_LINK" /></translation> @@ -357,7 +357,7 @@ <translation id="6851981911629679515">Įjunkite papildomą apsaugą „Chrome“ „JavaScript“ ir „WebAssembly“ variklyje</translation> <translation id="6881299373831449287">„Chrome“ atnaujinimas</translation> <translation id="6885412569789873916">„Chrome“ beta versijos programos</translation> -<translation id="6933858244219479645">„Chrome“ OS sistema</translation> +<translation id="6933858244219479645">„ChromeOS“ sistema</translation> <translation id="6938166777909186039">Jei norite gauti būsimus „Google Chrome“ naujinius, jums reikės 10 ar naujesnės versijos „Windows“. Šiame kompiuteryje naudojama 8.1 versijos „Windows“.</translation> <translation id="6943584222992551122">Šio asmens naršymo duomenys bus ištrinti iš šio įrenginio. Jei norite atkurti duomenis, prisijunkite prie „Chrome“ kaip <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Beta versijos „Google Chrome“ skirta taisyklė, pagal kurią leidžiamas gaunamas mDNS srautas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index b33a51a5..b8ad9bc 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Кој користи Chrome?</translation> <translation id="1142745911746664600">Не може да се ажурира Chrome</translation> <translation id="1149651794389918149">Најавете се на Chrome. Ако сакате да најавите сметка само еднократно, може <ph name="GUEST_LINK_BEGIN" />да го користите уредот како гостин<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">За Chrome OS</translation> +<translation id="1152920704813762236">Повеќе за ChromeOS</translation> <translation id="1154147086299354128">&Отвори во Chrome</translation> <translation id="1194807384646768652">Chrome го блокираше преземањево затоа што видот датотека не се презема често и можеби е опасен</translation> <translation id="1203500561924088507">Фала за инсталирањето. Мора да го рестартирате прелистувачот пред да користите <ph name="BUNDLE_NAME" />.</translation> @@ -88,7 +88,7 @@ <translation id="234869673307233423">Chrome не може да ги провери вашите лозинки. Обидете се пак подоцна.</translation> <translation id="235650106824528204">Податоците на Chrome што се генерирани при користењето на овој профил (како на пример, создавање обележувачи, историја, лозинки и други поставки) може да се отстранат од страна на администраторот на работниот профил. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Продолжи</translation> -<translation id="2401189691232800402">Систем Chrome OS</translation> +<translation id="2401189691232800402">Систем ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Една или повеќе екстензии за Chrome пристапуваа до 1 HID-уред}=1{Една или повеќе екстензии за Chrome пристапуваат до 1 HID-уред}one{Една или повеќе екстензии за Chrome пристапуваат до # HID-уред}other{Една или повеќе екстензии за Chrome пристапуваат до # HID-уреди}}</translation> <translation id="2424440923901031101">Екстензијава ги прекршува правилата на „Веб-продавницата на Chrome“, па можеби не е безбедна. Отстранете ја од Chrome за да не може веќе да ги гледа и променува вашите податоци на сајтовите што ги отворате, што ги опфаќа и вашите лични податоци.</translation> <translation id="2467438592969358367">Google Chrome сака да ги извезе вашите лозинки. Внесете ја лозинката за Windows за да го дозволите ова.</translation> @@ -108,7 +108,7 @@ <translation id="2597976513418770460">Преземете ги работите на прелистувачот Chrome од <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Преземениот инсталатор не можеше да се кешира. Грешка: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome не може да провери дали се достапни ажурирања. Проверете ја интернет-врската.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome редовно проверува за да се погрижи вашиот прелистувач да ги има најбезбедните поставки. Ќе ве известиме ако треба да се прегледа нешто.</translation> <translation id="2652691236519827073">Отвори го линкот во нова &картичка на Chrome</translation> <translation id="2665296953892887393">Помогнете да го подобриме Google Chrome со испраќање извештаи за падови и <ph name="UMA_LINK" /> до Google</translation> @@ -357,7 +357,7 @@ <translation id="6851981911629679515">Вклучување дополнителна заштита во пребарувачот на JavaScript и WebAssembly во Chrome</translation> <translation id="6881299373831449287">Chrome се ажурира</translation> <translation id="6885412569789873916">Апликации на Chrome Beta</translation> -<translation id="6933858244219479645">Систем Chrome OS</translation> +<translation id="6933858244219479645">Систем ChromeOS</translation> <translation id="6938166777909186039">За да добивате идни ажурирања на Google Chrome, потребен ви е Windows 10 или понова верзија. Компјутеров користи Windows 8.1.</translation> <translation id="6943584222992551122">Податоците од прелистување на ова лице ќе се избришат од уредов. За да ги вратите податоците, најавете се на Chrome како <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Дојдовно правило за Google Chrome Beta за овозможување mDNS-сообраќај.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index b576809..eaa1ad13 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -165,6 +165,7 @@ <translation id="3426646014273736870">മെമ്മറി സേവർ Chrome-ന്റെ വേഗത വർദ്ധിപ്പിക്കുന്നു</translation> <translation id="3428747202529429621">നിങ്ങൾ സൈൻ ഇൻ ആയിരിക്കുമ്പോൾ Chrome-ൽ നിങ്ങളെ സുരക്ഷിതരാക്കുകയും മറ്റ് Google ആപ്പുകളിൽ നിങ്ങളുടെ സുരക്ഷ മെച്ചപ്പെടുത്താനും ഉപയോഗിച്ചേക്കാം</translation> <translation id="3434246496373299699">നിങ്ങളുടെ Google Account ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുമ്പോൾ, Chrome-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവും</translation> +<translation id="3450887623636316740">ഈ ഫയൽ അപകടകരമായേക്കാം<ph name="LINE_BREAK" />നിങ്ങൾ പാസ്വേഡ് നൽകിയാൽ Chrome-ന് നിങ്ങൾക്കായി ഈ ഡൗൺലോഡ് പരിശോധിക്കാൻ കഴിയും. ഫയലിനെ സംബന്ധിച്ച വിവരങ്ങൾ Google സുരക്ഷിത ബ്രൗസിംഗിലേക്ക് അയയ്ക്കും, എന്നാൽ ഫയലിന്റെ ഉള്ളടക്കവും പാസ്വേഡും നിങ്ങളുടെ ഉപകരണത്തിൽ തന്നെ നിലനിൽക്കും.</translation> <translation id="3451115285585441894">Chrome-ലേക്ക് ചേർക്കുന്നു...</translation> <translation id="345171907106878721">Chrome-ലേക്ക് സ്വയം ചേരുക</translation> <translation id="3453763134178591239">ChromeOS നിബന്ധനകൾ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index 97afc86d..42ec2687 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">Siapakah yang sedang menggunakan Chrome?</translation> <translation id="1142745911746664600">Tidak dapat mengemas kini Chrome</translation> <translation id="1149651794389918149">Log masuk ke Chrome. Jika anda mahu log masuk akaun satu kali sahaja, anda boleh <ph name="GUEST_LINK_BEGIN" />menggunakan peranti sebagai tetamu<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Perihal Chrome OS</translation> +<translation id="1152920704813762236">Perihal ChromeOS</translation> <translation id="1154147086299354128">&Buka dalam Chrome</translation> <translation id="1194807384646768652">Chrome menyekat muat turun ini kerana jenis fail jarang dimuat turun dan mungkin berbahaya</translation> <translation id="1203500561924088507">Terima kasih kerana memasang. Anda perlu memulakan semula penyemak imbas anda sebelum menggunakan <ph name="BUNDLE_NAME" />.</translation> @@ -84,7 +84,7 @@ <translation id="234869673307233423">Chrome tidak dapat menyemak kata laluan anda. Cuba lagi nanti.</translation> <translation id="235650106824528204">Sebarang data Chrome yang dijana semasa penggunaan profil ini (seperti pembuatan penanda halaman, sejarah, kata laluan dan tetapan lain) boleh dialih keluar oleh pentadbir profil kerja. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Teruskan</translation> -<translation id="2401189691232800402">Sistem Chrome OS</translation> +<translation id="2401189691232800402">Sistem ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{1 peranti HID telah diakses oleh satu atau beberapa sambungan Chrome}=1{1 peranti HID sedang diakses oleh satu atau beberapa sambungan Chrome}other{# peranti HID sedang diakses oleh satu atau beberapa sambungan Chrome}}</translation> <translation id="2424440923901031101">Sambungan ini melanggar dasar Gedung Web Chrome dan mungkin tidak selamat. Alih keluar sambungan ini daripada Chrome supaya sambungan ini tidak dapat melihat dan mengubah data anda pada laman yang anda lawati lagi, termasuk maklumat peribadi anda.</translation> <translation id="2467438592969358367">Google Chrome mahu mengeksport kata laluan anda. Taip kata laluan Windows anda untuk membenarkannya.</translation> @@ -104,7 +104,7 @@ <translation id="2597976513418770460">Dapatkan bahan penyemak imbas Chrome anda daripada <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Gagal mengcache pemasang yang dimuat turun. Ralat: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome tidak dapat menyemak kemas kini. Cuba periksa sambungan Internet anda.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome sentiasa menyemak untuk memastikan penyemak imbas anda menawarkan tetapan paling selamat. Kami akan memaklumi anda jika ada apa-apa yang memerlukan semakan anda.</translation> <translation id="2652691236519827073">Buka Pautan dalam &tab Chrome Baharu</translation> <translation id="2665296953892887393">Bantu jadikan Google Chrome lebih baik dengan menghantar laporan ranap dan <ph name="UMA_LINK" /> kepada Google.</translation> @@ -349,7 +349,7 @@ <translation id="6851981911629679515">Hidupkan perlindungan tambahan dalam JavaScript Chrome dan enjin WebAssembly</translation> <translation id="6881299373831449287">Mengemas kini Chrome</translation> <translation id="6885412569789873916">Apl Chrome Beta</translation> -<translation id="6933858244219479645">Sistem Chrome OS</translation> +<translation id="6933858244219479645">Sistem ChromeOS</translation> <translation id="6938166777909186039">Untuk mendapatkan kemaskinian Google Chrome yang akan datang, anda memerlukan Windows 10 atau yang lebih baharu. Komputer ini menggunakan Windows 8.1.</translation> <translation id="6943584222992551122">Data semakan imbas orang ini akan dipadamkan daripada peranti ini. Untuk memulihkan data itu, log masuk ke Chrome sebagai <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Peraturan masuk bagi Google Chrome Beta untuk membenarkan trafik mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index f46d715..6f02196 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -163,6 +163,7 @@ <translation id="3426646014273736870">मेमोरी सेभरले Chrome लाई अझ छिटो काम गर्ने बनाएको छ</translation> <translation id="3428747202529429621">तपाईं साइन इन भएका बेला यस सुविधाले Chrome मा तपाईंलाई सुरक्षित राख्छ। त्यस्तै, यो सुविधा तपाईंलाई Google का अन्य एपहरूमा अझ् धेरै सुरक्षा प्रदान गर्न पनि प्रयोग गरिन सक्छ</translation> <translation id="3434246496373299699">तपाईंले आफ्नो Google खातामा साइन इन गरेपछि मात्र Chrome ले तपाईंका पासवर्डहरूको जाँच गर्न सक्छ</translation> +<translation id="3450887623636316740">यो फाइल खतरनाक हुन सक्छ<ph name="LINE_BREAK" />तपाईंले पासवर्ड प्रदान गर्नुभयो भने Chrome ले तपाईंका तर्फबाट यो फाइलको जाँच गरिदिन सक्छ। यो फाइलसम्बन्धी जानकारी Google सुरक्षित ब्राउजिङमा पठाइन्छ तर फाइलमा भएको सामग्री र पासवर्ड तपाईंकै डिभाइसमा रहन्छन्।</translation> <translation id="3451115285585441894">Chrome मा थप्दै...</translation> <translation id="345171907106878721">आफूलाई Chrome मा थप्नुहोस</translation> <translation id="3453763134178591239">ChromeOS का सर्तहरू</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 3ac15bd..7b0115f 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -165,6 +165,7 @@ <translation id="3426646014273736870">ਮੈਮੋਰੀ ਸੇਵਰ Chrome ਨੂੰ ਜ਼ਿਆਦਾ ਤੇਜ਼ ਬਣਾਉਂਦਾ ਹੈ</translation> <translation id="3428747202529429621">ਤੁਹਾਡੇ ਸਾਈਨ-ਇਨ ਹੋਣ 'ਤੇ, ਤੁਹਾਨੂੰ Chrome ਵਿੱਚ ਸੁਰੱਖਿਅਤ ਰੱਖਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਸ਼ਾਇਦ ਹੋਰ Google ਐਪਾਂ ਵਿੱਚ ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਨੂੰ ਸੁਧਾਰਨ ਲਈ ਵਰਤਿਆ ਜਾ ਸਕੇ</translation> <translation id="3434246496373299699">ਤੁਹਾਡੇ ਵੱਲੋਂ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ 'ਤੇ Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹੈ</translation> +<translation id="3450887623636316740">ਇਹ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ<ph name="LINE_BREAK" />ਜੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦੇ ਹੋ, ਤਾਂ Chrome ਤੁਹਾਡੇ ਲਈ ਇਸ ਡਾਊਨਲੋਡ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹੈ। ਫ਼ਾਈਲ ਬਾਰੇ ਜਾਣਕਾਰੀ Google ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਭੇਜੀ ਜਾਂਦੀ ਹੈ, ਪਰ ਫ਼ਾਈਲ ਦੀ ਸਮੱਗਰੀ ਅਤੇ ਪਾਸਵਰਡ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਹੀ ਰਹਿੰਦੇ ਹਨ।</translation> <translation id="3451115285585441894">Chrome ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="345171907106878721">ਖੁਦ ਨੂੰ Chrome ਨਾਲ ਜੋੜੋ</translation> <translation id="3453763134178591239">ChromeOS ਦੇ ਨਿਯਮ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index b84da3d..87fa08a 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">Kto używa Chrome?</translation> <translation id="1142745911746664600">Nie można zaktualizować Chrome</translation> <translation id="1149651794389918149">Zaloguj się w Chrome. Jeśli chcesz zalogować się na konto tylko raz, możesz <ph name="GUEST_LINK_BEGIN" />skorzystać z trybu gościa na urządzeniu<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">System operacyjny Chrome – informacje</translation> +<translation id="1152920704813762236">ChromeOS – informacje</translation> <translation id="1154147086299354128">&Otwórz w Chrome</translation> <translation id="1194807384646768652">Pobieranie zostało zablokowane przez Chrome, ponieważ ten typ pliku nie jest często pobierany i może być niebezpieczny</translation> <translation id="1203500561924088507">Dziękujemy za instalację. Przed rozpoczęciem korzystania z programu <ph name="BUNDLE_NAME" /> musisz ponownie uruchomić przeglądarkę.</translation> @@ -83,7 +83,7 @@ <translation id="234869673307233423">Chrome nie może sprawdzić Twoich haseł. Spróbuj później.</translation> <translation id="235650106824528204">Wszystkie dane Chrome wygenerowane podczas używania tego profilu (takie jak zakładki, historia, hasła i inne ustawienia) mogą zostać usunięte przez administratora profilu służbowego. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Dalej</translation> -<translation id="2401189691232800402">System operacyjny Chrome</translation> +<translation id="2401189691232800402">System ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Co najmniej 1 rozszerzenie do Chrome uzyskiwało dostęp do 1 urządzenia HID}=1{Co najmniej 1 rozszerzenie do Chrome uzyskuje dostęp do 1 urządzenia HID}few{Co najmniej 1 rozszerzenie do Chrome uzyskuje dostęp do # urządzeń HID}many{Co najmniej 1 rozszerzenie do Chrome uzyskuje dostęp do # urządzeń HID}other{Co najmniej 1 rozszerzenie do Chrome uzyskuje dostęp do # urządzenia HID}}</translation> <translation id="2424440923901031101">To rozszerzenie narusza zasady Chrome Web Store i może być niebezpieczne. Usuń je z Chrome, aby nie odczytywało ani nie zmieniało Twoich danych na stronach, które odwiedzasz. Dotyczy to także Twoich danych osobowych.</translation> <translation id="2467438592969358367">Google Chrome chce wyeksportować Twoje hasła. Wpisz swoje hasło do Windows, by na to zezwolić.</translation> @@ -103,7 +103,7 @@ <translation id="2597976513418770460">Uzyskaj dostęp do danych z przeglądarki Chrome z konta <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Pobranego instalatora nie udało się załadować do pamięci podręcznej. Błąd: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome nie może sprawdzić dostępności aktualizacji. Sprawdź połączenie z internetem.</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome regularnie sprawdza, czy przeglądarka ma możliwie najbezpieczniejsze ustawienia. Jeśli będziemy potrzebować Twojej weryfikacji, powiadomimy Cię.</translation> <translation id="2652691236519827073">O&twórz link w nowej karcie Chrome</translation> <translation id="2665296953892887393">Pomóż nam ulepszyć Google Chrome, przesyłając do Google raporty o awariach i <ph name="UMA_LINK" /></translation> @@ -348,7 +348,7 @@ <translation id="6851981911629679515">Włącz dodatkową ochronę w mechanizmie JavaScript i WebAssembly w Chrome</translation> <translation id="6881299373831449287">Aktualizuję Chrome</translation> <translation id="6885412569789873916">Aplikacje do Chrome Beta</translation> -<translation id="6933858244219479645">System operacyjny Chrome</translation> +<translation id="6933858244219479645">System ChromeOS</translation> <translation id="6938166777909186039">Aby w przyszłości otrzymywać aktualizacje Google Chrome, musisz mieć system Windows 10 lub nowszy. Na tym komputerze jest zainstalowany system Windows 8.1.</translation> <translation id="6943584222992551122">Dane przeglądania tej osoby zostaną usunięte z tego urządzenia. Aby je odzyskać, zaloguj się w Chrome jako <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Reguła dla ruchu przychodzącego w Google Chrome Beta zezwalająca na ruch mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 5f08847..c59459f 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -12,7 +12,7 @@ <translation id="1125124144982679672">Vem ska använda Chrome?</translation> <translation id="1142745911746664600">Det gick inte att uppdatera Chrome</translation> <translation id="1149651794389918149">Logga in i Chrome. Om du bara vill logga in en gång med ett konto kan du <ph name="GUEST_LINK_BEGIN" />använda enheten som gäst<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Om Chrome OS</translation> +<translation id="1152920704813762236">Om ChromeOS</translation> <translation id="1154147086299354128">&Öppna i Chrome</translation> <translation id="1194807384646768652">Den här nedladdningen blockerades av Chrome eftersom filtypen inte brukar laddas ned och den kan vara farlig</translation> <translation id="1203500561924088507">Tack för att du installerat programmet. Du måste starta om webbläsaren innan du använder <ph name="BUNDLE_NAME" />.</translation> @@ -20,7 +20,7 @@ <translation id="1302523850133262269">Vänta medan de senaste systemuppdateringarna installeras av Chrome.</translation> <translation id="1335640173511558774"><ph name="MANAGER" /> kräver att du läser och godkänner följande användarvillkor innan du använder enheten. Villkoren varken utökar, ändrar eller begränsar villkoren för Google ChromeOS Flex.</translation> <translation id="1341711321000856656">Du kan byta för att se lösenord från en annan Chrome-profil</translation> -<translation id="1363996462118479832">Det gick inte att synkronisera data med Chrome OS på grund av ett inloggningsfel.</translation> +<translation id="1363996462118479832">Det gick inte att synkronisera data med ChromeOS på grund av ett inloggningsfel.</translation> <translation id="137466361146087520">Google Chrome beta</translation> <translation id="1399397803214730675">Det finns redan en senare version av Google Chrome på den här datorn. Om programmet inte fungerar avinstallerar du Google Chrome och försöker igen.</translation> <translation id="139993653570221430">Du kan när som helst ändra detta i inställningarna för Chrome. Provversionerna körs vid sidan av det sätt som annonser visas på för närvarande, så det kommer inte att märkas någon skillnad med en gång.</translation> @@ -32,7 +32,7 @@ <translation id="1507198376417198979">Anpassa din nya Chrome-profil</translation> <translation id="1516530951338665275">Google Chrome behöver åtkomst för Bluetooth för att fortsätta parkoppla. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation> -<translation id="1547295885616600893">Chrome OS fungerar tack vare <ph name="BEGIN_LINK_CROS_OSS" />ytterligare program med öppen källkod<ph name="END_LINK_CROS_OSS" />.</translation> +<translation id="1547295885616600893">ChromeOS fungerar tack vare <ph name="BEGIN_LINK_CROS_OSS" />ytterligare program med öppen källkod<ph name="END_LINK_CROS_OSS" />.</translation> <translation id="1553358976309200471">Uppdatera Chrome</translation> <translation id="1583073672411044740"><ph name="EXISTING_USER" /> är redan inloggad på den här Chrome-profilen. En ny Chrome-profil skapas för <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1587223624401073077">Google Chrome använder din kamera.</translation> @@ -73,7 +73,7 @@ <translation id="2126108037660393668">Den nedladdade filen gick inte att verifiera.</translation> <translation id="2130870084309816036">Det går inte att ansluta till internet. Om du använder en brandvägg lägger du till <ph name="PRODUCT_EXE_NAME" /> på godkännandelistan.</translation> <translation id="2131230230468101642">För att skydda din integritet raderar vi automatiskt intressen som är äldre än fyra veckor. Medan du surfar kan ett intresse dyka upp på listan igen. Du kan också ta bort intressen som du inte vill att Chrome ska inkludera.</translation> -<translation id="2139300032719313227">Starta om Chrome OS</translation> +<translation id="2139300032719313227">Starta om ChromeOS</translation> <translation id="2151406531797534936">Starta om Chrome nu</translation> <translation id="2174917724755363426">Installationen är inte klar. Är du säker på att du vill avbryta?</translation> <translation id="2190166659037789668">Fel vid uppdateringskontroll: <ph name="UPDATE_CHECK_ERROR" />.</translation> @@ -88,7 +88,7 @@ <translation id="234869673307233423">Chrome kan inte kontrollera dina lösenord. Försök igen senare.</translation> <translation id="235650106824528204">All data i Chrome som uppstår när den här profilen används (t.ex. bokmärken, historik, lösenord och andra inställningar) kan tas bort av jobbprofilens administratör. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Fortsätt</translation> -<translation id="2401189691232800402">Chrome OS-system</translation> +<translation id="2401189691232800402">ChromeOS-system</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Minst ett Chrome-tillägg har fått åtkomst till 1 styrdon}=1{Minst ett Chrome-tillägg har åtkomst till 1 styrdon}other{Minst ett Chrome-tillägg har åtkomst till # styrdon}}</translation> <translation id="2424440923901031101">Det här tillägget strider mot policyn för Chrome Web Store och kan vara osäkert. Ta bort det från Chrome så att det inte längre kan se och ändra data, inklusive dina personliga uppgifter, på webbplatser du besöker.</translation> <translation id="2467438592969358367">Lösenorden exporteras från Google Chrome. Skriv ditt Windows-lösenord om du tillåter detta.</translation> @@ -167,7 +167,7 @@ <translation id="3434246496373299699">Chrome kan kontrollera dina lösenord när du loggar in med Google-kontot</translation> <translation id="3451115285585441894">Lägger till i Chrome ...</translation> <translation id="345171907106878721">Lägg till dig själv i Chrome</translation> -<translation id="3453763134178591239">Villkor för Chrome OS</translation> +<translation id="3453763134178591239">Villkor för ChromeOS</translation> <translation id="3503306920980160878">Du behöver ge Chrome åtkomst till din plats om den ska kunna delas med webbplatsen</translation> <translation id="3533694711092285624">Det finns inga sparade lösenord. Chrome kan bara kontrollera dina lösenord om du sparar dem.</translation> <translation id="3541482654983822893">Chrome kan inte kontrollera dina lösenord. Försök igen om ett dygn.</translation> @@ -178,13 +178,13 @@ <translation id="3635073343384702370">Chrome kan bara kontrollera dina lösenord om du sparar dem</translation> <translation id="3667616615096815454">Det gick inte att installera appen. Appen är okänd för servern.</translation> <translation id="3673813398384385993">Chrome har upptäckt att <ph name="EXTENSION_NAME" /> innehåller skadlig programvara</translation> -<translation id="3703994572283698466">Chrome OS fungerar tack vare ytterligare <ph name="BEGIN_LINK_CROS_OSS" /> program med öppen källkod<ph name="END_LINK_CROS_OSS" />, liksom <ph name="BEGIN_LINK_LINUX_OSS" />utvecklingsmiljön för Linux<ph name="END_LINK_LINUX_OSS" />.</translation> +<translation id="3703994572283698466">ChromeOS fungerar tack vare ytterligare <ph name="BEGIN_LINK_CROS_OSS" /> program med öppen källkod<ph name="END_LINK_CROS_OSS" />, liksom <ph name="BEGIN_LINK_LINUX_OSS" />utvecklingsmiljön för Linux<ph name="END_LINK_LINUX_OSS" />.</translation> <translation id="3716540481907974026">ChromeOS Flex-version</translation> <translation id="3718181793972440140">Ett objekt tas bort från enheten. Logga in i Chrome som <ph name="USER_EMAIL" /> om du vill kunna återställa datan senare.</translation> -<translation id="3744202345691150878">Få hjälp med Chrome OS</translation> +<translation id="3744202345691150878">Få hjälp med ChromeOS</translation> <translation id="3780814664026482060">Chrome – <ph name="PAGE_TITLE" /></translation> <translation id="3785324443014631273">Det gick inte att synkronisera data med ChromeOS Flex på grund av ett inloggningsfel.</translation> -<translation id="3795971588916395511">Google Chrome OS</translation> +<translation id="3795971588916395511">Google ChromeOS</translation> <translation id="3809772425479558446">För Google Chrome krävs Windows 10 eller senare.</translation> <translation id="3835168907083856002">En ny Chrome-profil skapas för <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="386202838227397562">Stäng alla Google Chrome-fönster och försök igen.</translation> @@ -193,7 +193,7 @@ <translation id="3889417619312448367">Avinstallera Google Chrome</translation> <translation id="3941890832296813527">Installationsfel: Installationens filnamn är ogiltigt eller stöds inte.</translation> <translation id="3999683152997576765">Du kan se och ta bort intressanta ämnen som används på webbplatser för att visa annonser för dig. Uppskattningen av vad du är intresserad av görs utifrån den senaste webbhistoriken i Chrome.</translation> -<translation id="4035053306113201399">Chrome OS måste startas om för att uppdateringen ska börja gälla.</translation> +<translation id="4035053306113201399">ChromeOS måste startas om för att uppdateringen ska börja gälla.</translation> <translation id="4050175100176540509">Den senaste versionen har viktiga säkerhetsförbättringar och nya funktioner.</translation> <translation id="4053720452172726777">Anpassa och kontrollera Google Chrome</translation> <translation id="4106587138345390261">Chrome utforskar nya funktioner som gör att webbplatser kan ge samma surfupplevelse med mindre information om dig</translation> @@ -254,7 +254,7 @@ <translation id="495931528404527476">I Chrome</translation> <translation id="4969674060580488087">Det gick inte att synkronisera data med ChromeOS Flex eftersom inloggningsuppgifterna för kontot är inaktuella.</translation> <translation id="4970761609246024540">Välkommen till Chrome-profiler</translation> -<translation id="4970880042055371251">Chrome OS-version</translation> +<translation id="4970880042055371251">ChromeOS-version</translation> <translation id="4970947549776831107">Den här filen blockerades av Chrome eftersom den här typen av filer är farliga</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5003967926796347400">Klicka på Google Lösenordshantering</translation> @@ -270,9 +270,9 @@ <translation id="5239627039202700673">Använd Chrome varje gång du klickar på länkar i meddelanden, dokument och andra appar</translation> <translation id="5251420635869119124">Gäster kan använda Chrome utan att lämna spår.</translation> <translation id="5320351714793324716">Om du tillåter cookies kan Chrome använda dem när innehåll läses in i förväg</translation> -<translation id="5334309298019785904">Det gick inte att synkronisera data med Chrome OS eftersom synkronisering inte är tillgängligt för din domän.</translation> +<translation id="5334309298019785904">Det gick inte att synkronisera data med ChromeOS eftersom synkronisering inte är tillgängligt för din domän.</translation> <translation id="5334487786912937552">Du behöver ge Chrome åtkomst till lagringsutrymmet om det ska gå att ladda ned filer</translation> -<translation id="5337648990166757586">Valfritt: Skicka diagnostik- och användningsdata automatiskt till Google och hjälp oss att förbättra funktioner och prestanda i Chrome OS.</translation> +<translation id="5337648990166757586">Valfritt: Skicka diagnostik- och användningsdata automatiskt till Google och hjälp oss att förbättra funktioner och prestanda i ChromeOS.</translation> <translation id="5357889879764279201">Få hjälp med ChromeOS Flex</translation> <translation id="5368118228313795342">Extra kod: <ph name="EXTRA_CODE" />.</translation> <translation id="5386118856456530849">Öppna versionsinställningarna för Chrome</translation> @@ -357,7 +357,7 @@ <translation id="6851981911629679515">Aktivera ytterligare skydd i Chromes JavaScript- och WebAssembly-motor</translation> <translation id="6881299373831449287">Chrome uppdateras</translation> <translation id="6885412569789873916">Appar i Chrome Beta</translation> -<translation id="6933858244219479645">Chrome OS-system</translation> +<translation id="6933858244219479645">ChromeOS-system</translation> <translation id="6938166777909186039">Du behöver Windows 10 eller senare för att få kommande uppdateringar av Google Chrome. På den här datorn används Windows 8.1.</translation> <translation id="6943584222992551122">Den här personens webbinformation raderas från enheten. Logga in i Chrome som <ph name="USER_EMAIL" /> om du vill återställa data.</translation> <translation id="6967962315388095737">Regel som tillåter inkommande mDNS-trafik för Google Chrome Beta.</translation> @@ -399,7 +399,7 @@ <translation id="7583399374488819119">Installationsprogram för <ph name="COMPANY_NAME" /></translation> <translation id="7606334485649076285">Google ChromeOS Flex</translation> <translation id="7626032353295482388">Välkommen till Chrome</translation> -<translation id="7626072681686626474"><ph name="MANAGER" /> kräver att du läser och godkänner följande användarvillkor innan du använder enheten. Villkoren varken utökar, ändrar eller begränsar villkoren för Google Chrome OS.</translation> +<translation id="7626072681686626474"><ph name="MANAGER" /> kräver att du läser och godkänner följande användarvillkor innan du använder enheten. Villkoren varken utökar, ändrar eller begränsar villkoren för Google ChromeOS.</translation> <translation id="7629695634924605473">Om dina lösenord någonsin skulle läcka ut får du veta det i Chrome</translation> <translation id="7641148173327520642">Systemadministratören har konfigurerat Google Chrome så att <ph name="TARGET_URL_HOSTNAME" /> öppnas i <ph name="ALTERNATIVE_BROWSER_NAME" />.</translation> <translation id="7649070708921625228">Hjälp</translation> @@ -451,7 +451,7 @@ <translation id="8394720698884623075">Kontrollera webbadresser mot en lista över osäkra webbplatser i Chrome</translation> <translation id="8403038600646341038">Chrome-logotyp på en datorskärm.</translation> <translation id="8416347857511542594">Läs mer om annonsanpassning i Chrome</translation> -<translation id="8418845734693287262">Det gick inte att synkronisera data med Chrome OS eftersom inloggningsuppgifterna för kontot är inaktuella.</translation> +<translation id="8418845734693287262">Det gick inte att synkronisera data med ChromeOS eftersom inloggningsuppgifterna för kontot är inaktuella.</translation> <translation id="842386925677997438">Säkerhetsverktyg i Chrome</translation> <translation id="8433638294851456451">Logga in på Chrome på båda enheterna om du vill skicka ett nummer från Android-telefonen.</translation> <translation id="8451192282033883849">Kontot hanteras av <ph name="MANAGER_NAME" />. Administratören kan se och redigera den här Chrome-profilen och tillhörande data som bokmärken, historik och lösenord.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index 52d7ba78..bdfd2396 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">ใครกำลังใช้ Chrome อยู่</translation> <translation id="1142745911746664600">อัปเดต Chrome ไม่ได้</translation> <translation id="1149651794389918149">ลงชื่อเข้าใช้ Chrome หากต้องการลงชื่อเข้าใช้บัญชีเพียงครั้งเดียว คุณสามารถ<ph name="GUEST_LINK_BEGIN" />ใช้อุปกรณ์ในฐานะผู้มาเยือน<ph name="GUEST_LINK_END" />ได้</translation> -<translation id="1152920704813762236">เกี่ยวกับ Chrome OS</translation> +<translation id="1152920704813762236">เกี่ยวกับ ChromeOS</translation> <translation id="1154147086299354128">เ&ปิดใน Chrome</translation> <translation id="1194807384646768652">Chrome บล็อกการดาวน์โหลดนี้เนื่องจากไฟล์ประเภทนี้ไม่ได้มีการดาวน์โหลดกันโดยทั่วไปและอาจเป็นอันตราย</translation> <translation id="1203500561924088507">ขอขอบคุณที่ติดตั้ง คุณต้องรีสตาร์ทเบราว์เซอร์ก่อนใช้ <ph name="BUNDLE_NAME" /></translation> @@ -83,7 +83,7 @@ <translation id="234869673307233423">Chrome ตรวจสอบรหัสผ่านของคุณไม่ได้ โปรดลองอีกครั้งภายหลัง</translation> <translation id="235650106824528204">ผู้ดูแลโปรไฟล์งานนำข้อมูล Chrome ที่สร้างขึ้นในช่วงที่มีการใช้โปรไฟล์นี้ออกได้ (เช่น การสร้างบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ) <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">ต่อไป</translation> -<translation id="2401189691232800402">ระบบ Chrome OS</translation> +<translation id="2401189691232800402">ระบบ ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{มีส่วนขยาย Chrome อย่างน้อย 1 รายการกำลังเข้าถึงอุปกรณ์ HID 1 เครื่อง}=1{มีส่วนขยาย Chrome อย่างน้อย 1 รายการกำลังเข้าถึงอุปกรณ์ HID 1 เครื่อง}other{มีส่วนขยาย Chrome อย่างน้อย 1 รายการกำลังเข้าถึงอุปกรณ์ HID # เครื่อง}}</translation> <translation id="2424440923901031101">ส่วนขยายนี้ละเมิดนโยบาย Chrome เว็บสโตร์และอาจไม่ปลอดภัย นำส่วนขยายดังกล่าวออกจาก Chrome เพื่อไม่ให้ดูและเปลี่ยนแปลงข้อมูลของคุณในเว็บไซต์ที่เข้าชม รวมถึงข้อมูลส่วนบุคคลได้อีกต่อไป</translation> <translation id="2467438592969358367">Google Chrome ต้องการส่งออกรหัสผ่านของคุณ พิมพ์รหัสผ่าน Windows เพื่ออนุญาตให้ดำเนินการ</translation> @@ -103,7 +103,7 @@ <translation id="2597976513418770460">ดึงข้อมูลของคุณในเบราว์เซอร์ Chrome จาก <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">การแคชโปรแกรมติดตั้งที่ดาวน์โหลดไว้ล้มเหลว ข้อผิดพลาด: <ph name="UNPACK_CACHING_ERROR_CODE" /></translation> <translation id="2622559029861875898">Chrome ตรวจหาอัปเดตไม่ได้ โปรดลองตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</translation> -<translation id="2645435784669275700">Chrome OS</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome ดำเนินการตรวจสอบเป็นประจำเพื่อให้มั่นใจว่าเบราว์เซอร์มีการตั้งค่าที่ปลอดภัยที่สุด เราจะแจ้งให้คุณทราบหากมีสิ่งใดที่คุณต้องตรวจสอบ</translation> <translation id="2652691236519827073">เปิดลิงก์ใน Chrome แท็บใหม่</translation> <translation id="2665296953892887393">ช่วยทำให้ Google Chrome ดียิ่งขึ้นโดยการส่งรายงานข้อขัดข้องและ <ph name="UMA_LINK" /> ไปยัง Google</translation> @@ -348,7 +348,7 @@ <translation id="6851981911629679515">เปิดการปกป้องเพิ่มเติมในเครื่องมือ JavaScript และ WebAssembly ของ Chrome</translation> <translation id="6881299373831449287">กำลังอัปเดต Chrome</translation> <translation id="6885412569789873916">แอป Chrome เบต้า</translation> -<translation id="6933858244219479645">ระบบ Chrome OS</translation> +<translation id="6933858244219479645">ระบบ ChromeOS</translation> <translation id="6938166777909186039">คุณจะต้องใช้ Windows 10 ขึ้นไปเพื่อรับการอัปเดต Google Chrome ในอนาคต คอมพิวเตอร์เครื่องนี้ใช้ Windows 8.1</translation> <translation id="6943584222992551122">ระบบจะลบข้อมูลการท่องเว็บของบุคคลนี้ออกจากอุปกรณ์เครื่องนี้ หากต้องการกู้ข้อมูลคืน ให้ลงชื่อเข้าใช้ Chrome ในชื่อ <ph name="USER_EMAIL" /></translation> <translation id="6967962315388095737">กฎขาเข้าสำหรับ Google Chrome เบต้าเพื่ออนุญาตการเข้าชมแบบ mDNS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index 0a49e02..6866840c 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">Хто користується веб-переглядачем Chrome?</translation> <translation id="1142745911746664600">Не вдається оновити Chrome</translation> <translation id="1149651794389918149">Увійдіть у Chrome. Якщо ви хочете ввійти в цей обліковий запис лише один раз, <ph name="GUEST_LINK_BEGIN" />використовуйте пристрій у режимі гостя<ph name="GUEST_LINK_END" />.</translation> -<translation id="1152920704813762236">Про ОС Chrome</translation> +<translation id="1152920704813762236">Про ChromeOS</translation> <translation id="1154147086299354128">&Відкрити в Chrome</translation> <translation id="1194807384646768652">Веб-переглядач Chrome заблокував завантаження, оскільки файли цього типу зазвичай не завантажують і вони можуть бути небезпечними</translation> <translation id="1203500561924088507">Дякуємо за встановлення. Щоб почати використовувати пакет <ph name="BUNDLE_NAME" />, потрібно перезапустити веб-переглядач.</translation> @@ -84,7 +84,7 @@ <translation id="234869673307233423">Chrome не може перевірити паролі. Повторіть спробу пізніше.</translation> <translation id="235650106824528204">Будь-які дані Chrome, створені під час використання цього робочого профілю (наприклад, закладки, історію, паролі й інші налаштування), може видалити його адміністратор. <ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">Продовжити</translation> -<translation id="2401189691232800402">ОС Chrome</translation> +<translation id="2401189691232800402">ChromeOS</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{Щонайменше одне розширення Chrome отримало доступ до 1 пристрою HID}=1{Щонайменше одне розширення Chrome має доступ до 1 пристрою HID}one{Щонайменше одне розширення Chrome має доступ до # пристрою HID}few{Щонайменше одне розширення Chrome має доступ до # пристроїв HID}many{Щонайменше одне розширення Chrome має доступ до # пристроїв HID}other{Щонайменше одне розширення Chrome має доступ до # пристрою HID}}</translation> <translation id="2424440923901031101">Це розширення порушує правила Веб-магазину Chrome і може бути небезпечним. Вилучіть його з Chrome, щоб розширення більше не могло переглядати й змінювати дані на сайтах, які ви відвідуєте (зокрема вашу особисту інформацію).</translation> <translation id="2467438592969358367">Google Chrome хоче експортувати ваші паролі. Щоб дозволити, введіть свій пароль Windows.</translation> @@ -104,7 +104,7 @@ <translation id="2597976513418770460">Отримуйте доступ до своїх даних у веб-переглядачі Chrome через обліковий запис <ph name="ACCOUNT_EMAIL" /></translation> <translation id="259935314519650377">Не вдалося кешувати завантажену програму встановлення. Помилка: <ph name="UNPACK_CACHING_ERROR_CODE" />.</translation> <translation id="2622559029861875898">Chrome не може перевірити наявність оновлень. Перевірте інтернет-з'єднання.</translation> -<translation id="2645435784669275700">ОС Chrome</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome регулярно перевіряє, чи достатньо надійні налаштування вашого веб-переглядача. Ми повідомимо, якщо потрібно буде вжити заходів.</translation> <translation id="2652691236519827073">Відкрити посилання в новій &вкладці Chrome</translation> <translation id="2665296953892887393">Допоможіть покращити Google Chrome, надсилаючи звіти про аварійне завершення роботи та <ph name="UMA_LINK" /> в Google</translation> @@ -349,7 +349,7 @@ <translation id="6851981911629679515">Увімкніть додатковий захист у системі JavaScript і WebAssembly для Chrome</translation> <translation id="6881299373831449287">Оновлення Chrome</translation> <translation id="6885412569789873916">Бета-версія додатків Chrome</translation> -<translation id="6933858244219479645">ОС Chrome</translation> +<translation id="6933858244219479645">ChromeOS</translation> <translation id="6938166777909186039">Щоб отримувати майбутні оновлення Google Chrome, потрібна операційна система Windows 10 або новішої версії. На цьому комп’ютері встановлено Windows 8.1.</translation> <translation id="6943584222992551122">Дані веб-перегляду користувача буде видалено з цього пристрою. Щоб відновити їх, увійдіть в обліковий запис Chrome як <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Вхідне правило для бета-версії Google Chrome дозволяє трафік mDNS.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 6ac406e..9a9001cc 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -164,6 +164,7 @@ <translation id="3426646014273736870">میموری سیور نے Chrome کو تیز تر بنا دیا</translation> <translation id="3428747202529429621">آپ کے سائن ان ہونے پر آپ کو Chrome پر محفوظ رکھتا ہے اور دیگر Google ایپس میں آپ کی سیکیورٹی کو بہتر بنانے کے لیے استعمال کیا جا سکتا ہے</translation> <translation id="3434246496373299699">جب آپ اپنے Google اکاؤنٹ سے سائن ان ہوتے ہیں تو Chrome آپ کے پاس ورڈز کو چیک کر سکتا ہے</translation> +<translation id="3450887623636316740">یہ فائل خطرناک ہو سکتی ہے<ph name="LINE_BREAK" />اگر آپ پاس ورڈ فراہم کرتے ہیں تو Chrome آپ کے لیے اس ڈاؤن لوڈ کو چیک کر سکتا ہے۔ فائل کے بارے میں معلومات Google محفوظ براؤزنگ کو بھیجی جاتی ہے، لیکن فائل کا مواد اور پاس ورڈ آپ کے آلے پر رہتا ہے۔</translation> <translation id="3451115285585441894">Chrome میں شامل کیا جا رہا ہے…</translation> <translation id="345171907106878721">خود کو Chrome میں شامل کریں</translation> <translation id="3453763134178591239">ChromeOS کی شرائط</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index 4c12a70..ce69b328 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -162,6 +162,7 @@ <translation id="3426646014273736870">Xotirani tejash funksiyasi Chromeni tezlashtirdi</translation> <translation id="3428747202529429621">Hisobingizga kirganingizda Chrome va boshqa Google ilovalaridan xavfsiz foydalanishingizni taʼminlaydi</translation> <translation id="3434246496373299699">Google hisobingizga kirsangiz, Chrome parollaringizni tekshira oladi</translation> +<translation id="3450887623636316740">Bu fayl xavfli boʻlishi mumkin<ph name="LINE_BREAK" />Parol bilan tasdiqlasangiz, Chrome bu yuklanmani tekshirishi mumkin. Fayl Google Saytlarni xavfsiz kezish serveriga yuborilishi, ammo faylning kontenti va parol qurilmada saqlanishi haqidagi axborot.</translation> <translation id="3451115285585441894">O‘rnatilmoqda...</translation> <translation id="345171907106878721">Chrome foydalanuvchisini qo‘shish</translation> <translation id="3453763134178591239">ChromeOS shartlari</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 167a94a..8ba43e8 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -83,7 +83,7 @@ <translation id="234869673307233423">Chrome 无法检查您的密码。请稍后重试。</translation> <translation id="235650106824528204">在使用此工作资料(例如创建书签、历史记录、密码和其他设置)时生成的任何 Chrome 数据都可由工作资料管理员移除。<ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">继续</translation> -<translation id="2401189691232800402">Chrome 操作系统系统</translation> +<translation id="2401189691232800402">ChromeOS 系统</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{一个或多个 Chrome 扩展程序访问过 1 部 HID 设备}=1{一个或多个 Chrome 扩展程序正在访问 1 部 HID 设备}other{一个或多个 Chrome 扩展程序正在访问 # 部 HID 设备}}</translation> <translation id="2424440923901031101">此扩展程序违反了 Chrome 应用商店政策,可能不安全。请将其从 Chrome 中移除,这样它便无法再查看和更改您在所访问的网站上的数据,包括您的个人信息。</translation> <translation id="2467438592969358367">Google Chrome 想导出您的密码。请输入您的 Windows 密码以允许此操作。</translation> @@ -103,7 +103,7 @@ <translation id="2597976513418770460">从 <ph name="ACCOUNT_EMAIL" /> 获取您的 Chrome 浏览器信息</translation> <translation id="259935314519650377">未能缓存所下载的安装程序。错误:<ph name="UNPACK_CACHING_ERROR_CODE" />。</translation> <translation id="2622559029861875898">Chrome 无法检查是否有更新。请检查您的互联网连接。</translation> -<translation id="2645435784669275700">Chrome 操作系统</translation> +<translation id="2645435784669275700">ChromeOS</translation> <translation id="2649768380733403658">Chrome 会定期进行检查,以确保您的浏览器使用最安全的设置。如有任何内容需要您审核,我们会通知您。</translation> <translation id="2652691236519827073">在 Chrome 新标签页中打开链接(&T)</translation> <translation id="2665296953892887393">将崩溃报告和<ph name="UMA_LINK" />发送给Google,帮助我们完善Google Chrome。</translation> @@ -348,7 +348,7 @@ <translation id="6851981911629679515">开启 Chrome 的 JavaScript 和 WebAssembly 引擎额外保护功能</translation> <translation id="6881299373831449287">正在更新 Chrome</translation> <translation id="6885412569789873916">Chrome 测试版应用</translation> -<translation id="6933858244219479645">Chrome 操作系统系统</translation> +<translation id="6933858244219479645">ChromeOS 系统</translation> <translation id="6938166777909186039">若要接收后续 Google Chrome 更新,您需使用 Windows 10 或更高版本。该计算机目前使用的是 Windows 8.1。</translation> <translation id="6943584222992551122">系统将会从此设备上删除该用户的浏览数据。要想恢复这些数据,请以“<ph name="USER_EMAIL" />”的身份登录 Chrome。</translation> <translation id="6967962315388095737">Google Chrome 测试版的入站规则,允许 mDNS 流量。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index 71cf4c0..da608e61 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -10,7 +10,7 @@ <translation id="1125124144982679672">誰在使用 Chrome?</translation> <translation id="1142745911746664600">無法更新 Chrome</translation> <translation id="1149651794389918149">登入 Chrome。如果你只想登入帳戶一次,可以<ph name="GUEST_LINK_BEGIN" />透過訪客的身分使用這部裝置<ph name="GUEST_LINK_END" />。</translation> -<translation id="1152920704813762236">關於 Chrome OS</translation> +<translation id="1152920704813762236">關於 ChromeOS</translation> <translation id="1154147086299354128">在 Chrome 中開啟(&O)</translation> <translation id="1194807384646768652">這不是常有人下載的檔案類型,可能有危險,因此 Chrome 已禁止下載</translation> <translation id="1203500561924088507">感謝你安裝本服務。你必須重新啟動瀏覽器,才能使用 <ph name="BUNDLE_NAME" />。</translation> @@ -84,7 +84,7 @@ <translation id="234869673307233423">Chrome 無法檢查你的密碼,請稍後再試。</translation> <translation id="235650106824528204">凡是在使用這個資料夾期間產生的 Chrome 資料 (例如建立的書籤、歷史記錄、密碼和其他設定),工作資料夾管理員皆可予以移除。<ph name="LEARN_MORE" /></translation> <translation id="2359808026110333948">繼續</translation> -<translation id="2401189691232800402">Chrome OS 系統</translation> +<translation id="2401189691232800402">ChromeOS 系統</translation> <translation id="2409816192575564775">{NUM_DEVICES,plural, =0{至少有 1 個 Chrome 擴充功能當時正在存取 1 部 HID 裝置}=1{至少有 1 個 Chrome 擴充功能正在存取 1 部 HID 裝置}other{至少有 1 個 Chrome 擴充功能正在存取 # 部 HID 裝置}}</translation> <translation id="2424440923901031101">這項擴充功能違反 Chrome 線上應用程式商店政策,可能不安全。請從 Chrome 中移除這項擴充功能,使其無法再查看及變更你造訪的網站相關資料,包括你的個人資訊。</translation> <translation id="2467438592969358367">Google Chrome 要求匯出你的密碼。如果允許,請輸入你的 Windows 密碼。</translation> @@ -351,7 +351,7 @@ <translation id="6851981911629679515">開啟 Chrome 的 JavaScript 和 WebAssembly 引擎額外防護</translation> <translation id="6881299373831449287">正在更新 Chrome</translation> <translation id="6885412569789873916">Chrome 測試版應用程式</translation> -<translation id="6933858244219479645">Chrome OS 系統</translation> +<translation id="6933858244219479645">ChromeOS 系統</translation> <translation id="6938166777909186039">如要取得日後的 Google Chrome 更新,必須使用 Windows 10 以上版本。這部電腦目前版本為 Windows 8.1。</translation> <translation id="6943584222992551122">這位使用者的瀏覽資料將從這個裝置上刪除。如要還原資料,請使用 <ph name="USER_EMAIL" /> 登入 Chrome。</translation> <translation id="6967962315388095737">允許 mDNS 流量的 Google Chrome 測試版輸入規則。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index a66baa1..e59fefcb 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -165,6 +165,7 @@ <translation id="3426646014273736870">Isilondolozi Senkumbulo Senze I-Chrome Yashesha</translation> <translation id="3428747202529429621">Kukugcina uphephile ku-Chrome futhi kungase kusetshenziswe ukuthuthukisa ukuvikeleka kwakho kwezinye izinhlelo zokusebenza ze-Google lapho ungene ngemvume</translation> <translation id="3434246496373299699">I-Chrome ingahlola amaphasiwedi akho uma ungena ngemvume nge-Akhawunti yakho ye-Google</translation> +<translation id="3450887623636316740">Leli fayela kungenzeka libe nobungozi<ph name="LINE_BREAK" />I-Chrome ingakuhlolela lokhu okudawunilodwayo uma unikeza iphasiwedi. Ulwazi mayelana nefayela luthunyelwa kokuthi Ukuphequlula ngokuphephile kwe-Google, kodwa okuqukethwe kufayela kanye nephasiwedi kusala kudivayisi yakho.</translation> <translation id="3451115285585441894">Ingeza ku-Chrome...</translation> <translation id="345171907106878721">Zingeze ngokwakho ku-Chrome</translation> <translation id="3453763134178591239">Imigomo ye-ChromeOS</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 09e18dc..96f49afb 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -7173,13 +7173,6 @@ FEATURE_VALUE_TYPE(features::kAutoDisableAccessibility)}, #if BUILDFLAG(IS_ANDROID) - {"enable-auto-disable-accessibility-v2", - flag_descriptions::kEnableAutoDisableAccessibilityV2Name, - flag_descriptions::kEnableAutoDisableAccessibilityV2Description, - kOsAndroid, FEATURE_VALUE_TYPE(features::kAutoDisableAccessibilityV2)}, -#endif - -#if BUILDFLAG(IS_ANDROID) {"app-specific-history", flag_descriptions::kAppSpecificHistoryName, flag_descriptions::kAppSpecificHistoryDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kAppSpecificHistory)},
diff --git a/chrome/browser/apps/app_service/app_install/web_app_installer.cc b/chrome/browser/apps/app_service/app_install/web_app_installer.cc index 4077a4e..1a37252 100644 --- a/chrome/browser/apps/app_service/app_install/web_app_installer.cc +++ b/chrome/browser/apps/app_service/app_install/web_app_installer.cc
@@ -32,21 +32,28 @@ // Maximum size of the manifest file. 1MB. constexpr int kMaxManifestSizeInBytes = 1024 * 1024; -// TODO(b/315077325): Rename annotation to be related to AppInstallService -// instead of AppPreloadService. constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation = - net::DefineNetworkTrafficAnnotation("app_preload_service_web_installer", + net::DefineNetworkTrafficAnnotation("app_install_service_web_app_installer", R"( semantics { - sender: "App Preload Service" + sender: "App Install Service" description: - "Sends a request to a Google server to retrieve app installation" - "information." + "Sends a request to a Google server to retrieve web app installation" + "data." trigger: - "Requests are sent after the App Preload Service has performed an" - "initial request to get a list of apps to install." + "Requests are sent as part of App Install Service triggered installs " + "for web apps." + internal: { + contacts { + email: "cros-apps-foundation-system@google.com" + } + } + user_data: { + type: NONE + } data: "None" destination: GOOGLE_OWNED_SERVICE + last_reviewed: "2024-01-02" } policy { cookies_allowed: NO
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc index c970730..48370a9 100644 --- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -10,7 +10,6 @@ #include "base/functional/bind.h" #include "base/location.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -420,10 +419,7 @@ } size_t initial_widget_count_ = 0; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION content::RenderWidgetHost* last_render_widget_host_ = - nullptr; + raw_ptr<content::RenderWidgetHost> last_render_widget_host_ = nullptr; std::unique_ptr<base::RunLoop> run_loop_; };
diff --git a/chrome/browser/ash/android_sms/fcm_connection_establisher.h b/chrome/browser/ash/android_sms/fcm_connection_establisher.h index 3098a2e7..560df43 100644 --- a/chrome/browser/ash/android_sms/fcm_connection_establisher.h +++ b/chrome/browser/ash/android_sms/fcm_connection_establisher.h
@@ -10,7 +10,7 @@ #include "base/containers/queue.h" #include "base/gtest_prod_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "base/timer/timer.h" @@ -61,9 +61,7 @@ content::ServiceWorkerContext* service_worker_context); GURL service_worker_scope; MessageType message_type; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION content::ServiceWorkerContext* service_worker_context; + raw_ptr<content::ServiceWorkerContext> service_worker_context; }; struct InFlightMessage {
diff --git a/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.cc b/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.cc index da52da2..c4c79bfe 100644 --- a/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.cc +++ b/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.cc
@@ -61,7 +61,7 @@ } const ArcKioskAppData* ArcKioskAppManager::GetAppByAccountId( - const AccountId& account_id) { + const AccountId& account_id) const { for (auto& app : apps_) { if (app->account_id() == account_id) { return app.get();
diff --git a/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h b/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h index 8d9c732..12e24bd 100644 --- a/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h +++ b/chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h
@@ -37,7 +37,7 @@ static void RegisterPrefs(PrefRegistrySimple* registry); // Returns app that should be started for given account id. - const ArcKioskAppData* GetAppByAccountId(const AccountId& account_id); + const ArcKioskAppData* GetAppByAccountId(const AccountId& account_id) const; // KioskAppManagerBase: std::vector<App> GetApps() const override;
diff --git a/chrome/browser/ash/app_mode/kiosk_controller.cc b/chrome/browser/ash/app_mode/kiosk_controller.cc index 56f8ec5..01c409d 100644 --- a/chrome/browser/ash/app_mode/kiosk_controller.cc +++ b/chrome/browser/ash/app_mode/kiosk_controller.cc
@@ -23,7 +23,7 @@ namespace { -std::optional<KioskApp> WebAppById(WebKioskAppManager& manager, +std::optional<KioskApp> WebAppById(const WebKioskAppManager& manager, const AccountId& account_id) { const WebKioskAppData* data = manager.GetAppByAccountId(account_id); if (!data) { @@ -33,7 +33,7 @@ data->install_url()); } -std::optional<KioskApp> ChromeAppById(KioskChromeAppManager& manager, +std::optional<KioskApp> ChromeAppById(const KioskChromeAppManager& manager, std::string_view chrome_app_id) { KioskChromeAppManager::App manager_app; if (!manager.GetApp(std::string(chrome_app_id), &manager_app)) { @@ -44,7 +44,7 @@ manager_app.name, manager_app.icon); } -std::optional<KioskApp> ArcAppById(ArcKioskAppManager& manager, +std::optional<KioskApp> ArcAppById(const ArcKioskAppManager& manager, const AccountId& account_id) { const ArcKioskAppData* data = manager.GetAppByAccountId(account_id); if (!data) { @@ -62,12 +62,7 @@ return CHECK_DEREF(g_instance); } -KioskController::KioskController(WebKioskAppManager& web_app_manager, - KioskChromeAppManager& chrome_app_manager, - ArcKioskAppManager& arc_app_manager) - : web_app_manager_(web_app_manager), - chrome_app_manager_(chrome_app_manager), - arc_app_manager_(arc_app_manager) { +KioskController::KioskController() { CHECK(!g_instance); g_instance = this; } @@ -78,17 +73,17 @@ std::vector<KioskApp> KioskController::GetApps() const { std::vector<KioskApp> apps; - for (const KioskAppManagerBase::App& web_app : web_app_manager_->GetApps()) { + for (const KioskAppManagerBase::App& web_app : web_app_manager_.GetApps()) { apps.emplace_back(KioskAppId::ForWebApp(web_app.account_id), web_app.name, web_app.icon, web_app.url); } for (const KioskAppManagerBase::App& chrome_app : - chrome_app_manager_->GetApps()) { + chrome_app_manager_.GetApps()) { apps.emplace_back( KioskAppId::ForChromeApp(chrome_app.app_id, chrome_app.account_id), chrome_app.name, chrome_app.icon); } - for (const KioskAppManagerBase::App& arc_app : arc_app_manager_->GetApps()) { + for (const KioskAppManagerBase::App& arc_app : arc_app_manager_.GetApps()) { apps.emplace_back(KioskAppId::ForArcApp(arc_app.account_id), arc_app.name, arc_app.icon); } @@ -99,26 +94,26 @@ const KioskAppId& app_id) const { switch (app_id.type) { case KioskAppType::kWebApp: - return WebAppById(web_app_manager_.get(), app_id.account_id); + return WebAppById(web_app_manager_, app_id.account_id); case KioskAppType::kChromeApp: - return ChromeAppById(chrome_app_manager_.get(), app_id.app_id.value()); + return ChromeAppById(chrome_app_manager_, app_id.app_id.value()); case KioskAppType::kArcApp: - return ArcAppById(arc_app_manager_.get(), app_id.account_id); + return ArcAppById(arc_app_manager_, app_id.account_id); } } std::optional<KioskApp> KioskController::GetAutoLaunchApp() const { - if (const auto& web_account_id = web_app_manager_->GetAutoLaunchAccountId(); + if (const auto& web_account_id = web_app_manager_.GetAutoLaunchAccountId(); web_account_id.is_valid()) { - return WebAppById(web_app_manager_.get(), web_account_id); - } else if (chrome_app_manager_->IsAutoLaunchEnabled()) { - std::string chrome_app_id = chrome_app_manager_->GetAutoLaunchApp(); + return WebAppById(web_app_manager_, web_account_id); + } else if (chrome_app_manager_.IsAutoLaunchEnabled()) { + std::string chrome_app_id = chrome_app_manager_.GetAutoLaunchApp(); CHECK(!chrome_app_id.empty()); - return ChromeAppById(chrome_app_manager_.get(), chrome_app_id); + return ChromeAppById(chrome_app_manager_, chrome_app_id); } else if (const auto& arc_account_id = - arc_app_manager_->GetAutoLaunchAccountId(); + arc_app_manager_.GetAutoLaunchAccountId(); arc_account_id.is_valid()) { - return ArcAppById(arc_app_manager_.get(), arc_account_id); + return ArcAppById(arc_app_manager_, arc_account_id); } return std::nullopt; }
diff --git a/chrome/browser/ash/app_mode/kiosk_controller.h b/chrome/browser/ash/app_mode/kiosk_controller.h index 0a5c65e..acd82f4 100644 --- a/chrome/browser/ash/app_mode/kiosk_controller.h +++ b/chrome/browser/ash/app_mode/kiosk_controller.h
@@ -22,9 +22,7 @@ public: static KioskController& Get(); - KioskController(WebKioskAppManager& web_app_manager, - KioskChromeAppManager& chrome_app_manager, - ArcKioskAppManager& arc_app_manager); + KioskController(); KioskController(const KioskController&) = delete; KioskController& operator=(const KioskController&) = delete; ~KioskController(); @@ -34,9 +32,9 @@ std::optional<KioskApp> GetAutoLaunchApp() const; private: - raw_ref<WebKioskAppManager> web_app_manager_; - raw_ref<KioskChromeAppManager> chrome_app_manager_; - raw_ref<ArcKioskAppManager> arc_app_manager_; + WebKioskAppManager web_app_manager_; + KioskChromeAppManager chrome_app_manager_; + ArcKioskAppManager arc_app_manager_; }; } // namespace ash
diff --git a/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index 8b4b60bd..f59c3dc6 100644 --- a/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -19,7 +19,6 @@ #include "base/containers/cxx20_erase.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" @@ -229,12 +228,8 @@ void SetActiveWindow(aura::Window* window) { active_ = window; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION aura::Window* focused_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION aura::Window* active_ = nullptr; + raw_ptr<aura::Window, DanglingUntriaged> focused_ = nullptr; + raw_ptr<aura::Window, DanglingUntriaged> active_ = nullptr; }; class ArcInputMethodManagerServiceTest : public testing::Test {
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc index f15f0e03..40e4c83d 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -52,11 +52,8 @@ #include "chrome/browser/ash/accessibility/magnification_manager.h" #include "chrome/browser/ash/app_list/search/essential_search/essential_search_manager.h" #include "chrome/browser/ash/app_mode/app_launch_utils.h" -#include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h" -#include "chrome/browser/ash/app_mode/kiosk_chrome_app_manager.h" #include "chrome/browser/ash/app_mode/kiosk_controller.h" #include "chrome/browser/ash/app_mode/kiosk_mode_idle_app_name_notification.h" -#include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h" #include "chrome/browser/ash/arc/memory_pressure/container_app_killer.h" #include "chrome/browser/ash/arc/session/arc_service_launcher.h" #include "chrome/browser/ash/audio/audio_survey_handler.h" @@ -965,13 +962,7 @@ chromeos::version_loader::VERSION_FULL), base::BindOnce(&ChromeOSVersionCallback)); - kiosk_chrome_app_manager_ = std::make_unique<KioskChromeAppManager>(); - arc_kiosk_app_manager_ = std::make_unique<ArcKioskAppManager>(); - web_kiosk_app_manager_ = std::make_unique<WebKioskAppManager>(); - kiosk_controller_ = std::make_unique<KioskController>( - CHECK_DEREF(web_kiosk_app_manager_.get()), - CHECK_DEREF(kiosk_chrome_app_manager_.get()), - CHECK_DEREF(arc_kiosk_app_manager_.get())); + kiosk_controller_ = std::make_unique<KioskController>(); if (base::FeatureList::IsEnabled(features::kEnableHostnameSetting)) { DeviceNameStore::Initialize(g_browser_process->local_state(), @@ -1622,12 +1613,10 @@ // subsystems. g_browser_process->platform_part()->ShutdownAutomaticRebootManager(); - // Clean before the Kiosk web, Chrome app, and ARC app managers. + // Dependens on Profile, so needs to be destroyed before ProfileManager, which + // happens in `ChromeBrowserMainPartsLinux::PostMainMessageLoopRun()` below. kiosk_controller_.reset(); - // Clean up dependency on CrosSettings and stop pending data fetches. - kiosk_chrome_app_manager_.reset(); - // Make sure that there is no pending URLRequests. if (pre_profile_init_called_) { UserSessionManager::GetInstance()->Shutdown(); @@ -1676,7 +1665,7 @@ // LacrosAvailabilityPolicyObserver and // LacrosDataBackwardMigrationModePolicyObserver have the dependency to // ProfileManager, so they need to be destroyed before ProfileManager - // destruction, which happens inside PostMainMessageLoop below. + // destruction, which happens inside PostMainMessageLoopRun below. lacros_availability_policy_observer_.reset(); lacros_data_backward_migration_mode_policy_observer_.reset(); @@ -1686,11 +1675,6 @@ vc_app_service_client_.reset(); vc_ash_feature_client_.reset(); - // Has a dependency on Profile, so it needs to be destroyed before Profile - // gets destroyed during ProfileManager destruction, which happens inside - // PostMainMessageLoop below. - web_kiosk_app_manager_.reset(); - // NOTE: Closes ash and destroys `Shell`. ChromeBrowserMainPartsLinux::PostMainMessageLoopRun(); @@ -1707,8 +1691,6 @@ // because crosapi depends on it. g_browser_process->platform_part()->ShutdownAshProxyMonitor(); - // Destroy classes that may have ash observers or dependencies. - arc_kiosk_app_manager_.reset(); chrome_keyboard_controller_client_.reset(); // All ARC related modules should have been shut down by this point, so
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.h b/chrome/browser/ash/chrome_browser_main_parts_ash.h index 1b0be40..0dabe7a 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.h +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.h
@@ -11,7 +11,6 @@ #include "base/functional/callback_helpers.h" #include "base/memory/weak_ptr.h" #include "base/task/cancelable_task_tracker.h" -#include "chrome/browser/ash/app_mode/kiosk_controller.h" #include "chrome/browser/ash/external_metrics.h" #include "chrome/browser/ash/pcie_peripheral/ash_usb_detector.h" #include "chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_manager.h" @@ -63,7 +62,6 @@ class AccessibilityEventRewriterDelegateImpl; class ApnMigrator; -class ArcKioskAppManager; class AudioSurveyHandler; class BluetoothPrefStateObserver; class BulkPrintersCalculatorFactory; @@ -78,6 +76,7 @@ class GnubbyNotification; class HatsBluetoothRevampTriggerImpl; class IdleActionWarningObserver; +class KioskController; class LoginScreenExtensionsStorageCleaner; class LowDiskNotification; class AuthEventsRecorder; @@ -97,8 +96,6 @@ class SystemTokenCertDBInitializer; class VideoConferenceAppServiceClient; class VideoConferenceAshFeatureClient; -class WebKioskAppManager; -class KioskChromeAppManager; namespace carrier_lock { class CarrierLockManager; @@ -218,9 +215,6 @@ std::unique_ptr<AssistantBrowserDelegateImpl> assistant_delegate_; std::unique_ptr<LowDiskNotification> low_disk_notification_; - std::unique_ptr<ArcKioskAppManager> arc_kiosk_app_manager_; - std::unique_ptr<WebKioskAppManager> web_kiosk_app_manager_; - std::unique_ptr<KioskChromeAppManager> kiosk_chrome_app_manager_; std::unique_ptr<KioskController> kiosk_controller_; std::unique_ptr<MultiCaptureNotifications> multi_capture_notifications_;
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc index 7f18525..a9e9c16 100644 --- a/chrome/browser/ash/crosapi/browser_manager.cc +++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -1107,7 +1107,7 @@ void BrowserManager::PerformAction(std::unique_ptr<BrowserAction> action) { BrowserAction* action_raw = action.get(); // We're `move`ing action below. action_raw->Perform( - {browser_service_.value().service, + {browser_service_.value().service.get(), browser_service_.value().interface_version}, base::BindOnce(&BrowserManager::OnActionPerformed, weak_factory_.GetWeakPtr(), std::move(action)));
diff --git a/chrome/browser/ash/crosapi/browser_manager.h b/chrome/browser/ash/crosapi/browser_manager.h index b00022ab..0a19c8e 100644 --- a/chrome/browser/ash/crosapi/browser_manager.h +++ b/chrome/browser/ash/crosapi/browser_manager.h
@@ -15,7 +15,6 @@ #include "base/functional/callback.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" @@ -458,9 +457,7 @@ // ID managed in BrowserServiceHostAsh, which is tied to the |service|. mojo::RemoteSetElementId mojo_id; // BrowserService proxy connected to lacros-chrome. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION mojom::BrowserService* service; + raw_ptr<mojom::BrowserService, DanglingUntriaged> service; // Supported interface version of the BrowserService in Lacros-chrome. uint32_t interface_version; };
diff --git a/chrome/browser/ash/crosapi/prefs_ash.h b/chrome/browser/ash/crosapi/prefs_ash.h index be24e2cc..8925c73 100644 --- a/chrome/browser/ash/crosapi/prefs_ash.h +++ b/chrome/browser/ash/crosapi/prefs_ash.h
@@ -14,7 +14,6 @@ #include "base/callback_list.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/scoped_observation.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -84,12 +83,8 @@ }; struct State { - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION PrefService* pref_service; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION PrefChangeRegistrar* registrar; + raw_ptr<PrefService, DanglingUntriaged> pref_service; + raw_ptr<PrefChangeRegistrar> registrar; AshPrefSource pref_source; std::string path; };
diff --git a/chrome/browser/ash/input_method/pref_change_recorder.h b/chrome/browser/ash/input_method/pref_change_recorder.h index e8461760..f9fea2e 100644 --- a/chrome/browser/ash/input_method/pref_change_recorder.h +++ b/chrome/browser/ash/input_method/pref_change_recorder.h
@@ -9,7 +9,7 @@ #include <utility> #include "base/containers/flat_map.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/ash/input_method/autocorrect_enums.h" #include "chrome/browser/ash/input_method/input_method_options_observer.h" @@ -53,9 +53,7 @@ AutocorrectPrefs autocorrect_prefs_; // PrefService* must outlive the lifetime of this instance. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION PrefService* pref_service_; + raw_ptr<PrefService> pref_service_; base::WeakPtrFactory<PrefChangeRecorder> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc b/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc index d8bf977c..f85f433 100644 --- a/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc +++ b/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc
@@ -133,22 +133,6 @@ raw_ptr<ash::NetworkUiController::NetworkMonitor::Observer> observer_; base::WeakPtrFactory<FakeNetworkMonitor> weak_ptr_factory_{this}; }; - -// Helper class to own `KioskController` and the Kiosk managers it depends on. -class KioskControllerHolder { - public: - KioskControllerHolder() - : kiosk_controller(web_kiosk_app_manager_, - chrome_app_manager_, - arc_kiosk_app_manager_) {} - ~KioskControllerHolder() = default; - - WebKioskAppManager web_kiosk_app_manager_; - KioskChromeAppManager chrome_app_manager_; - ArcKioskAppManager arc_kiosk_app_manager_; - KioskController kiosk_controller; -}; - } // namespace using NetworkUIState = NetworkUiController::NetworkUIState; @@ -221,7 +205,7 @@ void TearDown() override { extensions::ExtensionServiceTestBase::TearDown(); - kiosk_controller_holder_.reset(); + kiosk_controller_.reset(); policy::BrowserPolicyConnectorBase::SetPolicyServiceForTesting(nullptr); } @@ -304,7 +288,7 @@ AccountId account_id(AccountId::FromUserEmail(email)); kiosk_app_id_ = KioskAppId::ForWebApp(account_id); - kiosk_controller_holder_ = std::make_unique<KioskControllerHolder>(); + kiosk_controller_ = std::make_unique<KioskController>(); WebKioskAppManager::Get()->AddAppForTesting(kiosk_app_id_.account_id, GURL(kInstallUrl)); } @@ -323,7 +307,7 @@ session_manager::SessionManager session_manager_; std::unique_ptr<ChromeKeyboardControllerClientTestHelper> keyboard_controller_client_; - std::unique_ptr<KioskControllerHolder> kiosk_controller_holder_; + std::unique_ptr<KioskController> kiosk_controller_; std::unique_ptr<base::AutoReset<std::optional<bool>>> can_configure_network_for_testing_; @@ -948,7 +932,7 @@ } void SetUpKioskAppInAppManager() { - kiosk_controller_holder_ = std::make_unique<KioskControllerHolder>(); + kiosk_controller_ = std::make_unique<KioskController>(); WebKioskAppManager::Get()->AddAppForTesting(kiosk_app_id_.account_id, GURL(kInstallUrl)); } @@ -977,7 +961,7 @@ std::unique_ptr<ChromeKeyboardControllerClientTestHelper> keyboard_controller_client_; - std::unique_ptr<KioskControllerHolder> kiosk_controller_holder_; + std::unique_ptr<KioskController> kiosk_controller_; std::unique_ptr<base::AutoReset<std::optional<bool>>> can_configure_network_for_testing_;
diff --git a/chrome/browser/ash/login/login_browsertest.cc b/chrome/browser/ash/login/login_browsertest.cc index e5acbcf3..837491f 100644 --- a/chrome/browser/ash/login/login_browsertest.cc +++ b/chrome/browser/ash/login/login_browsertest.cc
@@ -135,7 +135,8 @@ EXPECT_TRUE(LoginScreenTestApi::IsOobeDialogVisible()); FakeUserDataAuthClient::Get()->SetNextOperationError( FakeUserDataAuthClient::Operation::kStartAuthSession, - user_data_auth::CRYPTOHOME_ERROR_MOUNT_FATAL); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_MOUNT_FATAL)); LoginDisplayHost::default_host() ->GetOobeUI() @@ -153,7 +154,8 @@ EXPECT_FALSE(LoginScreenTestApi::IsOobeDialogVisible()); FakeUserDataAuthClient::Get()->SetNextOperationError( FakeUserDataAuthClient::Operation::kAuthenticateAuthFactor, - user_data_auth::CRYPTOHOME_ERROR_TPM_UPDATE_REQUIRED); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_TPM_UPDATE_REQUIRED)); LoginScreenTestApi::SubmitPassword(test_account_id_, "password", /*check_if_submittable=*/false); OobeScreenWaiter(SignInFatalErrorView::kScreenId).Wait(); @@ -164,7 +166,8 @@ EXPECT_FALSE(LoginScreenTestApi::IsOobeDialogVisible()); FakeUserDataAuthClient::Get()->SetNextOperationError( FakeUserDataAuthClient::Operation::kAuthenticateAuthFactor, - user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED)); LoginScreenTestApi::SubmitPassword(test_account_id_, "password", /*check_if_submittable=*/false); // Inserted RunUntilIdle here to give maximum chances for the dialog to show
diff --git a/chrome/browser/ash/login/quick_unlock/pin_backend.cc b/chrome/browser/ash/login/quick_unlock/pin_backend.cc index db0b808..b4072c9 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_backend.cc +++ b/chrome/browser/ash/login/quick_unlock/pin_backend.cc
@@ -55,7 +55,7 @@ bool success) { std::optional<AuthenticationError> error = std::nullopt; if (!success) { - error = AuthenticationError{AuthFailure::UNLOCK_FAILED}; + error = std::make_optional<AuthenticationError>(AuthFailure::UNLOCK_FAILED); } base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(result), std::move(user_context),
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc b/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc index 42cfbe6..3afb7b67 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter_browsertest.cc
@@ -529,7 +529,8 @@ UserDataAuthClient::InitializeFake(); FakeUserDataAuthClient::Get()->SetNextOperationError( FakeUserDataAuthClient::Operation::kStartAuthSession, - user_data_auth::CRYPTOHOME_ERROR_MOUNT_FATAL); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_MOUNT_FATAL)); } };
diff --git a/chrome/browser/ash/login/screens/osauth/enter_old_password_screen.cc b/chrome/browser/ash/login/screens/osauth/enter_old_password_screen.cc index 339f644..611dddc 100644 --- a/chrome/browser/ash/login/screens/osauth/enter_old_password_screen.cc +++ b/chrome/browser/ash/login/screens/osauth/enter_old_password_screen.cc
@@ -89,7 +89,7 @@ if (error.has_value()) { context()->user_context = std::move(user_context); if (cryptohome::ErrorMatches( - error->get_cryptohome_code(), + error->get_cryptohome_error(), user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED)) { view_->ShowWrongPasswordError(); return;
diff --git a/chrome/browser/ash/login/screens/osauth/gaia_password_changed_screen.cc b/chrome/browser/ash/login/screens/osauth/gaia_password_changed_screen.cc index 750cbf6..c5f53ff2 100644 --- a/chrome/browser/ash/login/screens/osauth/gaia_password_changed_screen.cc +++ b/chrome/browser/ash/login/screens/osauth/gaia_password_changed_screen.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/ash/profiles/signin_profile_handler.h" #include "chrome/browser/ui/webui/ash/login/gaia_password_changed_screen_handler.h" #include "chromeos/ash/components/cryptohome/auth_factor.h" +#include "chromeos/ash/components/cryptohome/error_util.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" #include "chromeos/ash/components/login/auth/auth_factor_editor.h" #include "chromeos/ash/components/login/auth/auth_performer.h" @@ -134,8 +135,9 @@ std::optional<AuthenticationError> error) { context()->user_context = std::move(user_context); if (error.has_value()) { - if (error->get_cryptohome_code() == - user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED) { + if (cryptohome::ErrorMatches( + error->get_cryptohome_error(), + user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED)) { RecordScreenAction(UserAction::kIncorrectOldPassword); view_->ShowWrongPasswordError(); return;
diff --git a/chrome/browser/ash/login/screens/osauth/local_data_loss_warning_screen.cc b/chrome/browser/ash/login/screens/osauth/local_data_loss_warning_screen.cc index b486603..4909110 100644 --- a/chrome/browser/ash/login/screens/osauth/local_data_loss_warning_screen.cc +++ b/chrome/browser/ash/login/screens/osauth/local_data_loss_warning_screen.cc
@@ -79,7 +79,7 @@ weak_factory_.GetWeakPtr())); return; } else if (action_id == kUserActionPowerwash) { - if (isOwner(context()->user_context->GetAccountId())) { + if (!isOwner(context()->user_context->GetAccountId())) { LOG(ERROR) << "Non owner user requesting powerwash, ignoring"; return; }
diff --git a/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl.cc b/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl.cc index f519a1b..025de92 100644 --- a/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl.cc +++ b/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl.cc
@@ -34,6 +34,10 @@ constexpr char kDeviceAssetIdPlaceholder[] = "${DEVICE_ASSET_ID}"; constexpr char kDeviceAnnotatedLocationPlaceholder[] = "${DEVICE_ANNOTATED_LOCATION}"; +// Used as a replacement value for device identifiers when the user is +// unaffiliated. +constexpr char kDeviceNotManaged[] = "VALUE_NOT_AVAILABLE"; + constexpr char kFixedSaltForExperiment[] = "salt for experiment"; // Part before "@" of the given |email| address. @@ -58,25 +62,35 @@ return email.substr(at_sign_pos + 1); } -// If a salt is given we replace the input by hash(salt + input). Otherwise we -// return the input as if it was a variable placeholder. -std::string FormatVariable(const std::string& input, const std::string& salt) { - if (salt.empty()) +// If `hash_variable` is true, the output is the hex encoded result of the +// hashed `salt` + `input` value. Otherwise we return the input between +// placeholder delimiters. +std::string FormatVariable(const std::string& input, + const std::string& salt, + bool hash_variable) { + if (!hash_variable) { return "${" + input + "}"; - + } std::string hash = crypto::SHA256HashString(salt + input); return base::HexEncode(hash.c_str(), hash.size()); } -// Replace any occurrence of the variables above. -// If a non-empty salt is given, use hash(salt + value). Otherwise use -// "${value}" which is useful for displaying the resolved values on the UI. If -// the DeviceAttributes or the user cannot be obtained do not replace anything -// but return an empty string. In this case the calling code should use the -// template string without identifiers. +// Returns a copy of `template` where the identifier placeholders are replaced +// with real user and device data. +// If `hash_variable` is true, then the user and device identifiers are hashed +// with `salt` and hex encoded. The salt is optional and can be an empty string. +// If `hash_variable` is false, the output is a +// user-friendly version of the effective DNS URI template. This value is used +// to inform the user of identifiers which are shared with the DoH server when +// sending a DNS resolution request. +// Only affiliated users can share device identifiers. If the user is not +// affiliated, the device identifier placeholder will be replaced by +// `kDeviceNotManaged`; e.g for `hash_variable`=true +// ${DEVICE_ASSET_ID} is replaced by hash(VALUE_NOT_AVAILABLE+salt). std::string ReplaceVariables(std::string templates, const std::string salt, - policy::DeviceAttributes* attributes) { + policy::DeviceAttributes* attributes, + bool hash_variable) { if (!user_manager::UserManager::IsInitialized()) { return std::string(); } @@ -89,31 +103,44 @@ std::string user_email = user->GetAccountId().GetUserEmail(); std::string user_email_domain = EmailDomain(user_email); std::string user_email_name = EmailName(user_email); - base::ReplaceSubstringsAfterOffset(&templates, 0, kUserEmailPlaceholder, - FormatVariable(user_email, salt)); - base::ReplaceSubstringsAfterOffset(&templates, 0, kUserEmailDomainPlaceholder, - FormatVariable(user_email_domain, salt)); - base::ReplaceSubstringsAfterOffset(&templates, 0, kUserEmailNamePlaceholder, - FormatVariable(user_email_name, salt)); + base::ReplaceSubstringsAfterOffset( + &templates, 0, kUserEmailPlaceholder, + FormatVariable(user_email, salt, hash_variable)); + base::ReplaceSubstringsAfterOffset( + &templates, 0, kUserEmailDomainPlaceholder, + FormatVariable(user_email_domain, salt, hash_variable)); + base::ReplaceSubstringsAfterOffset( + &templates, 0, kUserEmailNamePlaceholder, + FormatVariable(user_email_name, salt, hash_variable)); - if (!user->IsAffiliated()) { + std::string device_directory_id = kDeviceNotManaged; + std::string device_asset_id = kDeviceNotManaged; + std::string device_serial_number = kDeviceNotManaged; + std::string device_annotated_location = kDeviceNotManaged; + + if (user->IsAffiliated() && attributes) { + device_directory_id = attributes->GetDirectoryApiID(); + device_asset_id = attributes->GetDeviceAssetID(); + device_serial_number = attributes->GetDeviceSerialNumber(); + device_annotated_location = attributes->GetDeviceAnnotatedLocation(); + } else { + // Device identifiers are only replaced for affiliated users. LOG(WARNING) << "Skiping device variables replacement for unaffiliated user"; - return templates; } base::ReplaceSubstringsAfterOffset( &templates, 0, kDeviceDirectoryIdPlaceholder, - FormatVariable(attributes->GetDirectoryApiID(), salt)); + FormatVariable(device_directory_id, salt, hash_variable)); base::ReplaceSubstringsAfterOffset( &templates, 0, kDeviceAssetIdPlaceholder, - FormatVariable(attributes->GetDeviceAssetID(), salt)); + FormatVariable(device_asset_id, salt, hash_variable)); base::ReplaceSubstringsAfterOffset( &templates, 0, kDeviceSerialNumberPlaceholder, - FormatVariable(attributes->GetDeviceSerialNumber(), salt)); + FormatVariable(device_serial_number, salt, hash_variable)); base::ReplaceSubstringsAfterOffset( &templates, 0, kDeviceAnnotatedLocationPlaceholder, - FormatVariable(attributes->GetDeviceAnnotatedLocation(), salt)); + FormatVariable(device_annotated_location, salt, hash_variable)); return templates; } @@ -170,9 +197,11 @@ } std::string effective_templates = - ReplaceVariables(templates_with_identifiers, salt, attributes_.get()); + ReplaceVariables(templates_with_identifiers, salt, attributes_.get(), + /*hash_variable=*/true); std::string display_templates = - ReplaceVariables(templates_with_identifiers, "", attributes_.get()); + ReplaceVariables(templates_with_identifiers, "", attributes_.get(), + /*hash_variable=*/false); if (effective_templates.empty() || display_templates.empty()) return; // We only use this if the variable substitution was successful for both
diff --git a/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc b/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc index 633f4c0..f8c8436a 100644 --- a/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc +++ b/chrome/browser/ash/net/dns_over_https/templates_uri_resolver_impl_unittest.cc
@@ -48,10 +48,21 @@ "dns-query{?dns}"; constexpr char kDisplayTemplateIdentifiersUnaffiliated[] = "https://dns.google.alternativeuri/" - "${test-user@testdomain.com}-${testdomain.com}-${test-user}-${DEVICE_" - "DIRECTORY_ID}-${DEVICE_ASSET_ID}-${" - "DEVICE_SERIAL_NUMBER}-${DEVICE_ANNOTATED_LOCATION}/" + "${test-user@testdomain.com}-${testdomain.com}-${test-user}-${VALUE_NOT_" + "AVAILABLE}-${VALUE_NOT_AVAILABLE}-${VALUE_NOT_AVAILABLE}-${VALUE_NOT_" + "AVAILABLE}/dns-query{?dns}"; + +constexpr char kEffectiveTemplateIdentifiersUnaffiliated[] = + "https://dns.google.alternativeuri/" + "EAE2DCB2164EB64B695BC555C4EC45D01C8F0DF73CCD3321E45E5B49F22A22DF-" + "0641BDB5149AF8B202F8EC96D8C256774CDFE9456CB12663DDF5897AFD91BC78-" + "F3BA0BDE2D6E8DBE626D0B9ECF7862B18256C4D1807621F9F01AF06A3F603137-" + "9AB270C9961EBBDF728F43396B0A25A1F198EA5F1F31719758C64E78839B928B-" + "9AB270C9961EBBDF728F43396B0A25A1F198EA5F1F31719758C64E78839B928B-" + "9AB270C9961EBBDF728F43396B0A25A1F198EA5F1F31719758C64E78839B928B-" + "9AB270C9961EBBDF728F43396B0A25A1F198EA5F1F31719758C64E78839B928B/" "dns-query{?dns}"; + constexpr char kEffectiveTemplateIdentifiers[] = "https://dns.google.alternativeuri/" "EAE2DCB2164EB64B695BC555C4EC45D01C8F0DF73CCD3321E45E5B49F22A22DF-" @@ -72,6 +83,16 @@ "F8F33F2554E3E2223391375D12FC6CC8744CE1EBD02F4E73941FEB66FFC3A4CE-" "752F92CB761746F2ACE4DB56D7CCD332E2737A2921B154E280E528532CDA3E1B/" "dns-query{?dns}"; +constexpr char kEffectiveTemplateIdentifiersNoSalt[] = + "https://dns.google.alternativeuri/" + "B07D2C5D119EB1881671C3B8D84CBE4FE3595C0C9ECBBF7670B18DDFDA072F66-" + "E5E8A65918F11869E27483F8FB2014EF91D3E3C27DE3959FFFF365E59A8D3A4F-" + "F85AC825D102B9F2D546AA1679EA991AE845994C1343730D564F3FCD0A2168C3-" + "519F1980774A18DFCFC2003B4DC27E3497BF9B586E5901D7F2F6EDD1845613A9-" + "505CBC62B85263246EE6FC89264D4039E5B55FD353885EC86C2DAF5CAA05399E-" + "87278CD685B7191BB97AA713083522D99DBA30FD6F1DEC3C898E8745FB97E3E3-" + "9CBE0CF3CA986C6BD8241B5A7030FBB807B7340AEFE0C53541B54545A888B551/" + "dns-query{?dns}"; constexpr char kTestDeviceDirectoryId[] = "85729104-ef7a-5718d62e72ca"; constexpr char kTestDeviceAssetId[] = "admin-provided-test-asset-ID"; @@ -183,6 +204,8 @@ EXPECT_EQ(doh_template_uri_resolver_->GetDisplayTemplates(), kDisplayTemplateIdentifiersUnaffiliated); + EXPECT_EQ(doh_template_uri_resolver_->GetEffectiveTemplates(), + kEffectiveTemplateIdentifiersUnaffiliated); EXPECT_TRUE(doh_template_uri_resolver_->GetDohWithIdentifiersActive()); } @@ -261,7 +284,7 @@ EXPECT_EQ(doh_template_uri_resolver_->GetDisplayTemplates(), kDisplayTemplateIdentifiers); EXPECT_EQ(doh_template_uri_resolver_->GetEffectiveTemplates(), - kDisplayTemplateIdentifiers); + kEffectiveTemplateIdentifiersNoSalt); EXPECT_TRUE(doh_template_uri_resolver_->GetDohWithIdentifiersActive()); // `prefs::kDnsOverHttpsTemplates` should apply when
diff --git a/chrome/browser/ash/phonehub/attestation_certificate_generator_impl_unittest.cc b/chrome/browser/ash/phonehub/attestation_certificate_generator_impl_unittest.cc index a06930c..ed01962 100644 --- a/chrome/browser/ash/phonehub/attestation_certificate_generator_impl_unittest.cc +++ b/chrome/browser/ash/phonehub/attestation_certificate_generator_impl_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/time/time.h" #include "chrome/browser/ash/attestation/fake_soft_bind_attestation_flow.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" @@ -74,9 +73,7 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION MockCryptAuthKeyRegistry* instance_ = nullptr; + raw_ptr<MockCryptAuthKeyRegistry> instance_ = nullptr; }; class AttestationCertificateGeneratorImplTest
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc index 0be291b..4f6910a 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc
@@ -268,8 +268,6 @@ TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr); reporting_test_enviroment_.reset(); - // Let `reporting_test_enviroment_` shut down. - base::RunLoop().RunUntilIdle(); DeviceSettingsTestBase::TearDown(); }
diff --git a/chrome/browser/ash/policy/dlp/test/dlp_files_test_with_mounts.cc b/chrome/browser/ash/policy/dlp/test/dlp_files_test_with_mounts.cc index a8f8beb..526d231a 100644 --- a/chrome/browser/ash/policy/dlp/test/dlp_files_test_with_mounts.cc +++ b/chrome/browser/ash/policy/dlp/test/dlp_files_test_with_mounts.cc
@@ -143,8 +143,6 @@ reporting_manager_.reset(); reporting_test_enviroment_.reset(); - // Let `reporting_test_enviroment_` shut down. - task_environment_->RunUntilIdle(); if (chromeos::DlpClient::Get()) { chromeos::DlpClient::Shutdown();
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_fetch_support_packet_job_browsertest.cc b/chrome/browser/ash/policy/remote_commands/device_command_fetch_support_packet_job_browsertest.cc index a79116d..6bb975e7 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_fetch_support_packet_job_browsertest.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_fetch_support_packet_job_browsertest.cc
@@ -12,7 +12,6 @@ #include "base/json/json_writer.h" #include "base/memory/scoped_refptr.h" #include "base/notreached.h" -#include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/test_future.h" #include "base/test/values_test_util.h" @@ -98,8 +97,6 @@ reporting_test_enviroment_.reset(); reporting_test_storage_.reset(); - // Let `reporting_test_enviroment_` shut down. - base::RunLoop().RunUntilIdle(); } void SetUpInProcessBrowserTestFixture() override {
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_events_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_events_unittest.cc index ffc502d..3ec4590 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_events_unittest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_events_unittest.cc
@@ -173,8 +173,6 @@ ::ash::LoginState::Shutdown(); reporting_test_enviroment_.reset(); - // Let `reporting_test_enviroment_` shut down. - task_environment_.RunUntilIdle(); } void EnableDeviceNetworkStatusPolicy() {
diff --git a/chrome/browser/ash/secure_channel/nearby_connector_impl_unittest.cc b/chrome/browser/ash/secure_channel/nearby_connector_impl_unittest.cc index ca1a036..a4ca00c5 100644 --- a/chrome/browser/ash/secure_channel/nearby_connector_impl_unittest.cc +++ b/chrome/browser/ash/secure_channel/nearby_connector_impl_unittest.cc
@@ -8,7 +8,7 @@ #include <vector> #include "base/containers/flat_map.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/task_environment.h" @@ -79,9 +79,8 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeNearbyConnectionBroker* last_created_ = nullptr; + raw_ptr<FakeNearbyConnectionBroker, DanglingUntriaged> last_created_ = + nullptr; }; class FakeMessageReceiver : public mojom::NearbyMessageReceiver {
diff --git a/chrome/browser/ash/sync/synced_session_client_ash_unittest.cc b/chrome/browser/ash/sync/synced_session_client_ash_unittest.cc index 530e2c3..001682b0 100644 --- a/chrome/browser/ash/sync/synced_session_client_ash_unittest.cc +++ b/chrome/browser/ash/sync/synced_session_client_ash_unittest.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ash/sync/synced_session_client_ash.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" @@ -104,9 +104,7 @@ private: mojo::Receiver<crosapi::mojom::SyncedSessionClientFaviconDelegate> receiver_{ this}; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION gfx::ImageSkia* result_image_ = nullptr; + raw_ptr<gfx::ImageSkia> result_image_ = nullptr; }; gfx::ImageSkia GetTestImage() {
diff --git a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc index 8b578689..a698ae9 100644 --- a/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc +++ b/chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc
@@ -12,7 +12,6 @@ #include "base/functional/callback.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/shared_memory_mapping.h" #include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" @@ -204,9 +203,7 @@ base::SingleThreadTaskRunner::GetCurrentDefault(); // Unowned. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION Client* client_ = nullptr; + raw_ptr<Client> client_ = nullptr; // Whether a message has already been received from the extension. bool message_from_extension_received_ = false;
diff --git a/chrome/browser/autofill/BUILD.gn b/chrome/browser/autofill/BUILD.gn index a44c8274..4cff643d 100644 --- a/chrome/browser/autofill/BUILD.gn +++ b/chrome/browser/autofill/BUILD.gn
@@ -129,6 +129,8 @@ sources = [ "autofill_uitest_util.cc", "autofill_uitest_util.h", + "mock_autofill_agent.cc", + "mock_autofill_agent.h", "mock_autofill_popup_controller.cc", "mock_autofill_popup_controller.h", "mock_manual_filling_controller.cc", @@ -139,6 +141,7 @@ "//chrome/browser/autofill:autofill", "//chrome/browser/profiles:profile", "//components/autofill/content/browser:browser", + "//components/autofill/content/common/mojom", "//components/autofill/core/browser:test_support", "//content/test:test_support", "//testing/gmock",
diff --git a/chrome/browser/autofill/mock_autofill_agent.cc b/chrome/browser/autofill/mock_autofill_agent.cc new file mode 100644 index 0000000..afe0878 --- /dev/null +++ b/chrome/browser/autofill/mock_autofill_agent.cc
@@ -0,0 +1,30 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/autofill/mock_autofill_agent.h" + +#include "content/public/browser/render_frame_host.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" + +namespace autofill { + +MockAutofillAgent::MockAutofillAgent() = default; +MockAutofillAgent::~MockAutofillAgent() = default; + +void MockAutofillAgent::BindForTesting(content::RenderFrameHost* rfh) { + blink::AssociatedInterfaceProvider* remote_interfaces = + rfh->GetRemoteAssociatedInterfaces(); + remote_interfaces->OverrideBinderForTesting( + mojom::AutofillAgent::Name_, + base::BindRepeating(&MockAutofillAgent::BindPendingReceiver, + weak_ptr_factory_.GetWeakPtr())); +} + +void MockAutofillAgent::BindPendingReceiver( + mojo::ScopedInterfaceEndpointHandle handle) { + receivers_.Add(this, mojo::PendingAssociatedReceiver<mojom::AutofillAgent>( + std::move(handle))); +} + +} // namespace autofill
diff --git a/chrome/browser/autofill/mock_autofill_agent.h b/chrome/browser/autofill/mock_autofill_agent.h new file mode 100644 index 0000000..aa385c0 --- /dev/null +++ b/chrome/browser/autofill/mock_autofill_agent.h
@@ -0,0 +1,99 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_AUTOFILL_MOCK_AUTOFILL_AGENT_H_ +#define CHROME_BROWSER_AUTOFILL_MOCK_AUTOFILL_AGENT_H_ + +#include "base/memory/weak_ptr.h" +#include "components/autofill/content/common/mojom/autofill_agent.mojom.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace content { +class RenderFrameHost; +} + +namespace autofill { + +class MockAutofillAgent : public mojom::AutofillAgent { + public: + MockAutofillAgent(); + MockAutofillAgent(const MockAutofillAgent&) = delete; + MockAutofillAgent& operator=(const MockAutofillAgent&) = delete; + ~MockAutofillAgent() override; + + void BindForTesting(content::RenderFrameHost* rfh); + void BindPendingReceiver(mojo::ScopedInterfaceEndpointHandle handle); + + MOCK_METHOD(void, TriggerFormExtraction, (), (override)); + MOCK_METHOD(void, + TriggerFormExtractionWithResponse, + (base::OnceCallback<void(bool)>), + (override)); + MOCK_METHOD( + void, + ExtractForm, + (FormRendererId form, + base::OnceCallback<void(const std::optional<FormData>&)> callback), + (override)); + MOCK_METHOD(void, + ApplyFormAction, + (mojom::ActionType action_type, + mojom::ActionPersistence action_persistence, + const FormData::FillData& form), + (override)); + MOCK_METHOD(void, + ApplyFieldAction, + (mojom::ActionPersistence action_persistence, + mojom::TextReplacement text_replacement, + FieldRendererId field, + const std::u16string& value), + (override)); + MOCK_METHOD(void, + FieldTypePredictionsAvailable, + (const std::vector<FormDataPredictions>& forms), + (override)); + MOCK_METHOD(void, ClearSection, (), (override)); + MOCK_METHOD(void, ClearPreviewedForm, (), (override)); + MOCK_METHOD(void, + TriggerSuggestions, + (FieldRendererId field_id, + AutofillSuggestionTriggerSource trigger_source), + (override)); + MOCK_METHOD(void, + SetSuggestionAvailability, + (FieldRendererId field, + mojom::AutofillSuggestionAvailability suggestion_availability), + (override)); + MOCK_METHOD(void, + AcceptDataListSuggestion, + (FieldRendererId field, const ::std::u16string& value), + (override)); + MOCK_METHOD(void, + PreviewPasswordSuggestion, + (const ::std::u16string& username, + const ::std::u16string& password), + (override)); + MOCK_METHOD(void, + PreviewPasswordGenerationSuggestion, + (const ::std::u16string& password), + (override)); + MOCK_METHOD(void, SetUserGestureRequired, (bool required), (override)); + MOCK_METHOD(void, SetSecureContextRequired, (bool required), (override)); + MOCK_METHOD(void, SetFocusRequiresScroll, (bool require), (override)); + MOCK_METHOD(void, SetQueryPasswordSuggestion, (bool query), (override)); + MOCK_METHOD(void, EnableHeavyFormDataScraping, (), (override)); + MOCK_METHOD(void, + GetPotentialLastFourCombinationsForStandaloneCvc, + (base::OnceCallback<void(const std::vector<std::string>&)>), + (override)); + + private: + mojo::AssociatedReceiverSet<mojom::AutofillAgent> receivers_; + base::WeakPtrFactory<MockAutofillAgent> weak_ptr_factory_{this}; +}; + +} // namespace autofill + +#endif // CHROME_BROWSER_AUTOFILL_MOCK_AUTOFILL_AGENT_H_
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc index fc13440..f4fe7bf 100644 --- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc +++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -268,25 +268,6 @@ << GetCookiesTreeModelInfo(cookies_tree_model->GetRoot()); } - // This method is used to decide which entry count to expect depending on - // whether `kThirdPartyStoragePartitioning` or `kMigrateStorageToBDM` are - // enabled or disabled. - inline void ExpectTotalModelCount(int expectedAllDisabled, - int expectedAnyEnabled) { - // TODO(crbug.com/1307796): Use a different approach to determine presence - // of data that does not depend on UI code and has a better resolution when - // 3PSP is fully enabled. Also, remove helper duplication between the - // incognito, and remover, browsing data browser tests. - if (!base::FeatureList::IsEnabled( - net::features::kThirdPartyStoragePartitioning) && - !base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - ExpectTotalModelCount(expectedAllDisabled); - } else { - ExpectTotalModelCount(expectedAnyEnabled); - } - } - void OnVideoDecodePerfInfo(base::RunLoop* run_loop, bool* out_is_smooth, bool* out_is_power_efficient, @@ -1305,7 +1286,7 @@ SetDataForType(kMediaLicenseType); EXPECT_EQ(1, GetSiteDataCount()); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); EXPECT_TRUE(HasDataForType(kMediaLicenseType)); // Try to remove the Media Licenses using a time frame up until an hour ago, @@ -1313,7 +1294,7 @@ RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA, delete_begin, TimeEnum::kLastHour); EXPECT_EQ(1, GetSiteDataCount()); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); EXPECT_TRUE(HasDataForType(kMediaLicenseType)); // Now try with a time range that includes the current time, which should @@ -1343,7 +1324,7 @@ SetDataForType(kMediaLicenseType); EXPECT_EQ(1, GetSiteDataCount()); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); EXPECT_TRUE(HasDataForType(kMediaLicenseType)); } @@ -1381,7 +1362,7 @@ EXPECT_FALSE(HasDataForType(kMediaLicenseType)); SetDataForType(kMediaLicenseType); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); EXPECT_TRUE(HasDataForType(kMediaLicenseType)); // As Clear Browsing Data typically deletes recent data (e.g. last hour, @@ -1390,10 +1371,8 @@ // media license, and leave the one created by the PRE_ test. RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA, TimeEnum::kStart); - // TODO(crbug.com/1307796): Fix GetCookiesTreeModelCount() to include quota - // nodes. `count` should be 1 here. EXPECT_EQ(1, GetSiteDataCount()); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); EXPECT_FALSE(HasDataForType(kMediaLicenseType)); // Now try with a time range that includes all time, which should @@ -1423,7 +1402,7 @@ SetDataForType(kMediaLicenseType); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); EXPECT_TRUE(HasDataForType(kMediaLicenseType)); // Try to remove the Media Licenses using a deletelist that doesn't include @@ -1436,7 +1415,7 @@ RemoveWithFilterAndWait( content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, std::move(filter_builder)); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); // Now try with a preservelist that includes the current URL. Media License // should not be deleted. @@ -1446,7 +1425,7 @@ RemoveWithFilterAndWait( content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, std::move(filter_builder)); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); // Now try with a deletelist that includes the current URL. Media License // should be deleted this time. @@ -1456,7 +1435,7 @@ RemoveWithFilterAndWait( content::BrowsingDataRemover::DATA_TYPE_MEDIA_LICENSES, std::move(filter_builder)); - ExpectTotalModelCount(0, 1); + ExpectTotalModelCount(1); } #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) @@ -1503,23 +1482,12 @@ IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, PRE_StorageRemovedFromDisk) { EXPECT_EQ(1, GetSiteDataCount()); - // Expect all datatypes from above except SessionStorage and possibly - // MediaLicense. SessionStorage is not supported by the CookieTreeModel yet. - // MediaLicense is integrated into the quota node, which is not yet fully - // hooked into CookieTreeModel. When 3PSP is enabled, only Cookies and - // LocalStorage are counted. TODO(crbug.com/1307796): Use a different approach - // to determine presence of data that does not depend on UI code and has a - // better resolution when 3PSP is fully enabled. - auto expected_model_size = 3; - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - expected_model_size--; - } + auto expected_model_size = 2; if (base::FeatureList::IsEnabled( browsing_data::features::kDeprecateCookiesTreeModel)) { expected_model_size--; } - ExpectTotalModelCount(kStorageTypes.size() - 2, expected_model_size); + ExpectTotalModelCount(expected_model_size); RemoveAndWait(chrome_browsing_data_remover::DATA_TYPE_SITE_DATA | content::BrowsingDataRemover::DATA_TYPE_CACHE | chrome_browsing_data_remover::DATA_TYPE_HISTORY | @@ -1570,22 +1538,13 @@ SetDataForType(type); EXPECT_TRUE(HasDataForType(type)); } - // Expect the datatypes from above except SessionStorage. SessionStorage is - // not supported by the CookieTreeModel yet. When 3PSP is enabled, only - // Cookies and LocalStorage are counted. TODO(crbug.com/1307796): Use a - // different approach to determine presence of data that does not depend on UI - // code and has a better resolution when 3PSP is fully enabled. - auto expected_model_size = 3; - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - expected_model_size--; - } + + auto expected_model_size = 2; if (base::FeatureList::IsEnabled( browsing_data::features::kDeprecateCookiesTreeModel)) { expected_model_size--; } - ExpectTotalModelCount(kSessionOnlyStorageTestTypes.size() - 1, - expected_model_size); + ExpectTotalModelCount(expected_model_size); HostContentSettingsMapFactory::GetForProfile(GetBrowser()->profile()) ->SetDefaultContentSetting(ContentSettingsType::COOKIES, CONTENT_SETTING_SESSION_ONLY);
diff --git a/chrome/browser/browsing_data/cookies_tree_model_browsertest.cc b/chrome/browser/browsing_data/cookies_tree_model_browsertest.cc index 2c05294..9e16a13 100644 --- a/chrome/browser/browsing_data/cookies_tree_model_browsertest.cc +++ b/chrome/browser/browsing_data/cookies_tree_model_browsertest.cc
@@ -145,57 +145,6 @@ base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F(CookiesTreeModelBrowserTest, NoQuotaStorage) { - AccessStorage(); - - auto tree_model = CookiesTreeModel::CreateForProfileDeprecated( - chrome_test_utils::GetProfile(this)); - CookiesTreeObserver observer; - tree_model->AddCookiesTreeObserver(&observer); - observer.AwaitTreeModelEndBatch(); - - bool is_migrate_storage_to_bdm_enabled = base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM); - - auto expected_size = is_migrate_storage_to_bdm_enabled ? 0 : 1; - - // Quota storage has been accessed, but should not be present in the tree. - EXPECT_EQ(is_migrate_storage_to_bdm_enabled ? 5u : 17u, - tree_model->GetRoot()->GetTotalNodeCount()); - auto node_counts = GetNodeTypeCounts(tree_model.get()); - EXPECT_EQ(is_migrate_storage_to_bdm_enabled ? 4u : 16u, node_counts.size()); - EXPECT_EQ(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_QUOTA]); - - EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_ROOT]); - EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_HOST]); - EXPECT_EQ(2, node_counts[CookieTreeNode::DetailedInfo::TYPE_COOKIE]); - EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_COOKIES]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_DATABASE]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_DATABASES]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_INDEXED_DBS]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEMS]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKER]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_SERVICE_WORKERS]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_CACHE_STORAGE]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_CACHE_STORAGES]); -} - IN_PROC_BROWSER_TEST_F(CookiesTreeModelBrowserTest, BatchesFinishSync) { // Confirm that when all helpers fetch functions return synchronously, that // the model has received all expected batches. @@ -276,16 +225,8 @@ EXPECT_LT(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_HOST]); EXPECT_LT(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_COOKIE]); EXPECT_LT(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_COOKIES]); - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - EXPECT_EQ(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE]); - EXPECT_EQ(0, - node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES]); - } else { - EXPECT_LT(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE]); - EXPECT_LT(0, - node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES]); - } + EXPECT_EQ(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE]); + EXPECT_EQ(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES]); EXPECT_EQ(0, node_counts[CookieTreeNode::DetailedInfo::TYPE_QUOTA]); // Check that the default StoragePartition is empty. @@ -296,43 +237,3 @@ node_counts = GetNodeTypeCounts(tree_model.get()); EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_ROOT]); } - -class CookiesTreeModelBrowserTestQuotaOnly - : public CookiesTreeModelBrowserTest { - public: - void InitFeatures() override { - feature_list()->InitAndEnableFeature( - net::features::kThirdPartyStoragePartitioning); - } -}; - -IN_PROC_BROWSER_TEST_F(CookiesTreeModelBrowserTestQuotaOnly, QuotaStorageOnly) { - AccessStorage(); - - auto tree_model = CookiesTreeModel::CreateForProfileDeprecated( - chrome_test_utils::GetProfile(this)); - CookiesTreeObserver observer; - tree_model->AddCookiesTreeObserver(&observer); - observer.AwaitTreeModelEndBatch(); - - bool is_migrate_storage_to_bdm_enabled = base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM); - // Quota storage has been accessed, only quota nodes should be present for - // quota managed storage types. - EXPECT_EQ(is_migrate_storage_to_bdm_enabled ? 5u : 8u, - tree_model->GetRoot()->GetTotalNodeCount()); - - auto node_counts = GetNodeTypeCounts(tree_model.get()); - auto expected_size = is_migrate_storage_to_bdm_enabled ? 0 : 1; - EXPECT_EQ(is_migrate_storage_to_bdm_enabled ? 4u : 7u, node_counts.size()); - EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_ROOT]); - EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_HOST]); - EXPECT_EQ(2, node_counts[CookieTreeNode::DetailedInfo::TYPE_COOKIE]); - EXPECT_EQ(1, node_counts[CookieTreeNode::DetailedInfo::TYPE_COOKIES]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGES]); - EXPECT_EQ(expected_size, - node_counts[CookieTreeNode::DetailedInfo::TYPE_QUOTA]); -}
diff --git a/chrome/browser/browsing_data/incognito_browsing_data_browsertest.cc b/chrome/browser/browsing_data/incognito_browsing_data_browsertest.cc index cb969452..1e3342b 100644 --- a/chrome/browser/browsing_data/incognito_browsing_data_browsertest.cc +++ b/chrome/browser/browsing_data/incognito_browsing_data_browsertest.cc
@@ -28,7 +28,6 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/browsing_data/content/browsing_data_model.h" -#include "components/browsing_data/core/features.h" #include "components/prefs/pref_service.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_usage_info.h" @@ -178,23 +177,6 @@ << GetCookiesTreeModelInfo(cookies_tree_model->GetRoot()); } - inline void ExpectTotalModelCount(Browser* browser, - int expectedAllDisabled, - int expectedAnyEnabled) { - // TODO(crbug.com/1307796): Use a different approach to determine presence - // of data that does not depend on UI code and has a better resolution when - // 3PSP is fully enabled. Also, remove helper duplication between the - // incognito, and remover, browsing data browser tests. - if (!base::FeatureList::IsEnabled( - net::features::kThirdPartyStoragePartitioning) && - !base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - ExpectTotalModelCount(browser, expectedAllDisabled); - } else { - ExpectTotalModelCount(browser, expectedAnyEnabled); - } - } - void OnVideoDecodePerfInfo(base::RunLoop* run_loop, bool* out_is_smooth, bool* out_is_power_efficient, @@ -547,7 +529,7 @@ // quota system. SetDataForType(kMediaLicenseType); EXPECT_EQ(1, GetSiteDataCount()); - ExpectTotalModelCount(GetBrowser(), 0, 1); + ExpectTotalModelCount(GetBrowser(), 1); EXPECT_TRUE(HasDataForType(kMediaLicenseType)); // No residue in regular mode.
diff --git a/chrome/browser/browsing_data/local_data_container.cc b/chrome/browser/browsing_data/local_data_container.cc index fbfafb6..7fc801654 100644 --- a/chrome/browser/browsing_data/local_data_container.cc +++ b/chrome/browser/browsing_data/local_data_container.cc
@@ -35,9 +35,6 @@ content::StoragePartition* storage_partition, browsing_data::CookieHelper::IsDeletionDisabledCallback is_cookie_deletion_disabled_callback) { - // TODO(crbug.com/1271155): remove this flag. - CHECK(base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)); return std::make_unique<LocalDataContainer>( base::FeatureList::IsEnabled( browsing_data::features::kDeprecateCookiesTreeModel)
diff --git a/chrome/browser/certificate_provider/pin_dialog_manager.h b/chrome/browser/certificate_provider/pin_dialog_manager.h index f72164d..e253245 100644 --- a/chrome/browser/certificate_provider/pin_dialog_manager.h +++ b/chrome/browser/certificate_provider/pin_dialog_manager.h
@@ -14,7 +14,6 @@ #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "chrome/browser/certificate_provider/security_token_pin_dialog_host.h" @@ -150,9 +149,7 @@ // Remember the host that was used to open the active dialog, as new hosts // could have been added since the dialog was opened, but we want to // continue calling the same host when dealing with the same active dialog. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION SecurityTokenPinDialogHost* const host; + const raw_ptr<SecurityTokenPinDialogHost> host; const std::string extension_id; const std::string extension_name;
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc index ebf7ed2..b6a77a1 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc
@@ -245,7 +245,6 @@ dlp_controller_.reset(); reporting_manager_.reset(); test_reporting_.reset(); - base::RunLoop().RunUntilIdle(); // Let ReportClient mock destruct. } void SetupTextfield() {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc index 5258e8c..75cef1d 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc +++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_browsertest.cc
@@ -343,7 +343,6 @@ cloned_tab_observer_.reset(); test_reporting_.reset(); storage_module_.reset(); - base::RunLoop().RunUntilIdle(); // Let ReportClient mock destruct. } // Sets up real report queue together with TestStorageModule
diff --git a/chrome/browser/commerce/coupons/coupon_service_unittest.cc b/chrome/browser/commerce/coupons/coupon_service_unittest.cc index e610223..975e4a5 100644 --- a/chrome/browser/commerce/coupons/coupon_service_unittest.cc +++ b/chrome/browser/commerce/coupons/coupon_service_unittest.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/commerce/coupons/coupon_service.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ref.h" #include "chrome/browser/commerce/coupons/coupon_service_factory.h" #include "chrome/browser/persisted_state_db/session_proto_db_factory.h" #include "chrome/test/base/testing_profile.h" @@ -79,14 +81,9 @@ struct CouponDataStruct { const int64_t id; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const GURL& origin; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer + const raw_ref<const GURL> origin; + // RAW_PTR_EXCLUSION: Tricky to convert from string literal. RAW_PTR_EXCLUSION const std::string& description; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION const std::string& coupon_code; }; @@ -183,12 +180,12 @@ display_strings.value_prop_text = coupon.description; std::string promo_code = coupon.coupon_code; std::vector<GURL> merchant_origins; - merchant_origins.emplace_back(GURL(coupon.origin)); + merchant_origins.emplace_back(GURL(*coupon.origin)); auto offer = std::make_unique<autofill::AutofillOfferData>( autofill::AutofillOfferData::FreeListingCouponOffer( offer_id, expiry, merchant_origins, /*offer_details_url=*/GURL(), display_strings, promo_code)); - coupon_map[GURL(coupon.origin)].emplace_back(std::move(offer)); + coupon_map[GURL(*coupon.origin)].emplace_back(std::move(offer)); } service_->UpdateFreeListingCoupons(coupon_map); task_environment_.RunUntilIdle(); @@ -226,9 +223,10 @@ TEST_F(CouponServiceTest, TestGetCouponForUrl) { GURL orgin_a(kMockMerchantA); GURL orgin_b(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdA, orgin_a, kMockCouponDescriptionA, kMockCouponCodeA}, - {kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(orgin_a), kMockCouponDescriptionA, + kMockCouponCodeA}, + {kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); Coupons result = service_->GetFreeListingCouponsForUrl(orgin_a); EXPECT_EQ(result.size(), 1u); @@ -247,8 +245,8 @@ TEST_F(CouponServiceTest, TestUpdateCoupons) { base::RunLoop run_loop[1]; GURL origin = GURL(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); Coupons result = service_->GetFreeListingCouponsForUrl(origin); EXPECT_EQ(result.size(), 1u); @@ -264,9 +262,10 @@ base::RunLoop run_loop[4]; GURL orgin_a(kMockMerchantA); GURL orgin_b(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdA, orgin_a, kMockCouponDescriptionA, kMockCouponCodeA}, - {kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(orgin_a), kMockCouponDescriptionA, + kMockCouponCodeA}, + {kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); Coupons result = service_->GetFreeListingCouponsForUrl(orgin_a); EXPECT_EQ(result.size(), 1u); @@ -325,9 +324,10 @@ base::RunLoop run_loop[1]; GURL orgin_a(kMockMerchantA); GURL orgin_b(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdA, orgin_a, kMockCouponDescriptionA, kMockCouponCodeA}, - {kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(orgin_a), kMockCouponDescriptionA, + kMockCouponCodeA}, + {kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); service_->DeleteAllFreeListingCoupons(); @@ -342,8 +342,9 @@ } TEST_F(CouponServiceTest, TestIsUrlEligible) { - SetUpCouponMap({{kMockCouponIdA, GURL("https://www.example.com"), - kMockCouponDescriptionA, kMockCouponCodeA}}); + GURL origin = GURL("https://www.example.com"); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); EXPECT_TRUE(service_->IsUrlEligible(GURL("https://www.example.com"))); EXPECT_TRUE(service_->IsUrlEligible(GURL("https://www.example.com/first"))); @@ -353,8 +354,8 @@ TEST_F(CouponServiceTest, TestRecordCouponDisplayTimestamp) { base::RunLoop run_loop[2]; GURL origin = GURL(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); Coupons result = service_->GetFreeListingCouponsForUrl(origin); EXPECT_EQ(result.size(), 1u); autofill::AutofillOfferData* offer = result[0]; @@ -386,8 +387,8 @@ TEST_F(CouponServiceTest, TestUpdateCoupons_NotOverwriteLastDisplayTime) { base::RunLoop run_loop[1]; GURL origin = GURL(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); Coupons result = service_->GetFreeListingCouponsForUrl(origin); base::Time timestamp = service_->GetCouponDisplayTimestamp(*result[0]); EXPECT_EQ(timestamp, base::Time()); @@ -399,8 +400,8 @@ timestamp = service_->GetCouponDisplayTimestamp(*result[0]); EXPECT_NE(timestamp, base::Time()); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); result = service_->GetFreeListingCouponsForUrl(origin); EXPECT_EQ(result.size(), 1u); @@ -414,8 +415,8 @@ TEST_F(CouponServiceTest, TestUpdateCoupons_OldCouponDisplayTimeRemoved) { GURL origin_A = GURL(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin_A, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin_A), kMockCouponDescriptionA, + kMockCouponCodeA}}); Coupons result = service_->GetFreeListingCouponsForUrl(origin_A); EXPECT_EQ(service_->GetCouponDisplayTimestamp(*result[0]), base::Time()); @@ -428,8 +429,8 @@ // Set up with new coupons where the existing coupon is no longer valid. GURL origin_B = GURL(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdB, origin_B, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdB, raw_ref(origin_B), kMockCouponDescriptionB, + kMockCouponCodeB}}); EXPECT_EQ(service_->GetFreeListingCouponsForUrl(origin_A).size(), 0u); EXPECT_EQ(service_->GetCouponDisplayTimestamp(offer_A), base::Time()); @@ -438,8 +439,8 @@ TEST_F(CouponServiceTest, MaybeFeatureStatusChanged_FeatureDisabled) { base::RunLoop run_loop[2]; const GURL origin(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); EXPECT_TRUE(IsFeatureEnabled()); EXPECT_TRUE(service_->IsUrlEligible(origin)); Coupons result = service_->GetFreeListingCouponsForUrl(origin); @@ -461,8 +462,8 @@ base::Unretained(this), run_loop[1].QuitClosure(), kEmptyExpected)); run_loop[1].Run(); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); EXPECT_EQ(service_->GetFreeListingCouponsForUrl(origin).size(), 0u); } @@ -481,8 +482,8 @@ service_->AddObserver(&observer); CheckCouponServiceObservers({&observer}); GURL origin(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); Coupons result = service_->GetFreeListingCouponsForUrl(origin); EXPECT_EQ(result.size(), 1u); EXPECT_EQ(*result[0], coupon_data_a_); @@ -498,9 +499,10 @@ CheckCouponServiceObservers({&observer}); GURL orgin_a(kMockMerchantA); GURL orgin_b(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdA, orgin_a, kMockCouponDescriptionA, kMockCouponCodeA}, - {kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(orgin_a), kMockCouponDescriptionA, + kMockCouponCodeA}, + {kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); Coupons result = service_->GetFreeListingCouponsForUrl(orgin_a); EXPECT_EQ(result.size(), 1u); EXPECT_EQ(*result[0], coupon_data_a_); @@ -523,9 +525,10 @@ CheckCouponServiceObservers({&observer}); GURL orgin_a(kMockMerchantA); GURL orgin_b(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdA, orgin_a, kMockCouponDescriptionA, kMockCouponCodeA}, - {kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(orgin_a), kMockCouponDescriptionA, + kMockCouponCodeA}, + {kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); Coupons result = service_->GetFreeListingCouponsForUrl(orgin_a); EXPECT_EQ(result.size(), 1u); EXPECT_EQ(*result[0], coupon_data_a_); @@ -537,8 +540,8 @@ EXPECT_CALL(observer, OnCouponInvalidated(*couponA)).Times(1); EXPECT_CALL(observer, OnCouponInvalidated(*couponB)).Times(0); - SetUpCouponMap( - {{kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); } // Test when a new batch of coupon data arrives, existing coupons that are also @@ -546,16 +549,17 @@ TEST_F(CouponServiceTest, TestUpdateCoupons_SkipExisting) { GURL orgin_a(kMockMerchantA); GURL orgin_b(kMockMerchantB); - SetUpCouponMap( - {{kMockCouponIdA, orgin_a, kMockCouponDescriptionA, kMockCouponCodeA}, - {kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(orgin_a), kMockCouponDescriptionA, + kMockCouponCodeA}, + {kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); Coupons result = service_->GetFreeListingCouponsForUrl(orgin_b); EXPECT_EQ(result.size(), 1u); EXPECT_EQ(*result[0], coupon_data_b_); auto* couponB = result[0]; - SetUpCouponMap( - {{kMockCouponIdB, orgin_b, kMockCouponDescriptionB, kMockCouponCodeB}}); + SetUpCouponMap({{kMockCouponIdB, raw_ref(orgin_b), kMockCouponDescriptionB, + kMockCouponCodeB}}); result = service_->GetFreeListingCouponsForUrl(orgin_b); EXPECT_EQ(result.size(), 1u); EXPECT_EQ(result[0], couponB); @@ -582,8 +586,8 @@ EXPECT_FALSE(IsFeatureEnabled()); const GURL origin(kMockMerchantA); - SetUpCouponMap( - {{kMockCouponIdA, origin, kMockCouponDescriptionA, kMockCouponCodeA}}); + SetUpCouponMap({{kMockCouponIdA, raw_ref(origin), kMockCouponDescriptionA, + kMockCouponCodeA}}); EXPECT_FALSE(service_->IsUrlEligible(origin)); Coupons result = service_->GetFreeListingCouponsForUrl(origin); EXPECT_EQ(result.size(), 0u);
diff --git a/chrome/browser/content_settings/content_settings_browsertest.cc b/chrome/browser/content_settings/content_settings_browsertest.cc index 6b46fa2f..f25097c3 100644 --- a/chrome/browser/content_settings/content_settings_browsertest.cc +++ b/chrome/browser/content_settings/content_settings_browsertest.cc
@@ -1689,25 +1689,8 @@ pscs_list.push_back(ff_pscs); for (auto* pscs : pscs_list) { - const browsing_data::LocalSharedObjectsContainer& container = - pscs->allowed_local_shared_objects(); EXPECT_TRUE(pscs->IsContentAllowed(ContentSettingsType::COOKIES)); - - bool is_migrate_storage_to_bdm_enabled = base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM); - if (is_migrate_storage_to_bdm_enabled) { - EXPECT_EQ(pscs->allowed_browsing_data_model()->size(), 1u); - } - - size_t expected_size = is_migrate_storage_to_bdm_enabled ? 0u : 1u; - EXPECT_EQ(container.local_storages()->GetCount(), expected_size); - EXPECT_EQ(container.session_storages()->GetCount(), expected_size); - EXPECT_EQ(container.cache_storages()->GetCount(), expected_size); - EXPECT_EQ(container.file_systems()->GetCount(), expected_size); - EXPECT_EQ(container.indexed_dbs()->GetCount(), expected_size); - EXPECT_EQ(container.shared_workers()->GetSharedWorkerCount(), - expected_size); - EXPECT_EQ(container.service_workers()->GetCount(), expected_size); + EXPECT_EQ(pscs->allowed_browsing_data_model()->size(), 1u); } }
diff --git a/chrome/browser/devtools/devtools_settings.cc b/chrome/browser/devtools/devtools_settings.cc index c938b7f..bcbf81d 100644 --- a/chrome/browser/devtools/devtools_settings.cc +++ b/chrome/browser/devtools/devtools_settings.cc
@@ -112,9 +112,15 @@ return; } - ScopedDictPrefUpdate update(profile_->GetPrefs(), - GetDictionaryNameForSettingsName(name)); - update->Remove(name); + PrefService* prefs = profile_->GetPrefs(); + for (auto* dict_name : + {GetDictionaryNameForSyncedPrefs(), prefs::kDevToolsPreferences}) { + const base::Value::Dict& dict = prefs->GetDict(dict_name); + if (dict.Find(name)) { + ScopedDictPrefUpdate update(profile_->GetPrefs(), dict_name); + update->Remove(name); + } + } } void DevToolsSettings::Clear() {
diff --git a/chrome/browser/devtools/devtools_settings.h b/chrome/browser/devtools/devtools_settings.h index e9bf066..bc5effb 100644 --- a/chrome/browser/devtools/devtools_settings.h +++ b/chrome/browser/devtools/devtools_settings.h
@@ -50,7 +50,7 @@ // Contains the set of synced settings. // The DevTools frontend *must* call `Register` for each setting prior to - // use, which guarantees that this set must not be persisted. + // use, which makes persisting this set unnecessary. base::flat_set<std::string> synced_setting_names_; // Settings pref observer that moves synced settings between their two
diff --git a/chrome/browser/devtools/devtools_settings_unittest.cc b/chrome/browser/devtools/devtools_settings_unittest.cc index 9fb8004d..2c1c1b8 100644 --- a/chrome/browser/devtools/devtools_settings_unittest.cc +++ b/chrome/browser/devtools/devtools_settings_unittest.cc
@@ -159,6 +159,28 @@ DevToolsSettings::kSyncDevToolsPreferencesDefault); } +TEST_F(DevToolsSettingsTest, Remove_WorksOnBothStorages) { + { + ScopedDictPrefUpdate synced_update( + profile_.GetPrefs(), prefs::kDevToolsSyncedPreferencesSyncDisabled); + synced_update->Set("unknown setting", "value"); + + DevToolsSettings settings(&profile_); + settings.Register("synced setting", {RegisterOptions::SyncMode::kSync}); + ScopedDictPrefUpdate unsynced_update(profile_.GetPrefs(), + prefs::kDevToolsPreferences); + unsynced_update->Set("synced setting", "value"); + } + + DevToolsSettings settings(&profile_); + base::Value::Dict prefs = settings.Get(); + EXPECT_EQ(prefs.size(), static_cast<size_t>(3)); + settings.Remove("unknown setting"); + settings.Remove("synced setting"); + prefs = settings.Get(); + EXPECT_EQ(prefs.size(), static_cast<size_t>(1)); +} + TEST_F(DevToolsSettingsTest, Clear_ResetsUnderlyingTogglePreference) { DevToolsSettings settings(&profile_); settings.Register(DevToolsSettings::kSyncDevToolsPreferencesFrontendName,
diff --git a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc index 0b7a4380..3e1a5947 100644 --- a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc +++ b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_ash_utils.cc
@@ -88,7 +88,8 @@ LOG(ERROR) << "Could not find password key"; std::move(callback).Run( std::nullopt, ash::AuthenticationError( - user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND))); return; }
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc index aaad224..eba165d 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
@@ -678,14 +678,9 @@ web_contents()->GetPrimaryMainFrame(), autofill::ContentAutofillClient::FromWebContents(web_contents()) ->GetAutofillDriverFactory()); - auto browser_autofill_manager = - std::make_unique<autofill::BrowserAutofillManager>( - autofill_driver.get(), - autofill::ContentAutofillClient::FromWebContents(web_contents()), - "en-US"); - autofill::BrowserAutofillManager* autofill_manager = - browser_autofill_manager.get(); - autofill_driver->set_autofill_manager(std::move(browser_autofill_manager)); + autofill::BrowserAutofillManager& autofill_manager = + static_cast<autofill::BrowserAutofillManager&>( + autofill_driver->GetAutofillManager()); // `FastCheckoutClientImpl::autofill_manager_` is `nullptr` initially. EXPECT_FALSE(fast_checkout_client()->autofill_manager_); @@ -694,7 +689,7 @@ // Starting the run successfully. EXPECT_TRUE(fast_checkout_client()->TryToStart( GURL(kUrl), autofill::FormData(), autofill::FormFieldData(), - autofill_manager->GetWeakPtr())); + autofill_manager.GetWeakPtr())); OnAfterAskForValuesToFill(); // `FastCheckoutClientImpl::autofill_manager_` is not `nullptr` anymore.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 7f00ae4..5d66c7ee 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -6153,7 +6153,7 @@ { "name": "one-time-permission", "owners": ["fjacky@chromium.org", "permissions-core@google.com"], - "expiry_milestone": 122 + "expiry_milestone": 125 }, { "name": "only-access-clipboard-async", @@ -6372,12 +6372,12 @@ { "name": "password-generation-experiment", "owners": ["rgod@google.com", "chrome-password-manager-team@google.com"], - "expiry_milestone": 123 + "expiry_milestone": 125 }, { "name": "password-generation-strong-label-experiment", "owners": ["rgod@google.com", "chrome-password-manager-team@google.com"], - "expiry_milestone": 123 + "expiry_milestone": 125 }, { "name": "password-manager-signin-uff", @@ -6471,16 +6471,6 @@ "expiry_milestone": 130 }, { - "name": "policy-logs-page-android", - "owners": [ "esalma@chromium.org", "ftirelo@chromium.org" ], - "expiry_milestone": 120 - }, - { - "name": "policy-logs-page-ios", - "owners": [ "esalma@chromium.org", "ftirelo@chromium.org" ], - "expiry_milestone": 122 - }, - { "name": "policy-provided-trust-anchors-allowed-at-lock-screen", "owners": [ "acostinas@chromium.org", "suprnet@google.com" ], "expiry_milestone": 118
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index bce2248..047a906c 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -978,13 +978,6 @@ "turned off or if an extension which uses accessibility APIs no longer " "needs them."; -const char kEnableAutoDisableAccessibilityV2Name[] = - "Auto-disable Accessibility V2"; -const char kEnableAutoDisableAccessibilityV2Description[] = - "Automatically disable accessibility when Android reports no assistive " - "technologies are running. Might break accessibility for assistive " - "technologies without isAccessibilityTool set."; - const char kEnableAutofillAddressSavePromptName[] = "Autofill Address Save Prompts"; const char kEnableAutofillAddressSavePromptDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 06ae178..afacd44 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -263,9 +263,6 @@ extern const char kEnableAutoDisableAccessibilityName[]; extern const char kEnableAutoDisableAccessibilityDescription[]; -extern const char kEnableAutoDisableAccessibilityV2Name[]; -extern const char kEnableAutoDisableAccessibilityV2Description[]; - extern const char kAutofillEnableAndroidNKeyForFidoAuthenticationName[]; extern const char kAutofillEnableAndroidNKeyForFidoAuthenticationDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 73ef49b6..d081e2d 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -676,7 +676,7 @@ BASE_FEATURE(kPwaRestoreUi, "PwaRestoreUi", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kPwaUniversalInstallUi, - "UniversalInstallUi", + "PwaUniversalInstallUi", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kBackGestureActivityTabProvider,
diff --git a/chrome/browser/lacros/message_center_lacros_browsertest.cc b/chrome/browser/lacros/message_center_lacros_browsertest.cc index f8a90b92..c418247 100644 --- a/chrome/browser/lacros/message_center_lacros_browsertest.cc +++ b/chrome/browser/lacros/message_center_lacros_browsertest.cc
@@ -5,7 +5,7 @@ #include <string> #include <vector> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/test/test_future.h" #include "base/token.h" #include "chrome/test/base/in_process_browser_test.h" @@ -51,9 +51,7 @@ void OnNotificationDisabled() override {} // Public because this is test code. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION base::RunLoop* on_closed_run_loop_ = nullptr; + raw_ptr<base::RunLoop> on_closed_run_loop_ = nullptr; mojo::Receiver<mojom::NotificationDelegate> receiver_{this}; };
diff --git a/chrome/browser/lacros/metrics_reporting_lacros_browsertest.cc b/chrome/browser/lacros/metrics_reporting_lacros_browsertest.cc index d8c8414..52293d6 100644 --- a/chrome/browser/lacros/metrics_reporting_lacros_browsertest.cc +++ b/chrome/browser/lacros/metrics_reporting_lacros_browsertest.cc
@@ -4,7 +4,7 @@ #include <optional> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "chrome/test/base/in_process_browser_test.h" #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" @@ -37,9 +37,7 @@ // Public because this is test code. std::optional<bool> metrics_enabled_; std::optional<std::string> metrics_client_id_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION base::RunLoop* on_changed_run_loop_ = nullptr; + raw_ptr<base::RunLoop> on_changed_run_loop_ = nullptr; mojo::Receiver<mojom::MetricsReportingObserver> receiver_{this}; };
diff --git a/chrome/browser/lacros/sync/crosapi_session_sync_favicon_delegate_unittest.cc b/chrome/browser/lacros/sync/crosapi_session_sync_favicon_delegate_unittest.cc index fc412dc7..4657a67 100644 --- a/chrome/browser/lacros/sync/crosapi_session_sync_favicon_delegate_unittest.cc +++ b/chrome/browser/lacros/sync/crosapi_session_sync_favicon_delegate_unittest.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/lacros/sync/crosapi_session_sync_favicon_delegate.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" @@ -47,9 +47,7 @@ void SetResultImage(gfx::Image* image) { result_image_ = image; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION gfx::Image* result_image_ = nullptr; + raw_ptr<gfx::Image> result_image_ = nullptr; }; gfx::Image GetTestImage() {
diff --git a/chrome/browser/mac/install_test.cc b/chrome/browser/mac/install_test.cc index f61e2e7..e557c97 100644 --- a/chrome/browser/mac/install_test.cc +++ b/chrome/browser/mac/install_test.cc
@@ -51,7 +51,8 @@ src.value(), dest.GetPath().AppendASCII("Google Chrome.app").value()}); EXPECT_TRUE(base::GetAppOutputWithExitCode(command, &output, &exit_code)); EXPECT_EQ(exit_code, 0) << output; - ASSERT_TRUE(base::PathExists(dest.GetPath().AppendASCII("Google Chrome.app"); + ASSERT_TRUE( + base::PathExists(dest.GetPath().AppendASCII("Google Chrome.app"))); } #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h b/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h index b7e3b1f0..aaac1a8 100644 --- a/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h +++ b/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h
@@ -11,7 +11,6 @@ #include <vector> #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/observer_list.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" @@ -56,9 +55,7 @@ // The WebContents from where the navigation may happen. Do not use this // pointer outside the observer's call stack unless its destruction is also // observed. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION content::WebContents* web_contents_; + raw_ptr<content::WebContents> web_contents_; // TODO(spelchat): this no longer needs to be optional. Optionality was // required because external app predictions didn't provide this field, but
diff --git a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc index d123310..9c7de0a 100644 --- a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc +++ b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
@@ -344,8 +344,16 @@ CheckUKMAndUMAMetricsWithValues(totalCls, cls); } +// TODO(crbug.com/1500379): Disable this test on Win10 +#if BUILDFLAG(IS_WIN) +#define MAYBE_CumulativeLayoutShift_hadRecentInput \ + DISABLED_CumulativeLayoutShift_hadRecentInput +#else +#define MAYBE_CumulativeLayoutShift_hadRecentInput \ + CumulativeLayoutShift_hadRecentInput +#endif IN_PROC_BROWSER_TEST_F(LayoutInstabilityTest, - CumulativeLayoutShift_hadRecentInput) { + MAYBE_CumulativeLayoutShift_hadRecentInput) { auto waiter = std::make_unique<page_load_metrics::PageLoadMetricsTestWaiter>( web_contents());
diff --git a/chrome/browser/password_manager/android/password_store_android_account_backend.cc b/chrome/browser/password_manager/android/password_store_android_account_backend.cc index 1101853..b12ce2a 100644 --- a/chrome/browser/password_manager/android/password_store_android_account_backend.cc +++ b/chrome/browser/password_manager/android/password_store_android_account_backend.cc
@@ -74,6 +74,52 @@ syncer::kPassExplicitSyncPassphraseToGmsCore); } +enum class ActionOnApiError { + // See password_manager_upm_eviction::EvictCurrentUser(). + kEvict, + // See prefs::kSavePasswordsSuspendedByError. + kDisableSaving, + // See PasswordStoreAndroidAccountBackend::TryFixPassphraseErrorCb. + kDisableSavingAndTryFixPassphraseError, +}; + +ActionOnApiError GetRecoveryActionOnApiError( + AndroidBackendAPIErrorCode api_error_code, + bool can_remove_unenrollment, + bool supports_passphrase_error_fix) { + switch (api_error_code) { + case AndroidBackendAPIErrorCode::kAuthErrorResolvable: + case AndroidBackendAPIErrorCode::kAuthErrorUnresolvable: + return ActionOnApiError::kDisableSaving; + case AndroidBackendAPIErrorCode::kPassphraseRequired: + return supports_passphrase_error_fix + ? ActionOnApiError::kDisableSavingAndTryFixPassphraseError + : ActionOnApiError::kEvict; + case AndroidBackendAPIErrorCode::kNetworkError: + case AndroidBackendAPIErrorCode::kApiNotConnected: + case AndroidBackendAPIErrorCode::kConnectionSuspendedDuringCall: + case AndroidBackendAPIErrorCode::kReconnectionTimedOut: + case AndroidBackendAPIErrorCode::kBackendGeneric: + case AndroidBackendAPIErrorCode::kInternalError: + case AndroidBackendAPIErrorCode::kDeveloperError: + case AndroidBackendAPIErrorCode::kAccessDenied: + case AndroidBackendAPIErrorCode::kBadRequest: + case AndroidBackendAPIErrorCode::kBackendResourceExhausted: + case AndroidBackendAPIErrorCode::kInvalidData: + case AndroidBackendAPIErrorCode::kUnmappedErrorCode: + case AndroidBackendAPIErrorCode::kUnexpectedError: + case AndroidBackendAPIErrorCode::kKeyRetrievalRequired: + case AndroidBackendAPIErrorCode::kChromeSyncAPICallError: + case AndroidBackendAPIErrorCode::kErrorWhileDoingLeakServiceGRPC: + case AndroidBackendAPIErrorCode::kRequiredSyncingAccountMissing: + case AndroidBackendAPIErrorCode::kLeakCheckServiceAuthError: + case AndroidBackendAPIErrorCode::kLeakCheckServiceResourceExhausted: + break; + } + return can_remove_unenrollment ? ActionOnApiError::kDisableSaving + : ActionOnApiError::kEvict; +} + } // namespace PasswordStoreAndroidAccountBackend::PasswordStoreAndroidAccountBackend( @@ -82,12 +128,13 @@ : PasswordStoreAndroidBackend( PasswordStoreAndroidBackendBridgeHelper::Create(), std::make_unique<PasswordManagerLifecycleHelperImpl>(), - prefs, + prefs), + affiliations_prefetcher_(affiliations_prefetcher), + try_fix_passphrase_error_cb_( IsExplicitPassphrasePlatformClientSupported() ? base::BindRepeating( &syncer::SendExplicitPassphraseToJavaPlatformClient) - : base::NullCallback()), - affiliations_prefetcher_(affiliations_prefetcher) { + : base::NullCallback()) { sync_controller_delegate_ = std::make_unique<PasswordSyncControllerDelegateAndroid>( std::make_unique<PasswordSyncControllerDelegateBridgeImpl>(), @@ -106,9 +153,9 @@ const TryFixPassphraseErrorCb& try_fix_passphrase_error_cb) : PasswordStoreAndroidBackend(std::move(bridge_helper), std::move(lifecycle_helper), - prefs, - try_fix_passphrase_error_cb), - affiliations_prefetcher_(affiliations_prefetcher) { + prefs), + affiliations_prefetcher_(affiliations_prefetcher), + try_fix_passphrase_error_cb_(try_fix_passphrase_error_cb) { sync_controller_delegate_ = std::move(sync_controller_delegate); } @@ -267,6 +314,29 @@ return weak_ptr_factory_.GetWeakPtr(); } +PasswordStoreBackendErrorRecoveryType +PasswordStoreAndroidAccountBackend::RecoverOnErrorAndReturnResult( + AndroidBackendAPIErrorCode error) { + switch (GetRecoveryActionOnApiError(error, + bridge_helper()->CanRemoveUnenrollment(), + !!try_fix_passphrase_error_cb_)) { + case ActionOnApiError::kEvict: { + if (!password_manager_upm_eviction::IsCurrentUserEvicted(prefs())) { + password_manager_upm_eviction::EvictCurrentUser(static_cast<int>(error), + prefs()); + } + return PasswordStoreBackendErrorRecoveryType::kUnrecoverable; + } + case ActionOnApiError::kDisableSavingAndTryFixPassphraseError: + CHECK(try_fix_passphrase_error_cb_); + try_fix_passphrase_error_cb_.Run(sync_service_); + ABSL_FALLTHROUGH_INTENDED; + case ActionOnApiError::kDisableSaving: + prefs()->SetBoolean(prefs::kSavePasswordsSuspendedByError, true); + return PasswordStoreBackendErrorRecoveryType::kRecoverable; + } +} + void PasswordStoreAndroidAccountBackend::OnSyncServiceInitialized( syncer::SyncService* sync_service) { // TODO(crbug.com/1335387) Check if this might be called multiple times
diff --git a/chrome/browser/password_manager/android/password_store_android_account_backend.h b/chrome/browser/password_manager/android/password_store_android_account_backend.h index c1c42bf..7704ef6e 100644 --- a/chrome/browser/password_manager/android/password_store_android_account_backend.h +++ b/chrome/browser/password_manager/android/password_store_android_account_backend.h
@@ -81,6 +81,10 @@ SmartBubbleStatsStore* GetSmartBubbleStatsStore() override; base::WeakPtr<PasswordStoreBackend> AsWeakPtr() override; + // PasswordStoreAndroidBackend implementation. + PasswordStoreBackendErrorRecoveryType RecoverOnErrorAndReturnResult( + AndroidBackendAPIErrorCode error) override; + private: // If |forms_or_error| contains forms, it retrieves and fills in affiliation // and branding information for Android credentials in the forms and invokes @@ -106,6 +110,9 @@ std::unique_ptr<PasswordSyncControllerDelegateAndroid> sync_controller_delegate_; + // Nullable. + const TryFixPassphraseErrorCb try_fix_passphrase_error_cb_; + base::WeakPtrFactory<PasswordStoreAndroidAccountBackend> weak_ptr_factory_{ this}; };
diff --git a/chrome/browser/password_manager/android/password_store_android_account_backend_unittest.cc b/chrome/browser/password_manager/android/password_store_android_account_backend_unittest.cc index a8bb353c..4f4a746 100644 --- a/chrome/browser/password_manager/android/password_store_android_account_backend_unittest.cc +++ b/chrome/browser/password_manager/android/password_store_android_account_backend_unittest.cc
@@ -1759,8 +1759,12 @@ EXPECT_EQ(ShouldUnenroll(), prefs()->GetBoolean( prefs::kUnenrolledFromGoogleMobileServicesDueToErrors)); - EXPECT_EQ(!ShouldUnenroll(), - prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError)); + if (IsRetriableError()) { + EXPECT_FALSE(prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError)); + } else { + EXPECT_EQ(!ShouldUnenroll(), + prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError)); + } } TEST_P(PasswordStoreAndroidAccountBackendWithoutUnenrollmentTest, @@ -1793,8 +1797,12 @@ EXPECT_EQ(ShouldUnenroll(), prefs()->GetBoolean( prefs::kUnenrolledFromGoogleMobileServicesDueToErrors)); - EXPECT_EQ(!ShouldUnenroll(), - prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError)); + if (IsRetriableError()) { + EXPECT_FALSE(prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError)); + } else { + EXPECT_EQ(!ShouldUnenroll(), + prefs()->GetBoolean(prefs::kSavePasswordsSuspendedByError)); + } } TEST_P(PasswordStoreAndroidAccountBackendWithoutUnenrollmentTest,
diff --git a/chrome/browser/password_manager/android/password_store_android_backend.cc b/chrome/browser/password_manager/android/password_store_android_backend.cc index 3d6103e..5ed309d 100644 --- a/chrome/browser/password_manager/android/password_store_android_backend.cc +++ b/chrome/browser/password_manager/android/password_store_android_backend.cc
@@ -297,60 +297,25 @@ // See PasswordStoreAndroidBackend::TryFixPassphraseErrorCb. kDisableSavingAndTryFixPassphraseError, kRetry, - kNone, }; -ActionOnApiError GetActionOnApiError(AndroidBackendAPIErrorCode api_error_code, - PasswordStoreOperation operation, - base::TimeDelta delay, - bool can_remove_unenrollment, - bool supports_passphrase_error_fix) { - switch (api_error_code) { - case AndroidBackendAPIErrorCode::kAuthErrorResolvable: - case AndroidBackendAPIErrorCode::kAuthErrorUnresolvable: - return ActionOnApiError::kDisableSaving; - case AndroidBackendAPIErrorCode::kPassphraseRequired: { - return supports_passphrase_error_fix - ? ActionOnApiError::kDisableSavingAndTryFixPassphraseError - : ActionOnApiError::kEvict; - } - case AndroidBackendAPIErrorCode::kNetworkError: - case AndroidBackendAPIErrorCode::kApiNotConnected: - case AndroidBackendAPIErrorCode::kConnectionSuspendedDuringCall: - case AndroidBackendAPIErrorCode::kReconnectionTimedOut: - case AndroidBackendAPIErrorCode::kBackendGeneric: - if (operation == PasswordStoreOperation::kGetAllLoginsAsync || - operation == PasswordStoreOperation::kGetAutofillableLoginsAsync) { - // This (error, operation) tuple is generally retriable. Still, impose - // a max retry timeout. If time ran out... - // - ...and unenrollment is present, the operation should still not - // result in eviction (historical artifact). - // - ...and unenrollment is gone, disable saving. - return delay < kTaskRetryTimeout - ? ActionOnApiError::kRetry - : (can_remove_unenrollment ? ActionOnApiError::kDisableSaving - : ActionOnApiError::kNone); - } - // Not retriable. Handle with other errors leading to eviction below. - ABSL_FALLTHROUGH_INTENDED; - case AndroidBackendAPIErrorCode::kInternalError: - case AndroidBackendAPIErrorCode::kDeveloperError: - case AndroidBackendAPIErrorCode::kAccessDenied: - case AndroidBackendAPIErrorCode::kBadRequest: - case AndroidBackendAPIErrorCode::kBackendResourceExhausted: - case AndroidBackendAPIErrorCode::kInvalidData: - case AndroidBackendAPIErrorCode::kUnmappedErrorCode: - case AndroidBackendAPIErrorCode::kUnexpectedError: - case AndroidBackendAPIErrorCode::kKeyRetrievalRequired: - case AndroidBackendAPIErrorCode::kChromeSyncAPICallError: - case AndroidBackendAPIErrorCode::kErrorWhileDoingLeakServiceGRPC: - case AndroidBackendAPIErrorCode::kRequiredSyncingAccountMissing: - case AndroidBackendAPIErrorCode::kLeakCheckServiceAuthError: - case AndroidBackendAPIErrorCode::kLeakCheckServiceResourceExhausted: - break; - } - return can_remove_unenrollment ? ActionOnApiError::kDisableSaving - : ActionOnApiError::kEvict; +bool ShouldRetryOperationOnError(PasswordStoreOperation operation, + AndroidBackendAPIErrorCode api_error_code, + base::TimeDelta delay) { + const base::flat_set<PasswordStoreOperation> kRetriableOperations = { + PasswordStoreOperation::kGetAllLoginsAsync, + PasswordStoreOperation::kGetAutofillableLoginsAsync, + }; + const base::flat_set<AndroidBackendAPIErrorCode> kRetriableErrors = { + AndroidBackendAPIErrorCode::kNetworkError, + AndroidBackendAPIErrorCode::kApiNotConnected, + AndroidBackendAPIErrorCode::kConnectionSuspendedDuringCall, + AndroidBackendAPIErrorCode::kReconnectionTimedOut, + AndroidBackendAPIErrorCode::kBackendGeneric}; + return delay < kTaskRetryTimeout && + kRetriableOperations.contains(operation) && + kRetriableErrors.contains( + static_cast<AndroidBackendAPIErrorCode>(api_error_code)); } PasswordStoreBackendErrorType APIErrorCodeToErrorType( @@ -446,12 +411,10 @@ PasswordStoreAndroidBackend::PasswordStoreAndroidBackend( std::unique_ptr<PasswordStoreAndroidBackendBridgeHelper> bridge_helper, std::unique_ptr<PasswordManagerLifecycleHelper> lifecycle_helper, - PrefService* prefs, - const TryFixPassphraseErrorCb& try_fix_passphrase_error_cb) + PrefService* prefs) : lifecycle_helper_(std::move(lifecycle_helper)), bridge_helper_(std::move(bridge_helper)), - prefs_(prefs), - try_fix_passphrase_error_cb_(try_fix_passphrase_error_cb) { + prefs_(prefs) { DCHECK(bridge_helper_); DCHECK(prefs_); bridge_helper_->SetConsumer(weak_ptr_factory_.GetWeakPtr()); @@ -753,54 +716,40 @@ int api_error = error.api_error_code.value(); auto api_error_code = static_cast<AndroidBackendAPIErrorCode>(api_error); - reported_error.type = APIErrorCodeToErrorType( - api_error_code, bridge_helper_->CanRemoveUnenrollment()); - // TODO(crbug.com/1372343): Extract the retry logic into a separate method. + // TODO(crbug.com/1372343): Extract the retry logic into a separate method. // Retry the call if the performed operation in combination with the error // was retriable and the time limit was not reached. - switch (GetActionOnApiError(api_error_code, operation, delay, - bridge_helper_->CanRemoveUnenrollment(), - !!try_fix_passphrase_error_cb_)) { - case ActionOnApiError::kRetry: { - RecordRetryHistograms(operation, api_error_code, delay); - CHECK(operation == PasswordStoreOperation::kGetAllLoginsAsync || - operation == PasswordStoreOperation::kGetAutofillableLoginsAsync); - const auto method = - operation == PasswordStoreOperation::kGetAllLoginsAsync - ? &PasswordStoreAndroidBackend::GetAllLoginsInternal - : &PasswordStoreAndroidBackend::GetAutofillableLoginsInternal; - RetryOperation( - base::BindOnce(method, weak_ptr_factory_.GetWeakPtr(), - // TODO(b/306673712): Avoid using sync account for - // local retires. - GetSyncingAccount(sync_service_), - std::move(*reply).Get<LoginsOrErrorReply>(), - operation), - delay); - return; - } - case ActionOnApiError::kEvict: { - reported_error.recovery_type = - PasswordStoreBackendErrorRecoveryType::kUnrecoverable; - if (!password_manager_upm_eviction::IsCurrentUserEvicted(prefs_)) { - password_manager_upm_eviction::EvictCurrentUser(api_error, prefs_); - } - break; - } - case ActionOnApiError::kDisableSavingAndTryFixPassphraseError: - CHECK(try_fix_passphrase_error_cb_); - try_fix_passphrase_error_cb_.Run(sync_service_); - ABSL_FALLTHROUGH_INTENDED; - case ActionOnApiError::kDisableSaving: - reported_error.recovery_type = - PasswordStoreBackendErrorRecoveryType::kRecoverable; - prefs_->SetBoolean(prefs::kSavePasswordsSuspendedByError, true); - break; - case ActionOnApiError::kNone: - reported_error.recovery_type = - PasswordStoreBackendErrorRecoveryType::kRecoverable; - break; + if (ShouldRetryOperationOnError(operation, api_error_code, delay)) { + RecordRetryHistograms(operation, api_error_code, delay); + CHECK(operation == PasswordStoreOperation::kGetAllLoginsAsync || + operation == PasswordStoreOperation::kGetAutofillableLoginsAsync); + const auto method = + operation == PasswordStoreOperation::kGetAllLoginsAsync + ? &PasswordStoreAndroidBackend::GetAllLoginsInternal + : &PasswordStoreAndroidBackend::GetAutofillableLoginsInternal; + RetryOperation(base::BindOnce(method, weak_ptr_factory_.GetWeakPtr(), + // TODO(b/306673712): Avoid using sync + // account for local retires. + GetSyncingAccount(sync_service_), + std::move(*reply).Get<LoginsOrErrorReply>(), + operation), + delay); + return; + } + + if (delay >= kTaskRetryTimeout) { + // Maximum delay is reached, meaning there are no more retries. Do nothing + // but ensure the error is marked as recoverable. + reported_error.recovery_type = + PasswordStoreBackendErrorRecoveryType::kRecoverable; + } else { + // Either operation or error is not retriable. Decide recoverability based + // on error. + reported_error.recovery_type = + RecoverOnErrorAndReturnResult(api_error_code); + reported_error.type = APIErrorCodeToErrorType( + api_error_code, bridge_helper_->CanRemoveUnenrollment()); } } @@ -915,8 +864,6 @@ // Create and run a callbacks chain that updates the logins. base::OnceClosure callbacks_chain = base::DoNothing(); for (PasswordForm& login : logins_to_update) { - CHECK(!login.blocked_by_user || - (login.username_value.empty() && login.password_value.empty())); callbacks_chain = base::BindOnce( &PasswordStoreAndroidBackend::UpdateLoginInternal, weak_ptr_factory_.GetWeakPtr(), account, std::move(login),
diff --git a/chrome/browser/password_manager/android/password_store_android_backend.h b/chrome/browser/password_manager/android/password_store_android_backend.h index 3aad34c..0828d4e0 100644 --- a/chrome/browser/password_manager/android/password_store_android_backend.h +++ b/chrome/browser/password_manager/android/password_store_android_backend.h
@@ -20,6 +20,7 @@ #include "base/types/pass_key.h" #include "base/types/strong_alias.h" #include "chrome/browser/password_manager/android/password_manager_lifecycle_helper.h" +#include "chrome/browser/password_manager/android/password_store_android_backend_api_error_codes.h" #include "chrome/browser/password_manager/android/password_store_android_backend_bridge_helper.h" #include "chrome/browser/password_manager/android/password_store_android_backend_dispatcher_bridge.h" #include "components/password_manager/core/browser/password_store/password_store_backend_metrics_recorder.h" @@ -101,8 +102,7 @@ PasswordStoreAndroidBackend( std::unique_ptr<PasswordStoreAndroidBackendBridgeHelper> bridge_helper, std::unique_ptr<PasswordManagerLifecycleHelper> lifecycle_helper, - PrefService* prefs, - const TryFixPassphraseErrorCb& try_fix_passphrase_error_cb); + PrefService* prefs); ~PasswordStoreAndroidBackend() override; private: @@ -224,6 +224,12 @@ } PrefService* prefs() { return prefs_; } + // Subclasses can override this method + // to have a special handling for different errors. This function returns + // whether the error is recoverable or not. + virtual PasswordStoreBackendErrorRecoveryType RecoverOnErrorAndReturnResult( + AndroidBackendAPIErrorCode error) = 0; + private: // Implements the retry mechanism for the operations that are safe to retry. // The given |delay| comes from the previous attempt to run the operation. @@ -326,9 +332,6 @@ private: raw_ptr<PrefService> prefs_ = nullptr; - // Nullable. - const TryFixPassphraseErrorCb try_fix_passphrase_error_cb_; - base::Time initialized_at_ = base::Time::Now(); // This will be set to false once the first foregrounding has been handled.
diff --git a/chrome/browser/password_manager/android/unified_password_manager_proto_utils_unittest.cc b/chrome/browser/password_manager/android/unified_password_manager_proto_utils_unittest.cc index a8513ed..c1657299 100644 --- a/chrome/browser/password_manager/android/unified_password_manager_proto_utils_unittest.cc +++ b/chrome/browser/password_manager/android/unified_password_manager_proto_utils_unittest.cc
@@ -4,12 +4,10 @@ #include "chrome/browser/password_manager/android/unified_password_manager_proto_utils.h" -#include "base/feature_list.h" #include "components/password_manager/core/browser/password_form.h" #include "chrome/browser/password_manager/android/protos/list_passwords_result.pb.h" #include "chrome/browser/password_manager/android/protos/password_info.pb.h" #include "chrome/browser/password_manager/android/protos/password_with_local_data.pb.h" -#include "components/sync/base/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -63,11 +61,9 @@ // The current code always populates password issues for outgoing protos even // when none exist. *password_specifics.mutable_password_issues() = sync_pb::PasswordIssues(); - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - // The current code always populates notes for outgoing protos even when - // non-exists. - password_specifics.mutable_notes(); - } + // The current code always populates notes for outgoing protos even when none + // exist. + password_specifics.mutable_notes(); // The current code always populates shared password metadata for outgoing // protos even when none exist. password_specifics.set_sender_email("");
diff --git a/chrome/browser/policy/messaging_layer/public/report_client_test_util.cc b/chrome/browser/policy/messaging_layer/public/report_client_test_util.cc index 375a28a..fe86622 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client_test_util.cc +++ b/chrome/browser/policy/messaging_layer/public/report_client_test_util.cc
@@ -62,8 +62,10 @@ ReportingClient::TestEnvironment::TestEnvironment( ReportingClient::StorageModuleCreateCallback storage_create_cb) + // Below we convert ReportingClient::SmartPtr to std::unique_ptr. : client_(ReportingClient::Create( - base::SequencedTaskRunner::GetCurrentDefault())) { + base::SequencedTaskRunner::GetCurrentDefault()) + .release()) { client_->storage_create_cb_ = storage_create_cb; }
diff --git a/chrome/browser/policy/messaging_layer/public/report_client_test_util.h b/chrome/browser/policy/messaging_layer/public/report_client_test_util.h index 7ff124bcc..cd5f31bd5 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client_test_util.h +++ b/chrome/browser/policy/messaging_layer/public/report_client_test_util.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_POLICY_MESSAGING_LAYER_PUBLIC_REPORT_CLIENT_TEST_UTIL_H_ #define CHROME_BROWSER_POLICY_MESSAGING_LAYER_PUBLIC_REPORT_CLIENT_TEST_UTIL_H_ +#include <memory> + #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/policy/messaging_layer/public/report_client.h" @@ -46,7 +48,7 @@ explicit TestEnvironment( ReportingClient::StorageModuleCreateCallback storage_create_cb); - ReportQueueProvider::SmartPtr<ReportingClient> client_; + const std::unique_ptr<ReportingClient> client_; }; } // namespace reporting
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb index db252c59..bc5267b 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb
@@ -38,7 +38,7 @@ <translation id="8136852699834914183">La reproducción no está disponible para esta página.</translation> <translation id="8264989794233974275">Aumentar o disminuir la velocidad <ph name="PLAYBACK_SPEED" /> veces</translation> <translation id="8407011429883244666">Cerrar el reproductor</translation> -<translation id="8481839122437406573">Calmo</translation> +<translation id="8481839122437406573">Calmado</translation> <translation id="8953618380150219653">El reproductor "Escuchar esta página" está totalmente abierto.</translation> <translation id="978117257931832348">Tono grave</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb index c1ddeea..8aeaa6c 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr-Latn.xtb
@@ -40,5 +40,5 @@ <translation id="8407011429883244666">Zatvorite plejer.</translation> <translation id="8481839122437406573">Miran</translation> <translation id="8953618380150219653">Plejer Slušajte ovu stranicu je otvoren u punoj visini.</translation> -<translation id="978117257931832348">Nizak ton</translation> +<translation id="978117257931832348">Dubok</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb index a204402..9cd004b 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sr.xtb
@@ -40,5 +40,5 @@ <translation id="8407011429883244666">Затворите плејер.</translation> <translation id="8481839122437406573">Миран</translation> <translation id="8953618380150219653">Плејер Слушајте ову страницу је отворен у пуној висини.</translation> -<translation id="978117257931832348">Низак тон</translation> +<translation id="978117257931832348">Дубок</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h index db62dc7..1ef57e1 100644 --- a/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h +++ b/chrome/browser/resource_coordinator/tab_manager_delegate_chromeos.h
@@ -15,7 +15,7 @@ #include "base/containers/flat_map.h" #include "base/functional/callback.h" #include "base/gtest_prod_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/process/process.h" #include "base/scoped_multi_source_observation.h" @@ -333,12 +333,8 @@ // Derive process type for this candidate. Used to initialize |process_type_|. ProcessType GetProcessTypeInternal() const; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION LifecycleUnit* lifecycle_unit_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const arc::ArcProcess* app_ = nullptr; + raw_ptr<LifecycleUnit, DanglingUntriaged> lifecycle_unit_ = nullptr; + raw_ptr<const arc::ArcProcess, DanglingUntriaged> app_ = nullptr; ProcessType process_type_ = GetProcessTypeInternal(); };
diff --git a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.html b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.html index 4d232c8f..f223867 100644 --- a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.html +++ b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.html
@@ -28,9 +28,7 @@ margin-inline-end: var(--cr-controlled-by-spacing); } </style> -<div id="container" - actionable$="[[!isPermissionManaged_]]" - on-click="onPermissionRowClick_"> +<div id="container" actionable$="[[!isPermissionManaged_]]"> <div id="appData"> <img id="appIcon" src="chrome://app-icon/[[app.id]]/64" alt="[[app.name]] app icon." aria-hidden="true">
diff --git a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.ts b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.ts index 89803695..e2e20da 100644 --- a/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.ts +++ b/chrome/browser/resources/ash/settings/os_privacy_page/privacy_hub_app_permission_row.ts
@@ -127,6 +127,12 @@ this.mojoInterfaceProvider_ = getAppPermissionProvider(); } + override ready(): void { + super.ready(); + this.addEventListener('click', this.onPermissionRowClick_.bind(this)); + } + + private onPermissionChange_(): void { const permission = castExists(this.app.permissions[PermissionType[this.permissionType]]);
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb index c1ab9b1..4dad86ad1 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb
@@ -688,7 +688,7 @@ <translation id="5623842676595125836">Logg</translation> <translation id="5628125749885014029">rubr4</translation> <translation id="5632083598315326067">Grafisk symbol</translation> -<translation id="5648939288050772726">Grattis! Nu kan du grunderna i att använda ChromeVox. Kom ihåg att du kan öppna kommandomenyn för ChromeVox när som helst genom att trycka på söktangenten + punkt. Om du vill veta ännu mer om ChromeVox och Chrome OS kan du läsa följande artiklar. +<translation id="5648939288050772726">Grattis! Nu kan du grunderna i att använda ChromeVox. Kom ihåg att du kan öppna kommandomenyn för ChromeVox när som helst genom att trycka på söktangenten + punkt. Om du vill veta ännu mer om ChromeVox och ChromeOS kan du läsa följande artiklar. Om du är klar med självstudierna kan du använda ChromeVox till att navigera till stängningsknappen och klicka på den.</translation> <translation id="5653397561111110475">Använda tillgänglighetsfunktioner för pekskärmen på Chromebook</translation> <translation id="5655682562155942719">Hoppkommandon</translation>
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn index cc81b03..c6761ec5 100644 --- a/chrome/browser/resources/chromeos/login/components/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -41,8 +41,6 @@ # Local targets ":api_keys_notice", ":display_manager_types", - ":gaia_button", - ":gaia_dialog", ":hd_iron_icon", ":keyboard_utils", ":keyboard_utils_oobe", @@ -89,30 +87,6 @@ extra_deps = [ ":copy_js" ] } -js_library("gaia_button") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/gaia_button.js" ] - deps = [ - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - ] - externs_list = - [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ] - extra_deps = [ ":web_components" ] -} - -js_library("gaia_dialog") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/gaia_dialog.js" ] - deps = [ - ":oobe_types", - "./behaviors:oobe_dialog_host_behavior", - "./behaviors:oobe_i18n_behavior", - "./dialogs:oobe_content_dialog", - "//ash/webui/common/resources:cr.m", - "//ash/webui/common/resources:load_time_data.m", - "//chrome/browser/resources/gaia_auth_host:authenticator", - ] - extra_deps = [ ":web_components" ] -} - js_library("hd_iron_icon") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/hd_iron_icon.js" ] deps = [ @@ -328,18 +302,16 @@ html_to_wrapper("html_wrapper_files") { in_files = [ - "oobe_icons.html", - "oobe_illo_icons.html", - "oobe_network_icons.html", - ] + "oobe_icons.html", + "oobe_illo_icons.html", + "oobe_network_icons.html", + ] + rebase_path(components_html_files, "./components", ".") use_js = true } html_to_js("web_components_local") { js_files = [ "api_keys_notice.js", - "gaia_button.js", - "gaia_dialog.js", "hd_iron_icon.js", "network_select_login.js", "notification_card.js",
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_button.html b/chrome/browser/resources/chromeos/login/components/gaia_button.html index 23ec25ed..9c058dd 100644 --- a/chrome/browser/resources/chromeos/login/components/gaia_button.html +++ b/chrome/browser/resources/chromeos/login/components/gaia_button.html
@@ -41,7 +41,7 @@ color: var(--cros-color-disabled); } </style> -<cr-button id="button" disabled="[[disabled]]" on-click="onClick_" +<cr-button id="button" disabled="[[disabled]]" on-click="onClick" noink$="[[link]]"> <slot></slot> </cr-button>
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_button.js b/chrome/browser/resources/chromeos/login/components/gaia_button.js deleted file mode 100644 index 7d18a1d..0000000 --- a/chrome/browser/resources/chromeos/login/components/gaia_button.js +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Polymer element wrapping gaia styled button for login/oobe. - */ - -import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/polymer/v3_0/paper-styles/color.js'; - -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - - -/** - * @constructor - * @extends {PolymerElement} - */ -const GaiaButtonBase = mixinBehaviors([], PolymerElement); - -/** - * @typedef {{ - * button: CrButtonElement, - * }} - */ -GaiaButtonBase.$; - -/** @polymer */ -class GaiaButton extends GaiaButtonBase { - static get is() { - return 'gaia-button'; - } - - static get template() { - return html`{__html_template__}`; - } - - static get properties() { - return { - disabled: { - type: Boolean, - reflectToAttribute: true, - value: false, - }, - - link: { - type: Boolean, - reflectToAttribute: true, - observer: 'onLinkChanged_', - value: false, - }, - }; - } - - focus() { - this.$.button.focus(); - } - - /** - * @private - */ - onLinkChanged_() { - this.$.button.classList.toggle('action-button', !this.link); - } - - /** - * @param {!Event} e - * @private - */ - onClick_(e) { - if (this.disabled) { - e.stopPropagation(); - } - } -} - -customElements.define(GaiaButton.is, GaiaButton);
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_button.ts b/chrome/browser/resources/chromeos/login/components/gaia_button.ts new file mode 100644 index 0000000..ebf6f48 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/components/gaia_button.ts
@@ -0,0 +1,77 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Polymer element wrapping gaia styled button for login/oobe. + */ + +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; +import '//resources/polymer/v3_0/paper-styles/color.js'; + +import {CrButtonElement} from '//resources/cr_elements/cr_button/cr_button.js'; +import {assert} from '//resources/js/assert.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './gaia_button.html.js'; + +export const GaiaButtonBase = mixinBehaviors([], PolymerElement); + +export class GaiaButton extends GaiaButtonBase { + static get is() { + return 'gaia-button' as const; + } + + static get template(): HTMLTemplateElement { + return getTemplate(); + } + + static get properties(): PolymerElementProperties { + return { + disabled: { + type: Boolean, + reflectToAttribute: true, + value: false, + }, + + link: { + type: Boolean, + reflectToAttribute: true, + observer: 'onLinkChanged', + value: false, + }, + }; + } + + disabled: boolean; + link: boolean; + + private getButton(): CrButtonElement { + const button = this.shadowRoot?.querySelector('#button'); + assert(button instanceof CrButtonElement); + return button; + } + + override focus(): void { + this.getButton().focus(); + } + + private onLinkChanged(): void { + this.getButton().classList.toggle('action-button', !this.link); + } + + private onClick(e: Event): void { + if (this.disabled) { + e.stopPropagation(); + } + } +} + +declare global { + interface HTMLElementTagNameMap { + [GaiaButton.is]: GaiaButton; + } +} + +customElements.define(GaiaButton.is, GaiaButton);
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_dialog.html b/chrome/browser/resources/chromeos/login/components/gaia_dialog.html index a4eecd3..1a9fef11 100644 --- a/chrome/browser/resources/chromeos/login/components/gaia_dialog.html +++ b/chrome/browser/resources/chromeos/login/components/gaia_dialog.html
@@ -94,12 +94,12 @@ no-buttons$="[[isSamlSsoVisible]]" fullscreen$="[[isSamlSsoVisible]]" isGaia$="[[!isSamlSsoVisible]]"> <div slot="content" id="signin-frame-container" - hideshadows$="[[isPopUpOverlayVisible_]]" + hideshadows$="[[isPopUpOverlayVisible]]" class="flex layout vertical"> <div id="saml-notice-container" class="layout horizontal center" hidden$="[[!isSamlSsoVisible]]"> <cr-icon-button id="saml-back-button" iron-icon="cr:arrow-back" - on-click="close_" hidden="[[isSamlBackButtonHidden_]]"> + on-click="close" hidden="[[samlBackButtonHidden]]"> </cr-icon-button> <div class="flex layout horizontal center-justified"> <span id="saml-notice-recording-indicator" @@ -107,7 +107,7 @@ <img src="chrome://theme/IDR_TAB_RECORDING_INDICATOR"> </span> <span id="saml-notice-message"> - [[getSamlNoticeMessage_(locale, videoEnabled, authDomain)]] + [[getSamlNoticeMessage(locale, videoEnabled, authDomain)]] </span> </div> </div> @@ -121,7 +121,7 @@ <div>[[i18nDynamic(locale, 'samlChangeProviderMessage')]]</div> <oobe-text-button id="change-account" text-key="samlChangeProviderButton" - on-click="onChangeSigninProviderClicked_"> + on-click="onChangeSigninProviderClicked"> </oobe-text-button> </div> </div> @@ -130,74 +130,74 @@ disabled="[[!navigationEnabled]]" hidden="[[isBackButtonHidden(navigationHidden, hideBackButtonIfCantGoBack, canGoBack)]]" - on-click="onBackButtonClicked_"> + on-click="onBackButtonClicked"> </oobe-back-button> </div> <div slot="bottom-buttons" hidden$="[[navigationHidden]]"> - <div hidden="[[!isDefaultNavigationShown_(canGoBack, + <div hidden="[[!isDefaultNavigationShown(canGoBack, gaiaDialogButtonsType)]]" class="flex layout horizontal"> <quick-start-entry-point id="quick-start-signin-button" - on-click="onQuickStartClicked_" - hidden="[[!isQuickStartEnabled_]]" + on-click="onQuickStartClicked" + hidden="[[!isQuickStartEnabled]]" quick-start-text-key="signinScreenQuickStart"> </quick-start-entry-point> <oobe-text-button id="secondary-action-button" - label-for-aria="[[secondaryActionButtonLabel_]]" - on-click="onSecondaryActionButtonClicked_" - hidden$="[[!secondaryActionButtonLabel_]]" - disabled="[[!isButtonEnabled_(navigationEnabled, - secondaryActionButtonEnabled_)]]"> - <div slot="text">[[secondaryActionButtonLabel_]]</div> + label-for-aria="[[secondaryActionButtonLabel]]" + on-click="onSecondaryActionButtonClicked" + hidden$="[[!secondaryActionButtonLabel]]" + disabled="[[!isButtonEnabled(navigationEnabled, + secondaryActionButtonEnabled)]]"> + <div slot="text">[[secondaryActionButtonLabel]]</div> </oobe-text-button> <oobe-text-button id="primary-action-button" - label-for-aria="[[primaryActionButtonLabel_]]" - on-click="onPrimaryActionButtonClicked_" - hidden$="[[!primaryActionButtonLabel_]]" - disabled="[[!isButtonEnabled_(navigationEnabled, - primaryActionButtonEnabled_)]]" + label-for-aria="[[primaryActionButtonLabel]]" + on-click="onPrimaryActionButtonClicked" + hidden$="[[!primaryActionButtonLabel]]" + disabled="[[!isButtonEnabled(navigationEnabled, + primaryActionButtonEnabled)]]" inverse> - <div slot="text">[[primaryActionButtonLabel_]]</div> + <div slot="text">[[primaryActionButtonLabel]]</div> </oobe-text-button> </div> - <div hidden="[[!isEnterpriseNavigationShown_(canGoBack, + <div hidden="[[!isEnterpriseNavigationShown(canGoBack, gaiaDialogButtonsType)]]"> <oobe-text-button id="enterprise-navigation-kiosk" text-key="kioskEnrollmentButton" - on-click="onKioskButtonClicked_" - hidden$="[[!primaryActionButtonLabel_]]" - disabled="[[!isButtonEnabled_(navigationEnabled, - primaryActionButtonEnabled_)]]"> + on-click="onKioskButtonClicked" + hidden$="[[!primaryActionButtonLabel]]" + disabled="[[!isButtonEnabled(navigationEnabled, + primaryActionButtonEnabled)]]"> </oobe-text-button> <oobe-text-button id="enterprise-navigation-enterprise" text-key="enterpriseEnrollmentButton" - on-click="onEnterpriseButtonClicked_" - hidden$="[[!primaryActionButtonLabel_]]" - disabled="[[!isButtonEnabled_(navigationEnabled, - primaryActionButtonEnabled_)]]" + on-click="onEnterpriseButtonClicked" + hidden$="[[!primaryActionButtonLabel]]" + disabled="[[!isButtonEnabled(navigationEnabled, + primaryActionButtonEnabled)]]" inverse> </oobe-text-button> </div> - <div hidden="[[!isKioskNavigationShown_(canGoBack, + <div hidden="[[!isKioskNavigationShown(canGoBack, gaiaDialogButtonsType)]]"> <oobe-text-button id="kiosk-navigation-enterprise" text-key="enterpriseEnrollmentButton" - on-click="onEnterpriseButtonClicked_" - hidden$="[[!primaryActionButtonLabel_]]" - disabled="[[!isButtonEnabled_(navigationEnabled, - primaryActionButtonEnabled_)]]"> + on-click="onEnterpriseButtonClicked" + hidden$="[[!primaryActionButtonLabel]]" + disabled="[[!isButtonEnabled(navigationEnabled, + primaryActionButtonEnabled)]]"> </oobe-text-button> <oobe-text-button id="kiosk-navigation-kiosk" text-key="kioskEnrollmentButton" - on-click="onKioskButtonClicked_" - hidden$="[[!primaryActionButtonLabel_]]" - disabled="[[!isButtonEnabled_(navigationEnabled, - primaryActionButtonEnabled_)]]" + on-click="onKioskButtonClicked" + hidden$="[[!primaryActionButtonLabel]]" + disabled="[[!isButtonEnabled(navigationEnabled, + primaryActionButtonEnabled)]]" inverse> </oobe-text-button> </div> </div> </oobe-content-dialog> <div class="popup-overlay" - hidden="[[!isPopUpOverlayVisible_]]"> + hidden="[[!isPopUpOverlayVisible]]"> </div>
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_dialog.js b/chrome/browser/resources/chromeos/login/components/gaia_dialog.js deleted file mode 100644 index 51a2648..0000000 --- a/chrome/browser/resources/chromeos/login/components/gaia_dialog.js +++ /dev/null
@@ -1,566 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Polymer element to handle Gaia authentication (Gaia webview, - * action buttons, back button events, Gaia dialog beign shown, SAML UI). - * Encapsulates authenticator.js and SAML notice handling. - * - * Events: - * identifierentered: Fired after user types their email. - * loadabort: Fired on the webview error. - * ready: Fired when the webview (not necessarily Gaia) is loaded first time. - * showview: Message from Gaia meaning Gaia UI is ready to be shown. - * startenrollment: User action to start enterprise enrollment. - * closesaml: User closes the dialog on the SAML page. - * backcancel: User presses back button when there is no history in Gaia page. - */ - -import '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; -import '//resources/cr_elements/icons.html.js'; -import '//resources/cr_elements/cr_shared_style.css.js'; -import './buttons/oobe_back_button.js'; -import './buttons/oobe_text_button.js'; -import './common_styles/oobe_common_styles.css.js'; -import './common_styles/oobe_dialog_host_styles.css.js'; -import './dialogs/oobe_content_dialog.js'; -import './quick_start_entry_point.js'; - -import {sendWithPromise} from '//resources/ash/common/cr.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {Authenticator, AuthFlow} from '../../../gaia_auth_host/authenticator.js'; - -import {OobeDialogHostBehavior} from './behaviors/oobe_dialog_host_behavior.js'; -import {OobeI18nBehavior, OobeI18nBehaviorInterface} from './behaviors/oobe_i18n_behavior.js'; -import {OobeTypes} from './oobe_types.js'; - -/** - * @constructor - * @extends {PolymerElement} - * @implements {OobeI18nBehaviorInterface} - */ -const GaiaDialogBase = - mixinBehaviors([OobeI18nBehavior, OobeDialogHostBehavior], PolymerElement); - -const CHROMEOS_GAIA_PASSWORD_METRIC = 'ChromeOS.Gaia.PasswordFlow'; - -/** - * @polymer - */ -export class GaiaDialog extends GaiaDialogBase { - static get is() { - return 'gaia-dialog'; - } - - static get template() { - return html`{__html_template__}`; - } - - static get properties() { - return { - /** - * Whether SAML page uses camera. - */ - videoEnabled: { - type: Boolean, - value: false, - notify: true, - }, - - /** - * Current auth flow. See AuthFlow - */ - authFlow: { - type: Number, - value: 0, - notify: true, - }, - - /** - * Type of bottom buttons. - */ - gaiaDialogButtonsType: { - type: String, - value: OobeTypes.GaiaDialogButtonsType.DEFAULT, - }, - - /** - * Whether the dialog can be closed. - */ - isClosable: { - type: Boolean, - value: false, - }, - - /** - * Whether SAML IdP page is shown - */ - isSamlSsoVisible: { - type: Boolean, - value: false, - }, - - /** - * Whether default SAML IdP is shown. - */ - isDefaultSsoProvider: { - type: Boolean, - value: false, - }, - - /** - * Whether to hide back button if form can't go back. - */ - hideBackButtonIfCantGoBack: { - type: Boolean, - value: false, - }, - - /** - * Used to display SAML notice. - * @private - */ - authDomain: { - type: String, - value: '', - notify: true, - }, - - /** - * Controls navigation buttons enable state. - */ - navigationEnabled: { - type: Boolean, - value: true, - notify: true, - }, - - /** - * Controls navigation buttons visibility. - */ - navigationHidden: { - type: Boolean, - value: false, - }, - - /* Defines name of the webview. Useful for tests. To find Guestview for - * the JSChecker. - */ - webviewName: { - type: String, - }, - - /** - * Controls label on the primary action button. - * @private - */ - primaryActionButtonLabel_: { - type: String, - value: null, - }, - - /** - * Controls availability of the primary action button. - * @private - */ - primaryActionButtonEnabled_: { - type: Boolean, - value: false, - }, - - /** - * Controls label on the secondary action button. - * @private - */ - secondaryActionButtonLabel_: { - type: String, - value: null, - }, - - /** - * Controls availability of the secondary action button. - * @private - */ - secondaryActionButtonEnabled_: { - type: Boolean, - value: false, - }, - - /** - * True if Gaia indicates that it can go back (e.g. on the password page) - */ - canGoBack: { - type: Boolean, - value: false, - notify: true, - }, - - /** - * Whether a pop-up overlay should be shown. This overlay is necessary - * when GAIA shows an overlay within their iframe. It covers the parts - * of the screen that would otherwise not show an overlay. - * @private - */ - isPopUpOverlayVisible_: { - type: Boolean, - computed: 'showOverlay_(navigationEnabled, isSamlSsoVisible)', - }, - - isSamlBackButtonHidden_: { - type: Boolean, - computed: 'isSamlBackButtonHidden(isDefaultSsoProvider, isClosable)', - }, - - /** - * Whether Quick start feature is enabled. If it's enabled the quick start - * button will be shown in the signin screen. - * @type {boolean} - * @private - */ - isQuickStartEnabled_: Boolean, - }; - } - - constructor() { - super(); - /** - * Emulate click on the primary action button when it is visible and - * enabled. - * @type {boolean} - * @private - */ - this.clickPrimaryActionButtonForTesting_ = false; - - /** - * @type {!Authenticator|undefined} - * @private - */ - this.authenticator_ = undefined; - - this.isQuickStartEnabled_ = false; - } - - getAuthenticator() { - return this.authenticator_; - } - - /** @override */ - ready() { - super.ready(); - const webview = /** @type {!WebView} */ (this.$['signin-frame']); - this.authenticator_ = new Authenticator(webview); - /** - * Event listeners for the events triggered by the authenticator. - */ - const authenticatorEventListeners = { - // Note for the lowercase of fired events. - 'identifierEntered': (e) => { - this.dispatchEvent(new CustomEvent( - 'identifierentered', - {bubbles: true, composed: true, detail: e.detail})); - }, - 'loadAbort': (e) => { - this.dispatchEvent(new CustomEvent( - 'webviewerror', {bubbles: true, composed: true, detail: e.detail})); - }, - 'ready': (e) => { - this.dispatchEvent(new CustomEvent( - 'ready', {bubbles: true, composed: true, detail: e.detail})); - }, - 'showView': (e) => { - this.dispatchEvent(new CustomEvent( - 'showview', {bubbles: true, composed: true, detail: e.detail})); - }, - 'menuItemClicked': (e) => { - if (e.detail == 'ee') { - this.dispatchEvent(new CustomEvent( - 'startenrollment', {bubbles: true, composed: true})); - } - }, - 'backButton': (e) => { - this.canGoBack = !!e.detail; - this.getFrame().focus(); - }, - - 'setPrimaryActionEnabled': (e) => { - this.primaryActionButtonEnabled_ = e.detail; - this.maybeClickPrimaryActionButtonForTesting_(); - }, - 'setPrimaryActionLabel': (e) => { - this.primaryActionButtonLabel_ = e.detail; - this.maybeClickPrimaryActionButtonForTesting_(); - }, - 'setSecondaryActionEnabled': (e) => { - this.secondaryActionButtonEnabled_ = e.detail; - }, - 'setSecondaryActionLabel': (e) => { - this.secondaryActionButtonLabel_ = e.detail; - }, - 'setAllActionsEnabled': (e) => { - this.primaryActionButtonEnabled_ = e.detail; - this.secondaryActionButtonEnabled_ = e.detail; - this.maybeClickPrimaryActionButtonForTesting_(); - }, - 'videoEnabledChange': (e) => { - this.videoEnabled = e.detail.newValue; - }, - 'authFlowChange': (e) => { - this.authFlow = e.detail.newValue; - }, - 'authDomainChange': (e) => { - this.authDomain = e.detail.newValue; - }, - 'dialogShown': (e) => { - this.navigationEnabled = false; - chrome.send('enableShelfButtons', [false]); - }, - 'dialogHidden': (e) => { - this.navigationEnabled = true; - chrome.send('enableShelfButtons', [true]); - }, - 'exit': (e) => { - this.dispatchEvent(new CustomEvent( - 'exit', {bubbles: true, composed: true, detail: e.detail})); - }, - 'removeUserByEmail': (e) => { - this.dispatchEvent(new CustomEvent( - 'removeuserbyemail', - {bubbles: true, composed: true, detail: e.detail})); - }, - 'apiPasswordAdded': (e) => { - // Only record the metric for Gaia flow without 3rd-party SAML IdP. - if (this.authFlow !== AuthFlow.DEFAULT) { - return; - } - chrome.send( - 'metricsHandler:recordBooleanHistogram', - [CHROMEOS_GAIA_PASSWORD_METRIC, false]); - chrome.send('passwordEntered'); - }, - 'authCompleted': (e) => { - // Only record the metric for Gaia flow without 3rd-party SAML IdP. - if (this.authFlow === AuthFlow.DEFAULT) { - chrome.send( - 'metricsHandler:recordBooleanHistogram', - [CHROMEOS_GAIA_PASSWORD_METRIC, true]); - } - this.dispatchEvent(new CustomEvent( - 'authcompleted', - {bubbles: true, composed: true, detail: e.detail})); - }, - }; - - for (const eventName in authenticatorEventListeners) { - this.authenticator_.addEventListener( - eventName, authenticatorEventListeners[eventName].bind(this)); - } - - sendWithPromise('getIsSshConfigured') - .then(this.updateSshWarningVisibility.bind(this)); - } - - updateSshWarningVisibility(show) { - this.$.sshWarning.hidden = !show; - } - - show() { - this.navigationEnabled = true; - chrome.send('enableShelfButtons', [true]); - this.getFrame().focus(); - } - - getFrame() { - // Note: Can't use |this.$|, since it returns cached references to elements - // originally present in DOM, while the signin-frame is dynamically - // recreated (see Authenticator.setWebviewPartition()). - return this.shadowRoot.querySelector('#signin-frame'); - } - - clickPrimaryButtonForTesting() { - this.clickPrimaryActionButtonForTesting_ = true; - this.maybeClickPrimaryActionButtonForTesting_(); - } - - maybeClickPrimaryActionButtonForTesting_() { - if (!this.clickPrimaryActionButtonForTesting_) { - return; - } - - const button = this.$['primary-action-button']; - if (button.hidden || button.disabled) { - return; - } - - this.clickPrimaryActionButtonForTesting_ = false; - button.click(); - } - - /* @private */ - getSamlNoticeMessage_(locale, videoEnabled, authDomain) { - if (videoEnabled) { - return this.i18n('samlNoticeWithVideo', authDomain); - } - return this.i18n('samlNotice', authDomain); - } - - /* @private */ - close_() { - this.dispatchEvent( - new CustomEvent('closesaml', {bubbles: true, composed: true})); - } - - /* @private */ - onChangeSigninProviderClicked_() { - this.dispatchEvent(new CustomEvent( - 'changesigninprovider', {bubbles: true, composed: true})); - } - - /* @private */ - onBackButtonClicked_() { - if (this.canGoBack) { - this.getFrame().back(); - return; - } - this.dispatchEvent( - new CustomEvent('backcancel', {bubbles: true, composed: true})); - } - - /** - * Handles clicks on Quick start button. - * @private - */ - onQuickStartClicked_() { - this.dispatchEvent(new CustomEvent( - 'quick-start-clicked', {bubbles: true, composed: true})); - } - - /** - * Handles clicks on "PrimaryAction" button. - * @private - */ - onPrimaryActionButtonClicked_() { - this.authenticator_.sendMessageToWebview('primaryActionHit'); - } - - /** - * Handles clicks on "SecondaryAction" button. - * @private - */ - onSecondaryActionButtonClicked_() { - this.authenticator_.sendMessageToWebview('secondaryActionHit'); - } - - /** - * Handles clicks on Kiosk enrollment button. - * @private - */ - onKioskButtonClicked_() { - this.setLicenseType_(OobeTypes.LicenseType.KIOSK); - this.onPrimaryActionButtonClicked_(); - } - - /** - * Handles clicks on Kiosk enrollment button. - * @private - */ - onEnterpriseButtonClicked_() { - this.setLicenseType_(OobeTypes.LicenseType.ENTERPRISE); - this.onPrimaryActionButtonClicked_(); - } - - /** - * @param {number} licenseType - license to use. - * @private - */ - setLicenseType_(licenseType) { - this.dispatchEvent(new CustomEvent( - 'licensetypeselected', - {bubbles: true, composed: true, detail: licenseType})); - } - - /** - * Whether the button is enabled. - * @param {boolean} navigationEnabled - whether navigation in general is - * enabled. - * @param {boolean} buttonEnabled - whether a specific button is enabled. - * @private - */ - isButtonEnabled_(navigationEnabled, buttonEnabled) { - return navigationEnabled && buttonEnabled; - } - - /** - * Whether the back button is hidden. - * @param {boolean} navigationHidden - whether navigation in general is hidden - * @param {boolean} hideBackButtonIfCantGoBack - whether it should be hidden. - * @param {boolean} canGoBack - whether the form can go back. - * @private - */ - isBackButtonHidden(navigationHidden, hideBackButtonIfCantGoBack, canGoBack) { - return navigationHidden || (hideBackButtonIfCantGoBack && !canGoBack); - } - - /** - * Whether the back button on SAML screen is hidden. - * @param {boolean} isDefaultSsoProvider - whether it is default SAML page. - * @param {boolean} isClosable - whether the form can be closed. - * @private - */ - isSamlBackButtonHidden(isDefaultSsoProvider, isClosable) { - return isDefaultSsoProvider && !isClosable; - } - - /** - * Whether popup overlay should be open. - * @param {boolean} navigationEnabled - * @param {boolean} isSamlSsoVisible - * @return {boolean} - */ - showOverlay_(navigationEnabled, isSamlSsoVisible) { - return !navigationEnabled || isSamlSsoVisible; - } - - /** - * Whether default navigation (original, as gaia has) is shown. - * @param {boolean} canGoBack - * @param {string} gaiaDialogButtonsType - * @return {boolean} - * @private - */ - isDefaultNavigationShown_(canGoBack, gaiaDialogButtonsType) { - return !canGoBack || - gaiaDialogButtonsType == OobeTypes.GaiaDialogButtonsType.DEFAULT; - } - - /** - * Whether Enterprise navigation is shown. Two buttons: primary for - * Enterprise enrollment and secondary for Kiosk enrollment. - * @param {boolean} canGoBack - * @param {string} gaiaDialogButtonsType - * @return {boolean} - * @private - */ - isEnterpriseNavigationShown_(canGoBack, gaiaDialogButtonsType) { - return canGoBack && - gaiaDialogButtonsType == - OobeTypes.GaiaDialogButtonsType.ENTERPRISE_PREFERRED; - } - - /** - * Whether Kiosk navigation is shown. Two buttons: primary for - * Kiosk enrollment and secondary for Enterprise enrollment. - * @param {boolean} canGoBack - * @param {string} gaiaDialogButtonsType - * @return {boolean} - * @private - */ - isKioskNavigationShown_(canGoBack, gaiaDialogButtonsType) { - return canGoBack && - gaiaDialogButtonsType == - OobeTypes.GaiaDialogButtonsType.KIOSK_PREFERRED; - } -} - -customElements.define(GaiaDialog.is, GaiaDialog);
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_dialog.ts b/chrome/browser/resources/chromeos/login/components/gaia_dialog.ts new file mode 100644 index 0000000..fbe8dd95 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/components/gaia_dialog.ts
@@ -0,0 +1,567 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Polymer element to handle Gaia authentication (Gaia webview, + * action buttons, back button events, Gaia dialog beign shown, SAML UI). + * Encapsulates authenticator.js and SAML notice handling. + * + * Events: + * identifierentered: Fired after user types their email. + * loadabort: Fired on the webview error. + * ready: Fired when the webview (not necessarily Gaia) is loaded first time. + * showview: Message from Gaia meaning Gaia UI is ready to be shown. + * startenrollment: User action to start enterprise enrollment. + * closesaml: User closes the dialog on the SAML page. + * backcancel: User presses back button when there is no history in Gaia page. + */ + +import '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import '//resources/cr_elements/icons.html.js'; +import '//resources/cr_elements/cr_shared_style.css.js'; +import './buttons/oobe_back_button.js'; +import './buttons/oobe_text_button.js'; +import './common_styles/oobe_common_styles.css.js'; +import './common_styles/oobe_dialog_host_styles.css.js'; +import './dialogs/oobe_content_dialog.js'; +import './quick_start_entry_point.js'; + +import {Authenticator, AuthFlow} from '//oobe/gaia_auth_host/authenticator.js'; +import {assert} from '//resources/js/assert.js'; +import {sendWithPromise} from '//resources/js/cr.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {OobeDialogHostBehavior, OobeDialogHostBehaviorInterface} from './behaviors/oobe_dialog_host_behavior.js'; +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from './behaviors/oobe_i18n_behavior.js'; +import type {OobeTextButton} from './buttons/oobe_text_button.js'; +import {getTemplate} from './gaia_dialog.html.js'; +import {OobeTypes} from './oobe_types.js'; + +export const GaiaDialogBase = + mixinBehaviors( + [OobeI18nBehavior, OobeDialogHostBehavior], PolymerElement) as { + new (): PolymerElement & OobeI18nBehaviorInterface & + OobeDialogHostBehaviorInterface, + }; + +const CHROMEOS_GAIA_PASSWORD_METRIC = 'ChromeOS.Gaia.PasswordFlow'; + +export class GaiaDialog extends GaiaDialogBase { + static get is() { + return 'gaia-dialog' as const; + } + + static get template(): HTMLTemplateElement { + return getTemplate(); + } + + static get properties(): PolymerElementProperties { + return { + /** + * Whether SAML page uses camera. + */ + videoEnabled: { + type: Boolean, + value: false, + notify: true, + }, + + /** + * Current auth flow. See AuthFlow + */ + authFlow: { + type: Number, + value: 0, + notify: true, + }, + + /** + * Type of bottom buttons. + */ + gaiaDialogButtonsType: { + type: String, + value: OobeTypes.GaiaDialogButtonsType.DEFAULT, + }, + + /** + * Whether the dialog can be closed. + */ + isClosable: { + type: Boolean, + value: false, + }, + + /** + * Whether SAML IdP page is shown + */ + isSamlSsoVisible: { + type: Boolean, + value: false, + }, + + /** + * Whether default SAML IdP is shown. + */ + isDefaultSsoProvider: { + type: Boolean, + value: false, + }, + + /** + * Whether to hide back button if form can't go back. + */ + hideBackButtonIfCantGoBack: { + type: Boolean, + value: false, + }, + + /** + * Used to display SAML notice. + */ + authDomain: { + type: String, + value: '', + notify: true, + }, + + /** + * Controls navigation buttons enable state. + */ + navigationEnabled: { + type: Boolean, + value: true, + notify: true, + }, + + /** + * Controls navigation buttons visibility. + */ + navigationHidden: { + type: Boolean, + value: false, + }, + + /* Defines name of the webview. Useful for tests. To find Guestview for + * the JSChecker. + */ + webviewName: { + type: String, + }, + + /** + * Controls label on the primary action button. + */ + primaryActionButtonLabel: { + type: String, + value: null, + }, + + /** + * Controls availability of the primary action button. + */ + primaryActionButtonEnabled: { + type: Boolean, + value: false, + }, + + /** + * Controls label on the secondary action button. + */ + secondaryActionButtonLabel: { + type: String, + value: null, + }, + + /** + * Controls availability of the secondary action button. + */ + secondaryActionButtonEnabled: { + type: Boolean, + value: false, + }, + + /** + * True if Gaia indicates that it can go back (e.g. on the password page) + */ + canGoBack: { + type: Boolean, + value: false, + notify: true, + }, + + /** + * Whether a pop-up overlay should be shown. This overlay is necessary + * when GAIA shows an overlay within their iframe. It covers the parts + * of the screen that would otherwise not show an overlay. + */ + isPopUpOverlayVisible: { + type: Boolean, + computed: 'showOverlay(navigationEnabled, isSamlSsoVisible)', + }, + + samlBackButtonHidden: { + type: Boolean, + computed: 'isSamlBackButtonHidden(isDefaultSsoProvider, isClosable)', + }, + + /** + * Whether Quick start feature is enabled. If it's enabled the quick start + * button will be shown in the signin screen. + */ + isQuickStartEnabled: Boolean, + }; + } + + private videoEnabled: boolean; + private authFlow: number; + private gaiaDialogButtonsType: OobeTypes.GaiaDialogButtonsType; + private isClosable: boolean; + private isSamlSsoVisible: boolean; + private isDefaultSsoProvider: boolean; + private hideBackButtonIfCantGoBack: boolean; + private authDomain: string; + private navigationEnabled: boolean; + private navigationHidden: boolean; + private webviewName: string; + private primaryActionButtonLabel: string; + private primaryActionButtonEnabled: boolean; + private secondaryActionButtonLabel: string; + private secondaryActionButtonEnabled: boolean; + private canGoBack: boolean; + private isPopUpOverlayVisible: boolean; + private samlBackButtonHidden: boolean; + isQuickStartEnabled: boolean; + private clickPrimaryActionButtonForTesting: boolean; + private authenticator: Authenticator|undefined; + + constructor() { + super(); + /** + * Emulate click on the primary action button when it is visible and + * enabled. + */ + this.clickPrimaryActionButtonForTesting = false; + + this.authenticator = undefined; + + this.isQuickStartEnabled = false; + } + + getAuthenticator(): Authenticator|undefined { + return this.authenticator; + } + + override ready(): void { + super.ready(); + const webview = this.getFrame(); + this.authenticator = new Authenticator(webview); + /** + * Event listeners for the events triggered by the authenticator. + */ + const authenticatorEventListeners: Record<string, (e: any) => void> = { + // Note for the lowercase of fired events. + 'identifierEntered': (e: CustomEvent) => { + this.dispatchEvent(new CustomEvent( + 'identifierentered', + {bubbles: true, composed: true, detail: e.detail})); + }, + 'loadAbort': (e: CustomEvent) => { + this.dispatchEvent(new CustomEvent( + 'webviewerror', {bubbles: true, composed: true, detail: e.detail})); + }, + 'ready': () => { + this.dispatchEvent( + new CustomEvent('ready', {bubbles: true, composed: true})); + }, + 'showView': () => { + this.dispatchEvent( + new CustomEvent('showview', {bubbles: true, composed: true})); + }, + 'menuItemClicked': (e: CustomEvent) => { + if (e.detail == 'ee') { + this.dispatchEvent(new CustomEvent( + 'startenrollment', {bubbles: true, composed: true})); + } + }, + 'backButton': (e: CustomEvent) => { + this.canGoBack = !!e.detail; + this.getFrame().focus(); + }, + + 'setPrimaryActionEnabled': (e: CustomEvent) => { + this.primaryActionButtonEnabled = e.detail; + this.maybeClickPrimaryActionButtonForTesting(); + }, + 'setPrimaryActionLabel': (e: CustomEvent) => { + this.primaryActionButtonLabel = e.detail; + this.maybeClickPrimaryActionButtonForTesting(); + }, + 'setSecondaryActionEnabled': (e: CustomEvent) => { + this.secondaryActionButtonEnabled = e.detail; + }, + 'setSecondaryActionLabel': (e: CustomEvent) => { + this.secondaryActionButtonLabel = e.detail; + }, + 'setAllActionsEnabled': (e: CustomEvent) => { + this.primaryActionButtonEnabled = e.detail; + this.secondaryActionButtonEnabled = e.detail; + this.maybeClickPrimaryActionButtonForTesting(); + }, + 'videoEnabledChange': (e: CustomEvent) => { + this.videoEnabled = e.detail.newValue; + }, + 'authFlowChange': (e: CustomEvent) => { + this.authFlow = e.detail.newValue; + }, + 'authDomainChange': (e: CustomEvent) => { + this.authDomain = e.detail.newValue; + }, + 'dialogShown': () => { + this.navigationEnabled = false; + chrome.send('enableShelfButtons', [false]); + }, + 'dialogHidden': () => { + this.navigationEnabled = true; + chrome.send('enableShelfButtons', [true]); + }, + 'exit': () => { + this.dispatchEvent( + new CustomEvent('exit', {bubbles: true, composed: true})); + }, + 'removeUserByEmail': (e: CustomEvent) => { + this.dispatchEvent(new CustomEvent( + 'removeuserbyemail', + {bubbles: true, composed: true, detail: e.detail})); + }, + 'apiPasswordAdded': () => { + // Only record the metric for Gaia flow without 3rd-party SAML IdP. + if (this.authFlow !== AuthFlow.DEFAULT) { + return; + } + chrome.send( + 'metricsHandler:recordBooleanHistogram', + [CHROMEOS_GAIA_PASSWORD_METRIC, false]); + chrome.send('passwordEntered'); + }, + 'authCompleted': (e: CustomEvent) => { + // Only record the metric for Gaia flow without 3rd-party SAML IdP. + if (this.authFlow === AuthFlow.DEFAULT) { + chrome.send( + 'metricsHandler:recordBooleanHistogram', + [CHROMEOS_GAIA_PASSWORD_METRIC, true]); + } + this.dispatchEvent(new CustomEvent( + 'authcompleted', + {bubbles: true, composed: true, detail: e.detail})); + }, + }; + + for (const eventName in authenticatorEventListeners) { + this.authenticator.addEventListener( + eventName, authenticatorEventListeners[eventName].bind(this)); + } + + sendWithPromise('getIsSshConfigured') + .then(this.updateSshWarningVisibility.bind(this)); + } + + private updateSshWarningVisibility(show: boolean): void { + const sshWarning = this.shadowRoot?.querySelector('#sshWarning'); + if (sshWarning instanceof HTMLElement) { + sshWarning.hidden = !show; + } + } + + show(): void { + this.navigationEnabled = true; + chrome.send('enableShelfButtons', [true]); + this.getFrame().focus(); + } + + getFrame(): chrome.webviewTag.WebView { + const frame = this.shadowRoot?.querySelector('#signin-frame'); + assert(!!frame); + return frame as chrome.webviewTag.WebView; + } + + clickPrimaryButtonForTesting(): void { + this.clickPrimaryActionButtonForTesting = true; + this.maybeClickPrimaryActionButtonForTesting(); + } + + maybeClickPrimaryActionButtonForTesting(): void { + if (!this.clickPrimaryActionButtonForTesting) { + return; + } + + const button = this.shadowRoot!.querySelector<OobeTextButton>( + '#primary-action-button')!; + if (button.hidden || button.disabled) { + return; + } + + this.clickPrimaryActionButtonForTesting = false; + button.click(); + } + + private getSamlNoticeMessage( + locale: string, videoEnabled: boolean, authDomain: string): string { + if (videoEnabled) { + return this.i18nDynamic(locale, 'samlNoticeWithVideo', authDomain); + } + return this.i18nDynamic(locale, 'samlNotice', authDomain); + } + + private close(): void { + this.dispatchEvent( + new CustomEvent('closesaml', {bubbles: true, composed: true})); + } + + private onChangeSigninProviderClicked(): void { + this.dispatchEvent(new CustomEvent( + 'changesigninprovider', {bubbles: true, composed: true})); + } + + private onBackButtonClicked(): void { + if (this.canGoBack) { + this.getFrame().back(); + return; + } + this.dispatchEvent( + new CustomEvent('backcancel', {bubbles: true, composed: true})); + } + + /** + * Handles clicks on Quick start button. + */ + private onQuickStartClicked(): void { + this.dispatchEvent(new CustomEvent( + 'quick-start-clicked', {bubbles: true, composed: true})); + } + + /** + * Handles clicks on "PrimaryAction" button. + */ + private onPrimaryActionButtonClicked(): void { + assert(this.authenticator); + this.authenticator.sendMessageToWebview('primaryActionHit'); + } + + /** + * Handles clicks on "SecondaryAction" button. + */ + private onSecondaryActionButtonClicked(): void { + assert(this.authenticator); + this.authenticator.sendMessageToWebview('secondaryActionHit'); + } + + /** + * Handles clicks on Kiosk enrollment button. + */ + private onKioskButtonClicked(): void { + this.setLicenseType(OobeTypes.LicenseType.KIOSK); + this.onPrimaryActionButtonClicked(); + } + + /** + * Handles clicks on Kiosk enrollment button. + */ + private onEnterpriseButtonClicked(): void { + this.setLicenseType(OobeTypes.LicenseType.ENTERPRISE); + this.onPrimaryActionButtonClicked(); + } + + /** + * @param licenseType - license to use. + */ + private setLicenseType(licenseType: OobeTypes.LicenseType): void { + this.dispatchEvent(new CustomEvent( + 'licensetypeselected', + {bubbles: true, composed: true, detail: licenseType})); + } + + /** + * Whether the button is enabled. + * @param navigationEnabled - whether navigation in general is + * enabled. + * @param buttonEnabled - whether a specific button is enabled. + */ + private isButtonEnabled(navigationEnabled: boolean, buttonEnabled: boolean): + boolean { + return navigationEnabled && buttonEnabled; + } + + /** + * Whether the back button is hidden. + * @param navigationHidden - whether navigation in general is hidden + * @param hideBackButtonIfCantGoBack - whether it should be hidden. + * @param canGoBack - whether the form can go back. + */ + private isBackButtonHidden( + navigationHidden: boolean, hideBackButtonIfCantGoBack: boolean, + canGoBack: boolean): boolean { + return navigationHidden || (hideBackButtonIfCantGoBack && !canGoBack); + } + + /** + * Whether the back button on SAML screen is hidden. + * @param isDefaultSsoProvider - whether it is default SAML page. + * @param isClosable - whether the form can be closed. + */ + private isSamlBackButtonHidden( + isDefaultSsoProvider: boolean, isClosable: boolean): boolean { + return isDefaultSsoProvider && !isClosable; + } + + /** + * Whether popup overlay should be open. + */ + private showOverlay(navigationEnabled: boolean, isSamlSsoVisible: boolean): + boolean { + return !navigationEnabled || isSamlSsoVisible; + } + + /** + * Whether default navigation (original, as gaia has) is shown. + */ + private isDefaultNavigationShown( + canGoBack: boolean, + gaiaDialogButtonsType: OobeTypes.GaiaDialogButtonsType): boolean { + return !canGoBack || + gaiaDialogButtonsType == OobeTypes.GaiaDialogButtonsType.DEFAULT; + } + + /** + * Whether Enterprise navigation is shown. Two buttons: primary for + * Enterprise enrollment and secondary for Kiosk enrollment. + */ + private isEnterpriseNavigationShown( + canGoBack: boolean, + gaiaDialogButtonsType: OobeTypes.GaiaDialogButtonsType): boolean { + return canGoBack && + gaiaDialogButtonsType == + OobeTypes.GaiaDialogButtonsType.ENTERPRISE_PREFERRED; + } + + /** + * Whether Kiosk navigation is shown. Two buttons: primary for + * Kiosk enrollment and secondary for Enterprise enrollment. + */ + private isKioskNavigationShown( + canGoBack: boolean, + gaiaDialogButtonsType: OobeTypes.GaiaDialogButtonsType): boolean { + return canGoBack && + gaiaDialogButtonsType == + OobeTypes.GaiaDialogButtonsType.KIOSK_PREFERRED; + } +} + +declare global { + interface HTMLElementTagNameMap { + [GaiaDialog.is]: GaiaDialog; + } +} + +customElements.define(GaiaDialog.is, GaiaDialog);
diff --git a/chrome/browser/resources/chromeos/login/display_manager.js b/chrome/browser/resources/chromeos/login/display_manager.js index e9a9c372..153ce4b 100644 --- a/chrome/browser/resources/chromeos/login/display_manager.js +++ b/chrome/browser/resources/chromeos/login/display_manager.js
@@ -415,6 +415,7 @@ /** * Trigger of play down animation for current screen step. + * @suppress {missingProperties} defaultControl may be not defined. */ triggerDown() { const innerContainer = $('inner-container');
diff --git a/chrome/browser/resources/chromeos/login/login.gni b/chrome/browser/resources/chromeos/login/login.gni index eb80391..925bcb8 100644 --- a/chrome/browser/resources/chromeos/login/login.gni +++ b/chrome/browser/resources/chromeos/login/login.gni
@@ -54,8 +54,6 @@ "components/dialogs/oobe_modal_dialog.js", "components/oobe_vars/oobe_shared_vars.css.js", "components/api_keys_notice.js", - "components/gaia_button.js", - "components/gaia_dialog.js", "components/hd_iron_icon.js", "components/network_select_login.js", "components/notification_card.js", @@ -143,8 +141,8 @@ # Template used by the `tools/oobe/generate_screen_template.py` script. "screens/common/placeholder.ts", - "screens/common/recommend_apps.js", - "screens/common/saml_confirm_password.js", + "screens/common/recommend_apps.ts", + "screens/common/saml_confirm_password.ts", "screens/common/signin_fatal_error.js", "screens/common/smart_privacy_protection.ts", "screens/common/sync_consent.ts", @@ -203,7 +201,7 @@ "screens/osauth/gaia_password_changed.ts", "screens/osauth/local_password_setup.ts", "screens/osauth/local_data_loss_warning.ts", - "screens/osauth/enter_old_password.js", + "screens/osauth/enter_old_password.ts", "screens/osauth/osauth_error.js", "screens/osauth/password_selection.ts", "screens/osauth/pin_setup.ts", @@ -245,7 +243,11 @@ buttons_ts_files += [ "components/buttons/oobe_base_button.ts" ] -components_ts_files = [ "components/oobe_apps_list.ts" ] +components_ts_files = [ + "components/gaia_button.ts", + "components/gaia_dialog.ts", + "components/oobe_apps_list.ts", +] components_html_files = [] foreach(f, components_ts_files) {
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index 894714bf..4803a773 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -26,8 +26,6 @@ ":consolidated_consent", ":error_message", ":offline_ad_login", - ":recommend_apps", - ":saml_confirm_password", ":signin_fatal_error", ] } @@ -80,35 +78,6 @@ # Template used by the `tools/oobe/generate_screen_template.py` script. -js_library("recommend_apps") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js" ] - deps = [ - "../../components:oobe_types", - "../../components/behaviors:login_screen_behavior", - "../../components/behaviors:multi_step_behavior", - "../../components/behaviors:oobe_dialog_host_behavior", - "../../components/behaviors:oobe_i18n_behavior", - "../../components/dialogs:oobe_adaptive_dialog", - "../../components/dialogs:oobe_loading_dialog", - "//ash/webui/common/resources:assert", - "//ash/webui/common/resources:load_time_data.m", - ] - externs_list = [ "$externs_path/webview_tag.js" ] - extra_deps = [ ":web_components" ] -} - -js_library("saml_confirm_password") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js" ] - deps = [ - "../../:login_ui_tools", - "../../components/behaviors:oobe_i18n_behavior", - "../../components/dialogs:oobe_adaptive_dialog", - "../../components/dialogs:oobe_loading_dialog", - "../../components/dialogs:oobe_modal_dialog", - ] - extra_deps = [ ":web_components" ] -} - js_library("signin_fatal_error") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js" ] deps = [
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts index 2dd8fbb..5d9e37b 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts +++ b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.ts
@@ -1087,7 +1087,7 @@ const gaiaDialog = this.shadowRoot?.querySelector<GaiaDialog>('#signin-frame-dialog'); assert(!!gaiaDialog); - gaiaDialog.isQuickStartEnabled_ = true; + gaiaDialog.isQuickStartEnabled = true; } private recordUmaHistogramForEnrollmentNudgeUserAction(
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.html b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.html index 2a7a014e..818ba56c 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.html +++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.html
@@ -30,9 +30,9 @@ [[i18nDynamic(locale, 'recommendAppsScreenDescription')]] </div> <div id="app-list-view-container" slot="content"> - <oobe-apps-list id="appsList" app-list="[[appList_]]" - apps-selected="{{appsSelected_}}" - on-apps-list-loaded="onFullyLoaded_"> + <oobe-apps-list id="appsList" app-list="[[appList]]" + apps-selected="{{appsSelected}}" + on-apps-list-loaded="onFullyLoaded"> <div slot="selectAllTitle"> [[i18nDynamic(locale, 'recommendAppsSelectAll')]] </div> @@ -40,11 +40,11 @@ </div> <div slot="bottom-buttons"> <oobe-text-button id="skipButton" - text-key="recommendAppsSkip" on-click="onSkip_" border> + text-key="recommendAppsSkip" on-click="onSkip" border> </oobe-text-button> - <oobe-text-button id="installButton" on-click="onInstall_" inverse + <oobe-text-button id="installButton" on-click="onInstall" inverse text-key="recommendAppsInstall" - disabled="[[!canProceed_(appsSelected_)]]"> + disabled="[[!canProceed(appsSelected)]]"> </oobe-text-button> </div> </oobe-adaptive-dialog>
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js deleted file mode 100644 index 932e9d2..0000000 --- a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js +++ /dev/null
@@ -1,211 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Polymer element for displaying material design Recommend Apps - * screen. - */ - -import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; -import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import '../../components/common_styles/oobe_dialog_host_styles.css.js'; -import '../../components/buttons/oobe_text_button.js'; - -import {assert, assertNotReached} from '//resources/ash/common/assert.js'; -import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; -import {html, mixinBehaviors, Polymer, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; -import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; -import {OobeDialogHostBehavior} from '../../components/behaviors/oobe_dialog_host_behavior.js'; -import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeAdaptiveDialog} from '../../components/dialogs/oobe_adaptive_dialog.js'; -import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; -import {OobeAppsList} from '../../components/oobe_apps_list.js'; - -import {getTemplate} from './recommend_apps.html.js'; - - - -/** - * UI mode for the dialog. - * @enum {string} - */ -const RecommendAppsUiState = { - LOADING: 'loading', - LIST: 'list', -}; - -const BLANK_PAGE_URL = 'about:blank'; - -/** - * @constructor - * @extends {PolymerElement} - * @implements {LoginScreenBehaviorInterface} - * @implements {MultiStepBehaviorInterface} - * @implements {OobeI18nBehaviorInterface} - */ -const RecommendAppsElementBase = mixinBehaviors( - [ - OobeI18nBehavior, - OobeDialogHostBehavior, - LoginScreenBehavior, - MultiStepBehavior, - ], - PolymerElement); - -/** - * @typedef {{ - * appsDialog: OobeAdaptiveDialog, - * appView: WebView, - * }} - */ -RecommendAppsElementBase.$; - -/** - * @polymer - */ -class RecommendAppsElement extends RecommendAppsElementBase { - - static get is() { - return 'recommend-apps-element'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - appsSelected_: { - type: Number, - value: 0, - }, - - appList_: { - type: Array, - value: [], - }, - }; - } - - constructor() { - super(); - this.initialized_ = false; - } - - get EXTERNAL_API() { - return ['loadAppList']; - } - - get UI_STEPS() { - return RecommendAppsUiState; - } - - ready() { - super.ready(); - this.initializeLoginScreen('RecommendAppsScreen'); - } - - /** - * Resets screen to initial state. - * Currently is used for debugging purposes only. - */ - reset() { - this.setUIStep(RecommendAppsUiState.LOADING); - this.appsSelected_ = 0; - this.appList_ = []; - } - - /** - * Returns the control which should receive initial focus. - */ - get defaultControl() { - return /** @type {HTMLElement} */ (this.$.appsDialog); - } - - defaultUIStep() { - return RecommendAppsUiState.LOADING; - } - - /** - * Initial UI State for screen - */ - getOobeUIInitialState() { - return OOBE_UI_STATE.ONBOARDING; - } - - onBeforeHide() { - this.appList_ = []; - return; - } - - /** - * Generates the contents in the webview. - */ - loadAppList(appList) { - const recommendAppsContainsAdsStr = this.i18n('recommendAppsContainsAds'); - const recommendAppsInAppPurchasesStr = - this.i18n('recommendAppsInAppPurchases'); - const recommendAppsWasInstalledStr = this.i18n('recommendAppsWasInstalled'); - this.appList_ = appList.map(app => { - const tagList = [app.category]; - if (app.contains_ads) { - tagList.push(recommendAppsContainsAdsStr); - } - if (app.in_app_purchases) { - tagList.push(recommendAppsInAppPurchasesStr); - } - if (app.was_installed) { - tagList.push(recommendAppsWasInstalledStr); - } - if (app.content_rating) { - tagList.push(app.content_rating); - } - return { - title: app.title, - icon_url: app.icon_url, - tags: tagList, - description: app.description, - package_name: app.package_name, - checked: false, - }; - }); - return; - } - - /** - * Handles event when contents in the webview is generated. - */ - onFullyLoaded_() { - this.setUIStep(RecommendAppsUiState.LIST); - this.shadowRoot.querySelector('#appsList').focus(); - } - - /** - * Handles Skip button click. - */ - onSkip_() { - this.userActed('recommendAppsSkip'); - } - - /** - * Handles Install button click. - */ - onInstall_() { - // Button should be disabled if nothing is selected. - assert(this.appsSelected_ > 0); - // Can't use this.$.appsList here as the element is in a <dom-if>. - const appsList = this.shadowRoot.querySelector('#appsList'); - /** @suppress {checkTypes} */ - const packageNames = appsList.getSelectedApps(); - this.userActed(['recommendAppsInstall', packageNames]); - } - - canProceed_(appsSelected) { - return appsSelected > 0; - } -} - -customElements.define(RecommendAppsElement.is, RecommendAppsElement);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.ts b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.ts new file mode 100644 index 0000000..9ca32ca --- /dev/null +++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.ts
@@ -0,0 +1,230 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Polymer element for displaying material design Recommend Apps + * screen. + */ + +import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import '../../components/common_styles/oobe_dialog_host_styles.css.js'; +import '../../components/buttons/oobe_text_button.js'; +import '../../components/oobe_apps_list.js'; + +import {assert} from '//resources/js/assert.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; +import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; +import {OobeDialogHostBehavior, OobeDialogHostBehaviorInterface} from '../../components/behaviors/oobe_dialog_host_behavior.js'; +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; +import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; +import {OobeAppsList} from '../../components/oobe_apps_list.js'; + +import {getTemplate} from './recommend_apps.html.js'; + +enum RecommendAppsUiState { + LOADING = 'loading', + LIST = 'list', +} + +interface AppFetchedData { + title: string; + icon_url: string; + category: string; + in_app_purchases: boolean; + was_installed: boolean; + content_rating: string; + description: string; + contains_ads: boolean; + package_name: string; +} + +interface AppData { + title: string; + icon_url: string; + tags: string[]; + description: string; + package_name: string; + checked: boolean; +} + +const RecommendAppsElementBase = mixinBehaviors( + [ + OobeI18nBehavior, + OobeDialogHostBehavior, + LoginScreenBehavior, + MultiStepBehavior, + ], + PolymerElement) as { + new (): + PolymerElement & OobeI18nBehaviorInterface & + LoginScreenBehaviorInterface & OobeDialogHostBehaviorInterface & + MultiStepBehaviorInterface, + }; + +class RecommendAppsElement extends RecommendAppsElementBase { + static get is() { + return 'recommend-apps-element' as const; + } + + static get template(): HTMLTemplateElement { + return getTemplate(); + } + + static get properties(): PolymerElementProperties { + return { + appsSelected: { + type: Number, + value: 0, + }, + + appList: { + type: Array, + value: [], + }, + }; + } + + appsSelected: number; + appList: AppData[]; + initialized: boolean; + + constructor() { + super(); + this.initialized = false; + } + + override get EXTERNAL_API(): string[] { + return ['loadAppList']; + } + + override get UI_STEPS() { + return RecommendAppsUiState; + } + + override ready(): void { + super.ready(); + this.initializeLoginScreen('RecommendAppsScreen'); + } + + /** + * Resets screen to initial state. + * Currently is used for debugging purposes only. + */ + reset(): void { + this.setUIStep(RecommendAppsUiState.LOADING); + this.appsSelected = 0; + this.appList = []; + } + + /** + * Returns the control which should receive initial focus. + */ + override get defaultControl(): HTMLElement|null { + const appsDialog = this.shadowRoot?.querySelector<HTMLElement>( + '#appsDialog'); + if (appsDialog instanceof HTMLElement) { + return appsDialog; + } + return null; + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + override defaultUIStep(): string { + return RecommendAppsUiState.LOADING; + } + + /** + * Initial UI State for screen + */ + // eslint-disable-next-line @typescript-eslint/naming-convention + override getOobeUIInitialState(): number { + return OOBE_UI_STATE.ONBOARDING; + } + + onBeforeHide(): void { + this.appList = []; + } + + /** + * Generates the contents in the webview. + */ + loadAppList(appList: AppFetchedData[]): void { + const recommendAppsContainsAdsStr = this.i18n('recommendAppsContainsAds'); + const recommendAppsInAppPurchasesStr = + this.i18n('recommendAppsInAppPurchases'); + const recommendAppsWasInstalledStr = this.i18n('recommendAppsWasInstalled'); + this.appList = appList.map((app: AppFetchedData) => { + const tagList = [app.category]; + if (app.contains_ads) { + tagList.push(recommendAppsContainsAdsStr); + } + if (app.in_app_purchases) { + tagList.push(recommendAppsInAppPurchasesStr); + } + if (app.was_installed) { + tagList.push(recommendAppsWasInstalledStr); + } + if (app.content_rating) { + tagList.push(app.content_rating); + } + return { + title: app.title, + icon_url: app.icon_url, + tags: tagList, + description: app.description, + package_name: app.package_name, + checked: false, + }; + }); + } + + /** + * Handles event when contents in the webview is generated. + */ + private onFullyLoaded(): void { + this.setUIStep(RecommendAppsUiState.LIST); + const appsList = this.shadowRoot?.querySelector<HTMLElement>( + '#appsList'); + if (appsList instanceof HTMLElement) { + appsList.focus(); + } + } + + /** + * Handles Skip button click. + */ + private onSkip(): void { + this.userActed('recommendAppsSkip'); + } + + /** + * Handles Install button click. + */ + private onInstall(): void { + // Button should be disabled if nothing is selected. + assert(this.appsSelected > 0); + const appsList = this.shadowRoot?.querySelector( + '#appsList'); + if (appsList instanceof OobeAppsList) { + const packageNames = appsList.getSelectedApps(); + this.userActed(['recommendAppsInstall', packageNames]); + } + } + + private canProceed(appsSelected: number): boolean { + return appsSelected > 0; + } +} + +declare global { + interface HTMLElementTagNameMap { + [RecommendAppsElement.is]: RecommendAppsElement; + } +} + +customElements.define(RecommendAppsElement.is, RecommendAppsElement);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.html b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.html index 4dae1d6..fa6b9e0 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.html +++ b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.html
@@ -36,13 +36,13 @@ <iron-icon slot="icon" icon="oobe-32:lock"></iron-icon> <h1 id="title" slot="title">[[email]]</h1> <p id="subtitle" slot="subtitle"> - [[subtitleText_(locale, isManualInput)]] + [[subtitleText(locale, isManualInput)]] </p> <div slot="content" class="landscape-vertical-centered"> <cr-input type="password" id="passwordInput" required class="focus-on-show" - placeholder="[[passwordPlaceholder_(locale, isManualInput)]]" - error-message="[[passwordErrorText_(locale, isManualInput)]]"> + placeholder="[[passwordPlaceholder(locale, isManualInput)]]" + error-message="[[passwordErrorText(locale, isManualInput)]]"> </cr-input> <cr-input type="password" id="confirmPasswordInput" required hidden="[[!isManualInput]]" @@ -51,10 +51,10 @@ </cr-input> </div> <div slot="bottom-buttons"> - <oobe-text-button id="cancel" on-click="onCancel_" text-key="cancel" + <oobe-text-button id="cancel" on-click="onCancel" text-key="cancel" border> </oobe-text-button> - <oobe-next-button id="next" on-click="submit_" inverse> + <oobe-next-button id="next" on-click="submit" inverse> </oobe-next-button> </div> </oobe-adaptive-dialog> @@ -67,10 +67,10 @@ [[i18nDynamic(locale, 'accountSetupCancelDialogTitle')]] </div> <div slot="buttons"> - <cr-button class="action-button" on-click="onCancelNo_"> + <cr-button class="action-button" on-click="onCancelNo"> [[i18nDynamic(locale, 'accountSetupCancelDialogNo')]] </cr-button> - <cr-button class="cancel-button focus-on-show" on-click="onCancelYes_"> + <cr-button class="cancel-button focus-on-show" on-click="onCancelYes"> [[i18nDynamic(locale, 'accountSetupCancelDialogYes')]] </cr-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js deleted file mode 100644 index 07a9923..0000000 --- a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js +++ /dev/null
@@ -1,210 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; -import '//resources/cr_elements/cr_shared_style.css.js'; -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/cr_elements/cr_input/cr_input.js'; -import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import '../../components/oobe_icons.html.js'; -import '../../components/common_styles/oobe_common_styles.css.js'; -import '../../components/common_styles/oobe_dialog_host_styles.css.js'; -import '../../components/dialogs/oobe_adaptive_dialog.js'; -import '../../components/dialogs/oobe_loading_dialog.js'; -import '../../components/buttons/oobe_next_button.js'; -import '../../components/buttons/oobe_text_button.js'; - -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; -import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; -import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeModalDialog} from '../../components/dialogs/oobe_modal_dialog.js'; -import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; -import {addSubmitListener} from '../../login_ui_tools.js'; - -import {getTemplate} from './saml_confirm_password.html.js'; - - -/** - * UI mode for the dialog. - * @enum {string} - */ -const SamlConfirmPasswordState = { - PASSWORD: 'password', - PROGRESS: 'progress', -}; - -/** - * @constructor - * @extends {PolymerElement} - * @implements {LoginScreenBehaviorInterface} - * @implements {MultiStepBehaviorInterface} - * @implements {OobeI18nBehaviorInterface} - */ -const SamlConfirmPasswordBase = mixinBehaviors( - [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], PolymerElement); - -/** - * @typedef {{ - * passwordInput: CrInputElement, - * confirmPasswordInput: CrInputElement, - * cancelConfirmDlg: OobeModalDialog - * }} - */ -SamlConfirmPasswordBase.$; - -/** - * Data that is passed to the screen during onBeforeShow. - * @typedef {{ - * email: string, - * manualPasswordInput: boolean, - * }} - */ -let SamlConfirmPasswordScreenData; - -/** - * @polymer - */ -class SamlConfirmPassword extends SamlConfirmPasswordBase { - static get is() { - return 'saml-confirm-password-element'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - email: { - type: String, - value: '', - }, - - isManualInput: { - type: Boolean, - value: false, - }, - }; - } - - constructor() { - super(); - } - - get EXTERNAL_API() { - return ['showPasswordStep']; - } - - defaultUIStep() { - return SamlConfirmPasswordState.PROGRESS; - } - - get UI_STEPS() { - return SamlConfirmPasswordState; - } - - ready() { - super.ready(); - this.initializeLoginScreen('ConfirmSamlPasswordScreen'); - - addSubmitListener(this.$.passwordInput, this.submit_.bind(this)); - addSubmitListener(this.$.confirmPasswordInput, this.submit_.bind(this)); - } - - /** Initial UI State for screen */ - getOobeUIInitialState() { - return OOBE_UI_STATE.SAML_PASSWORD_CONFIRM; - } - - /** - * Event handler that is invoked just before the screen is shown. - * @param {SamlConfirmPasswordScreenData} data Screen init payload - */ - onBeforeShow(data) { - this.reset_(); - this.email = data['email']; - this.isManualInput = data['manualPasswordInput']; - } - - showPasswordStep(retry) { - if (retry) { - this.reset_(); - this.$.passwordInput.invalid = true; - } - this.setUIStep(SamlConfirmPasswordState.PASSWORD); - } - - resetFields_() { - this.$.passwordInput.invalid = false; - this.$.passwordInput.value = ''; - if (this.isManualInput) { - this.shadowRoot.querySelector('#confirmPasswordInput').invalid = false; - this.shadowRoot.querySelector('#confirmPasswordInput').value = ''; - } - } - - reset_() { - if (this.$.cancelConfirmDlg.open) { - this.$.cancelConfirmDlg.hideDialog(); - } - this.resetFields_(); - } - - - onCancel_() { - this.$.cancelConfirmDlg.showDialog(); - } - - onCancelNo_() { - this.$.cancelConfirmDlg.hideDialog(); - } - - onCancelYes_() { - this.$.cancelConfirmDlg.hideDialog(); - this.userActed('cancel'); - } - - submit_() { - if (!this.$.passwordInput.validate()) { - return; - } - if (this.isManualInput) { - // When using manual password entry, both passwords must match. - const confirmPasswordInput = - this.shadowRoot.querySelector('#confirmPasswordInput'); - if (!confirmPasswordInput.validate()) { - return; - } - - if (confirmPasswordInput.value != this.$.passwordInput.value) { - this.$.passwordInput.invalid = true; - confirmPasswordInput.invalid = true; - return; - } - } - this.setUIStep(SamlConfirmPasswordState.PROGRESS); - this.userActed(['inputPassword', this.$.passwordInput.value]); - this.resetFields_(); - } - - subtitleText_(locale, manual) { - const key = manual ? 'manualPasswordTitle' : 'confirmPasswordTitle'; - return this.i18n(key); - } - - passwordPlaceholder_(locale, manual) { - const key = manual ? 'manualPasswordInputLabel' : 'confirmPasswordLabel'; - return this.i18n(key); - } - - passwordErrorText_(locale, manual) { - const key = - manual ? 'manualPasswordMismatch' : 'confirmPasswordIncorrectPassword'; - return this.i18n(key); - } -} - -customElements.define(SamlConfirmPassword.is, SamlConfirmPassword);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.ts b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.ts new file mode 100644 index 0000000..0d241f3 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.ts
@@ -0,0 +1,224 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; +import '//resources/cr_elements/cr_shared_style.css.js'; +import '//resources/cr_elements/cr_button/cr_button.js'; +import '//resources/cr_elements/cr_input/cr_input.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import '../../components/oobe_icons.html.js'; +import '../../components/common_styles/oobe_common_styles.css.js'; +import '../../components/common_styles/oobe_dialog_host_styles.css.js'; +import '../../components/dialogs/oobe_adaptive_dialog.js'; +import '../../components/dialogs/oobe_loading_dialog.js'; +import '../../components/buttons/oobe_next_button.js'; +import '../../components/buttons/oobe_text_button.js'; + +import {CrInputElement} from '//resources/cr_elements/cr_input/cr_input.js'; +import {assert} from '//resources/js/assert.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; +import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; +import {OobeModalDialog} from '../../components/dialogs/oobe_modal_dialog.js'; +import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; +import {addSubmitListener} from '../../login_ui_tools.js'; + +import {getTemplate} from './saml_confirm_password.html.js'; + +enum SamlConfirmPasswordState { + PASSWORD = 'password', + PROGRESS = 'progress', +} + +const SamlConfirmPasswordBase = + mixinBehaviors( + [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], + PolymerElement) as { + new (): PolymerElement & OobeI18nBehaviorInterface & + LoginScreenBehaviorInterface & MultiStepBehaviorInterface, + }; + +interface SamlConfirmPasswordScreenData { + email: string; + manualPasswordInput: boolean; +} + +class SamlConfirmPassword extends SamlConfirmPasswordBase { + static get is() { + return 'saml-confirm-password-element' as const; + } + + static get template(): HTMLTemplateElement { + return getTemplate(); + } + + static get properties(): PolymerElementProperties { + return { + email: { + type: String, + value: '', + }, + + isManualInput: { + type: Boolean, + value: false, + }, + }; + } + + email: string; + isManualInput: boolean; + + constructor() { + super(); + } + + override get EXTERNAL_API(): string[] { + return ['showPasswordStep']; + } + + // eslint-disable-next-line @typescript-eslint/naming-convention + override defaultUIStep(): string { + return SamlConfirmPasswordState.PROGRESS; + } + + override get UI_STEPS() { + return SamlConfirmPasswordState; + } + + override ready(): void { + super.ready(); + this.initializeLoginScreen('ConfirmSamlPasswordScreen'); + + addSubmitListener(this.getPasswordInput(), this.submit.bind(this)); + addSubmitListener(this.getConfirmPasswordInput(), this.submit.bind(this)); + } + + /** Initial UI State for screen */ + // eslint-disable-next-line @typescript-eslint/naming-convention + override getOobeUIInitialState(): number { + return OOBE_UI_STATE.SAML_PASSWORD_CONFIRM; + } + + /** + * Event handler that is invoked just before the screen is shown. + * @param data Screen init payload + */ + onBeforeShow(data: SamlConfirmPasswordScreenData) { + this.reset(); + this.email = data['email']; + this.isManualInput = data['manualPasswordInput']; + } + + showPasswordStep(retry: boolean): void { + if (retry) { + this.reset(); + this.getPasswordInput().invalid = true; + } + this.setUIStep(SamlConfirmPasswordState.PASSWORD); + } + + private resetFields(): void { + const passwordInput = this.getPasswordInput(); + passwordInput.invalid = false; + passwordInput.value = ''; + if (this.isManualInput) { + const confirmPasswordInput = this.getConfirmPasswordInput(); + confirmPasswordInput.invalid = false; + confirmPasswordInput.value = ''; + } + } + + private reset(): void { + const cancelConfirmDialog = this.getCancelConfirmDialog(); + if (cancelConfirmDialog.open) { + cancelConfirmDialog.hideDialog(); + } + this.resetFields(); + } + + private onCancel(): void { + this.getCancelConfirmDialog().showDialog(); + } + + private onCancelNo(): void { + this.getCancelConfirmDialog().hideDialog(); + } + + private onCancelYes(): void { + this.getCancelConfirmDialog().hideDialog(); + this.userActed('cancel'); + } + + private submit(): void { + const passwordInput = this.getPasswordInput(); + if (!passwordInput.validate()) { + return; + } + if (this.isManualInput) { + // When using manual password entry, both passwords must match. + const confirmPasswordInput = this.getConfirmPasswordInput(); + if (!confirmPasswordInput.validate()) { + return; + } + + if (confirmPasswordInput.value != passwordInput.value) { + passwordInput.invalid = true; + confirmPasswordInput.invalid = true; + return; + } + } + this.setUIStep(SamlConfirmPasswordState.PROGRESS); + this.userActed(['inputPassword', passwordInput.value]); + this.resetFields(); + } + + private subtitleText(locale: string, manual: boolean): string { + const key = manual ? 'manualPasswordTitle' : 'confirmPasswordTitle'; + return this.i18nDynamic(locale, key); + } + + private passwordPlaceholder(locale: string, manual: boolean): string { + const key = manual ? 'manualPasswordInputLabel' : 'confirmPasswordLabel'; + return this.i18nDynamic(locale, key); + } + + private passwordErrorText(locale: string, manual: boolean): string { + const key = + manual ? 'manualPasswordMismatch' : 'confirmPasswordIncorrectPassword'; + return this.i18nDynamic(locale, key); + } + + private getPasswordInput(): CrInputElement { + const passwordInput = + this.shadowRoot?.querySelector<CrInputElement>('#passwordInput'); + assert(passwordInput instanceof CrInputElement); + return passwordInput; + } + + private getConfirmPasswordInput(): CrInputElement { + const confirmPasswordInput = + this.shadowRoot?.querySelector<CrInputElement>('#confirmPasswordInput'); + assert(confirmPasswordInput instanceof CrInputElement); + return confirmPasswordInput; + } + + private getCancelConfirmDialog(): OobeModalDialog { + const cancelConfirmDialog = + this.shadowRoot?.querySelector<OobeModalDialog>('#cancelConfirmDlg'); + assert(cancelConfirmDialog instanceof OobeModalDialog); + return cancelConfirmDialog; + } +} + +declare global { + interface HTMLElementTagNameMap { + [SamlConfirmPassword.is]: SamlConfirmPassword; + } +} + +customElements.define(SamlConfirmPassword.is, SamlConfirmPassword);
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.ts b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.ts index ec8a0cd..506a266a6 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.ts +++ b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.ts
@@ -294,13 +294,12 @@ return skipConfirmationDialog; } - get authenticator(): Authenticator { + get authenticator(): Authenticator|undefined { return this.getGaiaDialog().getAuthenticator(); } get authView(): chrome.webviewTag.WebView { - // TODO(b/314762562): remove type cast once gaia_dialog is migrated to TS. - return this.getGaiaDialog().getFrame() as chrome.webviewTag.WebView; + return this.getGaiaDialog().getFrame(); } override ready(): void { @@ -347,6 +346,7 @@ 'oauthEnrollAdUnlockConfiguration', [e.detail.unlock_password]); }); + assert(this.authenticator); this.authenticator.insecureContentBlockedCallback = (url: string) => { this.showError( loadTimeData.getStringF('insecureURLEnrollmentError', url), false); @@ -356,9 +356,11 @@ this.showError(loadTimeData.getString('fatalEnrollmentError'), false); }; - this.authenticator.addEventListener('getDeviceId', (_e: Event) => { - sendWithPromise('getDeviceIdForEnrollment') - .then(deviceId => this.authenticator.getDeviceIdResponse(deviceId)); + this.authenticator.addEventListener('getDeviceId', () => { + sendWithPromise('getDeviceIdForEnrollment').then(deviceId => { + assert(this.authenticator); + this.authenticator.getDeviceIdResponse(deviceId); + }); }); } @@ -418,6 +420,7 @@ gaiaParams.email = data.email; } + assert(this.authenticator); this.authenticator.setWebviewPartition( data.webviewPartitionName ? data.webviewPartitionName : ''); @@ -529,6 +532,7 @@ } doReload(): void { + assert(this.authenticator); this.authenticator.reload(); }
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn index 0181d81f..cc5f6f8 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/osauth/BUILD.gn
@@ -9,10 +9,7 @@ js_type_check("closure_compile") { is_polymer3 = true closure_flags = default_closure_args - deps = [ - ":enter_old_password", - ":osauth_error", - ] + deps = [ ":osauth_error" ] } js_library("osauth_error") { @@ -27,21 +24,6 @@ extra_deps = [ ":web_components" ] } -js_library("enter_old_password") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js" ] - deps = [ - "../../components/behaviors:login_screen_behavior", - "../../components/behaviors:multi_step_behavior", - "../../components/behaviors:oobe_dialog_host_behavior", - "../../components/behaviors:oobe_i18n_behavior", - "../../components/dialogs:oobe_adaptive_dialog", - "../../components/dialogs:oobe_loading_dialog", - ] - externs_list = - [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ] - extra_deps = [ ":web_components" ] -} - group("web_components") { public_deps = [ ":copy_js",
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.html b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.html index 085beb0..349a26a1 100644 --- a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.html +++ b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.html
@@ -32,17 +32,17 @@ [[i18nDynamic(locale, 'recoverLocalDataSubtitle')]] </div> <cr-input slot="subtitle" type="password" id="oldPasswordInput" - value="{{password_}}" invalid="{{passwordInvalid}}" + value="{{password}}" invalid="{{passwordInvalid}}" required class="focus-on-show" placeholder="[[i18nDynamic(locale, 'oldPasswordHint')]]" error-message="[[i18nDynamic(locale, 'oldPasswordIncorrect')]]"> </cr-input> <div slot="bottom-buttons"> <oobe-text-button id="forgotPasswordButton" - on-click="onForgotPasswordClicked_" + on-click="onForgotPasswordClicked" text-key="forgotOldPasswordButton"> </oobe-text-button> - <oobe-next-button id="next" on-click="submit_" inverse> + <oobe-next-button id="next" on-click="submit" inverse> </oobe-next-button> </div> </oobe-adaptive-dialog>
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js deleted file mode 100644 index d2ac60d..0000000 --- a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.js +++ /dev/null
@@ -1,179 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; -import '//resources/cr_elements/cr_input/cr_input.js'; -import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js'; -import '../../components/oobe_icons.html.js'; -import '../../components/buttons/oobe_next_button.js'; -import '../../components/common_styles/oobe_common_styles.css.js'; -import '../../components/common_styles/oobe_dialog_host_styles.css.js'; -import '../../components/dialogs/oobe_adaptive_dialog.js'; -import '../../components/dialogs/oobe_loading_dialog.js'; -import '../../components/buttons/oobe_text_button.js'; - -import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; -import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; -import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; -import {addSubmitListener} from '../../login_ui_tools.js'; - -import {getTemplate} from './enter_old_password.html.js'; - - -/** - * UI mode for the dialog. - * @enum {string} - */ -const EnterOldPasswordUIState = { - PASSWORD: 'password', - PROGRESS: 'progress', -}; - -/** - * @constructor - * @extends {PolymerElement} - * @implements {LoginScreenBehaviorInterface} - * @implements {OobeI18nBehaviorInterface} - * @implements {MultiStepBehaviorInterface} - */ -const EnterOldPasswordBase = mixinBehaviors( - [OobeI18nBehavior, LoginScreenBehavior, MultiStepBehavior], PolymerElement); - -/** - * @typedef {{ - * oldPasswordInput: CrInputElement, - * }} - */ -EnterOldPasswordBase.$; - -/** - * @polymer - */ -class EnterOldPassword extends EnterOldPasswordBase { - static get is() { - return 'enter-old-password-element'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - password_: { - type: String, - value: '', - }, - - passwordInvalid: { - type: Boolean, - value: false, - }, - - disabled: { - type: Boolean, - value: false, - }, - - passwordInput_: Object, - }; - } - - defaultUIStep() { - return EnterOldPasswordUIState.PASSWORD; - } - - get UI_STEPS() { - return EnterOldPasswordUIState; - } - - /** Overridden from LoginScreenBehavior. */ - // clang-format off - get EXTERNAL_API() { - return [ - 'showWrongPasswordError', - ]; - } - // clang-format on - - /** - * @override - */ - ready() { - super.ready(); - this.initializeLoginScreen('EnterOldPasswordScreen'); - - this.passwordInput_ = this.$.oldPasswordInput; - addSubmitListener(this.passwordInput_, this.submit_.bind(this)); - } - - /** Initial UI State for screen */ - getOobeUIInitialState() { - return OOBE_UI_STATE.PASSWORD_CHANGED; - } - - /** - * Invoked just before being shown. Contains all the data for the screen. - */ - onBeforeShow(data) { - this.reset(); - } - - reset() { - this.setUIStep(EnterOldPasswordUIState.PASSWORD); - this.clearPassword(); - this.disabled = false; - } - - /** - * Called when Screen fails to authenticate with - * provided password. - */ - showWrongPasswordError() { - this.clearPassword(); - this.disabled = false; - this.passwordInvalid = true; - this.setUIStep(EnterOldPasswordUIState.PASSWORD); - } - - /** - * @private - */ - submit_() { - if (this.disabled) { - return; - } - if (!this.passwordInput_.validate()) { - return; - } - this.setUIStep(EnterOldPasswordUIState.PROGRESS); - this.disabled = true; - this.userActed(['submit', this.passwordInput_.value]); - } - - /** @private */ - onForgotPasswordClicked_() { - if (this.disabled) { - return; - } - this.userActed('forgot'); - } - - /** @private */ - onAnimationFinish_() { - this.focus(); - } - - clearPassword() { - this.password_ = ''; - this.passwordInvalid = false; - } -} - -customElements.define(EnterOldPassword.is, EnterOldPassword);
diff --git a/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.ts b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.ts new file mode 100644 index 0000000..14c52be --- /dev/null +++ b/chrome/browser/resources/chromeos/login/screens/osauth/enter_old_password.ts
@@ -0,0 +1,179 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import '//resources/cr_elements/chromeos/cros_color_overrides.css.js'; +import '//resources/cr_elements/cr_input/cr_input.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js'; +import '../../components/oobe_icons.html.js'; +import '../../components/buttons/oobe_next_button.js'; +import '../../components/common_styles/oobe_common_styles.css.js'; +import '../../components/common_styles/oobe_dialog_host_styles.css.js'; +import '../../components/dialogs/oobe_adaptive_dialog.js'; +import '../../components/dialogs/oobe_loading_dialog.js'; +import '../../components/buttons/oobe_text_button.js'; + +import {CrInputElement} from '//resources/cr_elements/cr_input/cr_input.js'; +import {assert} from '//resources/js/assert.js'; +import {PolymerElementProperties} from '//resources/polymer/v3_0/polymer/interfaces.js'; +import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; +import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; +import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; +import {addSubmitListener} from '../../login_ui_tools.js'; + +import {getTemplate} from './enter_old_password.html.js'; + + +/** + * UI mode for the dialog. + */ +enum EnterOldPasswordUiState { + PASSWORD = 'password', + PROGRESS = 'progress', +} + + +const EnterOldPasswordBase = mixinBehaviors( + [ + OobeI18nBehavior, + LoginScreenBehavior, + MultiStepBehavior, + ], + PolymerElement) as { + new (): PolymerElement & OobeI18nBehaviorInterface & + LoginScreenBehaviorInterface & MultiStepBehaviorInterface, +}; + + +export class EnterOldPassword extends EnterOldPasswordBase { + static get is() { + return 'enter-old-password-element' as const; + } + + static get template(): HTMLTemplateElement { + return getTemplate(); + } + + static get properties(): PolymerElementProperties { + return { + password: { + type: String, + value: '', + }, + + passwordInvalid: { + type: Boolean, + value: false, + }, + + disabled: { + type: Boolean, + value: false, + }, + + passwordInput: Object, + }; + } + + private password: string; + private passwordInvalid: boolean; + private disabled: boolean; + private passwordInput: CrInputElement; + + // eslint-disable-next-line @typescript-eslint/naming-convention + override defaultUIStep(): EnterOldPasswordUiState { + return EnterOldPasswordUiState.PASSWORD; + } + + override get UI_STEPS() { + return EnterOldPasswordUiState; + } + + /** Overridden from LoginScreenBehavior. */ + override get EXTERNAL_API(): string[] { + return [ + 'showWrongPasswordError', + ]; + } + + override ready(): void { + super.ready(); + this.initializeLoginScreen('EnterOldPasswordScreen'); + + const oldpasswordInput = + this.shadowRoot?.querySelector<CrInputElement>('#oldPasswordInput'); + assert(oldpasswordInput instanceof CrInputElement); + this.passwordInput = oldpasswordInput; + addSubmitListener(this.passwordInput, this.submit.bind(this)); + } + + /** Initial UI State for screen */ + // eslint-disable-next-line @typescript-eslint/naming-convention + override getOobeUIInitialState(): OOBE_UI_STATE { + return OOBE_UI_STATE.PASSWORD_CHANGED; + } + + /** + * Invoked just before being shown. + */ + onBeforeShow(): void { + this.reset(); + } + + private reset(): void { + this.setUIStep(EnterOldPasswordUiState.PASSWORD); + this.clearPassword(); + this.disabled = false; + } + + /** + * Called when Screen fails to authenticate with + * provided password. + */ + showWrongPasswordError(): void { + this.clearPassword(); + this.disabled = false; + this.passwordInvalid = true; + this.setUIStep(EnterOldPasswordUiState.PASSWORD); + } + + private submit(): void { + if (this.disabled) { + return; + } + if (!this.passwordInput.validate()) { + return; + } + this.setUIStep(EnterOldPasswordUiState.PROGRESS); + this.disabled = true; + this.userActed(['submit', this.passwordInput.value]); + } + + private onForgotPasswordClicked(): void { + if (this.disabled) { + return; + } + this.userActed('forgot'); + } + + private onAnimationFinish(): void { + this.focus(); + } + + private clearPassword(): void { + this.password = ''; + this.passwordInvalid = false; + } +} + +declare global { + interface HTMLElementTagNameMap { + [EnterOldPassword.is]: EnterOldPassword; + } +} + +customElements.define(EnterOldPassword.is, EnterOldPassword);
diff --git a/chrome/browser/resources/on_device_internals/app.ts b/chrome/browser/resources/on_device_internals/app.ts index d63e37b..0ebf09ab 100644 --- a/chrome/browser/resources/on_device_internals/app.ts +++ b/chrome/browser/resources/on_device_internals/app.ts
@@ -183,7 +183,8 @@ const {result} = await this.proxy_.handler.loadModel( {path: processedPath}, newModel.$.bindNewPipeAndPassReceiver()); if (result !== LoadModelResult.kSuccess) { - this.error_ = 'Unable to load model'; + this.error_ = + 'Unable to load model. Specify a correct and absolute path.'; } else { this.model_ = newModel; this.model_.onConnectionError.addListener(() => {
diff --git a/chrome/browser/resources/search_engine_choice/OWNERS b/chrome/browser/resources/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/chrome/browser/resources/search_engine_choice/OWNERS +++ b/chrome/browser/resources/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts b/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts index 7586f4b..73410eb 100644 --- a/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts +++ b/chrome/browser/resources/settings/search_page/search_engine_list_dialog.ts
@@ -78,6 +78,14 @@ this.browserProxy_.setDefaultSearchEngine( searchEngine.modelIndex, ChoiceMadeLocation.SEARCH_SETTINGS); + + this.dispatchEvent(new CustomEvent('search-engine-changed', { + bubbles: true, + composed: true, + detail: { + searchEngine: searchEngine, + }, + })); this.$.dialog.close(); }
diff --git a/chrome/browser/resources/settings/search_page/search_page.html b/chrome/browser/resources/settings/search_page/search_page.html index 6ea20906..db1d2e43 100644 --- a/chrome/browser/resources/settings/search_page/search_page.html +++ b/chrome/browser/resources/settings/search_page/search_page.html
@@ -71,11 +71,15 @@ <template is="dom-if" if="[[showSearchEngineListDialog_]]" restamp> <settings-search-engine-list-dialog search-engines="[[searchEngines_]]" - on-close="onSearchEngineListDialogClose_"> + on-close="onSearchEngineListDialogClose_" + on-search-engine-changed="onDefaultSearchEngineChangedInDialog_"> </settings-search-engine-list-dialog> </template> </div> </div> + <cr-toast id="confirmationToast" duration="10000"> + <div>[[confirmationToastLabel_]]</div> + </cr-toast> </template> <template is="dom-if" if="[[!searchEngineChoiceSettingsUi_]]"> <div id="searchExplanation" class="flex cr-padded-text">
diff --git a/chrome/browser/resources/settings/search_page/search_page.ts b/chrome/browser/resources/settings/search_page/search_page.ts index 1abbda1..d938f47 100644 --- a/chrome/browser/resources/settings/search_page/search_page.ts +++ b/chrome/browser/resources/settings/search_page/search_page.ts
@@ -8,6 +8,7 @@ */ import 'chrome://resources/cr_elements/policy/cr_policy_pref_indicator.js'; import 'chrome://resources/cr_elements/cr_shared_style.css.js'; +import 'chrome://resources/cr_elements/cr_toast/cr_toast.js'; import 'chrome://resources/cr_elements/cr_shared_vars.css.js'; import 'chrome://resources/cr_elements/md_select.css.js'; import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; @@ -19,6 +20,8 @@ import '../settings_vars.css.js'; import '../site_favicon.js'; +import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js'; +import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; @@ -32,7 +35,7 @@ import {getTemplate} from './search_page.html.js'; const SettingsSearchPageElementBase = - BaseMixin(WebUiListenerMixin(PolymerElement)); + BaseMixin(WebUiListenerMixin(I18nMixin(PolymerElement))); export class SettingsSearchPageElement extends SettingsSearchPageElementBase { static get is() { @@ -83,6 +86,10 @@ // Boolean to check whether we need to show the dialog or not. showSearchEngineListDialog_: Boolean, + + // The label of the confirmation toast that is displayed when the user + // chooses a default search engine. + confirmationToastLabel_: String, }; } @@ -96,6 +103,7 @@ private browserProxy_: SearchEnginesBrowserProxy = SearchEnginesBrowserProxyImpl.getInstance(); private useLargeSearchEngineIcons_: boolean; + private confirmationToastLabel_: string; override ready() { super.ready(); @@ -165,6 +173,13 @@ chrome.metricsPrivate.recordUserAction('ChooseDefaultSearchEngine'); } + private onDefaultSearchEngineChangedInDialog_(e: CustomEvent) { + this.confirmationToastLabel_ = this.i18n( + 'searchEnginesConfirmationToastLabel', e.detail.searchEngine.name); + this.shadowRoot!.querySelector<CrToastElement>( + '#confirmationToast')!.show(); + } + private onSearchEngineListDialogClose_() { assert(this.searchEngineChoiceSettingsUi_); this.showSearchEngineListDialog_ = false;
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts index 1212e2fe..3c1822b 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts
@@ -297,6 +297,9 @@ private isHighlightOn_: boolean = true; private activeButton_: HTMLElement|null; + private toolbarContainerObserver_: ResizeObserver|null; + private dragResizeCallback_: () => void; + // If Read Aloud is in the paused state. This is set from the parent element // via one way data binding. private readonly paused: boolean; @@ -324,7 +327,13 @@ assert(shadowRoot); const toolbar = shadowRoot.getElementById('toolbar-container'); assert(toolbar); - new ResizeObserver(this.onToolbarResize_).observe(toolbar); + + this.toolbarContainerObserver_ = + new ResizeObserver(this.onToolbarResize_); + this.toolbarContainerObserver_.observe(toolbar); + + this.dragResizeCallback_ = this.onDragResize_.bind(this); + window.addEventListener('resize', this.dragResizeCallback_); } this.textStyleOptions_ = this.textStyleOptions_.concat(this.moreOptionsButtons_); @@ -332,6 +341,21 @@ this.updateFonts(); } + override disconnectedCallback() { + super.disconnectedCallback(); + if (this.dragResizeCallback_) { + window.removeEventListener('resize', this.dragResizeCallback_); + } + this.toolbarContainerObserver_?.disconnect(); + } + + private onDragResize_() { + const toolbar = + this.shadowRoot?.getElementById('toolbar-container') as HTMLElement; + assert(toolbar); + ReadAnythingToolbarElement.maybeUpdateMoreOptions(toolbar); + } + private onToolbarResize_(entries: ResizeObserverEntry[]) { assert(entries.length === 1); const toolbar = entries[0].target as HTMLElement;
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_data_pipe_getter.h b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_data_pipe_getter.h index 0c54c6c..afd345c 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_data_pipe_getter.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_data_pipe_getter.h
@@ -10,6 +10,7 @@ #include "base/files/file.h" #include "base/files/memory_mapped_file.h" +#include "base/memory/raw_ptr.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/shared_memory_mapping.h" #include "base/time/time.h" @@ -58,9 +59,8 @@ base::File file_; - // This field is not a raw_ptr<> because it always points to a mmap'd - // region of memory outside of the PA heap. Thus, there would be overhead - // involved with using a raw_ptr<> but no safety gains. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION uint8_t* data_ = nullptr; size_t length_ = 0; };
diff --git a/chrome/browser/search_engine_choice/OWNERS b/chrome/browser/search_engine_choice/OWNERS index 43f43af..5d7e015 100644 --- a/chrome/browser/search_engine_choice/OWNERS +++ b/chrome/browser/search_engine_choice/OWNERS
@@ -1,3 +1 @@ -dgn@chromium.org -droger@chromium.org -jyammine@google.com +file://components/search_engines/search_engine_choice/OWNERS \ No newline at end of file
diff --git a/chrome/browser/sharing/sharing_dialog_data.h b/chrome/browser/sharing/sharing_dialog_data.h index 56e4d52..7032100 100644 --- a/chrome/browser/sharing/sharing_dialog_data.h +++ b/chrome/browser/sharing/sharing_dialog_data.h
@@ -11,7 +11,7 @@ #include <vector> #include "base/functional/callback.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "chrome/browser/sharing/sharing_app.h" #include "chrome/browser/sharing/sharing_metrics.h" #include "chrome/browser/sharing/sharing_target_device_info.h" @@ -30,12 +30,8 @@ // work on any background color. struct HeaderIcons { HeaderIcons(const gfx::VectorIcon* light, const gfx::VectorIcon* dark); - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION const gfx::VectorIcon* light; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION const gfx::VectorIcon* dark; + raw_ptr<const gfx::VectorIcon> light; + raw_ptr<const gfx::VectorIcon> dark; }; SharingDialogData(); ~SharingDialogData();
diff --git a/chrome/browser/supervised_user/android/supervised_user_settings_test_bridge.cc b/chrome/browser/supervised_user/android/supervised_user_settings_test_bridge.cc index 81d204c..0af6b30a 100644 --- a/chrome/browser/supervised_user/android/supervised_user_settings_test_bridge.cc +++ b/chrome/browser/supervised_user/android/supervised_user_settings_test_bridge.cc
@@ -18,6 +18,7 @@ #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/signin/public/identity_manager/identity_test_utils.h" +#include "components/supervised_user/core/browser/kids_chrome_management_url_checker_client.h" #include "components/supervised_user/core/browser/proto/kidschromemanagement_messages.pb.h" #include "components/supervised_user/core/browser/supervised_user_service.h" #include "components/supervised_user/core/browser/supervised_user_settings_service.h" @@ -107,8 +108,12 @@ supervised_user::SupervisedUserService* supervised_user_service = SupervisedUserServiceFactory::GetForProfile(profile); - supervised_user_service->GetURLFilter()->InitAsyncURLChecker( - identity_manager, shared_url_loader_factory); + + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client = + std::make_unique<supervised_user::KidsChromeManagementURLCheckerClient>( + identity_manager, shared_url_loader_factory, ""); + supervised_user_service->GetURLFilter()->SetURLCheckerClientForTesting( + std::move(url_checker_client)); } void JNI_SupervisedUserSettingsTestBridge_SetSafeSearchResponseForTesting( // IN-TEST
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc index 0e13b33..5250bec 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
@@ -918,14 +918,10 @@ filter->SetDefaultFilteringBehavior( supervised_user::FilteringBehavior::kBlock); - // The async checker will make rpc calls to check if the url should be - // blocked or not. This may cause flakiness. - filter->ClearAsyncURLChecker(); - base::RunLoop().RunUntilIdle(); // Allows |www.example.com|. - AllowlistHost(kExampleHost); + AllowlistHost("*.example.*"); // |with_frames_same_domain.html| contains subframes with "a.example.com" and // "b.example.com", and "c.example2.com" urls.
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_unittest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_unittest.cc index 453f895..9cd5fc24 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_unittest.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_unittest.cc
@@ -8,13 +8,13 @@ #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/safe_search_api/fake_url_checker_client.h" #include "components/supervised_user/core/browser/supervised_user_service.h" #include "components/supervised_user/core/browser/supervised_user_url_filter.h" #include "components/supervised_user/core/common/features.h" #include "components/supervised_user/core/common/supervised_user_constants.h" #include "components/supervised_user/core/common/supervised_user_utils.h" #include "components/supervised_user/test_support/kids_management_api_server_mock.h" -#include "components/supervised_user/test_support/supervised_user_url_filter_test_utils.h" #include "content/public/browser/navigation_throttle.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/navigation_simulator.h" @@ -31,8 +31,8 @@ explicit MockSupervisedUserURLFilter(PrefService& prefs) : supervised_user::SupervisedUserURLFilter( prefs, - base::BindRepeating([](const GURL& url) { return false; }), - std::make_unique<supervised_user::FakeURLFilterDelegate>()) {} + std::make_unique<safe_search_api::FakeURLCheckerClient>(), + base::BindRepeating([](const GURL& url) { return false; })) {} MOCK_METHOD(FilteringBehavior, GetFilteringBehaviorForURL, @@ -83,7 +83,10 @@ }; TEST_F(SupervisedUserNavigationThrottleTest, AllowedUrlsRecordedInAllowBucket) { - CreateNavigationThrottle(GURL(kExampleURL))->WillStartRequest(); + GURL allowed_url(kExampleURL); + std::map<std::string, bool> hosts{{allowed_url.host(), true}}; + GetSupervisedUserURLFilter()->SetManualHosts(std::move(hosts)); + CreateNavigationThrottle(allowed_url)->WillStartRequest(); histogram_tester()->ExpectBucketCount( supervised_user::kSupervisedUserTopLevelURLFilteringResultHistogramName,
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc b/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc index d1f9d06..b37d02c 100644 --- a/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc +++ b/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc
@@ -12,6 +12,7 @@ #include "base/test/task_environment.h" #include "chrome/browser/supervised_user/supervised_user_browser_utils.h" #include "components/prefs/testing_pref_service.h" +#include "components/safe_search_api/fake_url_checker_client.h" #include "components/supervised_user/core/common/supervised_user_utils.h" #include "extensions/buildflags/buildflags.h" #include "testing/gtest/include/gtest/gtest.h" @@ -33,8 +34,8 @@ supervised_user::SupervisedUserURLFilter filter_ = supervised_user::SupervisedUserURLFilter( pref_service_, - base::BindRepeating(supervised_user::IsSupportedChromeExtensionURL), - /*delegate=*/nullptr); + std::make_unique<safe_search_api::FakeURLCheckerClient>(), + base::BindRepeating(supervised_user::IsSupportedChromeExtensionURL)); }; TEST_F(SupervisedUserURLFilterExtensionsTest,
diff --git a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc index 71f22d23..df6a89b0 100644 --- a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
@@ -23,7 +23,6 @@ #include "components/password_manager/core/browser/sync/password_sync_bridge.h" #include "components/signin/public/base/signin_switches.h" #include "components/signin/public/identity_manager/identity_test_utils.h" -#include "components/sync/base/features.h" #include "components/sync/base/model_type.h" #include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/nigori/cryptographer_impl.h" @@ -97,55 +96,6 @@ } }; -class SingleClientPasswordsSyncTestWithNotes : public SyncTest { - public: - SingleClientPasswordsSyncTestWithNotes() : SyncTest(SINGLE_CLIENT) { - feature_list_.InitWithFeatures( - /*enabled_features=*/{syncer::kPasswordNotesWithBackup}, - /*disabled_features=*/{}); - } - ~SingleClientPasswordsSyncTestWithNotes() override = default; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// This is a test the server behaviour of preserving passwords note across -// commits from clients to support and don't support password notes. -class SingleClientPasswordsSyncTestWithNotesDisableAfterEnable - : public SyncTest { - public: - SingleClientPasswordsSyncTestWithNotesDisableAfterEnable() - : SyncTest(SINGLE_CLIENT) { - // Enabled the features when there are even numbers of PRE's to achieve an - // alternating behaviour. - feature_list_.InitWithFeatureState(syncer::kPasswordNotesWithBackup, - GetTestPreCount() % 2 == 0); - password_form_ = CreateTestPasswordForm(0); - } - ~SingleClientPasswordsSyncTestWithNotesDisableAfterEnable() override = - default; - const PasswordForm& password_form() { return password_form_; } - - private: - PasswordForm password_form_; - base::test::ScopedFeatureList feature_list_; -}; - -// Some tests are flaky on Chromeos when run with IP Protection enabled. -// TODO(crbug.com/1491411): Fix flakes. -class SingleClientPasswordsSyncTestWithNotesDisableAfterEnableNoIpProt - : public SingleClientPasswordsSyncTestWithNotesDisableAfterEnable { - public: - SingleClientPasswordsSyncTestWithNotesDisableAfterEnableNoIpProt() { - feature_list_.InitAndDisableFeature( - net::features::kEnableIpProtectionProxy); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTestWithVerifier, Sanity) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; @@ -651,7 +601,7 @@ cryptographer.get(), "new_password", kUnsupportedField))); } -IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTestWithNotes, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, PreservesUnsupportedNotesFieldsDataOnCommits) { // Create an unsupported field in the PasswordSpecificsData_Notes with an // unused tag. @@ -730,117 +680,8 @@ } } -// The follow 3 tests are testing the interaction between clients that support -// and don't support notes. The test fixture enables the features for even -// number of PREs. -IN_PROC_BROWSER_TEST_F( - SingleClientPasswordsSyncTestWithNotesDisableAfterEnableNoIpProt, - PRE_PRE_ServerPreservesNotesBackup) { - // Enabled by the test fixture. - ASSERT_TRUE(base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); - ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; - - // Add password with a note and commit it to the server. - ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - PasswordForm form = password_form(); - form.notes.emplace_back(u"example note", base::Time::Now()); - GetProfilePasswordStoreInterface(0)->AddLogin(form); - EXPECT_EQ(1, GetPasswordCount(0)); - EXPECT_TRUE(ServerCountMatchStatusChecker(syncer::PASSWORDS, 1).Wait()); -} - -IN_PROC_BROWSER_TEST_F( - SingleClientPasswordsSyncTestWithNotesDisableAfterEnableNoIpProt, - PRE_ServerPreservesNotesBackup) { - // Disabled by the test fixture. - ASSERT_FALSE(base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); - // The server should still contains the entity with the note. - ASSERT_EQ(1U, - fake_server_->GetSyncEntitiesByModelType(syncer::PASSWORDS).size()); - ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; - - password_manager::PasswordStoreInterface* store = - GetProfilePasswordStoreInterface(0); - - // Stop password sync and delete the local copy to simulate downloading to a - // legacy client that doesn't support notes. - ASSERT_TRUE( - GetClient(0)->DisableSyncForType(syncer::UserSelectableType::kPasswords)); - passwords_helper::RemoveLogins(store); - - // Re-enable sync which should force downloading the password with the note - // to the legacy client. - ASSERT_TRUE( - GetClient(0)->EnableSyncForType(syncer::UserSelectableType::kPasswords)); - PasswordSyncActiveChecker(GetSyncService(0)).Wait(); - - // Make sure the password showed up in the profile store. - ASSERT_EQ(1, GetPasswordCount(0)); - // Update the password to simulate a commit from a legacy client that doesn't - // support password notes. - PasswordForm form = password_form(); - form.password_value = u"new_password"; - store->UpdateLogin(form); - // Add another arbitrary credentials to wait until 2 passwords have reached - // the server. - store->AddLogin(CreateTestPasswordForm(1)); - ASSERT_TRUE(ServerCountMatchStatusChecker(syncer::PASSWORDS, 2).Wait()); -} - -IN_PROC_BROWSER_TEST_F( - SingleClientPasswordsSyncTestWithNotesDisableAfterEnableNoIpProt, - ServerPreservesNotesBackup) { - // Enabled by the test fixture. - ASSERT_TRUE(base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); - // The server now should have two entities. - ASSERT_EQ(2U, - fake_server_->GetSyncEntitiesByModelType(syncer::PASSWORDS).size()); - ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; - password_manager::PasswordStoreInterface* store = - GetProfilePasswordStoreInterface(0); - - // Disable password sync and delete the local copy to simulate downloading to - // a modern client that supports notes. - ASSERT_TRUE( - GetClient(0)->DisableSyncForType(syncer::UserSelectableType::kPasswords)); - passwords_helper::RemoveLogins(store); - - // Now re-enable sync which should force downloading the password with the - // note to the legacy client. - ASSERT_TRUE( - GetClient(0)->EnableSyncForType(syncer::UserSelectableType::kPasswords)); - PasswordSyncActiveChecker(GetSyncService(0)).Wait(); - - // Make sure the both password showed up in the profile store. - ASSERT_THAT(passwords_helper::GetAllLogins(store), testing::SizeIs(2)); - // Test that the note appears in the credentials added in the first test. This - // is possible because the server carries over the notes across commits from - // modern and legacy clients. - EXPECT_THAT( - passwords_helper::GetAllLogins(store), - Contains(Pointee(AllOf( - Field(&PasswordForm::signon_realm, password_form().signon_realm), - Field(&PasswordForm::username_value, password_form().username_value), - Field(&PasswordForm::password_value, u"new_password"), - Field(&PasswordForm::notes, - Contains(Field(&password_manager::PasswordNote::value, - u"example note"))))))); -} - -class SingleClientPasswordsSyncTestConsumesNotesBackup : public SyncTest { - public: - SingleClientPasswordsSyncTestConsumesNotesBackup() : SyncTest(SINGLE_CLIENT) { - feature_list_.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); - } - ~SingleClientPasswordsSyncTestConsumesNotesBackup() override = default; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTestConsumesNotesBackup, +IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, ClientReadsNotesFromTheBackup) { - ASSERT_TRUE(base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); base::HistogramTester histogram_tester; const std::string& kEncryptionPassphrase =
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc index f7a6961..65c568b 100644 --- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -23,7 +23,6 @@ #include "components/password_manager/core/browser/password_store/password_store_interface.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/signin/public/base/signin_switches.h" -#include "components/sync/base/features.h" #include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/test/fake_server_http_post_provider.h" #include "content/public/test/browser_test.h" @@ -602,20 +601,7 @@ ASSERT_TRUE(AwaitQuiescence()); } -class TwoClientPasswordsSyncTestWithNotes : public SyncTest { - public: - TwoClientPasswordsSyncTestWithNotes() : SyncTest(TWO_CLIENT) { - feature_list_.InitWithFeatures( - /*enabled_features=*/{syncer::kPasswordNotesWithBackup}, - /*disabled_features=*/{}); - } - ~TwoClientPasswordsSyncTestWithNotes() override = default; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTestWithNotes, +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, SyncPasswordNotesBetweenDevices) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordForms()); @@ -653,7 +639,7 @@ // This tests the logic for reading and writing the notes backup blob when // notes are empty. -IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTestWithNotes, +IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, SyncPasswordWithEmptyNotesBetweenDevices) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_TRUE(AllProfilesContainSamePasswordForms());
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fre/SigninFirstRunMediator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fre/SigninFirstRunMediator.java index c6e3c35..5e5fe3e7 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fre/SigninFirstRunMediator.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fre/SigninFirstRunMediator.java
@@ -372,9 +372,8 @@ AccountUtils.findCoreAccountInfoByEmail( mAccountManagerFacade.getCoreAccountInfos().getResult(), mSelectedAccountEmail); - if (selectedAccount != null) { - signinManager.signin(selectedAccount, SigninAccessPoint.START_PAGE, signInCallback); - } + assert selectedAccount != null; + signinManager.signin(selectedAccount, SigninAccessPoint.START_PAGE, signInCallback); } /** Callback for the PropertyKey {@link SigninFirstRunProperties#ON_DISMISS_CLICKED}. */
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 071a74c..b9cb492 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Werf is onderbreek</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Kon 1 item nie aflaai nie}other{Kon # items nie aflaai nie}}</translation> <translation id="2067805253194386918">teks</translation> +<translation id="2079545284768500474">Ontdoen</translation> <translation id="2082238445998314030">Resultaat <ph name="RESULT_NUMBER" /> van <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Wys tans kompakte aansig</translation> <translation id="2093731487903423814">afgelope 15 minute</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sekondes oor</translation> <translation id="2779651927720337254">misluk</translation> <translation id="2781151931089541271">1 sekonde oor</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Die oortjie <ph name="TAB_TITLE" /> sal toegemaak word</translation> <translation id="281504910091592009">Bekyk en bestuur gestoorde wagwoorde in jou <ph name="BEGIN_LINK" />Google-rekening<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Stroomkaartkieslys teen halwe hoogte</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index b7294ce..68d3702 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">ጣቢያ ባለበት ቆሟል</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ማውረድ አልተሳካም}one{# ማውረዶች አልተሳኩም}other{# ማውረዶች አልተሳኩም}}</translation> <translation id="2067805253194386918">ጽሁፍ</translation> +<translation id="2079545284768500474">ቀልብስ</translation> <translation id="2082238445998314030">ውጤት <ph name="RESULT_NUMBER" /> ከ<ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">ውሱን ዕይታን በማሳየት ላይ</translation> <translation id="2093731487903423814">ካለፉት 15 ደቂቃዎች</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ሰከንዶች ይቀራሉ</translation> <translation id="2779651927720337254">አልተሳካም</translation> <translation id="2781151931089541271">1 ሰከንድ ይቀራል</translation> +<translation id="2789486458103222910">እሺ</translation> <translation id="2800066122460699237">ትር <ph name="TAB_TITLE" /> ይዘጋል</translation> <translation id="281504910091592009">የተቀመጡ የይለፍ ቃላትን በእርስዎ <ph name="BEGIN_LINK" />Google መለያ<ph name="END_LINK" /> ውስጥ ይመልከቱ እና ያስተዳድሩ</translation> <translation id="2827278682606527653">የምግብ ካርድ ምናሌ በግማሽ ቁመት</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">ያልታወቀ </translation> <translation id="5833984609253377421">አገናኝ አጋራ</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265">PDF በ<ph name="APP_NAME" /> ይከፈት?</translation> <translation id="5853623416121554550">ባለበት ቆሟል</translation> <translation id="5855546874025048181">አጣራ፦ <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">የሆነ ችግር ተፈጥሯል። ዋጋ ተከታተልን ማዘመን አልተቻለም።</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">መነሻ ገጽን ያርትዑ</translation> <translation id="8130309322784422030">የተከማቸው የመግቢያ መረጃዎ ጊዜው ያለፈበት ሊሆን ይችላል</translation> <translation id="813082847718468539">የጣቢያ መረጃን ይመልከቱ</translation> +<translation id="8135406045838672858">የወረዱ PDFዎች በራስ-ሰር በ<ph name="APP_NAME" /> ይከፈታሉ</translation> <translation id="8137562778192957619">ይህን የይለፍ ቃል ማስታወስ አያስፈልግዎትም። በGoogle የይለፍ ቃል አስተዳዳሪ ላይ ይቀመጣል።</translation> <translation id="8186512483418048923"><ph name="FILES" /> ፋይሎች ይቀራሉ</translation> <translation id="8190358571722158785">1 ቀን ይቀራል</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index f6fb40a..9e2e4887 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">تم إيقاف الموقع الإلكتروني مؤقتًا</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{أخفق تنزيل واحد}zero{أخفق # تنزيل}two{أخفق تنزيلان (#)}few{أخفقت # تنزيلات}many{أخفق # تنزيلاً}other{أخفق # تنزيل}}</translation> <translation id="2067805253194386918">نص</translation> +<translation id="2079545284768500474">تراجع</translation> <translation id="2082238445998314030">النتيجة <ph name="RESULT_NUMBER" /> من <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">يتمّ إظهار العرض المكثّف</translation> <translation id="2093731487903423814">آخر 15 دقيقة</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389">عدد الثواني المتبقية: <ph name="SECONDS" /></translation> <translation id="2779651927720337254">تعذَّر التنزيل</translation> <translation id="2781151931089541271">يتبقى ثانية واحدة</translation> +<translation id="2789486458103222910">حسنًا</translation> <translation id="2800066122460699237">سيتم إغلاق علامة التبويب <ph name="TAB_TITLE" />.</translation> <translation id="281504910091592009">بإمكانك عرض كلمات المرور المحفوظة وإدارتها في <ph name="BEGIN_LINK" />حسابك على Google<ph name="END_LINK" />.</translation> <translation id="2827278682606527653">Feed card menu half height</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 10d8b64b..f10e7a1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">ছাইট পজ কৰা হৈছে</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{১ টা ডাউনল’ড কৰিব পৰা নগ’ল}one{# টা ডাউনল’ড কৰিব পৰা নগ’ল}other{# টা ডাউনল’ড কৰিব পৰা নগ’ল}}</translation> <translation id="2067805253194386918">পাঠ</translation> +<translation id="2079545284768500474">আনডু কৰক</translation> <translation id="2082238445998314030">ফলাফল <ph name="TOTAL_RESULTS" />ৰ ভিতৰত <ph name="RESULT_NUMBER" /></translation> <translation id="2091863218454846791">সংক্ষিপ্ত ভিউ দেখুৱাই থকা হৈছে</translation> <translation id="2093731487903423814">যোৱা ১৫ মিনিটৰ</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ছেকেণ্ড বাকী আছে</translation> <translation id="2779651927720337254">ডাউনল'ড কৰিব পৰা নগ'ল</translation> <translation id="2781151931089541271">১ ছেকেণ্ড বাকী আছে</translation> +<translation id="2789486458103222910">ঠিক আছে</translation> <translation id="2800066122460699237">টেবটো <ph name="TAB_TITLE" /> বন্ধ কৰা হ’ব</translation> <translation id="281504910091592009">আপোনাৰ <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" />ত ছেভ কৰি থোৱা পাছৱর্ডসমূহ চাওক আৰু পৰিচালনা কৰক</translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">অজ্ঞাত</translation> <translation id="5833984609253377421">লিংক শ্বেয়াৰ কৰক</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" />ৰ জৰিয়তে PDF খুলিবনে?</translation> <translation id="5853623416121554550">পজ কৰা হ’ল</translation> <translation id="5855546874025048181">পৰিষ্কৰণ: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">কিবা ভুল হ’ল। ট্ৰেক কৰা মূল্য আপডে’ট কৰিব পৰা নগ’ল।</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">গৃহপৃষ্ঠা সম্পাদনা কৰক</translation> <translation id="8130309322784422030">আপুনি ষ্ট’ৰ কৰি থোৱা ছাইন ইন কৰাৰ তথ্যখিনিৰ ম্যাদ উকলিব পাৰে</translation> <translation id="813082847718468539">ছাইটৰ তথ্য চাওক</translation> +<translation id="8135406045838672858"><ph name="APP_NAME" />ৰ জৰিয়তে ডাউনল’ড কৰা PDF স্বয়ংক্ৰিয়ভাৱে খোলে</translation> <translation id="8137562778192957619">আপুনি এই পাছৱৰ্ডটো মনত ৰখাৰ প্ৰয়োজন নহ’ব। এইটো Google Password Managerত ছেভ কৰা হ’ব।</translation> <translation id="8186512483418048923"><ph name="FILES" />টা ফাইল বাকী আছে</translation> <translation id="8190358571722158785">১ দিন বাকী আছে</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 928db4d..9e4655e0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Tətbiq versiyası</translation> <translation id="1428770807407000502">Sinxronlaşdırma deaktiv edilsin?</translation> <translation id="1430915738399379752">Çap edin</translation> +<translation id="1435593198351412143">PDF-ləri avtomatik açın</translation> <translation id="1436784010935106834">Silindi</translation> <translation id="1437543266176261764"><ph name="APP_NAME" /> tətbiqində işləyir</translation> <translation id="1448440926884431741">Əlfəcinlərdə izlədiyiniz məhsulları təşkil edin</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Sayt dayandırıldı</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 endirmə alınmadı}other{# endirmə alınmadı}}</translation> <translation id="2067805253194386918">mətn</translation> +<translation id="2079545284768500474">Geri qaytarın</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> nəticədən <ph name="RESULT_NUMBER" /></translation> <translation id="2091863218454846791">Kompakt görünüş göstərilir</translation> <translation id="2093731487903423814">son 15 dəqiqə</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> saniyə qaldı</translation> <translation id="2779651927720337254">alınmadı</translation> <translation id="2781151931089541271">1 saniyə qaldı</translation> +<translation id="2789486458103222910">Oldu</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> tabı bağlanacaq</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google Hesabınızda<ph name="END_LINK" /> yadda saxlanılmış parollara baxın və idarə edin</translation> <translation id="2827278682606527653">Təchizat kartı menyusu yarı hündürlükdədir</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Brauzer və ya cihazı çox yavaşlatmır.</translation> <translation id="2900528713135656174">Tədbir yaradın</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> üçün təkliflər göstərilir</translation> +<translation id="2904300462646366554">Endirilmiş PDF-lər cihazdakı PDF göstəricilərdən biri ilə avtomatik açılır</translation> <translation id="2904414404539560095">Tam hündürlükdə açılan tabı paylaşa biləcəyiniz cihazların siyahısı.</translation> <translation id="2908243544703713905">Oxunmamış hekayələr hazırdır</translation> <translation id="2909615210195135082">Google Bildiriş Platforması</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">Müəllif hüquqları <ph name="YEAR" /> Google MMC. Bütün hüquqlar qorunur.</translation> <translation id="5814749351757353073">Sevdiyiniz saytlardan xəbərdar olun</translation> <translation id="5822875253699806474">Daxil olduğunuz saytlara sürətlə qayıtmaq üçün tablar və tarixçəni sinxronlaşdırın</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> qovluğunda yadda saxlandı</translation> <translation id="583281660410589416">Naməlum</translation> <translation id="5833984609253377421">Linki paylaşın</translation> <translation id="5839058148541733625">Chrome Dinozavr</translation> +<translation id="5848257610304005265">PDF <ph name="APP_NAME" /> ilə açılsın?</translation> <translation id="5853623416121554550">dayandırıldı</translation> <translation id="5855546874025048181">Yaxşılaşdırın: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Xəta oldu. Qiymətin izlənməsini güncəlləmək mümkün olmadı.</translation> @@ -1377,6 +1383,7 @@ <translation id="8127542551745560481">Əsas səhifəni redaktə edin</translation> <translation id="8130309322784422030">Saxladığınız giriş məlumatları köhnəlmiş ola bilər</translation> <translation id="813082847718468539">Sayt məlumatına baxın</translation> +<translation id="8135406045838672858">Endirilmiş PDF-lər avtomatik <ph name="APP_NAME" /> ilə açılır</translation> <translation id="8137562778192957619">Bu parolu xatırlamağa ehtiyac yoxdur. Google Parol Menecerində yadda saxlanacaq.</translation> <translation id="8186512483418048923"><ph name="FILES" /> fayl qalır</translation> <translation id="8190358571722158785">1 gün qaldı</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 8db111a..d07eea45 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
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Версія праграмы</translation> <translation id="1428770807407000502">Выключыць сінхранізацыю?</translation> <translation id="1430915738399379752">Друк</translation> +<translation id="1435593198351412143">Адкрываць PDF аўтаматычна</translation> <translation id="1436784010935106834">Выдалены</translation> <translation id="1437543266176261764">Выконваецца ў <ph name="APP_NAME" /></translation> <translation id="1448440926884431741">Упарадкоўвайце тавары, за якімі сочыце, у Закладках</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Сайт прыпынены</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Збой 1 спампоўкі}one{Збой # спампоўкі}few{Збой # спамповак}many{Збой # спамповак}other{Збой # спампоўкі}}</translation> <translation id="2067805253194386918">тэкст</translation> +<translation id="2079545284768500474">Адрабіць</translation> <translation id="2082238445998314030">Вынік <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Выбрана кампактнае адлюстраванне</translation> <translation id="2093731487903423814">апошнія 15 хвілін</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389">Засталося <ph name="SECONDS" /> с</translation> <translation id="2779651927720337254">не выканана</translation> <translation id="2781151931089541271">Засталася 1 секунда</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Укладка "<ph name="TAB_TITLE" />" будзе закрыта</translation> <translation id="281504910091592009">Праглядайце захаваныя паролі і кіруйце імі праз <ph name="BEGIN_LINK" />Уліковы запіс Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Меню карткі стужкі адкрыта на палову вышыні</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Не выклікае прыметнага запаволення працы браўзера або прылады.</translation> <translation id="2900528713135656174">Стварыце падзею</translation> <translation id="2901411048554510387">Паказваюцца прапановы для сайта "<ph name="WEBSITE_TITLE" />"</translation> +<translation id="2904300462646366554">Спампаваныя PDF аўтаматычна адкрываюцца ў адной з праграм для іх прагляду, усталяванай на прыладзе</translation> <translation id="2904414404539560095">Спіс прылад, з якімі можна абагуліць укладку, разгорнуты на ўвесь экран.</translation> <translation id="2908243544703713905">Ёсць непрачытаныя навіны</translation> <translation id="2909615210195135082">Платформа апавяшчэнняў Google</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Усе правы абароненыя.</translation> <translation id="5814749351757353073">Падпісвайцеся на любімыя сайты</translation> <translation id="5822875253699806474">Каб хутка вяртацца на сайты, якія вы наведвалі, сінхранізуйце свае ўкладкі і гісторыю</translation> +<translation id="5829586821381540080">Захавана ў папцы "<ph name="FOLDER_NAME" />"</translation> <translation id="583281660410589416">Невядома</translation> <translation id="5833984609253377421">Абагуліць спасылку</translation> <translation id="5839058148541733625">Дыназаўр у Chrome</translation> +<translation id="5848257610304005265">Адкрываць PDF у праграме "<ph name="APP_NAME" />"?</translation> <translation id="5853623416121554550">прыпынена</translation> <translation id="5855546874025048181">Удакладніць: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Нешта пайшло не так. Абнавіць функцыю "Адсочванне цаны" не ўдалося.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">Змяніць галоўную старонку</translation> <translation id="8130309322784422030">Уліковыя даныя могуць быць устарэлымі</translation> <translation id="813082847718468539">Прагляд звестак пра сайт</translation> +<translation id="8135406045838672858">Спампаваныя PDF аўтаматычна адкрываюцца ў праграме "<ph name="APP_NAME" />"</translation> <translation id="8137562778192957619">Вам не трэба запамінаць гэты пароль. Ён будзе захаваны ў Менеджары пароляў Google.</translation> <translation id="8186512483418048923">Засталося файлаў: <ph name="FILES" /></translation> <translation id="8190358571722158785">Застаўся 1 дзень</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 6286658..9df1a92 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Сайтът е на пауза</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 изтегляне не бе успешно}other{# изтегляния не бяха успешни}}</translation> <translation id="2067805253194386918">текст</translation> +<translation id="2079545284768500474">Отмяна</translation> <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> от <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Показва се компактният изглед</translation> <translation id="2093731487903423814">последните 15 минути</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Остават <ph name="SECONDS" /> сек</translation> <translation id="2779651927720337254">неуспешно</translation> <translation id="2781151931089541271">Остава 1 сек</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Разделът <ph name="TAB_TITLE" /> ще бъде затворен</translation> <translation id="281504910091592009">Преглеждайте и управлявайте запазените пароли в <ph name="BEGIN_LINK" />профила си в Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Менюто на картата за емисията се показва на половината височина</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 369643dd..ed7c2cb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">সাইট পজ করা আছে</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{১টি ডাউনলোড করা যায়নি}one{#টি ডাউনলোড করা যায়নি}other{#টি ডাউনলোড করা যায়নি}}</translation> <translation id="2067805253194386918">টেক্সট</translation> +<translation id="2079545284768500474">আগের অবস্থায় ফিরুন</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> এর মধ্যে <ph name="RESULT_NUMBER" /> টি ফলাফল</translation> <translation id="2091863218454846791">কম্প্যাক্ট ভিউ দেখানো হচ্ছে</translation> <translation id="2093731487903423814">গত ১৫ মিনিটে</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> সেকেন্ড বাকি আছে</translation> <translation id="2779651927720337254">করা যায়নি</translation> <translation id="2781151931089541271">১ সেকেন্ড বাকি আছে</translation> +<translation id="2789486458103222910">ঠিক আছে</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> নামের ট্যাবটি বন্ধ করা হবে</translation> <translation id="281504910091592009">আপনার <ph name="BEGIN_LINK" />Google অ্যাকাউন্ট<ph name="END_LINK" />-এ সেভ করা পাসওয়ার্ড দেখুন এবং পরিচালনা করুন</translation> <translation id="2827278682606527653">স্ক্রিনের অর্ধেক উচ্চতা পর্যন্ত ফিড কার্ড মেনু খোলা আছে</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index aa1a9d1..efa82da 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Verzija aplikacije</translation> <translation id="1428770807407000502">Isključiti sinhronizaciju?</translation> <translation id="1430915738399379752">Štampaj</translation> +<translation id="1435593198351412143">Automatski otvaraj PDF-ove</translation> <translation id="1436784010935106834">Uklonjeno</translation> <translation id="1437543266176261764">Pokrenuto u aplikaciji <ph name="APP_NAME" /></translation> <translation id="1448440926884431741">Organizirajte praćene proizvode u Oznakama</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Web lokacija je pauzirana</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 preuzimanje nije uspjelo}one{# preuzimanje nije uspjelo}few{# preuzimanja nisu uspjela}other{# preuzimanja nije uspjelo}}</translation> <translation id="2067805253194386918">tekst</translation> +<translation id="2079545284768500474">Vrati</translation> <translation id="2082238445998314030">Rezultat <ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Prikazivanje kompaktnog prikaza</translation> <translation id="2093731487903423814">posljednjih 15 minuta</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389">Preostalo je <ph name="SECONDS" /> s</translation> <translation id="2779651927720337254">neuspjelo</translation> <translation id="2781151931089541271">Preostala je 1 sek</translation> +<translation id="2789486458103222910">Uredu</translation> <translation id="2800066122460699237">Kartica <ph name="TAB_TITLE" /> će se zatvoriti</translation> <translation id="281504910091592009">Prikažite i upravljajte sačuvanim lozinkama u svom <ph name="BEGIN_LINK" />Google računu<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Ne usporava primjetno preglednik ni uređaj.</translation> <translation id="2900528713135656174">Kreiraj događaj</translation> <translation id="2901411048554510387">Prikazuju se prijedlozi za web lokaciju <ph name="WEBSITE_TITLE" /></translation> +<translation id="2904300462646366554">Preuzeti PDF-ovi se automatski otvaraju putem jednog od PDF preglednika na uređaju</translation> <translation id="2904414404539560095">Spisak uređaja s kojim će se dijeliti kartica je otvoren u punoj visini.</translation> <translation id="2908243544703713905">Nepročitane priče su spremne</translation> <translation id="2909615210195135082">Platforma za Google obavještenja</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava zadržana.</translation> <translation id="5814749351757353073">Nastavite pratiti omiljene web lokacije</translation> <translation id="5822875253699806474">Da se brzo vratite na web lokacije koje ste posjetili, sinhronizirajte kartice i historiju</translation> +<translation id="5829586821381540080">Sačuvano je u folder <ph name="FOLDER_NAME" /></translation> <translation id="583281660410589416">Nepoznato</translation> <translation id="5833984609253377421">Dijeli link</translation> <translation id="5839058148541733625">Dinosaur na Chromeu</translation> +<translation id="5848257610304005265">Otvoriti PDF putem aplikacije <ph name="APP_NAME" />?</translation> <translation id="5853623416121554550">pauzirano</translation> <translation id="5855546874025048181">Preciziranje: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Nešto nije uredu. Ažuriranje postavke Prati cijenu nije uspjelo.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">Uredite početnu stranicu</translation> <translation id="8130309322784422030">Moguće je da su vaše pohranjene informacije za prijavu zastarjele</translation> <translation id="813082847718468539">Prikaz informacija o web lokaciji</translation> +<translation id="8135406045838672858">Preuzeti PDF-ovi se automatski otvaraju putem aplikacije <ph name="APP_NAME" /></translation> <translation id="8137562778192957619">Nećete morati zapamtiti ovu lozinku. Sačuvat će se u Google upravitelju lozinki.</translation> <translation id="8186512483418048923">Broj preostalih fajlova: <ph name="FILES" /></translation> <translation id="8190358571722158785">Preostao je još jedan dan</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 856733e..cf88510 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">El lloc web s'ha posat en pausa</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Error en 1 baixada}other{Error en # baixades}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">Desfés</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">S'està mostrant la visualització compacta</translation> <translation id="2093731487903423814">15 darrers minuts</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Queden <ph name="SECONDS" /> segons</translation> <translation id="2779651927720337254">ha fallat</translation> <translation id="2781151931089541271">Queda 1 segon</translation> +<translation id="2789486458103222910">D'acord</translation> <translation id="2800066122460699237">Es tancarà la pestanya <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Consulta i gestiona les contrasenyes desades al <ph name="BEGIN_LINK" />Compte de Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">El menú de la targeta del tauler ocupa la meitat inferior de la pantalla</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 aa21d76..544b632b 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
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">Web je pozastaven</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Stažení 1 souboru se nezdařilo}few{Stažení # souborů se nezdařilo}many{Stažení # souboru se nezdařilo}other{Stažení # souborů se nezdařilo}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">Vrátit zpět</translation> <translation id="2082238445998314030">Výsledek <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Je zobrazeno kompaktní zobrazení</translation> <translation id="2093731487903423814">posledních 15 minut</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389">Zbývá: <ph name="SECONDS" /> s</translation> <translation id="2779651927720337254">nezdařilo se</translation> <translation id="2781151931089541271">Zbývá: 1 s</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Zavře se karta <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Zobrazit a spravovat uložená hesla v <ph name="BEGIN_LINK" />účtu Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Napůl otevřená nabídka karty informačního kanálu</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">Neznámé</translation> <translation id="5833984609253377421">Sdílet odkaz</translation> <translation id="5839058148541733625">Dinosauří hra pro Chrome</translation> +<translation id="5848257610304005265">Otevřít PDF pomocí aplikace <ph name="APP_NAME" />?</translation> <translation id="5853623416121554550">pozastaveno</translation> <translation id="5855546874025048181">Zpřesnit: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Došlo k chybě. Sledování ceny se nepodařilo aktualizovat.</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">Upravit domovskou stránku</translation> <translation id="8130309322784422030">Uložené přihlašovací údaje mohou být zastaralé</translation> <translation id="813082847718468539">Zobrazit informace o stránkách</translation> +<translation id="8135406045838672858">Stažené soubory PDF se automaticky otevírají pomocí aplikace <ph name="APP_NAME" /></translation> <translation id="8137562778192957619">Toto heslo si nebudete muset pamatovat. Uloží se do Správce hesel Google.</translation> <translation id="8186512483418048923">Zbývající soubory: <ph name="FILES" /></translation> <translation id="8190358571722158785">Zbývá: 1 d</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 35d9522..7da79b9 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Cafodd y wefan ei seibio</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Mae 1 lawrlwythiad wedi methu}zero{Mae # lawrlwythiad wedi methu}two{Mae # lawrlwythiad wedi methu}few{Mae # lawrlwythiad wedi methu}many{Mae # lawrlwythiad wedi methu}other{Mae # lawrlwythiad wedi methu}}</translation> <translation id="2067805253194386918">testun</translation> +<translation id="2079545284768500474">Dadwneud</translation> <translation id="2082238445998314030">Canlyniad <ph name="RESULT_NUMBER" /> o <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Wrthi'n dangos gwedd gryno</translation> <translation id="2093731487903423814">15 munud diwethaf</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> eiliad ar ôl</translation> <translation id="2779651927720337254">wedi methu</translation> <translation id="2781151931089541271">1 eiliad ar ôl</translation> +<translation id="2789486458103222910">Iawn</translation> <translation id="2800066122460699237">Bydd y tab <ph name="TAB_TITLE" /> yn cael ei gau</translation> <translation id="281504910091592009">Gweld a rheoli cyfrineiriau sydd wedi'u cadw yn eich <ph name="BEGIN_LINK" />Cyfrif Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Mae dewislen cardiau'r ffrwd wedi ei hagor ar hanner uchder</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 13860668..e52ba3c5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Websitet er sat på pause</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 download mislykkedes}one{# download mislykkedes}other{# downloads mislykkedes}}</translation> <translation id="2067805253194386918">tekst</translation> +<translation id="2079545284768500474">Fortryd</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Meget tæt visning anvendes</translation> <translation id="2093731487903423814">de seneste 15 minutter</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder tilbage</translation> <translation id="2779651927720337254">mislykkedes</translation> <translation id="2781151931089541271">1 sekund tilbage</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Fanen <ph name="TAB_TITLE" /> lukkes</translation> <translation id="281504910091592009">Se og administrer gemte adgangskoder på din <ph name="BEGIN_LINK" />Google-konto<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feedkortmenu i halv højde</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 d2371f9..823e497 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Website pausiert</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Fehler bei 1 Download}other{Fehler bei # Downloads}}</translation> <translation id="2067805253194386918">Text</translation> +<translation id="2079545284768500474">Rückgängig</translation> <translation id="2082238445998314030">Ergebnis <ph name="RESULT_NUMBER" /> von <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Kompaktansicht wird angezeigt</translation> <translation id="2093731487903423814">den letzten 15 Minuten</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> Sekunden übrig</translation> <translation id="2779651927720337254">fehlgeschlagen</translation> <translation id="2781151931089541271">1 Sekunde übrig</translation> +<translation id="2789486458103222910">Ok</translation> <translation id="2800066122460699237">Der Tab „<ph name="TAB_TITLE" />“ wird geschlossen</translation> <translation id="281504910091592009">Gespeicherte Passwörter in meinem <ph name="BEGIN_LINK" />Google-Konto<ph name="END_LINK" /> ansehen und verwalten</translation> <translation id="2827278682606527653">Feedkartenmenü halb geöffnet</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 481e384..1efbe50 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Ο ιστότοπος τέθηκε σε παύση</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 λήψη απέτυχε}other{# λήψεις απέτυχαν}}</translation> <translation id="2067805253194386918">κείμενο</translation> +<translation id="2079545284768500474">Αναίρεση</translation> <translation id="2082238445998314030">Αποτέλεσμα <ph name="RESULT_NUMBER" /> από <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Εμφάνιση συμπαγούς προβολής</translation> <translation id="2093731487903423814">τελευταία 15 λεπτά</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Απομένουν <ph name="SECONDS" /> δευτερόλεπτα</translation> <translation id="2779651927720337254">απέτυχε</translation> <translation id="2781151931089541271">Απομένει 1 δευτερόλεπτο</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Πρόκειται να κλείσει η καρτέλα <ph name="TAB_TITLE" />.</translation> <translation id="281504910091592009">Προβολή και διαχείριση αποθηκευμένων κωδικών πρόσβασης στον <ph name="BEGIN_LINK" />Λογαριασμό σας Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Μενού της κάρτας ροής στο μισό ύψος</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 8018136..f5885ef 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site paused</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 download failed}other{# downloads failed}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">Undo</translation> <translation id="2082238445998314030">Result <ph name="RESULT_NUMBER" /> of <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Showing compact view</translation> <translation id="2093731487903423814">last 15 minutes</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> secs left</translation> <translation id="2779651927720337254">failed</translation> <translation id="2781151931089541271">1 sec left</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">The tab <ph name="TAB_TITLE" /> will be closed</translation> <translation id="281504910091592009">View and manage saved passwords in your <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feed card menu half height</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 24aee18..896dfe07 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Se pausó el sitio</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{No se pudo realizar 1 descarga}other{No se pudieron realizar # descargas}}</translation> <translation id="2067805253194386918">texto</translation> +<translation id="2079545284768500474">Deshacer</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Se muestra la vista compacta</translation> <translation id="2093731487903423814">últimos 15 minutos</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> segundos restantes</translation> <translation id="2779651927720337254">error</translation> <translation id="2781151931089541271">1 segundo restante</translation> +<translation id="2789486458103222910">Aceptar</translation> <translation id="2800066122460699237">Se cerrará la pestaña <ph name="TAB_TITLE" />.</translation> <translation id="281504910091592009">Ver y administrar las contraseñas guardadas en tu <ph name="BEGIN_LINK" />cuenta de Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feed card menu half height</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 0f950a0..5f7efdb 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Sitio web en pausa</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{No se ha podido descargar 1 archivo}other{No se han podido descargar # archivos}}</translation> <translation id="2067805253194386918">texto</translation> +<translation id="2079545284768500474">Deshacer</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Mostrando vista compacta</translation> <translation id="2093731487903423814">los últimos 15 minutos</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Quedan <ph name="SECONDS" /> segundos</translation> <translation id="2779651927720337254">ha fallado</translation> <translation id="2781151931089541271">Queda 1 segundo</translation> +<translation id="2789486458103222910">Aceptar</translation> <translation id="2800066122460699237">Se cerrará la pestaña <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Consulta y gestiona las contraseñas guardadas en tu <ph name="BEGIN_LINK" />cuenta de Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Menú de tarjeta de feed a media altura</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 7494b6e..53d96785 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Sait on peatatud</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 allalaadimine ebaõnnestus}other{# allalaadimist ebaõnnestusid}}</translation> <translation id="2067805253194386918">tekst</translation> +<translation id="2079545284768500474">Võta tagasi</translation> <translation id="2082238445998314030">Tulemus <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Näidatakse kompaktset vaadet</translation> <translation id="2093731487903423814">viimase 15 minuti jooksul</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Jäänud on <ph name="SECONDS" /> sekundit</translation> <translation id="2779651927720337254">ebaõnnestus</translation> <translation id="2781151931089541271">Jäänud on 1 sekund</translation> +<translation id="2789486458103222910">Selge</translation> <translation id="2800066122460699237">Vaheleht <ph name="TAB_TITLE" /> suletakse</translation> <translation id="281504910091592009">Vaadake ja hallake salvestatud paroole oma <ph name="BEGIN_LINK" />Google'i kontol<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Voo kaardimenüü on poole kõrgusega</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 569635b..bc5c226 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Webgunea pausatuta dago</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Bat ezin izan da deskargatu}other{# ezin izan dira deskargatu}}</translation> <translation id="2067805253194386918">testua</translation> +<translation id="2079545284768500474">Desegin</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /> emaitza</translation> <translation id="2091863218454846791">Ikuspegi xehatuena ikusgai</translation> <translation id="2093731487903423814">Azken 15 minutuetako</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> segundo gelditzen dira</translation> <translation id="2779651927720337254">huts egin du</translation> <translation id="2781151931089541271">Segundo bat gelditzen da</translation> +<translation id="2789486458103222910">Ados</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> izeneko fitxa itxi egingo da</translation> <translation id="281504910091592009">Ikusi eta kudeatu <ph name="BEGIN_LINK" />Google-ko kontuan<ph name="END_LINK" /> gordetako pasahitzak</translation> <translation id="2827278682606527653">Jarioko txartelaren menua altuera erdian irekita dago</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index e69f910..b4987bc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">سایت موقتاً متوقف شد</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{۱ بارگیری انجام نشد}one{# بارگیری انجام نشد}other{# بارگیری انجام نشد}}</translation> <translation id="2067805253194386918">نوشتار</translation> +<translation id="2079545284768500474">لغو</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> نتیجه از <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">نمای فشرده نشان داده میشود</translation> <translation id="2093731487903423814">۱۵ دقیقه گذشته</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ثانیه باقیمانده است</translation> <translation id="2779651927720337254">انجام نشد</translation> <translation id="2781151931089541271">۱ ثانیه باقیمانده است</translation> +<translation id="2789486458103222910">تأیید</translation> <translation id="2800066122460699237">برگه <ph name="TAB_TITLE" /> بسته خواهد شد</translation> <translation id="281504910091592009">در <ph name="BEGIN_LINK" />حساب Google<ph name="END_LINK" /> خود گذرواژههای ذخیرهشده را مشاهده و مدیریت کنید</translation> <translation id="2827278682606527653">منوی کارت فید تا نیمه باز شد</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 260ea4a..d9fa6db 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Sivusto keskeytetty</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 lataus epäonnistui}other{# latausta epäonnistui}}</translation> <translation id="2067805253194386918">tekstiviesti</translation> +<translation id="2079545284768500474">Kumoa</translation> <translation id="2082238445998314030">Tulos <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Näytetään tiivis näkymä</translation> <translation id="2093731487903423814">15 viime minuuttia</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sekuntia jäljellä</translation> <translation id="2779651927720337254">epäonnistui</translation> <translation id="2781151931089541271">1 sekunti jäljellä</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Tämä välilehti suljetaan: <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Katso ja ylläpidä <ph name="BEGIN_LINK" />Google-tilille<ph name="END_LINK" /> tallennettuja salasanoja</translation> <translation id="2827278682606527653">Fiidikorttien valikko puolivälin korkuinen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 81b4e93a..3398f36 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Naka-pause ang site</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ang hindi na-download}one{# ang hindi na-download}other{# ang hindi na-download}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">I-undo</translation> <translation id="2082238445998314030">Resulta <ph name="RESULT_NUMBER" /> sa <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Ipinapakita ang compact view</translation> <translation id="2093731487903423814">nakalipas na 15 minuto</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> (na) segundo na lang ang natitira</translation> <translation id="2779651927720337254">nabigo</translation> <translation id="2781151931089541271">1 segundo na lang ang natitira</translation> +<translation id="2789486458103222910">Okay</translation> <translation id="2800066122460699237">Isasara ang tab na <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Tingnan at pamahalaan ang mga naka-save na password sa iyong <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Half height ng menu ng feed card</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 1af6126f..ef899af1 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site interrompu</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Échec de 1 téléchargement}one{Échec de # téléchargement}other{Échec de # téléchargements}}</translation> <translation id="2067805253194386918">texte</translation> +<translation id="2079545284768500474">Annuler</translation> <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Affichage de la vue compacte en cours…</translation> <translation id="2093731487903423814">dernières 15 minutes</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Il reste <ph name="SECONDS" /> secondes</translation> <translation id="2779651927720337254">échec</translation> <translation id="2781151931089541271">Il reste 1 s</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">L'onglet <ph name="TAB_TITLE" /> sera fermé</translation> <translation id="281504910091592009">Affichez et gérez les mots de passe enregistrés dans votre <ph name="BEGIN_LINK" />compte google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Le menu de la carte du flux est ouvert à mi-hauteur</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 5c2f0002..16a8ec3e 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site en pause</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Échec de 1 téléchargement}one{Échec de # téléchargement}other{Échec de # téléchargements}}</translation> <translation id="2067805253194386918">texte</translation> +<translation id="2079545284768500474">Annuler</translation> <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Affichage de la vue compacte</translation> <translation id="2093731487903423814">15 dernières minutes</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> secondes restantes</translation> <translation id="2779651927720337254">échec</translation> <translation id="2781151931089541271">1 seconde restante</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">L'onglet <ph name="TAB_TITLE" /> sera fermé</translation> <translation id="281504910091592009">Afficher et gérer les mots de passe enregistrés dans votre <ph name="BEGIN_LINK" />compte Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Le menu de la carte de flux est ouvert à mi-hauteur</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 089e53f..2abb303 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">O sitio está en pausa</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Produciuse un erro en 1 descarga}other{Produciuse un erro en # descargas}}</translation> <translation id="2067805253194386918">texto</translation> +<translation id="2079545284768500474">Desfacer</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Mostrando vista compacta</translation> <translation id="2093731487903423814">últimos 15 minutos</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Quedan <ph name="SECONDS" /> segundos</translation> <translation id="2779651927720337254">produciuse un erro</translation> <translation id="2781151931089541271">Queda 1 segundo</translation> +<translation id="2789486458103222910">Aceptar</translation> <translation id="2800066122460699237">Pecharase a pestana <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Para consultar e xestionar os contrasinais gardados, accede á túa <ph name="BEGIN_LINK" />Conta de Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">O menú da tarxeta do feed ocupa a metade inferior da pantalla</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index efc1be9..33c616a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">સાઇટ રોકવામાં આવી</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ડાઉનલોડ નિષ્ફળ થયું}one{# ડાઉનલોડ નિષ્ફળ થયું}other{# ડાઉનલોડ નિષ્ફળ થયાં}}</translation> <translation id="2067805253194386918">ટેક્સ્ટ</translation> +<translation id="2079545284768500474">છેલ્લો ફેરફાર રદ કરો</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> માંથી <ph name="RESULT_NUMBER" /> પરિણામ</translation> <translation id="2091863218454846791">નાનો વ્યૂ બતાવી રહ્યાં છે</translation> <translation id="2093731487903423814">છેલ્લી 15 મિનિટ</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> સેકંડ બાકી</translation> <translation id="2779651927720337254">નિષ્ફળ થયું</translation> <translation id="2781151931089541271">1 સેકંડ બાકી</translation> +<translation id="2789486458103222910">બરાબર, સમજાઇ ગયું</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ટૅબ બંધ કરવામાં આવશે</translation> <translation id="281504910091592009">સાચવેલા પાસવર્ડ તમારા <ph name="BEGIN_LINK" />Google એકાઉન્ટ<ph name="END_LINK" />માં જુઓ અને મેનેજ કરો</translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">અજ્ઞાત</translation> <translation id="5833984609253377421">લિંક શેર કરો</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" /> વડે PDF ખોલીએ?</translation> <translation id="5853623416121554550">થોભાવેલ</translation> <translation id="5855546874025048181">આને સુધારો: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">કંઈક ખોટું થયું. કિંમત અપડેટ કરી શક્યા નથી.</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">હોમપેજમાં ફેરફાર કરો</translation> <translation id="8130309322784422030">તમારી સ્ટોર કરેલી સાઇન ઇનની માહિતી જૂની હોઈ શકે છે</translation> <translation id="813082847718468539">સ્થાન માહિતી જુઓ</translation> +<translation id="8135406045838672858">ડાઉનલોડ કરેલી PDFs <ph name="APP_NAME" /> વડે ઑટોમૅટિક રીતે ખુલે છે</translation> <translation id="8137562778192957619">તમારે આ પાસવર્ડ યાદ રાખવાની જરૂર રહેશે નહીં. તેને Google Password Managerમાં સાચવવામાં આવશે.</translation> <translation id="8186512483418048923"><ph name="FILES" /> ફાઇલ બાકી છે</translation> <translation id="8190358571722158785">1 દિવસ બાકી</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index e273bfb..6963f78 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">साइट रोकी गई</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 डाउनलोड नहीं हो सका}one{# डाउनलोड नहीं हो सके}other{# डाउनलोड नहीं हो सके}}</translation> <translation id="2067805253194386918">टेक्स्ट</translation> +<translation id="2079545284768500474">पहले जैसा करें</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> में से <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2091863218454846791">कॉम्पैक्ट व्यू दिखाया जा रहा है</translation> <translation id="2093731487903423814">पिछले 15 मिनट का</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> सेकंड शेष</translation> <translation id="2779651927720337254">डाउनलोड नहीं हो सका</translation> <translation id="2781151931089541271">1 सेकंड शेष</translation> +<translation id="2789486458103222910">ठीक है</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> टैब बंद हो जाएगा</translation> <translation id="281504910091592009">अपने <ph name="BEGIN_LINK" />Google खाते<ph name="END_LINK" /> में सेव किए गए पासवर्ड देखें और उन्हें प्रबंधित करें</translation> <translation id="2827278682606527653">फ़ीड कार्ड मेन्यू आधा खुल गया है</translation> @@ -1300,7 +1302,7 @@ <translation id="7810647596859435254">इसमें खोलें…</translation> <translation id="7814066895362068701">{FILE_COUNT,plural, =1{सभी फ़ाइलें, सूची में 1 फ़ाइल है}one{सभी फ़ाइलें, सूची में # फ़ाइल है}other{सभी फ़ाइलें, सूची में # फ़ाइलें हैं}}</translation> <translation id="7815484226266492798">लंबा स्क्रीनशॉट</translation> -<translation id="7821130663268546430">आपको टैब बदलने की सुविधा में, खुले हुए सभी टैब मिल सकते हैं</translation> +<translation id="7821130663268546430">आपको टैब बदलने की सुविधा में, खुले हुए सभी टैब मिलेंगे</translation> <translation id="7822705602465980873">Google खाते में साइन इन करने पर, यह डेटा आपके Google खाते से लिंक हो जाता है. ऐसा, Google की सभी सेवाओं पर आपके डेटा की सुरक्षा के लिए किया जाता है. जैसे, डेटा की सुरक्षा से जुड़े किसी मामले के बाद, Gmail में आपके डेटा की सुरक्षा बढ़ाना.</translation> <translation id="78270725016672455">किसी साइट पर साइन इन करने के लिए, आपका कंप्यूटर इस डिवाइस को रजिस्टर करना चाहता है</translation> <translation id="7844171778363018843">सिंक करने के लिए कोई भी डेटा नहीं चुना गया</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 7a3d69c9..aa939996 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Verzija aplikacije</translation> <translation id="1428770807407000502">Isključiti sinkronizaciju?</translation> <translation id="1430915738399379752">Ispis</translation> +<translation id="1435593198351412143">Automatsko otvaranje PDF-ova</translation> <translation id="1436784010935106834">Uklonjeno</translation> <translation id="1437543266176261764">Izvodi se u aplikaciji <ph name="APP_NAME" /></translation> <translation id="1448440926884431741">Praćene proizvode organizirajte u mapi Oznake</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Web-lokacija pauzirana</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 preuzimanje nije uspjelo}one{# preuzimanje nije uspjelo}few{# preuzimanja nisu uspjela}other{# preuzimanja nije uspjelo}}</translation> <translation id="2067805253194386918">SMS</translation> +<translation id="2079545284768500474">Poništi</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /> rezultata</translation> <translation id="2091863218454846791">Prikazuje se kompaktni prikaz</translation> <translation id="2093731487903423814">posljednjih 15 minuta</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389">Preostalo sekundi: <ph name="SECONDS" /></translation> <translation id="2779651927720337254">nije uspjelo</translation> <translation id="2781151931089541271">Još 1 s</translation> +<translation id="2789486458103222910">U redu</translation> <translation id="2800066122460699237">Zatvorit će se kartica <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Spremljene zaporke možete pregledati i upravljati njima na svojem <ph name="BEGIN_LINK" />Google računu<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Ne usporava primjetno preglednik ili uređaj.</translation> <translation id="2900528713135656174">Stvori događaj</translation> <translation id="2901411048554510387">Prikazuju se prijedlozi za <ph name="WEBSITE_TITLE" /></translation> +<translation id="2904300462646366554">Preuzeti PDF-ovi automatski se otvaraju pomoću jednog od preglednika za PDF na vašem uređaju</translation> <translation id="2904414404539560095">Popis za odabir uređaja s kojim će se dijeliti kartica otvoren punom visinom.</translation> <translation id="2908243544703713905">Nepročitani članci su spremni</translation> <translation id="2909615210195135082">Googleova platforma za obavijesti</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava pridržana.</translation> <translation id="5814749351757353073">Pratite svoje omiljene web-lokacije</translation> <translation id="5822875253699806474">Da biste se brzo vratili na web-lokacije koje ste posjetili, sinkronizirajte kartice i povijest</translation> +<translation id="5829586821381540080">Spremljeno na popis <ph name="FOLDER_NAME" /></translation> <translation id="583281660410589416">Nepoznato</translation> <translation id="5833984609253377421">Dijeli vezu</translation> <translation id="5839058148541733625">Dinosaur na Chromeu</translation> +<translation id="5848257610304005265">Želite li otvoriti PDF pomoću aplikacije <ph name="APP_NAME" />?</translation> <translation id="5853623416121554550">pauzirano</translation> <translation id="5855546874025048181">Suzi pretraživanje: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Nešto nije u redu. Ažuriranje praćenja cijene nije uspjelo.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">Uređivanje početne stranice</translation> <translation id="8130309322784422030">Pohranjeni podaci o prijavi možda su zastarjeli</translation> <translation id="813082847718468539">Prikaz informacija o web-lokaciji</translation> +<translation id="8135406045838672858">Preuzeti PDF-ovi automatski se otvaraju pomoću aplikacije <ph name="APP_NAME" /></translation> <translation id="8137562778192957619">Nećete morati pamtiti tu zaporku. Spremit će se u Google upravitelj zaporki.</translation> <translation id="8186512483418048923">Preostalo datoteka: <ph name="FILES" /></translation> <translation id="8190358571722158785">Još 1 dan</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index aec368b..a3f01032 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">A webhely szüneteltetve van</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 letöltés nem sikerült}other{# letöltés nem sikerült}}</translation> <translation id="2067805253194386918">szöveg</translation> +<translation id="2079545284768500474">Visszavonás</translation> <translation id="2082238445998314030">Eredmény: <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">A kompakt nézet megjelenítése folyamatban van</translation> <translation id="2093731487903423814">az elmúlt 15 perc</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> másodperc van hátra</translation> <translation id="2779651927720337254">sikertelen</translation> <translation id="2781151931089541271">1 másodperc van hátra</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">A lap (<ph name="TAB_TITLE" />) be lesz zárva</translation> <translation id="281504910091592009">Mentett jelszavait megtekintheti és kezelheti <ph name="BEGIN_LINK" />Google-fiókjában<ph name="END_LINK" /></translation> <translation id="2827278682606527653">A hírcsatornakártya menüje félmagasságban van megnyitva</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index a03fe11..db7ac6aa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Կայքը դադարեցված է</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Չհաջողվեց ներբեռնել 1 ֆայլ}one{Չհաջողվեց ներբեռնել # ֆայլ}other{Չհաջողվեց ներբեռնել # ֆայլ}}</translation> <translation id="2067805253194386918">տեքստ</translation> +<translation id="2079545284768500474">Հետարկել</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />-ից <ph name="TOTAL_RESULTS" /> արդյունք</translation> <translation id="2091863218454846791">Ցուցադրված է սեղմ տեսքը</translation> <translation id="2093731487903423814">վերջին 15 րոպեն</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Մնացել է <ph name="SECONDS" /> վրկ</translation> <translation id="2779651927720337254">չհաջողվեց ներբեռնել</translation> <translation id="2781151931089541271">Մնացել է 1 վրկ</translation> +<translation id="2789486458103222910">Եղավ</translation> <translation id="2800066122460699237">«<ph name="TAB_TITLE" />» ներդիրը կփակվի</translation> <translation id="281504910091592009">Դիտեք և կառավարեք պահված գաղտնաբառերը ձեր <ph name="BEGIN_LINK" />Google հաշվում<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Լրահոսի քարտի ընտրացանկը բացված է կիսով չափ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 419c135..0ed8a24c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Situs dijeda</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 download gagal}other{# download gagal}}</translation> <translation id="2067805253194386918">teks</translation> +<translation id="2079545284768500474">Urungkan</translation> <translation id="2082238445998314030">Hasil <ph name="RESULT_NUMBER" /> dari <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Menampilkan tampilan ringkas</translation> <translation id="2093731487903423814">15 menit terakhir</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> detik lagi</translation> <translation id="2779651927720337254">gagal</translation> <translation id="2781151931089541271">1 detik lagi</translation> +<translation id="2789486458103222910">Oke</translation> <translation id="2800066122460699237">Tab <ph name="TAB_TITLE" /> akan ditutup</translation> <translation id="281504910091592009">Lihat dan kelola sandi tersimpan di <ph name="BEGIN_LINK" />Akun Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feed card menu half height</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 147caa3..936ec84 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Hlé gert á vefsvæði</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Mistókst að sækja eina skrá}one{Mistókst að sækja # skrá}other{Mistókst að sækja # skrár}}</translation> <translation id="2067805253194386918">texti</translation> +<translation id="2079545284768500474">Afturkalla</translation> <translation id="2082238445998314030">Niðurstaða <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Sýnir minna yfirlit</translation> <translation id="2093731487903423814">síðustu 15 mínútum</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sek. eftir</translation> <translation id="2779651927720337254">mistókst</translation> <translation id="2781151931089541271">Ein sek. eftir</translation> +<translation id="2789486458103222910">Í lagi</translation> <translation id="2800066122460699237">Flipanum <ph name="TAB_TITLE" /> verður lokað</translation> <translation id="281504910091592009">Þú getur skoðað og haft umsjón með vistuðum aðgangsorðum á <ph name="BEGIN_LINK" />Google reikningnum<ph name="END_LINK" /> þínum</translation> <translation id="2827278682606527653">Feed card menu half height</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index 689a89d..ebe0982 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Sito in pausa</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 download non riuscito}other{# download non riusciti}}</translation> <translation id="2067805253194386918">testo</translation> +<translation id="2079545284768500474">Annulla</translation> <translation id="2082238445998314030">Risultato <ph name="RESULT_NUMBER" /> di <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Visualizzazione compatta selezionata</translation> <translation id="2093731487903423814">ultimi 15 minuti</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sec rimanenti</translation> <translation id="2779651927720337254">non riuscito</translation> <translation id="2781151931089541271">1 sec rimanente</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">La scheda <ph name="TAB_TITLE" /> verrà chiusa</translation> <translation id="281504910091592009">Visualizza e gestisci le password salvate nel tuo <ph name="BEGIN_LINK" />Account Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Menu scheda feed aperto nella metà inferiore dello schermo</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 c9c6c2c..5ecaf73 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">האתר מושהה</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{הורדה אחת נכשלה}one{# הורדות נכשלו}two{# הורדות נכשלו}other{# הורדות נכשלו}}</translation> <translation id="2067805253194386918">טקסט</translation> +<translation id="2079545284768500474">ביטול הפעולה</translation> <translation id="2082238445998314030">תוצאה <ph name="RESULT_NUMBER" /> מתוך <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">מוצגת תצוגה קומפקטית</translation> <translation id="2093731487903423814">15 הדקות האחרונות</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">נותרו <ph name="SECONDS" /> שניות</translation> <translation id="2779651927720337254">נכשל</translation> <translation id="2781151931089541271">נותרה שנייה אחת</translation> +<translation id="2789486458103222910">אישור</translation> <translation id="2800066122460699237">הכרטיסייה <ph name="TAB_TITLE" /> תיסגר</translation> <translation id="281504910091592009">הצגה וניהול של סיסמאות שמורות ב<ph name="BEGIN_LINK" />חשבון Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">תפריט כרטיס הפיד נפתח בחצי מגובה המסך</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index eac8163a..4518a526 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">サイト一時停止中</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 件のダウンロードが失敗しました}other{# 件のダウンロードが失敗しました}}</translation> <translation id="2067805253194386918">テキスト</translation> +<translation id="2079545284768500474">元に戻す</translation> <translation id="2082238445998314030">結果 <ph name="TOTAL_RESULTS" /> 件中 <ph name="RESULT_NUMBER" /> 件目</translation> <translation id="2091863218454846791">コンパクト表示を表示しています</translation> <translation id="2093731487903423814">過去 15 分間</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389">残り <ph name="SECONDS" /> 秒</translation> <translation id="2779651927720337254">失敗</translation> <translation id="2781151931089541271">残り 1 秒</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">「<ph name="TAB_TITLE" />」タブが閉じられます</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google アカウント<ph name="END_LINK" />での保存パスワードの表示と管理</translation> <translation id="2827278682606527653">フィードカード メニューが画面の下半分に開いています</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 9006fc4..24f3c76d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">საიტი დაპაუზებულია</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ჩამოტვირთვა ვერ მოხერხდა}other{# ჩამოტვირთვა ვერ მოხერხდა}}</translation> <translation id="2067805253194386918">ტექსტი</translation> +<translation id="2079545284768500474">მოქმედების გაუქმება</translation> <translation id="2082238445998314030">შედეგი <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" />-დან</translation> <translation id="2091863218454846791">ნაჩვენებია კომპაქტური ხედი</translation> <translation id="2093731487903423814">ბოლო 15 წუთში</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">დარჩენილია <ph name="SECONDS" /> წმ</translation> <translation id="2779651927720337254">ვერ მოხერხდა</translation> <translation id="2781151931089541271">დარჩენილია 1 წმ</translation> +<translation id="2789486458103222910">კარგი</translation> <translation id="2800066122460699237">ჩანართი „<ph name="TAB_TITLE" />“ დაიხურება</translation> <translation id="281504910091592009">ნახეთ და მართეთ შენახული პაროლები თქვენს <ph name="BEGIN_LINK" />Google ანგარიშში<ph name="END_LINK" /></translation> <translation id="2827278682606527653">არხის ბარათის მენიუ ნახევარ სიმაღლეზე</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 021efea..6a33af48 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Сайттың жұмысы уақытша тоқтады.</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 файл жүктеп алынбады}other{# файл жүктеп алынбады}}</translation> <translation id="2067805253194386918">мәтін</translation> +<translation id="2079545284768500474">Қайтару</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ішінен <ph name="RESULT_NUMBER" /> нәтиже</translation> <translation id="2091863218454846791">Шағын көрініс таңдалды</translation> <translation id="2093731487903423814">соңғы 15 минут</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> сек қалды</translation> <translation id="2779651927720337254">қате шықты</translation> <translation id="2781151931089541271">1 сек қалды</translation> +<translation id="2789486458103222910">Жарайды</translation> <translation id="2800066122460699237">"<ph name="TAB_TITLE" />" қойындысы жабылады.</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google аккаунтыңызда<ph name="END_LINK" /> сақталған құпия сөздерді көру және басқару</translation> <translation id="2827278682606527653">Фид картасының мәзірі жартылай ашылды.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index ebfb93d..f6019fb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">បានផ្អាកគេហទំព័រ</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{ការទាញយក 1 បានបរាជ័យ}other{ការទាញយក # បានបរាជ័យ}}</translation> <translation id="2067805253194386918">អត្ថបទ</translation> +<translation id="2079545284768500474">ត្រឡប់វិញ</translation> <translation id="2082238445998314030">លទ្ធផល <ph name="RESULT_NUMBER" /> នៃ <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">បង្ហាញទិដ្ឋភាពចង្អៀតខ្លាំង</translation> <translation id="2093731487903423814">15 នាទីចុងក្រោយ</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389">នៅសល់ <ph name="SECONDS" /> វិនាទីទៀត</translation> <translation id="2779651927720337254">បានបរាជ័យ</translation> <translation id="2781151931089541271">នៅសល់ 1 វិនាទីទៀត</translation> +<translation id="2789486458103222910">យល់ព្រម</translation> <translation id="2800066122460699237">ផ្ទាំង <ph name="TAB_TITLE" /> នឹងត្រូវបានបិទ</translation> <translation id="281504910091592009">មើល និងគ្រប់គ្រងពាក្យសម្ងាត់ដែលបានរក្សាទុកនៅក្នុង<ph name="BEGIN_LINK" />គណនី Google<ph name="END_LINK" /> របស់អ្នក</translation> <translation id="2827278682606527653">ម៉ឺនុយកាតព័ត៌មានត្រូវបានបើកពាក់កណ្ដាលអេក្រង់</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">មិនស្គាល់</translation> <translation id="5833984609253377421">ចែករំលែកតំណ</translation> <translation id="5839058148541733625">Chrome ដាយណូស័រ</translation> +<translation id="5848257610304005265">បើក PDF ដោយប្រើ <ph name="APP_NAME" /> ឬ?</translation> <translation id="5853623416121554550">បានផ្អាក</translation> <translation id="5855546874025048181">កែលម្អ៖ <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">មានអ្វីមួយខុសប្រក្រតី។ មិនអាចធ្វើបច្ចុប្បន្នភាពការតាមដានតម្លៃបានទេ។</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">កែទំព័រដើម</translation> <translation id="8130309322784422030">ព័ត៌មានចូលគណនីដែលអ្នកបានរក្សាទុកប្រហែលជាហួសសម័យហើយ</translation> <translation id="813082847718468539">មើលព័ត៌មានគេហទំព័រ</translation> +<translation id="8135406045838672858">PDF ដែលបានទាញយកបើកដោយប្រើ <ph name="APP_NAME" /> ដោយស្វ័យប្រវត្តិ</translation> <translation id="8137562778192957619">អ្នកនឹងមិនចាំបាច់ចងចាំពាក្យសម្ងាត់នេះទេ។ ពាក្យសម្ងាត់នេះនឹងត្រូវបានរក្សាទុកទៅក្នុងកម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់។</translation> <translation id="8186512483418048923">នៅសល់ឯកសារចំនួន <ph name="FILES" /></translation> <translation id="8190358571722158785">នៅសល់ 1 ថ្ងៃទៀត</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 b81afc14..1fa8224 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
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">ಅಪ್ಲಿಕೇಶನ್ ಆವೃತ್ತಿ</translation> <translation id="1428770807407000502">ಸಿಂಕ್ ಆಫ್ ಮಾಡಬೇಕೆ?</translation> <translation id="1430915738399379752">ಮುದ್ರಿಸು</translation> +<translation id="1435593198351412143">PDF ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆರೆಯಿರಿ</translation> <translation id="1436784010935106834">ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation> <translation id="1437543266176261764"><ph name="APP_NAME" /> ನಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ</translation> <translation id="1448440926884431741">ನಿಮ್ಮ ಟ್ರ್ಯಾಕ್ ಮಾಡಿದ ಉತ್ಪನ್ನಗಳನ್ನು Bookmarks ನಲ್ಲಿ ಆಯೋಜಿಸಿ</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">ಸೈಟ್ ಅನ್ನು ಅಮಾನತುಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ಡೌನ್ಲೋಡ್ ವಿಫಲವಾಗಿದೆ}one{# ಡೌನ್ಲೋಡ್ಗಳು ವಿಫಲವಾಗಿವೆ}other{# ಡೌನ್ಲೋಡ್ಗಳು ವಿಫಲವಾಗಿವೆ}}</translation> <translation id="2067805253194386918">ಪಠ್ಯ</translation> +<translation id="2079545284768500474">ರದ್ದುಮಾಡಿ</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ರಲ್ಲಿ <ph name="RESULT_NUMBER" /> ಫಲಿತಾಂಶಗಳು</translation> <translation id="2091863218454846791">ಕಾಂಪ್ಯಾಕ್ಟ್ ವೀಕ್ಷಣೆಯನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="2093731487903423814">ಹಿಂದಿನ 15 ನಿಮಿಷಗಳು</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿವೆ</translation> <translation id="2779651927720337254">ವಿಫಲವಾಗಿದೆ</translation> <translation id="2781151931089541271">1 ಸೆಕೆಂಡು ಉಳಿದಿದೆ</translation> +<translation id="2789486458103222910">ಸರಿ</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ಟ್ಯಾಬ್ ಅನ್ನು ಮುಚ್ಚಲಾಗುತ್ತದೆ</translation> <translation id="281504910091592009">ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿಮ್ಮ <ph name="BEGIN_LINK" />Google ಖಾತೆಯಲ್ಲಿ<ph name="END_LINK" /> ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ</translation> <translation id="2827278682606527653">ಫೀಡ್ ಕಾರ್ಡ್ ಮೆನು ಅರ್ಧ ಎತ್ತರದಲ್ಲಿ ತೆರೆದಿದೆ</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅಥವಾ ಸಾಧನವನ್ನು ಗಮನಾರ್ಹವಾಗಿ ನಿಧಾನಗೊಳಿಸುವುದಿಲ್ಲ.</translation> <translation id="2900528713135656174">ಈವೆಂಟ್ ರಚಿಸು</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> ಗಾಗಿ ಸಲಹೆಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="2904300462646366554">ಡೌನ್ಲೋಡ್ ಮಾಡಿದ PDF ಗಳು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಯಾವುದೇ PDF ವೀಕ್ಷಕದೊಂದಿಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆರೆಯಲ್ಪಡುತ್ತವೆ</translation> <translation id="2904414404539560095">ಟ್ಯಾಬ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಬೇಕಾದ ಸಾಧನಗಳ ಪಟ್ಟಿಯನ್ನು ಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation> <translation id="2908243544703713905">ಓದದಿರುವ ಸ್ಟೋರಿಗಳು ಸಿದ್ಧವಾಗಿವೆ</translation> <translation id="2909615210195135082">Google ಅಧಿಸೂಚನೆಗಳು ಪ್ಲ್ಯಾಟ್ಫಾರ್ಮ್</translation> @@ -893,9 +897,11 @@ <translation id="5810288467834065221">ಕೃತಿಸ್ವಾಮ್ಯ <ph name="YEAR" /> Google LLC. ಎಲ್ಲ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation> <translation id="5814749351757353073">ನಿಮ್ಮ ಮೆಚ್ಚಿನ ಸೈಟ್ಗಳನ್ನು ಇರಿಸಿಕೊಳ್ಳಿ</translation> <translation id="5822875253699806474">ನೀವು ಭೇಟಿ ನೀಡಿದ ಸೈಟ್ಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಹಿಂತಿರುಗಲು, ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> ನಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="583281660410589416">ಅಪರಿಚಿತ</translation> <translation id="5833984609253377421">ಲಿಂಕ್ ಹಂಚಿಕೊಳ್ಳಿ</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" /> ಮೂಲಕ PDF ತೆರೆಯಬೇಕೆ?</translation> <translation id="5853623416121554550">ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="5855546874025048181">ಪರಿಷ್ಕರಿಸಿ: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">ಏನೋ ತಪ್ಪಾಗಿದೆ. ಟ್ರ್ಯಾಕ್ ಬೆಲೆಯನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> @@ -1378,6 +1384,7 @@ <translation id="8127542551745560481">ಮುಖಪುಟವನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="8130309322784422030">ನೀವು ಸಂಗ್ರಹಿಸಿದ ಸೈನ್-ಇನ್ ಮಾಹಿತಿಯು ಹಳೆಯದಾಗಿರಬಹುದು</translation> <translation id="813082847718468539">ಸೈಟ್ ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಿ</translation> +<translation id="8135406045838672858"><ph name="APP_NAME" /> ಮೂಲಕ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾದ PDF ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆರೆಯುತ್ತದೆ</translation> <translation id="8137562778192957619">ನೀವು ಈ ಪಾಸ್ವರ್ಡ್ ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವ ಅಗತ್ಯವಿಲ್ಲ. ಅದನ್ನು Google Password Manager ನಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗುತ್ತದೆ</translation> <translation id="8186512483418048923"><ph name="FILES" /> ಬಾಕಿ ಉಳಿದಿರುವ ಫೈಲ್ಗಳು</translation> <translation id="8190358571722158785">1 ದಿನ ಉಳಿದಿದೆ</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 3387d6c..b4c7307 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">사이트 일시중지됨</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{다운로드 1개 실패}other{다운로드 #개 실패}}</translation> <translation id="2067805253194386918">텍스트</translation> +<translation id="2079545284768500474">실행취소</translation> <translation id="2082238445998314030">전체 결과 <ph name="TOTAL_RESULTS" />개 중 <ph name="RESULT_NUMBER" />개</translation> <translation id="2091863218454846791">간단히 보기 표시 중</translation> <translation id="2093731487903423814">지난 15분</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" />초 남음</translation> <translation id="2779651927720337254">실패</translation> <translation id="2781151931089541271">1초 남음</translation> +<translation id="2789486458103222910">확인</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> 탭이 닫힙니다.</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google 계정<ph name="END_LINK" />에서 저장된 비밀번호 보기 및 관리</translation> <translation id="2827278682606527653">피드 카드 메뉴 절반 높이</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 32810747..4d1d273 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Колдонмонун версиясы</translation> <translation id="1428770807407000502">Шайкештирүү өчүрүлсүнбү?</translation> <translation id="1430915738399379752">Басып чыгаруу</translation> +<translation id="1435593198351412143">PDF файлдарын автоматтык түрдө ачуу</translation> <translation id="1436784010935106834">Чыгарылып салынган</translation> <translation id="1437543266176261764"><ph name="APP_NAME" /> колдонмосунда иштеп жатат</translation> <translation id="1448440926884431741">Көз салган товарларды Кыстармаларда иреттей аласыз</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Сайт тындырылды</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 файл жүктөлүп алынбай калды}other{# файл жүктөлүп алынбай калды}}</translation> <translation id="2067805253194386918">текст</translation> +<translation id="2079545284768500474">Кайтаруу</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ичинен <ph name="RESULT_NUMBER" /> натыйжа</translation> <translation id="2091863218454846791">Чакан көрүнүш</translation> <translation id="2093731487903423814">акыркы 15 мүнөттө</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> сек. калды</translation> <translation id="2779651927720337254">ката</translation> <translation id="2781151931089541271">1 сек. калды</translation> +<translation id="2789486458103222910">Жарайт</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> өтмөгү жабылат</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google аккаунтуңузда<ph name="END_LINK" /> сакталган сырсөздөрдү көрүп, башкарыңыз</translation> <translation id="2827278682606527653">Түрмөктөгү меню экрандын жарымына чейин ачылды</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Серепчиңиздин же түзмөгүңүздүн ишин байкалаарлык деңгээлде жайлатпайт.</translation> <translation id="2900528713135656174">Иш-чара түзүү</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> сунуштары көрсөтүлүүдө</translation> +<translation id="2904300462646366554">Жүктөлүп алынган PDF файлдары түзмөгүңүздөгү PDF көрүүчү каражаттарынын бири менен автоматтык түрдө ачылат</translation> <translation id="2904414404539560095">Жалпы түзмөктөрдүн тизмеси көрсөтүлгөн өтмөк толук экран режиминде ачылды.</translation> <translation id="2908243544703713905">Окула элек окуялар бар</translation> <translation id="2909615210195135082">Google билдирмелеринин платформасы</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">© Google LLC, <ph name="YEAR" /> Баардык укуктар корголгон.</translation> <translation id="5814749351757353073">Жактырган сайттарыңызды колдоно бериңиз</translation> <translation id="5822875253699806474">Көргөн сайттарга тез кайтуу үчүн өтмөктөр менен таржымалды шайкештириңиз</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> тизмесине сакталды</translation> <translation id="583281660410589416">Белгисиз</translation> <translation id="5833984609253377421">Шилтеме менен бөлүшүү</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265">PDF файлы <ph name="APP_NAME" /> колдонмосу менен ачылсынбы?</translation> <translation id="5853623416121554550">тындырылды</translation> <translation id="5855546874025048181">Өркүндөтүү: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Бир жерден ката кетти. Баасына көз салуу жаңыртылбай койду.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">Башкы бетти түзөтүү</translation> <translation id="8130309322784422030">Сакталган кирүү маалыматынын мөөнөтү өтүп кеткен окшойт</translation> <translation id="813082847718468539">Сайттын маалыматын карап көрүү</translation> +<translation id="8135406045838672858">Жүктөлүп алынган PDF файлдары <ph name="APP_NAME" /> колдонмосу менен автоматтык түрдө ачылат</translation> <translation id="8137562778192957619">Бул сырсөздү эстеп калуунун кереги жок. Ал Google'дун Сырсөздөрдү башкаргыч кызматында сакталат.</translation> <translation id="8186512483418048923"><ph name="FILES" /> файл калды</translation> <translation id="8190358571722158785">1 күн калды</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 4430d78..f1e414fc 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
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">ເວີຊັນແອັບພລິເຄຊັນ</translation> <translation id="1428770807407000502">ປິດການຊິ້ງຂໍ້ມູນບໍ?</translation> <translation id="1430915738399379752">ພິມ</translation> +<translation id="1435593198351412143">ເປີດ PDF ໂດຍອັດຕະໂນມັດ</translation> <translation id="1436784010935106834">ເອົາອອກໄປແລ້ວ</translation> <translation id="1437543266176261764">ກຳລັງເຮັດວຽກຢູ່ໃນ <ph name="APP_NAME" /></translation> <translation id="1448440926884431741">ຈັດລະບຽບສິນຄ້າທີ່ຕິດຕາມແລ້ວຂອງທ່ານໃນບຸກມາກ</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">ຢຸດເວັບໄຊໄວ້ຊົ່ວຄາວແລ້ວ</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ການດາວໂຫຼດບໍ່ສຳເລັດ}other{# ການດາວໂຫຼດບໍ່ສຳເລັດ}}</translation> <translation id="2067805253194386918">ຂໍ້ຄວາມ</translation> +<translation id="2079545284768500474">ບໍ່ເຮັດ</translation> <translation id="2082238445998314030">ຜົນຮັບ <ph name="RESULT_NUMBER" /> ຈາກ <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">ການສະແດງມຸມມອງກະທັດຮັດ</translation> <translation id="2093731487903423814">15 ນາທີຫຼ້າສຸດ</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389">ຍັງເຫຼືອ <ph name="SECONDS" /> ວິ</translation> <translation id="2779651927720337254">ບໍ່ສໍາເລັດ</translation> <translation id="2781151931089541271">ຍັງເຫຼືອ 1 ວິ</translation> +<translation id="2789486458103222910">ຕົກລົງ</translation> <translation id="2800066122460699237">ແຖບ <ph name="TAB_TITLE" /> ຈະຖືກປິດ</translation> <translation id="281504910091592009">ເບິ່ງ ແລະ ຈັດການລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ໃນ <ph name="BEGIN_LINK" />ບັນຊີ Google<ph name="END_LINK" /> ຂອງທ່ານ</translation> <translation id="2827278682606527653">ເມນູບັດຟີດເປີດໄວ້ເຄິ່ງລວງສູງ</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">ບໍ່ເຮັດໃຫ້ໂປຣແກຣມທ່ອງເວັບ ຫຼື ອຸປະກອນຂອງທ່ານເຮັດວຽກຊ້າລົງຢ່າງເຫັນໄດ້ຊັດ.</translation> <translation id="2900528713135656174">ສ້າງເຫດການ</translation> <translation id="2901411048554510387">ກຳລັງສະແດງການແນະນຳສຳລັບ <ph name="WEBSITE_TITLE" /></translation> +<translation id="2904300462646366554">PDF ທີ່ດາວໂຫຼດແລ້ວຈະເປີດຂຶ້ນດ້ວຍໜຶ່ງໃນໂປຣແກຣມເບິ່ງ PDF ຢູ່ອຸປະກອນຂອງທ່ານໂດຍອັດຕະໂນມັດ</translation> <translation id="2904414404539560095">ລາຍການອຸປະກອນທີ່ຈະແບ່ງປັນແຖບນຳໂດຍເປີດຢູ່ທີ່ລະດັບລວງສູງເຕັມຈໍ.</translation> <translation id="2908243544703713905">ຂ່າວທີ່ຍັງບໍ່ໄດ້ອ່ານພ້ອມແລ້ວ</translation> <translation id="2909615210195135082">ແພລດຟອມການແຈ້ງເຕືອນຂອງ Google</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">ລິຂະສິດ <ph name="YEAR" /> Google LLC. ສະຫງວນສິດທັງໝົດ.</translation> <translation id="5814749351757353073">ຕິດຕາມເວັບໄຊທີ່ທ່ານມັກ</translation> <translation id="5822875253699806474">ເພື່ອກັບຄືນໄປຫາເວັບໄຊທີ່ທ່ານໄດ້ເຂົ້າເບິ່ງຢ່າງໄວວາ, ໃຫ້ຊິ້ງຂໍ້ມູນແຖບ ແລະປະຫວັດຂອງທ່ານ</translation> +<translation id="5829586821381540080">ບັນທຶກໃນ <ph name="FOLDER_NAME" /> ແລ້ວ</translation> <translation id="583281660410589416">ບໍ່ຮູ້ຈັກ</translation> <translation id="5833984609253377421">ແບ່ງປັນລິ້ງ</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265">ເປີດ PDF ດ້ວຍ <ph name="APP_NAME" /> ບໍ?</translation> <translation id="5853623416121554550">ຢຸດຊົ່ວຄາວແລ້ວ</translation> <translation id="5855546874025048181">ປັບປ່ຽນ: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ. ບໍ່ສາມາດອັບເດດການຕິດຕາມລາຄາໄດ້.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">ແກ້ໄຂໜ້າຫຼັກ</translation> <translation id="8130309322784422030">ຂໍ້ມູນການເຂົ້າສູ່ລະບົບທີ່ທ່ານຈັດເກັບໄວ້ອາດເກົ່າແລ້ວ</translation> <translation id="813082847718468539">ເບິ່ງຂໍ້ມູນເວັບໄຊທ໌</translation> +<translation id="8135406045838672858">PDF ທີ່ດາວໂຫຼດແລ້ວຈະເປີດຂຶ້ນໂດຍອັດຕະໂນມັດດ້ວຍ <ph name="APP_NAME" /></translation> <translation id="8137562778192957619">ທ່ານບໍ່ຈຳເປັນຕ້ອງຈື່ລະຫັດຜ່ານນີ້. ລະບົບຈະບັນທຶກໄວ້ໃນຕົວຈັດການລະຫັດຜ່ານ Google.</translation> <translation id="8186512483418048923">ຍັງເຫຼືອ <ph name="FILES" /> ໄຟລ໌</translation> <translation id="8190358571722158785">ຍັງເຫຼືອ 1 ມື້</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 628dde4..2447ca6 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Svetainė pristabdyta</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Nepavyko atlikti 1 atsisiuntimo}one{Nepavyko atlikti # atsisiuntimo}few{Nepavyko atlikti # atsisiuntimų}many{Nepavyko atlikti # atsisiuntimo}other{Nepavyko atlikti # atsisiuntimų}}</translation> <translation id="2067805253194386918">teksto pranešimas</translation> +<translation id="2079545284768500474">Anuliuoti</translation> <translation id="2082238445998314030">Rezultatų: <ph name="RESULT_NUMBER" /> iš <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Rodomas kompaktiškas rodinys</translation> <translation id="2093731487903423814">pastarosios penkiolika minučių</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Liko <ph name="SECONDS" /> sek.</translation> <translation id="2779651927720337254">nepavyko</translation> <translation id="2781151931089541271">Liko 1 sek.</translation> +<translation id="2789486458103222910">Gerai</translation> <translation id="2800066122460699237">Skirtukas „<ph name="TAB_TITLE" />“ bus uždarytas</translation> <translation id="281504910091592009">Peržiūrėkite ir tvarkykite išsaugotus slaptažodžius <ph name="BEGIN_LINK" />„Google“ paskyroje<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Sklaidos kanalo kortelės meniu atidarytas iki pusės</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 8efad7e..622066b 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Vietne apturēta</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 lejupielāde neizdevās}zero{# lejupielādes neizdevās}one{# lejupielāde neizdevās}other{# lejupielādes neizdevās}}</translation> <translation id="2067805253194386918">teksts</translation> +<translation id="2079545284768500474">Atsaukt</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultāts no <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Tiek rādīts kompaktais skats</translation> <translation id="2093731487903423814">pēdējās 15 minūtes</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Atlikušas <ph name="SECONDS" /> s</translation> <translation id="2779651927720337254">neizdevās</translation> <translation id="2781151931089541271">Atlikusi 1 s</translation> +<translation id="2789486458103222910">Labi</translation> <translation id="2800066122460699237">Cilne “<ph name="TAB_TITLE" />” tiks aizvērta.</translation> <translation id="281504910091592009">Skatiet un pārvaldiet saglabātās paroles savā <ph name="BEGIN_LINK" />Google kontā<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Ir atvērta puse no plūsmas kartītes izvēlnes</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index 286d688..3272e15 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Сајтот е паузиран</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 неуспешно преземање}one{# неуспешно преземање}other{# неуспешни преземања}}</translation> <translation id="2067805253194386918">текст</translation> +<translation id="2079545284768500474">Врати</translation> <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> од <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Избран е „Компактен приказ“</translation> <translation id="2093731487903423814">минатите 15 минути</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Останаа <ph name="SECONDS" /> секунди</translation> <translation id="2779651927720337254">не успеа</translation> <translation id="2781151931089541271">Остана 1 секунда</translation> +<translation id="2789486458103222910">Во ред</translation> <translation id="2800066122460699237">Картичката <ph name="TAB_TITLE" /> ќе се затвори</translation> <translation id="281504910091592009">Прегледајте ги и управувајте со зачуваните лозинки во вашата <ph name="BEGIN_LINK" />сметка на Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Менито на картичката за активност е отворено на половина екран</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 5e3bab3..1f2c926 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">ആപ്പ് പതിപ്പ്</translation> <translation id="1428770807407000502">സമന്വയം ഓഫാക്കണോ?</translation> <translation id="1430915738399379752">പ്രിന്റ് ചെയ്യുക</translation> +<translation id="1435593198351412143">PDF-കൾ സ്വയമേവ തുറക്കുക</translation> <translation id="1436784010935106834">നീക്കംചെയ്തു</translation> <translation id="1437543266176261764"><ph name="APP_NAME" />-ൽ റൺ ചെയ്യുന്നു</translation> <translation id="1448440926884431741">നിങ്ങൾ ട്രാക്ക് ചെയ്യുന്ന ഉൽപ്പന്നങ്ങൾ ബുക്ക്മാർക്കുകളിൽ ഓർഗനൈസ് ചെയ്യുക</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">സൈറ്റ് താൽക്കാലികമായി നിർത്തി</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{ഒരു ഡൗൺലോഡ് പരാജയപ്പെട്ടു}other{# ഡൗൺലോഡുകൾ പരാജയപ്പെട്ടു}}</translation> <translation id="2067805253194386918">ടെക്സ്റ്റ്</translation> +<translation id="2079545284768500474">പഴയപടിയാക്കുക</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" /> ഫലം</translation> <translation id="2091863218454846791">കോംപാക്റ്റ് കാഴ്ച കാണിക്കുന്നു</translation> <translation id="2093731487903423814">കഴിഞ്ഞ 15 മിനിറ്റ്</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> സെക്കൻഡ് ശേഷിക്കുന്നു</translation> <translation id="2779651927720337254">പരാജയപ്പെട്ടു</translation> <translation id="2781151931089541271">ഒരു സെക്കൻഡ് ശേഷിക്കുന്നു</translation> +<translation id="2789486458103222910">ശരി</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> എന്ന ടാബ് അടയ്ക്കും</translation> <translation id="281504910091592009">നിങ്ങളുടെ <ph name="BEGIN_LINK" />Google അക്കൗണ്ടിൽ<ph name="END_LINK" /> സംരക്ഷിച്ച പാസ്വേഡുകൾ കാണുക, മാനേജ് ചെയ്യുക</translation> <translation id="2827278682606527653">പകുതി ഉയരത്തിലുള്ള ഫീഡ് കാർഡ് മെനു</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">നിങ്ങളുടെ ബ്രൗസറിന്റെയോ ഉപകരണത്തിന്റെയോ വേഗത പ്രകടമായി കുറയ്ക്കുന്നില്ല.</translation> <translation id="2900528713135656174">ഇവന്റ് സൃഷ്ടിക്കുക</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> എന്നതിനുള്ള നിർദ്ദേശങ്ങൾ കാണിക്കുന്നു</translation> +<translation id="2904300462646366554">ഡൗൺലോഡ് ചെയ്ത PDF നിങ്ങളുടെ ഉപകരണത്തിലെ PDF വ്യൂവറുകളിൽ ഒരെണ്ണം ഉപയോഗിച്ച് സ്വയമേവ തുറക്കുന്നു</translation> <translation id="2904414404539560095">പൂർണ്ണ ഉയരത്തിൽ ടാബ് പങ്കിടാനാകുന്ന ഉപകരണങ്ങളുടെ ലിസ്റ്റ്.</translation> <translation id="2908243544703713905">വായിക്കാത്ത സ്റ്റോറികൾ തയ്യാറാണ്</translation> <translation id="2909615210195135082">Google അറിയിപ്പുകൾ പ്ലാറ്റ്ഫോം</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</translation> <translation id="5814749351757353073">നിങ്ങളുടെ പ്രിയപ്പെട്ട സൈറ്റുകളെ കുറിച്ച് അറിഞ്ഞുകൊണ്ടേ ഇരിക്കൂ</translation> <translation id="5822875253699806474">നിങ്ങൾ സന്ദർശിച്ച സൈറ്റുകളിലേക്ക് വേഗത്തിൽ മടങ്ങാൻ, ടാബുകളും ചരിത്രവും സമന്വയിപ്പിക്കൂ</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> എന്നതിൽ സംരക്ഷിച്ചിരിക്കുന്നു</translation> <translation id="583281660410589416">അജ്ഞാതം</translation> <translation id="5833984609253377421">ലിങ്ക് പങ്കിടുക</translation> <translation id="5839058148541733625">Chrome ദിനോസർ</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" /> ഉപയോഗിച്ച് PDF തുറക്കണോ?</translation> <translation id="5853623416121554550">താൽക്കാലികമായി നിർത്തി</translation> <translation id="5855546874025048181">പരിഷ്കരിക്കുക: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">എന്തോ കുഴപ്പമുണ്ടായി. നിരക്ക് ട്രാക്ക് ചെയ്യൽ അപ്ഡേറ്റ് ചെയ്യാനായില്ല.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">ഹോംപേജ് എഡിറ്റ് ചെയ്യുക</translation> <translation id="8130309322784422030">സംഭരിച്ചിരിക്കുന്ന സൈൻ ഇൻ വിവരങ്ങൾ കാലഹരണപ്പെട്ടതാകാം</translation> <translation id="813082847718468539">സൈറ്റ് വിവരങ്ങള് കാണുക</translation> +<translation id="8135406045838672858"><ph name="APP_NAME" /> ഉപയോഗിച്ച് ഡൗൺലോഡ് ചെയ്ത PDF-കൾ സ്വയമേവ തുറക്കുന്നു</translation> <translation id="8137562778192957619">നിങ്ങൾ ഈ പാസ്വേഡ് ഓർമ്മിക്കേണ്ടതില്ല. Google Password Manager-ൽ ഇത് സംരക്ഷിക്കും.</translation> <translation id="8186512483418048923"><ph name="FILES" /> ഫയലുകൾ ശേഷിക്കുന്നു</translation> <translation id="8190358571722158785">ഒരു ദിവസം ശേഷിക്കുന്നു</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index e79f1c0..93ecccf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Сайтыг түр зогсоосон</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 таталт амжилтгүй боллоо}other{# таталт амжилтгүй боллоо}}</translation> <translation id="2067805253194386918">текст</translation> +<translation id="2079545284768500474">Буцаах</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" />-ын <ph name="RESULT_NUMBER" /> илэрц байна</translation> <translation id="2091863218454846791">Товч тодорхой харагдах байдлыг харуулж байна</translation> <translation id="2093731487903423814">сүүлийн 15 минут</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> секунд үлдсэн</translation> <translation id="2779651927720337254">татаж чадсангүй</translation> <translation id="2781151931089541271">1 секунд үлдсэн</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> табыг хаана</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google Бүртгэл<ph name="END_LINK" />-дээ хадгалсан нууц үгнүүдийг харах болон удирдах</translation> <translation id="2827278682606527653">Feed card menu half height</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 3a461177..c7edb03 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">साइट थांबवली</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{एक डाउनलोड करता आले नाही}other{# डाउनलोड करता आले नाहीत}}</translation> <translation id="2067805253194386918">मजकूर</translation> +<translation id="2079545284768500474">पहिल्यासारखे करा</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> पैकी <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2091863218454846791">संक्षिप्त दृश्य दाखवत आहे</translation> <translation id="2093731487903423814">मागील १५ मिनिटांमधील</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> सेकंद शिल्लक</translation> <translation id="2779651927720337254">अयशस्वी झाले</translation> <translation id="2781151931089541271">1 सेकंद शिल्लक</translation> +<translation id="2789486458103222910">ठीक आहे</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> टॅब बंद केला जाईल</translation> <translation id="281504910091592009">तुमच्या <ph name="BEGIN_LINK" />Google खात्यामध्ये<ph name="END_LINK" /> सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा</translation> <translation id="2827278682606527653">फीड कार्ड मेनू अर्ध्या उंचीवर आहे</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 6414e048..23ccc82 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -106,7 +106,7 @@ <translation id="1513814250881909472">Segerakkan untuk mendapatkan tab anda daripada peranti anda yang lain</translation> <translation id="1513858653616922153">Padam kata laluan</translation> <translation id="1521774566618522728">Aktif hari ini</translation> -<translation id="1544826120773021464">Untuk mengurus akaun Google anda, ketik butang "Urus akaun"</translation> +<translation id="1544826120773021464">Untuk mengurus Google Account anda, ketik butang "Urus akaun"</translation> <translation id="1549000191223877751">Alihkan ke tetingkap lain</translation> <translation id="1553358976309200471">Kemas Kini Chrome</translation> <translation id="1554532453982918912">Membantu jadikan Chrome lebih baik untuk orang yang menggunakannya seperti yang anda lakukan</translation> @@ -190,6 +190,7 @@ <translation id="2056878612599315956">Tapak dijeda</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 muat turun gagal}other{# muat turun gagal}}</translation> <translation id="2067805253194386918">teks</translation> +<translation id="2079545284768500474">Buat asal</translation> <translation id="2082238445998314030">Hasil carian <ph name="RESULT_NUMBER" /> daripada <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Menunjukkan paparan sarat</translation> <translation id="2093731487903423814">15 minit yang lalu</translation> @@ -224,7 +225,7 @@ <translation id="2249635629516220541">Sesuaikan maklumat yang digunakan oleh laman untuk memaparkan iklan kepada anda</translation> <translation id="2259659629660284697">Eksport kata laluan…</translation> <translation id="2276231040576210443">Anda boleh memilih item yang hendak disegerakkan dalam <ph name="BEGIN_LINK1" />tetapan<ph name="END_LINK1" /> pada bila-bila masa. Google mungkin memeribadikan Carian dan perkhidmatan lain berdasarkan sejarah anda.</translation> -<translation id="2276696007612801991">Log masuk ke akaun Google anda untuk menyemak kata laluan anda</translation> +<translation id="2276696007612801991">Log masuk ke Google Account anda untuk menyemak kata laluan anda</translation> <translation id="2278052315791335171">Pemadaman kata laluan ini tidak akan memadamkan akaun anda pada <ph name="SITE" /></translation> <translation id="2286841657746966508">Alamat pengebilan</translation> <translation id="228704530595896923">Senarai pilihan perkongsian.</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> saat lagi</translation> <translation id="2779651927720337254">gagal</translation> <translation id="2781151931089541271">1 saat lagi</translation> +<translation id="2789486458103222910">Okey</translation> <translation id="2800066122460699237">Tab <ph name="TAB_TITLE" /> akan ditutup</translation> <translation id="281504910091592009">Lihat dan urus kata laluan yang disimpan dalam <ph name="BEGIN_LINK" />Google Account<ph name="END_LINK" /> anda</translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -1076,7 +1078,7 @@ <translation id="671481426037969117">Pemasa <ph name="FQDN" /> anda sudah tamat. Pemasa akan bermula lagi esok.</translation> <translation id="6715020873764921614">Adakah anda mahu memuat turun <ph name="FILE_NAME" /> (<ph name="FILE_SIZE" />) juga?</translation> <translation id="6719634564325948108">Sambung menggunakan Kod QR?</translation> -<translation id="6723740634201835758">Dalam Akaun Google anda</translation> +<translation id="6723740634201835758">Dalam Google Account anda</translation> <translation id="6738516213925468394">Data anda disulitkan dengan <ph name="BEGIN_LINK" />ungkapan laluan segerak<ph name="END_LINK" /> anda pada <ph name="TIME" />. Masukkannya untuk memulakan penyegerakan.</translation> <translation id="6738867403308150051">Memuat turun…</translation> <translation id="674388916582496364">Menjadi kebiasaan bagi laman yang anda lawati mengingati perkara yang anda minati, untuk memeribadikan pengalaman anda. Laman boleh menyimpan maklumat tentang minat anda menggunakan Chrome.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 415062b..fd763e7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">ဝဘ်ဆိုက် ခဏရပ်ထားသည်</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{ဒေါင်းလုဒ် ၁ ခု လုပ်၍မရပါ}other{ဒေါင်းလုဒ် # ခု လုပ်၍မရပါ}}</translation> <translation id="2067805253194386918">စာသား</translation> +<translation id="2079545284768500474">တစ်ဆင့်နောက်ပြန်ရန်</translation> <translation id="2082238445998314030">အဖြေ <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">ကျစ်လစ်သည့်ပြကွက်ကို ပြနေသည်</translation> <translation id="2093731487903423814">ပြီးခဲ့သော ၁၅ မိနစ်</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> စက္ကန့် ကျန်သည်</translation> <translation id="2779651927720337254">ဒေါင်းလုဒ် မပြီးဆုံးပါ</translation> <translation id="2781151931089541271">၁ စက္ကန့် ကျန်သည်</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> တဘ်ကို ပိတ်ပါမည်</translation> <translation id="281504910091592009">သိမ်းဆည်းထားသည့် စကားဝှက်များကို သင်၏ <ph name="BEGIN_LINK" />Google အကောင့်<ph name="END_LINK" /> တွင် ကြည့်ရှုစီမံပါ</translation> <translation id="2827278682606527653">Feed card menu half height</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 09b420ea..8e0960f8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">एपको संस्करण</translation> <translation id="1428770807407000502">सिंक गर्ने सुविधा अफ गर्ने हो?</translation> <translation id="1430915738399379752">प्रिन्ट गर्नुहोस्</translation> +<translation id="1435593198351412143">PDF हरू स्वतः खोलियोस्</translation> <translation id="1436784010935106834">हटाइयो</translation> <translation id="1437543266176261764">यो क्रियाकलाप <ph name="APP_NAME" /> मार्फत गरिँदै छ</translation> <translation id="1448440926884431741">"बुकमार्कहरू" मा गई आफूले ट्रयाक गरेका उत्पादनहरू व्यवस्थापन गर्नुहोस्</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">साइट पज गरियो</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{१ वटा डाउनलोड गर्न सकिएन}other{# वटा डाउनलोडहरू गर्न सकिएन}}</translation> <translation id="2067805253194386918">पाठ</translation> +<translation id="2079545284768500474">अन्डू गर्नुहोस्</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> को <ph name="RESULT_NUMBER" /> परिणाम</translation> <translation id="2091863218454846791">कम्प्याक्ट भ्यू देखाइँदै छ</translation> <translation id="2093731487903423814">पछिल्ला १५ मिनेट</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> सेकेन्ड बाँकी छ</translation> <translation id="2779651927720337254">डाउनलोड गर्न सकिएन</translation> <translation id="2781151931089541271">१ सेकेन्ड बाँकी छ</translation> +<translation id="2789486458103222910">ठिक छ</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ट्याब बन्द गरिने छ</translation> <translation id="281504910091592009">आफ्नो <ph name="BEGIN_LINK" />Google खाता<ph name="END_LINK" /> मा सुरक्षित गरिएका पासवर्डहरू हेर्नुहोस् र व्यवस्थापन गर्नुहोस्</translation> <translation id="2827278682606527653">फिड कार्ड मेनु आधा उचाइमा खुला छ</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">यसले तपाईंको ब्राउजर वा डिभाइसको पर्फर्मेन्सको गति खासै घटाउँदैन।</translation> <translation id="2900528713135656174">कार्यक्रम सिर्जना गर्नुहोस्</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> सम्बन्धी सुझावहरू देखाइँदै</translation> +<translation id="2904300462646366554">डाउनलोड गरिएका PDF हरू तपाईंको डिभाइसमा भएको कुनै PDF भ्युअरमार्फत स्वतः खोलिन्छन्</translation> <translation id="2904414404539560095">ट्याब आदान प्रदान गरिनु पर्ने डिभाइसहरूको सूची पूर्ण उचाइमा खोलिएको छ।</translation> <translation id="2908243544703713905">नपढिएका स्टोरिज तयार छन्</translation> <translation id="2909615210195135082">Google का सूचनाहरूको प्लेटफर्म</translation> @@ -893,9 +897,11 @@ <translation id="5810288467834065221">प्रतिलिपि अधिकार <ph name="YEAR" /> Google LLC। सर्वाधिकार सुरक्षित।</translation> <translation id="5814749351757353073">आफ्ना मन पर्ने साइटहरू फलो गर्नुहोस्</translation> <translation id="5822875253699806474">आफूले खोलेका साइटहरू छिटोछरितो रूपमा फेरि खोल्न आफ्ना ट्याब र हिस्ट्री सिंक गर्नुहोस्</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> मा सेभ गरियो</translation> <translation id="583281660410589416">अज्ञात</translation> <translation id="5833984609253377421">लिंक सेयर गर्नुहोस्</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" /> मार्फत PDF खोल्ने हो?</translation> <translation id="5853623416121554550">पज गरियो</translation> <translation id="5855546874025048181">यसअनुसार परिष्कृत गर्नुहोस्: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">कुनै समस्या आयो। ट्रयाक गरिएको मूल्य बदल्न सकिएन।</translation> @@ -1378,6 +1384,7 @@ <translation id="8127542551745560481">गृहपृष्ठ सम्पदान गर्नुहोस्</translation> <translation id="8130309322784422030">तपाईंले भण्डारण गर्नुभएको युजरनेम र पासवर्ड पुरानो हुन सक्छ</translation> <translation id="813082847718468539">साइट जानकारी हेर्नुहोस्</translation> +<translation id="8135406045838672858">डाउनलोड गरिएका PDF हरू <ph name="APP_NAME" /> मार्फत स्वतः खोलिन्छन्</translation> <translation id="8137562778192957619">तपाईंले यो पासवर्ड याद गरिराख्नु पर्दैन। यो पासवर्ड Google पासवर्ड म्यानेजरमा सेभ गरिने छ।</translation> <translation id="8186512483418048923"><ph name="FILES" /> फाइलहरू बाँकी छन्</translation> <translation id="8190358571722158785">१ दिन बाँकी छ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 7130c96..e78e5b89 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site onderbroken</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 download mislukt}other{# downloads mislukt}}</translation> <translation id="2067805253194386918">sms</translation> +<translation id="2079545284768500474">Ongedaan maken</translation> <translation id="2082238445998314030">Resultaat <ph name="RESULT_NUMBER" /> van <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Compacte weergave tonen</translation> <translation id="2093731487903423814">afgelopen 15 minuten</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> seconden resterend</translation> <translation id="2779651927720337254">mislukt</translation> <translation id="2781151931089541271">1 seconde resterend</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Het tabblad <ph name="TAB_TITLE" /> wordt gesloten</translation> <translation id="281504910091592009">Bekijk en beheer opgeslagen wachtwoorden in je <ph name="BEGIN_LINK" />Google-account<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feedkaartmenu halve hoogte</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index d6c6e91..82b76dd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Nettstedet er satt på pause</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 nedlasting mislyktes}other{# nedlastinger mislyktes}}</translation> <translation id="2067805253194386918">tekst</translation> +<translation id="2079545284768500474">Angre</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Viser kompakt visning</translation> <translation id="2093731487903423814">de siste 15 minuttene</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder igjen</translation> <translation id="2779651927720337254">mislyktes</translation> <translation id="2781151931089541271">1 sekund igjen</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Fanen <ph name="TAB_TITLE" /> blir lukket</translation> <translation id="281504910091592009">Se og administrer lagrede passord i <ph name="BEGIN_LINK" />Google-kontoen<ph name="END_LINK" /> din</translation> <translation id="2827278682606527653">Feedkortmenyen er åpnet i halv høyde</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 ae6a920..684a34b5 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
@@ -133,7 +133,7 @@ <translation id="1710099199314114079">ଟାବଗୁଡ଼ିକୁ ସ୍ୱିଚ କିମ୍ବା ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="1718835860248848330">ଶେଷ ଘଣ୍ଟାକର</translation> <translation id="1724977129262658800">ଆପଣଙ୍କ ପାସୱାର୍ଡ ଏଡିଟ୍ କରିବାକୁ ଅନଲକ୍ କରନ୍ତୁ</translation> -<translation id="1726477445370128854">ଆପଣ ଭିଜିଟ କରିପାରନ୍ତି ବୋଲି Chrome ଭାବୁଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଏହା ପ୍ରିଲୋଡ କଲେ ଆପଣ ଶୀଘ୍ର ବ୍ରାଉଜ ଏବଂ ସନ୍ଧାନ କରିପାରିବେ</translation> +<translation id="1726477445370128854">ଆପଣ ଭିଜିଟ କରିପାରନ୍ତି ବୋଲି Chrome ଭାବୁଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଏହା ପ୍ରିଲୋଡ କଲେ ଆପଣ ଶୀଘ୍ର ବ୍ରାଉଜ ଏବଂ ସର୍ଚ୍ଚ କରିପାରିବେ</translation> <translation id="1728803206919861584">ଇନକଗ୍ନିଟୋ ବାହାରେ ପାସକୀକୁ ସେଭ କରିବେ?</translation> <translation id="1749561566933687563">ନିଜର ବୁକ୍ମାର୍କ୍ସ ସିଙ୍କ୍ କରନ୍ତୁ</translation> <translation id="1750259112639922169">ଟାବ ଗ୍ରୁପ - <ph name="TAB_COUNT" />ଟି ଟାବ</translation> @@ -190,6 +190,7 @@ <translation id="2056878612599315956">ସାଇଟ୍ ବିରତ ହୋଇଗଲା</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1ଟି ଡାଉନଲୋଡ୍ ବିଫଳ ହୋଇଛି}other{#ଟି ଡାଉନଲୋଡ୍ ବିଫଳ ହୋଇଛି}}</translation> <translation id="2067805253194386918">ଟେକ୍ସଟ୍</translation> +<translation id="2079545284768500474">ପୂର୍ବବତ୍</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" />ର <ph name="RESULT_NUMBER" />ଟି ଫଳାଫଳ</translation> <translation id="2091863218454846791">କମ୍ପାକ୍ଟ ଭ୍ୟୁ ଦେଖାଯାଉଛି</translation> <translation id="2093731487903423814">ଗତ 15 ମିନିଟ</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ସେକେଣ୍ଡ ଅବଶିଷ୍ଟ ଅଛି</translation> <translation id="2779651927720337254">ବିଫଳ ହେଲା</translation> <translation id="2781151931089541271">1 ସେକେଣ୍ଡ ବାକି ଅଛି</translation> +<translation id="2789486458103222910">ଠିକ୍ ଅଛି</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ଟାବଟି ବନ୍ଦ ହୋଇଯିବ</translation> <translation id="281504910091592009">ଆପଣଙ୍କର <ph name="BEGIN_LINK" />Google ଆକାଉଣ୍ଟ<ph name="END_LINK" />ରେ ସେଭ୍ ହୋଇଥିବା ପାସ୍ୱର୍ଡଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ପରିଚାଳନା କରନ୍ତୁ।</translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -496,7 +498,7 @@ <translation id="3737402728074743863">ଏହି ଡିଭାଇସକୁ ଏକ ସୁରକ୍ଷା କୀ ଭାବେ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ସ୍କ୍ରିନ ଲକ ସେଟ କରନ୍ତୁ</translation> <translation id="3738139272394829648">ଟଚ୍ ଟୁ ସର୍ଚ୍ଚ</translation> <translation id="3739899004075612870"><ph name="PRODUCT_NAME" />ରେ ବୁକ୍ମାର୍କ କରାଗଲା</translation> -<translation id="3740525748616366977">ଏହି ଡିଭାଇସରେ ଭଏସ୍ ସନ୍ଧାନ ଉପଲବ୍ଧ ନାହିଁ</translation> +<translation id="3740525748616366977">ଏହି ଡିଭାଇସରେ ଭଏସ ସର୍ଚ୍ଚ ଉପଲବ୍ଧ ନାହିଁ</translation> <translation id="3771033907050503522">ଇନ୍କଗ୍ନିଟୋ ଟାବ୍</translation> <translation id="3771290962915251154">ବାପାମା ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଚାଲୁ ଥିବା ଯୋଗୁଁ ଏହି ସେଟିଂସକୁ ଅକ୍ଷମ କରାଯାଇଛି</translation> <translation id="3771694256347217732">Google ସେବାର ସର୍ତ୍ତାବଳୀ</translation> @@ -703,7 +705,7 @@ <translation id="4835385943915508971">Chrome ପାଖରେ ଅନୁରୋଧ କରାଯାଇଥିବା ସମ୍ବଳକୁ ଆକ୍ସେସ୍ ନାହିଁ।</translation> <translation id="4837753911714442426">ପୃଷ୍ଠା ପ୍ରିଣ୍ଟ କରିବାକୁ ବିକଳ୍ପଗୁଡ଼ିକ ଖୋଲନ୍ତୁ</translation> <translation id="4842092870884894799">ପାସ୍ୱର୍ଡ ତିଆରି ପପ୍-ଅପ୍ ଦେଖାଉଛି</translation> -<translation id="4842515939542199281">ଆପଣଙ୍କ ଭଏସ ମାଧ୍ୟମରେ ସନ୍ଧାନ କରିବାକୁ, ମାଇକ୍ରୋଫୋନରେ ଟାପ କରନ୍ତୁ</translation> +<translation id="4842515939542199281">ଆପଣଙ୍କ ଭଏସ ମାଧ୍ୟମରେ ସର୍ଚ୍ଚ କରିବାକୁ, ମାଇକ୍ରୋଫୋନରେ ଟାପ କରନ୍ତୁ</translation> <translation id="4844633725025837809">ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ପାସୱାର୍ଡଗୁଡ଼ିକ Google ପାସୱାର୍ଡ ମ୍ୟାନେଜରରେ ସେଭ ହେବା ପୂର୍ବରୁ ସେଗୁଡ଼ିକୁ ଆପଣଙ୍କ ଡିଭାଇସରେ ଏନକ୍ରିପ୍ଟ କରନ୍ତୁ</translation> <translation id="4850886885716139402">ଦେଖନ୍ତୁ</translation> <translation id="4852014461738377247">ସାଇନ ଇନ କରାଯାଉଛି\u2026</translation> @@ -737,7 +739,7 @@ <translation id="4961107849584082341">ଏହି ପୃଷ୍ଠାକୁ ଯେକୌଣସି ଭାଷାରେ ଅନୁବାଦ କରନ୍ତୁ</translation> <translation id="4971735654804503942">ବିପଦଜନକ ୱେବସାଇଟ୍, ଡାଉନଲୋଡ୍ ଏବଂ ଏକ୍ସଟେନ୍ସନଗୁଡ଼ିକ ବିରୁଦ୍ଧରେ ଦ୍ରୁତ, ସକ୍ରିୟ ସୁରକ୍ଷା। ପାସୱାର୍ଡ ଚୋରି ବିଷୟରେ ଆପଣଙ୍କୁ ଚେତାବନୀ ଦିଏ। Googleକୁ ବ୍ରାଉଜିଂ ଡାଟା ପଠାଇବା ଆବଶ୍ୟକ କରେ।</translation> <translation id="497421865427891073">ଆଗକୁ ଯାଆନ୍ତୁ</translation> -<translation id="4987271110129728827">ସେହି ପୃଷ୍ଠାଟି ମିଳୁନାହିଁ। ଆପଣଙ୍କର ବନାନ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା ଏକ ୱେବ ସନ୍ଧାନ ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> +<translation id="4987271110129728827">ସେହି ପୃଷ୍ଠାଟି ମିଳୁନାହିଁ। ଆପଣଙ୍କର ବନାନ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା ଏକ ୱେବ ସର୍ଚ୍ଚ ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4988526792673242964">ପୃଷ୍ଠାଗୁଡ଼ିକ</translation> <translation id="4991110219272367918">ଏକ ୱେବସାଇଟକୁ ଅନୁମୋଦନ କରିବା କିମ୍ବା ନକରିବାର ବିକଳ୍ପକୁ ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="499724277181351974">ନାଭିଗେଟ କରନ୍ତୁ: <ph name="WEBSITE_TITLE" />: <ph name="WEBSITE_URL" /></translation> @@ -875,7 +877,7 @@ <translation id="5749068826913805084">ଫାଇଲ୍ଗୁଡ଼ିକ ଡାଉନ୍ଲୋଡ୍ କରିବାକୁ Chrome ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଆବଶ୍ୟକ କରେ।</translation> <translation id="5749237766298580851">ବନ୍ଦ ଥିବା <ph name="SEPARATOR" />ର ସୁପାରିଶ କରାଯାଇନାହିଁ</translation> <translation id="5752232708629533680">କେବଳ GIF ସେୟାର୍ କରନ୍ତୁ</translation> -<translation id="5753139477036638699">Chromeରେ ସନ୍ଧାନ କରିବା ପାଇଁ ଆପଣ ଆପଣଙ୍କ ଭଏସକୁ ବ୍ୟବହାର କରିପାରିବେ</translation> +<translation id="5753139477036638699">Chromeରେ ସର୍ଚ୍ଚ କରିବା ପାଇଁ ଆପଣ ଆପଣଙ୍କ ଭଏସକୁ ବ୍ୟବହାର କରିପାରିବେ</translation> <translation id="5754350196967618083">Discoverକୁ ରିଫ୍ରେସ୍ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="5755162682436943950">ସାଇନ ଆଉଟ ହୋଇଛନ୍ତି। ସାଇନ ଇନ କରି ସିଙ୍କ ଚାଲୁ କରିବା ପାଇଁ ଡାଏଲଗ ଖୋଲେ।</translation> <translation id="5759897675466110265">ସାଇଟ କାମ କରୁନାହିଁ? ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ଅସ୍ଥାୟୀ ଭାବରେ ଅନୁମତି ଦେବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ</translation> @@ -942,7 +944,7 @@ <translation id="6070730414166672373">ଆପଣଙ୍କ ବ୍ୟାଙ୍କ ସହ ଯୋଗାଯୋଗ କରାଯାଉଛି\u2026</translation> <translation id="6085886413119427067">ଏକ ସୁରକ୍ଷିତ ସଂଯୋଗରେ ୱେବସାଇଟଗୁଡ଼ିକ ସହ କିପରି ଯୋଗାଯୋଗ କରିବ ତାହା ନିର୍ଦ୍ଧାରଣ କରିଥାଏ</translation> <translation id="60923314841986378"><ph name="HOURS" /> ଘଣ୍ଟା ବାକି ଅଛି</translation> -<translation id="6095578583683628124">ଯଦି Google ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ମଧ୍ୟ ହୋଇଥାଏ, ତେବେ ଆପଣ ଆହୁରି ଭଲ, ପ୍ରାସଙ୍ଗିକ ପରାମର୍ଶ ଦେଖିବେ</translation> +<translation id="6095578583683628124">ଯଦି Google ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ମଧ୍ୟ ହୋଇଥାଏ, ତେବେ ଆପଣ ଆହୁରି ଭଲ, ପ୍ରାସଙ୍ଗିକ ପରାମର୍ଶ ଦେଖିବେ</translation> <translation id="6108923351542677676">ସେଟ୍ ଅପ୍ ପ୍ରକ୍ରିୟା ଚାଲିଛି…</translation> <translation id="6112702117600201073">ପୃଷ୍ଠା ରିଫ୍ରେସ୍ ହେଉଛି</translation> <translation id="6122831415929794347">ସେଫ୍ ବ୍ରାଉଜିଂ ବନ୍ଦ କରିବେ?</translation> @@ -1222,7 +1224,7 @@ <translation id="7455988709578031708">ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିହାସ ଆଧାରରେ। ଏହି ସେଟିଂ ଚାଲୁ ଅଛି।</translation> <translation id="7456774706094330779">ଏକ୍ସଟେଣ୍ଡେଡ ପ୍ରିଲୋଡିଂ</translation> <translation id="7466431077154602932">କମ୍ପାକ୍ଟ ଭ୍ୟୁ</translation> -<translation id="7474822150871987353">ପୃଷ୍ଠାରୁ ବାହାରି ନଯାଇ ୱେବସାଇଟରେ ଥିବା ବିଷୟଗୁଡ଼ିକ ସମ୍ବନ୍ଧରେ ଜାଣନ୍ତୁ। ଗୋଟିଏ କିମ୍ବା ଅଧିକ ଶବ୍ଦ ବିଷୟରେ ସନ୍ଧାନ କରିବାକୁ ପୃଷ୍ଠାରେ ସେଗୁଡ଼ିକୁ ଚୟନ କରନ୍ତୁ।</translation> +<translation id="7474822150871987353">ପୃଷ୍ଠାରୁ ବାହାରି ନଯାଇ ୱେବସାଇଟରେ ଥିବା ବିଷୟଗୁଡ଼ିକ ସମ୍ବନ୍ଧରେ ଜାଣନ୍ତୁ। ଗୋଟିଏ କିମ୍ବା ଅଧିକ ଶବ୍ଦ ବିଷୟରେ ସର୍ଚ୍ଚ କରିବାକୁ ପୃଷ୍ଠାରେ ସେଗୁଡ଼ିକୁ ଚୟନ କରନ୍ତୁ।</translation> <translation id="7475192538862203634">ଯଦି ଆପଣ ଏହା ବାରମ୍ବାର ଦେଖୁଛନ୍ତି, ତେବେ ଏହି <ph name="BEGIN_LINK" />ପରାମର୍ଶଗୁଡ଼ିକ<ph name="END_LINK" /> ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ।</translation> <translation id="7475688122056506577">SD କାର୍ଡ୍ ମିଳିଲା ନାହିଁ। ଆପଣଙ୍କର ଫାଇଲ୍ ମଧ୍ୟରୁ କିଛି ଫାଇଲ୍ ନାହିଁ</translation> <translation id="7479104141328977413">ଟାବ୍ ପରିଚାଳନା</translation> @@ -1573,7 +1575,7 @@ <translation id="9199368092038462496">{NUM_MINS,plural, =1{1 ମିନିଟ୍ ପୂର୍ବେ ଯାଞ୍ଚ କରାଯାଇଛି}other{# ମିନିଟ୍ ପୂର୍ବେ ଯାଞ୍ଚ କରାଯାଇଛି}}</translation> <translation id="9204021776105550328">ଡିଲିଟ କରାଯାଉଛି</translation> <translation id="9204836675896933765">1 ଫାଇଲ୍ ବାକି ଅଛି</translation> -<translation id="9205933215779845960">ସେହି ପୃଷ୍ଠାଟି ମିଳୁନାହିଁ। ଆପଣଙ୍କର ବନାନ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା <ph name="SEARCH_ENGINE" />ରେ ଏକ ସନ୍ଧାନ ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> +<translation id="9205933215779845960">ସେହି ପୃଷ୍ଠାଟି ମିଳୁନାହିଁ। ଆପଣଙ୍କର ବନାନ ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା <ph name="SEARCH_ENGINE" />ରେ ଏକ ସର୍ଚ୍ଚ ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="9206873250291191720">ଅ</translation> <translation id="9209888181064652401">କଲ୍ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="9212845824145208577">ଏହାଠାରୁ ତଳକୁ ଯାଇପାରିବ ନାହିଁ। ପୃଷ୍ଠାର ଆହୁରି ତଳୁ ଆରମ୍ଭ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index f8f8dbc..edee909 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">ਐਪਲੀਕੇਸ਼ਨ ਵਰਜਨ</translation> <translation id="1428770807407000502">ਕੀ ਸਿੰਕ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?</translation> <translation id="1430915738399379752">ਪ੍ਰਿੰਟ ਕਰੋ</translation> +<translation id="1435593198351412143">PDF ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਖੋਲ੍ਹੋ</translation> <translation id="1436784010935106834">ਹਟਾਈਆਂ ਗਈਆਂ</translation> <translation id="1437543266176261764">ਇਹ ਸਰਗਰਮੀ <ph name="APP_NAME" /> ਵਿੱਚ ਚੱਲ ਰਹੀ ਹੈ</translation> <translation id="1448440926884431741">Bookmarks ਵਿੱਚ ਆਪਣੇ ਟਰੈਕ ਕੀਤੇ ਉਤਪਾਦਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">ਸਾਈਟ ਰੋਕੀ ਗਈ</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ}one{# ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਿਹਾ}other{# ਡਾਊਨਲੋਡ ਅਸਫਲ ਰਹੇ}}</translation> <translation id="2067805253194386918">ਲਿਖਤ</translation> +<translation id="2079545284768500474">ਅਣਕੀਤਾ ਕਰੋ</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> ਦਾ <ph name="RESULT_NUMBER" /> ਨਤੀਜਾ</translation> <translation id="2091863218454846791">ਸੰਖਿਪਤ ਦ੍ਰਿਸ਼ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="2093731487903423814">ਪਿਛਲੇ 15 ਮਿੰਟ</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ਸਕਿੰਟ ਬਾਕੀ</translation> <translation id="2779651927720337254">ਅਸਫਲ</translation> <translation id="2781151931089541271">1 ਸਕਿੰਟ ਬਾਕੀ</translation> +<translation id="2789486458103222910">ਠੀਕ ਹੈ</translation> <translation id="2800066122460699237">ਟੈਬ <ph name="TAB_TITLE" /> ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> <translation id="281504910091592009">ਆਪਣੇ <ph name="BEGIN_LINK" />Google ਖਾਤੇ<ph name="END_LINK" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਦੇਖੋ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="2827278682606527653">ਫ਼ੀਡ ਕਾਰਡ ਮੀਨੂ ਅੱਧਾ ਖੁੱਲ੍ਹਾ ਹੈ</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਜਾਂ ਡੀਵਾਈਸ ਨੂੰ ਹੌਲੀ ਨਹੀਂ ਕਰਦੀ।</translation> <translation id="2900528713135656174">ਇਵੈਂਟ ਬਣਾਓ</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> ਲਈ ਸੁਝਾਅ ਦਿਖਾਏ ਜਾ ਰਹੇ ਹਨ</translation> +<translation id="2904300462646366554">ਡਾਊਨਲੋਡ ਕੀਤੀ PDF ਫ਼ਾਈਲਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ PDF ਵਿਊਅਰਾਂ ਵਿੱਚੋਂ ਕਿਸੇ ਇੱਕ ਨਾਲ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਖੁੱਲ੍ਹ ਜਾਂਦੀਆਂ ਹਨ</translation> <translation id="2904414404539560095">ਕਿਸੇ ਟੈਬ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਵਾਲੇ ਡੀਵਾਈਸਾਂ ਦੀ ਸੂਚੀ ਪੂਰੀ ਉਚਾਈ 'ਤੇ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="2908243544703713905">ਨਾ-ਪੜ੍ਹੀਆਂ ਕਹਾਣੀਆਂ ਤਿਆਰ ਹਨ</translation> <translation id="2909615210195135082">Google ਸੂਚਨਾਵਾਂ ਪਲੇਟਫਾਰਮ</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">ਕਾਪੀਰਾਈਟ <ph name="YEAR" /> Google LLC. ਸਾਰੇ ਹੱਕ ਰਾਖਵੇਂ ਹਨ।</translation> <translation id="5814749351757353073">ਆਪਣੀਆਂ ਮਨਪਸੰਦ ਸਾਈਟਾਂ ਦਾ ਅਨੁਸਰਣ ਕਰਨਾ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="5822875253699806474">ਜੋ ਸਾਈਟਾਂ ਤੁਸੀਂ ਦੇਖੀਆਂ ਹਨ ਉਨ੍ਹਾਂ 'ਤੇ ਤੇਜ਼ੀ ਨਾਲ ਵਾਪਸ ਜਾਣ ਲਈ, ਆਪਣੀਆਂ ਟੈਬਾਂ ਅਤੇ ਇਤਿਹਾਸ ਨੂੰ ਸਿੰਕ ਕਰੋ</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ</translation> <translation id="583281660410589416">ਅਗਿਆਤ</translation> <translation id="5833984609253377421">ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265">ਕੀ PDF ਫ਼ਾਈਲ ਨੂੰ <ph name="APP_NAME" /> ਨਾਲ ਖੋਲ੍ਹਣਾ ਹੈ?</translation> <translation id="5853623416121554550">ਰੋਕਿਆ ਗਿਆ</translation> <translation id="5855546874025048181">ਸੋਧੋ: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। 'ਕੀਮਤ ਨੂੰ ਟਰੈਕ ਕਰੋ' ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">ਹੋਮਪੇਜ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="8130309322784422030">ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਟੋਰ ਕੀਤੀ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਸ਼ਾਇਦ ਪੁਰਾਣੀ ਹੋਵੇ</translation> <translation id="813082847718468539">ਸਾਈਟ ਜਾਣਕਾਰੀ ਦੇਖੋ</translation> +<translation id="8135406045838672858">ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ PDF ਫ਼ਾਈਲਾਂ ਨੂੰ <ph name="APP_NAME" /> ਨਾਲ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਖੋਲ੍ਹੋ</translation> <translation id="8137562778192957619">ਤੁਹਾਨੂੰ ਇਸ ਪਾਸਵਰਡ ਨੂੰ ਯਾਦ ਰੱਖਣ ਦੀ ਲੋੜ ਨਹੀਂ ਪਵੇਗੀ। ਇਸਨੂੰ Google Password Manager ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="8186512483418048923"><ph name="FILES" /> ਫ਼ਾਈਲਾਂ ਬਾਕੀ</translation> <translation id="8190358571722158785">1 ਦਿਨ ਬਾਕੀ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 30df15a9..f9249f3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Strona wstrzymana</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Nie udało się pobrać 1 pliku}few{Nie udało się pobrać # plików}many{Nie udało się pobrać # plików}other{Nie udało się pobrać # pliku}}</translation> <translation id="2067805253194386918">Tekst</translation> +<translation id="2079545284768500474">Cofnij</translation> <translation id="2082238445998314030">Wynik <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Wyświetlam widok kompaktowy</translation> <translation id="2093731487903423814">ostatnich 15 minut</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Pozostało: <ph name="SECONDS" /> s</translation> <translation id="2779651927720337254">Nie pobrano</translation> <translation id="2781151931089541271">Pozostała sekunda</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Zostanie zamknięta karta <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">Zapisane hasła znajdziesz na swoim <ph name="BEGIN_LINK" />koncie Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Menu karty kanału – połowa wysokości</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index e74bccf..fb65af3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site pausado</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Falha em 1 download}one{Falha em # download}other{Falha em # downloads}}</translation> <translation id="2067805253194386918">texto</translation> +<translation id="2079545284768500474">Desfazer</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Mostrando a exibição compacta</translation> <translation id="2093731487903423814">nos últimos 15 minutos</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> segundos restantes</translation> <translation id="2779651927720337254">falha</translation> <translation id="2781151931089541271">Um segundo restante</translation> +<translation id="2789486458103222910">Ok</translation> <translation id="2800066122460699237">A guia <ph name="TAB_TITLE" /> será fechada</translation> <translation id="281504910091592009">Ver e gerenciar as senhas salvas na sua <ph name="BEGIN_LINK" />Conta do Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">O menu do card do feed está aberto pela metade</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 1661ab5e..df36b74 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">Site em pausa</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 transferência falhada}other{# transferências falhadas}}</translation> <translation id="2067805253194386918">texto</translation> +<translation id="2079545284768500474">Anular</translation> <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">A mostrar a vista compacta</translation> <translation id="2093731487903423814">últimos 15 minutos</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389">Faltam <ph name="SECONDS" /> segundos</translation> <translation id="2779651927720337254">falhou</translation> <translation id="2781151931089541271">Falta 1 segundo</translation> +<translation id="2789486458103222910">Ok</translation> <translation id="2800066122460699237">O separador <ph name="TAB_TITLE" /> será fechado</translation> <translation id="281504910091592009">Veja e faça a gestão das palavras-passe guardadas na sua <ph name="BEGIN_LINK" />Conta Google<ph name="END_LINK" />.</translation> <translation id="2827278682606527653">O menu do cartão do feed a meia altura.</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">Desconhecido</translation> <translation id="5833984609253377421">Partilhar link</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265">Abrir o PDF com a app <ph name="APP_NAME" />?</translation> <translation id="5853623416121554550">em pausa</translation> <translation id="5855546874025048181">Refinar: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Algo correu mal. Não foi possível atualizar a opção Monitorizar preço.</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">Editar página inicial</translation> <translation id="8130309322784422030">As suas informações de início de sessão armazenadas podem estar desatualizadas</translation> <translation id="813082847718468539">Ver informações do Website</translation> +<translation id="8135406045838672858">Os PDFs transferidos são abertos automaticamente com a app <ph name="APP_NAME" /></translation> <translation id="8137562778192957619">Não vai ter de memorizar esta palavra-passe. Vai ser guardada no Gestor de Palavras-passe da Google.</translation> <translation id="8186512483418048923">Faltam <ph name="FILES" /> ficheiros</translation> <translation id="8190358571722158785">Falta 1 dia</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 2e4f1dd..a53fd5aa 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site-ul a fost întrerupt</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{O descărcare nu a reușit}few{# descărcări nu au reușit}other{# de descărcări nu au reușit}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">Anulează</translation> <translation id="2082238445998314030">Rezultatul <ph name="RESULT_NUMBER" /> din <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Se afișează vizualizarea compactă</translation> <translation id="2093731487903423814">ultimele 15 minute</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sec. rămase</translation> <translation id="2779651927720337254">nereușită</translation> <translation id="2781151931089541271">1 sec. rămasă</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Fila <ph name="TAB_TITLE" /> va fi închisă</translation> <translation id="281504910091592009">Vezi și gestionează parolele salvate în <ph name="BEGIN_LINK" />Contul Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Meniul cardului din feed la jumătate din înălțime</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 73f011d4..ce9047c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Доступ к сайту приостановлен</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Не удалось скачать 1 файл.}one{Не удалось скачать # файл.}few{Не удалось скачать # файла.}many{Не удалось скачать # файлов.}other{Не удалось скачать # файла.}}</translation> <translation id="2067805253194386918">текст</translation> +<translation id="2079545284768500474">Отмена</translation> <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" />, всего <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Включен компактный вид</translation> <translation id="2093731487903423814">за последние 15 минут</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Осталось <ph name="SECONDS" /> сек.</translation> <translation id="2779651927720337254">ошибка</translation> <translation id="2781151931089541271">Осталась 1 сек.</translation> +<translation id="2789486458103222910">ОК</translation> <translation id="2800066122460699237">Вкладка "<ph name="TAB_TITLE" />" будет закрыта.</translation> <translation id="281504910091592009">Просматривать сохраненные пароли и управлять ими можно на странице <ph name="BEGIN_LINK" />Аккаунт Google<ph name="END_LINK" />.</translation> <translation id="2827278682606527653">Меню карточки из ленты открыто наполовину</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 516f3ac..e12d858c 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">වෙබ් අඩවිය විරාම කළා</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{බාගැනීම් 1ක් අසමත් විය}one{බාගැනීම් #ක් අසමත් විය}other{බාගැනීම් #ක් අසමත් විය}}</translation> <translation id="2067805253194386918">පාඨය</translation> +<translation id="2079545284768500474">පසුගමනය</translation> <translation id="2082238445998314030">ප්රතිඵල <ph name="TOTAL_RESULTS" /> කින් <ph name="RESULT_NUMBER" /></translation> <translation id="2091863218454846791">සංයුක්ත දසුන පෙන්වමින්</translation> <translation id="2093731487903423814">පසුගිය විනාඩි 15</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">තත්පර <ph name="SECONDS" />ක් ඉතිරියි</translation> <translation id="2779651927720337254">අසාර්ථකයි</translation> <translation id="2781151931089541271">තත්පර 1ක් ඉතිරියි</translation> +<translation id="2789486458103222910">හරි</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ටැබය වසනු ඇත</translation> <translation id="281504910091592009">ඔබේ <ph name="BEGIN_LINK" />Google ගිණුම<ph name="END_LINK" /> තුළ සුරකින ලද මුරපද බලන්න සහ කළමනාකරණය කරන්න</translation> <translation id="2827278682606527653">සංග්රහ කාඩ්පත් මෙනුව අඩක් උස</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 2c1ea81..d90a68c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Web je pozastavený</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Sťahovanie 1 položky zlyhalo}few{Sťahovanie # položiek zlyhalo}many{# downloads failed}other{Sťahovanie # položiek zlyhalo}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">Späť</translation> <translation id="2082238445998314030">Výsledok <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Používa sa kompaktné zobrazenie</translation> <translation id="2093731487903423814">posledných 15 minút</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Zostáva: <ph name="SECONDS" /> s</translation> <translation id="2779651927720337254">neúspešné</translation> <translation id="2781151931089541271">Zostáva: 1 s</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Karta <ph name="TAB_TITLE" /> bude zavretá</translation> <translation id="281504910091592009">Zobrazenie a správa uložených hesiel v <ph name="BEGIN_LINK" />účte Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Ponuka karty feedu je otvorená do polovice</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index e561be0..edace731 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Spletno mesto začasno ustavljeno</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 prenos ni uspel}one{# prenos ni uspel}two{# prenosa nista uspela}few{# prenosi niso uspeli}other{# prenosov ni uspelo}}</translation> <translation id="2067805253194386918">besedilo</translation> +<translation id="2079545284768500474">Razveljavi</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultat od <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Prikazan je strnjen pogled</translation> <translation id="2093731487903423814">zadnjih 15 minut</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Še <ph name="SECONDS" /> s</translation> <translation id="2779651927720337254">ni uspelo</translation> <translation id="2781151931089541271">Še 1 s</translation> +<translation id="2789486458103222910">V redu</translation> <translation id="2800066122460699237">Zavihek <ph name="TAB_TITLE" /> bo zaprt.</translation> <translation id="281504910091592009">Shranjena gesla si lahko ogledate in jih upravljate v <ph name="BEGIN_LINK" />Google Računu<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Meni kartice vira je odprt pri pol višine</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 c0ed46b..aee2fe6 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Sajti në pauzë</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 shkarkim dështoi}other{# shkarkime dështuan}}</translation> <translation id="2067805253194386918">teksti</translation> +<translation id="2079545284768500474">Zhbëj</translation> <translation id="2082238445998314030">Rezultati <ph name="RESULT_NUMBER" /> nga <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Po shfaqet pamja kompakte</translation> <translation id="2093731487903423814">15 minutat e fundit</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sekonda të mbetura</translation> <translation id="2779651927720337254">dështoi</translation> <translation id="2781151931089541271">1 sekondë e mbetur</translation> +<translation id="2789486458103222910">Në rregull</translation> <translation id="2800066122460699237">Skeda <ph name="TAB_TITLE" /> do të mbyllet</translation> <translation id="281504910091592009">Shfaq dhe menaxho fjalëkalimet e ruajtura në <ph name="BEGIN_LINK" />llogarinë tënde të Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Menyja e kartave të furnizimit në gjysmë lartësi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 48e75e1..1410c52f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Sajt je pauziran</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 preuzimanje nije uspelo}one{# preuzimanje nije uspelo}few{# preuzimanja nisu uspela}other{# preuzimanja nije uspelo}}</translation> <translation id="2067805253194386918">tekst</translation> +<translation id="2079545284768500474">Opozovi</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. od <ph name="TOTAL_RESULTS" /> rezultata</translation> <translation id="2091863218454846791">Ovo je kompaktni prikaz</translation> <translation id="2093731487903423814">poslednjih 15 minuta</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Još <ph name="SECONDS" /> sek</translation> <translation id="2779651927720337254">nije uspelo</translation> <translation id="2781151931089541271">Još 1 sek</translation> +<translation id="2789486458103222910">Potvrdi</translation> <translation id="2800066122460699237">Kartica <ph name="TAB_TITLE" /> će biti zatvorena</translation> <translation id="281504910091592009">Pregledajte sačuvane lozinke i upravljajte njima na <ph name="BEGIN_LINK" />Google nalogu<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Meni kartice fida je do polovine ekrana</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index e3487dd..f13b739 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Сајт је паузиран</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 преузимање није успело}one{# преузимање није успело}few{# преузимања нису успела}other{# преузимања није успело}}</translation> <translation id="2067805253194386918">текст</translation> +<translation id="2079545284768500474">Опозови</translation> <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. од <ph name="TOTAL_RESULTS" /> резултата</translation> <translation id="2091863218454846791">Ово је компактни приказ</translation> <translation id="2093731487903423814">последњих 15 минута</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Још <ph name="SECONDS" /> сек</translation> <translation id="2779651927720337254">није успело</translation> <translation id="2781151931089541271">Још 1 сек</translation> +<translation id="2789486458103222910">Потврди</translation> <translation id="2800066122460699237">Картица <ph name="TAB_TITLE" /> ће бити затворена</translation> <translation id="281504910091592009">Прегледајте сачуване лозинке и управљајте њима на <ph name="BEGIN_LINK" />Google налогу<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Мени картице фида је до половине екрана</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 90a392a..0fc9acf 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
@@ -28,7 +28,7 @@ <translation id="1129510026454351943">Mer information: <ph name="ERROR_DESCRIPTION" /></translation> <translation id="1142732900304639782">Erbjud inte att översätta dessa webbplatser</translation> <translation id="1145536944570833626">Radera befintlig data.</translation> -<translation id="1150263420752757504"><ph name="APP_NAME" /> öppnas i Chrome. Genom att fortsätta godkänner du <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="1150263420752757504"><ph name="APP_NAME" /> öppnas i Chrome. Genom att fortsätta godkänner du <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och ChromeOS<ph name="END_LINK2" />.</translation> <translation id="115483310321669804">Använd lösenordet <ph name="PASSWORD" /></translation> <translation id="1173894706177603556">Ändra namn</translation> <translation id="1174479719160874822">Chrome begär den mobila webbplatsen när skärmen är smal</translation> @@ -190,6 +190,7 @@ <translation id="2056878612599315956">Webbplatsen har pausats</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 nedladdning misslyckades}other{# nedladdningar misslyckades}}</translation> <translation id="2067805253194386918">text</translation> +<translation id="2079545284768500474">Ångra</translation> <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Visar kompakt vy</translation> <translation id="2093731487903423814">de senaste 15 minuterna</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder kvar</translation> <translation id="2779651927720337254">misslyckades</translation> <translation id="2781151931089541271">1 sekund kvar</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Fliken <ph name="TAB_TITLE" /> stängs</translation> <translation id="281504910091592009">Visa och hantera sparade lösenord i <ph name="BEGIN_LINK" />Google-kontot<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Menyn med flödeskort är öppen och tar upp halva skärmen</translation> @@ -386,7 +388,7 @@ <translation id="3062802207422175757">Artiklar om dina intressen i Chrome</translation> <translation id="3066573403916685335">Flytta ner</translation> <translation id="3070005020161560471">Översätt automatiskt</translation> -<translation id="3072980200212375806"><ph name="APP_NAME" /> öppnas i Chrome. Genom att fortsätta godkänner du <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och Chrome OS<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Integritetspolicyn<ph name="END_LINK3" /> gäller också.</translation> +<translation id="3072980200212375806"><ph name="APP_NAME" /> öppnas i Chrome. Genom att fortsätta godkänner du <ph name="BEGIN_LINK1" />Googles användarvillkor<ph name="END_LINK1" /> och <ph name="BEGIN_LINK2" />de ytterligare användarvillkoren för Google Chrome och ChromeOS<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Integritetspolicyn<ph name="END_LINK3" /> gäller också.</translation> <translation id="3080525922482950719">Du kan spara sidor som du vill läsa senare eller offline</translation> <translation id="3091010850649238832">Visa innehållet i Urklipp</translation> <translation id="3098745985164956033">Vissa bilder skickas till Google så att du får bättre beskrivningar</translation> @@ -1086,7 +1088,7 @@ <translation id="6767294960381293877">Listan över enheter som fliken kan delas med öppnades och tar upp halva skärmen.</translation> <translation id="6770602306803890733">Förbättrar säkerheten för dig och alla andra på webben</translation> <translation id="6775840696761158817">När du trycker eller skriver i adressfältet eller sökrutan visas förslag från standardsökmotorn. Detta är inaktiverat i inkognitoläge.</translation> -<translation id="6785476624617658922">Ytterligare villkor för Chrome och Chrome OS</translation> +<translation id="6785476624617658922">Ytterligare villkor för Chrome och ChromeOS</translation> <translation id="6795633245022906657">Öppna en ny flik snabbt. Öppna inställningarna om du vill ändra genvägen.</translation> <translation id="6802555630140434547">Fönstret stängs</translation> <translation id="6811034713472274749">Sidan är klar att öppna</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 47a1a8d..0a2aaa6 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Tovuti imesimamishwa</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Imeshindwa kupakua faili 1}other{Imeshindwa kupakua faili #}}</translation> <translation id="2067805253194386918">maandishi</translation> +<translation id="2079545284768500474">Tendua</translation> <translation id="2082238445998314030">Tokeo <ph name="RESULT_NUMBER" /> kati ya <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Inaonyesha mwonekano wa kushikamana</translation> <translation id="2093731487903423814">dakika 15 zilizopita</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Zimesalia sekunde <ph name="SECONDS" /></translation> <translation id="2779651927720337254">imeshindwa</translation> <translation id="2781151931089541271">Imesalia sekunde 1</translation> +<translation id="2789486458103222910">Sawa</translation> <translation id="2800066122460699237">Kichupo cha <ph name="TAB_TITLE" /> kitafungwa</translation> <translation id="281504910091592009">Angalia na udhibiti manenosiri yaliyohifadhiwa kwenye <ph name="BEGIN_LINK" />Akaunti yako ya Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Menyu ya kadi ya mipasho inaonekana kiasi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 91f7e68..79590b2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">தளம் இடைநிறுத்தப்பட்டுள்ளது</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{ஒரு பதிவிறக்கம் தோல்வியடைந்தது}other{# பதிவிறக்கங்கள் தோல்வியடைந்தன}}</translation> <translation id="2067805253194386918">உரை</translation> +<translation id="2079545284768500474">செயல்தவிர்</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> முடிவுகளில் <ph name="RESULT_NUMBER" />வது முடிவு</translation> <translation id="2091863218454846791">சுருக்கக் காட்சியில் காட்டுகிறது</translation> <translation id="2093731487903423814">கடந்த 15 நிமிடங்களில்</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> வினாடிகள் மீதமுள்ளன</translation> <translation id="2779651927720337254">தோல்வியுற்றது</translation> <translation id="2781151931089541271">1 வினாடி மீதமுள்ளது</translation> +<translation id="2789486458103222910">சரி</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> பக்கம் மூடப்படும்</translation> <translation id="281504910091592009">உங்கள் <ph name="BEGIN_LINK" />Google கணக்கில்<ph name="END_LINK" /> சேமிக்கப்பட்ட கடவுச்சொற்களைப் பார்த்து, நிர்வகிக்கவும்</translation> <translation id="2827278682606527653">ஃபீட் கார்டு மெனு பாதி அளவிற்குத் திறக்கப்பட்டுள்ளது</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index b06d8de..c8043cb7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -191,6 +191,7 @@ <translation id="2056878612599315956">సైట్ పాజ్ చేయబడింది</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 డౌన్లోడ్ విఫలమైంది}other{# డౌన్లోడ్లు విఫలమయ్యాయి}}</translation> <translation id="2067805253194386918">వచనం</translation> +<translation id="2079545284768500474">చర్య రద్దు</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" />లో <ph name="RESULT_NUMBER" />వ ఫలితం</translation> <translation id="2091863218454846791">సంక్షిప్తమైన వీక్షణను చూపుతోంది</translation> <translation id="2093731487903423814">గత 15 నిమిషాలు</translation> @@ -316,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> సెకన్లు మిగిలి ఉంది</translation> <translation id="2779651927720337254">విఫలమైంది</translation> <translation id="2781151931089541271">1 సెకను మిగిలి ఉంది</translation> +<translation id="2789486458103222910">సరే</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ట్యాబ్ మూసివేయబడుతుంది</translation> <translation id="281504910091592009">మీ <ph name="BEGIN_LINK" />Google ఖాతా<ph name="END_LINK" />లో సేవ్ చేసిన పాస్వర్డ్లను చూడండి, మేనేజ్ చేయండి</translation> <translation id="2827278682606527653">Feed card menu half height</translation> @@ -900,6 +902,7 @@ <translation id="583281660410589416">తెలియని</translation> <translation id="5833984609253377421">లింక్ను షేర్ చేయి</translation> <translation id="5839058148541733625">Chrome డినో</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" />తో PDFను తెరవాలా?</translation> <translation id="5853623416121554550">పాజ్ చేయబడింది</translation> <translation id="5855546874025048181">మెరుగుపరచండి: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">ఏదో తప్పు జరిగింది. 'ధరను ట్రాక్ చేయడం'ను అప్డేట్ చేయడం సాధ్యపడలేదు.</translation> @@ -1382,6 +1385,7 @@ <translation id="8127542551745560481">హోమ్ పేజీని ఎడిట్ చేయండి</translation> <translation id="8130309322784422030">మీ స్టోర్ చేయబడిన సైన్ ఇన్ సమాచారం గడువు ముగిసి ఉండవచ్చు</translation> <translation id="813082847718468539">సైట్ సమాచారాన్ని చూడండి</translation> +<translation id="8135406045838672858">డౌన్లోడ్ చేయబడిన PDFలు <ph name="APP_NAME" />తో ఆటోమేటిక్గా తెరవబడతాయి</translation> <translation id="8137562778192957619">మీరు ఈ పాస్వర్డ్ను గుర్తుపెట్టుకోవాల్సిన అవసరం లేదు. ఇది Google Password Managerకు సేవ్ చేయబడుతుంది.</translation> <translation id="8186512483418048923"><ph name="FILES" /> ఫైళ్లు మిగిలి ఉన్నాయి</translation> <translation id="8190358571722158785">1 రోజు మిగిలి ఉంది</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 33a065f..28120aca 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">เว็บไซต์หยุดชั่วคราว</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{ดาวน์โหลด 1 รายการไม่สำเร็จ}other{ดาวน์โหลด # รายการไม่สำเร็จ}}</translation> <translation id="2067805253194386918">ข้อความ</translation> +<translation id="2079545284768500474">เลิกทำ</translation> <translation id="2082238445998314030">ผลลัพธ์ <ph name="RESULT_NUMBER" /> จาก <ph name="TOTAL_RESULTS" /> รายการ</translation> <translation id="2091863218454846791">กำลังแสดงมุมมองแบบอัดแน่น</translation> <translation id="2093731487903423814">15 นาทีที่ผ่านมา</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">เหลือ <ph name="SECONDS" /> วิ</translation> <translation id="2779651927720337254">ล้มเหลว</translation> <translation id="2781151931089541271">เหลือ 1 วิ</translation> +<translation id="2789486458103222910">ตกลง</translation> <translation id="2800066122460699237">ระบบจะปิดแท็บ <ph name="TAB_TITLE" /></translation> <translation id="281504910091592009">ดูและจัดการรหัสผ่านที่บันทึกไว้ใน<ph name="BEGIN_LINK" />บัญชี Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Feed card menu half height</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index fc6abb3..895883e6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Site duraklatıldı</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 indirme işlemi başarısız oldu}other{# indirme işlemi başarısız oldu}}</translation> <translation id="2067805253194386918">Kısa mesaj</translation> +<translation id="2079545284768500474">Geri al</translation> <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> sonuçtan <ph name="RESULT_NUMBER" /> numaralı sonuç</translation> <translation id="2091863218454846791">Kompakt görünüm gösteriliyor</translation> <translation id="2093731487903423814">son 15 dakika</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> sn. kaldı</translation> <translation id="2779651927720337254">başarısız</translation> <translation id="2781151931089541271">1 sn. kaldı</translation> +<translation id="2789486458103222910">Tamam</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> sekmesi kapatılacak</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google Hesabınızdaki<ph name="END_LINK" /> kayıtlı şifrelerinizi görüntüleyin ve yönetin.</translation> <translation id="2827278682606527653">Akış kartı menüsü yarıya kadar açık</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index c844de4..c956178 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Роботу сайту призупинено</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{Не вдалося завантажити 1 файл}one{Не вдалося завантажити # файл}few{Не вдалося завантажити # файли}many{Не вдалося завантажити # файлів}other{Не вдалося завантажити # файлу}}</translation> <translation id="2067805253194386918">SMS</translation> +<translation id="2079545284768500474">Відмінити</translation> <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Показано компактний перегляд</translation> <translation id="2093731487903423814">останні 15 хвилин</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Залишилося <ph name="SECONDS" /> с</translation> <translation id="2779651927720337254">не завантажено</translation> <translation id="2781151931089541271">Залишилась 1 с</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Вкладку "<ph name="TAB_TITLE" />" буде закрито</translation> <translation id="281504910091592009">Переглядайте збережені паролі й керуйте ними в <ph name="BEGIN_LINK" />обліковому записі Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Меню картки зі стрічки відкрито на половину висоти</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 60536ca0..534ed19 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">ایپلیکیشن ورژن</translation> <translation id="1428770807407000502">مطابقت پذیری کو آف کریں؟</translation> <translation id="1430915738399379752">پرنٹ کریں</translation> +<translation id="1435593198351412143">خودکار طور پر PDFs کھولیں</translation> <translation id="1436784010935106834">ہٹا دیا گیا</translation> <translation id="1437543266176261764"><ph name="APP_NAME" /> میں چل رہا ہے</translation> <translation id="1448440926884431741">اپنے ٹریک کردہ پروڈکٹس کو بُک مارکس میں منظم کریں</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">سائٹ رک گئی</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ڈاؤن لوڈ ناکام ہوگیا}other{# ڈاؤن لوڈز ناکام ہو گئے}}</translation> <translation id="2067805253194386918">متن</translation> +<translation id="2079545284768500474">کالعدم کریں</translation> <translation id="2082238445998314030">نتیجہ <ph name="RESULT_NUMBER" /> از <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">مختصر منظر دکھایا جا رہا ہے</translation> <translation id="2093731487903423814">آخری 15 منٹ</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> سیکنڈ باقی</translation> <translation id="2779651927720337254">ناکام ہو گیا</translation> <translation id="2781151931089541271">1 سیکنڈ باقی</translation> +<translation id="2789486458103222910">ٹھیک ہے</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> ٹیب کو بند کر دیا جائے گا</translation> <translation id="281504910091592009">اپنے <ph name="BEGIN_LINK" />Google اکاؤنٹ<ph name="END_LINK" /> میں محفوظ کردہ پاس ورڈز دیکھیں اور ان کا نظم کریں</translation> <translation id="2827278682606527653">نصف اونچائی پر فیڈ کارڈ مینیو</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">آپ کے براؤزر یا آلے کو واضح طور پر سست نہیں کرتا ہے۔</translation> <translation id="2900528713135656174">ایونٹ تخلیق کریں</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> کیلئے تجاویز دکھائی جا رہی ہیں</translation> +<translation id="2904300462646366554">ڈاؤن لوڈ کردہ PDFs آپ کے آلے پر PDF ویورز میں سے ایک ساتھ خودکار طور پر کھلتے ہیں</translation> <translation id="2904414404539560095">ان آلات کی فہرست جن کے ساتھ ٹیب کا اشتراک کرنا ہے مکمل اونچائی پر کھلی ہوئی ہے۔</translation> <translation id="2908243544703713905">نہ پڑھی ہوئی کہانیاں تیار ہیں</translation> <translation id="2909615210195135082">Google اطلاعات پلیٹ فارم</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">کاپی رائٹ<ph name="YEAR" /> Google LLC۔ جملہ حقوق محفوظ ہیں۔</translation> <translation id="5814749351757353073">اپنی پسندیدہ سائٹس سے باخبر رہیں</translation> <translation id="5822875253699806474">تیزی سے اپنی ملاحظہ کردہ سائٹس پر واپس جانے کے لیے، اپنے ٹیبز اور سرگزشت کو سِنک کریں</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> میں محفوظ ہو گیا</translation> <translation id="583281660410589416">نامعلوم</translation> <translation id="5833984609253377421">لنک کا اشتراک کریں</translation> <translation id="5839058148541733625">Chrome ڈائنوسار گیم</translation> +<translation id="5848257610304005265"><ph name="APP_NAME" /> کے ساتھ PDF کھولیں؟</translation> <translation id="5853623416121554550">موقوف ہو گیا</translation> <translation id="5855546874025048181">بہتر بنائیں: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">کچھ غلط ہو گیا۔ قیمت ٹریک کریں کو اپ ڈیٹ نہیں کیا جا سکا۔</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">ہوم صفحہ میں ترمیم کریں</translation> <translation id="8130309322784422030">آپ کی اسٹور کردہ سائن ان کی معلومات پرانی ہو سکتی ہے</translation> <translation id="813082847718468539">سائٹ کی معلومات دیکھیں</translation> +<translation id="8135406045838672858">ڈاؤن لوڈ کردہ PDFs خودکار طور پر <ph name="APP_NAME" /> کے ساتھ کھلتے ہیں</translation> <translation id="8137562778192957619">آپ کو یہ پاس ورڈ یاد رکھنے کی ضرورت نہیں ہوگی۔ اسے Google پاس ورڈ مینیجر میں محفوظ کیا جائے گا۔</translation> <translation id="8186512483418048923"><ph name="FILES" /> فائلیں باقی ہیں</translation> <translation id="8190358571722158785">1 دن باقی</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 5c898762..fc05be8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Ilova versiyasi</translation> <translation id="1428770807407000502">Sinxronizatsiya qilinsinmi?</translation> <translation id="1430915738399379752">Chop etish</translation> +<translation id="1435593198351412143">PDF fayllar avtomatik ochilsin</translation> <translation id="1436784010935106834">Olib tashlangan</translation> <translation id="1437543266176261764"><ph name="APP_NAME" /> ilovasida ochilgan</translation> <translation id="1448440926884431741">Kuzatiladigan mahsulotlarni bukmarklarda tartiblang</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Sayt pauzalangan</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 ta fayl yuklab olinmadi}other{# ta fayl yuklab olinmadi}}</translation> <translation id="2067805253194386918">matn</translation> +<translation id="2079545284768500474">Bekor qilish</translation> <translation id="2082238445998314030">Natija: <ph name="RESULT_NUMBER" /> / <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Ixcham rejimda ochilgan</translation> <translation id="2093731487903423814">Oxirgi 15 daqiqa</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> soniya qoldi</translation> <translation id="2779651927720337254">xatolik:</translation> <translation id="2781151931089541271">1 soniya qoldi</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237"><ph name="TAB_TITLE" /> nomli varaq yopiladi</translation> <translation id="281504910091592009"><ph name="BEGIN_LINK" />Google hisobingizga<ph name="END_LINK" /> saqlangan parollarni ko‘rish va boshqarish</translation> <translation id="2827278682606527653">Quyi bildirgi menyu yarim hajmda ochildi</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Brauzer yoki qurilmani sezilarli darajada sekinlashtirmaydi.</translation> <translation id="2900528713135656174">Tadbir yaratish</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> uchun tavsiyalar koʻrsatilmoqda</translation> +<translation id="2904300462646366554">Yuklab olingan PDF fayllar avtomatik ravishda qurilmadagi PDF ilovalaridan birida ochiladi</translation> <translation id="2904414404539560095">Butun hajmda ochilgan varaq uzatiladigan qurilmalar roʻyxati.</translation> <translation id="2908243544703713905">Ochilmagan hikoyalar tayyor</translation> <translation id="2909615210195135082">Google bildirishnomalar platformasi</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">© Google LLC, <ph name="YEAR" /> Barcha huquqlar himoyalangan.</translation> <translation id="5814749351757353073">Sevimli saytlardan xabar olib turing</translation> <translation id="5822875253699806474">Ochilgan sahifani davom ettirish uchun varaqlar va tarixni sinxronlang</translation> +<translation id="5829586821381540080"><ph name="FOLDER_NAME" /> jildiga saqlandi</translation> <translation id="583281660410589416">Noma’lum</translation> <translation id="5833984609253377421">Havolani ulashish</translation> <translation id="5839058148541733625">Chrome Dino</translation> +<translation id="5848257610304005265">PDF fayl <ph name="APP_NAME" /> ilovasida ochilsinmi?</translation> <translation id="5853623416121554550">pauza qilindi</translation> <translation id="5855546874025048181">Aniqlashtirish: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Xatolik yuz berdi. Kuzatiladigan narx yangilanmadi.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">Bosh sahifani oʻzgartirish</translation> <translation id="8130309322784422030">Kirishga oid saqlangan axborotingiz eskirgan</translation> <translation id="813082847718468539">Sayt haqidagi ma’lumotlar</translation> +<translation id="8135406045838672858">Yuklab olingan PDF fayllar avtomatik <ph name="APP_NAME" /> ilovasida ochiladi</translation> <translation id="8137562778192957619">Bu parolni eslab qolishingiz shart emas. U Google Parollar menejeri xotirasida saqlanadi.</translation> <translation id="8186512483418048923"><ph name="FILES" /> ta fayl qoldi</translation> <translation id="8190358571722158785">1 kun qoldi</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 12c9ed3..85d9538 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">Đã tạm dừng trang web</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 tệp tải xuống không thành công}other{# tệp tải xuống không thành công}}</translation> <translation id="2067805253194386918">văn bản</translation> +<translation id="2079545284768500474">Hoàn tác</translation> <translation id="2082238445998314030">Kết quả <ph name="RESULT_NUMBER" /> trong tổng số <ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Đang hiển thị chế độ xem thu gọn</translation> <translation id="2093731487903423814">15 phút qua</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">Còn <ph name="SECONDS" /> giây</translation> <translation id="2779651927720337254">không tải xuống được</translation> <translation id="2781151931089541271">Còn 1 giây</translation> +<translation id="2789486458103222910">OK</translation> <translation id="2800066122460699237">Thẻ <ph name="TAB_TITLE" /> sẽ đóng</translation> <translation id="281504910091592009">Xem và quản lý các mật khẩu đã lưu trong <ph name="BEGIN_LINK" />Tài khoản Google<ph name="END_LINK" /> của bạn</translation> <translation id="2827278682606527653">Trình đơn thẻ nguồn cấp dữ liệu mở ở nửa dưới của màn hình</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 7ff7194..32ca20f 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">网站已被暂停</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 项下载失败}other{# 项下载失败}}</translation> <translation id="2067805253194386918">文本</translation> +<translation id="2079545284768500474">撤消</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 条结果,共 <ph name="TOTAL_RESULTS" /> 条</translation> <translation id="2091863218454846791">当前显示的是精简视图</translation> <translation id="2093731487903423814">过去 15 分钟</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">还剩 <ph name="SECONDS" /> 秒</translation> <translation id="2779651927720337254">失败</translation> <translation id="2781151931089541271">还剩 1 秒</translation> +<translation id="2789486458103222910">确定</translation> <translation id="2800066122460699237">系统将会关闭标签页“<ph name="TAB_TITLE" />”</translation> <translation id="281504910091592009">查看和管理您的 <ph name="BEGIN_LINK" />Google 账号<ph name="END_LINK" />中保存的密码</translation> <translation id="2827278682606527653">动态卡片上的菜单已半屏打开</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 790bc0f70..9497596a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">網站已暫停</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{1 項下載操作失敗}other{# 項下載操作失敗}}</translation> <translation id="2067805253194386918">文字</translation> +<translation id="2079545284768500474">復原</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 項結果 (共 <ph name="TOTAL_RESULTS" /> 項)</translation> <translation id="2091863218454846791">顯示緊密集檢視</translation> <translation id="2093731487903423814">過去 15 分鐘</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">尚餘 <ph name="SECONDS" /> 秒</translation> <translation id="2779651927720337254">失敗</translation> <translation id="2781151931089541271">尚餘 1 秒</translation> +<translation id="2789486458103222910">確定</translation> <translation id="2800066122460699237">即將關閉 <ph name="TAB_TITLE" /> 分頁</translation> <translation id="281504910091592009">查看和管理儲存在 <ph name="BEGIN_LINK" />Google 帳戶<ph name="END_LINK" />中的密碼</translation> <translation id="2827278682606527653">Feed card menu half height</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 7f73410..b0ad83b4 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
@@ -190,6 +190,7 @@ <translation id="2056878612599315956">網站已暫停</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{無法完成 1 項下載作業}other{無法完成 # 項下載作業}}</translation> <translation id="2067805253194386918">文字</translation> +<translation id="2079545284768500474">復原</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 個結果,共 <ph name="TOTAL_RESULTS" /> 個</translation> <translation id="2091863218454846791">目前顯示的是密集檢視</translation> <translation id="2093731487903423814">過去 15 分鐘</translation> @@ -315,6 +316,7 @@ <translation id="2777555524387840389">還剩 <ph name="SECONDS" /> 秒</translation> <translation id="2779651927720337254">失敗</translation> <translation id="2781151931089541271">還剩 1 秒</translation> +<translation id="2789486458103222910">確定</translation> <translation id="2800066122460699237">即將關閉「<ph name="TAB_TITLE" />」分頁</translation> <translation id="281504910091592009">你可以查看及管理 <ph name="BEGIN_LINK" />Google 帳戶<ph name="END_LINK" />中儲存的密碼</translation> <translation id="2827278682606527653">Feed card menu half height</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index ec60fb5..b65b367 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -91,6 +91,7 @@ <translation id="1416550906796893042">Inguqulo yohlelo lokusebenza</translation> <translation id="1428770807407000502">Vala ukuvumelanisa?</translation> <translation id="1430915738399379752">Phrinta</translation> +<translation id="1435593198351412143">Vula ngokuzenzakalelayo ama-PDF</translation> <translation id="1436784010935106834">Isusiwe</translation> <translation id="1437543266176261764">Qalisa ku-<ph name="APP_NAME" /></translation> <translation id="1448440926884431741">Hlela imikhiqizo yakho elandelelwe Kumabhukhimakhi</translation> @@ -190,6 +191,7 @@ <translation id="2056878612599315956">Isayithi limiswe kancane</translation> <translation id="2065944887543506430">{FILE_COUNT,plural, =1{ukulanda kwehlulekile}one{# ukulanda kwehlulekile}other{# ukulanda kwehlulekile}}</translation> <translation id="2067805253194386918">umbhalo</translation> +<translation id="2079545284768500474">Hlehlisa</translation> <translation id="2082238445998314030">Umphumela ongu-<ph name="RESULT_NUMBER" /> wokungu-<ph name="TOTAL_RESULTS" /></translation> <translation id="2091863218454846791">Ibonisa ukubuka okuhlangene</translation> <translation id="2093731487903423814">imizuzu yokugcina eyi-15</translation> @@ -315,6 +317,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> amasekhondi asele</translation> <translation id="2779651927720337254">yehlulekile</translation> <translation id="2781151931089541271">1 isekhondi elisele</translation> +<translation id="2789486458103222910">Okay</translation> <translation id="2800066122460699237">Ithebhu engu-<ph name="TAB_TITLE" /> izovalwa</translation> <translation id="281504910091592009">Buka futhi uphathe amaphasiwedi alondolozwe ku-<ph name="BEGIN_LINK" />akhawunti yakho ye-Google<ph name="END_LINK" /></translation> <translation id="2827278682606527653">Ubude obunguhhafu bemenyu yekhadi lokuphakelayo</translation> @@ -339,6 +342,7 @@ <translation id="2894821468041866720">Ayinensisi ibhrawuza yakho noma idivayisi yakho.</translation> <translation id="2900528713135656174">Dala umcimbi</translation> <translation id="2901411048554510387">Ibonisa iziphakamiso ze-<ph name="WEBSITE_TITLE" /></translation> +<translation id="2904300462646366554">Ama-PDF adawunilodiwe avula nokuzenzakalelayo ngenye yezibuki ze-PDF ezikudivayisi yakho</translation> <translation id="2904414404539560095">Uhlu lwamadivayisi lokwabelana ngethebhu ngokuvuleka ekuphakameni okuphezulu.</translation> <translation id="2908243544703713905">Izindaba ezingafundiwe zilungile</translation> <translation id="2909615210195135082">Izingxenyekazi zezaziso ze-Google</translation> @@ -894,9 +898,11 @@ <translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Wonke amalungelo agodliwe.</translation> <translation id="5814749351757353073">Qhubeka namasayithi wakho owathandayo</translation> <translation id="5822875253699806474">Ukuze ubuyele ngokushesha kumasayithi owavakashele, vumelanisa amathebhu wakho nomlando</translation> +<translation id="5829586821381540080">Kulondolozwe ku-<ph name="FOLDER_NAME" /></translation> <translation id="583281660410589416">Akwaziwa</translation> <translation id="5833984609253377421">Yabelana ngesixhumanisi</translation> <translation id="5839058148541733625">I-Chrome Dino</translation> +<translation id="5848257610304005265">Ivule i-PDF nge-<ph name="APP_NAME" />?</translation> <translation id="5853623416121554550">kuphunyuziwe</translation> <translation id="5855546874025048181">Yenza ngcono: <ph name="REFINE_TEXT" /></translation> <translation id="5857447844686706637">Kunento engahambanga kahle. Ayikwazanga ukubuyekeza Ukulandelela intengo.</translation> @@ -1379,6 +1385,7 @@ <translation id="8127542551745560481">Hlela ikhasi lasekhaya</translation> <translation id="8130309322784422030">Ulwazi lwakho olugciniwe lokungena ngemvume lungahle lube oluphelelwe yisikhathi</translation> <translation id="813082847718468539">Buka ulwazi lwesayithi</translation> +<translation id="8135406045838672858">Ama-PDF adawunilodiwe avula ngokuzenzakalelayo nge-<ph name="APP_NAME" /></translation> <translation id="8137562778192957619">Ngeke kudingeke ukuba ukhumbule le phasiwedi. Izolondolozwa Kumphathi Wephasiwedi Ye-Google.</translation> <translation id="8186512483418048923"><ph name="FILES" /> amafayela asele</translation> <translation id="8190358571722158785">1 usuku olusele</translation>
diff --git a/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc b/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc index 24d932da..16c8661 100644 --- a/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc +++ b/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc
@@ -10,7 +10,6 @@ #include "base/check.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/observer_list.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" @@ -83,9 +82,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION Profile* last_profile_ = nullptr; + raw_ptr<Profile> last_profile_ = nullptr; std::string last_settings_subpage_; };
diff --git a/chrome/browser/ui/ash/screenshot_area.h b/chrome/browser/ui/ash/screenshot_area.h index 5a6ccf9..4784d965 100644 --- a/chrome/browser/ui/ash/screenshot_area.h +++ b/chrome/browser/ui/ash/screenshot_area.h
@@ -33,8 +33,7 @@ ScreenshotArea(const ScreenshotArea& area); const ScreenshotType type; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union + // RAW_PTR_EXCLUSION: Makes `VideoCaptureInfo` a complex struct. RAW_PTR_EXCLUSION const aura::Window* window = nullptr; const std::optional<const gfx::Rect> rect;
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc index cb55fec..531451d1 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_browsertest.cc
@@ -14,6 +14,7 @@ #include "ash/public/cpp/window_properties.h" #include "ash/shell.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/ranges/algorithm.h" #include "base/run_loop.h" #include "base/scoped_observation.h" @@ -181,10 +182,10 @@ ~AppInstanceWaiter() override = default; void Await() { - auto instances = registry_.GetInstances(app_id_); + auto instances = registry_->GetInstances(app_id_); CHECK_LE(instances.size(), 1u); if (instances.empty() || (*instances.begin())->State() != state_) { - observation_.Observe(®istry_); + observation_.Observe(&*registry_); run_loop_.Run(); } } @@ -192,7 +193,7 @@ private: void OnInstanceUpdate(const apps::InstanceUpdate& update) override { if (update.AppId() == app_id_ && update.State() == state_) { - CHECK_EQ(registry_.GetInstances(app_id_).size(), 1u); + CHECK_EQ(registry_->GetInstances(app_id_).size(), 1u); run_loop_.Quit(); } } @@ -201,7 +202,7 @@ NOTREACHED(); } - apps::InstanceRegistry& registry_; + const raw_ref<apps::InstanceRegistry> registry_; const std::string app_id_; const apps::InstanceState state_; base::RunLoop run_loop_;
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index a598f3e..6a79a54 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -181,11 +181,26 @@ namespace autofill { namespace { + AutoselectFirstSuggestion ShouldAutofillPopupAutoselectFirstSuggestion( AutofillSuggestionTriggerSource source) { return AutoselectFirstSuggestion( source == AutofillSuggestionTriggerSource::kTextFieldDidReceiveKeyDown); } + +bool ShouldEnableHeavyFormDataScraping(const version_info::Channel channel) { + switch (channel) { + case version_info::Channel::CANARY: + case version_info::Channel::DEV: + return true; + case version_info::Channel::STABLE: + case version_info::Channel::BETA: + case version_info::Channel::UNKNOWN: + return false; + } + NOTREACHED_NORETURN(); +} + } // namespace // static @@ -1325,11 +1340,7 @@ } ChromeAutofillClient::ChromeAutofillClient(content::WebContents* web_contents) - : ContentAutofillClient( - web_contents, - base::BindRepeating(&BrowserDriverInitHook, - this, - g_browser_process->GetApplicationLocale())), + : ContentAutofillClient(web_contents), content::WebContentsObserver(web_contents), log_manager_( // TODO(crbug.com/928595): Replace the closure with a callback to the @@ -1418,4 +1429,19 @@ } #endif +std::unique_ptr<AutofillManager> ChromeAutofillClient::CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) { + return std::make_unique<BrowserAutofillManager>( + &driver, this, g_browser_process->GetApplicationLocale()); +} + +void ChromeAutofillClient::InitAgent( + base::PassKey<ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<mojom::AutofillAgent>& agent) { + if (ShouldEnableHeavyFormDataScraping(GetChannel())) { + agent->EnableHeavyFormDataScraping(); + } +} + } // namespace autofill
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index c73ed43..3b0c5a1 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -289,6 +289,14 @@ return autofill_progress_dialog_controller_.get(); } + // ContentAutofillClient: + std::unique_ptr<AutofillManager> CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) override; + void InitAgent( + base::PassKey<ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<mojom::AutofillAgent>& agent) override; + protected: explicit ChromeAutofillClient(content::WebContents* web_contents); #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc b/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc index e631075..988884d 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc
@@ -10,6 +10,7 @@ #include "base/test/scoped_feature_list.h" #include "build/branding_buildflags.h" #include "build/build_config.h" +#include "chrome/browser/autofill/mock_autofill_agent.h" #include "chrome/browser/autofill/personal_data_manager_factory.h" #include "chrome/browser/fast_checkout/fast_checkout_client_impl.h" #include "chrome/browser/plus_addresses/plus_address_service_factory.h" @@ -27,8 +28,11 @@ #include "components/plus_addresses/features.h" #include "components/prefs/pref_service.h" #include "components/unified_consent/pref_names.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #if BUILDFLAG(IS_ANDROID) #include "chrome/browser/ui/android/autofill/autofill_cvc_save_message_delegate.h" @@ -67,11 +71,9 @@ }; #endif -// Exposes the protected constructor. class TestChromeAutofillClient : public ChromeAutofillClient { public: - explicit TestChromeAutofillClient(content::WebContents* web_contents) - : ChromeAutofillClient(web_contents) {} + using ChromeAutofillClient::ChromeAutofillClient; #if BUILDFLAG(IS_ANDROID) MockFastCheckoutClient* GetFastCheckoutClient() override { @@ -89,7 +91,6 @@ } MockFastCheckoutClient fast_checkout_client_; - base::test::ScopedFeatureList scoped_feature_list_; #endif }; @@ -117,14 +118,6 @@ return personal_data_manager_; } - TestContentAutofillDriver* autofill_driver() { - return test_autofill_driver_injector_[web_contents()]; - } - - TestBrowserAutofillManager* autofill_manager() { - return test_autofill_manager_injector_[web_contents()]; - } - private: void PreparePersonalDataManager() { personal_data_manager_ = @@ -145,13 +138,8 @@ } raw_ptr<TestPersonalDataManager> personal_data_manager_ = nullptr; - TestAutofillClientInjector<TestChromeAutofillClient> + TestAutofillClientInjector<testing::NiceMock<TestChromeAutofillClient>> test_autofill_client_injector_; - TestAutofillDriverInjector<TestContentAutofillDriver> - test_autofill_driver_injector_; - TestAutofillManagerInjector<TestBrowserAutofillManager> - test_autofill_manager_injector_; - base::OnceCallback<void()> setup_flags_; }; @@ -454,5 +442,67 @@ } #endif +struct AgentSetupParam { + version_info::Channel channel; + bool heavy_scraping_enabled; +}; + +class MockChromeAutofillClientWithAgent : public ChromeAutofillClient { + public: + explicit MockChromeAutofillClientWithAgent(content::WebContents* web_contents) + : ChromeAutofillClient(web_contents) { + ON_CALL(*this, GetChannel) + .WillByDefault(Return(version_info::Channel::STABLE)); + } + + MOCK_METHOD(version_info::Channel, GetChannel, (), (const override)); +}; + +class ChromeAutofillClientTest_AgentSetup + : public ChromeRenderViewHostTestHarness, + public ::testing::WithParamInterface<AgentSetupParam> { + public: + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + agent_ = std::make_unique<MockAutofillAgent>(); + agent_->BindForTesting(web_contents()->GetPrimaryMainFrame()); + } + + void TearDown() override { + agent_.reset(); + ChromeRenderViewHostTestHarness::TearDown(); + } + + MockChromeAutofillClientWithAgent* client() { + return test_autofill_client_injector_[web_contents()]; + } + + MockAutofillAgent& agent() { return *agent_; } + + private: + TestAutofillClientInjector< + testing::NiceMock<MockChromeAutofillClientWithAgent>> + test_autofill_client_injector_; + std::unique_ptr<MockAutofillAgent> agent_; +}; + +INSTANTIATE_TEST_SUITE_P( + ChromeAutofillClientTest, + ChromeAutofillClientTest_AgentSetup, + testing::Values(AgentSetupParam{version_info::Channel::CANARY, true}, + AgentSetupParam{version_info::Channel::DEV, true}, + AgentSetupParam{version_info::Channel::UNKNOWN, false}, + AgentSetupParam{version_info::Channel::BETA, false}, + AgentSetupParam{version_info::Channel::STABLE, false})); + +TEST_P(ChromeAutofillClientTest_AgentSetup, EnableHeavyFormDataScraping) { + ON_CALL(*client(), GetChannel).WillByDefault(Return(GetParam().channel)); + EXPECT_CALL(agent(), EnableHeavyFormDataScraping()) + .Times(GetParam().heavy_scraping_enabled ? 1 : 0); + NavigateAndCommit(GURL("https://foo.com/")); + task_environment()->RunUntilIdle(); + testing::Mock::VerifyAndClearExpectations(&agent()); +} + } // namespace } // namespace autofill
diff --git a/chrome/browser/ui/extensions/extension_settings_overridden_dialog.h b/chrome/browser/ui/extensions/extension_settings_overridden_dialog.h index 474839b..ba2c67b 100644 --- a/chrome/browser/ui/extensions/extension_settings_overridden_dialog.h +++ b/chrome/browser/ui/extensions/extension_settings_overridden_dialog.h
@@ -51,8 +51,8 @@ std::u16string dialog_message; // The icon to display in the dialog, if any. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union + // RAW_PTR_EXCLUSION: Seems to always point to nullptr (other VectorIncon* + // typically point to a global). RAW_PTR_EXCLUSION const gfx::VectorIcon* icon = nullptr; };
diff --git a/chrome/browser/ui/hats/hats_service_desktop.cc b/chrome/browser/ui/hats/hats_service_desktop.cc index 781ec8c5..c82e342 100644 --- a/chrome/browser/ui/hats/hats_service_desktop.cc +++ b/chrome/browser/ui/hats/hats_service_desktop.cc
@@ -114,9 +114,10 @@ CHECK(web_contents()); if (web_contents() && web_contents()->GetVisibility() == content::Visibility::VISIBLE) { - hats_service_->LaunchSurveyForWebContents(trigger_, web_contents(), - product_specific_bits_data_, - product_specific_string_data_); + hats_service_->LaunchSurveyForWebContents( + trigger_, web_contents(), product_specific_bits_data_, + product_specific_string_data_, std::move(success_callback_), + std::move(failure_callback_), supplied_trigger_id_); hats_service_->RemoveTask(*this); } }
diff --git a/chrome/browser/ui/hats/hats_service_desktop.h b/chrome/browser/ui/hats/hats_service_desktop.h index 501c317..93b5410 100644 --- a/chrome/browser/ui/hats/hats_service_desktop.h +++ b/chrome/browser/ui/hats/hats_service_desktop.h
@@ -81,7 +81,7 @@ NavigationBehaviour navigation_behaviour_; base::OnceClosure success_callback_; base::OnceClosure failure_callback_; - std::optional<std::string_view> supplied_trigger_id_; + std::optional<std::string> supplied_trigger_id_; base::WeakPtrFactory<DelayedSurveyTask> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/page_info/page_info_unittest.cc b/chrome/browser/ui/page_info/page_info_unittest.cc index 1d182cb..aaefd70 100644 --- a/chrome/browser/ui/page_info/page_info_unittest.cc +++ b/chrome/browser/ui/page_info/page_info_unittest.cc
@@ -33,7 +33,6 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" -#include "components/browsing_data/core/features.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_constraints.h" @@ -206,15 +205,7 @@ void ExpectInitialSetCookieInfoCall(MockPageInfoUI* mock_ui) { #if !BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/1430440): SetCookiesInfo is called twice on creation, once - // when the observation of web_contents starts and once when PageInfoUI is - // initialized. Clean this up after it is fixed. - int set_cookie_info_calls = - base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM) - ? 1 - : 2; - EXPECT_CALL(*mock_ui, SetCookieInfo(_)).Times(set_cookie_info_calls); + EXPECT_CALL(*mock_ui, SetCookieInfo(_)).Times(1); #else EXPECT_CALL(*mock_ui, SetCookieInfo(_)); #endif @@ -1562,20 +1553,15 @@ SetDefaultUIExpectations(mock_ui()); NavigateAndCommit(url()); - // When `kMigrateStorageToBDM` is enabled calls to `PresentSiteDataInternal` - // from `PresentSiteData` are synchronous vs. async when it's disabled due to - // the UpdateIgnoredEmptyStorageKeys binding the call. This makes calls to - // `SetCookieInfo` appear as they're called. - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - // This call is needed to satisfy the default expectations after navigation. - page_info(); - Mock::VerifyAndClearExpectations(mock_ui()); - // `SetCookieInfo` is called once through `OnStatusChanged` and another time - // through `OnThirdPartyToggleClicked` which calls `OnStatusChanged` down - // its call chain. - EXPECT_CALL(*mock_ui(), SetCookieInfo(_)).Times(2); - } + // Calls to `PresentSiteDataInternal` from `PresentSiteData` are synchronous + // which makes calls to `SetCookieInfo` appear as they're called. + // This call is needed to satisfy the default expectations after navigation. + page_info(); + Mock::VerifyAndClearExpectations(mock_ui()); + // `SetCookieInfo` is called once through `OnStatusChanged` and another time + // through `OnThirdPartyToggleClicked` which calls `OnStatusChanged` down + // its call chain. + EXPECT_CALL(*mock_ui(), SetCookieInfo(_)).Times(2); page_info()->OnStatusChanged( CookieControlsStatus::kEnabled, @@ -1595,13 +1581,11 @@ SetDefaultUIExpectations(mock_ui()); NavigateAndCommit(url()); - // As above, expectations need to be cleared. - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - page_info(); - Mock::VerifyAndClearExpectations(mock_ui()); - EXPECT_CALL(*mock_ui(), SetCookieInfo(_)).Times(2); - } + // As in `ShowInfoBarWhenAllowingThirdPartyCookies` above, expectations need + // to be cleared. + page_info(); + Mock::VerifyAndClearExpectations(mock_ui()); + EXPECT_CALL(*mock_ui(), SetCookieInfo(_)).Times(2); page_info()->OnStatusChanged( CookieControlsStatus::kDisabledForSite,
diff --git a/chrome/browser/ui/search_engine_choice/OWNERS b/chrome/browser/ui/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/chrome/browser/ui/search_engine_choice/OWNERS +++ b/chrome/browser/ui/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.h b/chrome/browser/ui/views/profiles/profile_menu_view_base.h index 1e1b453e..4112882 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.h +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.h
@@ -82,8 +82,8 @@ EditButtonParams(const EditButtonParams&); ~EditButtonParams(); - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon* edit_icon; std::u16string edit_tooltip_text; base::RepeatingClosure edit_action;
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.h b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.h index cc2fa36..be9cc1c 100644 --- a/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.h +++ b/chrome/browser/ui/views/relaunch_notification/relaunch_notification_controller_platform_impl_desktop.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_UI_VIEWS_RELAUNCH_NOTIFICATION_RELAUNCH_NOTIFICATION_CONTROLLER_PLATFORM_IMPL_DESKTOP_H_ #include "base/functional/callback.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "chrome/browser/ui/browser_list_observer.h" #include "ui/views/widget/widget_observer.h" @@ -61,11 +61,9 @@ // at |deadline|. void ShowRequiredNotification(Browser* browser, base::Time deadline); - // The widget hosting the bubble or dialog, or nullptr if neither is is + // The widget hosting the bubble or dialog, or nullptr if neither is // currently shown. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION views::Widget* widget_ = nullptr; + raw_ptr<views::Widget> widget_ = nullptr; // A callback run when the relaunch required notification first becomes // visible to the user. This callback is valid only while the instance is
diff --git a/chrome/browser/ui/views/search_engine_choice/OWNERS b/chrome/browser/ui/views/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/chrome/browser/ui/views/search_engine_choice/OWNERS +++ b/chrome/browser/ui/views/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h index a62c015..6b8ff61 100644 --- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h +++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
@@ -176,8 +176,8 @@ std::u16string name; // The resources value/identifier for the icon image asset. - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon& icon_asset; }; @@ -216,8 +216,8 @@ std::u16string name; // The resources value/identifier for the icon image asset. - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon& icon_asset; };
diff --git a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc index a6ed184..0a26cba 100644 --- a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc +++ b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog.cc
@@ -26,7 +26,6 @@ #include "chrome/grit/generated_resources.h" #include "components/browsing_data/content/browsing_data_model.h" #include "components/browsing_data/core/browsing_data_utils.h" -#include "components/browsing_data/core/features.h" #include "components/constrained_window/constrained_window_views.h" #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/core/browser/cookie_settings.h" @@ -291,11 +290,6 @@ DeleteMatchingHostNodeFromModel(allowed_cookies_tree_model_.get(), origin); DeleteMatchingHostNodeFromModel(blocked_cookies_tree_model_.get(), origin); - if (!base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - DeletePartitionedStorage(origin); - } - // Removing origin from Browsing Data Model to support new storage types. // The UI assumes deletion completed successfully, so we're passing // `base::DoNothing` callback.
diff --git a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_unittest.cc b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_unittest.cc index 0381873..46b9e961 100644 --- a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_unittest.cc +++ b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_unittest.cc
@@ -11,7 +11,6 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/browsing_data/content/fake_browsing_data_model.h" -#include "components/browsing_data/core/features.h" #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/common/content_settings_manager.mojom.h" #include "content/public/browser/browsing_data_remover.h" @@ -79,26 +78,6 @@ main_rfh()); } - // To prevent tests from being flaky, all |DeleteStoredObjects| calls need to - // be used with a RunLoop if kMigrateStorageToBDM is off. - void RunDeleteStoredObjects(test::PageSpecificSiteDataDialogTestApi* delegate, - const url::Origin& origin) { - base::RunLoop loop; - if (!base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - profile()->GetBrowsingDataRemover()->SetWouldCompleteCallbackForTesting( - base::BindLambdaForTesting([&](base::OnceClosure callback) { - std::move(callback).Run(); - loop.Quit(); - })); - } - delegate->DeleteStoredObjects(origin); - if (!base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - loop.Run(); - } - } - void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); NavigateAndCommit(GURL(kCurrentUrl)); @@ -546,7 +525,7 @@ } // Remove origins from the dialog. - RunDeleteStoredObjects(delegate.get(), thirdPartyUrlOrigin); + delegate->DeleteStoredObjects(thirdPartyUrlOrigin); // Validate that sites are removed from the browsing data model. @@ -604,7 +583,7 @@ } // Remove origins from the dialog. - RunDeleteStoredObjects(delegate.get(), currentUrlOrigin); + delegate->DeleteStoredObjects(currentUrlOrigin); // Validate that sites are removed from the cookie tree model. { @@ -682,7 +661,7 @@ } // Remove origins from the dialog. - RunDeleteStoredObjects(delegate.get(), exampleUrlOrigin); + delegate->DeleteStoredObjects(exampleUrlOrigin); // Validate that sites are removed from both models. { @@ -702,7 +681,7 @@ auto delegate = std::make_unique<test::PageSpecificSiteDataDialogTestApi>(web_contents()); // Remove origins from the dialog. - RunDeleteStoredObjects(delegate.get(), exampleUrlOrigin); + delegate->DeleteStoredObjects(exampleUrlOrigin); // Verify that the data was removed. ValidateAllowedUnpartitionedSites(delegate.get(), {}); }
diff --git a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h index bf6fcba9..afe72d78 100644 --- a/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h +++ b/chrome/browser/ui/views/status_icons/status_icon_linux_dbus.h
@@ -107,8 +107,8 @@ scoped_refptr<dbus::Bus> bus_; int service_id_ = 0; - raw_ptr<dbus::ObjectProxy> watcher_ = nullptr; - raw_ptr<dbus::ExportedObject> item_ = nullptr; + raw_ptr<dbus::ObjectProxy, DanglingUntriaged> watcher_ = nullptr; + raw_ptr<dbus::ExportedObject, DanglingUntriaged> item_ = nullptr; base::RepeatingCallback<void(bool)> barrier_;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.h b/chrome/browser/ui/views/toolbar/toolbar_button.h index ee26e34..4212a35 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_button.h +++ b/chrome/browser/ui/views/toolbar/toolbar_button.h
@@ -10,6 +10,7 @@ #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_exclusion.h" #include "chrome/browser/ui/views/chrome_views_export.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -271,11 +272,9 @@ }; struct VectorIcons { - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon& icon; - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION const gfx::VectorIcon& touch_icon; };
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index ca979511..b2199b00 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -870,7 +870,8 @@ base::Value::Dict browser_dict; const BrowserState& browser = browser_pair.second; - browser_dict.Set("browser", base::StringPrintf("%p", browser.browser)); + browser_dict.Set("browser", + base::StringPrintf("%p", browser.browser.get())); base::Value::Dict tab_dicts; for (const auto& tab_pair : browser.tabs) { @@ -882,7 +883,7 @@ } browser_dict.Set("tabs", std::move(tab_dicts)); browser_dict.Set("active_tab", - base::StringPrintf("%p", browser.active_tab)); + base::StringPrintf("%p", browser.active_tab.get())); browser_dict.Set("app_id", browser.app_id); browser_dict.Set("launch_icon_shown", browser.launch_icon_shown);
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h index ca146f6b..4a757017 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -15,7 +15,6 @@ #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ui/browser_dialogs.h" @@ -173,13 +172,9 @@ BrowserState(const BrowserState&); bool operator==(const BrowserState& other) const; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION Browser* browser; + raw_ptr<Browser, DanglingUntriaged> browser; base::flat_map<content::WebContents*, TabState> tabs; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION content::WebContents* active_tab; + raw_ptr<content::WebContents, DanglingUntriaged> active_tab; // If this isn't an app browser, `app_id` is empty. webapps::AppId app_id; bool launch_icon_shown;
diff --git a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.h b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.h index 69a9094..f7a4e41 100644 --- a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.h +++ b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.h
@@ -10,7 +10,6 @@ #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/timer/elapsed_timer.h" #include "chrome/browser/ash/file_manager/file_tasks.h" #include "chrome/browser/ash/file_system_provider/mount_path_util.h" @@ -53,10 +52,7 @@ namespace ash::cloud_upload { struct ODFSFileSystemAndPath { - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION file_system_provider::ProvidedFileSystemInterface* - file_system; + raw_ptr<file_system_provider::ProvidedFileSystemInterface> file_system; base::FilePath file_path_within_odfs; };
diff --git a/chrome/browser/ui/webui/ash/settings/integration_tests/os_settings_pin_setup_browsertest.cc b/chrome/browser/ui/webui/ash/settings/integration_tests/os_settings_pin_setup_browsertest.cc index 47cc7800..6e8d257 100644 --- a/chrome/browser/ui/webui/ash/settings/integration_tests/os_settings_pin_setup_browsertest.cc +++ b/chrome/browser/ui/webui/ash/settings/integration_tests/os_settings_pin_setup_browsertest.cc
@@ -276,7 +276,8 @@ cryptohome_.SetNextOperationError( FakeUserDataAuthClient::Operation::kAddAuthFactor, - ::user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + ::user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED)); pin_settings.SetPinButInternalError(kFirstPin); pin_settings.AssertHasPin(false);
diff --git a/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc b/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc index ae39157..735c165a 100644 --- a/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc +++ b/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
@@ -22,6 +22,7 @@ #include "components/signin/public/identity_manager/tribool.h" #include "components/supervised_user/core/browser/child_account_service.h" #include "components/supervised_user/core/browser/supervised_user_error_page.h" +#include "components/supervised_user/core/browser/supervised_user_preferences.h" #include "components/supervised_user/core/browser/supervised_user_settings_service.h" #include "components/supervised_user/core/common/features.h" #include "components/supervised_user/core/common/supervised_user_utils.h" @@ -203,8 +204,8 @@ GetSupervisedUserService()->GetURLFilter(); base::Value::List* section_filter = AddSection(§ion_list, "Filter"); - AddSectionEntry(section_filter, "Online checks active", - filter->HasAsyncURLChecker()); + AddSectionEntry(section_filter, "SafeSites enabled", + supervised_user::IsSafeSitesEnabled(*profile->GetPrefs())); AddSectionEntry( section_filter, "Default behavior", FilteringBehaviorToString(filter->GetDefaultFilteringBehavior()));
diff --git a/chrome/browser/ui/webui/search_engine_choice/OWNERS b/chrome/browser/ui/webui/search_engine_choice/OWNERS index 25d7aa0..89018e96 100644 --- a/chrome/browser/ui/webui/search_engine_choice/OWNERS +++ b/chrome/browser/ui/webui/search_engine_choice/OWNERS
@@ -1,3 +1,3 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 9552f84..75dab4c 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -2455,6 +2455,8 @@ {"searchEnginesSetAsDefaultButton", IDS_SEARCH_ENGINE_CHOICE_BUTTON_TITLE}, {"searchEnginesCancelButton", IDS_CANCEL}, + {"searchEnginesConfirmationToastLabel", + IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CONFIRMATION_TOAST_LABEL}, }; html_source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper_browsertest.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_browsertest.cc index 08a037f..d920421 100644 --- a/chrome/browser/ui/webui/signin/turn_sync_on_helper_browsertest.cc +++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_browsertest.cc
@@ -193,9 +193,7 @@ std::tuple<TurnSyncOnHelper::SigninAbortedMode, bool>> { public: TurnSyncOnHelperBrowserTestWithParam() - : SigninBrowserTestBase(/*use_main_profile=*/false) { - feature_list_.InitAndDisableFeature(switches::kUnoDesktop); - } + : SigninBrowserTestBase(/*use_main_profile=*/false) {} protected: bool should_remove_initial_account() const { @@ -205,9 +203,6 @@ TurnSyncOnHelper::SigninAbortedMode aborted_mode() const { return std::get<TurnSyncOnHelper::SigninAbortedMode>(GetParam()); } - - private: - base::test::ScopedFeatureList feature_list_; }; // Tests that aborting a Sync opt-in flow started with a secondary account @@ -215,12 +210,17 @@ IN_PROC_BROWSER_TEST_P(TurnSyncOnHelperBrowserTestWithParam, PrimaryAccountResetAfterSyncOptInFlowAborted) { Profile* profile = GetProfile(); - auto accounts_info = SetAccountsCookiesAndTokens( - {"first@gmail.com", "second@gmail.com", "third@gmail.com"}); - AccountInfo first_account_info = accounts_info[0]; - AccountInfo second_account_info = accounts_info[1]; - AccountInfo third_account_info = accounts_info[2]; - CoreAccountId first_account_id = first_account_info.account_id; + CoreAccountInfo primary_account_info = signin::MakeAccountAvailable( + identity_manager(), identity_test_env() + ->CreateAccountAvailabilityOptionsBuilder() + .AsPrimary(signin::ConsentLevel::kSignin) + .WithCookie() + .Build("first@gmail.com")); + auto secondary_accounts_info = + SetAccountsCookiesAndTokens({"second@gmail.com", "third@gmail.com"}); + AccountInfo second_account_info = secondary_accounts_info[0]; + AccountInfo third_account_info = secondary_accounts_info[1]; + CoreAccountId first_account_id = primary_account_info.account_id; CoreAccountId second_account_id = second_account_info.account_id; ASSERT_EQ(signin::ConsentLevel::kSignin, @@ -271,7 +271,7 @@ // Second account removed, first account is still primary. EXPECT_THAT( identity_manager()->GetAccountsWithRefreshTokens(), - UnorderedElementsAre(first_account_info, third_account_info)); + UnorderedElementsAre(primary_account_info, third_account_info)); EXPECT_EQ(signin::ConsentLevel::kSignin, signin::GetPrimaryAccountConsentLevel(identity_manager())); EXPECT_EQ(first_account_id, identity_manager()->GetPrimaryAccountId( @@ -300,7 +300,7 @@ // First account is still primary, second account was not removed. EXPECT_THAT( identity_manager()->GetAccountsWithRefreshTokens(), - UnorderedElementsAre(first_account_info, second_account_info, + UnorderedElementsAre(primary_account_info, second_account_info, third_account_info)); EXPECT_EQ(signin::ConsentLevel::kSignin, signin::GetPrimaryAccountConsentLevel(identity_manager())); @@ -327,25 +327,20 @@ class TurnSyncOnHelperBrowserTest : public SigninBrowserTestBase { public: TurnSyncOnHelperBrowserTest() - : SigninBrowserTestBase(/*use_main_profile=*/false) { - feature_list_.InitAndDisableFeature(switches::kUnoDesktop); - } - - private: - base::test::ScopedFeatureList feature_list_; + : SigninBrowserTestBase(/*use_main_profile=*/false) {} }; // Regression test for https://crbug.com/1404961 IN_PROC_BROWSER_TEST_F(TurnSyncOnHelperBrowserTest, UndoSyncRemoveAccount) { Profile* profile = GetProfile(); - auto accounts_info = SetAccountsCookiesAndTokens({"account@gmail.com"}); - AccountInfo account_info = accounts_info[0]; - CoreAccountId account_id = account_info.account_id; - ASSERT_EQ(signin::ConsentLevel::kSignin, - signin::GetPrimaryAccountConsentLevel(identity_manager())); - ASSERT_EQ(account_id, identity_manager()->GetPrimaryAccountId( - signin::ConsentLevel::kSignin)); + CoreAccountInfo account_info = signin::MakeAccountAvailable( + identity_manager(), identity_test_env() + ->CreateAccountAvailabilityOptionsBuilder() + .AsPrimary(signin::ConsentLevel::kSignin) + .WithCookie() + .Build("account@gmail.com")); + CoreAccountId account_id = account_info.account_id; base::RunLoop run_loop; Delegate::Choices choices = {.sync_optin_choice = std::nullopt}; @@ -451,15 +446,17 @@ PrimaryAccountResetAfterSyncOptInFlowAbortedForSecondaryAccount) { Profile* profile = GetProfile(); // Set up the primary account. - AccountInfo first_account_info = - identity_test_env()->MakePrimaryAccountAvailable( - "first@gmail.com", signin::ConsentLevel::kSignin); - identity_test_env()->UpdateAccountInfoForAccount(first_account_info); - auto accounts_info = SetAccountsCookiesAndTokens( - {"first@gmail.com", "second@gmail.com", "third@gmail.com"}); - AccountInfo second_account_info = accounts_info[1]; - AccountInfo third_account_info = accounts_info[2]; - CoreAccountId first_account_id = first_account_info.account_id; + CoreAccountInfo primary_account_info = signin::MakeAccountAvailable( + identity_manager(), identity_test_env() + ->CreateAccountAvailabilityOptionsBuilder() + .AsPrimary(signin::ConsentLevel::kSignin) + .WithCookie() + .Build("first@gmail.com")); + auto secondary_accounts_info = + SetAccountsCookiesAndTokens({"second@gmail.com", "third@gmail.com"}); + AccountInfo second_account_info = secondary_accounts_info[0]; + AccountInfo third_account_info = secondary_accounts_info[1]; + CoreAccountId first_account_id = primary_account_info.account_id; CoreAccountId second_account_id = second_account_info.account_id; ASSERT_EQ(signin::ConsentLevel::kSignin, @@ -495,7 +492,7 @@ // First account is still primary, second account was not removed. EXPECT_THAT(identity_manager()->GetAccountsWithRefreshTokens(), - UnorderedElementsAre(first_account_info, second_account_info, + UnorderedElementsAre(primary_account_info, second_account_info, third_account_info)); EXPECT_EQ(signin::ConsentLevel::kSignin, signin::GetPrimaryAccountConsentLevel(identity_manager())); @@ -511,14 +508,16 @@ Profile* profile = GetProfile(); // Set up the primary account. - AccountInfo first_account_info = - identity_test_env()->MakePrimaryAccountAvailable( - "first@gmail.com", signin::ConsentLevel::kSignin); - identity_test_env()->UpdateAccountInfoForAccount(first_account_info); - CoreAccountId first_account_id = first_account_info.account_id; - auto accounts_info = - SetAccountsCookiesAndTokens({"first@gmail.com", "second@gmail.com"}); - AccountInfo second_account_info = accounts_info[1]; + CoreAccountInfo primary_account_info = signin::MakeAccountAvailable( + identity_manager(), identity_test_env() + ->CreateAccountAvailabilityOptionsBuilder() + .AsPrimary(signin::ConsentLevel::kSignin) + .WithCookie() + .Build("first@gmail.com")); + CoreAccountId first_account_id = primary_account_info.account_id; + auto secondary_accounts_info = + SetAccountsCookiesAndTokens({"second@gmail.com"}); + AccountInfo second_account_info = secondary_accounts_info[0]; CoreAccountId second_account_id = second_account_info.account_id; ASSERT_EQ(signin::ConsentLevel::kSignin, @@ -553,7 +552,7 @@ // First account is still primary, second account was removed. EXPECT_THAT(identity_manager()->GetAccountsWithRefreshTokens(), - UnorderedElementsAre(first_account_info)); + UnorderedElementsAre(primary_account_info)); EXPECT_EQ(signin::ConsentLevel::kSignin, signin::GetPrimaryAccountConsentLevel(identity_manager())); EXPECT_EQ(first_account_id, identity_manager()->GetPrimaryAccountId(
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc index 2a7e1b5..33fd9c9a 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc +++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
@@ -233,7 +233,7 @@ // TabSearchPageHandler object, causing it to be immediately destroyed. Ensure // that no further actions are performed following the call to // CloseWebContentsAt(). See (https://crbug.com/1175507). - auto* tab_strip_model = optional_details->tab_strip_model; + auto* tab_strip_model = optional_details->tab_strip_model.get(); const int tab_index = optional_details->index; tab_strip_model->CloseWebContentsAt( tab_index, TabCloseTypes::CLOSE_CREATE_HISTORICAL_TAB);
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h index cd467d4..a19e16f 100644 --- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h +++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
@@ -6,7 +6,6 @@ #define CHROME_BROWSER_UI_WEBUI_TAB_SEARCH_TAB_SEARCH_PAGE_HANDLER_H_ #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "chrome/browser/ui/browser_tab_strip_tracker.h" #include "chrome/browser/ui/browser_tab_strip_tracker_delegate.h" #include "chrome/browser/ui/tabs/organization/tab_data.h" @@ -145,12 +144,8 @@ TabDetails(Browser* browser, TabStripModel* tab_strip_model, int index) : browser(browser), tab_strip_model(tab_strip_model), index(index) {} - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION Browser* browser; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION TabStripModel* tab_strip_model; + raw_ptr<Browser> browser; + raw_ptr<TabStripModel> tab_strip_model; int index; };
diff --git a/chrome/browser/upgrade_detector/installed_version_updater_chromeos.h b/chrome/browser/upgrade_detector/installed_version_updater_chromeos.h index 8335efc..dd36485a 100644 --- a/chrome/browser/upgrade_detector/installed_version_updater_chromeos.h +++ b/chrome/browser/upgrade_detector/installed_version_updater_chromeos.h
@@ -7,7 +7,7 @@ #include <string> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" @@ -31,9 +31,7 @@ void OnChannel(bool is_current_channel, const std::string& channel_name); SEQUENCE_CHECKER(sequence_checker_); - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION BuildState* const build_state_; + const raw_ptr<BuildState> build_state_; }; #endif // CHROME_BROWSER_UPGRADE_DETECTOR_INSTALLED_VERSION_UPDATER_CHROMEOS_H_
diff --git a/chrome/browser/webauthn/android/cable_module_android.cc b/chrome/browser/webauthn/android/cable_module_android.cc index 2401b5f..cc4c82f 100644 --- a/chrome/browser/webauthn/android/cable_module_android.cc +++ b/chrome/browser/webauthn/android/cable_module_android.cc
@@ -8,6 +8,7 @@ #include "base/base64.h" #include "base/functional/bind.h" #include "base/logging.h" +#include "base/memory/raw_ptr_exclusion.h" #include "base/no_destructor.h" #include "base/sys_byteorder.h" #include "base/task/task_traits.h" @@ -248,9 +249,8 @@ // PreLinkInfo reflects the linking information provided by Play Services. struct PreLinkInfo { - // All fields below are not a raw_ptr<T> because cbor_extract.cc would - // cast the raw_ptr<T> to a void*, skipping an AddRef() call and causing a - // ref-counting mismatch. + // RAW_PTR_EXCLUSION: cbor_extract.cc would cast the raw_ptr<T> to a void*, + // skipping an AddRef() call and causing a ref-counting mismatch. RAW_PTR_EXCLUSION const std::vector<uint8_t>* contact_id; RAW_PTR_EXCLUSION const std::vector<uint8_t>* pairing_id; RAW_PTR_EXCLUSION const std::vector<uint8_t>* secret;
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 9dc29cc..db606e6 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1706140790-483aa9efe4844a6edd23e50c06b81d7023dbbfb8.profdata +chrome-linux-main-1706183899-e057c7db91a19ee4369eb2cb222f716e5faf30d6.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 0b89a3a..6c70c0d7 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1706161820-4ab234c76efaa7a3d084c70a05e3b151102fc784.profdata +chrome-mac-arm-main-1706190924-990e6eb218a66baeb3c1328b8f207e6f929abddb.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 00fdab0..3f84bc21 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1706140790-fedeed57b2a9f041863d12b3547a8e6ec180e78a.profdata +chrome-win-arm64-main-1706183899-cd2ba6cfd69b6f89b0564fca73982ce4729e467c.profdata
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc index 843883a..d1e50c6 100644 --- a/chrome/renderer/accessibility/read_anything_app_model.cc +++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -772,16 +772,16 @@ // Note that this list of events may overlap with non-generated events in the // It's up to the consumer to pick but its generally good to prefer generated. for (const auto& event : event_generator) { - switch (event.event_params.event) { + switch (event.event_params->event) { case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: - OnSelection(event.event_params.event_from); + OnSelection(event.event_params->event_from); break; case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: case ui::AXEventGenerator::Event::ALERT: requires_distillation_ = true; break; case ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED: - OnScroll(event.event_params.event_from_action == + OnScroll(event.event_params->event_from_action == ax::mojom::Action::kSetSelection, /* from_reading_mode= */ false); break;
diff --git a/chrome/renderer/autofill/form_autocomplete_browsertest.cc b/chrome/renderer/autofill/form_autocomplete_browsertest.cc index 2e07deb..76fa418 100644 --- a/chrome/renderer/autofill/form_autocomplete_browsertest.cc +++ b/chrome/renderer/autofill/form_autocomplete_browsertest.cc
@@ -25,6 +25,7 @@ #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_element.h" #include "third_party/blink/public/web/web_form_element.h" @@ -357,284 +358,6 @@ std::unique_ptr<test::FocusTestUtils> focus_test_utils_; }; -// Tests that submitting a form generates FormSubmitted message with the form -// fields. -TEST_F(FormAutocompleteTest, NormalFormSubmit) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='about:blank'>" - "<input name='fname' value='Rick'/>" - "<input name='lname' value='Deckard'/></form></html>"); - - // Submit the form. - ExecuteJavaScriptForTests("document.getElementById('myForm').submit();"); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", - false /* expect_known_success */, - SubmissionSource::FORM_SUBMISSION); -} - -// Tests that FormSubmitted message is generated even the submit event isn't -// propagated by Javascript. -TEST_F(FormAutocompleteTest, SubmitEventPrevented) { - // Load a form. - LoadHTML( - "<html><form id='myForm'><input name='fname' value='Rick'/>" - "<input name='lname' value='Deckard'/><input type=submit></form>" - "</html>"); - - // Submit the form. - ExecuteJavaScriptForTests( - "var form = document.forms[0];" - "form.onsubmit = function(event) { event.preventDefault(); };" - "document.querySelector('input[type=submit]').click();"); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", - false /* expect_known_success */, - SubmissionSource::FORM_SUBMISSION); -} - -// Tests that completing an Ajax request and having the form disappear will -// trigger submission from Autofill's point of view. -TEST_F(FormAutocompleteTest, AjaxSucceeded_NoLongerVisible) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='http://example.com/blade.php'>" - "<input name='fname' id='fname' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form></html>"); - - // Simulate user input so that the form is "remembered". - WebDocument document = GetMainFrame()->GetDocument(); - WebElement element = document.GetElementById(WebString::FromUTF8("fname")); - ASSERT_FALSE(element.IsNull()); - WebInputElement fname_element = element.To<WebInputElement>(); - SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); - - // Simulate removing the form just before the ajax request completes. - ExecuteJavaScriptForTests( - "var element = document.getElementById('myForm');" - "element.parentNode.removeChild(element);"); - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", - true /* expect_known_success */, - SubmissionSource::XHR_SUCCEEDED); -} - -// Tests that completing an Ajax request and having the form with a specific -// action disappear will trigger submission from Autofill's point of view, even -// if there is another form with the same data but different action on the page. -TEST_F(FormAutocompleteTest, - AjaxSucceeded_NoLongerVisible_DifferentActionsSameData) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='http://example.com/blade.php'>" - "<input name='fname' id='fname' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form>" - "<form id='myForm2' action='http://example.com/runner.php'>" - "<input name='fname' id='fname2' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form></html>"); - - // Simulate user input so that the form is "remembered". - WebDocument document = GetMainFrame()->GetDocument(); - WebElement element = document.GetElementById(WebString::FromUTF8("fname")); - ASSERT_FALSE(element.IsNull()); - WebInputElement fname_element = element.To<WebInputElement>(); - SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); - - // Simulate removing the form just before the ajax request completes. - ExecuteJavaScriptForTests( - "var element = document.getElementById('myForm');" - "element.parentNode.removeChild(element);"); - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", - true /* expect_known_success */, - SubmissionSource::XHR_SUCCEEDED); -} - -// Tests that completing an Ajax request and having the form with no action -// specified disappear will trigger submission from Autofill's point of view, -// even if there is still another form with no action in the page. It will -// compare field data within the forms. -// TODO(kolos) Re-enable when the implementation of IsFormVisible is on-par -// for these platforms. -#if BUILDFLAG(IS_MAC) -#define MAYBE_NoLongerVisibleBothNoActions DISABLED_NoLongerVisibleBothNoActions -#else -#define MAYBE_NoLongerVisibleBothNoActions NoLongerVisibleBothNoActions -#endif -TEST_F(FormAutocompleteTest, MAYBE_NoLongerVisibleBothNoActions) { - // Load a form. - LoadHTML( - "<html><form id='myForm'>" - "<input name='fname' id='fname' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form>" - "<form id='myForm2'>" - "<input name='fname' id='fname2' value='John'/>" - "<input name='lname' value='Doe'/><input type=submit></form></html>"); - - // Simulate user input so that the form is "remembered". - WebDocument document = GetMainFrame()->GetDocument(); - WebElement element = document.GetElementById(WebString::FromUTF8("fname")); - ASSERT_FALSE(element.IsNull()); - WebInputElement fname_element = element.To<WebInputElement>(); - SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); - - // Simulate removing the form just before the ajax request completes. - ExecuteJavaScriptForTests( - "var element = document.getElementById('myForm');" - "element.parentNode.removeChild(element);"); - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", - true /* expect_known_success */, - SubmissionSource::XHR_SUCCEEDED); -} - -// Tests that completing an Ajax request and having the form with no action -// specified disappear will trigger submission from Autofill's point of view. -TEST_F(FormAutocompleteTest, AjaxSucceeded_NoLongerVisible_NoAction) { - // Load a form. - LoadHTML( - "<html><form id='myForm'>" - "<input name='fname' id='fname' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form></html>"); - - // Simulate user input so that the form is "remembered". - WebDocument document = GetMainFrame()->GetDocument(); - WebElement element = document.GetElementById(WebString::FromUTF8("fname")); - ASSERT_FALSE(element.IsNull()); - WebInputElement fname_element = element.To<WebInputElement>(); - SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); - - // Simulate removing the form just before the ajax request completes. - ExecuteJavaScriptForTests( - "var element = document.getElementById('myForm');" - "element.parentNode.removeChild(element);"); - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", - true /* expect_known_success */, - SubmissionSource::XHR_SUCCEEDED); -} - -// Tests that completing an Ajax request but leaving a form visible will not -// trigger submission from Autofill's point of view. -TEST_F(FormAutocompleteTest, AjaxSucceeded_StillVisible) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='http://example.com/blade.php'>" - "<input name='fname' id='fname' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form></html>"); - - // Simulate user input so that the form is "remembered". - WebDocument document = GetMainFrame()->GetDocument(); - WebElement element = document.GetElementById(WebString::FromUTF8("fname")); - ASSERT_FALSE(element.IsNull()); - WebInputElement fname_element = element.To<WebInputElement>(); - SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - // No submission messages sent. - VerifyNoSubmitMessagesReceived(fake_driver_); -} - -// Tests that completing an Ajax request without any prior form interaction -// does not trigger form submission from Autofill's point of view. -TEST_F(FormAutocompleteTest, AjaxSucceeded_NoFormInteractionInvisible) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='http://example.com/blade.php'>" - "<input name='fname' id='fname' value='Bob'/>" - "<input name='lname' value='Deckard'/><input type=submit></form></html>"); - - // No form interaction. - - // Simulate removing the form just before the ajax request completes. - ExecuteJavaScriptForTests( - "var element = document.getElementById('myForm');" - "element.parentNode.removeChild(element);"); - - // Simulate an Ajax request completing without prior user interaction. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - // No submission messages sent. - VerifyNoSubmitMessagesReceived(fake_driver_); -} - -// Tests that completing an Ajax request after having autofilled a form, -// with the form disappearing, will trigger submission from Autofill's -// point of view. -TEST_F(FormAutocompleteTest, AjaxSucceeded_FilledFormIsInvisible) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='http://example.com/blade.php'>" - "<input name='fname' id='fname'/>" - "<input name='lname'/></form></html>"); - - // Simulate filling a form using Autofill. - SimulateFillForm(autofill_agent_, GetMainFrame()); - - // Simulate user input since ajax request doesn't fire submission message - // if there is no user input. - SimulateUserInput(WebString::FromUTF8("fname"), std::string("Rick")); - - // Simulate removing the form just before the ajax request completes. - ExecuteJavaScriptForTests( - "var element = document.getElementById('myForm');" - "element.parentNode.removeChild(element);"); - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Rick", "Smith", - true /* expect_known_success */, - SubmissionSource::XHR_SUCCEEDED); -} - -// Tests that completing an Ajax request after having autofilled a form, -// without the form disappearing, will not trigger submission from Autofill's -// point of view. -TEST_F(FormAutocompleteTest, AjaxSucceeded_FilledFormStillVisible) { - // Load a form. - LoadHTML( - "<html><form id='myForm' action='http://example.com/blade.php'>" - "<input name='fname' id='fname' value='Rick'/>" - "<input name='lname' value='Deckard'/></form></html>"); - - // Simulate filling a form using Autofill. - SimulateFillForm(autofill_agent_, GetMainFrame()); - - // Form still visible. - - // Simulate an Ajax request completing. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - // No submission messages sent. - VerifyNoSubmitMessagesReceived(fake_driver_); -} - // Tests that correct focus, change and blur events are emitted during the // autofilling process when there is an initial focused element in a form // having non-fillable fields. @@ -774,38 +497,6 @@ EXPECT_EQ(GetFocusLog(), "c0"); } -// Tests that completing an Ajax request without a form present will still -// trigger submission, if all the inputs the user has modified disappear. -TEST_F(FormAutocompleteTest, AjaxSucceeded_FormlessElements) { - // Load a "form." Note that kRequiredFieldsForUpload fields are required - // for the formless logic to trigger, so we add a throwaway third field. - LoadHTML( - "<head><title>Checkout</title></head>" - "<input type='text' name='fname' id='fname'/>" - "<input type='text' name='lname' value='Puckett'/>" - "<input type='number' name='number' value='34'/>"); - - // Simulate user input. - WebDocument document = GetMainFrame()->GetDocument(); - WebElement element = document.GetElementById(WebString::FromUTF8("fname")); - ASSERT_FALSE(element.IsNull()); - WebInputElement fname_element = element.To<WebInputElement>(); - SimulateUserInputChangeForElement(&fname_element, std::string("Kirby")); - - // Remove element from view. - ExecuteJavaScriptForTests( - "var element = document.getElementById('fname');" - "element.style.display = 'none';"); - - // Simulate AJAX request. - static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); - base::RunLoop().RunUntilIdle(); - - VerifyReceivedRendererMessages(fake_driver_, "Kirby", "Puckett", - true /* expect_known_success */, - SubmissionSource::XHR_SUCCEEDED); -} - // Unit test for AutofillAgent::AcceptDataListSuggestion. TEST_F(FormAutocompleteTest, AcceptDataListSuggestion) { LoadHTML( @@ -983,9 +674,375 @@ EXPECT_TRUE(fake_driver_.had_interacted_form()); } +TEST_F(FormAutocompleteTest, SelectControlChanged) { + LoadHTML( + "<html>" + "<form>" + "<select id='color'><option value='red'>red</option><option " + "value='blue'>blue</option></select>" + "</form>" + "</html>"); + + std::string change_value = + "var color = document.getElementById('color');" + "color.selectedIndex = 1;"; + + ExecuteJavaScriptForTests(change_value.c_str()); + WebElement element = + GetMainFrame()->GetDocument().GetElementById(blink::WebString("color")); + static_cast<blink::WebAutofillClient*>(autofill_agent_) + ->SelectControlDidChange( + *reinterpret_cast<blink::WebFormControlElement*>(&element)); + base::RunLoop().RunUntilIdle(); + + const FormFieldData* field = fake_driver_.select_control_changed(); + ASSERT_TRUE(field); + EXPECT_EQ(u"color", field->name); + EXPECT_EQ(u"blue", field->value); +} + +// Parameterized test for submission detection. The parameter dictates whether +// the tests run with `kAutofillImproveSubmissionDetection` enabled or not. +class FormAutocompleteSubmissionTest + : public FormAutocompleteTest, + public testing::WithParamInterface<bool> { + public: + FormAutocompleteSubmissionTest() { + if (GetParam()) { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/ + {blink::features::kAutofillUseDomNodeIdForRendererId, + features::kAutofillReplaceCachedWebElementsByRendererIds, + features::kAutofillImproveSubmissionDetection}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitAndDisableFeature( + features::kAutofillImproveSubmissionDetection); + } + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P(AutofillSubmissionTest, + FormAutocompleteSubmissionTest, + ::testing::Bool()); + +// Tests that submitting a form generates FormSubmitted message with the form +// fields. +TEST_P(FormAutocompleteSubmissionTest, NormalFormSubmit) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='about:blank'>" + "<input name='fname' value='Rick'/>" + "<input name='lname' value='Deckard'/></form></html>"); + + // Submit the form. + ExecuteJavaScriptForTests("document.getElementById('myForm').submit();"); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", + false /* expect_known_success */, + SubmissionSource::FORM_SUBMISSION); +} + +// Tests that FormSubmitted message is generated even the submit event isn't +// propagated by Javascript. +TEST_P(FormAutocompleteSubmissionTest, SubmitEventPrevented) { + // Load a form. + LoadHTML( + "<html><form id='myForm'><input name='fname' value='Rick'/>" + "<input name='lname' value='Deckard'/><input type=submit></form>" + "</html>"); + + // Submit the form. + ExecuteJavaScriptForTests( + "var form = document.forms[0];" + "form.onsubmit = function(event) { event.preventDefault(); };" + "document.querySelector('input[type=submit]').click();"); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", + false /* expect_known_success */, + SubmissionSource::FORM_SUBMISSION); +} + +// Tests that completing an Ajax request and having the form disappear will +// trigger submission from Autofill's point of view. +TEST_P(FormAutocompleteSubmissionTest, AjaxSucceeded_NoLongerVisible) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='http://example.com/blade.php'>" + "<input name='fname' id='fname' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form></html>"); + + // Simulate user input so that the form is "remembered". + WebDocument document = GetMainFrame()->GetDocument(); + WebElement element = document.GetElementById(WebString::FromUTF8("fname")); + ASSERT_FALSE(element.IsNull()); + WebInputElement fname_element = element.To<WebInputElement>(); + SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); + + // Simulate removing the form just before the ajax request completes. + ExecuteJavaScriptForTests( + "var element = document.getElementById('myForm');" + "element.parentNode.removeChild(element);"); + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", + true /* expect_known_success */, + SubmissionSource::XHR_SUCCEEDED); +} + +// Tests that completing an Ajax request and having the form with a specific +// action disappear will trigger submission from Autofill's point of view, even +// if there is another form with the same data but different action on the page. +TEST_P(FormAutocompleteSubmissionTest, + AjaxSucceeded_NoLongerVisible_DifferentActionsSameData) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='http://example.com/blade.php'>" + "<input name='fname' id='fname' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form>" + "<form id='myForm2' action='http://example.com/runner.php'>" + "<input name='fname' id='fname2' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form></html>"); + + // Simulate user input so that the form is "remembered". + WebDocument document = GetMainFrame()->GetDocument(); + WebElement element = document.GetElementById(WebString::FromUTF8("fname")); + ASSERT_FALSE(element.IsNull()); + WebInputElement fname_element = element.To<WebInputElement>(); + SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); + + // Simulate removing the form just before the ajax request completes. + ExecuteJavaScriptForTests( + "var element = document.getElementById('myForm');" + "element.parentNode.removeChild(element);"); + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", + true /* expect_known_success */, + SubmissionSource::XHR_SUCCEEDED); +} + +// Tests that completing an Ajax request and having the form with no action +// specified disappear will trigger submission from Autofill's point of view, +// even if there is still another form with no action in the page. It will +// compare field data within the forms. +// TODO(kolos) Re-enable when the implementation of IsFormVisible is on-par +// for these platforms. +#if BUILDFLAG(IS_MAC) +#define MAYBE_NoLongerVisibleBothNoActions DISABLED_NoLongerVisibleBothNoActions +#else +#define MAYBE_NoLongerVisibleBothNoActions NoLongerVisibleBothNoActions +#endif +TEST_P(FormAutocompleteSubmissionTest, MAYBE_NoLongerVisibleBothNoActions) { + // Load a form. + LoadHTML( + "<html><form id='myForm'>" + "<input name='fname' id='fname' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form>" + "<form id='myForm2'>" + "<input name='fname' id='fname2' value='John'/>" + "<input name='lname' value='Doe'/><input type=submit></form></html>"); + + // Simulate user input so that the form is "remembered". + WebDocument document = GetMainFrame()->GetDocument(); + WebElement element = document.GetElementById(WebString::FromUTF8("fname")); + ASSERT_FALSE(element.IsNull()); + WebInputElement fname_element = element.To<WebInputElement>(); + SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); + + // Simulate removing the form just before the ajax request completes. + ExecuteJavaScriptForTests( + "var element = document.getElementById('myForm');" + "element.parentNode.removeChild(element);"); + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", + true /* expect_known_success */, + SubmissionSource::XHR_SUCCEEDED); +} + +// Tests that completing an Ajax request and having the form with no action +// specified disappear will trigger submission from Autofill's point of view. +TEST_P(FormAutocompleteSubmissionTest, AjaxSucceeded_NoLongerVisible_NoAction) { + // Load a form. + LoadHTML( + "<html><form id='myForm'>" + "<input name='fname' id='fname' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form></html>"); + + // Simulate user input so that the form is "remembered". + WebDocument document = GetMainFrame()->GetDocument(); + WebElement element = document.GetElementById(WebString::FromUTF8("fname")); + ASSERT_FALSE(element.IsNull()); + WebInputElement fname_element = element.To<WebInputElement>(); + SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); + + // Simulate removing the form just before the ajax request completes. + ExecuteJavaScriptForTests( + "var element = document.getElementById('myForm');" + "element.parentNode.removeChild(element);"); + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Deckard", + true /* expect_known_success */, + SubmissionSource::XHR_SUCCEEDED); +} + +// Tests that completing an Ajax request but leaving a form visible will not +// trigger submission from Autofill's point of view. +TEST_P(FormAutocompleteSubmissionTest, AjaxSucceeded_StillVisible) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='http://example.com/blade.php'>" + "<input name='fname' id='fname' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form></html>"); + + // Simulate user input so that the form is "remembered". + WebDocument document = GetMainFrame()->GetDocument(); + WebElement element = document.GetElementById(WebString::FromUTF8("fname")); + ASSERT_FALSE(element.IsNull()); + WebInputElement fname_element = element.To<WebInputElement>(); + SimulateUserInputChangeForElement(&fname_element, std::string("Rick")); + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + // No submission messages sent. + VerifyNoSubmitMessagesReceived(fake_driver_); +} + +// Tests that completing an Ajax request without any prior form interaction +// does not trigger form submission from Autofill's point of view. +TEST_P(FormAutocompleteSubmissionTest, + AjaxSucceeded_NoFormInteractionInvisible) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='http://example.com/blade.php'>" + "<input name='fname' id='fname' value='Bob'/>" + "<input name='lname' value='Deckard'/><input type=submit></form></html>"); + + // No form interaction. + + // Simulate removing the form just before the ajax request completes. + ExecuteJavaScriptForTests( + "var element = document.getElementById('myForm');" + "element.parentNode.removeChild(element);"); + + // Simulate an Ajax request completing without prior user interaction. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + // No submission messages sent. + VerifyNoSubmitMessagesReceived(fake_driver_); +} + +// Tests that completing an Ajax request after having autofilled a form, +// with the form disappearing, will trigger submission from Autofill's +// point of view. +TEST_P(FormAutocompleteSubmissionTest, AjaxSucceeded_FilledFormIsInvisible) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='http://example.com/blade.php'>" + "<input name='fname' id='fname'/>" + "<input name='lname'/></form></html>"); + + // Simulate filling a form using Autofill. + SimulateFillForm(autofill_agent_, GetMainFrame()); + + // Simulate user input since ajax request doesn't fire submission message + // if there is no user input. + SimulateUserInput(WebString::FromUTF8("fname"), std::string("Rick")); + + // Simulate removing the form just before the ajax request completes. + ExecuteJavaScriptForTests( + "var element = document.getElementById('myForm');" + "element.parentNode.removeChild(element);"); + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Rick", "Smith", + true /* expect_known_success */, + SubmissionSource::XHR_SUCCEEDED); +} + +// Tests that completing an Ajax request after having autofilled a form, +// without the form disappearing, will not trigger submission from Autofill's +// point of view. +TEST_P(FormAutocompleteSubmissionTest, AjaxSucceeded_FilledFormStillVisible) { + // Load a form. + LoadHTML( + "<html><form id='myForm' action='http://example.com/blade.php'>" + "<input name='fname' id='fname' value='Rick'/>" + "<input name='lname' value='Deckard'/></form></html>"); + + // Simulate filling a form using Autofill. + SimulateFillForm(autofill_agent_, GetMainFrame()); + + // Form still visible. + + // Simulate an Ajax request completing. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + // No submission messages sent. + VerifyNoSubmitMessagesReceived(fake_driver_); +} + +// Tests that completing an Ajax request without a form present will still +// trigger submission, if all the inputs the user has modified disappear. +TEST_P(FormAutocompleteSubmissionTest, AjaxSucceeded_FormlessElements) { + // Load a "form." Note that kRequiredFieldsForUpload fields are required + // for the formless logic to trigger, so we add a throwaway third field. + LoadHTML( + "<head><title>Checkout</title></head>" + "<input type='text' name='fname' id='fname'/>" + "<input type='text' name='lname' value='Puckett'/>" + "<input type='number' name='number' value='34'/>"); + + // Simulate user input. + WebDocument document = GetMainFrame()->GetDocument(); + WebElement element = document.GetElementById(WebString::FromUTF8("fname")); + ASSERT_FALSE(element.IsNull()); + WebInputElement fname_element = element.To<WebInputElement>(); + SimulateUserInputChangeForElement(&fname_element, std::string("Kirby")); + + // Remove element from view. + ExecuteJavaScriptForTests( + "var element = document.getElementById('fname');" + "element.style.display = 'none';"); + + // Simulate AJAX request. + static_cast<blink::WebAutofillClient*>(autofill_agent_)->AjaxSucceeded(); + base::RunLoop().RunUntilIdle(); + + VerifyReceivedRendererMessages(fake_driver_, "Kirby", "Puckett", + true /* expect_known_success */, + SubmissionSource::XHR_SUCCEEDED); +} + // Tests that submitting a form that has autocomplete="off" generates // WillSubmitForm and FormSubmitted messages. -TEST_F(FormAutocompleteTest, AutoCompleteOffFormSubmit) { +TEST_P(FormAutocompleteSubmissionTest, AutoCompleteOffFormSubmit) { // Load a form. LoadHTML( "<html><form id='myForm' autocomplete='off' action='about:blank'>" @@ -1003,7 +1060,7 @@ } // Tests that fields with autocomplete off are submitted. -TEST_F(FormAutocompleteTest, AutoCompleteOffInputSubmit) { +TEST_P(FormAutocompleteSubmissionTest, AutoCompleteOffInputSubmit) { // Load a form. LoadHTML( "<html><form id='myForm' action='about:blank'>" @@ -1023,7 +1080,7 @@ // Tests that submitting a form that has been dynamically set as autocomplete // off generates WillSubmitForm and FormSubmitted messages. // Note: We previously did the opposite, for bug http://crbug.com/36520 -TEST_F(FormAutocompleteTest, DynamicAutoCompleteOffFormSubmit) { +TEST_P(FormAutocompleteSubmissionTest, DynamicAutoCompleteOffFormSubmit) { LoadHTML( "<html><form id='myForm' action='about:blank'>" "<input name='fname' value='Rick'/>" @@ -1051,7 +1108,7 @@ SubmissionSource::FORM_SUBMISSION); } -TEST_F(FormAutocompleteTest, FormSubmittedByDOMMutationAfterXHR) { +TEST_P(FormAutocompleteSubmissionTest, FormSubmittedByDOMMutationAfterXHR) { LoadHTML( "<html>" "<input type='text' id='address_field' name='address' autocomplete='on'>" @@ -1075,7 +1132,7 @@ SubmissionSource::XHR_SUCCEEDED); } -TEST_F(FormAutocompleteTest, FormSubmittedBySameDocumentNavigation) { +TEST_P(FormAutocompleteSubmissionTest, FormSubmittedBySameDocumentNavigation) { LoadHTML( "<html>" "<input type='text' id='address_field' name='address' autocomplete='on'>" @@ -1100,7 +1157,7 @@ SubmissionSource::SAME_DOCUMENT_NAVIGATION); } -TEST_F(FormAutocompleteTest, FormSubmittedByProbablyFormSubmitted) { +TEST_P(FormAutocompleteSubmissionTest, FormSubmittedByProbablyFormSubmitted) { base::test::ScopedFeatureList scoped_features; scoped_features.InitAndDisableFeature( features::kAutofillProbableFormSubmissionInBrowser); @@ -1130,33 +1187,6 @@ SubmissionSource::PROBABLY_FORM_SUBMITTED); } -TEST_F(FormAutocompleteTest, SelectControlChanged) { - LoadHTML( - "<html>" - "<form>" - "<select id='color'><option value='red'>red</option><option " - "value='blue'>blue</option></select>" - "</form>" - "</html>"); - - std::string change_value = - "var color = document.getElementById('color');" - "color.selectedIndex = 1;"; - - ExecuteJavaScriptForTests(change_value.c_str()); - WebElement element = - GetMainFrame()->GetDocument().GetElementById(blink::WebString("color")); - static_cast<blink::WebAutofillClient*>(autofill_agent_) - ->SelectControlDidChange( - *reinterpret_cast<blink::WebFormControlElement*>(&element)); - base::RunLoop().RunUntilIdle(); - - const FormFieldData* field = fake_driver_.select_control_changed(); - ASSERT_TRUE(field); - EXPECT_EQ(u"color", field->name); - EXPECT_EQ(u"blue", field->value); -} - } // namespace } // namespace autofill
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h index 3b7da0f6..e2a7a8d 100644 --- a/chrome/test/base/in_process_browser_test.h +++ b/chrome/test/base/in_process_browser_test.h
@@ -80,9 +80,9 @@ // . Your test method is invoked on the ui thread. If you need to block until // state changes you'll need to run the message loop from your test method. // For example, if you need to wait till a find bar has completely been shown -// you'll need to invoke content::RunMessageLoop(). When the message bar is -// shown, invoke RunLoop::QuitCurrentWhenIdleDeprecated() to return control -// back to your test method. +// you'll need to create a base::RunLoop and call it's Run() method. When the +// message bar is shown, invoke loop.QuitWhenIdle()/loop.QuitWhenIdleClosure() +// to return control back to your test method. // . If you subclass and override SetUp(), be sure and invoke // InProcessBrowserTest::SetUp(). (But see also BrowserTestBase's // SetUpOnMainThread(), SetUpInProcessBrowserTestFixture(), and other related
diff --git a/chrome/test/data/webui/search_engine_choice/OWNERS b/chrome/test/data/webui/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/chrome/test/data/webui/search_engine_choice/OWNERS +++ b/chrome/test/data/webui/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_app_permission_row_test.ts b/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_app_permission_row_test.ts index 93f008b..404c5f1 100644 --- a/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_app_permission_row_test.ts +++ b/chrome/test/data/webui/settings/chromeos/os_privacy_page/privacy_hub_app_permission_row_test.ts
@@ -11,7 +11,8 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals, assertFalse, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; +import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; import {FakeMetricsPrivate} from '../fake_metrics_private.js'; @@ -121,24 +122,14 @@ } }); - test('Clicking on the toggle triggers permission update', async () => { - assertEquals( - 0, - metrics.countMetricValue( - 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', - PrivacyHubSensorSubpageUserAction.APP_PERMISSION_CHANGED)); + test('Type of permission changed is correct', async () => { assertEquals( PermissionType.kUnknown, fakeHandler.getLastUpdatedPermission().permissionType); - getPermissionToggle().click(); + testRow.click(); await fakeHandler.whenCalled('setPermission'); - assertEquals( - 1, - metrics.countMetricValue( - 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', - PrivacyHubSensorSubpageUserAction.APP_PERMISSION_CHANGED)); const updatedPermission = fakeHandler.getLastUpdatedPermission(); assertEquals( permissionType, PermissionType[updatedPermission.permissionType]); @@ -146,33 +137,40 @@ assertEquals(TriState.kAllow, updatedPermission.value.tristateValue); }); + function getPermissionChangeCount(): number { + return metrics.countMetricValue( + 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', + PrivacyHubSensorSubpageUserAction.APP_PERMISSION_CHANGED); + } + + test('Clicking on the toggle button triggers permission change', async () => { + assertEquals(0, getPermissionChangeCount()); + + getPermissionToggle().click(); + await fakeHandler.whenCalled('setPermission'); + + assertEquals(1, getPermissionChangeCount()); + }); + + test('Clicking anywhere on the row triggers permission change', async () => { + assertEquals(0, getPermissionChangeCount()); + + testRow.click(); + await fakeHandler.whenCalled('setPermission'); + + assertEquals(1, getPermissionChangeCount()); + }); + test( - 'Pressing Enter when toggle selected triggers permission update', + 'Pressing Enter when toggle button selected triggers permission change', async () => { - assertEquals( - 0, - metrics.countMetricValue( - 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', - PrivacyHubSensorSubpageUserAction.APP_PERMISSION_CHANGED)); - assertEquals( - PermissionType.kUnknown, - fakeHandler.getLastUpdatedPermission().permissionType); + assertEquals(0, getPermissionChangeCount()); getPermissionToggle().dispatchEvent( new KeyboardEvent('keydown', {key: 'Enter'})); - await fakeHandler.whenCalled('setPermission'); - assertEquals( - 1, - metrics.countMetricValue( - 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', - PrivacyHubSensorSubpageUserAction.APP_PERMISSION_CHANGED)); - const updatedPermission = fakeHandler.getLastUpdatedPermission(); - assertEquals( - permissionType, PermissionType[updatedPermission.permissionType]); - assertTrue(isTriStateValue(updatedPermission.value)); - assertEquals(TriState.kAllow, updatedPermission.value.tristateValue); + assertEquals(1, getPermissionChangeCount()); }); function isPermissionManaged(): boolean { @@ -181,6 +179,7 @@ return permission.isManaged; } + test('Managed icon displayed when permission is managed', () => { assertFalse(isPermissionManaged()); assertNull(testRow.shadowRoot!.querySelector('cr-policy-indicator')); @@ -197,12 +196,30 @@ assertTrue(getPermissionToggle().disabled); }); + test('Clicking on the row is no-op when permission is managed', async () => { + assertFalse(isPermissionManaged()); + + // Toggle managed state. + testRow.set( + 'app.permissions.' + PermissionType[permissionType] + '.isManaged', + true); + flush(); + + assertTrue(isPermissionManaged()); + assertEquals(0, getPermissionChangeCount()); + + testRow.click(); + await flushTasks(); + + assertEquals(0, getPermissionChangeCount()); + }); + function getAndroidSettingsLinkButton(): CrIconButtonElement|null { return testRow.shadowRoot!.querySelector('cr-icon-button'); } test('Link to android settings displayed', async () => { - assertNull(getAndroidSettingsLinkButton()); + assertFalse(isVisible(getAndroidSettingsLinkButton())); loadTimeData.overrideValues({ isArcReadOnlyPermissionsEnabled: true, @@ -210,15 +227,23 @@ testRow.set('app.type', AppType.kArc); flush(); + assertTrue(isVisible(getAndroidSettingsLinkButton())); + }); + + test('Android settings link click metric recorded', async () => { + loadTimeData.overrideValues({ + isArcReadOnlyPermissionsEnabled: true, + }); + testRow.set('app.type', AppType.kArc); + flush(); + assertEquals( 0, metrics.countMetricValue( 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', PrivacyHubSensorSubpageUserAction.ANDROID_SETTINGS_LINK_CLICKED)); - const linkButton = getAndroidSettingsLinkButton(); - assertTrue(!!linkButton); - linkButton.click(); + testRow.click(); await fakeHandler.whenCalled('openNativeSettings'); assertEquals( @@ -226,6 +251,38 @@ metrics.countMetricValue( 'ChromeOS.PrivacyHub.MicrophoneSubpage.UserAction', PrivacyHubSensorSubpageUserAction.ANDROID_SETTINGS_LINK_CLICKED)); + }); + + test( + 'Clicking the android settings link opens android settings', async () => { + loadTimeData.overrideValues({ + isArcReadOnlyPermissionsEnabled: true, + }); + testRow.set('app.type', AppType.kArc); + flush(); + + assertEquals(0, fakeHandler.getNativeSettingsOpenedCount()); + + const linkButton = getAndroidSettingsLinkButton(); + assertTrue(!!linkButton); + linkButton.click(); + await fakeHandler.whenCalled('openNativeSettings'); + + assertEquals(1, fakeHandler.getNativeSettingsOpenedCount()); + }); + + test('Clicking anywhere on the row opens android settings', async () => { + loadTimeData.overrideValues({ + isArcReadOnlyPermissionsEnabled: true, + }); + testRow.set('app.type', AppType.kArc); + flush(); + + assertEquals(0, fakeHandler.getNativeSettingsOpenedCount()); + + testRow.click(); + await fakeHandler.whenCalled('openNativeSettings'); + assertEquals(1, fakeHandler.getNativeSettingsOpenedCount()); }); });
diff --git a/chrome/updater/lock_linux.cc b/chrome/updater/lock_linux.cc index 3b11d1c0..3422b10 100644 --- a/chrome/updater/lock_linux.cc +++ b/chrome/updater/lock_linux.cc
@@ -49,9 +49,8 @@ ScopedLockImpl(pthread_mutex_t* mutex, int shm_fd) : mutex_(mutex), shm_fd_(shm_fd) {} - // This field is not a raw_ptr<> because it always points to a mmap'd - // region of memory outside of the PA heap. Thus, there would be overhead - // involved with using a raw_ptr<> but no safety gains. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION pthread_mutex_t* mutex_; int shm_fd_; };
diff --git a/chrome/updater/tag.cc b/chrome/updater/tag.cc index 553ff23..8ca50d4 100644 --- a/chrome/updater/tag.cc +++ b/chrome/updater/tag.cc
@@ -78,12 +78,20 @@ // Indicates which browser to restart on successful install. constexpr base::StringPiece kTagArgBrowserType = "browser"; +// Runtime Mode: "runtime" argument in the tag tells the updater to install +// itself and stay on the system without any associated application for at least +// `kMaxServerStartsBeforeFirstReg` wakes. This feature is used to expose the +// COM API to a process that will install applications via that API. +// Example: +// "runtime=true&needsadmin=true" +constexpr base::StringPiece kTagArgRuntimeMode = "runtime"; + // The list of arguments that are needed for a meta-installer, to // indicate which application is being installed. These are stamped // inside the meta-installer binary. constexpr base::StringPiece kTagArgAppId = "appguid"; constexpr base::StringPiece kAppArgAppName = "appname"; -constexpr base::StringPiece kAppArgNeedsAdmin = "needsadmin"; +constexpr base::StringPiece kTagArgNeedsAdmin = "needsadmin"; constexpr base::StringPiece kAppArgInstallDataIndex = "installdataindex"; constexpr base::StringPiece kAppArgUntrustedData = "untrusteddata"; @@ -101,17 +109,17 @@ constexpr uint8_t kTagMagicUtf8[] = {'G', 'a', 'c', 't', '2', '.', '0', 'O', 'm', 'a', 'h', 'a'}; -std::optional<AppArgs::NeedsAdmin> ParseNeedsAdminEnum(base::StringPiece str) { +std::optional<NeedsAdmin> ParseNeedsAdminEnum(base::StringPiece str) { if (base::EqualsCaseInsensitiveASCII("false", str)) { - return AppArgs::NeedsAdmin::kNo; + return NeedsAdmin::kNo; } if (base::EqualsCaseInsensitiveASCII("true", str)) { - return AppArgs::NeedsAdmin::kYes; + return NeedsAdmin::kYes; } if (base::EqualsCaseInsensitiveASCII("prefers", str)) { - return AppArgs::NeedsAdmin::kPrefers; + return NeedsAdmin::kPrefers; } return std::nullopt; @@ -245,6 +253,17 @@ return ErrorCode::kSuccess; } +ErrorCode ParseRuntimeMode(base::StringPiece value, TagArgs* args) { + for (const std::string expected_value : {"true", "persist", "false"}) { + if (base::EqualsCaseInsensitiveASCII(expected_value, value)) { + args->runtime_mode = RuntimeModeArgs(); + return ErrorCode::kSuccess; + } + } + + return ErrorCode::kGlobal_RuntimeModeValueIsInvalid; +} + // |value| must not be empty. // |args| must not be null. using ParseGlobalAttributeFunPtr = ErrorCode (*)(base::StringPiece value, @@ -267,6 +286,7 @@ {kTagArgFlighting, &ParseFlighting}, {kTagArgUsageStats, &ParseUsageStats}, {kTagArgAppId, &ParseAppId}, + {kTagArgRuntimeMode, &ParseRuntimeMode}, }}; return *instance; } @@ -334,7 +354,7 @@ {kAppArgAdditionalParameters, &ParseAdditionalParameters}, {kAppArgExperimentLabels, &ParseExperimentLabels}, {kAppArgAppName, &ParseAppName}, - {kAppArgNeedsAdmin, &ParseNeedsAdmin}, + {kTagArgNeedsAdmin, &ParseNeedsAdmin}, {kAppArgInstallDataIndex, &ParseInstallDataIndex}, {kAppArgUntrustedData, &ParseUntrustedData}, }}; @@ -343,6 +363,36 @@ } // namespace app_attributes +namespace runtime_mode_attributes { + +ErrorCode ParseNeedsAdmin(base::StringPiece value, RuntimeModeArgs* args) { + const auto needs_admin = ParseNeedsAdminEnum(value); + if (!needs_admin.has_value()) { + return ErrorCode::kRuntimeMode_NeedsAdminValueIsInvalid; + } + + args->needs_admin = needs_admin.value(); + return ErrorCode::kSuccess; +} + +// |value| must not be empty. +// |args| must not be null. +using ParseRuntimeModeAttributeFunPtr = ErrorCode (*)(base::StringPiece value, + RuntimeModeArgs* args); + +using RuntimeModeParseTable = std::map<base::StringPiece, + ParseRuntimeModeAttributeFunPtr, + CaseInsensitiveASCIICompare>; + +const RuntimeModeParseTable& GetTable() { + static const base::NoDestructor<RuntimeModeParseTable> instance{{ + {kTagArgNeedsAdmin, &ParseNeedsAdmin}, + }}; + return *instance; +} + +} // namespace runtime_mode_attributes + namespace installer_data_attributes { // Search for the given appid specified by |value| in |args->apps| and write its @@ -456,6 +506,8 @@ ErrorCode ParseTag(base::StringPiece tag, TagArgs* args) { const auto& global_func_lookup_table = global_attributes::GetTable(); const auto& app_func_lookup_table = app_attributes::GetTable(); + const auto& runtime_mode_func_lookup_table = + runtime_mode_attributes::GetTable(); const std::vector<std::pair<std::string, std::string>> attributes = query_string::Split(tag); @@ -473,6 +525,18 @@ if (result != ErrorCode::kSuccess) { return result; } + } else if ((runtime_mode_func_lookup_table.find(name) != + runtime_mode_func_lookup_table.end()) && + args->runtime_mode) { + if (value.empty()) { + return ErrorCode::kAttributeMustHaveValue; + } + + const ErrorCode result = + runtime_mode_func_lookup_table.at(name)(value, &*args->runtime_mode); + if (result != ErrorCode::kSuccess) { + return result; + } } else if (app_func_lookup_table.find(name) != app_func_lookup_table.end()) { if (args->apps.empty()) { @@ -717,18 +781,21 @@ return os << "ErrorCode::kGlobal_FlightingValueIsNotABoolean"; case ErrorCode::kGlobal_UsageStatsValueIsInvalid: return os << "ErrorCode::kGlobal_UsageStatsValueIsInvalid"; + case ErrorCode::kGlobal_RuntimeModeValueIsInvalid: + return os << "ErrorCode::kGlobal_RuntimeModeValueIsInvalid"; + case ErrorCode::kRuntimeMode_NeedsAdminValueIsInvalid: + return os << "ErrorCode::kRuntimeMode_NeedsAdminValueIsInvalid"; } } -std::ostream& operator<<(std::ostream& os, - const AppArgs::NeedsAdmin& needs_admin) { +std::ostream& operator<<(std::ostream& os, const NeedsAdmin& needs_admin) { switch (needs_admin) { - case AppArgs::NeedsAdmin::kNo: - return os << "AppArgs::NeedsAdmin::kNo"; - case AppArgs::NeedsAdmin::kYes: - return os << "AppArgs::NeedsAdmin::kYes"; - case AppArgs::NeedsAdmin::kPrefers: - return os << "AppArgs::NeedsAdmin::kPrefers"; + case NeedsAdmin::kNo: + return os << "NeedsAdmin::kNo"; + case NeedsAdmin::kYes: + return os << "NeedsAdmin::kYes"; + case NeedsAdmin::kPrefers: + return os << "NeedsAdmin::kPrefers"; } }
diff --git a/chrome/updater/tag.h b/chrome/updater/tag.h index 2fd589d..d7c5eca0 100644 --- a/chrome/updater/tag.h +++ b/chrome/updater/tag.h
@@ -33,6 +33,17 @@ } // namespace internal +// Represents application requirements for admin. +enum class NeedsAdmin { + // The application will install per user. + kNo = 0, + // The application will install machine-wide. + kYes, + // The application will install machine-wide if permissions allow, else will + // install per-user. + kPrefers, +}; + // This struct contains the attributes for a given app parsed from a part of the // metainstaller tag. It contains minimal policy and is intended to be a // near-direct mapping from tag to memory. See TagArgs, which stores a list of @@ -41,17 +52,6 @@ // An empty string in std::string members indicates that the given attribute did // not appear in the tag for this app. struct AppArgs { - // Represents application requirements for admin. - enum class NeedsAdmin { - // The application will install per user. - kNo = 0, - // The application will install machine-wide. - kYes, - // The application will install machine-wide if permissions allow, else will - // install per-user. - kPrefers, - }; - // |app_id| must not be empty and will be made lowercase. explicit AppArgs(base::StringPiece app_id); @@ -72,7 +72,12 @@ std::optional<NeedsAdmin> needs_admin; }; -std::ostream& operator<<(std::ostream&, const AppArgs::NeedsAdmin&); +std::ostream& operator<<(std::ostream&, const NeedsAdmin&); + +// This struct contains the "runtime mode" parsed from the metainstaller tag. +struct RuntimeModeArgs { + std::optional<NeedsAdmin> needs_admin; +}; // This struct contains the attributes parsed from a metainstaller tag. An empty // string in std::string members indicates that the given attribute did not @@ -112,6 +117,10 @@ // List of apps to install. std::vector<AppArgs> apps; + // This member is present if the "runtime mode" was provided on the command + // line. + std::optional<RuntimeModeArgs> runtime_mode; + // The original tag string. std::string tag_string; @@ -176,6 +185,14 @@ // Note: A value of 2 is considered the same as not specifying the usage // stats. kGlobal_UsageStatsValueIsInvalid, + + // The runtime value must be "true", "persist", or "false". The values + // "persist" and "false" are only for backward compatibility in case someone + // uses it as an oversight, and are treated the same as "true". + kGlobal_RuntimeModeValueIsInvalid, + + // The needsadmin value must be "yes", "no", or "prefers". + kRuntimeMode_NeedsAdminValueIsInvalid, }; std::ostream& operator<<(std::ostream&, const ErrorCode&);
diff --git a/chrome/updater/tag_unittest.cc b/chrome/updater/tag_unittest.cc index ad200dd..411ece3 100644 --- a/chrome/updater/tag_unittest.cc +++ b/chrome/updater/tag_unittest.cc
@@ -21,6 +21,8 @@ using updater::tagging::AppArgs; using updater::tagging::ErrorCode; +using updater::tagging::NeedsAdmin; +using updater::tagging::RuntimeModeArgs; using updater::tagging::TagArgs; // Builder pattern helper to construct the TagArgs struct. @@ -72,6 +74,10 @@ this->inner_.apps.push_back(std::move(app)); return *this; } + TagArgsBuilder& WithRuntimeMode(RuntimeModeArgs runtime_mode) { + this->inner_.runtime_mode = runtime_mode; + return *this; + } private: TagArgs inner_; @@ -88,7 +94,7 @@ this->inner_.app_name = app_name; return *this; } - AppArgsBuilder& WithNeedsAdmin(AppArgs::NeedsAdmin needs_admin) { + AppArgsBuilder& WithNeedsAdmin(NeedsAdmin needs_admin) { this->inner_.needs_admin = needs_admin; return *this; } @@ -118,6 +124,22 @@ AppArgs inner_; }; +// Builder pattern helper to construct the RuntimeModeArgs struct. +class RuntimeModeArgsBuilder { + public: + RuntimeModeArgsBuilder() = default; + + RuntimeModeArgs Build() { return std::move(inner_); } + + RuntimeModeArgsBuilder& WithNeedsAdmin(NeedsAdmin needs_admin) { + this->inner_.needs_admin = needs_admin; + return *this; + } + + private: + RuntimeModeArgs inner_; +}; + void VerifyTagParseSuccess( base::StringPiece tag, std::optional<base::StringPiece> app_installer_data_args, @@ -296,6 +318,11 @@ .Build()); } +TEST(TagParserTest, NoRuntimeModeOrAppOnlyNeedsAdminValue) { + VerifyTagParseFail("needsadmin=true", std::nullopt, + ErrorCode::kApp_AppIdNotSpecified); +} + TEST(TagParserTest, NeedsAdminInvalid) { VerifyTagParseFail( "appguid=8617EE50-F91C-4DC1-B937-0969EEF59B0B&" @@ -317,7 +344,7 @@ std::nullopt, TagArgsBuilder() .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kYes) + .WithNeedsAdmin(NeedsAdmin::kYes) .Build()) .Build()); } @@ -329,7 +356,7 @@ std::nullopt, TagArgsBuilder() .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kYes) + .WithNeedsAdmin(NeedsAdmin::kYes) .Build()) .Build()); } @@ -341,7 +368,7 @@ std::nullopt, TagArgsBuilder() .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kNo) + .WithNeedsAdmin(NeedsAdmin::kNo) .Build()) .Build()); } @@ -353,7 +380,7 @@ std::nullopt, TagArgsBuilder() .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kNo) + .WithNeedsAdmin(NeedsAdmin::kNo) .Build()) .Build()); } @@ -1105,7 +1132,7 @@ .WithUsageStatsEnable(false) .WithApp(AppArgsBuilder("8617ee50-f91c-4dc1-b937-0969eef59b0b") .WithAppName("TestApp") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kNo) + .WithNeedsAdmin(NeedsAdmin::kNo) .WithAp("test_ap") .WithEncodedInstallerData("installerdata_app1") .WithExperimentLabels("_experiment_a") @@ -1113,7 +1140,7 @@ .Build()) .WithApp(AppArgsBuilder("5e46de36-737d-4271-91c1-c062f9fe21d9") .WithAppName("TestApp2") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kYes) + .WithNeedsAdmin(NeedsAdmin::kYes) .WithAp("test_ap2") .WithExperimentLabels("_experiment_b") .WithUntrustedData("X=5") @@ -1121,11 +1148,58 @@ .WithApp(AppArgsBuilder("5f46de36-737d-4271-91c1-c062f9fe21d9") .WithAppName("TestApp3") .WithEncodedInstallerData("installerdata_app3") - .WithNeedsAdmin(AppArgs::NeedsAdmin::kPrefers) + .WithNeedsAdmin(NeedsAdmin::kPrefers) .Build()) .Build()); } +TEST(TagParserTest, RuntimeModeBeforeApp) { + VerifyTagParseFail( + "runtime=true&appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&" + "appname1=Hello", + std::nullopt, ErrorCode::kUnrecognizedName); +} + +TEST(TagParserTest, RuntimeModeAfterApp) { + VerifyTagParseFail( + "appguid=D0324988-DA8A-49e5-BCE5-925FCD04EAB7&appname1=Hello&runtime=" + "true", + std::nullopt, ErrorCode::kUnrecognizedName); +} + +TEST(TagParserTest, RuntimeModeIncorrectValue) { + VerifyTagParseFail("runtime=foo", std::nullopt, + ErrorCode::kGlobal_RuntimeModeValueIsInvalid); +} + +TEST(TagParserTest, RuntimeModeIncorrectNeedsAdminValue) { + VerifyTagParseFail("runtime=true&needsadmin=foo", std::nullopt, + ErrorCode::kRuntimeMode_NeedsAdminValueIsInvalid); +} + +TEST(TagParserTest, RuntimeModeValid) { + VerifyTagParseSuccess("runtime=true", std::nullopt, + TagArgsBuilder() + .WithRuntimeMode(RuntimeModeArgsBuilder().Build()) + .Build()); +} + +TEST(TagParserTest, RuntimeModeValidSystem) { + VerifyTagParseSuccess( + "runtime=true&needsadmin=true", std::nullopt, + TagArgsBuilder() + .WithRuntimeMode( + RuntimeModeArgsBuilder().WithNeedsAdmin(NeedsAdmin::kYes).Build()) + .Build()); +} + +TEST(TagParserTest, RuntimeModeValidUser) { + VerifyTagParseSuccess("runtime=true&needsadmin=false", std::nullopt, + TagArgsBuilder() + .WithRuntimeMode(RuntimeModeArgsBuilder().Build()) + .Build()); +} + TEST(TagExtractorTest, AdvanceIt) { const std::vector<uint8_t> empty_binary; ASSERT_TRUE(tagging::internal::AdvanceIt(empty_binary.begin(), 0, @@ -1286,7 +1360,7 @@ tagging::AppArgs app_args("{8A69D345-D564-463C-AFF1-A69D9E530F96}"); app_args.app_name = "Google Chrome"; app_args.install_data_index = "defaultbrowser"; - app_args.needs_admin = tagging::AppArgs::NeedsAdmin::kPrefers; + app_args.needs_admin = tagging::NeedsAdmin::kPrefers; tag_args.apps = {app_args}; return tag_args; @@ -1301,7 +1375,7 @@ tagging::AppArgs app_args("{8237E44A-0054-442C-B6B6-EA0509993955}"); app_args.app_name = "Google Chrome Beta"; - app_args.needs_admin = tagging::AppArgs::NeedsAdmin::kYes; + app_args.needs_admin = tagging::NeedsAdmin::kYes; tag_args.apps = {app_args}; return tag_args;
diff --git a/chrome/updater/updater_scope.cc b/chrome/updater/updater_scope.cc index a34d43b..708bb67c 100644 --- a/chrome/updater/updater_scope.cc +++ b/chrome/updater/updater_scope.cc
@@ -26,14 +26,26 @@ } // namespace +std::optional<tagging::NeedsAdmin> NeedsAdminFromTagArgs( + const std::optional<tagging::TagArgs> tag_args) { + if (!tag_args) { + return {}; + } + if (!tag_args->apps.empty()) { + return tag_args->apps.front().needs_admin; + } + if (tag_args->runtime_mode) { + return tag_args->runtime_mode->needs_admin; + } + + return {}; +} + bool IsPrefersForCommandLine(const base::CommandLine& command_line) { #if BUILDFLAG(IS_WIN) - const std::optional<tagging::TagArgs> tag_args = - GetTagArgsForCommandLine(command_line).tag_args; - return tag_args && !tag_args->apps.empty() && - tag_args->apps.front().needs_admin && - *tag_args->apps.front().needs_admin == - tagging::AppArgs::NeedsAdmin::kPrefers; + std::optional<tagging::NeedsAdmin> needs_admin = + NeedsAdminFromTagArgs(GetTagArgsForCommandLine(command_line).tag_args); + return needs_admin ? *needs_admin == tagging::NeedsAdmin::kPrefers : false; #else return false; #endif @@ -47,16 +59,15 @@ } // Assume only one app is present since bundles are not supported. - const std::optional<tagging::TagArgs> tag_args = - GetTagArgsForCommandLine(command_line).tag_args; - if (tag_args && !tag_args->apps.empty() && - tag_args->apps.front().needs_admin) { - switch (*tag_args->apps.front().needs_admin) { - case tagging::AppArgs::NeedsAdmin::kYes: + std::optional<tagging::NeedsAdmin> needs_admin = + NeedsAdminFromTagArgs(GetTagArgsForCommandLine(command_line).tag_args); + if (needs_admin) { + switch (*needs_admin) { + case tagging::NeedsAdmin::kYes: return UpdaterScope::kSystem; - case tagging::AppArgs::NeedsAdmin::kNo: + case tagging::NeedsAdmin::kNo: return UpdaterScope::kUser; - case tagging::AppArgs::NeedsAdmin::kPrefers: + case tagging::NeedsAdmin::kPrefers: return command_line.HasSwitch(kCmdLinePrefersUser) ? UpdaterScope::kUser : UpdaterScope::kSystem;
diff --git a/chrome/updater/updater_scope_unittest.cc b/chrome/updater/updater_scope_unittest.cc index 0bfee71b..d194af0 100644 --- a/chrome/updater/updater_scope_unittest.cc +++ b/chrome/updater/updater_scope_unittest.cc
@@ -68,6 +68,21 @@ EXPECT_TRUE(IsPrefersForCommandLine(command_line_)); } +TEST_F(GetUpdaterScopeForCommandLineTest, TagRuntime) { + command_line_.AppendSwitchASCII(kTagSwitch, "runtime=true"); + EXPECT_EQ(GetUpdaterScopeForCommandLine(command_line_), UpdaterScope::kUser); +} + +TEST_F(GetUpdaterScopeForCommandLineTest, TagRuntimeUser) { + command_line_.AppendSwitchASCII(kTagSwitch, "runtime=true&needsadmin=false&"); + EXPECT_EQ(GetUpdaterScopeForCommandLine(command_line_), UpdaterScope::kUser); +} + +TEST_F(GetUpdaterScopeForCommandLineTest, TagRuntimeSystem) { + command_line_.AppendSwitchASCII(kTagSwitch, "runtime=true&needsadmin=true&"); + EXPECT_EQ(GetUpdaterScopeForCommandLine(command_line_), + UpdaterScope::kSystem); +} #endif } // namespace updater
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 363f06f..7e43027 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -15755.0.0 \ No newline at end of file +15756.0.0 \ No newline at end of file
diff --git a/chromeos/ash/components/chaps_util/BUILD.gn b/chromeos/ash/components/chaps_util/BUILD.gn index a51bcc58..48345ac52 100644 --- a/chromeos/ash/components/chaps_util/BUILD.gn +++ b/chromeos/ash/components/chaps_util/BUILD.gn
@@ -16,12 +16,6 @@ "chaps_util.h", "chaps_util_impl.cc", "chaps_util_impl.h", - "key_helper.cc", - "key_helper.h", - "pkcs12_reader.cc", - "pkcs12_reader.h", - "pkcs12_validator.cc", - "pkcs12_validator.h", ] deps = [ @@ -56,11 +50,7 @@ source_set("unit_tests") { testonly = true - sources = [ - "chaps_util_impl_unittest.cc", - "key_helper_unittest.cc", - "pkcs12_reader_unittest.cc", - ] + sources = [ "chaps_util_impl_unittest.cc" ] deps = [ ":chaps_util",
diff --git a/chromeos/ash/components/chaps_util/chaps_slot_session.h b/chromeos/ash/components/chaps_util/chaps_slot_session.h index dd84d86..9229318 100644 --- a/chromeos/ash/components/chaps_util/chaps_slot_session.h +++ b/chromeos/ash/components/chaps_util/chaps_slot_session.h
@@ -9,6 +9,8 @@ #include <memory> +#include "base/component_export.h" + namespace chromeos { // A PKCS#11 session for a slot provided by the chaps daemon. @@ -74,7 +76,8 @@ // This is the default implementation of the ChapsSlotSessionFactory. // Creates ChapsSlotSession instances which call functions in libchaps.so. -class ChapsSlotSessionFactoryImpl : public ChapsSlotSessionFactory { +class COMPONENT_EXPORT(CHAPS_UTIL) ChapsSlotSessionFactoryImpl + : public ChapsSlotSessionFactory { public: ChapsSlotSessionFactoryImpl() = default; ~ChapsSlotSessionFactoryImpl() override = default;
diff --git a/chromeos/ash/components/chaps_util/chaps_util.h b/chromeos/ash/components/chaps_util/chaps_util.h index 9e857058..67051ed 100644 --- a/chromeos/ash/components/chaps_util/chaps_util.h +++ b/chromeos/ash/components/chaps_util/chaps_util.h
@@ -38,17 +38,6 @@ crypto::ScopedSECKEYPublicKey* out_public_key, crypto::ScopedSECKEYPrivateKey* out_private_key) = 0; - // Import key and all included certificates from PKCS12 container. - // Imported objects will be stored in Chaps. - // If some of certificates can not be imported they will be skipped and - // Pkcs12ReaderStatusCode::kFailureDuringCertImport error will be logged. - // `is_software_backed` specifies whether a hardware-backed or software-backed - // storage is used. Keys cannot be extracted from the hardware-backed storage. - virtual bool ImportPkcs12Certificate(PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - bool is_software_backed) = 0; - using FactoryCallback = base::RepeatingCallback<std::unique_ptr<ChapsUtil>()>; // Sets the factory which ChapsUtil::Create() will use to create ChapsUtil
diff --git a/chromeos/ash/components/chaps_util/chaps_util_impl.cc b/chromeos/ash/components/chaps_util/chaps_util_impl.cc index 6f8fbcd..d45fba0 100644 --- a/chromeos/ash/components/chaps_util/chaps_util_impl.cc +++ b/chromeos/ash/components/chaps_util/chaps_util_impl.cc
@@ -22,9 +22,6 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "chromeos/ash/components/chaps_util/chaps_slot_session.h" -#include "chromeos/ash/components/chaps_util/key_helper.h" -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" -#include "chromeos/ash/components/chaps_util/pkcs12_validator.h" #include "crypto/chaps_support.h" #include "crypto/scoped_nss_types.h" #include "third_party/boringssl/src/include/openssl/base.h" @@ -41,9 +38,6 @@ constexpr CK_ATTRIBUTE_TYPE kForceSoftwareAttribute = CKA_VENDOR_DEFINED + 4; // Chaps sets this for keys that are software-backed. constexpr CK_ATTRIBUTE_TYPE kKeyInSoftware = CKA_VENDOR_DEFINED + 5; -constexpr char kPkcs12ImportFailed[] = "Chaps util PKCS12 import failed with "; -constexpr char kPkcs12KeyImportFailed[] = "Chaps util key import failed with "; -// Wraps public key and private key PKCS#11 object handles. struct KeyPairHandles { CK_OBJECT_HANDLE public_key; CK_OBJECT_HANDLE private_key; @@ -146,6 +140,14 @@ return modulus; } +crypto::ScopedSECItem MakeIdFromPubKeyNss( + const std::vector<uint8_t>& public_key_bytes) { + SECItem secitem_modulus; + secitem_modulus.data = const_cast<uint8_t*>(public_key_bytes.data()); + secitem_modulus.len = public_key_bytes.size(); + return crypto::ScopedSECItem(PK11_MakeIDFromPubKey(&secitem_modulus)); +} + // Read the modulus of the public key identified by |pub_key_handle| and return // it. std::optional<bool> IsKeySoftwareBacked(ChapsSlotSession* chaps_session, @@ -199,276 +201,6 @@ return true; } -std::string MakePkcs12KeyImportErrorMessage(Pkcs12ReaderStatusCode error_code) { - return kPkcs12KeyImportFailed + - base::NumberToString(static_cast<int>(error_code)); -} - -std::string MakePkcs12ImportErrorMessage(Pkcs12ReaderStatusCode error_code) { - return kPkcs12ImportFailed + - base::NumberToString(static_cast<int>(error_code)); -} -Pkcs12ReaderStatusCode ImportRsaKey(ChapsSlotSession* chaps_session, - const KeyData& key_data, - bool is_software_backed, - const Pkcs12Reader* pkcs12_reader) { - if (!key_data.key) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kKeyDataMissed); - return Pkcs12ReaderStatusCode::kKeyDataMissed; - } - - // All the data variables must stay alive until `attrs` is sent to Chaps. - const RSA* rsa_key = EVP_PKEY_get0_RSA(key_data.key.get()); - const std::vector<uint8_t>& cka_id = key_data.cka_id_value; - std::vector<uint8_t> public_modulus_bytes = - pkcs12_reader->BignumToBytes(RSA_get0_n(rsa_key)); - std::vector<uint8_t> public_exponent_bytes = - pkcs12_reader->BignumToBytes(RSA_get0_e(rsa_key)); - std::vector<uint8_t> private_exponent_bytes = - pkcs12_reader->BignumToBytes(RSA_get0_d(rsa_key)); - std::vector<uint8_t> prime_factor_1 = - pkcs12_reader->BignumToBytes(RSA_get0_p(rsa_key)); - std::vector<uint8_t> prime_factor_2 = - pkcs12_reader->BignumToBytes(RSA_get0_q(rsa_key)); - std::vector<uint8_t> exponent_1 = - pkcs12_reader->BignumToBytes(RSA_get0_dmp1(rsa_key)); - std::vector<uint8_t> exponent_2 = - pkcs12_reader->BignumToBytes(RSA_get0_dmq1(rsa_key)); - std::vector<uint8_t> coefficient = - pkcs12_reader->BignumToBytes(RSA_get0_iqmp(rsa_key)); - - if (public_modulus_bytes.empty() || cka_id.empty() || - public_exponent_bytes.empty() || private_exponent_bytes.empty() || - prime_factor_1.empty() || prime_factor_2.empty() || exponent_1.empty() || - exponent_2.empty() || coefficient.empty()) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kKeyAttrDataMissing); - return Pkcs12ReaderStatusCode::kKeyAttrDataMissing; - } - - CK_BBOOL true_value = CK_TRUE; - CK_OBJECT_CLASS key_class = CKO_PRIVATE_KEY; - CK_KEY_TYPE key_type = CKK_RSA; - CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; - CK_OBJECT_HANDLE out_key_handle; - CK_ATTRIBUTE attrs[] = { - {CKA_CLASS, &key_class, sizeof(key_class)}, - {CKA_KEY_TYPE, &key_type, sizeof(key_type)}, - {CKA_TOKEN, &true_value, sizeof(true_value)}, - {CKA_SENSITIVE, &true_value, sizeof(true_value)}, - {kForceSoftwareAttribute, &force_software_attribute, sizeof(true_value)}, - {CKA_PRIVATE, &true_value, sizeof(true_value)}, - {CKA_UNWRAP, &true_value, sizeof(true_value)}, - {CKA_DECRYPT, &true_value, sizeof(true_value)}, - {CKA_SIGN, &true_value, sizeof(true_value)}, - {CKA_SIGN_RECOVER, &true_value, sizeof(true_value)}, - {CKA_MODULUS, const_cast<uint8_t*>(public_modulus_bytes.data()), - public_modulus_bytes.size()}, - {CKA_ID, const_cast<uint8_t*>(cka_id.data()), cka_id.size()}, - {CKA_PUBLIC_EXPONENT, public_exponent_bytes.data(), - public_exponent_bytes.size()}, - {CKA_PRIVATE_EXPONENT, private_exponent_bytes.data(), - private_exponent_bytes.size()}, - {CKA_PRIME_1, prime_factor_1.data(), prime_factor_1.size()}, - {CKA_PRIME_2, prime_factor_2.data(), prime_factor_2.size()}, - {CKA_EXPONENT_1, exponent_1.data(), exponent_1.size()}, - {CKA_EXPONENT_2, exponent_2.data(), exponent_2.size()}, - {CKA_COEFFICIENT, coefficient.data(), coefficient.size()}}; - - if (!PerformWithRetries( - chaps_session, "CreateObject", - base::BindRepeating(&ChapsSlotSession::CreateObject, - base::Unretained(chaps_session), attrs, - /*ulCount=*/std::size(attrs), &out_key_handle))) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kCreateKeyFailed); - return Pkcs12ReaderStatusCode::kCreateKeyFailed; - } - return Pkcs12ReaderStatusCode::kSuccess; -} - -Pkcs12ReaderStatusCode ImportEcKey(ChapsSlotSession* chaps_session, - const KeyData& key_data, - bool is_software_backed, - const Pkcs12Reader* pkcs12_reader) { - if (!key_data.key) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kKeyDataMissed); - return Pkcs12ReaderStatusCode::kKeyDataMissed; - } - - // All the data variables must stay alive until `attrs` is sent to Chaps. - const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(key_data.key.get()); - if (!ec_key) { - return Pkcs12ReaderStatusCode::kEcKeyExtractionFailed; - } - const std::vector<uint8_t>& private_value = GetEcPrivateKeyBytes(ec_key); - const std::vector<uint8_t>& cka_id = key_data.cka_id_value; - const std::vector<uint8_t>& pub_key = GetEcPublicKeyBytes(ec_key); - - if (private_value.empty() || cka_id.empty() || pub_key.empty()) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kKeyAttrDataMissing); - return Pkcs12ReaderStatusCode::kKeyAttrDataMissing; - } - - bssl::ScopedCBB cbb; - uint8_t* ec_params_der = nullptr; - const EC_GROUP* group = EC_KEY_get0_group(ec_key); - size_t ec_params_der_len = 0; - if (!CBB_init(cbb.get(), 0) || !EC_KEY_marshal_curve_name(cbb.get(), group) || - !CBB_finish(cbb.get(), &ec_params_der, &ec_params_der_len)) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kCreateKeyFailed); - return Pkcs12ReaderStatusCode::kCreateKeyFailed; - } - bssl::UniquePtr<uint8_t> der_deleter(ec_params_der); - - CK_BBOOL true_value = CK_TRUE; - CK_OBJECT_CLASS key_class = CKO_PRIVATE_KEY; - CK_KEY_TYPE key_type = CKK_EC; - CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; - CK_OBJECT_HANDLE out_key_handle; - - CK_ATTRIBUTE attrs[] = { - {CKA_CLASS, &key_class, sizeof(key_class)}, - {CKA_KEY_TYPE, &key_type, sizeof(key_type)}, - {CKA_TOKEN, &true_value, sizeof(true_value)}, - {CKA_SENSITIVE, &true_value, sizeof(true_value)}, - {kForceSoftwareAttribute, &force_software_attribute, - sizeof(force_software_attribute)}, - {CKA_SIGN, &true_value, sizeof(true_value)}, - {CKA_SIGN_RECOVER, &true_value, sizeof(true_value)}, - {CKA_DERIVE, &true_value, sizeof(true_value)}, - {CKA_ID, const_cast<uint8_t*>(cka_id.data()), cka_id.size()}, - {CKA_VALUE, const_cast<uint8_t*>(private_value.data()), - private_value.size()}, - {CKA_EC_POINT, const_cast<uint8_t*>(pub_key.data()), pub_key.size()}, - {CKA_PRIVATE, &true_value, sizeof(true_value)}, - {CKA_EC_PARAMS, ec_params_der, ec_params_der_len}, - }; - - if (!PerformWithRetries( - chaps_session, "CreateObject", - base::BindRepeating(&ChapsSlotSession::CreateObject, - base::Unretained(chaps_session), attrs, - /*ulCount=*/std::size(attrs), &out_key_handle))) { - LOG(ERROR) << MakePkcs12KeyImportErrorMessage( - Pkcs12ReaderStatusCode::kCreateKeyFailed); - return Pkcs12ReaderStatusCode::kCreateKeyFailed; - } - return Pkcs12ReaderStatusCode::kSuccess; -} - -Pkcs12ReaderStatusCode ImportOneCert(ChapsSlotSession* chaps_session, - const CertData& cert_data, - const std::vector<uint8_t>& id, - const Pkcs12Reader* pkcs12_helper, - bool is_software_backed) { - if (!cert_data.x509) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage( - Pkcs12ReaderStatusCode::kCertificateDataMissed); - return Pkcs12ReaderStatusCode::kCertificateDataMissed; - } - X509* cert = cert_data.x509.get(); - - CK_OBJECT_CLASS cert_class = CKO_CERTIFICATE; - CK_CERTIFICATE_TYPE cert_type = CKC_X_509; - CK_BBOOL true_value = CK_TRUE; - - int cert_der_size = 0; - bssl::UniquePtr<uint8_t> cert_der; - Pkcs12ReaderStatusCode get_cert_der_result = - pkcs12_helper->GetDerEncodedCert(cert, cert_der, cert_der_size); - - if (get_cert_der_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_cert_der_result); - return get_cert_der_result; - } - - base::span<const uint8_t> issuer_name_data; - Pkcs12ReaderStatusCode get_issuer_name_der_result = - pkcs12_helper->GetIssuerNameDer(cert, issuer_name_data); - if (get_issuer_name_der_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_issuer_name_der_result); - return get_issuer_name_der_result; - } - - base::span<const uint8_t> subject_name_data; - Pkcs12ReaderStatusCode get_subject_name_der_result = - pkcs12_helper->GetSubjectNameDer(cert, subject_name_data); - if (get_subject_name_der_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_subject_name_der_result); - return get_subject_name_der_result; - } - - int serial_number_der_size = 0; - bssl::UniquePtr<uint8_t> serial_number_der; - Pkcs12ReaderStatusCode get_serial_der_result = - pkcs12_helper->GetSerialNumberDer(cert, serial_number_der, - serial_number_der_size); - if (get_serial_der_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_serial_der_result); - return get_serial_der_result; - } - - std::string label = cert_data.nickname; - - CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; - - CK_ATTRIBUTE attrs[] = { - {CKA_CLASS, &cert_class, sizeof(cert_class)}, - {CKA_CERTIFICATE_TYPE, &cert_type, sizeof(cert_type)}, - {CKA_TOKEN, &true_value, sizeof(true_value)}, - {kForceSoftwareAttribute, &force_software_attribute, sizeof(CK_BBOOL)}, - {CKA_ID, const_cast<uint8_t*>(id.data()), id.size()}, - {CKA_LABEL, label.data(), label.size()}, - {CKA_VALUE, cert_der.get(), - base::saturated_cast<CK_ULONG>(cert_der_size)}, - {CKA_ISSUER, const_cast<uint8_t*>(issuer_name_data.data()), - issuer_name_data.size()}, - {CKA_SUBJECT, const_cast<uint8_t*>(subject_name_data.data()), - subject_name_data.size()}, - {CKA_SERIAL_NUMBER, serial_number_der.get(), - base::saturated_cast<CK_ULONG>(serial_number_der_size)}}; - - CK_OBJECT_HANDLE cert_handle; - if (!PerformWithRetries( - chaps_session, "CreateObject", - base::BindRepeating(&ChapsSlotSession::CreateObject, - base::Unretained(chaps_session), attrs, - /*ulCount=*/std::size(attrs), &cert_handle))) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage( - Pkcs12ReaderStatusCode::kCreateCertFailed); - return Pkcs12ReaderStatusCode::kCreateCertFailed; - } - - return Pkcs12ReaderStatusCode::kSuccess; -} - -Pkcs12ReaderStatusCode ImportAllCerts(ChapsSlotSession* chaps_session, - std::vector<CertData>& certs_data, - const std::vector<uint8_t>& id, - const Pkcs12Reader* pkcs12_helper, - bool is_software_backed) { - if (certs_data.empty()) { - LOG(ERROR) << MakePkcs12CertImportErrorMessage( - Pkcs12ReaderStatusCode::kCertificateDataMissed); - return Pkcs12ReaderStatusCode::kCertificateDataMissed; - } - - Pkcs12ReaderStatusCode is_every_cert_imported = - Pkcs12ReaderStatusCode::kSuccess; - for (CertData cert_data : certs_data) { - if (ImportOneCert(chaps_session, cert_data, id, pkcs12_helper, - is_software_backed) != Pkcs12ReaderStatusCode::kSuccess) { - is_every_cert_imported = Pkcs12ReaderStatusCode::kFailureDuringCertImport; - } - } - return is_every_cert_imported; -} - } // namespace ChapsUtilImpl::ChapsUtilImpl( @@ -525,99 +257,6 @@ return true; } -bool ChapsUtilImpl::ImportPkcs12Certificate( - PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - bool is_software_backed) { - return ImportPkcs12CertificateImpl(slot, pkcs12_data, password, - is_software_backed); -} - -bool ChapsUtilImpl::ImportPkcs12CertificateImpl( - PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - const bool is_software_backed, - const Pkcs12Reader& pkcs12_reader) { - std::unique_ptr<ChapsSlotSession> chaps_session = - GetChapsSlotSessionForSlot(slot); - if (!chaps_session) { - LOG(ERROR) << MakePkcs12ImportErrorMessage( - Pkcs12ReaderStatusCode::kChapsSessionMissed); - return false; - } - - KeyData key_data; - bssl::UniquePtr<STACK_OF(X509)> certs; - Pkcs12ReaderStatusCode get_key_and_cert_status = - pkcs12_reader.GetPkcs12KeyAndCerts(pkcs12_data, password, key_data.key, - certs); - if (get_key_and_cert_status != Pkcs12ReaderStatusCode::kSuccess) { - uint32_t error = ERR_get_error(); - char ebuf[255]; - LOG(ERROR) << "PKCS#12 import failed with error " - << ERR_error_string_n(error, ebuf, sizeof(ebuf)); - LOG(ERROR) << MakePkcs12ImportErrorMessage(get_key_and_cert_status); - return false; - } - - Pkcs12ReaderStatusCode enrich_key_data_result = - pkcs12_reader.EnrichKeyData(key_data); - if (enrich_key_data_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12ImportErrorMessage(enrich_key_data_result); - return false; - } - - // This will keep raw_pointers from `certs`, it cannot outlive `certs`. - std::vector<CertData> certs_data; - Pkcs12ReaderStatusCode prepare_certs_status = ValidateAndPrepareCertData( - slot, pkcs12_reader, certs, key_data, certs_data); - if (prepare_certs_status != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12ImportErrorMessage(prepare_certs_status); - return false; - } - - bool is_key_installed = false; - Pkcs12ReaderStatusCode key_installed_result = CanFindInstalledKey( - slot, certs_data.front(), pkcs12_reader, is_key_installed); - if (key_installed_result != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << "Failed to find installed key in slot due to: " - << MakePkcs12CertImportErrorMessage(key_installed_result); - return false; - } - - if (!is_key_installed) { - Pkcs12ReaderStatusCode import_key_status = - Pkcs12ReaderStatusCode::kKeyAttrDataMissing; - if (IsKeyRsaType(key_data.key)) { - import_key_status = ImportRsaKey(chaps_session.get(), key_data, - is_software_backed, &pkcs12_reader); - } else if (IsKeyEcType(key_data.key)) { - import_key_status = ImportEcKey(chaps_session.get(), key_data, - is_software_backed, &pkcs12_reader); - } else { - LOG(ERROR) << "Not supported key type"; - return false; - } - - if (import_key_status != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12ImportErrorMessage(import_key_status); - return false; - } - } - // Same id will be used for the key and certs. - Pkcs12ReaderStatusCode import_certs_status = - ImportAllCerts(chaps_session.get(), certs_data, key_data.cka_id_value, - &pkcs12_reader, is_software_backed); - if (import_certs_status != Pkcs12ReaderStatusCode::kSuccess) { - LOG(ERROR) << MakePkcs12ImportErrorMessage(import_certs_status); - return false; - } - - return true; -} - std::unique_ptr<ChapsSlotSession> ChapsUtilImpl::GetChapsSlotSessionForSlot( PK11SlotInfo* slot) { if (!slot || (!is_chaps_provided_slot_for_testing_ &&
diff --git a/chromeos/ash/components/chaps_util/chaps_util_impl.h b/chromeos/ash/components/chaps_util/chaps_util_impl.h index 667533c..27ac889 100644 --- a/chromeos/ash/components/chaps_util/chaps_util_impl.h +++ b/chromeos/ash/components/chaps_util/chaps_util_impl.h
@@ -15,7 +15,6 @@ #include "base/functional/callback_forward.h" #include "chromeos/ash/components/chaps_util/chaps_slot_session.h" #include "chromeos/ash/components/chaps_util/chaps_util.h" -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" #include "crypto/scoped_nss_types.h" namespace chromeos { @@ -35,19 +34,6 @@ crypto::ScopedSECKEYPublicKey* out_public_key, crypto::ScopedSECKEYPrivateKey* out_private_key) override; - bool ImportPkcs12Certificate(PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - bool is_software_backed) override; - - // Public for testing, allows replacing Pkcs12Reader. - bool ImportPkcs12CertificateImpl( - PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - const bool is_software_backed, - const Pkcs12Reader& pkcs12_reader = Pkcs12Reader()); - // If called with true, every slot is assumed to be a chaps-provided slot. void SetIsChapsProvidedSlotForTesting( bool is_chaps_provided_slot_for_testing) {
diff --git a/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc b/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc index 6ce6024..eaa7e22 100644 --- a/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc +++ b/chromeos/ash/components/chaps_util/chaps_util_impl_unittest.cc
@@ -18,7 +18,6 @@ #include "base/files/file_util.h" #include "base/memory/raw_ptr.h" #include "chromeos/ash/components/chaps_util/chaps_slot_session.h" -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" #include "crypto/nss_key_util.h" #include "crypto/scoped_nss_types.h" #include "crypto/scoped_test_nss_db.h" @@ -44,8 +43,6 @@ constexpr CK_ATTRIBUTE_TYPE kKeyInSoftware = CKA_VENDOR_DEFINED + 5; enum AttrValueType { kNotDefined, kCkBool, kCkUlong, kCkBytes }; -const char kPkcs12FilePassword[] = "12345"; -const char kPkcs12FileMin6CharPassword[] = "123456"; const std::optional<std::vector<CK_BYTE>> default_encoded_cert_label = base::Base64Decode("dGVzdHVzZXJjZXJ0"); // python print(base64.b64encode("default nickname".encode('utf-8'))). @@ -516,251 +513,6 @@ const raw_ptr<PassedData> passed_data_; }; -// FakePkcs12Reader helper, by default it will call methods for the original -// object. -class FakePkcs12Reader : public Pkcs12Reader { - public: - FakePkcs12Reader() = default; - ~FakePkcs12Reader() override = default; - - Pkcs12ReaderStatusCode GetPkcs12KeyAndCerts( - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - bssl::UniquePtr<EVP_PKEY>& key, - bssl::UniquePtr<STACK_OF(X509)>& certs) const override { - get_pkcs12_key_and_cert_called_++; - if (fake_certs_.get()) { - certs = std::move(fake_certs_); - return Pkcs12ReaderStatusCode::kSuccess; - } - - if (get_pkcs12_key_and_cert_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_pkcs12_key_and_cert_status_; - } - return Pkcs12Reader::GetPkcs12KeyAndCerts(pkcs12_data, password, key, - certs); - } - - Pkcs12ReaderStatusCode GetDerEncodedCert(X509* cert, - bssl::UniquePtr<uint8_t>& cert_der, - int& cert_der_size) const override { - get_der_encode_cert_called_++; - if (get_der_encoded_cert_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_der_encoded_cert_status_; - } - return Pkcs12Reader::GetDerEncodedCert(cert, cert_der, cert_der_size); - } - - Pkcs12ReaderStatusCode GetIssuerNameDer( - X509* cert, - base::span<const uint8_t>& issuer_name_data) const override { - if (get_issuer_name_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_issuer_name_der_status_; - } - return Pkcs12Reader::GetIssuerNameDer(cert, issuer_name_data); - } - - Pkcs12ReaderStatusCode GetSubjectNameDer( - X509* cert, - base::span<const uint8_t>& subject_name_data) const override { - get_subject_name_der_called_++; - if (get_subject_name_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_subject_name_der_status_; - } - return Pkcs12Reader::GetSubjectNameDer(cert, subject_name_data); - } - - Pkcs12ReaderStatusCode GetSerialNumberDer( - X509* cert, - bssl::UniquePtr<uint8_t>& serial_number_der, - int& serial_number_der_size) const override { - if (get_serial_number_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_serial_number_der_status_; - } - return Pkcs12Reader::GetSerialNumberDer(cert, serial_number_der, - serial_number_der_size); - } - - Pkcs12ReaderStatusCode EnrichKeyData(KeyData& key_data) const override { - get_key_data_called_++; - if (get_key_data_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_key_data_status_; - } - return Pkcs12Reader::EnrichKeyData(key_data); - } - - Pkcs12ReaderStatusCode CheckRelation(const KeyData& key_data, - X509* cert, - bool& is_related) const override { - check_relation_data_called_++; - if (check_relation_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return check_relation_status_; - } - return Pkcs12Reader::CheckRelation(key_data, cert, is_related); - } - - Pkcs12ReaderStatusCode FindRawCertsWithSubject( - PK11SlotInfo* slot, - base::span<const uint8_t> required_subject_name, - CERTCertificateList** found_certs) const override { - find_raw_certs_with_subject_called_++; - - if (fake_some_certs_in_slot_) { - // Some multi steps action here to mock returned CERTCertificateList with - // one cert. This all should go away when PK11_FindRawCertsWithSubject is - // replaced with a new function. - scoped_refptr<net::X509Certificate> x509_cert = - net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); - net::ScopedCERTCertificate nss_cert = - net::x509_util::CreateCERTCertificateFromX509Certificate( - x509_cert.get()); - *found_certs = CERT_CertListFromCert(nss_cert.get()); - - return Pkcs12ReaderStatusCode::kSuccess; - } - - if (find_raw_certs_with_subject_ != Pkcs12ReaderStatusCode::kSuccess) { - return find_raw_certs_with_subject_; - } - return Pkcs12Reader::FindRawCertsWithSubject(slot, required_subject_name, - found_certs); - } - - Pkcs12ReaderStatusCode GetLabel(X509* cert, - std::string& label) const override { - get_label_called_++; - if (get_label_override_) { - label = std::string(); - return Pkcs12ReaderStatusCode::kSuccess; - } - if (get_label_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return get_label_status_; - } - return Pkcs12Reader::GetLabel(cert, label); - } - - Pkcs12ReaderStatusCode IsCertWithNicknameInSlots( - const std::string& nickname_in, - bool& is_nickname_present) const override { - is_certs_with_nickname_in_slots_called_++; - - // Override allows to return first N request to isCertsWithNicknamesInSlot - // with True and then return False, so can verify behaviour when nicknames - // are found in slot. - if (is_certs_with_nickname_in_slots_override_ > 0 && - is_certs_with_nickname_in_slots_override_ < - is_certs_with_nickname_in_slots_called_) { - is_nickname_present = false; - return Pkcs12ReaderStatusCode::kSuccess; - } - - // By default nothing is returned from PK11_FindCertsFromNickname() and - // is_nickname_present will be false, this will override is_nickname_present - // to true for tests. - if (is_certs_nickname_used_) { - is_nickname_present = is_certs_nickname_used_; - return Pkcs12ReaderStatusCode::kSuccess; - } - - if (is_certs_with_nickname_in_slot_status_ != - Pkcs12ReaderStatusCode::kSuccess) { - return is_certs_with_nickname_in_slot_status_; - } - return Pkcs12Reader::IsCertWithNicknameInSlots(nickname_in, - is_nickname_present); - } - - Pkcs12ReaderStatusCode DoesKeyForCertExist( - PK11SlotInfo* slot, - const Pkcs12ReaderCertSearchType cert_type, - const scoped_refptr<net::X509Certificate>& cert) const override { - find_key_by_cert_called_++; - if (cert_type == Pkcs12ReaderCertSearchType::kPlainType && - find_key_by_cert_status_.has_value()) { - return find_key_by_cert_status_.value(); - } - if (cert_type == Pkcs12ReaderCertSearchType::kDerType && - find_key_by_der_cert_status_.has_value()) { - return find_key_by_der_cert_status_.value(); - } - return Pkcs12Reader::DoesKeyForCertExist(slot, cert_type, cert); - } - - Pkcs12ReaderStatusCode GetCertFromDerData( - const unsigned char* der_cert_data, - int der_cert_len, - bssl::UniquePtr<X509>& x509) const override { - return Pkcs12Reader::GetCertFromDerData(der_cert_data, der_cert_len, x509); - } - - std::vector<uint8_t> BignumToBytes(const BIGNUM* bignum) const override { - if (bignum_to_bytes_value_) { - return bignum_to_bytes_value_.value(); - } - return Pkcs12Reader::BignumToBytes(bignum); - } - - Pkcs12ReaderStatusCode IsCertInSlot( - PK11SlotInfo* slot, - const scoped_refptr<net::X509Certificate>& cert, - bool& is_cert_present) const override { - is_cert_in_slot_called_++; - if (is_cert_in_slot_override_.has_value()) { - is_cert_present = is_cert_in_slot_override_.value(); - return Pkcs12ReaderStatusCode::kSuccess; - } - if (is_cert_in_slot_status_ != Pkcs12ReaderStatusCode::kSuccess) { - return is_cert_in_slot_status_; - } - return Pkcs12Reader::IsCertInSlot(slot, cert, is_cert_present); - } - - mutable int get_pkcs12_key_and_cert_called_ = 0; - mutable bssl::UniquePtr<STACK_OF(X509)> fake_certs_; - Pkcs12ReaderStatusCode get_pkcs12_key_and_cert_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int get_der_encode_cert_called_ = 0; - Pkcs12ReaderStatusCode get_der_encoded_cert_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int get_issuer_name_der_called_ = 0; - Pkcs12ReaderStatusCode get_issuer_name_der_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int get_subject_name_der_called_ = 0; - Pkcs12ReaderStatusCode get_subject_name_der_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int get_serial_number_der_called_ = 0; - Pkcs12ReaderStatusCode get_serial_number_der_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int find_raw_certs_with_subject_called_ = 0; - Pkcs12ReaderStatusCode find_raw_certs_with_subject_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable bssl::UniquePtr<STACK_OF(X509)> certs_with_same_DN_override_; - mutable bool fake_some_certs_in_slot_ = false; - mutable int get_label_called_ = 0; - mutable int get_label_override_ = false; - Pkcs12ReaderStatusCode get_label_status_ = Pkcs12ReaderStatusCode::kSuccess; - mutable int is_certs_with_nickname_in_slots_override_ = 0; - mutable int is_certs_with_nickname_in_slots_called_ = 0; - Pkcs12ReaderStatusCode is_certs_with_nickname_in_slot_status_ = - Pkcs12ReaderStatusCode::kSuccess; - bool is_certs_nickname_used_ = false; - mutable int get_key_data_called_ = 0; - Pkcs12ReaderStatusCode get_key_data_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int check_relation_data_called_ = 0; - Pkcs12ReaderStatusCode check_relation_status_ = - Pkcs12ReaderStatusCode::kSuccess; - mutable int find_key_by_cert_called_ = 0; - std::optional<Pkcs12ReaderStatusCode> find_key_by_cert_status_; - std::optional<Pkcs12ReaderStatusCode> find_key_by_der_cert_status_; - mutable int is_cert_in_slot_called_ = 0; - std::optional<bool> is_cert_in_slot_override_; - Pkcs12ReaderStatusCode is_cert_in_slot_status_ = - Pkcs12ReaderStatusCode::kSuccess; - - std::optional<std::vector<uint8_t>> bignum_to_bytes_value_ = std::nullopt; -}; - class ChapsUtilImplTest : public ::testing::Test { public: ChapsUtilImplTest() { @@ -877,254 +629,6 @@ EXPECT_EQ(passed_data_.private_key_cka_id, expected_cka_id); } -// Verify that ChapsUtil passed the correct slot id to the factory. -TEST_F(ChapsUtilImplTest, ImportPkcs12CertificateSuccessSlotOk) { - chaps_util_impl_->ImportPkcs12Certificate( - nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, - /*is_software_backed=*/true); - - EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); -} - -// Successfully import public key and single certificate from PKCS12 file to -// Chaps software slot. -TEST_F(ChapsUtilImplTest, ImportPkcs12EnforceSoftwareBackedSuccess) { - using OPTIONAL_CK_BYTE_VECTOR = std::optional<std::vector<CK_BYTE>>; - std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_key_data; - // Strings below have hardcoded fields from "client.p12" which is referenced - // by GetPkcs12Data(), they are Base64Encoded for the shorter representation. - // Original CkByte values from the key_data can be printed using this example: - // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); - expected_key_data[CKA_MODULUS] = base::Base64Decode( - "1JC7k5aWwwOpqoiNzoRHLRdmzH9h4kVmFlBU/vZ5e7hCSnnIbVJilMxDB+p0b7ozw1/" - "bHvsRqikARkMc0OnC4EMnm6BEopqiyOnNGBy1qXwol5Mw8T8zwlzJl7FQdQdlH7pMxuID8hZ" - "Eu8VkoEyLYJVJ1Ylaasc5BC0pHxZdNKk="); - expected_key_data[CKA_ID] = - base::Base64Decode("U65QueEa+ljfdKySfD6QbFrXEcM="); - expected_key_data[CKA_PUBLIC_EXPONENT] = base::Base64Decode("AQAB"); - expected_key_data[CKA_PRIVATE_EXPONENT] = base::Base64Decode( - "y/k2hiFy+h+BqArxSMLWKgbStlll7GL7212qsh6B5J6jviOumHj98BsyF1577" - "NqY4VoSQmBaSxadFM9Bz5cBT8IrKr2/FjL1AC+wgdwUvGvbD426zN4Yb59cTf/" - "bhNkvd2xocFPHeMDETFD6ISEcV6YLbPAtNlom7qVxlSTn1KE="); - expected_key_data[CKA_PRIME_1] = base::Base64Decode( - "8W127p18wtuvUBxz7MtZgAPk/1OGLj1RJghuVYbHaCJ9sT5AzK8eNcRqCld/" - "bKABDdmYf3QHKYDx+vcrhcNF8w=="); - expected_key_data[CKA_PRIME_2] = base::Base64Decode( - "4WVKE2h5oF7HYpX2sLgHXFhM77k6Hb1MalKk1MvXSYeKLnFf1Xh4Af2tUR73RmG/Mp/" - "evvUMu6h4AvlGvn+18w=="); - expected_key_data[CKA_EXPONENT_1] = base::Base64Decode( - "SUZzCXstKaspq4PnP2B8upj0APalzBT6MzPt4PF2RknpokkFu9oOrjz9/" - "kOOPjbV+xEm8tAReGxVhVlNkVyyNw=="); - expected_key_data[CKA_EXPONENT_2] = base::Base64Decode( - "DkFqwvl7n9H+yFR1ys2I4aVQEGVlsJXVbHAXrsHJtwPUkIVpK0Y4SN/" - "zg0rzFsd94UTNQMSc7o2EMaP0fn3zUw=="); - expected_key_data[CKA_COEFFICIENT] = base::Base64Decode( - "mV2Q/My7RVOOsSZGDEouCYMcVahOFWS84IcpYRwR9ds0KZ4hKcdyMGNR5/4ryvr9XMA+DBR/" - "L9GBSWe6CeK3RQ=="); - - std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_cert_data; - // Strings below have hardcoded fields from "client.p12" which is referenced - // by GetPkcs12Data(), they are Base64Encoded for shorter representation. - // Original CkByte values from the key_data can be printed using this example: - // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); - expected_cert_data[CKA_CERTIFICATE_TYPE] = base::Base64Decode("AAAAAAAAAAA="); - expected_cert_data[CKA_ID] = - base::Base64Decode("U65QueEa+ljfdKySfD6QbFrXEcM="); - expected_cert_data[CKA_LABEL] = default_encoded_cert_label; - expected_cert_data[CKA_VALUE] = base::Base64Decode( - "MIICpTCCAg6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJBVTETMBEGA1UE" - "CBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYD" - "VQQDEwZ0ZXN0Y2EwIBcNMTAwNzMwMDEwMjEyWhgPMjA2MDA3MTcwMTAyMTJaMFwxCzAJBgNV" - "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz" - "IFB0eSBMdGQxFTATBgNVBAMTDHRlc3R1c2VyY2VydDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw" - "gYkCgYEA1JC7k5aWwwOpqoiNzoRHLRdmzH9h4kVmFlBU/" - "vZ5e7hCSnnIbVJilMxDB+p0b7ozw1/" - "bHvsRqikARkMc0OnC4EMnm6BEopqiyOnNGBy1qXwol5Mw8T8zwlzJl7FQdQdlH7pMxuID8hZ" - "Eu8VkoEyLYJVJ1Ylaasc5BC0pHxZdNKkCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvh" - "CAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFHqEH18NKRV" - "bhkqTT8swZq22Dc4YMB8GA1UdIwQYMBaAFE8aGkwMhipgaDysVMfu3JaN29ILMA0GCSqGSIb" - "3DQEBBQUAA4GBAKMT7cwjZtgmkFrJPAa/" - "oOt1cdoBD7MqErx+tdvVN62q0h0Vl6UM3a94Ic0/" - "sv1V8RT5TUYUyyuepr2Gm58uqkcbI3qflveVcvi96n7fCCo6NwxbKHmpVOx+" - "wcPlHtjfek2KGQnee3mEN0YY/HOP5Rvj0Bh302kLrfgFx3xN1G5I"); - expected_cert_data[CKA_ISSUER] = base::Base64Decode( - "MFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5l" - "dCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYQ=="); - expected_cert_data[CKA_SUBJECT] = base::Base64Decode( - "MFwxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5l" - "dCBXaWRnaXRzIFB0eSBMdGQxFTATBgNVBAMTDHRlc3R1c2VyY2VydA=="); - expected_cert_data[CKA_SERIAL_NUMBER] = base::Base64Decode("AgEB"); - chaps_util_impl_->ImportPkcs12Certificate( - nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, - /*is_software_backed=*/true); - - // Verify that ChapsUtil passed the correct slot id to the factory. - EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); - - // Verify that ChapsUtil passed the expected attributes. - // Check attributes for private key. - ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; - const int expected_private_key_attributes = 19; - EXPECT_EQ(key_data.Size(), expected_private_key_attributes); - EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); - EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_RSA); - EXPECT_EQ(key_data.GetCkBool(CKA_TOKEN), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SENSITIVE), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_PRIVATE), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_UNWRAP), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_DECRYPT), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SIGN), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SIGN_RECOVER), CK_TRUE); - EXPECT_EQ(key_data.GetCkByte(CKA_MODULUS), expected_key_data[CKA_MODULUS]); - EXPECT_EQ(key_data.GetCkByte(CKA_ID), expected_key_data[CKA_ID]); - EXPECT_EQ(key_data.GetCkByte(CKA_PUBLIC_EXPONENT), - expected_key_data[CKA_PUBLIC_EXPONENT]); - EXPECT_EQ(key_data.GetCkByte(CKA_PRIVATE_EXPONENT), - expected_key_data[CKA_PRIVATE_EXPONENT]); - EXPECT_EQ(key_data.GetCkByte(CKA_PRIME_1), expected_key_data[CKA_PRIME_1]); - EXPECT_EQ(key_data.GetCkByte(CKA_PRIME_2), expected_key_data[CKA_PRIME_2]); - EXPECT_EQ(key_data.GetCkByte(CKA_EXPONENT_1), - expected_key_data[CKA_EXPONENT_1]); - EXPECT_EQ(key_data.GetCkByte(CKA_EXPONENT_2), - expected_key_data[CKA_EXPONENT_2]); - EXPECT_EQ(key_data.GetCkByte(CKA_COEFFICIENT), - expected_key_data[CKA_COEFFICIENT]); - - // Checking attributes for certificate. - ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; - const int expected_cert_attributes = 10; - EXPECT_EQ(cert_data.Size(), expected_cert_attributes); - EXPECT_EQ(cert_data.GetCkBool(CKA_TOKEN), CK_TRUE); - EXPECT_EQ(cert_data.GetCkULong(CKA_CLASS), CKO_CERTIFICATE); - EXPECT_EQ(cert_data.GetCkByte(CKA_CERTIFICATE_TYPE), - expected_cert_data[CKA_CERTIFICATE_TYPE]); - EXPECT_EQ(cert_data.GetCkByte(CKA_ID), expected_cert_data[CKA_ID]); - EXPECT_EQ(cert_data.GetCkByte(CKA_VALUE), expected_cert_data[CKA_VALUE]); - EXPECT_EQ(cert_data.GetCkByte(CKA_ISSUER), expected_cert_data[CKA_ISSUER]); - EXPECT_EQ(cert_data.GetCkByte(CKA_SUBJECT), expected_cert_data[CKA_SUBJECT]); - EXPECT_EQ(cert_data.GetCkByte(CKA_SERIAL_NUMBER), - expected_cert_data[CKA_SERIAL_NUMBER]); - EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_cert_data[CKA_LABEL]); -} - -// This is same test as ImportPkcs12EnforceSoftBackSuccess but with -// kKeyInSoftware = false, so key will be hardware backed. -// Only number of stored attributes and required minimum of values is checked, -// because we use same pkcs12 file "client.p12" and all values match already -// checked in ImportPkcs12EnforceSoftwareBackedSuccess test. -TEST_F(ChapsUtilImplTest, ImportPkcs12HardwareBackedSuccess) { - chaps_util_impl_->ImportPkcs12Certificate( - nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, - /*is_software_backed=*/false); - - // Verify that ChapsUtil passed the correct slot id to the factory. - EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); - - // Verify that ChapsUtil passed the expected attributes. - // Check only kForceSoftwareAttribute attribute for private key. - ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; - const int expected_private_key_attributes = 19; - EXPECT_EQ(key_data.Size(), expected_private_key_attributes); - EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); - EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_RSA); - EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_FALSE); - - // Check only number of attributes for certificate. - ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; - const int expected_cert_attributes = 10; - EXPECT_EQ(cert_data.Size(), expected_cert_attributes); -} - -// Successfully import EC key and single certificate from PKCS12 file to -// Chaps software slot with is_software_backed = false. -TEST_F(ChapsUtilImplTest, ImportPkcs12WithEcKeyHardwareBackedSuccess) { - using OPTIONAL_CK_BYTE_VECTOR = absl::optional<std::vector<CK_BYTE>>; - std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_key_data; - // Strings below have hardcoded fields from "client_with_ec_key.p12" which is - // referenced by GetPkcs12Data(), they are Base64Encoded for the shorter - // representation. Original CkByte values from the key_data can be printed - // using this example: - // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); - expected_key_data[CKA_ID] = cka_id_for_ec_key; - expected_key_data[CKA_EC_POINT] = cka_ex_point_ec_key; - expected_key_data[CKA_VALUE] = cka_value_ec_key; - expected_key_data[CKA_EC_PARAMS] = cka_ec_params_ec_key; - - chaps_util_impl_->ImportPkcs12Certificate(nss_test_db_.slot(), - GetPkcs12WithEcKeyData(), - kPkcs12FileMin6CharPassword, - /*is_software_backed=*/false); - - // Verify that ChapsUtil passed the correct slot id to the factory. - EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); - - // Verify that ChapsUtil passed the expected attributes. - // Check only kForceSoftwareAttribute attribute for private key. - ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; - const int number_of_expected_key_attributes = 13; - EXPECT_EQ(key_data.Size(), number_of_expected_key_attributes); - EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); - EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_EC); - - EXPECT_EQ(key_data.GetCkBool(CKA_TOKEN), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SENSITIVE), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_FALSE); - EXPECT_EQ(key_data.GetCkBool(CKA_SIGN), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SIGN_RECOVER), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_DERIVE), CK_TRUE); - EXPECT_EQ(key_data.GetCkByte(CKA_ID), expected_key_data[CKA_ID]); - EXPECT_EQ(key_data.GetCkByte(CKA_VALUE), expected_key_data[CKA_VALUE]); - EXPECT_EQ(key_data.GetCkByte(CKA_EC_POINT), expected_key_data[CKA_EC_POINT]); - EXPECT_EQ(key_data.GetCkBool(CKA_PRIVATE), CK_TRUE); - EXPECT_EQ(key_data.GetCkByte(CKA_EC_PARAMS), - expected_key_data[CKA_EC_PARAMS]); -} - -// Successfully import EC key and single certificate from PKCS12 file to -// Chaps software slot with is_software_backed = true. -TEST_F(ChapsUtilImplTest, ImportPkcs12WithEcKeySoftwareBackedSuccess) { - using OPTIONAL_CK_BYTE_VECTOR = absl::optional<std::vector<CK_BYTE>>; - std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_key_data; - // Strings below have hardcoded fields from "client_with_ec_key.p12" which is - // referenced by GetPkcs12Data(), they are Base64Encoded for the shorter - // representation. Original CkByte values from the key_data can be printed - // using this example: - // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); - expected_key_data[CKA_ID] = cka_id_for_ec_key; - expected_key_data[CKA_EC_POINT] = cka_ex_point_ec_key; - expected_key_data[CKA_VALUE] = cka_value_ec_key; - expected_key_data[CKA_EC_PARAMS] = cka_ec_params_ec_key; - chaps_util_impl_->ImportPkcs12Certificate(nss_test_db_.slot(), - GetPkcs12WithEcKeyData(), - kPkcs12FileMin6CharPassword, - /*is_software_backed=*/true); - - // Verify that ChapsUtil passed the correct slot id to the factory. - EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); - - // Verify that ChapsUtil passed the expected attributes. - // Check only kForceSoftwareAttribute attribute for private key. - ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; - const int number_of_expected_key_attributes = 13; - EXPECT_EQ(key_data.Size(), number_of_expected_key_attributes); - EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); - EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_EC); - - EXPECT_EQ(key_data.GetCkBool(CKA_TOKEN), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SENSITIVE), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SIGN), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_SIGN_RECOVER), CK_TRUE); - EXPECT_EQ(key_data.GetCkBool(CKA_DERIVE), CK_TRUE); - EXPECT_EQ(key_data.GetCkByte(CKA_ID), expected_key_data[CKA_ID]); - EXPECT_EQ(key_data.GetCkByte(CKA_VALUE), expected_key_data[CKA_VALUE]); - EXPECT_EQ(key_data.GetCkByte(CKA_EC_POINT), expected_key_data[CKA_EC_POINT]); - EXPECT_EQ(key_data.GetCkBool(CKA_PRIVATE), CK_TRUE); - EXPECT_EQ(key_data.GetCkByte(CKA_EC_PARAMS), - expected_key_data[CKA_EC_PARAMS]); -} - // The passed slot is not provided by chaps. The operation fails. TEST_F(ChapsUtilImplTest, NotChapsProvidedSlot) { chaps_util_impl_->SetIsChapsProvidedSlotForTesting(false); @@ -1216,452 +720,5 @@ EXPECT_EQ(passed_data_.reopen_session_call_count, 1); } -class ChapsUtilPKCS12ImportTest : public ChapsUtilImplTest { - public: - ChapsUtilPKCS12ImportTest() { - GetPkcs12Data(); - EXPECT_FALSE(GetPkcs12Data().empty()); - } - - bool RunImportPkcs12Certificate() { - return chaps_util_impl_->ImportPkcs12CertificateImpl( - nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, - /*is_software_backed=*/true, fake_pkcs12_reader_); - } - - FakePkcs12Reader fake_pkcs12_reader_; -}; - -TEST_F(ChapsUtilPKCS12ImportTest, DefaultCasePKCS12ImportSuccessful) { - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(import_result, true); -} - -TEST_F(ChapsUtilPKCS12ImportTest, NoChapsSessionPKCS12ImportFailed) { - bool import_result = chaps_util_impl_->ImportPkcs12CertificateImpl( - /*slot=*/nullptr, GetPkcs12Data(), kPkcs12FilePassword, - /*is_software_backed=*/true, fake_pkcs12_reader_); - - EXPECT_EQ(import_result, false); -} - -// Failed import PKCS12 due to empty keys. -TEST_F(ChapsUtilPKCS12ImportTest, EmptyKeyPtrPKCS12ImportFailed) { - fake_pkcs12_reader_.get_pkcs12_key_and_cert_status_ = - Pkcs12ReaderStatusCode::kKeyExtractionFailed; - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -// Failed import PKCS12 due to missed key attribute. -TEST_F(ChapsUtilPKCS12ImportTest, MissedKeyAttributePKCS12ImportFailed) { - // This will set all attributes to empty. - fake_pkcs12_reader_.bignum_to_bytes_value_ = std::vector<uint8_t>(); - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -TEST_F(ChapsUtilPKCS12ImportTest, ImportOfKeyFailedPKCS12ImportFailed) { - // Mock CreateObject operations result. - passed_data_.operation_results[0] = CKR_GENERAL_ERROR; - - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -TEST_F(ChapsUtilPKCS12ImportTest, FailedGetCertDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_der_encoded_cert_status_ = - Pkcs12ReaderStatusCode::kKeyExtractionFailed; - - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -TEST_F(ChapsUtilPKCS12ImportTest, FailedGetIssuerNameDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_issuer_name_der_status_ = - Pkcs12ReaderStatusCode::kPkcs12CertIssuerDerNameFailed; - - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -TEST_F(ChapsUtilPKCS12ImportTest, FailedGetSubjectNameDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_subject_name_der_status_ = - Pkcs12ReaderStatusCode::kPkcs12CertSubjectNameDerFailed; - - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -TEST_F(ChapsUtilPKCS12ImportTest, FailedGetSerialNumberDerPKCS12ImportFailed) { - fake_pkcs12_reader_.get_serial_number_der_status_ = - Pkcs12ReaderStatusCode::kPkcs12CertSerialNumberDerFailed; - - bool import_result = RunImportPkcs12Certificate(); - EXPECT_EQ(import_result, false); -} - -TEST_F(ChapsUtilPKCS12ImportTest, CertObjectCreationFailedPKCS12ImportFailed) { - // Mock CreateObject operations result for key import. - passed_data_.operation_results[0] = CKR_OK; - // Mock CreateObject operations result for the certificate import. - passed_data_.operation_results[1] = CKR_GENERAL_ERROR; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_FALSE(import_result); -} - -// Empty list returned for certificates from GetPkcs12KeyAndCerts, key is ok. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, NoCertsForValidationPKCS12ImportFailed) { - fake_pkcs12_reader_.fake_certs_ = - bssl::UniquePtr<STACK_OF(X509)>(sk_X509_new_null()); - - bool import_result = chaps_util_impl_->ImportPkcs12CertificateImpl( - nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, - /*is_software_backed=*/true, fake_pkcs12_reader_); - - EXPECT_EQ(fake_pkcs12_reader_.get_pkcs12_key_and_cert_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.get_key_data_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 0); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// GetKeyData fails to extract data for the key, validation fails. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, GetKeyDataFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.get_key_data_status_ = - Pkcs12ReaderStatusCode::kKeyDataMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_key_data_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 0); - - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// CheckRelation between cert and key fails, validation fails. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, CheckRelationFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.check_relation_status_ = - Pkcs12ReaderStatusCode::kKeyDataMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 0); - - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// Cert is not related to key, validation fails. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, CertNotRelatedToKeyPKCS12ImportFailed) { - fake_pkcs12_reader_.check_relation_status_ = - Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 0); - - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// Cert has no DER subject name, GetNickname() fails, validation fails. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, CertHasNoDERSubjectNamePKCS12ImportFailed) { - fake_pkcs12_reader_.get_subject_name_der_status_ = - Pkcs12ReaderStatusCode::kPkcs12CertSubjectNameMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.find_raw_certs_with_subject_called_, 0); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// FindRawCertsWithSubject fails during searching for cert with required -// subject in slot. GetNickname fails, validation fails. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, - FindRawCertsWithSubjectFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.find_raw_certs_with_subject_ = - Pkcs12ReaderStatusCode::kPkcs12FindCertsWithSubjectFailed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.find_raw_certs_with_subject_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 0); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// There is one certificate with the same subject in slot, but GetLabel()) for -// it fails. Import will be successful with the currents cert's nickname. -TEST_F(ChapsUtilPKCS12ImportTest, - GetLabelForFoundCertFailedPKCS12ImportSucess) { - fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; - fake_pkcs12_reader_.get_label_status_ = - Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 2); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_TRUE(KeyImportDone()); - EXPECT_TRUE(import_result); -} - -// There is one certificate with the same subject in slot. -// Import will be successful with already stored test cert's nickname. -TEST_F(ChapsUtilPKCS12ImportTest, - CertWithSameSubjectInSlotPKCS12ImportSuccess) { - fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; - // python print(base64.b64encode("127.0.0.1".encode('utf-8'))). - auto expected_encoded_label = base::Base64Decode("MTI3LjAuMC4x"); - - bool import_result = RunImportPkcs12Certificate(); - - ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; - EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_encoded_label); - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 0); - EXPECT_TRUE(KeyImportDone()); - EXPECT_TRUE(import_result); -} - -// There is one certificate with the same subject, but GetLabel for it returns -// empty string. Import will be successful with the cert's nickname. -TEST_F(ChapsUtilPKCS12ImportTest, GetLabelReturnsEmptyPKCS12ImportSuccess) { - fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; - fake_pkcs12_reader_.get_label_override_ = true; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 2); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_TRUE(KeyImportDone()); - EXPECT_TRUE(import_result); -} - -// No certificate with the same subject exists, GetLabel() for current cert -// fails, import will be successful with default label. -TEST_F(ChapsUtilPKCS12ImportTest, GetLabelFailedPKCS12ImportSuccess) { - fake_pkcs12_reader_.get_label_status_ = - Pkcs12ReaderStatusCode::kPkcs12LabelCreationFailed; - - bool import_result = RunImportPkcs12Certificate(); - - ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; - EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), default_encoded_label); - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_TRUE(KeyImportDone()); - EXPECT_TRUE(import_result); -} - -// No certificate with the same subject in slot, GetLabel() for the current cert -// returns empty string. Import will be successful with default label. -TEST_F(ChapsUtilPKCS12ImportTest, GetLabelReturnEmptyPKCS12ImportSuccess) { - fake_pkcs12_reader_.get_label_override_ = true; - - bool import_result = RunImportPkcs12Certificate(); - - ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; - EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), default_encoded_label); - - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_TRUE(KeyImportDone()); - EXPECT_TRUE(import_result); -} - -// No certificate with same subject exists, MakeNicknameUnique() fails. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, MakeNicknameUniqueFailedPKCS12ImportFailed) { - // Setting is_certs_nickname_used = true will lead to fail of making label - // unique, it will increase counter to 100 and at the end return - // Pkcs12ReaderStatusCode::kReachedMaxAttemptForUniqueness. - fake_pkcs12_reader_.is_certs_nickname_used_ = true; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 100); - - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// No certificate with same subject exists, MakeNicknameUnique() is called, but -// isCertsWithNicknamesInSlot is failing. -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, CertsSearchInSlotFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.is_certs_with_nickname_in_slot_status_ = - Pkcs12ReaderStatusCode::kPkcs12MissedNickname; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// 20 certificates with same subject already exists in slot, import is -// successful. Cert nicknames in slot will be 'testusercert', -// 'testusercert 1', ..., 'testusercert 19'. -TEST_F(ChapsUtilPKCS12ImportTest, CertsSearchInSlot20TimesPKCS12ImportFailed) { - fake_pkcs12_reader_.is_certs_with_nickname_in_slots_override_ = 20; - fake_pkcs12_reader_.is_certs_nickname_used_ = true; - // python print(base64.b64encode("testusercert 20".encode('utf-8'))) - auto expected_encoded_label = base::Base64Decode("dGVzdHVzZXJjZXJ0IDIw"); - - bool import_result = RunImportPkcs12Certificate(); - ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; - - EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_encoded_label); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 21); - EXPECT_TRUE(import_result); - EXPECT_TRUE(KeyImportDone()); -} - -// IsCertInSlot() failed, cert will not be installed in case of error. -// Import will fail because there are no certificates to be installed -TEST_F(ChapsUtilPKCS12ImportTest, IsCertInSlotFailedImportFailed) { - fake_pkcs12_reader_.is_cert_in_slot_status_ = - Pkcs12ReaderStatusCode::kCertificateDataMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.is_cert_in_slot_called_, 1); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// IsCertInSlot() has found already installed cert in slot. -// Import will fail because there are no certificates to be installed. -TEST_F(ChapsUtilPKCS12ImportTest, IsCertInSlotTrueImportFailed) { - fake_pkcs12_reader_.is_cert_in_slot_override_ = true; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.is_cert_in_slot_called_, 1); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// IsCertInSlot() did not find installed cert in the slot. -// Import will succeed. -TEST_F(ChapsUtilPKCS12ImportTest, IsCertInSlotFalseImportSucc) { - fake_pkcs12_reader_.is_cert_in_slot_override_ = false; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.is_cert_in_slot_called_, 1); - EXPECT_TRUE(import_result); - EXPECT_TRUE(KeyImportDone()); -} - -// GetScopedCert() fails in CanFindInstalledKey(). -// Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, GetScopedCertFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.get_der_encoded_cert_status_ = - Pkcs12ReaderStatusCode::kPkcs12CertDerMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.get_der_encode_cert_called_, 1); - EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); -} - -// DoesKeyForCertExist() fails inside of CanFindInstalledKey() -// for kPlainType type of cert. Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, - FindPrivateKeyFromCertFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.find_key_by_cert_status_ = - Pkcs12ReaderStatusCode::kMissedSlotInfo; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); - EXPECT_TRUE(CertImportNeverDone()); -} - -// Private key is found by kPlainType cert inside of CanFindInstalledKey(). -// Keys import will not happen, but cert will be imported. -TEST_F(ChapsUtilPKCS12ImportTest, FindPrivateKeyFromCertSuccPKCS12ImportSucc) { - fake_pkcs12_reader_.find_key_by_cert_status_ = - Pkcs12ReaderStatusCode::kSuccess; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); - EXPECT_TRUE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); - EXPECT_TRUE(CertImportDone()); -} - -// DoesKeyForCertExist() fails inside of CanFindInstalledKey() -// for kDerType type of cert. Import will fail. -TEST_F(ChapsUtilPKCS12ImportTest, FindKeyByDERCertFailedPKCS12ImportFailed) { - fake_pkcs12_reader_.find_key_by_cert_status_ = - Pkcs12ReaderStatusCode::kKeyDataMissed; - fake_pkcs12_reader_.find_key_by_der_cert_status_ = - Pkcs12ReaderStatusCode::kMissedSlotInfo; - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 2); - EXPECT_FALSE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); - EXPECT_TRUE(CertImportNeverDone()); -} - -// Private key is found by kDerType cert inside of CanFindInstalledKey(). -// Keys import will not happen, but cert will be imported. -TEST_F(ChapsUtilPKCS12ImportTest, FindKeyByDERCertSuccPKCS12ImportSucc) { - fake_pkcs12_reader_.find_key_by_cert_status_ = - Pkcs12ReaderStatusCode::kKeyDataMissed; - fake_pkcs12_reader_.find_key_by_der_cert_status_ = - Pkcs12ReaderStatusCode::kSuccess; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 2); - EXPECT_TRUE(import_result); - EXPECT_TRUE(KeyImportNeverDone()); - EXPECT_TRUE(CertImportDone()); -} - -// Private key is not installed. -// Keys will be imported, cert will be imported. -TEST_F(ChapsUtilPKCS12ImportTest, KeyNotInstalledPKCS12ImportSucc) { - fake_pkcs12_reader_.find_key_by_cert_status_ = - Pkcs12ReaderStatusCode::kKeyDataMissed; - fake_pkcs12_reader_.find_key_by_der_cert_status_ = - Pkcs12ReaderStatusCode::kKeyDataMissed; - - bool import_result = RunImportPkcs12Certificate(); - - EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 2); - EXPECT_TRUE(import_result); - EXPECT_TRUE(KeyImportDone()); - EXPECT_TRUE(CertImportDone()); -} - } // namespace } // namespace chromeos
diff --git a/chromeos/ash/components/chaps_util/test_util.cc b/chromeos/ash/components/chaps_util/test_util.cc index 8699dc01..2c3f0284 100644 --- a/chromeos/ash/components/chaps_util/test_util.cc +++ b/chromeos/ash/components/chaps_util/test_util.cc
@@ -40,15 +40,6 @@ return true; } -// TODO(olsa): Extend this initial implementation with more logic. -bool FakeChapsUtil::ImportPkcs12Certificate( - PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - bool is_software_backed) { - return true; -} - ScopedChapsUtilOverride::ScopedChapsUtilOverride() { ChapsUtil::SetFactoryForTesting(base::BindRepeating( &ScopedChapsUtilOverride::CreateChapsUtil, base::Unretained(this)));
diff --git a/chromeos/ash/components/chaps_util/test_util.h b/chromeos/ash/components/chaps_util/test_util.h index 7e1bcc3..9a1286c 100644 --- a/chromeos/ash/components/chaps_util/test_util.h +++ b/chromeos/ash/components/chaps_util/test_util.h
@@ -34,11 +34,6 @@ crypto::ScopedSECKEYPublicKey* out_public_key, crypto::ScopedSECKEYPrivateKey* out_private_key) override; - bool ImportPkcs12Certificate(PK11SlotInfo* slot, - const std::vector<uint8_t>& pkcs12_data, - const std::string& password, - bool is_software_backed) override; - private: OnKeyGenerated on_key_generated_; };
diff --git a/chromeos/ash/components/cryptohome/BUILD.gn b/chromeos/ash/components/cryptohome/BUILD.gn index c89c148..46b1f675 100644 --- a/chromeos/ash/components/cryptohome/BUILD.gn +++ b/chromeos/ash/components/cryptohome/BUILD.gn
@@ -11,7 +11,6 @@ component("cryptohome") { defines = [ "IS_CHROMEOS_ASH_COMPONENTS_CRYPTOHOME_IMPL" ] deps = [ - ":public", "//base", "//chromeos/ash/components/dbus/constants", "//chromeos/ash/components/dbus/cryptohome", @@ -36,8 +35,6 @@ "cryptohome_parameters.h", "cryptohome_util.cc", "cryptohome_util.h", - "error_util.cc", - "error_util.h", "system_salt_getter.cc", "system_salt_getter.h", "userdataauth_util.cc", @@ -45,7 +42,8 @@ ] } -source_set("public") { +component("public") { + defines = [ "IS_CHROMEOS_ASH_COMPONENTS_CRYPTOHOME_IMPL" ] deps = [ "//base", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", @@ -53,7 +51,10 @@ sources = [ "common_types.h", "constants.h", + "error_types.cc", "error_types.h", + "error_util.cc", + "error_util.h", ] }
diff --git a/chromeos/ash/components/cryptohome/error_types.cc b/chromeos/ash/components/cryptohome/error_types.cc new file mode 100644 index 0000000..c7ffffc --- /dev/null +++ b/chromeos/ash/components/cryptohome/error_types.cc
@@ -0,0 +1,55 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/cryptohome/error_types.h" +#include "base/strings/string_number_conversions.h" + +namespace cryptohome { + +ErrorWrapper::ErrorWrapper( + ::user_data_auth::CryptohomeErrorCode code, + std::optional<::user_data_auth::CryptohomeErrorInfo> info) + : code_(code), info_(info) {} + +ErrorWrapper::ErrorWrapper(const ErrorWrapper& other) + : ErrorWrapper(other.code(), other.info()) {} + +ErrorWrapper::~ErrorWrapper() {} + +ErrorWrapper ErrorWrapper::CreateFrom( + ::user_data_auth::CryptohomeErrorCode code, + ::user_data_auth::CryptohomeErrorInfo info) { + return ErrorWrapper(code, info); +} + +ErrorWrapper ErrorWrapper::CreateFromErrorCodeOnly( + ::user_data_auth::CryptohomeErrorCode code) { + return ErrorWrapper(code, std::nullopt); +} + +std::ostream& operator<<(std::ostream& os, ErrorWrapper error) { + os << "code=" << error.code() << " "; + auto info = error.info(); + if (info.has_value()) { + std::string possible_actions; + for (int i = 0; i < info->possible_actions_size(); i++) { + if (i != 0) { + possible_actions += ","; + } + possible_actions += + base::NumberToString(static_cast<int>(info->possible_actions(i))); + } + + os << "error_id=" << info->error_id(); + os << " primary_action=" + + base::NumberToString(static_cast<int>(info->primary_action())); + os << " possible_actions=" + possible_actions; + } else { + os << "info=nullopt"; + } + + return os; +} + +} // namespace cryptohome
diff --git a/chromeos/ash/components/cryptohome/error_types.h b/chromeos/ash/components/cryptohome/error_types.h index 60eed112..abdcbad 100644 --- a/chromeos/ash/components/cryptohome/error_types.h +++ b/chromeos/ash/components/cryptohome/error_types.h
@@ -5,13 +5,52 @@ #ifndef CHROMEOS_ASH_COMPONENTS_CRYPTOHOME_ERROR_TYPES_H_ #define CHROMEOS_ASH_COMPONENTS_CRYPTOHOME_ERROR_TYPES_H_ +#include "base/component_export.h" #include "chromeos/ash/components/dbus/cryptohome/UserDataAuth.pb.h" namespace cryptohome { -// Type alias that allows to change implementation details of error -// passing without affecting intermediate layers. -using ErrorWrapper = user_data_auth::CryptohomeErrorCode; +class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) ErrorWrapper { + public: + ErrorWrapper(const ErrorWrapper& other); + + ~ErrorWrapper(); + + ::user_data_auth::CryptohomeErrorCode code() const { return code_; } + + std::optional<::user_data_auth::CryptohomeErrorInfo> info() const { + return info_; + } + + static ErrorWrapper success() { + ::user_data_auth::CryptohomeErrorInfo info; + info.set_primary_action(::user_data_auth::PrimaryAction::PRIMARY_NO_ERROR); + return ErrorWrapper( + ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET, info); + } + + // Creates an ErrorWrapper with both legacy CryptohomeErrorCode and the new + // CryptohomeErrorInfo. This should be used if possible. + static ErrorWrapper CreateFrom(::user_data_auth::CryptohomeErrorCode code, + ::user_data_auth::CryptohomeErrorInfo info); + // Creates an ErrorWrapper with only the legacy CryptohomeErrorCode. This is + // only used during the migration and will be removed in the future. + static ErrorWrapper CreateFromErrorCodeOnly( + ::user_data_auth::CryptohomeErrorCode code); + + private: + ErrorWrapper(::user_data_auth::CryptohomeErrorCode code, + std::optional<::user_data_auth::CryptohomeErrorInfo> info); + + // code_ is the legacy CryptohomeErrorCode. + ::user_data_auth::CryptohomeErrorCode code_; + + // info_ is the new way to represent Cryptohome Error. + std::optional<::user_data_auth::CryptohomeErrorInfo> info_; +}; + +COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) +std::ostream& operator<<(std::ostream& os, ErrorWrapper error); } // namespace cryptohome
diff --git a/chromeos/ash/components/cryptohome/error_util.cc b/chromeos/ash/components/cryptohome/error_util.cc index cd771aba..dcdab81 100644 --- a/chromeos/ash/components/cryptohome/error_util.cc +++ b/chromeos/ash/components/cryptohome/error_util.cc
@@ -10,12 +10,12 @@ namespace cryptohome { bool HasError(ErrorWrapper error) { - return error != ::user_data_auth::CRYPTOHOME_ERROR_NOT_SET; + return error.code() != ::user_data_auth::CRYPTOHOME_ERROR_NOT_SET; } bool ErrorMatches(ErrorWrapper value, ::user_data_auth::CryptohomeErrorCode error_code) { - return value == error_code; + return value.code() == error_code; } } // namespace cryptohome
diff --git a/chromeos/ash/components/cryptohome/userdataauth_util.cc b/chromeos/ash/components/cryptohome/userdataauth_util.cc index 862e661..a236d6a5 100644 --- a/chromeos/ash/components/cryptohome/userdataauth_util.cc +++ b/chromeos/ash/components/cryptohome/userdataauth_util.cc
@@ -37,12 +37,14 @@ } template <typename ReplyType> -CryptohomeErrorCode ReplyToCryptohomeError( +cryptohome::ErrorWrapper ReplyToCryptohomeError( const std::optional<ReplyType>& reply) { if (IsEmpty(reply)) { - return CRYPTOHOME_ERROR_MOUNT_FATAL; + return cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CRYPTOHOME_ERROR_MOUNT_FATAL); } - return reply->error(); + return cryptohome::ErrorWrapper::CreateFrom(reply->error(), + reply->error_info()); } // Instantiate ReplyToMountError and export them for types actually used. @@ -52,67 +54,67 @@ cryptohome::MountError ReplyToMountError(const std::optional<UnmountReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<StartAuthSessionReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<AuthenticateAuthFactorReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<AddAuthFactorReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<UnmountReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<RemoveReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<CreatePersistentUserReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<RestoreDeviceKeyReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<PrepareGuestVaultReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<PrepareEphemeralVaultReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<PreparePersistentVaultReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<PrepareVaultForMigrationReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<ListAuthFactorsReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<RemoveAuthFactorReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<UpdateAuthFactorReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<GetAuthSessionStatusReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<ExtendAuthSessionReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<InvalidateAuthSessionReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<PrepareAuthFactorReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<TerminateAuthFactorReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<GetRecoveryRequestReply>&); template COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) - CryptohomeErrorCode + cryptohome::ErrorWrapper ReplyToCryptohomeError(const std::optional<StartMigrateToDircryptoReply>&); int64_t AccountDiskUsageReplyToUsageSize(
diff --git a/chromeos/ash/components/dbus/userdataauth/DEPS b/chromeos/ash/components/dbus/userdataauth/DEPS index f4dc078..209b9c3c 100644 --- a/chromeos/ash/components/dbus/userdataauth/DEPS +++ b/chromeos/ash/components/dbus/userdataauth/DEPS
@@ -2,4 +2,5 @@ "+third_party/protobuf/src/google/protobuf", "+chromeos/ash/components/cryptohome/constants.h", "+chromeos/ash/components/cryptohome/error_types.h", + "+chromeos/ash/components/cryptohome/error_util.h", ]
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.cc index 7821ea64..0f1dccd 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.cc
@@ -7,6 +7,7 @@ #include "base/location.h" #include "base/notreached.h" #include "base/task/single_thread_task_runner.h" +#include "chromeos/ash/components/cryptohome/error_util.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" namespace ash { @@ -59,9 +60,8 @@ const ::user_data_auth::LockToSingleUserMountUntilRebootRequest& request, LockToSingleUserMountUntilRebootCallback callback) { ::user_data_auth::LockToSingleUserMountUntilRebootReply reply; - if (cryptohome_error_ == - ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(cryptohome_error_); + if (cryptohome_error_ == ::user_data_auth::CRYPTOHOME_ERROR_NOT_SET) { + reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_NOT_SET); is_device_locked_to_single_user_ = true; } else { reply.set_error(::user_data_auth::CryptohomeErrorCode::
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h b/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h index 72dee133..2c31fcc 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h +++ b/chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h
@@ -77,7 +77,7 @@ } // Sets the CryptohomeError value to return. - void set_cryptohome_error(::cryptohome::ErrorWrapper error) { + void set_cryptohome_error(::user_data_auth::CryptohomeErrorCode error) { cryptohome_error_ = error; } @@ -99,8 +99,8 @@ chromeos::DBusMethodCallback<ReplyType> callback); // The next error code to return for various functions. - ::cryptohome::ErrorWrapper cryptohome_error_ = - ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + ::user_data_auth::CryptohomeErrorCode cryptohome_error_ = + ::user_data_auth::CRYPTOHOME_ERROR_NOT_SET; // The system salt to return. std::vector<uint8_t> system_salt_{GetStubSystemSalt()};
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc index 77ec84a..a61c259 100644 --- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
@@ -22,6 +22,7 @@ #include "base/threading/thread_restrictions.h" #include "base/time/time.h" #include "chromeos/ash/components/cryptohome/constants.h" +#include "chromeos/ash/components/cryptohome/error_util.h" #include "chromeos/ash/components/dbus/cryptohome/UserDataAuth.pb.h" #include "chromeos/ash/components/dbus/cryptohome/recoverable_key_store.pb.h" #include "chromeos/ash/components/dbus/cryptohome/rpc.pb.h" @@ -83,6 +84,11 @@ const std::string kCryptohomeRecoveryKeyLabel = "recovery"; const std::string kCryptohomeLocalPasswordKeyLabel = "local-password"; +template <typename ReplyType> +void SetErrorWrapperToReply(ReplyType& reply, cryptohome::ErrorWrapper error) { + reply.set_error(error.code()); +} + } // namespace struct FakeUserDataAuthClient::UserCryptohomeState { @@ -636,7 +642,7 @@ void FakeUserDataAuthClient::TestApi::SetNextOperationError( Operation operation, - ::user_data_auth::CryptohomeErrorCode error) { + cryptohome::ErrorWrapper error) { FakeUserDataAuthClient::Get()->SetNextOperationError(operation, error); } @@ -717,7 +723,9 @@ const auto user_it = users_.find(account_id); if (user_it == users_.end()) { - reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + ::user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)); return; } @@ -801,8 +809,8 @@ RememberRequest<Operation::kStartAuthSession>(request); if (auto error = TakeOperationError(Operation::kStartAuthSession); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } @@ -879,15 +887,17 @@ RememberRequest<Operation::kListAuthFactors>(request); if (auto error = TakeOperationError(Operation::kListAuthFactors); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } const auto user_it = users_.find(request.account_id()); const bool user_exists = user_it != std::end(users_); if (!user_exists) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)); return; } @@ -943,8 +953,8 @@ RememberRequest<Operation::kPrepareGuestVault>(request); if (auto error = TakeOperationError(Operation::kPrepareGuestVault); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } @@ -963,8 +973,8 @@ RememberRequest<Operation::kPrepareEphemeralVault>(request); if (auto error = TakeOperationError(Operation::kPrepareEphemeralVault); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } @@ -972,13 +982,17 @@ if (session_it == auth_sessions_.end()) { LOG(ERROR) << "AuthSession not found"; reply.set_sanitized_username(std::string()); - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } AuthSessionData& auth_session = session_it->second; if (!auth_session.ephemeral) { LOG(ERROR) << "Non-ephemeral AuthSession used with PrepareEphemeralVault"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT)); return; } cryptohome::AccountIdentifier account = auth_session.account; @@ -986,7 +1000,9 @@ // It authenticates session instead. if (auth_session.authenticated) { LOG(ERROR) << "AuthSession is authenticated"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT)); return; } auth_session.authenticated = true; @@ -1021,8 +1037,8 @@ RememberRequest<Operation::kCreatePersistentUser>(request); if (auto error = TakeOperationError(Operation::kCreatePersistentUser); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } @@ -1030,14 +1046,18 @@ if (session_it == auth_sessions_.end()) { LOG(ERROR) << "AuthSession not found"; reply.set_sanitized_username(std::string()); - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } AuthSessionData& auth_session = session_it->second; if (auth_session.ephemeral) { LOG(ERROR) << "Ephemeral AuthSession used with CreatePersistentUser"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT)); return; } @@ -1071,29 +1091,33 @@ RememberRequest<Operation::kRestoreDeviceKey>(request); if (auto error = TakeOperationError(Operation::kRestoreDeviceKey); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + cryptohome::ErrorWrapper error = cryptohome::ErrorWrapper::success(); auto* authenticated_auth_session = GetAuthenticatedAuthSession(request.auth_session_id(), &error); if (authenticated_auth_session == nullptr) { - reply.set_error(error); + SetErrorWrapperToReply(reply, error); return; } if (authenticated_auth_session->ephemeral) { LOG(ERROR) << "Ephemeral AuthSession used with RestoreDeviceKey"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT)); return; } const auto user_it = users_.find(authenticated_auth_session->account); if (user_it == std::end(users_)) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)); return; } @@ -1113,29 +1137,33 @@ RememberRequest<Operation::kPreparePersistentVault>(request); if (auto error = TakeOperationError(Operation::kPreparePersistentVault); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + auto error = cryptohome::ErrorWrapper::success(); auto* authenticated_auth_session = GetAuthenticatedAuthSession(request.auth_session_id(), &error); if (authenticated_auth_session == nullptr) { - reply.set_error(error); + SetErrorWrapperToReply(reply, error); return; } if (authenticated_auth_session->ephemeral) { LOG(ERROR) << "Ephemeral AuthSession used with PreparePersistentVault"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT)); return; } const auto user_it = users_.find(authenticated_auth_session->account); if (user_it == std::end(users_)) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)); return; } @@ -1166,22 +1194,24 @@ RememberRequest<Operation::kPrepareVaultForMigration>(request); if (auto error = TakeOperationError(Operation::kPrepareVaultForMigration); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + auto error = cryptohome::ErrorWrapper::success(); auto* authenticated_auth_session = GetAuthenticatedAuthSession(request.auth_session_id(), &error); if (authenticated_auth_session == nullptr) { - reply.set_error(error); + SetErrorWrapperToReply(reply, error); return; } if (!users_.contains(authenticated_auth_session->account)) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)); return; } } @@ -1195,7 +1225,9 @@ auto auth_session = auth_sessions_.find(request.auth_session_id()); if (auth_session == auth_sessions_.end()) { LOG(ERROR) << "AuthSession not found"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } @@ -1207,10 +1239,10 @@ ExtendAuthSessionCallback callback) { ::user_data_auth::ExtendAuthSessionReply reply; ReplyOnReturn auto_reply(&reply, std::move(callback)); - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + auto error = cryptohome::ErrorWrapper::success(); auto* session_data = GetAuthenticatedAuthSession(request.auth_session_id(), &error); - reply.set_error(error); + SetErrorWrapperToReply(reply, error); if (session_data) { auth_sessions_.find(request.auth_session_id())->second.lifetime = base::Time::Now() + base::Seconds(request.extension_duration()); @@ -1225,16 +1257,16 @@ RememberRequest<Operation::kAddAuthFactor>(request); if (auto error = TakeOperationError(Operation::kAddAuthFactor); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + auto error = cryptohome::ErrorWrapper::success(); auto* session = GetAuthenticatedAuthSession(request.auth_session_id(), &error); if (session == nullptr) { - reply.set_error(error); + SetErrorWrapperToReply(reply, error); return; } @@ -1258,15 +1290,17 @@ RememberRequest<Operation::kAuthenticateAuthFactor>(request); if (auto error = TakeOperationError(Operation::kAuthenticateAuthFactor); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } const auto session_it = auth_sessions_.find(request.auth_session_id()); if (session_it == auth_sessions_.end()) { LOG(ERROR) << "AuthSession not found"; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } auto& session = session_it->second; @@ -1281,7 +1315,9 @@ const auto factor_it = user_state.auth_factors.find(label); if (factor_it == user_state.auth_factors.end()) { LOG(ERROR) << "Factor not found: " << label; - reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + ::user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)); return; } const FakeAuthFactor& factor = factor_it->second; @@ -1290,12 +1326,15 @@ if (!AuthInputMatchesFakeFactorType(auth_input, factor)) { LOG(ERROR) << "Auth input does not match factor type"; - reply.set_error(::user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + ::user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)); return; } - // Factor-specific verification logic. Will set the `error` field in the - // reply if a check didn't pass. + // Factor-specific verification logic. Will set the result_error variable + // variable if a check didn't pass. + cryptohome::ErrorWrapper result_error = cryptohome::ErrorWrapper::success(); absl::visit( Overload<void>( [&](const PasswordFactor& password_factor) { @@ -1303,7 +1342,7 @@ if (enable_auth_check_ && password_input.secret() != password_factor.password) { - reply.set_error( + result_error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( ::user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); return; } @@ -1312,13 +1351,13 @@ const auto& pin_input = auth_input.pin_input(); if (enable_auth_check_ && pin_input.secret() != pin_factor.pin) { - reply.set_error( + result_error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( ::user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); return; } if (pin_factor.locked) { - reply.set_error( + result_error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( ::user_data_auth::CRYPTOHOME_ERROR_TPM_DEFEND_LOCK); return; } @@ -1328,13 +1367,13 @@ if (recovery_input.epoch_response().empty()) { LOG(ERROR) << "Missing epoch response"; - reply.set_error( + result_error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( ::user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); return; } if (recovery_input.recovery_response().empty()) { LOG(ERROR) << "Missing recovery response"; - reply.set_error( + result_error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( ::user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); return; } @@ -1345,7 +1384,8 @@ }), factor); - if (reply.error() != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { + if (cryptohome::HasError(result_error)) { + SetErrorWrapperToReply(reply, result_error); return; } @@ -1372,15 +1412,15 @@ RememberRequest<Operation::kUpdateAuthFactor>(request); if (auto error = TakeOperationError(Operation::kUpdateAuthFactor); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + auto error = cryptohome::ErrorWrapper::success(); auto* session = GetAuthenticatedAuthSession(request.auth_session_id(), &error); - reply.set_error(error); + SetErrorWrapperToReply(reply, error); if (session == nullptr) { return; } @@ -1404,10 +1444,10 @@ ::user_data_auth::RemoveAuthFactorReply reply; ReplyOnReturn auto_reply(&reply, std::move(callback)); - auto error = CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + auto error = cryptohome::ErrorWrapper::success(); auto* session = GetAuthenticatedAuthSession(request.auth_session_id(), &error); - reply.set_error(error); + SetErrorWrapperToReply(reply, error); if (session == nullptr) { return; } @@ -1420,7 +1460,9 @@ bool erased = user_state.auth_factors.erase(label) > 0; if (!erased) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_KEY_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_KEY_NOT_FOUND)); } } @@ -1435,7 +1477,9 @@ const ::user_data_auth::GetRecoveryRequestRequest& request, GetRecoveryRequestCallback callback) { ::user_data_auth::GetRecoveryRequestReply reply; - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET); + SetErrorWrapperToReply(reply, + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET)); reply.set_recovery_request("fake-recovery-request"); ReplyOnReturn auto_reply(&reply, std::move(callback)); } @@ -1450,7 +1494,9 @@ auto auth_session = auth_sessions_.find(auth_session_id); // Check if the token refers to a valid AuthSession. if (auth_session == auth_sessions_.end()) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } if (!auth_session->second.authenticated) { @@ -1482,7 +1528,9 @@ auto auth_session = auth_sessions_.find(auth_session_id); // Check if the token refers to a valid AuthSession. if (auth_session == auth_sessions_.end()) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } @@ -1507,7 +1555,9 @@ auto auth_session = auth_sessions_.find(auth_session_id); // Check if the token refers to a valid AuthSession. if (auth_session == auth_sessions_.end()) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN)); return; } @@ -1598,17 +1648,18 @@ void FakeUserDataAuthClient::SetNextOperationError( FakeUserDataAuthClient::Operation operation, - CryptohomeErrorCode error) { - operation_errors_[operation] = error; + cryptohome::ErrorWrapper error) { + operation_errors_.insert_or_assign(operation, std::move(error)); + // operation_errors_[operation] = std::move(error); } -CryptohomeErrorCode FakeUserDataAuthClient::TakeOperationError( +cryptohome::ErrorWrapper FakeUserDataAuthClient::TakeOperationError( Operation operation) { const auto op_error = operation_errors_.find(operation); if (op_error == std::end(operation_errors_)) { - return CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET; + return cryptohome::ErrorWrapper::success(); } - CryptohomeErrorCode result = op_error->second; + cryptohome::ErrorWrapper result = op_error->second; operation_errors_.erase(op_error); return result; } @@ -1673,20 +1724,22 @@ const FakeUserDataAuthClient::AuthSessionData* FakeUserDataAuthClient::GetAuthenticatedAuthSession( const std::string& auth_session_id, - CryptohomeErrorCode* error) const { + cryptohome::ErrorWrapper* error) const { auto auth_session = auth_sessions_.find(auth_session_id); // Check if the token refers to a valid AuthSession. if (auth_session == auth_sessions_.end()) { LOG(ERROR) << "AuthSession not found"; - *error = CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN; + *error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN); return nullptr; } // Check if the AuthSession is properly authenticated. if (!auth_session->second.authenticated) { LOG(ERROR) << "AuthSession is not authenticated"; - *error = CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT; + *error = cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_INVALID_ARGUMENT); return nullptr; } @@ -1727,15 +1780,17 @@ RememberRequest<Operation::kGetRecoverableKeyStores>(request); if (auto error = TakeOperationError(Operation::kGetRecoverableKeyStores); - error != CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) { - reply.set_error(error); + cryptohome::HasError(error)) { + SetErrorWrapperToReply(reply, error); return; } const auto user_it = users_.find(request.account_id()); const bool user_exists = user_it != std::end(users_); if (!user_exists) { - reply.set_error(CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + SetErrorWrapperToReply( + reply, cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + CryptohomeErrorCode::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)); return; }
diff --git a/chromeos/ash/components/login/auth/BUILD.gn b/chromeos/ash/components/login/auth/BUILD.gn index de50349..e6cbdb3 100644 --- a/chromeos/ash/components/login/auth/BUILD.gn +++ b/chromeos/ash/components/login/auth/BUILD.gn
@@ -19,6 +19,7 @@ "//base", "//base:i18n", "//chromeos/ash/components/cryptohome", + "//chromeos/ash/components/cryptohome:public", "//chromeos/ash/components/dbus/constants", "//chromeos/ash/components/dbus/cryptohome", "//chromeos/ash/components/dbus/cryptohome:cryptohome_proto",
diff --git a/chromeos/ash/components/login/auth/auth_factor_editor.cc b/chromeos/ash/components/login/auth/auth_factor_editor.cc index 9ec61098..ff031ca 100644 --- a/chromeos/ash/components/login/auth/auth_factor_editor.cc +++ b/chromeos/ash/components/login/auth/auth_factor_editor.cc
@@ -71,7 +71,8 @@ LOGIN_LOG(ERROR) << "Adding Kiosk key while one already exists"; std::move(callback).Run( std::move(context), - AuthenticationError{user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED}); + AuthenticationError{cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED)}); return; }
diff --git a/chromeos/ash/components/login/auth/auth_performer.cc b/chromeos/ash/components/login/auth/auth_performer.cc index b60379e..2bdf4a0 100644 --- a/chromeos/ash/components/login/auth/auth_performer.cc +++ b/chromeos/ash/components/login/auth/auth_performer.cc
@@ -221,7 +221,8 @@ LOGIN_LOG(ERROR) << "Could not find Password key"; std::move(callback).Run( std::move(context), - AuthenticationError{user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + AuthenticationError{cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)}); return; } key->SetLabel(factor->ref().label().value()); @@ -323,7 +324,8 @@ << key_label; std::move(callback).Run( std::move(context), - AuthenticationError{user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + AuthenticationError{cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)}); return; } SystemSaltGetter::Get()->GetSystemSalt(base::BindOnce( @@ -363,7 +365,8 @@ LOGIN_LOG(ERROR) << "User does not have PIN as factor"; std::move(callback).Run( std::move(context), - AuthenticationError{user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + AuthenticationError{cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)}); return; } DCHECK_EQ(factor->ref().label().value(), kCryptohomePinLabel); @@ -391,7 +394,8 @@ LOGIN_LOG(ERROR) << "Could not find Kiosk key"; std::move(callback).Run( std::move(context), - AuthenticationError{user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + AuthenticationError{cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)}); return; } cryptohome::AuthFactorInput input(cryptohome::AuthFactorInput::Kiosk{});
diff --git a/chromeos/ash/components/login/auth/auth_session_authenticator.cc b/chromeos/ash/components/login/auth/auth_session_authenticator.cc index a4565ac..1b6d38e 100644 --- a/chromeos/ash/components/login/auth/auth_session_authenticator.cc +++ b/chromeos/ash/components/login/auth/auth_session_authenticator.cc
@@ -460,7 +460,8 @@ std::move(error_callback) .Run(std::move(context), AuthenticationError{ - user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND}); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)}); return; } DCHECK(user_exists && !ephemeral); @@ -523,7 +524,8 @@ std::move(error_callback) .Run(std::move(context), AuthenticationError{ - user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND}); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)}); return; } DCHECK(user_exists || ephemeral); @@ -859,129 +861,238 @@ AuthFailure::FailureReason default_error, AuthenticationError& error) { DCHECK_EQ(error.get_origin(), AuthenticationError::Origin::kCryptohome); - switch (error.get_cryptohome_code()) { - // Not an error: - case user_data_auth::CRYPTOHOME_ERROR_NOT_SET: - // Some errors need to be handled explicitly and can not be resolved to - // AuthFailure: - case user_data_auth::CRYPTOHOME_ERROR_MOUNT_OLD_ENCRYPTION: - case user_data_auth::CRYPTOHOME_ERROR_MOUNT_PREVIOUS_MIGRATION_INCOMPLETE: - case user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED: - case user_data_auth::CRYPTOHOME_REMOVE_CREDENTIALS_FAILED: - case user_data_auth::CRYPTOHOME_UPDATE_CREDENTIALS_FAILED: - case user_data_auth::CRYPTOHOME_ERROR_RECOVERY_TRANSIENT: - case user_data_auth::CRYPTOHOME_ERROR_RECOVERY_FATAL: - // Fatal errors that can not be handled gracefully: - case user_data_auth::CRYPTOHOME_ERROR_LOCKBOX_SIGNATURE_INVALID: - case user_data_auth::CRYPTOHOME_ERROR_LOCKBOX_CANNOT_SIGN: - case user_data_auth::CRYPTOHOME_ERROR_BOOT_ATTRIBUTE_NOT_FOUND: - case user_data_auth::CRYPTOHOME_ERROR_BOOT_ATTRIBUTES_CANNOT_SIGN: - case user_data_auth::CRYPTOHOME_ERROR_TPM_EK_NOT_AVAILABLE: - case user_data_auth::CRYPTOHOME_ERROR_ATTESTATION_NOT_READY: - case user_data_auth::CRYPTOHOME_ERROR_CANNOT_CONNECT_TO_CA: - case user_data_auth::CRYPTOHOME_ERROR_CA_REFUSED_ENROLLMENT: - case user_data_auth::CRYPTOHOME_ERROR_CA_REFUSED_CERTIFICATE: - case user_data_auth::CRYPTOHOME_ERROR_INTERNAL_ATTESTATION_ERROR: - case user_data_auth:: - CRYPTOHOME_ERROR_FIRMWARE_MANAGEMENT_PARAMETERS_INVALID: - case user_data_auth:: - CRYPTOHOME_ERROR_FIRMWARE_MANAGEMENT_PARAMETERS_CANNOT_STORE: - case user_data_auth:: - CRYPTOHOME_ERROR_FIRMWARE_MANAGEMENT_PARAMETERS_CANNOT_REMOVE: - case user_data_auth::CRYPTOHOME_ERROR_UPDATE_USER_ACTIVITY_TIMESTAMP_FAILED: - case user_data_auth::CRYPTOHOME_ERROR_FAILED_TO_EXTEND_PCR: - case user_data_auth::CRYPTOHOME_ERROR_FAILED_TO_READ_PCR: - case user_data_auth::CRYPTOHOME_ERROR_PCR_ALREADY_EXTENDED: - case user_data_auth::CRYPTOHOME_ERROR_FIDO_MAKE_CREDENTIAL_FAILED: - case user_data_auth::CRYPTOHOME_ERROR_FIDO_GET_ASSERTION_FAILED: - return false; + cryptohome::ErrorWrapper error_wrapper = error.get_cryptohome_error(); + if ( + // Not an error: + ErrorMatches(error_wrapper, user_data_auth::CRYPTOHOME_ERROR_NOT_SET) || + // Some errors need to be handled explicitly and can not be resolved to + // AuthFailure: + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_MOUNT_OLD_ENCRYPTION) || + ErrorMatches(error_wrapper, + user_data_auth:: + CRYPTOHOME_ERROR_MOUNT_PREVIOUS_MIGRATION_INCOMPLETE) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_REMOVE_CREDENTIALS_FAILED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_UPDATE_CREDENTIALS_FAILED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_RECOVERY_TRANSIENT) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_RECOVERY_FATAL) || - case user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND: - error.ResolveToFailure(AuthFailure::MISSING_CRYPTOHOME); - break; - case user_data_auth::CRYPTOHOME_ERROR_NOT_IMPLEMENTED: - case user_data_auth::CRYPTOHOME_ERROR_INVALID_ARGUMENT: - case user_data_auth::CRYPTOHOME_TOKEN_SERIALIZATION_FAILED: - // Fatal implementation errors - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_FINGERPRINT_ERROR_INTERNAL: - case user_data_auth::CRYPTOHOME_ERROR_FINGERPRINT_RETRY_REQUIRED: - case user_data_auth::CRYPTOHOME_ERROR_FINGERPRINT_DENIED: - // Fingerprint errors - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_MOUNT_FATAL: - case user_data_auth::CRYPTOHOME_ERROR_KEY_QUOTA_EXCEEDED: - case user_data_auth::CRYPTOHOME_ERROR_BACKING_STORE_FAILURE: - case user_data_auth::CRYPTOHOME_ERROR_INSTALL_ATTRIBUTES_FINALIZE_FAILED: - case user_data_auth::CRYPTOHOME_ERROR_INSTALL_ATTRIBUTES_GET_FAILED: - case user_data_auth::CRYPTOHOME_ERROR_INSTALL_ATTRIBUTES_SET_FAILED: - // Fatal system state errors - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_NOT_FOUND: - case user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND: - case user_data_auth::CRYPTOHOME_ERROR_MIGRATE_KEY_FAILED: - case user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED: + // Fatal errors that can not be handled gracefully: + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_LOCKBOX_SIGNATURE_INVALID) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_LOCKBOX_CANNOT_SIGN) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_BOOT_ATTRIBUTE_NOT_FOUND) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_BOOT_ATTRIBUTES_CANNOT_SIGN) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_TPM_EK_NOT_AVAILABLE) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_ATTESTATION_NOT_READY) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_CANNOT_CONNECT_TO_CA) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_CA_REFUSED_ENROLLMENT) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_CA_REFUSED_CERTIFICATE) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_INTERNAL_ATTESTATION_ERROR) || + ErrorMatches( + error_wrapper, + user_data_auth:: + CRYPTOHOME_ERROR_FIRMWARE_MANAGEMENT_PARAMETERS_INVALID) || + ErrorMatches( + error_wrapper, + user_data_auth:: + CRYPTOHOME_ERROR_FIRMWARE_MANAGEMENT_PARAMETERS_CANNOT_STORE) || + ErrorMatches( + error_wrapper, + user_data_auth:: + CRYPTOHOME_ERROR_FIRMWARE_MANAGEMENT_PARAMETERS_CANNOT_REMOVE) || + ErrorMatches( + error_wrapper, + user_data_auth:: + CRYPTOHOME_ERROR_UPDATE_USER_ACTIVITY_TIMESTAMP_FAILED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FAILED_TO_EXTEND_PCR) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FAILED_TO_READ_PCR) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_PCR_ALREADY_EXTENDED) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FIDO_MAKE_CREDENTIAL_FAILED) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FIDO_GET_ASSERTION_FAILED)) { + return false; + } - case user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_DENIED: - case user_data_auth::CRYPTOHOME_ERROR_KEY_LABEL_EXISTS: - case user_data_auth::CRYPTOHOME_ERROR_UPDATE_SIGNATURE_INVALID: - case user_data_auth::CRYPTOHOME_ERROR_UNKNOWN_LEGACY: - // Assumptions about key are not correct - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN: - case user_data_auth::CRYPTOHOME_ERROR_UNAUTHENTICATED_AUTH_SESSION: - // Auth session expired, might need to handle it separately later. - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_TPM_COMM_ERROR: - case user_data_auth::CRYPTOHOME_ERROR_TPM_NEEDS_REBOOT: - error.ResolveToFailure(AuthFailure::TPM_ERROR); - break; - case user_data_auth::CRYPTOHOME_ERROR_TPM_DEFEND_LOCK: - case user_data_auth::CRYPTOHOME_ERROR_CREDENTIAL_LOCKED: - // PIN is locked out, for now mark it as auth failure, and pin lockout - // would be detected by PinStorageCryptohome. - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_CREDENTIAL_EXPIRED: - // TODO(b/285459974): Decide how to deal with credential expired error - // from cryptohome. - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_MOUNT_MOUNT_POINT_BUSY: - // Assumption about system state is not correct - error.ResolveToFailure(default_error); - break; - case user_data_auth::CRYPTOHOME_ERROR_REMOVE_FAILED: - error.ResolveToFailure(AuthFailure::DATA_REMOVAL_FAILED); - break; - case user_data_auth::CRYPTOHOME_ERROR_TPM_UPDATE_REQUIRED: - error.ResolveToFailure(AuthFailure::TPM_UPDATE_REQUIRED); - break; - case user_data_auth::CRYPTOHOME_ERROR_VAULT_UNRECOVERABLE: - case user_data_auth::CRYPTOHOME_ERROR_UNUSABLE_VAULT: - error.ResolveToFailure(AuthFailure::UNRECOVERABLE_CRYPTOHOME); - break; - case user_data_auth::CryptohomeErrorCode_INT_MIN_SENTINEL_DO_NOT_USE_: - case user_data_auth::CryptohomeErrorCode_INT_MAX_SENTINEL_DO_NOT_USE_: - // Ignored - break; - default: + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND)) { + error.ResolveToFailure(AuthFailure::MISSING_CRYPTOHOME); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_NOT_IMPLEMENTED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_INVALID_ARGUMENT) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_TOKEN_SERIALIZATION_FAILED)) { + // Fatal implementation errors + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FINGERPRINT_ERROR_INTERNAL) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FINGERPRINT_RETRY_REQUIRED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_FINGERPRINT_DENIED)) { + // Fingerprint errors + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_MOUNT_FATAL) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_KEY_QUOTA_EXCEEDED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_BACKING_STORE_FAILURE) || + ErrorMatches(error_wrapper, + user_data_auth:: + CRYPTOHOME_ERROR_INSTALL_ATTRIBUTES_FINALIZE_FAILED) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_INSTALL_ATTRIBUTES_GET_FAILED) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_INSTALL_ATTRIBUTES_SET_FAILED)) { + // Fatal system state errors + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_NOT_FOUND) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_MIGRATE_KEY_FAILED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED) || + + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_DENIED) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_KEY_LABEL_EXISTS) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_UPDATE_SIGNATURE_INVALID) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_UNKNOWN_LEGACY)) { + // Assumptions about key are not correct + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_INVALID_AUTH_SESSION_TOKEN) || + ErrorMatches( + error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_UNAUTHENTICATED_AUTH_SESSION)) { + // Auth session expired, might need to handle it separately later. + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_TPM_COMM_ERROR) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_TPM_NEEDS_REBOOT)) { + error.ResolveToFailure(AuthFailure::TPM_ERROR); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_TPM_DEFEND_LOCK) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_CREDENTIAL_LOCKED)) { + // PIN is locked out, for now mark it as auth failure, and pin lockout + // would be detected by PinStorageCryptohome. + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_CREDENTIAL_EXPIRED)) { + // TODO(b/285459974): Decide how to deal with credential expired error + // from cryptohome. + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_MOUNT_MOUNT_POINT_BUSY)) { + // Assumption about system state is not correct + error.ResolveToFailure(default_error); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_REMOVE_FAILED)) { + error.ResolveToFailure(AuthFailure::DATA_REMOVAL_FAILED); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_TPM_UPDATE_REQUIRED)) { + error.ResolveToFailure(AuthFailure::TPM_UPDATE_REQUIRED); + return true; + } + + if (ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_VAULT_UNRECOVERABLE) || + ErrorMatches(error_wrapper, + user_data_auth::CRYPTOHOME_ERROR_UNUSABLE_VAULT)) { + error.ResolveToFailure(AuthFailure::UNRECOVERABLE_CRYPTOHOME); + return true; + } + + if (ErrorMatches( + error_wrapper, + user_data_auth::CryptohomeErrorCode_INT_MIN_SENTINEL_DO_NOT_USE_) || + ErrorMatches( + error_wrapper, + user_data_auth::CryptohomeErrorCode_INT_MAX_SENTINEL_DO_NOT_USE_)) { + // Ignored + return true; + } + // We need the default case here so that it is possible to add new // CryptohomeErrorCode, because CryptohomeErrorCode is defined in another // repo. // However, we should seek to handle all CryptohomeErrorCode and not let // any of them hit the default block. - NOTREACHED() << "Unhandled CryptohomeErrorCode in ProcessCryptohomeError" - ": " - << static_cast<int>(error.get_cryptohome_code()); - return false; - } - return true; + NOTREACHED() << "Unhandled CryptohomeError in ProcessCryptohomeError" + ": " + << error.get_cryptohome_error(); + return false; } void AuthSessionAuthenticator::ProcessCryptohomeError( @@ -992,10 +1103,11 @@ return; } DCHECK_EQ(error.get_origin(), AuthenticationError::Origin::kCryptohome); - DCHECK(cryptohome::HasError(error.get_cryptohome_code())); + DCHECK(cryptohome::HasError(error.get_cryptohome_error())); - if (error.get_cryptohome_code() == - user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED) { + if (cryptohome::ErrorMatches( + error.get_cryptohome_error(), + user_data_auth::CRYPTOHOME_ADD_CREDENTIALS_FAILED)) { // for now treat it as login failed: error.ResolveToFailure(default_error); NotifyFailure(error.get_resolved_failure(), std::move(context)); @@ -1019,7 +1131,7 @@ std::unique_ptr<UserContext> context, AuthenticationError error) { if (cryptohome::ErrorMatches( - error.get_cryptohome_code(), + error.get_cryptohome_error(), user_data_auth::CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED)) { LOGIN_LOG(EVENT) << "Password change detected"; NotifyOnlinePasswordUnusable(std::move(context), @@ -1045,10 +1157,10 @@ std::unique_ptr<UserContext> context, AuthenticationError error) { const bool migration_required = cryptohome::ErrorMatches( - error.get_cryptohome_code(), + error.get_cryptohome_error(), user_data_auth::CRYPTOHOME_ERROR_MOUNT_OLD_ENCRYPTION); const bool incomplete_migration = cryptohome::ErrorMatches( - error.get_cryptohome_code(), + error.get_cryptohome_error(), user_data_auth::CRYPTOHOME_ERROR_MOUNT_PREVIOUS_MIGRATION_INCOMPLETE); if (migration_required || incomplete_migration) { LOGIN_LOG(EVENT) << "Old encryption detected";
diff --git a/chromeos/ash/components/login/auth/public/BUILD.gn b/chromeos/ash/components/login/auth/public/BUILD.gn index 7e3099be..7357057d 100644 --- a/chromeos/ash/components/login/auth/public/BUILD.gn +++ b/chromeos/ash/components/login/auth/public/BUILD.gn
@@ -17,6 +17,7 @@ "//ash/constants", "//base", "//chromeos/ash/components/cryptohome", + "//chromeos/ash/components/cryptohome:public", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", "//components/account_id", "//components/prefs",
diff --git a/chromeos/ash/components/login/auth/public/authentication_error.cc b/chromeos/ash/components/login/auth/public/authentication_error.cc index dd0fd75f..06bd8cc 100644 --- a/chromeos/ash/components/login/auth/public/authentication_error.cc +++ b/chromeos/ash/components/login/auth/public/authentication_error.cc
@@ -9,16 +9,17 @@ namespace ash { -AuthenticationError::AuthenticationError( - user_data_auth::CryptohomeErrorCode cryptohome_code) - : origin_(Origin::kCryptohome), cryptohome_code_(cryptohome_code) {} +AuthenticationError::AuthenticationError(cryptohome::ErrorWrapper wrapper) + : origin_(Origin::kCryptohome), cryptohome_error_(wrapper) {} AuthenticationError::AuthenticationError( AuthFailure::FailureReason auth_failure_reason) : AuthenticationError(AuthFailure(auth_failure_reason)) {} AuthenticationError::AuthenticationError(AuthFailure auth_failure) - : origin_(Origin::kChrome), auth_failure_(std::move(auth_failure)) {} + : origin_(Origin::kChrome), + cryptohome_error_(cryptohome::ErrorWrapper::success()), + auth_failure_(std::move(auth_failure)) {} AuthenticationError::~AuthenticationError() = default;
diff --git a/chromeos/ash/components/login/auth/public/authentication_error.h b/chromeos/ash/components/login/auth/public/authentication_error.h index 6ed0967..c76b27bb 100644 --- a/chromeos/ash/components/login/auth/public/authentication_error.h +++ b/chromeos/ash/components/login/auth/public/authentication_error.h
@@ -23,7 +23,9 @@ // The error represents some erroneous state detected by the chrome. kChrome, }; - explicit AuthenticationError(::cryptohome::ErrorWrapper cryptohome_code); + // explicit AuthenticationError(::user_data_auth::CryptohomeErrorCode + // cryptohome_code); + explicit AuthenticationError(cryptohome::ErrorWrapper wrapper); explicit AuthenticationError(AuthFailure::FailureReason auth_failure_reason); explicit AuthenticationError(AuthFailure auth_failure); @@ -42,8 +44,16 @@ void ResolveToFailure(AuthFailure::FailureReason auth_failure_reason); - ::cryptohome::ErrorWrapper get_cryptohome_code() const { - return cryptohome_code_; + // CryptohomeErrorCode is the legacy error code and will be removed in the + // future. This function is kept here for compatibility during migration. + ::user_data_auth::CryptohomeErrorCode get_cryptohome_code() const { + return cryptohome_error_.code(); + } + + // ErrorWrapper holds the new CryptohomeErrorInfo structure for representing + // error. New code should use this instead. + cryptohome::ErrorWrapper get_cryptohome_error() const { + return cryptohome_error_; } std::string ToDebugString() const; @@ -51,7 +61,7 @@ private: Origin origin_; // Cryptohome-specific fields: - ::cryptohome::ErrorWrapper cryptohome_code_; + cryptohome::ErrorWrapper cryptohome_error_; // Mapping of the `error_code` to auth flow failure reason. AuthFailure auth_failure_{AuthFailure::NONE};
diff --git a/chromeos/ash/components/login/auth/public/operation_chain_runner_unittest.cc b/chromeos/ash/components/login/auth/public/operation_chain_runner_unittest.cc index 7d2a7f0..aff30c4 100644 --- a/chromeos/ash/components/login/auth/public/operation_chain_runner_unittest.cc +++ b/chromeos/ash/components/login/auth/public/operation_chain_runner_unittest.cc
@@ -55,7 +55,8 @@ std::move(callback).Run( std::move(context), AuthenticationError{ - user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)}); })); bool chain_finished = false; @@ -132,7 +133,8 @@ std::move(callback).Run( std::move(context), AuthenticationError{ - user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + cryptohome::ErrorWrapper::CreateFromErrorCodeOnly( + user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND)}); })); operations.push_back( base::BindLambdaForTesting([&](std::unique_ptr<UserContext> context,
diff --git a/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc b/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc index dab7dc1..75ea7ef 100644 --- a/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc +++ b/chromeos/ash/components/memory/userspace_swap/userfaultfd_unittest.cc
@@ -94,9 +94,8 @@ void* get() { return ptr_; } private: - // This field is not a raw_ptr<> because it always points to a mmap'd - // region of memory outside of the PA heap. Thus, there would be overhead - // involved with using a raw_ptr<> but no safety gains. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION void* ptr_ = nullptr; size_t len_ = 0; };
diff --git a/chromeos/ash/components/multidevice/fake_secure_message_delegate.h b/chromeos/ash/components/multidevice/fake_secure_message_delegate.h index 316159b..c156acc53 100644 --- a/chromeos/ash/components/multidevice/fake_secure_message_delegate.h +++ b/chromeos/ash/components/multidevice/fake_secure_message_delegate.h
@@ -7,7 +7,7 @@ #include <memory> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "chromeos/ash/components/multidevice/secure_message_delegate.h" #include "chromeos/ash/components/multidevice/secure_message_delegate_impl.h" @@ -71,9 +71,8 @@ // multidevice::SecureMessageDelegateImpl::Factory: std::unique_ptr<multidevice::SecureMessageDelegate> CreateInstance() override; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION multidevice::FakeSecureMessageDelegate* instance_ = nullptr; + raw_ptr<multidevice::FakeSecureMessageDelegate, DanglingUntriaged> instance_ = + nullptr; }; } // namespace ash::multidevice
diff --git a/chromeos/ash/components/osauth/impl/BUILD.gn b/chromeos/ash/components/osauth/impl/BUILD.gn index baddd727..69d8b6d 100644 --- a/chromeos/ash/components/osauth/impl/BUILD.gn +++ b/chromeos/ash/components/osauth/impl/BUILD.gn
@@ -16,6 +16,7 @@ "//ash/constants", "//base", "//chromeos/ash/components/cryptohome", + "//chromeos/ash/components/cryptohome:public", "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/early_prefs:reader", "//chromeos/ash/components/login/auth",
diff --git a/chromeos/ash/services/auth_factor_config/auth_factor_config.h b/chromeos/ash/services/auth_factor_config/auth_factor_config.h index 9419446bb..21501b3 100644 --- a/chromeos/ash/services/auth_factor_config/auth_factor_config.h +++ b/chromeos/ash/services/auth_factor_config/auth_factor_config.h
@@ -9,6 +9,7 @@ #include "base/containers/enum_set.h" #include "base/functional/callback_forward.h" +#include "base/memory/raw_ref.h" #include "chromeos/ash/components/login/auth/auth_factor_editor.h" #include "chromeos/ash/components/login/auth/public/authentication_error.h" #include "chromeos/ash/services/auth_factor_config/chrome_browser_delegates.h" @@ -33,19 +34,19 @@ // Injects a callback that gets invoked after knowledge factor // is added. void SetAddKnowledgeFactorCallback(base::OnceClosure callback) { - auth_factor_config_.SetAddKnowledgeFactorCallbackForTesting( + auth_factor_config_->SetAddKnowledgeFactorCallbackForTesting( std::move(callback)); } // Instructs AuthFactorConfig not to inform // UserDirectoryIntegrityManager about added factors. void SetSkipUserIntegrityNotification(bool skip_notification) { - auth_factor_config_.SetSkipUserIntegrityNotificationForTesting( + auth_factor_config_->SetSkipUserIntegrityNotificationForTesting( skip_notification); } private: - AuthFactorConfig& auth_factor_config_; + const raw_ref<AuthFactorConfig> auth_factor_config_; }; using AuthFactorSet = base::EnumSet<mojom::AuthFactor,
diff --git a/chromeos/ash/services/device_sync/device_sync_service_unittest.cc b/chromeos/ash/services/device_sync/device_sync_service_unittest.cc index e73f6ba..7ccf806 100644 --- a/chromeos/ash/services/device_sync/device_sync_service_unittest.cc +++ b/chromeos/ash/services/device_sync/device_sync_service_unittest.cc
@@ -13,7 +13,6 @@ #include "base/functional/callback.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/raw_ref.h" #include "base/memory/scoped_refptr.h" #include "base/no_destructor.h" @@ -671,9 +670,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSoftwareFeatureManager* instance_ = nullptr; + raw_ptr<FakeSoftwareFeatureManager, DanglingUntriaged> instance_ = nullptr; }; } // namespace
diff --git a/chromeos/ash/services/secure_channel/ble_connection_manager_impl_unittest.cc b/chromeos/ash/services/secure_channel/ble_connection_manager_impl_unittest.cc index 173b8ba9..77fad06a 100644 --- a/chromeos/ash/services/secure_channel/ble_connection_manager_impl_unittest.cc +++ b/chromeos/ash/services/secure_channel/ble_connection_manager_impl_unittest.cc
@@ -12,7 +12,6 @@ #include "base/containers/flat_set.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/task/sequenced_task_runner.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/simple_test_clock.h" @@ -174,10 +173,8 @@ raw_ptr<FakeWeaveClientConnectionFactory> fake_weave_client_connection_factory_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSecureChannelConnection* last_created_instance_ = - nullptr; + raw_ptr<FakeSecureChannelConnection, DanglingUntriaged> + last_created_instance_ = nullptr; }; class FakeAuthenticatedChannelFactory @@ -227,15 +224,12 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSecureChannelConnection* expected_fake_secure_channel_ = - nullptr; + raw_ptr<FakeSecureChannelConnection, DanglingUntriaged> + expected_fake_secure_channel_ = nullptr; bool expected_to_be_background_advertisement_ = false; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeAuthenticatedChannel* last_created_instance_ = nullptr; + raw_ptr<FakeAuthenticatedChannel, DanglingUntriaged> last_created_instance_ = + nullptr; }; } // namespace
diff --git a/chromeos/ash/services/secure_channel/nearby_connection_manager_impl_unittest.cc b/chromeos/ash/services/secure_channel/nearby_connection_manager_impl_unittest.cc index 6510eb41..cce6613 100644 --- a/chromeos/ash/services/secure_channel/nearby_connection_manager_impl_unittest.cc +++ b/chromeos/ash/services/secure_channel/nearby_connection_manager_impl_unittest.cc
@@ -6,7 +6,7 @@ #include <memory> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/test/task_environment.h" #include "chromeos/ash/components/multidevice/remote_device_test_util.h" #include "chromeos/ash/services/secure_channel/authenticated_channel_impl.h" @@ -47,9 +47,7 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeConnection* last_created_instance_ = nullptr; + raw_ptr<FakeConnection, DanglingUntriaged> last_created_instance_ = nullptr; }; class FakeSecureChannelFactory : public SecureChannel::Factory { @@ -73,10 +71,8 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSecureChannelConnection* last_created_instance_ = - nullptr; + raw_ptr<FakeSecureChannelConnection, DanglingUntriaged> + last_created_instance_ = nullptr; }; class FakeAuthenticatedChannelFactory @@ -111,13 +107,10 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSecureChannelConnection* expected_fake_secure_channel_ = + raw_ptr<FakeSecureChannelConnection, DanglingUntriaged> + expected_fake_secure_channel_ = nullptr; + raw_ptr<FakeAuthenticatedChannel, DanglingUntriaged> last_created_instance_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeAuthenticatedChannel* last_created_instance_ = nullptr; }; } // namespace
diff --git a/chromeos/ash/services/secure_channel/pending_connection_manager_impl_unittest.cc b/chromeos/ash/services/secure_channel/pending_connection_manager_impl_unittest.cc index 09dcd1e3..b32bb6e 100644 --- a/chromeos/ash/services/secure_channel/pending_connection_manager_impl_unittest.cc +++ b/chromeos/ash/services/secure_channel/pending_connection_manager_impl_unittest.cc
@@ -12,7 +12,6 @@ #include "base/containers/flat_map.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/ranges/algorithm.h" #include "base/test/task_environment.h" #include "base/test/to_vector.h" @@ -323,15 +322,12 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION ClientConnectionParameters* + raw_ptr<ClientConnectionParameters, DanglingUntriaged> expected_client_connection_parameters_ = nullptr; std::optional<ConnectionPriority> expected_connection_priority_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakePendingConnectionRequest<BleInitiatorFailureType>* + raw_ptr<FakePendingConnectionRequest<BleInitiatorFailureType>, + DanglingUntriaged> last_created_instance_ = nullptr; }; @@ -383,9 +379,8 @@ expected_client_connection_parameters_ = nullptr; std::optional<ConnectionPriority> expected_connection_priority_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakePendingConnectionRequest<BleListenerFailureType>* + raw_ptr<FakePendingConnectionRequest<BleListenerFailureType>, + DanglingUntriaged> last_created_instance_ = nullptr; }; @@ -433,15 +428,12 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION ClientConnectionParameters* + raw_ptr<ClientConnectionParameters, DanglingUntriaged> expected_client_connection_parameters_ = nullptr; std::optional<ConnectionPriority> expected_connection_priority_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakePendingConnectionRequest<NearbyInitiatorFailureType>* + raw_ptr<FakePendingConnectionRequest<NearbyInitiatorFailureType>, + DanglingUntriaged> last_created_instance_ = nullptr; };
diff --git a/chromeos/ash/services/secure_channel/secure_channel_service_unittest.cc b/chromeos/ash/services/secure_channel/secure_channel_service_unittest.cc index 8df7967..ef9b81d 100644 --- a/chromeos/ash/services/secure_channel/secure_channel_service_unittest.cc +++ b/chromeos/ash/services/secure_channel/secure_channel_service_unittest.cc
@@ -10,7 +10,6 @@ #include "base/functional/callback.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "base/test/task_environment.h" #include "base/test/test_simple_task_runner.h" @@ -82,9 +81,8 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION multidevice::RemoteDeviceCache* instance_ = nullptr; + raw_ptr<multidevice::RemoteDeviceCache, DanglingUntriaged> instance_ = + nullptr; }; class FakeBluetoothHelperFactory : public BluetoothHelperImpl::Factory { @@ -142,9 +140,7 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeBleSynchronizer* instance_ = nullptr; + raw_ptr<FakeBleSynchronizer, DanglingUntriaged> instance_ = nullptr; }; class FakeBleScannerFactory : public BleScannerImpl::Factory { @@ -206,9 +202,7 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeSecureChannelDisconnector* instance_ = nullptr; + raw_ptr<FakeSecureChannelDisconnector, DanglingUntriaged> instance_ = nullptr; }; class FakeBleConnectionManagerFactory @@ -382,9 +376,7 @@ return instance; } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeActiveConnectionManager* instance_ = nullptr; + raw_ptr<FakeActiveConnectionManager, DanglingUntriaged> instance_ = nullptr; }; class TestSecureChannelInitializerFactory
diff --git a/chromeos/components/kcer/BUILD.gn b/chromeos/components/kcer/BUILD.gn index be218b2..11b6171 100644 --- a/chromeos/components/kcer/BUILD.gn +++ b/chromeos/components/kcer/BUILD.gn
@@ -16,6 +16,12 @@ "chaps/session_chaps_client.h", "extra_instances.cc", "extra_instances.h", + "helpers/key_helper.cc", + "helpers/key_helper.h", + "helpers/pkcs12_reader.cc", + "helpers/pkcs12_reader.h", + "helpers/pkcs12_validator.cc", + "helpers/pkcs12_validator.h", "kcer.cc", "kcer.h", "kcer_impl.cc", @@ -36,6 +42,12 @@ "token_key_finder.h", "token_results_merger.h", ] + if (is_chromeos_ash) { + sources += [ + "helpers/kcer_chaps_util.cc", + "helpers/kcer_chaps_util.h", + ] + } public_deps = [ ":chaps_proto" ] deps = [ @@ -90,6 +102,9 @@ sources = [ "chaps/high_level_chaps_client_unittest.cc", "chaps/session_chaps_client_unittest.cc", + "helpers/kcer_chaps_util_unittest.cc", + "helpers/key_helper_unittest.cc", + "helpers/pkcs12_reader_unittest.cc", "kcer_nss/cert_cache_nss_unittest.cc", "kcer_nss/kcer_nss_unittest.cc", "kcer_token_impl_unittest.cc",
diff --git a/chromeos/components/kcer/chaps/high_level_chaps_client.cc b/chromeos/components/kcer/chaps/high_level_chaps_client.cc index 6f3bc0e..62cd40c 100644 --- a/chromeos/components/kcer/chaps/high_level_chaps_client.cc +++ b/chromeos/components/kcer/chaps/high_level_chaps_client.cc
@@ -6,6 +6,7 @@ #include "base/sequence_checker.h" #include "chromeos/components/kcer/chaps/session_chaps_client.h" +#include "chromeos/components/kcer/key_permissions.pb.h" #include "chromeos/constants/pkcs11_definitions.h" #include "third_party/cros_system_api/dbus/chaps/dbus-constants.h" @@ -40,6 +41,12 @@ return sizeof(chromeos::PKCS11_CK_KEY_TYPE); case AttributeId::kKeyInSoftware: return sizeof(chromeos::PKCS11_CK_BBOOL); + case AttributeId::kKeyPermissions: + return sizeof(chaps::KeyPermissions); + case AttributeId::kCertProvisioningId: + // An arbitrary length, the id is just a user readable string. In same + // cases it contains a GUID (38 characters). + return 40; } }
diff --git a/chromeos/components/kcer/chaps/high_level_chaps_client.h b/chromeos/components/kcer/chaps/high_level_chaps_client.h index f6fc29e..735ae76c 100644 --- a/chromeos/components/kcer/chaps/high_level_chaps_client.h +++ b/chromeos/components/kcer/chaps/high_level_chaps_client.h
@@ -48,6 +48,9 @@ kKeyType = chromeos::PKCS11_CKA_KEY_TYPE, // Stored on the private key. kKeyInSoftware = chaps::kKeyInSoftwareAttribute, + kKeyPermissions = pkcs11_custom_attributes::kCkaChromeOsKeyPermissions, + kCertProvisioningId = + pkcs11_custom_attributes::kCkaChromeOsBuiltinProvisioningProfileId, }; HighLevelChapsClient() = default;
diff --git a/chromeos/components/kcer/helpers/kcer_chaps_util.cc b/chromeos/components/kcer/helpers/kcer_chaps_util.cc new file mode 100644 index 0000000..9bdbba2d --- /dev/null +++ b/chromeos/components/kcer/helpers/kcer_chaps_util.cc
@@ -0,0 +1,487 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/kcer/helpers/kcer_chaps_util.h" + +#include <dlfcn.h> +#include <keyhi.h> +#include <pk11pub.h> +#include <pkcs11.h> +#include <pkcs11t.h> +#include <stdint.h> + +#include <optional> +#include <ostream> +#include <string> +#include <vector> + +#include "base/check.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/logging.h" +#include "base/no_destructor.h" +#include "base/strings/string_number_conversions.h" +#include "chromeos/ash/components/chaps_util/chaps_slot_session.h" +#include "chromeos/ash/components/chaps_util/chaps_util_impl.h" +#include "chromeos/components/kcer/helpers/key_helper.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" +#include "chromeos/components/kcer/helpers/pkcs12_validator.h" +#include "crypto/chaps_support.h" +#include "crypto/scoped_nss_types.h" +#include "third_party/boringssl/src/include/openssl/base.h" +#include "third_party/boringssl/src/include/openssl/mem.h" +#include "third_party/boringssl/src/include/openssl/pkcs8.h" +#include "third_party/boringssl/src/include/openssl/stack.h" +#include "third_party/cros_system_api/dbus/chaps/dbus-constants.h" + +namespace kcer::internal { + +namespace { + +// Chaps sets this for keys that are software-backed. +constexpr char kPkcs12ImportFailed[] = "Chaps util PKCS12 import failed with "; +constexpr char kPkcs12KeyImportFailed[] = "Chaps util key import failed with "; +// Wraps public key and private key PKCS#11 object handles. +struct KeyPairHandles { + CK_OBJECT_HANDLE public_key; + CK_OBJECT_HANDLE private_key; +}; + +using Pkcs11Operation = base::RepeatingCallback<CK_RV()>; + +// Performs |operation| and handles return values indicating that the PKCS11 +// session has been closed by attempting to re-open the |chaps_session|. +// This is useful because the session could be closed e.g. because NSS could +// have called C_CloseAllSessions. +bool PerformWithRetries(chromeos::ChapsSlotSession* chaps_session, + base::StringPiece operation_name, + const Pkcs11Operation& operation) { + const int kMaxAttempts = 5; + + for (int attempt = 0; attempt < kMaxAttempts; ++attempt) { + CK_RV result = operation.Run(); + if (result == CKR_OK) { + return true; + } + if (result != CKR_SESSION_HANDLE_INVALID && result != CKR_SESSION_CLOSED) { + LOG(ERROR) << operation_name << " failed with " << result; + return false; + } + if (!chaps_session->ReopenSession()) { + return false; + } + } + LOG(ERROR) << operation_name << " failed"; + return false; +} + +std::string MakePkcs12KeyImportErrorMessage(Pkcs12ReaderStatusCode error_code) { + return kPkcs12KeyImportFailed + + base::NumberToString(static_cast<int>(error_code)); +} + +std::string MakePkcs12ImportErrorMessage(Pkcs12ReaderStatusCode error_code) { + return kPkcs12ImportFailed + + base::NumberToString(static_cast<int>(error_code)); +} +Pkcs12ReaderStatusCode ImportRsaKey(chromeos::ChapsSlotSession* chaps_session, + const KeyData& key_data, + bool is_software_backed, + const Pkcs12Reader* pkcs12_reader) { + if (!key_data.key) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kKeyDataMissed); + return Pkcs12ReaderStatusCode::kKeyDataMissed; + } + + // All the data variables must stay alive until `attrs` is sent to Chaps. + const RSA* rsa_key = EVP_PKEY_get0_RSA(key_data.key.get()); + const std::vector<uint8_t>& cka_id = key_data.cka_id_value; + std::vector<uint8_t> public_modulus_bytes = + pkcs12_reader->BignumToBytes(RSA_get0_n(rsa_key)); + std::vector<uint8_t> public_exponent_bytes = + pkcs12_reader->BignumToBytes(RSA_get0_e(rsa_key)); + std::vector<uint8_t> private_exponent_bytes = + pkcs12_reader->BignumToBytes(RSA_get0_d(rsa_key)); + std::vector<uint8_t> prime_factor_1 = + pkcs12_reader->BignumToBytes(RSA_get0_p(rsa_key)); + std::vector<uint8_t> prime_factor_2 = + pkcs12_reader->BignumToBytes(RSA_get0_q(rsa_key)); + std::vector<uint8_t> exponent_1 = + pkcs12_reader->BignumToBytes(RSA_get0_dmp1(rsa_key)); + std::vector<uint8_t> exponent_2 = + pkcs12_reader->BignumToBytes(RSA_get0_dmq1(rsa_key)); + std::vector<uint8_t> coefficient = + pkcs12_reader->BignumToBytes(RSA_get0_iqmp(rsa_key)); + + if (public_modulus_bytes.empty() || cka_id.empty() || + public_exponent_bytes.empty() || private_exponent_bytes.empty() || + prime_factor_1.empty() || prime_factor_2.empty() || exponent_1.empty() || + exponent_2.empty() || coefficient.empty()) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kKeyAttrDataMissing); + return Pkcs12ReaderStatusCode::kKeyAttrDataMissing; + } + + CK_BBOOL true_value = CK_TRUE; + CK_OBJECT_CLASS key_class = CKO_PRIVATE_KEY; + CK_KEY_TYPE key_type = CKK_RSA; + CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; + CK_OBJECT_HANDLE out_key_handle; + CK_ATTRIBUTE attrs[] = { + {CKA_CLASS, &key_class, sizeof(key_class)}, + {CKA_KEY_TYPE, &key_type, sizeof(key_type)}, + {CKA_TOKEN, &true_value, sizeof(true_value)}, + {CKA_SENSITIVE, &true_value, sizeof(true_value)}, + {chaps::kForceSoftwareAttribute, &force_software_attribute, + sizeof(true_value)}, + {CKA_PRIVATE, &true_value, sizeof(true_value)}, + {CKA_UNWRAP, &true_value, sizeof(true_value)}, + {CKA_DECRYPT, &true_value, sizeof(true_value)}, + {CKA_SIGN, &true_value, sizeof(true_value)}, + {CKA_SIGN_RECOVER, &true_value, sizeof(true_value)}, + {CKA_MODULUS, const_cast<uint8_t*>(public_modulus_bytes.data()), + public_modulus_bytes.size()}, + {CKA_ID, const_cast<uint8_t*>(cka_id.data()), cka_id.size()}, + {CKA_PUBLIC_EXPONENT, public_exponent_bytes.data(), + public_exponent_bytes.size()}, + {CKA_PRIVATE_EXPONENT, private_exponent_bytes.data(), + private_exponent_bytes.size()}, + {CKA_PRIME_1, prime_factor_1.data(), prime_factor_1.size()}, + {CKA_PRIME_2, prime_factor_2.data(), prime_factor_2.size()}, + {CKA_EXPONENT_1, exponent_1.data(), exponent_1.size()}, + {CKA_EXPONENT_2, exponent_2.data(), exponent_2.size()}, + {CKA_COEFFICIENT, coefficient.data(), coefficient.size()}}; + + if (!PerformWithRetries( + chaps_session, "CreateObject", + base::BindRepeating(&chromeos::ChapsSlotSession::CreateObject, + base::Unretained(chaps_session), attrs, + /*ulCount=*/std::size(attrs), &out_key_handle))) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kCreateKeyFailed); + return Pkcs12ReaderStatusCode::kCreateKeyFailed; + } + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode ImportEcKey(chromeos::ChapsSlotSession* chaps_session, + const KeyData& key_data, + bool is_software_backed, + const Pkcs12Reader* pkcs12_reader) { + if (!key_data.key) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kKeyDataMissed); + return Pkcs12ReaderStatusCode::kKeyDataMissed; + } + + // All the data variables must stay alive until `attrs` is sent to Chaps. + const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(key_data.key.get()); + if (!ec_key) { + return Pkcs12ReaderStatusCode::kEcKeyExtractionFailed; + } + const std::vector<uint8_t>& private_value = GetEcPrivateKeyBytes(ec_key); + const std::vector<uint8_t>& cka_id = key_data.cka_id_value; + const std::vector<uint8_t>& pub_key = GetEcPublicKeyBytes(ec_key); + + if (private_value.empty() || cka_id.empty() || pub_key.empty()) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kKeyAttrDataMissing); + return Pkcs12ReaderStatusCode::kKeyAttrDataMissing; + } + + bssl::ScopedCBB cbb; + uint8_t* ec_params_der = nullptr; + const EC_GROUP* group = EC_KEY_get0_group(ec_key); + size_t ec_params_der_len = 0; + if (!CBB_init(cbb.get(), 0) || !EC_KEY_marshal_curve_name(cbb.get(), group) || + !CBB_finish(cbb.get(), &ec_params_der, &ec_params_der_len)) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kCreateKeyFailed); + return Pkcs12ReaderStatusCode::kCreateKeyFailed; + } + bssl::UniquePtr<uint8_t> der_deleter(ec_params_der); + + CK_BBOOL true_value = CK_TRUE; + CK_OBJECT_CLASS key_class = CKO_PRIVATE_KEY; + CK_KEY_TYPE key_type = CKK_EC; + CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; + CK_OBJECT_HANDLE out_key_handle; + + CK_ATTRIBUTE attrs[] = { + {CKA_CLASS, &key_class, sizeof(key_class)}, + {CKA_KEY_TYPE, &key_type, sizeof(key_type)}, + {CKA_TOKEN, &true_value, sizeof(true_value)}, + {CKA_SENSITIVE, &true_value, sizeof(true_value)}, + {chaps::kForceSoftwareAttribute, &force_software_attribute, + sizeof(force_software_attribute)}, + {CKA_SIGN, &true_value, sizeof(true_value)}, + {CKA_SIGN_RECOVER, &true_value, sizeof(true_value)}, + {CKA_DERIVE, &true_value, sizeof(true_value)}, + {CKA_ID, const_cast<uint8_t*>(cka_id.data()), cka_id.size()}, + {CKA_VALUE, const_cast<uint8_t*>(private_value.data()), + private_value.size()}, + {CKA_EC_POINT, const_cast<uint8_t*>(pub_key.data()), pub_key.size()}, + {CKA_PRIVATE, &true_value, sizeof(true_value)}, + {CKA_EC_PARAMS, ec_params_der, ec_params_der_len}, + }; + + if (!PerformWithRetries( + chaps_session, "CreateObject", + base::BindRepeating(&chromeos::ChapsSlotSession::CreateObject, + base::Unretained(chaps_session), attrs, + /*ulCount=*/std::size(attrs), &out_key_handle))) { + LOG(ERROR) << MakePkcs12KeyImportErrorMessage( + Pkcs12ReaderStatusCode::kCreateKeyFailed); + return Pkcs12ReaderStatusCode::kCreateKeyFailed; + } + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode ImportOneCert(chromeos::ChapsSlotSession* chaps_session, + const CertData& cert_data, + const std::vector<uint8_t>& id, + const Pkcs12Reader* pkcs12_helper, + bool is_software_backed) { + if (!cert_data.x509) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage( + Pkcs12ReaderStatusCode::kCertificateDataMissed); + return Pkcs12ReaderStatusCode::kCertificateDataMissed; + } + X509* cert = cert_data.x509.get(); + + CK_OBJECT_CLASS cert_class = CKO_CERTIFICATE; + CK_CERTIFICATE_TYPE cert_type = CKC_X_509; + CK_BBOOL true_value = CK_TRUE; + + int cert_der_size = 0; + bssl::UniquePtr<uint8_t> cert_der; + Pkcs12ReaderStatusCode get_cert_der_result = + pkcs12_helper->GetDerEncodedCert(cert, cert_der, cert_der_size); + + if (get_cert_der_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_cert_der_result); + return get_cert_der_result; + } + + base::span<const uint8_t> issuer_name_data; + Pkcs12ReaderStatusCode get_issuer_name_der_result = + pkcs12_helper->GetIssuerNameDer(cert, issuer_name_data); + if (get_issuer_name_der_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_issuer_name_der_result); + return get_issuer_name_der_result; + } + + base::span<const uint8_t> subject_name_data; + Pkcs12ReaderStatusCode get_subject_name_der_result = + pkcs12_helper->GetSubjectNameDer(cert, subject_name_data); + if (get_subject_name_der_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_subject_name_der_result); + return get_subject_name_der_result; + } + + int serial_number_der_size = 0; + bssl::UniquePtr<uint8_t> serial_number_der; + Pkcs12ReaderStatusCode get_serial_der_result = + pkcs12_helper->GetSerialNumberDer(cert, serial_number_der, + serial_number_der_size); + if (get_serial_der_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage(get_serial_der_result); + return get_serial_der_result; + } + + std::string label = cert_data.nickname; + + CK_BBOOL force_software_attribute = is_software_backed ? CK_TRUE : CK_FALSE; + + CK_ATTRIBUTE attrs[] = { + {CKA_CLASS, &cert_class, sizeof(cert_class)}, + {CKA_CERTIFICATE_TYPE, &cert_type, sizeof(cert_type)}, + {CKA_TOKEN, &true_value, sizeof(true_value)}, + {chaps::kForceSoftwareAttribute, &force_software_attribute, + sizeof(CK_BBOOL)}, + {CKA_ID, const_cast<uint8_t*>(id.data()), id.size()}, + {CKA_LABEL, label.data(), label.size()}, + {CKA_VALUE, cert_der.get(), + base::saturated_cast<CK_ULONG>(cert_der_size)}, + {CKA_ISSUER, const_cast<uint8_t*>(issuer_name_data.data()), + issuer_name_data.size()}, + {CKA_SUBJECT, const_cast<uint8_t*>(subject_name_data.data()), + subject_name_data.size()}, + {CKA_SERIAL_NUMBER, serial_number_der.get(), + base::saturated_cast<CK_ULONG>(serial_number_der_size)}}; + + CK_OBJECT_HANDLE cert_handle; + if (!PerformWithRetries( + chaps_session, "CreateObject", + base::BindRepeating(&chromeos::ChapsSlotSession::CreateObject, + base::Unretained(chaps_session), attrs, + /*ulCount=*/std::size(attrs), &cert_handle))) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage( + Pkcs12ReaderStatusCode::kCreateCertFailed); + return Pkcs12ReaderStatusCode::kCreateCertFailed; + } + + return Pkcs12ReaderStatusCode::kSuccess; +} + +Pkcs12ReaderStatusCode ImportAllCerts(chromeos::ChapsSlotSession* chaps_session, + std::vector<CertData>& certs_data, + const std::vector<uint8_t>& id, + const Pkcs12Reader* pkcs12_helper, + bool is_software_backed) { + if (certs_data.empty()) { + LOG(ERROR) << MakePkcs12CertImportErrorMessage( + Pkcs12ReaderStatusCode::kCertificateDataMissed); + return Pkcs12ReaderStatusCode::kCertificateDataMissed; + } + + Pkcs12ReaderStatusCode is_every_cert_imported = + Pkcs12ReaderStatusCode::kSuccess; + for (CertData cert_data : certs_data) { + if (ImportOneCert(chaps_session, cert_data, id, pkcs12_helper, + is_software_backed) != Pkcs12ReaderStatusCode::kSuccess) { + is_every_cert_imported = Pkcs12ReaderStatusCode::kFailureDuringCertImport; + } + } + return is_every_cert_imported; +} + +KcerChapsUtil::FactoryCallback& GetFactoryCallback() { + static base::NoDestructor<KcerChapsUtil::FactoryCallback> s_callback; + return *s_callback; +} + +} // namespace + +KcerChapsUtil::KcerChapsUtil(std::unique_ptr<chromeos::ChapsSlotSessionFactory> + chaps_slot_session_factory) + : chaps_slot_session_factory_(std::move(chaps_slot_session_factory)) {} +KcerChapsUtil::~KcerChapsUtil() = default; + +// static +std::unique_ptr<KcerChapsUtil> KcerChapsUtil::Create() { + if (!GetFactoryCallback().is_null()) { + return GetFactoryCallback().Run(); + } + return std::make_unique<KcerChapsUtil>( + std::make_unique<chromeos::ChapsSlotSessionFactoryImpl>()); +} + +// static +void KcerChapsUtil::SetFactoryForTesting(const FactoryCallback& factory) { + DCHECK(factory.is_null() || GetFactoryCallback().is_null()) + << "It is not expected that this is called with non-null callback when " + << "another overriding callback is already set."; + GetFactoryCallback() = factory; +} + +bool KcerChapsUtil::ImportPkcs12Certificate( + PK11SlotInfo* slot, + const std::vector<uint8_t>& pkcs12_data, + const std::string& password, + bool is_software_backed) { + return ImportPkcs12CertificateImpl(slot, pkcs12_data, password, + is_software_backed); +} + +bool KcerChapsUtil::ImportPkcs12CertificateImpl( + PK11SlotInfo* slot, + const std::vector<uint8_t>& pkcs12_data, + const std::string& password, + const bool is_software_backed, + const Pkcs12Reader& pkcs12_reader) { + std::unique_ptr<chromeos::ChapsSlotSession> chaps_session = + GetChapsSlotSessionForSlot(slot); + if (!chaps_session) { + LOG(ERROR) << MakePkcs12ImportErrorMessage( + Pkcs12ReaderStatusCode::kChapsSessionMissed); + return false; + } + + KeyData key_data; + bssl::UniquePtr<STACK_OF(X509)> certs; + Pkcs12ReaderStatusCode get_key_and_cert_status = + pkcs12_reader.GetPkcs12KeyAndCerts(pkcs12_data, password, key_data.key, + certs); + if (get_key_and_cert_status != Pkcs12ReaderStatusCode::kSuccess) { + uint32_t error = ERR_get_error(); + char ebuf[255]; + LOG(ERROR) << "PKCS#12 import failed with error " + << ERR_error_string_n(error, ebuf, sizeof(ebuf)); + LOG(ERROR) << MakePkcs12ImportErrorMessage(get_key_and_cert_status); + return false; + } + + Pkcs12ReaderStatusCode enrich_key_data_result = + pkcs12_reader.EnrichKeyData(key_data); + if (enrich_key_data_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(enrich_key_data_result); + return false; + } + + // This will keep raw_pointers from `certs`, it cannot outlive `certs`. + std::vector<CertData> certs_data; + Pkcs12ReaderStatusCode prepare_certs_status = ValidateAndPrepareCertData( + slot, pkcs12_reader, certs, key_data, certs_data); + if (prepare_certs_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(prepare_certs_status); + return false; + } + + bool is_key_installed = false; + Pkcs12ReaderStatusCode key_installed_result = CanFindInstalledKey( + slot, certs_data.front(), pkcs12_reader, is_key_installed); + if (key_installed_result != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << "Failed to find installed key in slot due to: " + << MakePkcs12CertImportErrorMessage(key_installed_result); + return false; + } + + if (!is_key_installed) { + Pkcs12ReaderStatusCode import_key_status = + Pkcs12ReaderStatusCode::kKeyAttrDataMissing; + if (IsKeyRsaType(key_data.key)) { + import_key_status = ImportRsaKey(chaps_session.get(), key_data, + is_software_backed, &pkcs12_reader); + } else if (IsKeyEcType(key_data.key)) { + import_key_status = ImportEcKey(chaps_session.get(), key_data, + is_software_backed, &pkcs12_reader); + } else { + LOG(ERROR) << "Not supported key type"; + return false; + } + + if (import_key_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(import_key_status); + return false; + } + } + // Same id will be used for the key and certs. + Pkcs12ReaderStatusCode import_certs_status = + ImportAllCerts(chaps_session.get(), certs_data, key_data.cka_id_value, + &pkcs12_reader, is_software_backed); + if (import_certs_status != Pkcs12ReaderStatusCode::kSuccess) { + LOG(ERROR) << MakePkcs12ImportErrorMessage(import_certs_status); + return false; + } + + return true; +} + +std::unique_ptr<chromeos::ChapsSlotSession> +KcerChapsUtil::GetChapsSlotSessionForSlot(PK11SlotInfo* slot) { + if (!slot || (!is_chaps_provided_slot_for_testing_ && + !crypto::IsSlotProvidedByChaps(slot))) { + return nullptr; + } + + // Note that ChapsSlotSession(Factory) expects something else to have called + // C_Initialize. It is a safe assumption that NSS has called C_Initialize for + // chaps if |slot| is actually a chaps-provided slot, which is verified above. + return chaps_slot_session_factory_->CreateChapsSlotSession( + PK11_GetSlotID(slot)); +} + +} // namespace kcer::internal
diff --git a/chromeos/components/kcer/helpers/kcer_chaps_util.h b/chromeos/components/kcer/helpers/kcer_chaps_util.h new file mode 100644 index 0000000..5e8381d --- /dev/null +++ b/chromeos/components/kcer/helpers/kcer_chaps_util.h
@@ -0,0 +1,70 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_KCER_HELPERS_KCER_CHAPS_UTIL_H_ +#define CHROMEOS_COMPONENTS_KCER_HELPERS_KCER_CHAPS_UTIL_H_ + +#include <stdint.h> + +#include <memory> +#include <string> +#include <vector> + +#include "base/component_export.h" +#include "base/functional/callback_forward.h" +#include "chromeos/ash/components/chaps_util/chaps_slot_session.h" +#include "chromeos/ash/components/chaps_util/chaps_util.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" +#include "crypto/scoped_nss_types.h" + +namespace kcer::internal { + +// Class helper for importing pkcs12 containers to Chaps, very similar to +// ChapsUtil class. Communicates with the chapsd daemon using ChapsSlotSession. +// Should be used on a worker thread. Exported for unit tests only. +class COMPONENT_EXPORT(KCER) KcerChapsUtil { + public: + explicit KcerChapsUtil(std::unique_ptr<chromeos::ChapsSlotSessionFactory> + chaps_slot_session_factory); + ~KcerChapsUtil(); + + static std::unique_ptr<KcerChapsUtil> Create(); + using FactoryCallback = + base::RepeatingCallback<std::unique_ptr<KcerChapsUtil>()>; + + static void SetFactoryForTesting(const FactoryCallback& factory); + + bool ImportPkcs12Certificate(PK11SlotInfo* slot, + const std::vector<uint8_t>& pkcs12_data, + const std::string& password, + bool is_software_backed); + + // Public for testing, allows replacing Pkcs12Reader. + bool ImportPkcs12CertificateImpl( + PK11SlotInfo* slot, + const std::vector<uint8_t>& pkcs12_data, + const std::string& password, + const bool is_software_backed, + const Pkcs12Reader& pkcs12_reader = Pkcs12Reader()); + + // If called with true, every slot is assumed to be a chaps-provided slot. + void SetIsChapsProvidedSlotForTesting( + bool is_chaps_provided_slot_for_testing) { + is_chaps_provided_slot_for_testing_ = is_chaps_provided_slot_for_testing; + } + + private: + std::unique_ptr<chromeos::ChapsSlotSession> GetChapsSlotSessionForSlot( + PK11SlotInfo* slot); + + std::unique_ptr<chromeos::ChapsSlotSessionFactory> const + chaps_slot_session_factory_; + + // If true, every slot is assumed to be a chaps-provided slot. + bool is_chaps_provided_slot_for_testing_; +}; + +} // namespace kcer::internal + +#endif // CHROMEOS_COMPONENTS_KCER_HELPERS_KCER_CHAPS_UTIL_H_
diff --git a/chromeos/components/kcer/helpers/kcer_chaps_util_unittest.cc b/chromeos/components/kcer/helpers/kcer_chaps_util_unittest.cc new file mode 100644 index 0000000..f152b412 --- /dev/null +++ b/chromeos/components/kcer/helpers/kcer_chaps_util_unittest.cc
@@ -0,0 +1,1525 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/kcer/helpers/kcer_chaps_util.h" + +#include <pkcs11t.h> +#include <secmodt.h> +#include <stdint.h> + +#include <map> +#include <optional> +#include <utility> +#include <vector> + +#include "base/base64.h" +#include "base/containers/span.h" +#include "base/files/file_util.h" +#include "base/memory/raw_ptr.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" +#include "crypto/nss_key_util.h" +#include "crypto/scoped_nss_types.h" +#include "crypto/scoped_test_nss_db.h" +#include "net/cert/x509_util_nss.h" +#include "net/test/cert_test_util.h" +#include "net/test/test_data_directory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/boringssl/src/include/openssl/base.h" +#include "third_party/boringssl/src/include/openssl/bn.h" +#include "third_party/boringssl/src/include/openssl/stack.h" +#include "third_party/boringssl/src/include/openssl/x509.h" +#include "third_party/cros_system_api/dbus/chaps/dbus-constants.h" + +namespace kcer::internal { +namespace { + +const size_t kKeySizeBits = 2048; + +// Signals to chaps that a generated key should be software-backed. +constexpr CK_ATTRIBUTE_TYPE kForceSoftwareAttribute = + chaps::kForceSoftwareAttribute; +// Chaps sets this for keys that are software-backed. +constexpr CK_ATTRIBUTE_TYPE kKeyInSoftware = chaps::kKeyInSoftwareAttribute; + +enum AttrValueType { kNotDefined, kCkBool, kCkUlong, kCkBytes }; +const char kPkcs12FilePassword[] = "12345"; +const char kPkcs12FileMin6CharPassword[] = "123456"; +const std::optional<std::vector<CK_BYTE>> default_encoded_cert_label = + base::Base64Decode("dGVzdHVzZXJjZXJ0"); +// python print(base64.b64encode("default nickname".encode('utf-8'))). +const std::optional<std::vector<CK_BYTE>> default_encoded_label = + base::Base64Decode("VW5rbm93biBvcmc="); +const std::optional<std::vector<CK_BYTE>> cka_id_for_ec_key = + base::Base64Decode("9kVFdOhn8yYso7a/wG2uC0wdHWo="); +const std::optional<std::vector<CK_BYTE>> cka_ex_point_ec_key = + base::Base64Decode( + "BP+" + "IQBEPm3e3ABQMhQaZlE0w8qIjn0tKH6jTEekQvtKoUhFo2nM4Q9VA3MLljVF7vabV8CuH9" + "/" + "UkKt2FMg2iHGM="); +const std::optional<std::vector<CK_BYTE>> cka_ec_params_ec_key = + base::Base64Decode("BggqhkjOPQMBBw=="); +const std::optional<std::vector<CK_BYTE>> cka_value_ec_key = + base::Base64Decode("fvWtrgVAq5JApBuCPK92IUAQQnnEoLUrBgZ/KGFhz7E="); + +// Class helper to keep relations between all possible attribute's types, +// attribute's names and attribute's value types. +class AttributesParsingOptions { + public: + AttributesParsingOptions() = default; + ~AttributesParsingOptions() = default; + + static std::string GetName(const CK_ATTRIBUTE& attribute) { + if (!GetPkcs12ObjectAttrMap().contains(attribute.type)) { + ADD_FAILURE() << "Attribute value's type is unknown hex:" << std::hex + << attribute.type; + return ""; + } + return std::get<std::string>(GetPkcs12ObjectAttrMap().at(attribute.type)); + } + + static AttrValueType GetValueType(const CK_ATTRIBUTE& attribute) { + if (!GetPkcs12ObjectAttrMap().contains(attribute.type)) { + ADD_FAILURE() << "Attribute value's type is unknown hex:" << std::hex + << attribute.type; + return AttrValueType::kNotDefined; + } + return std::get<AttrValueType>(GetPkcs12ObjectAttrMap().at(attribute.type)); + } + + private: + static const std::map<CK_ATTRIBUTE_TYPE, + std::pair<AttrValueType, std::string>>& + GetPkcs12ObjectAttrMap() { + // Map which keeps relation between PKCS12 object attribute type, attribute + // name and attribute value's type. + static std::map<CK_ATTRIBUTE_TYPE, std::pair<AttrValueType, std::string>> + attr_map; + if (attr_map.empty()) { + attr_map[CKA_TOKEN] = {kCkBool, "CKA_TOKEN"}; + attr_map[CKA_PRIVATE] = {kCkBool, "CKA_PRIVATE"}; + attr_map[CKA_VERIFY] = {kCkBool, "CKA_VERIFY"}; + attr_map[CKA_MODULUS_BITS] = {kCkUlong, "CKA_MODULUS_BITS"}; + attr_map[CKA_PUBLIC_EXPONENT] = {kCkBytes, "CKA_PUBLIC_EXPONENT"}; + attr_map[CKA_SENSITIVE] = {kCkBool, "CKA_SENSITIVE"}; + attr_map[CKA_EXTRACTABLE] = {kCkBool, "CKA_EXTRACTABLE"}; + attr_map[CKA_SIGN] = {kCkBool, "CKA_SIGN"}; + attr_map[kForceSoftwareAttribute] = {kCkBool, "kForceSoftwareAttribute"}; + attr_map[CKA_CLASS] = {kCkUlong, "CKA_CLASS"}; + attr_map[CKA_KEY_TYPE] = {kCkUlong, "CKA_KEY_TYPE"}; + attr_map[CKA_UNWRAP] = {kCkBool, "CKA_UNWRAP"}; + attr_map[CKA_DECRYPT] = {kCkBool, "CKA_DECRYPT"}; + attr_map[CKA_MODULUS] = {kCkBytes, "CKA_MODULUS"}; + attr_map[CKA_SIGN_RECOVER] = {kCkBool, "CKA_SIGN_RECOVER"}; + attr_map[CKA_ID] = {kCkBytes, "CKA_ID"}; + attr_map[CKA_PUBLIC_EXPONENT] = {kCkBytes, "CKA_PUBLIC_EXPONENT"}; + attr_map[CKA_PRIVATE_EXPONENT] = {kCkBytes, "CKA_PRIVATE_EXPONENT"}; + attr_map[CKA_PRIME_1] = {kCkBytes, "CKA_PRIME_1"}; + attr_map[CKA_PRIME_2] = {kCkBytes, "CKA_PRIME_2"}; + attr_map[CKA_EXPONENT_1] = {kCkBytes, "CKA_EXPONENT_1"}; + attr_map[CKA_EXPONENT_2] = {kCkBytes, "CKA_EXPONENT_2"}; + attr_map[CKA_COEFFICIENT] = {kCkBytes, "CKA_COEFFICIENT"}; + attr_map[CKA_LABEL] = {kCkBytes, "CKA_LABEL"}; + attr_map[CKA_VALUE] = {kCkBytes, "CKA_VALUE"}; + attr_map[CKA_ISSUER] = {kCkBytes, "CKA_ISSUER"}; + attr_map[CKA_SUBJECT] = {kCkBytes, "CKA_SUBJECT"}; + attr_map[CKA_SERIAL_NUMBER] = {kCkBytes, "CKA_SERIAL_NUMBER"}; + attr_map[CKA_NSS_EMAIL] = {kCkBytes, "CKA_NSS_EMAIL"}; + attr_map[CKA_CERTIFICATE_TYPE] = {kCkBytes, "CKA_CERTIFICATE_TYPE"}; + attr_map[CKA_EC_POINT] = {kCkBytes, "CKA_EC_POINT"}; + attr_map[CKA_DERIVE] = {kCkBool, "CKA_DERIVE"}; + attr_map[CKA_EC_PARAMS] = {kCkBytes, "CKA_EC_PARAMS"}; + } + return attr_map; + } +}; + +// Generic holder for single parsed attribute with all parsing methods. +class AttributeData { + public: + AttributeData() = default; + explicit AttributeData(const CK_ATTRIBUTE& attribute) { + AttrValueType attr_value_type = + AttributesParsingOptions::GetValueType(attribute); + name_ = AttributesParsingOptions::GetName(attribute); + switch (attr_value_type) { + case kCkBool: + ck_bool_value_ = ParseCkBBool(attribute, name_); + break; + case kCkUlong: + ck_ulong_value_ = ParseCkULong(attribute, name_); + break; + case kCkBytes: + ck_bytes_value_ = ParseCkBytes(attribute); + break; + case kNotDefined: + ADD_FAILURE() << "Parser is not defined for attribute type:" << std::hex + << attribute.type; + break; + } + } + ~AttributeData() = default; + + std::optional<CK_BBOOL> CkBool() { return ck_bool_value_; } + + std::optional<CK_ULONG> CkULong() { return ck_ulong_value_; } + + std::optional<std::vector<CK_BYTE>> CkByte() { return ck_bytes_value_; } + + private: + std::string name_; + std::optional<CK_BBOOL> ck_bool_value_; + std::optional<CK_ULONG> ck_ulong_value_; + std::optional<std::vector<CK_BYTE>> ck_bytes_value_; + + static std::optional<CK_BBOOL> ParseCkBBool( + const CK_ATTRIBUTE& attribute, + const std::string& attribute_name) { + if (attribute.ulValueLen < sizeof(CK_BBOOL)) { + ADD_FAILURE() << "Size to small for CK_BBOOL for attribute " + << attribute_name << ": " << attribute.ulValueLen; + return std::nullopt; + } + CK_BBOOL value; + memcpy(&value, attribute.pValue, sizeof(CK_BBOOL)); + return value; + } + + static std::optional<CK_ULONG> ParseCkULong( + const CK_ATTRIBUTE& attribute, + const std::string& attribute_name) { + if (attribute.ulValueLen < sizeof(CK_ULONG)) { + ADD_FAILURE() << "Size to small for CK_ULONG for attribute " + << attribute_name << ": " << attribute.ulValueLen; + return std::nullopt; + } + CK_ULONG value; + memcpy(&value, attribute.pValue, sizeof(CK_ULONG)); + return value; + } + + static std::optional<std::vector<CK_BYTE>> ParseCkBytes( + const CK_ATTRIBUTE& attribute) { + std::vector<CK_BYTE> result(attribute.ulValueLen); + memcpy(result.data(), attribute.pValue, result.size()); + return result; + } +}; + +// Holds PKCS#11 attributes passed by the code under test. +struct ObjectAttributes { + ObjectAttributes() = default; + ~ObjectAttributes() = default; + + static ObjectAttributes ParseFrom(CK_ATTRIBUTE_PTR attributes, + CK_ULONG attributes_count) { + ObjectAttributes result; + for (CK_ULONG i = 0; i < attributes_count; ++i) { + const CK_ATTRIBUTE& attr = attributes[i]; + if (result.parsed_attributes_map.contains(attr.type)) { + ADD_FAILURE() << "Already stored attribute type:" << attr.type; + } + result.parsed_attributes_map[attr.type] = AttributeData(attr); + } + return result; + } + + std::optional<CK_BBOOL> GetCkBool(const CK_ATTRIBUTE_TYPE attribute_type) { + return parsed_attributes_map[attribute_type].CkBool(); + } + + std::optional<CK_ULONG> GetCkULong(const CK_ATTRIBUTE_TYPE attribute_type) { + return parsed_attributes_map[attribute_type].CkULong(); + } + + std::optional<std::vector<CK_BYTE>> GetCkByte( + const CK_ATTRIBUTE_TYPE attribute_type) { + return parsed_attributes_map[attribute_type].CkByte(); + } + + int Size() { return parsed_attributes_map.size(); } + + std::map<CK_ATTRIBUTE_TYPE, AttributeData> parsed_attributes_map; +}; + +// Holds +// - flags triggering how FakeChapsSlotSession should behave. +// - data passed by the code under test to FakeChapsSlotSessionFactory and +// FakeChapsSlotSession. +struct PassedData { + // Controls whether ChapsSlotSessionFactory::CreateChapsSlotSession succeeds. + bool factory_success = true; + + // Assigns results to operations. The key is the operation index, i.e. the + // sequence number of an operation performed on the ChapsSlotSession. + // The value is the operation result. CKR_INVALID_SESSION_HANDLE and + // CKR_SESSION_CLOSED have special meaning. + std::map<int, CK_RV> operation_results; + + // If set to false, calls to ChapsSlotSession::ReopenSession will fail. + bool reopen_session_success = true; + + // Counts how often the code under test called + // ChapsSlotSession::ReopenSession. + int reopen_session_call_count = 0; + + // The slot_id passed into FakeChapsSlotSessionFactory. + std::optional<CK_SLOT_ID> slot_id; + + // Attributes passed for the secret key template to GenerateKey. + ObjectAttributes secret_key_gen_attributes; + + // Attributes passed for the public key template to GenerateKeyPair. + ObjectAttributes public_key_gen_attributes; + + // Attributes passed for the private key template to GenerateKeyPair. + ObjectAttributes private_key_gen_attributes; + + // The data passed into FakeChapsSlotSession::SetAttributeValue for the + // CKA_ID attribute of the public key. Empty if SetAttributeValue was never + // called for that attribute. + std::vector<uint8_t> public_key_cka_id; + + // The data passed into FakeChapsSlotSession::SetAttributeValue for the + // CKA_ID attribute of the private key. Empty if SetAttributeValue was never + // called for that attribute. + std::vector<uint8_t> private_key_cka_id; + + // The data passed into FakeChapsSlotSession::SetAttributeValue for creation + // of key object from PKCS12 container. + ObjectAttributes pkcs12_key_attributes; + + // The data passed into FakeChapsSlotSession::SetAttributeValue for creation + // of certificates objects from PKCS12 container. PKCS12 container can hold + // multiple certificates. + std::vector<ObjectAttributes> pkcs12_cert_attributes; +}; + +// FakeChapsSlotSession actually generates a key pair on a NSS slot. This is +// useful so it's possible to test whether the CKA_ID that the code under test +// would assign matches the CKA_ID that NSS computed for the key. +class FakeChapsSlotSession : public chromeos::ChapsSlotSession { + public: + explicit FakeChapsSlotSession(PK11SlotInfo* slot, PassedData* passed_data) + : slot_(slot), passed_data_(passed_data) {} + ~FakeChapsSlotSession() override = default; + + bool ReopenSession() override { + ++passed_data_->reopen_session_call_count; + + // The code under test should only call this if it was given an indication + // that the session handle it uses is not valid anymore. + EXPECT_FALSE(session_ok_); + if (passed_data_->reopen_session_success) { + session_ok_ = true; + return true; + } + return false; + } + + CK_RV CreateObject(CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phObject) override { + EXPECT_TRUE(session_ok_); + CK_RV configured_result = ApplyConfiguredResult(); + if (configured_result != CKR_OK) { + return configured_result; + } + + ObjectAttributes parsing_result = + ObjectAttributes::ParseFrom(pTemplate, ulCount); + + AttributeData parsed_object_type = + parsing_result.parsed_attributes_map[CKA_CLASS]; + if (parsed_object_type.CkULong() == CKO_PRIVATE_KEY) { + passed_data_->pkcs12_key_attributes = parsing_result; + } + if (parsed_object_type.CkULong() == CKO_CERTIFICATE) { + passed_data_->pkcs12_cert_attributes.push_back(parsing_result); + } + + return CKR_OK; + } + + CK_RV GenerateKey(CK_MECHANISM_PTR pMechanism, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount, + CK_OBJECT_HANDLE_PTR phKey) override { + EXPECT_TRUE(session_ok_); + CK_RV configured_result = ApplyConfiguredResult(); + if (configured_result != CKR_OK) { + return configured_result; + } + + passed_data_->secret_key_gen_attributes = + ObjectAttributes::ParseFrom(pTemplate, ulCount); + + // TODO(b/288880151): Finish fake implementation of `GenerateKey()`, when it + // becomes necessary for testing `ChapsUtilImpl`. + + return CKR_OK; + } + + CK_RV GenerateKeyPair(CK_MECHANISM_PTR pMechanism, + CK_ATTRIBUTE_PTR pPublicKeyTemplate, + CK_ULONG ulPublicKeyAttributeCount, + CK_ATTRIBUTE_PTR pPrivateKeyTemplate, + CK_ULONG ulPrivateKeyAttributeCount, + CK_OBJECT_HANDLE_PTR phPublicKey, + CK_OBJECT_HANDLE_PTR phPrivateKey) override { + EXPECT_TRUE(session_ok_); + CK_RV configured_result = ApplyConfiguredResult(); + if (configured_result != CKR_OK) { + return configured_result; + } + + passed_data_->public_key_gen_attributes = ObjectAttributes::ParseFrom( + pPublicKeyTemplate, ulPublicKeyAttributeCount); + passed_data_->private_key_gen_attributes = ObjectAttributes::ParseFrom( + pPrivateKeyTemplate, ulPrivateKeyAttributeCount); + + crypto::ScopedSECKEYPublicKey public_key; + crypto::ScopedSECKEYPrivateKey private_key; + EXPECT_TRUE(crypto::GenerateRSAKeyPairNSS(slot_, kKeySizeBits, + /*permanent=*/true, &public_key, + &private_key)); + *phPublicKey = public_key->pkcs11ID; + public_key_handle_ = public_key->pkcs11ID; + *phPrivateKey = private_key->pkcs11ID; + private_key_handle_ = private_key->pkcs11ID; + + // Remember the modulus. + SECItem* modulus = &(public_key->u.rsa.modulus); + public_key_modulus_.assign(modulus->data, modulus->data + modulus->len); + return CKR_OK; + } + + CK_RV GetAttributeValue(CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount) override { + EXPECT_TRUE(session_ok_); + CK_RV configured_result = ApplyConfiguredResult(); + if (configured_result != CKR_OK) { + return configured_result; + } + + if (hObject == public_key_handle_) { + const size_t kModulusBytes = kKeySizeBits / 8; + if (ulCount != 1 || pTemplate[0].type != CKA_MODULUS) { + return CKR_ATTRIBUTE_TYPE_INVALID; + } + if (pTemplate[0].ulValueLen < kModulusBytes) { + return CKR_BUFFER_TOO_SMALL; + } + memcpy(pTemplate[0].pValue, public_key_modulus_.data(), kModulusBytes); + return CKR_OK; + } + if (hObject == private_key_handle_) { + if (ulCount != 1 || pTemplate[0].type != kKeyInSoftware) { + return CKR_ATTRIBUTE_TYPE_INVALID; + } + const CK_BBOOL key_in_software_value = true; + if (pTemplate[0].ulValueLen < sizeof(key_in_software_value)) { + return CKR_BUFFER_TOO_SMALL; + } + memcpy(pTemplate[0].pValue, &key_in_software_value, + sizeof(key_in_software_value)); + return CKR_OK; + } + return CKR_OBJECT_HANDLE_INVALID; + } + + CK_RV SetAttributeValue(CK_OBJECT_HANDLE hObject, + CK_ATTRIBUTE_PTR pTemplate, + CK_ULONG ulCount) override { + EXPECT_TRUE(session_ok_); + CK_RV configured_result = ApplyConfiguredResult(); + if (configured_result != CKR_OK) { + return configured_result; + } + + if (ulCount != 1 || pTemplate[0].type != CKA_ID) { + return CKR_ATTRIBUTE_TYPE_INVALID; + } + + uint8_t* data = reinterpret_cast<uint8_t*>(pTemplate[0].pValue); + size_t length = pTemplate[0].ulValueLen; + if (hObject == public_key_handle_) { + passed_data_->public_key_cka_id.assign(data, data + length); + return CKR_OK; + } else if (hObject == private_key_handle_) { + passed_data_->private_key_cka_id.assign(data, data + length); + return CKR_OK; + } + return CKR_OBJECT_HANDLE_INVALID; + } + + private: + // Applies a result configured for the current operation, if any. + CK_RV ApplyConfiguredResult() { + int cur_operation = operation_count_; + ++operation_count_; + + auto operation_result = passed_data_->operation_results.find(cur_operation); + if (operation_result == passed_data_->operation_results.end()) { + return CKR_OK; + } + CK_RV result = operation_result->second; + // CKR_SESSION_HANDLE_INVALID and CKR_SESSION_CLOSED have a special meaning + // - also flag that the session handle is not usable (until the next call to + // ReopenSession). + if (result == CKR_SESSION_HANDLE_INVALID || result == CKR_SESSION_CLOSED) { + session_ok_ = false; + } + return result; + } + + // Keeps track of how many operations were already performed. Used to keep + // track of the operation sequence number for PassedData::operation_results. + int operation_count_ = 0; + // If false, the session is not usable until ReopenSession has been called. + bool session_ok_ = true; + + // Unowned. + const raw_ptr<PK11SlotInfo> slot_; + // Unowned. + const raw_ptr<PassedData> passed_data_; + + // Cached modulus of the generated public key so GetAttributeValue with + // CKA_MODULUS is supported. + std::vector<uint8_t> public_key_modulus_; + CK_OBJECT_HANDLE public_key_handle_ = CKR_OBJECT_HANDLE_INVALID; + CK_OBJECT_HANDLE private_key_handle_ = CKR_OBJECT_HANDLE_INVALID; +}; + +class FakeChapsSlotSessionFactory : public chromeos::ChapsSlotSessionFactory { + public: + FakeChapsSlotSessionFactory(PK11SlotInfo* slot, PassedData* passed_data) + : slot_(slot), passed_data_(passed_data) {} + ~FakeChapsSlotSessionFactory() override = default; + + std::unique_ptr<chromeos::ChapsSlotSession> CreateChapsSlotSession( + CK_SLOT_ID slot_id) override { + passed_data_->slot_id = slot_id; + if (!passed_data_->factory_success) { + return nullptr; + } + return std::make_unique<FakeChapsSlotSession>(slot_, passed_data_); + } + + private: + // Unowned. + const raw_ptr<PK11SlotInfo> slot_; + // Unowned. + const raw_ptr<PassedData> passed_data_; +}; + +// FakePkcs12Reader helper, by default it will call methods for the original +// object. +class FakePkcs12Reader : public Pkcs12Reader { + public: + FakePkcs12Reader() = default; + ~FakePkcs12Reader() override = default; + + Pkcs12ReaderStatusCode GetPkcs12KeyAndCerts( + const std::vector<uint8_t>& pkcs12_data, + const std::string& password, + bssl::UniquePtr<EVP_PKEY>& key, + bssl::UniquePtr<STACK_OF(X509)>& certs) const override { + get_pkcs12_key_and_cert_called_++; + if (fake_certs_.get()) { + certs = std::move(fake_certs_); + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (get_pkcs12_key_and_cert_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_pkcs12_key_and_cert_status_; + } + return Pkcs12Reader::GetPkcs12KeyAndCerts(pkcs12_data, password, key, + certs); + } + + Pkcs12ReaderStatusCode GetDerEncodedCert(X509* cert, + bssl::UniquePtr<uint8_t>& cert_der, + int& cert_der_size) const override { + get_der_encode_cert_called_++; + if (get_der_encoded_cert_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_der_encoded_cert_status_; + } + return Pkcs12Reader::GetDerEncodedCert(cert, cert_der, cert_der_size); + } + + Pkcs12ReaderStatusCode GetIssuerNameDer( + X509* cert, + base::span<const uint8_t>& issuer_name_data) const override { + if (get_issuer_name_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_issuer_name_der_status_; + } + return Pkcs12Reader::GetIssuerNameDer(cert, issuer_name_data); + } + + Pkcs12ReaderStatusCode GetSubjectNameDer( + X509* cert, + base::span<const uint8_t>& subject_name_data) const override { + get_subject_name_der_called_++; + if (get_subject_name_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_subject_name_der_status_; + } + return Pkcs12Reader::GetSubjectNameDer(cert, subject_name_data); + } + + Pkcs12ReaderStatusCode GetSerialNumberDer( + X509* cert, + bssl::UniquePtr<uint8_t>& serial_number_der, + int& serial_number_der_size) const override { + if (get_serial_number_der_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_serial_number_der_status_; + } + return Pkcs12Reader::GetSerialNumberDer(cert, serial_number_der, + serial_number_der_size); + } + + Pkcs12ReaderStatusCode EnrichKeyData(KeyData& key_data) const override { + get_key_data_called_++; + if (get_key_data_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_key_data_status_; + } + return Pkcs12Reader::EnrichKeyData(key_data); + } + + Pkcs12ReaderStatusCode CheckRelation(const KeyData& key_data, + X509* cert, + bool& is_related) const override { + check_relation_data_called_++; + if (check_relation_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return check_relation_status_; + } + return Pkcs12Reader::CheckRelation(key_data, cert, is_related); + } + + Pkcs12ReaderStatusCode FindRawCertsWithSubject( + PK11SlotInfo* slot, + base::span<const uint8_t> required_subject_name, + CERTCertificateList** found_certs) const override { + find_raw_certs_with_subject_called_++; + + if (fake_some_certs_in_slot_) { + // Some multi steps action here to mock returned CERTCertificateList with + // one cert. This all should go away when PK11_FindRawCertsWithSubject is + // replaced with a new function. + scoped_refptr<net::X509Certificate> x509_cert = + net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); + net::ScopedCERTCertificate nss_cert = + net::x509_util::CreateCERTCertificateFromX509Certificate( + x509_cert.get()); + *found_certs = CERT_CertListFromCert(nss_cert.get()); + + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (find_raw_certs_with_subject_ != Pkcs12ReaderStatusCode::kSuccess) { + return find_raw_certs_with_subject_; + } + return Pkcs12Reader::FindRawCertsWithSubject(slot, required_subject_name, + found_certs); + } + + Pkcs12ReaderStatusCode GetLabel(X509* cert, + std::string& label) const override { + get_label_called_++; + if (get_label_override_) { + label = std::string(); + return Pkcs12ReaderStatusCode::kSuccess; + } + if (get_label_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return get_label_status_; + } + return Pkcs12Reader::GetLabel(cert, label); + } + + Pkcs12ReaderStatusCode IsCertWithNicknameInSlots( + const std::string& nickname_in, + bool& is_nickname_present) const override { + is_certs_with_nickname_in_slots_called_++; + + // Override allows to return first N request to isCertsWithNicknamesInSlot + // with True and then return False, so can verify behaviour when nicknames + // are found in slot. + if (is_certs_with_nickname_in_slots_override_ > 0 && + is_certs_with_nickname_in_slots_override_ < + is_certs_with_nickname_in_slots_called_) { + is_nickname_present = false; + return Pkcs12ReaderStatusCode::kSuccess; + } + + // By default nothing is returned from PK11_FindCertsFromNickname() and + // is_nickname_present will be false, this will override is_nickname_present + // to true for tests. + if (is_certs_nickname_used_) { + is_nickname_present = is_certs_nickname_used_; + return Pkcs12ReaderStatusCode::kSuccess; + } + + if (is_certs_with_nickname_in_slot_status_ != + Pkcs12ReaderStatusCode::kSuccess) { + return is_certs_with_nickname_in_slot_status_; + } + return Pkcs12Reader::IsCertWithNicknameInSlots(nickname_in, + is_nickname_present); + } + + Pkcs12ReaderStatusCode DoesKeyForCertExist( + PK11SlotInfo* slot, + const Pkcs12ReaderCertSearchType cert_type, + const scoped_refptr<net::X509Certificate>& cert) const override { + find_key_by_cert_called_++; + if (cert_type == Pkcs12ReaderCertSearchType::kPlainType && + find_key_by_cert_status_.has_value()) { + return find_key_by_cert_status_.value(); + } + if (cert_type == Pkcs12ReaderCertSearchType::kDerType && + find_key_by_der_cert_status_.has_value()) { + return find_key_by_der_cert_status_.value(); + } + return Pkcs12Reader::DoesKeyForCertExist(slot, cert_type, cert); + } + + Pkcs12ReaderStatusCode GetCertFromDerData( + const unsigned char* der_cert_data, + int der_cert_len, + bssl::UniquePtr<X509>& x509) const override { + return Pkcs12Reader::GetCertFromDerData(der_cert_data, der_cert_len, x509); + } + + std::vector<uint8_t> BignumToBytes(const BIGNUM* bignum) const override { + if (bignum_to_bytes_value_) { + return bignum_to_bytes_value_.value(); + } + return Pkcs12Reader::BignumToBytes(bignum); + } + + Pkcs12ReaderStatusCode IsCertInSlot( + PK11SlotInfo* slot, + const scoped_refptr<net::X509Certificate>& cert, + bool& is_cert_present) const override { + is_cert_in_slot_called_++; + if (is_cert_in_slot_override_.has_value()) { + is_cert_present = is_cert_in_slot_override_.value(); + return Pkcs12ReaderStatusCode::kSuccess; + } + if (is_cert_in_slot_status_ != Pkcs12ReaderStatusCode::kSuccess) { + return is_cert_in_slot_status_; + } + return Pkcs12Reader::IsCertInSlot(slot, cert, is_cert_present); + } + + mutable int get_pkcs12_key_and_cert_called_ = 0; + mutable bssl::UniquePtr<STACK_OF(X509)> fake_certs_; + Pkcs12ReaderStatusCode get_pkcs12_key_and_cert_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int get_der_encode_cert_called_ = 0; + Pkcs12ReaderStatusCode get_der_encoded_cert_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int get_issuer_name_der_called_ = 0; + Pkcs12ReaderStatusCode get_issuer_name_der_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int get_subject_name_der_called_ = 0; + Pkcs12ReaderStatusCode get_subject_name_der_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int get_serial_number_der_called_ = 0; + Pkcs12ReaderStatusCode get_serial_number_der_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int find_raw_certs_with_subject_called_ = 0; + Pkcs12ReaderStatusCode find_raw_certs_with_subject_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable bssl::UniquePtr<STACK_OF(X509)> certs_with_same_DN_override_; + mutable bool fake_some_certs_in_slot_ = false; + mutable int get_label_called_ = 0; + mutable int get_label_override_ = false; + Pkcs12ReaderStatusCode get_label_status_ = Pkcs12ReaderStatusCode::kSuccess; + mutable int is_certs_with_nickname_in_slots_override_ = 0; + mutable int is_certs_with_nickname_in_slots_called_ = 0; + Pkcs12ReaderStatusCode is_certs_with_nickname_in_slot_status_ = + Pkcs12ReaderStatusCode::kSuccess; + bool is_certs_nickname_used_ = false; + mutable int get_key_data_called_ = 0; + Pkcs12ReaderStatusCode get_key_data_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int check_relation_data_called_ = 0; + Pkcs12ReaderStatusCode check_relation_status_ = + Pkcs12ReaderStatusCode::kSuccess; + mutable int find_key_by_cert_called_ = 0; + std::optional<Pkcs12ReaderStatusCode> find_key_by_cert_status_; + std::optional<Pkcs12ReaderStatusCode> find_key_by_der_cert_status_; + mutable int is_cert_in_slot_called_ = 0; + std::optional<bool> is_cert_in_slot_override_; + Pkcs12ReaderStatusCode is_cert_in_slot_status_ = + Pkcs12ReaderStatusCode::kSuccess; + + std::optional<std::vector<uint8_t>> bignum_to_bytes_value_ = std::nullopt; +}; + +class KcerChapsUtilImplTest : public ::testing::Test { + public: + KcerChapsUtilImplTest() { + auto chaps_slot_session_factory = + std::make_unique<FakeChapsSlotSessionFactory>(nss_test_db_.slot(), + &passed_data_); + kcer_chaps_util_impl_ = + std::make_unique<KcerChapsUtil>(std::move(chaps_slot_session_factory)); + kcer_chaps_util_impl_->SetIsChapsProvidedSlotForTesting(true); + } + KcerChapsUtilImplTest(const KcerChapsUtilImplTest&) = delete; + KcerChapsUtilImplTest& operator=(const KcerChapsUtilImplTest&) = delete; + ~KcerChapsUtilImplTest() override = default; + + protected: + static std::vector<uint8_t> ReadTestFile(const std::string& file_name) { + base::FilePath file_path = + net::GetTestCertsDirectory().AppendASCII(file_name); + std::optional<std::vector<uint8_t>> file_data = ReadFileToBytes(file_path); + EXPECT_TRUE(file_data.has_value()); + if (!file_data.has_value()) { + return {}; + } + return file_data.value(); + } + + static std::vector<uint8_t>& GetPkcs12Data(std::string file_name) { + static std::vector<uint8_t> pkcs12_data_; + pkcs12_data_ = ReadTestFile(file_name); + return pkcs12_data_; + } + + static std::vector<uint8_t>& GetPkcs12Data() { + return GetPkcs12Data("client.p12"); + } + + static std::vector<uint8_t>& GetPkcs12WithEcKeyData() { + return GetPkcs12Data("client_with_ec_key.p12"); + } + + bool KeyImportNeverDone() const { + ObjectAttributes data = passed_data_.pkcs12_key_attributes; + return data.Size() == 0; + } + + bool CertImportNeverDone() const { + return passed_data_.pkcs12_cert_attributes.empty(); + } + + bool KeyImportDone() const { + ObjectAttributes data = passed_data_.pkcs12_key_attributes; + return data.Size() == 19; // valid only for ReadTestFile("client.p12"). + } + + bool CertImportDone() const { + ObjectAttributes data = passed_data_.pkcs12_cert_attributes[0]; + return data.Size() == 10; // valid only for ReadTestFile("client.p12"). + } + + crypto::ScopedTestNSSDB nss_test_db_; + PassedData passed_data_; + + std::unique_ptr<KcerChapsUtil> kcer_chaps_util_impl_; +}; + +// Verify that ChapsUtil passed the correct slot id to the factory. +TEST_F(KcerChapsUtilImplTest, ImportPkcs12CertificateSuccessSlotOk) { + kcer_chaps_util_impl_->ImportPkcs12Certificate( + nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/true); + + EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); +} + +// Successfully import public key and single certificate from PKCS12 file to +// Chaps software slot. +TEST_F(KcerChapsUtilImplTest, ImportPkcs12EnforceSoftwareBackedSuccess) { + using OPTIONAL_CK_BYTE_VECTOR = std::optional<std::vector<CK_BYTE>>; + std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_key_data; + // Strings below have hardcoded fields from "client.p12" which is referenced + // by GetPkcs12Data(), they are Base64Encoded for the shorter representation. + // Original CkByte values from the key_data can be printed using this example: + // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); + expected_key_data[CKA_MODULUS] = base::Base64Decode( + "1JC7k5aWwwOpqoiNzoRHLRdmzH9h4kVmFlBU/vZ5e7hCSnnIbVJilMxDB+p0b7ozw1/" + "bHvsRqikARkMc0OnC4EMnm6BEopqiyOnNGBy1qXwol5Mw8T8zwlzJl7FQdQdlH7pMxuID8hZ" + "Eu8VkoEyLYJVJ1Ylaasc5BC0pHxZdNKk="); + expected_key_data[CKA_ID] = + base::Base64Decode("U65QueEa+ljfdKySfD6QbFrXEcM="); + expected_key_data[CKA_PUBLIC_EXPONENT] = base::Base64Decode("AQAB"); + expected_key_data[CKA_PRIVATE_EXPONENT] = base::Base64Decode( + "y/k2hiFy+h+BqArxSMLWKgbStlll7GL7212qsh6B5J6jviOumHj98BsyF1577" + "NqY4VoSQmBaSxadFM9Bz5cBT8IrKr2/FjL1AC+wgdwUvGvbD426zN4Yb59cTf/" + "bhNkvd2xocFPHeMDETFD6ISEcV6YLbPAtNlom7qVxlSTn1KE="); + expected_key_data[CKA_PRIME_1] = base::Base64Decode( + "8W127p18wtuvUBxz7MtZgAPk/1OGLj1RJghuVYbHaCJ9sT5AzK8eNcRqCld/" + "bKABDdmYf3QHKYDx+vcrhcNF8w=="); + expected_key_data[CKA_PRIME_2] = base::Base64Decode( + "4WVKE2h5oF7HYpX2sLgHXFhM77k6Hb1MalKk1MvXSYeKLnFf1Xh4Af2tUR73RmG/Mp/" + "evvUMu6h4AvlGvn+18w=="); + expected_key_data[CKA_EXPONENT_1] = base::Base64Decode( + "SUZzCXstKaspq4PnP2B8upj0APalzBT6MzPt4PF2RknpokkFu9oOrjz9/" + "kOOPjbV+xEm8tAReGxVhVlNkVyyNw=="); + expected_key_data[CKA_EXPONENT_2] = base::Base64Decode( + "DkFqwvl7n9H+yFR1ys2I4aVQEGVlsJXVbHAXrsHJtwPUkIVpK0Y4SN/" + "zg0rzFsd94UTNQMSc7o2EMaP0fn3zUw=="); + expected_key_data[CKA_COEFFICIENT] = base::Base64Decode( + "mV2Q/My7RVOOsSZGDEouCYMcVahOFWS84IcpYRwR9ds0KZ4hKcdyMGNR5/4ryvr9XMA+DBR/" + "L9GBSWe6CeK3RQ=="); + + std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_cert_data; + // Strings below have hardcoded fields from "client.p12" which is referenced + // by GetPkcs12Data(), they are Base64Encoded for shorter representation. + // Original CkByte values from the key_data can be printed using this example: + // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); + expected_cert_data[CKA_CERTIFICATE_TYPE] = base::Base64Decode("AAAAAAAAAAA="); + expected_cert_data[CKA_ID] = + base::Base64Decode("U65QueEa+ljfdKySfD6QbFrXEcM="); + expected_cert_data[CKA_LABEL] = default_encoded_cert_label; + expected_cert_data[CKA_VALUE] = base::Base64Decode( + "MIICpTCCAg6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJBVTETMBEGA1UE" + "CBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYD" + "VQQDEwZ0ZXN0Y2EwIBcNMTAwNzMwMDEwMjEyWhgPMjA2MDA3MTcwMTAyMTJaMFwxCzAJBgNV" + "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz" + "IFB0eSBMdGQxFTATBgNVBAMTDHRlc3R1c2VyY2VydDCBnzANBgkqhkiG9w0BAQEFAAOBjQAw" + "gYkCgYEA1JC7k5aWwwOpqoiNzoRHLRdmzH9h4kVmFlBU/" + "vZ5e7hCSnnIbVJilMxDB+p0b7ozw1/" + "bHvsRqikARkMc0OnC4EMnm6BEopqiyOnNGBy1qXwol5Mw8T8zwlzJl7FQdQdlH7pMxuID8hZ" + "Eu8VkoEyLYJVJ1Ylaasc5BC0pHxZdNKkCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvh" + "CAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFHqEH18NKRV" + "bhkqTT8swZq22Dc4YMB8GA1UdIwQYMBaAFE8aGkwMhipgaDysVMfu3JaN29ILMA0GCSqGSIb" + "3DQEBBQUAA4GBAKMT7cwjZtgmkFrJPAa/" + "oOt1cdoBD7MqErx+tdvVN62q0h0Vl6UM3a94Ic0/" + "sv1V8RT5TUYUyyuepr2Gm58uqkcbI3qflveVcvi96n7fCCo6NwxbKHmpVOx+" + "wcPlHtjfek2KGQnee3mEN0YY/HOP5Rvj0Bh302kLrfgFx3xN1G5I"); + expected_cert_data[CKA_ISSUER] = base::Base64Decode( + "MFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5l" + "dCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYQ=="); + expected_cert_data[CKA_SUBJECT] = base::Base64Decode( + "MFwxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5l" + "dCBXaWRnaXRzIFB0eSBMdGQxFTATBgNVBAMTDHRlc3R1c2VyY2VydA=="); + expected_cert_data[CKA_SERIAL_NUMBER] = base::Base64Decode("AgEB"); + kcer_chaps_util_impl_->ImportPkcs12Certificate( + nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/true); + + // Verify that ChapsUtil passed the correct slot id to the factory. + EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); + + // Verify that ChapsUtil passed the expected attributes. + // Check attributes for private key. + ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; + const int expected_private_key_attributes = 19; + EXPECT_EQ(key_data.Size(), expected_private_key_attributes); + EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); + EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_RSA); + EXPECT_EQ(key_data.GetCkBool(CKA_TOKEN), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SENSITIVE), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_PRIVATE), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_UNWRAP), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_DECRYPT), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SIGN), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SIGN_RECOVER), CK_TRUE); + EXPECT_EQ(key_data.GetCkByte(CKA_MODULUS), expected_key_data[CKA_MODULUS]); + EXPECT_EQ(key_data.GetCkByte(CKA_ID), expected_key_data[CKA_ID]); + EXPECT_EQ(key_data.GetCkByte(CKA_PUBLIC_EXPONENT), + expected_key_data[CKA_PUBLIC_EXPONENT]); + EXPECT_EQ(key_data.GetCkByte(CKA_PRIVATE_EXPONENT), + expected_key_data[CKA_PRIVATE_EXPONENT]); + EXPECT_EQ(key_data.GetCkByte(CKA_PRIME_1), expected_key_data[CKA_PRIME_1]); + EXPECT_EQ(key_data.GetCkByte(CKA_PRIME_2), expected_key_data[CKA_PRIME_2]); + EXPECT_EQ(key_data.GetCkByte(CKA_EXPONENT_1), + expected_key_data[CKA_EXPONENT_1]); + EXPECT_EQ(key_data.GetCkByte(CKA_EXPONENT_2), + expected_key_data[CKA_EXPONENT_2]); + EXPECT_EQ(key_data.GetCkByte(CKA_COEFFICIENT), + expected_key_data[CKA_COEFFICIENT]); + + // Checking attributes for certificate. + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + const int expected_cert_attributes = 10; + EXPECT_EQ(cert_data.Size(), expected_cert_attributes); + EXPECT_EQ(cert_data.GetCkBool(CKA_TOKEN), CK_TRUE); + EXPECT_EQ(cert_data.GetCkULong(CKA_CLASS), CKO_CERTIFICATE); + EXPECT_EQ(cert_data.GetCkByte(CKA_CERTIFICATE_TYPE), + expected_cert_data[CKA_CERTIFICATE_TYPE]); + EXPECT_EQ(cert_data.GetCkByte(CKA_ID), expected_cert_data[CKA_ID]); + EXPECT_EQ(cert_data.GetCkByte(CKA_VALUE), expected_cert_data[CKA_VALUE]); + EXPECT_EQ(cert_data.GetCkByte(CKA_ISSUER), expected_cert_data[CKA_ISSUER]); + EXPECT_EQ(cert_data.GetCkByte(CKA_SUBJECT), expected_cert_data[CKA_SUBJECT]); + EXPECT_EQ(cert_data.GetCkByte(CKA_SERIAL_NUMBER), + expected_cert_data[CKA_SERIAL_NUMBER]); + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_cert_data[CKA_LABEL]); +} + +// This is same test as ImportPkcs12EnforceSoftBackSuccess but with +// kKeyInSoftware = false, so key will be hardware backed. +// Only number of stored attributes and required minimum of values is checked, +// because we use same pkcs12 file "client.p12" and all values match already +// checked in ImportPkcs12EnforceSoftwareBackedSuccess test. +TEST_F(KcerChapsUtilImplTest, ImportPkcs12HardwareBackedSuccess) { + kcer_chaps_util_impl_->ImportPkcs12Certificate( + nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/false); + + // Verify that ChapsUtil passed the correct slot id to the factory. + EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); + + // Verify that ChapsUtil passed the expected attributes. + // Check only kForceSoftwareAttribute attribute for private key. + ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; + const int expected_private_key_attributes = 19; + EXPECT_EQ(key_data.Size(), expected_private_key_attributes); + EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); + EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_RSA); + EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_FALSE); + + // Check only number of attributes for certificate. + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + const int expected_cert_attributes = 10; + EXPECT_EQ(cert_data.Size(), expected_cert_attributes); +} + +// Successfully import EC key and single certificate from PKCS12 file to +// Chaps software slot with is_software_backed = false. +TEST_F(KcerChapsUtilImplTest, ImportPkcs12WithEcKeyHardwareBackedSuccess) { + using OPTIONAL_CK_BYTE_VECTOR = absl::optional<std::vector<CK_BYTE>>; + std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_key_data; + // Strings below have hardcoded fields from "client_with_ec_key.p12" which is + // referenced by GetPkcs12Data(), they are Base64Encoded for the shorter + // representation. Original CkByte values from the key_data can be printed + // using this example: + // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); + expected_key_data[CKA_ID] = cka_id_for_ec_key; + expected_key_data[CKA_EC_POINT] = cka_ex_point_ec_key; + expected_key_data[CKA_VALUE] = cka_value_ec_key; + expected_key_data[CKA_EC_PARAMS] = cka_ec_params_ec_key; + + kcer_chaps_util_impl_->ImportPkcs12Certificate(nss_test_db_.slot(), + GetPkcs12WithEcKeyData(), + kPkcs12FileMin6CharPassword, + /*is_software_backed=*/false); + + // Verify that ChapsUtil passed the correct slot id to the factory. + EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); + + // Verify that ChapsUtil passed the expected attributes. + // Check only kForceSoftwareAttribute attribute for private key. + ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; + const int number_of_expected_key_attributes = 13; + EXPECT_EQ(key_data.Size(), number_of_expected_key_attributes); + EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); + EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_EC); + + EXPECT_EQ(key_data.GetCkBool(CKA_TOKEN), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SENSITIVE), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_FALSE); + EXPECT_EQ(key_data.GetCkBool(CKA_SIGN), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SIGN_RECOVER), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_DERIVE), CK_TRUE); + EXPECT_EQ(key_data.GetCkByte(CKA_ID), expected_key_data[CKA_ID]); + EXPECT_EQ(key_data.GetCkByte(CKA_VALUE), expected_key_data[CKA_VALUE]); + EXPECT_EQ(key_data.GetCkByte(CKA_EC_POINT), expected_key_data[CKA_EC_POINT]); + EXPECT_EQ(key_data.GetCkBool(CKA_PRIVATE), CK_TRUE); + EXPECT_EQ(key_data.GetCkByte(CKA_EC_PARAMS), + expected_key_data[CKA_EC_PARAMS]); +} + +// Successfully import EC key and single certificate from PKCS12 file to +// Chaps software slot with is_software_backed = true. +TEST_F(KcerChapsUtilImplTest, ImportPkcs12WithEcKeySoftwareBackedSuccess) { + using OPTIONAL_CK_BYTE_VECTOR = absl::optional<std::vector<CK_BYTE>>; + std::map<CK_ATTRIBUTE_TYPE, OPTIONAL_CK_BYTE_VECTOR> expected_key_data; + // Strings below have hardcoded fields from "client_with_ec_key.p12" which is + // referenced by GetPkcs12Data(), they are Base64Encoded for the shorter + // representation. Original CkByte values from the key_data can be printed + // using this example: + // std::cout << base::Base64Encode(std::move(*key_data.GetCkByte(CKA_LABEL))); + expected_key_data[CKA_ID] = cka_id_for_ec_key; + expected_key_data[CKA_EC_POINT] = cka_ex_point_ec_key; + expected_key_data[CKA_VALUE] = cka_value_ec_key; + expected_key_data[CKA_EC_PARAMS] = cka_ec_params_ec_key; + kcer_chaps_util_impl_->ImportPkcs12Certificate(nss_test_db_.slot(), + GetPkcs12WithEcKeyData(), + kPkcs12FileMin6CharPassword, + /*is_software_backed=*/true); + + // Verify that ChapsUtil passed the correct slot id to the factory. + EXPECT_EQ(passed_data_.slot_id, PK11_GetSlotID(nss_test_db_.slot())); + + // Verify that ChapsUtil passed the expected attributes. + // Check only kForceSoftwareAttribute attribute for private key. + ObjectAttributes key_data = passed_data_.pkcs12_key_attributes; + const int number_of_expected_key_attributes = 13; + EXPECT_EQ(key_data.Size(), number_of_expected_key_attributes); + EXPECT_EQ(key_data.GetCkULong(CKA_CLASS), CKO_PRIVATE_KEY); + EXPECT_EQ(key_data.GetCkULong(CKA_KEY_TYPE), CKK_EC); + + EXPECT_EQ(key_data.GetCkBool(CKA_TOKEN), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SENSITIVE), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(kForceSoftwareAttribute), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SIGN), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_SIGN_RECOVER), CK_TRUE); + EXPECT_EQ(key_data.GetCkBool(CKA_DERIVE), CK_TRUE); + EXPECT_EQ(key_data.GetCkByte(CKA_ID), expected_key_data[CKA_ID]); + EXPECT_EQ(key_data.GetCkByte(CKA_VALUE), expected_key_data[CKA_VALUE]); + EXPECT_EQ(key_data.GetCkByte(CKA_EC_POINT), expected_key_data[CKA_EC_POINT]); + EXPECT_EQ(key_data.GetCkBool(CKA_PRIVATE), CK_TRUE); + EXPECT_EQ(key_data.GetCkByte(CKA_EC_PARAMS), + expected_key_data[CKA_EC_PARAMS]); +} + +class ChapsUtilPKCS12ImportTest : public KcerChapsUtilImplTest { + public: + ChapsUtilPKCS12ImportTest() { + GetPkcs12Data(); + EXPECT_FALSE(GetPkcs12Data().empty()); + } + + bool RunImportPkcs12Certificate() { + return kcer_chaps_util_impl_->ImportPkcs12CertificateImpl( + nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/true, fake_pkcs12_reader_); + } + + FakePkcs12Reader fake_pkcs12_reader_; +}; + +TEST_F(ChapsUtilPKCS12ImportTest, DefaultCasePKCS12ImportSuccessful) { + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(import_result, true); +} + +TEST_F(ChapsUtilPKCS12ImportTest, NoChapsSessionPKCS12ImportFailed) { + bool import_result = kcer_chaps_util_impl_->ImportPkcs12CertificateImpl( + /*slot=*/nullptr, GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/true, fake_pkcs12_reader_); + + EXPECT_EQ(import_result, false); +} + +// Failed import PKCS12 due to empty keys. +TEST_F(ChapsUtilPKCS12ImportTest, EmptyKeyPtrPKCS12ImportFailed) { + fake_pkcs12_reader_.get_pkcs12_key_and_cert_status_ = + Pkcs12ReaderStatusCode::kKeyExtractionFailed; + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +// Failed import PKCS12 due to missed key attribute. +TEST_F(ChapsUtilPKCS12ImportTest, MissedKeyAttributePKCS12ImportFailed) { + // This will set all attributes to empty. + fake_pkcs12_reader_.bignum_to_bytes_value_ = std::vector<uint8_t>(); + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +TEST_F(ChapsUtilPKCS12ImportTest, ImportOfKeyFailedPKCS12ImportFailed) { + // Mock CreateObject operations result. + passed_data_.operation_results[0] = CKR_GENERAL_ERROR; + + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +TEST_F(ChapsUtilPKCS12ImportTest, FailedGetCertDerPKCS12ImportFailed) { + fake_pkcs12_reader_.get_der_encoded_cert_status_ = + Pkcs12ReaderStatusCode::kKeyExtractionFailed; + + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +TEST_F(ChapsUtilPKCS12ImportTest, FailedGetIssuerNameDerPKCS12ImportFailed) { + fake_pkcs12_reader_.get_issuer_name_der_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertIssuerDerNameFailed; + + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +TEST_F(ChapsUtilPKCS12ImportTest, FailedGetSubjectNameDerPKCS12ImportFailed) { + fake_pkcs12_reader_.get_subject_name_der_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertSubjectNameDerFailed; + + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +TEST_F(ChapsUtilPKCS12ImportTest, FailedGetSerialNumberDerPKCS12ImportFailed) { + fake_pkcs12_reader_.get_serial_number_der_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertSerialNumberDerFailed; + + bool import_result = RunImportPkcs12Certificate(); + EXPECT_EQ(import_result, false); +} + +TEST_F(ChapsUtilPKCS12ImportTest, CertObjectCreationFailedPKCS12ImportFailed) { + // Mock CreateObject operations result for key import. + passed_data_.operation_results[0] = CKR_OK; + // Mock CreateObject operations result for the certificate import. + passed_data_.operation_results[1] = CKR_GENERAL_ERROR; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_FALSE(import_result); +} + +// Empty list returned for certificates from GetPkcs12KeyAndCerts, key is ok. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, NoCertsForValidationPKCS12ImportFailed) { + fake_pkcs12_reader_.fake_certs_ = + bssl::UniquePtr<STACK_OF(X509)>(sk_X509_new_null()); + + bool import_result = kcer_chaps_util_impl_->ImportPkcs12CertificateImpl( + nss_test_db_.slot(), GetPkcs12Data(), kPkcs12FilePassword, + /*is_software_backed=*/true, fake_pkcs12_reader_); + + EXPECT_EQ(fake_pkcs12_reader_.get_pkcs12_key_and_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_key_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// GetKeyData fails to extract data for the key, validation fails. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, GetKeyDataFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.get_key_data_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_key_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 0); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// CheckRelation between cert and key fails, validation fails. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, CheckRelationFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.check_relation_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 0); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// Cert is not related to key, validation fails. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, CertNotRelatedToKeyPKCS12ImportFailed) { + fake_pkcs12_reader_.check_relation_status_ = + Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.check_relation_data_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 0); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// Cert has no DER subject name, GetNickname() fails, validation fails. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, CertHasNoDERSubjectNamePKCS12ImportFailed) { + fake_pkcs12_reader_.get_subject_name_der_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertSubjectNameMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_raw_certs_with_subject_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// FindRawCertsWithSubject fails during searching for cert with required +// subject in slot. GetNickname fails, validation fails. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, + FindRawCertsWithSubjectFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.find_raw_certs_with_subject_ = + Pkcs12ReaderStatusCode::kPkcs12FindCertsWithSubjectFailed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_subject_name_der_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.find_raw_certs_with_subject_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 0); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// There is one certificate with the same subject in slot, but GetLabel()) for +// it fails. Import will be successful with the currents cert's nickname. +TEST_F(ChapsUtilPKCS12ImportTest, + GetLabelForFoundCertFailedPKCS12ImportSucess) { + fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; + fake_pkcs12_reader_.get_label_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertIssuerNameMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 2); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// There is one certificate with the same subject in slot. +// Import will be successful with already stored test cert's nickname. +TEST_F(ChapsUtilPKCS12ImportTest, + CertWithSameSubjectInSlotPKCS12ImportSuccess) { + fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; + // python print(base64.b64encode("127.0.0.1".encode('utf-8'))). + auto expected_encoded_label = base::Base64Decode("MTI3LjAuMC4x"); + + bool import_result = RunImportPkcs12Certificate(); + + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_encoded_label); + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 0); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// There is one certificate with the same subject, but GetLabel for it returns +// empty string. Import will be successful with the cert's nickname. +TEST_F(ChapsUtilPKCS12ImportTest, GetLabelReturnsEmptyPKCS12ImportSuccess) { + fake_pkcs12_reader_.fake_some_certs_in_slot_ = true; + fake_pkcs12_reader_.get_label_override_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 2); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// No certificate with the same subject exists, GetLabel() for current cert +// fails, import will be successful with default label. +TEST_F(ChapsUtilPKCS12ImportTest, GetLabelFailedPKCS12ImportSuccess) { + fake_pkcs12_reader_.get_label_status_ = + Pkcs12ReaderStatusCode::kPkcs12LabelCreationFailed; + + bool import_result = RunImportPkcs12Certificate(); + + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), default_encoded_label); + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// No certificate with the same subject in slot, GetLabel() for the current cert +// returns empty string. Import will be successful with default label. +TEST_F(ChapsUtilPKCS12ImportTest, GetLabelReturnEmptyPKCS12ImportSuccess) { + fake_pkcs12_reader_.get_label_override_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), default_encoded_label); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(import_result); +} + +// No certificate with same subject exists, MakeNicknameUnique() fails. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, MakeNicknameUniqueFailedPKCS12ImportFailed) { + // Setting is_certs_nickname_used = true will lead to fail of making label + // unique, it will increase counter to 100 and at the end return + // Pkcs12ReaderStatusCode::kReachedMaxAttemptForUniqueness. + fake_pkcs12_reader_.is_certs_nickname_used_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 100); + + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// No certificate with same subject exists, MakeNicknameUnique() is called, but +// isCertsWithNicknamesInSlot is failing. +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, CertsSearchInSlotFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.is_certs_with_nickname_in_slot_status_ = + Pkcs12ReaderStatusCode::kPkcs12MissedNickname; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// 20 certificates with same subject already exists in slot, import is +// successful. Cert nicknames in slot will be 'testusercert', +// 'testusercert 1', ..., 'testusercert 19'. +TEST_F(ChapsUtilPKCS12ImportTest, CertsSearchInSlot20TimesPKCS12ImportFailed) { + fake_pkcs12_reader_.is_certs_with_nickname_in_slots_override_ = 20; + fake_pkcs12_reader_.is_certs_nickname_used_ = true; + // python print(base64.b64encode("testusercert 20".encode('utf-8'))) + auto expected_encoded_label = base::Base64Decode("dGVzdHVzZXJjZXJ0IDIw"); + + bool import_result = RunImportPkcs12Certificate(); + ObjectAttributes cert_data = passed_data_.pkcs12_cert_attributes[0]; + + EXPECT_EQ(cert_data.GetCkByte(CKA_LABEL), expected_encoded_label); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 21); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportDone()); +} + +// IsCertInSlot() failed, cert will not be installed in case of error. +// Import will fail because there are no certificates to be installed +TEST_F(ChapsUtilPKCS12ImportTest, IsCertInSlotFailedImportFailed) { + fake_pkcs12_reader_.is_cert_in_slot_status_ = + Pkcs12ReaderStatusCode::kCertificateDataMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_label_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_cert_in_slot_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// IsCertInSlot() has found already installed cert in slot. +// Import will fail because there are no certificates to be installed. +TEST_F(ChapsUtilPKCS12ImportTest, IsCertInSlotTrueImportFailed) { + fake_pkcs12_reader_.is_cert_in_slot_override_ = true; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.is_cert_in_slot_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// IsCertInSlot() did not find installed cert in the slot. +// Import will succeed. +TEST_F(ChapsUtilPKCS12ImportTest, IsCertInSlotFalseImportSucc) { + fake_pkcs12_reader_.is_cert_in_slot_override_ = false; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.is_cert_in_slot_called_, 1); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportDone()); +} + +// GetScopedCert() fails in CanFindInstalledKey(). +// Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, GetScopedCertFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.get_der_encoded_cert_status_ = + Pkcs12ReaderStatusCode::kPkcs12CertDerMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.get_der_encode_cert_called_, 1); + EXPECT_EQ(fake_pkcs12_reader_.is_certs_with_nickname_in_slots_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); +} + +// DoesKeyForCertExist() fails inside of CanFindInstalledKey() +// for kPlainType type of cert. Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, + FindPrivateKeyFromCertFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kMissedSlotInfo; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); + EXPECT_TRUE(CertImportNeverDone()); +} + +// Private key is found by kPlainType cert inside of CanFindInstalledKey(). +// Keys import will not happen, but cert will be imported. +TEST_F(ChapsUtilPKCS12ImportTest, FindPrivateKeyFromCertSuccPKCS12ImportSucc) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kSuccess; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 1); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); + EXPECT_TRUE(CertImportDone()); +} + +// DoesKeyForCertExist() fails inside of CanFindInstalledKey() +// for kDerType type of cert. Import will fail. +TEST_F(ChapsUtilPKCS12ImportTest, FindKeyByDERCertFailedPKCS12ImportFailed) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + fake_pkcs12_reader_.find_key_by_der_cert_status_ = + Pkcs12ReaderStatusCode::kMissedSlotInfo; + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 2); + EXPECT_FALSE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); + EXPECT_TRUE(CertImportNeverDone()); +} + +// Private key is found by kDerType cert inside of CanFindInstalledKey(). +// Keys import will not happen, but cert will be imported. +TEST_F(ChapsUtilPKCS12ImportTest, FindKeyByDERCertSuccPKCS12ImportSucc) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + fake_pkcs12_reader_.find_key_by_der_cert_status_ = + Pkcs12ReaderStatusCode::kSuccess; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 2); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportNeverDone()); + EXPECT_TRUE(CertImportDone()); +} + +// Private key is not installed. +// Keys will be imported, cert will be imported. +TEST_F(ChapsUtilPKCS12ImportTest, KeyNotInstalledPKCS12ImportSucc) { + fake_pkcs12_reader_.find_key_by_cert_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + fake_pkcs12_reader_.find_key_by_der_cert_status_ = + Pkcs12ReaderStatusCode::kKeyDataMissed; + + bool import_result = RunImportPkcs12Certificate(); + + EXPECT_EQ(fake_pkcs12_reader_.find_key_by_cert_called_, 2); + EXPECT_TRUE(import_result); + EXPECT_TRUE(KeyImportDone()); + EXPECT_TRUE(CertImportDone()); +} + +} // namespace +} // namespace kcer::internal
diff --git a/chromeos/ash/components/chaps_util/key_helper.cc b/chromeos/components/kcer/helpers/key_helper.cc similarity index 95% rename from chromeos/ash/components/chaps_util/key_helper.cc rename to chromeos/components/kcer/helpers/key_helper.cc index 7544a6a6..917e014 100644 --- a/chromeos/ash/components/chaps_util/key_helper.cc +++ b/chromeos/components/kcer/helpers/key_helper.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/ash/components/chaps_util/key_helper.h" +#include "chromeos/components/kcer/helpers/key_helper.h" #include <pk11pub.h> #include <stdint.h> @@ -18,7 +18,7 @@ #include "third_party/boringssl/src/include/openssl/evp.h" #include "third_party/boringssl/src/include/openssl/mem.h" -namespace chromeos { +namespace kcer::internal { crypto::ScopedSECItem MakeIdFromPubKeyNss( const std::vector<uint8_t>& public_key_bytes) { @@ -100,4 +100,4 @@ return EVP_PKEY_base_id(key.get()) == EVP_PKEY_RSA; } -} // namespace chromeos +} // namespace kcer::internal
diff --git a/chromeos/ash/components/chaps_util/key_helper.h b/chromeos/components/kcer/helpers/key_helper.h similarity index 82% rename from chromeos/ash/components/chaps_util/key_helper.h rename to chromeos/components/kcer/helpers/key_helper.h index 474f51c0..79d632d 100644 --- a/chromeos/ash/components/chaps_util/key_helper.h +++ b/chromeos/components/kcer/helpers/key_helper.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_KEY_HELPER_H_ -#define CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_KEY_HELPER_H_ +#ifndef CHROMEOS_COMPONENTS_KCER_HELPERS_KEY_HELPER_H_ +#define CHROMEOS_COMPONENTS_KCER_HELPERS_KEY_HELPER_H_ #include <stdint.h> @@ -14,7 +14,7 @@ #include "crypto/scoped_nss_types.h" #include "third_party/boringssl/src/include/openssl/base.h" -namespace chromeos { +namespace kcer::internal { // Calculates and returns CKA_ID from public key bytes (`public_key_bytes`). crypto::ScopedSECItem MakeIdFromPubKeyNss( @@ -28,12 +28,12 @@ // Extracts public `key` from EC_KEY object and returns it as X9.62 // uncompressed bytes. -COMPONENT_EXPORT(CHAPS_UTIL) +COMPONENT_EXPORT(KCER) std::vector<uint8_t> GetEcPublicKeyBytes(const EC_KEY* ec_key); // Extracts private `key` from EC_KEY object and returns it as bytes. // Leading zeros will be padded. -COMPONENT_EXPORT(CHAPS_UTIL) +COMPONENT_EXPORT(KCER) std::vector<uint8_t> GetEcPrivateKeyBytes(const EC_KEY* ec_key); // Verify that `key` has type of EVP_PKEY_EC. @@ -42,6 +42,6 @@ // Verify that `key` has type of EVP_PKEY_RSA. bool IsKeyRsaType(const bssl::UniquePtr<EVP_PKEY>& key); -} // namespace chromeos +} // namespace kcer::internal -#endif // CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_KEY_HELPER_H_ +#endif // CHROMEOS_COMPONENTS_KCER_HELPERS_KEY_HELPER_H_
diff --git a/chromeos/ash/components/chaps_util/key_helper_unittest.cc b/chromeos/components/kcer/helpers/key_helper_unittest.cc similarity index 95% rename from chromeos/ash/components/chaps_util/key_helper_unittest.cc rename to chromeos/components/kcer/helpers/key_helper_unittest.cc index b15c5c7..4a569c51 100644 --- a/chromeos/ash/components/chaps_util/key_helper_unittest.cc +++ b/chromeos/components/kcer/helpers/key_helper_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/ash/components/chaps_util/key_helper.h" +#include "chromeos/components/kcer/helpers/key_helper.h" #include <pk11pub.h> @@ -14,7 +14,7 @@ #include "third_party/boringssl/src/include/openssl/ec_key.h" #include "third_party/boringssl/src/include/openssl/evp.h" -namespace chromeos { +namespace kcer::internal { namespace { // Tests for helper methods from key_helper.h. Methods are mainly tested from @@ -80,4 +80,4 @@ } } // namespace -} // namespace chromeos +} // namespace kcer::internal
diff --git a/chromeos/ash/components/chaps_util/pkcs12_reader.cc b/chromeos/components/kcer/helpers/pkcs12_reader.cc similarity index 98% rename from chromeos/ash/components/chaps_util/pkcs12_reader.cc rename to chromeos/components/kcer/helpers/pkcs12_reader.cc index b083327..f93f81a7 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_reader.cc +++ b/chromeos/components/kcer/helpers/pkcs12_reader.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" #include <stdint.h> @@ -11,7 +11,7 @@ #include <vector> #include "base/containers/span.h" -#include "chromeos/ash/components/chaps_util/key_helper.h" +#include "chromeos/components/kcer/helpers/key_helper.h" #include "crypto/nss_util.h" #include "net/cert/x509_util_nss.h" #include "third_party/boringssl/src/include/openssl/base.h" @@ -21,7 +21,7 @@ #include "third_party/boringssl/src/include/openssl/stack.h" #include "third_party/boringssl/src/include/openssl/x509.h" -namespace chromeos { +namespace kcer::internal { CertData::CertData() = default; CertData::~CertData() = default; @@ -361,4 +361,4 @@ return Pkcs12ReaderStatusCode::kSuccess; } -} // namespace chromeos +} // namespace kcer::internal
diff --git a/chromeos/ash/components/chaps_util/pkcs12_reader.h b/chromeos/components/kcer/helpers/pkcs12_reader.h similarity index 94% rename from chromeos/ash/components/chaps_util/pkcs12_reader.h rename to chromeos/components/kcer/helpers/pkcs12_reader.h index 716efb2..94c37aca 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_reader.h +++ b/chromeos/components/kcer/helpers/pkcs12_reader.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_READER_H_ -#define CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_READER_H_ +#ifndef CHROMEOS_COMPONENTS_KCER_HELPERS_PKCS12_READER_H_ +#define CHROMEOS_COMPONENTS_KCER_HELPERS_PKCS12_READER_H_ #include <nss/certt.h> #include <stdint.h> @@ -20,7 +20,7 @@ #include "third_party/boringssl/src/include/openssl/pkcs7.h" #include "third_party/boringssl/src/include/openssl/stack.h" -namespace chromeos { +namespace kcer::internal { // Used for logging, the values should never be reordered or reused. enum class Pkcs12ReaderStatusCode { @@ -74,7 +74,7 @@ std::string nickname; }; -struct COMPONENT_EXPORT(CHAPS_UTIL) KeyData { +struct COMPONENT_EXPORT(KCER) KeyData { KeyData(); KeyData(KeyData&&); KeyData& operator=(KeyData&&) = default; @@ -85,7 +85,7 @@ // Class helper for operations with X509 certificates data which are required // for storing keys and certificates in Chaps. -class COMPONENT_EXPORT(CHAPS_UTIL) Pkcs12Reader { +class COMPONENT_EXPORT(KCER) Pkcs12Reader { public: Pkcs12Reader(); @@ -184,6 +184,6 @@ const scoped_refptr<net::X509Certificate>& cert, bool& is_cert_present) const; }; -} // namespace chromeos +} // namespace kcer::internal -#endif // CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_READER_H_ +#endif // CHROMEOS_COMPONENTS_KCER_HELPERS_PKCS12_READER_H_
diff --git a/chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc b/chromeos/components/kcer/helpers/pkcs12_reader_unittest.cc similarity index 99% rename from chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc rename to chromeos/components/kcer/helpers/pkcs12_reader_unittest.cc index 99fc214..158ad4f78 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_reader_unittest.cc +++ b/chromeos/components/kcer/helpers/pkcs12_reader_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" #include <pk11pub.h> #include <stdint.h> @@ -13,7 +13,7 @@ #include "base/base64.h" #include "base/containers/span.h" -#include "chromeos/ash/components/chaps_util/key_helper.h" +#include "chromeos/components/kcer/helpers/key_helper.h" #include "crypto/scoped_test_nss_db.h" #include "net/cert/x509_certificate.h" #include "net/cert/x509_util_nss.h" @@ -29,7 +29,7 @@ #include "third_party/boringssl/src/include/openssl/stack.h" #include "third_party/boringssl/src/include/openssl/x509.h" -namespace chromeos { +namespace kcer::internal { namespace { const char kPkcs12FilePassword[] = "12345"; @@ -987,4 +987,4 @@ } } // namespace -} // namespace chromeos +} // namespace kcer::internal
diff --git a/chromeos/ash/components/chaps_util/pkcs12_validator.cc b/chromeos/components/kcer/helpers/pkcs12_validator.cc similarity index 98% rename from chromeos/ash/components/chaps_util/pkcs12_validator.cc rename to chromeos/components/kcer/helpers/pkcs12_validator.cc index 8df3fc2..6adad72 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_validator.cc +++ b/chromeos/components/kcer/helpers/pkcs12_validator.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/ash/components/chaps_util/pkcs12_validator.h" +#include "chromeos/components/kcer/helpers/pkcs12_validator.h" #include <cert.h> #include <stdint.h> @@ -14,13 +14,13 @@ #include "base/containers/span.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" #include "third_party/boringssl/src/include/openssl/base.h" #include "third_party/boringssl/src/include/openssl/mem.h" #include "third_party/boringssl/src/include/openssl/pkcs8.h" #include "third_party/boringssl/src/include/openssl/stack.h" -namespace chromeos { +namespace kcer::internal { namespace { constexpr char kPkcs12CertImportFailed[] = @@ -348,4 +348,4 @@ return Pkcs12ReaderStatusCode::kPkcs12NoValidCertificatesFound; } -} // namespace chromeos +} // namespace kcer::internal
diff --git a/chromeos/ash/components/chaps_util/pkcs12_validator.h b/chromeos/components/kcer/helpers/pkcs12_validator.h similarity index 84% rename from chromeos/ash/components/chaps_util/pkcs12_validator.h rename to chromeos/components/kcer/helpers/pkcs12_validator.h index e8b2da7..a9335eed 100644 --- a/chromeos/ash/components/chaps_util/pkcs12_validator.h +++ b/chromeos/components/kcer/helpers/pkcs12_validator.h
@@ -3,21 +3,21 @@ // found in the LICENSE file. // This file contains a group of functions which are used for pkcs12 data -// validation before data import to chaps. They are used in chaps_util_impl.cc, +// validation before data import to chaps. They are used in kcer_chaps_util.cc, // but they are not related to chaps, so they were moved to a separate file. -#ifndef CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_VALIDATOR_H_ -#define CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_VALIDATOR_H_ +#ifndef CHROMEOS_COMPONENTS_KCER_HELPERS_PKCS12_VALIDATOR_H_ +#define CHROMEOS_COMPONENTS_KCER_HELPERS_PKCS12_VALIDATOR_H_ #include <string> #include <vector> #include "base/memory/raw_ref.h" -#include "chromeos/ash/components/chaps_util/pkcs12_reader.h" +#include "chromeos/components/kcer/helpers/pkcs12_reader.h" #include "third_party/boringssl/src/include/openssl/base.h" #include "third_party/boringssl/src/include/openssl/stack.h" -namespace chromeos { +namespace kcer::internal { // Returns an error message corresponding to the given import error code. std::string MakePkcs12CertImportErrorMessage(Pkcs12ReaderStatusCode error_code); @@ -51,6 +51,6 @@ const Pkcs12Reader& pkcs12_reader, bool& is_key_installed); -} // namespace chromeos +} // namespace kcer::internal -#endif // CHROMEOS_ASH_COMPONENTS_CHAPS_UTIL_PKCS12_VALIDATOR_H_ +#endif // CHROMEOS_COMPONENTS_KCER_HELPERS_PKCS12_VALIDATOR_H_
diff --git a/chromeos/components/kcer/kcer_nss/kcer_nss_fuzzer.cc b/chromeos/components/kcer/kcer_nss/kcer_nss_fuzzer.cc index 31e23fa..1b3e2f3 100644 --- a/chromeos/components/kcer/kcer_nss/kcer_nss_fuzzer.cc +++ b/chromeos/components/kcer/kcer_nss/kcer_nss_fuzzer.cc
@@ -1328,8 +1328,8 @@ return; } ASSERT_TRUE(key_permissions_waiter.Get().has_value()); - EXPECT_TRUE(KeyPermissionsEqual(key_permissions_waiter.Get().value(), - expected_key->key_permissions)); + EXPECT_TRUE(ExpectKeyPermissionsEqual(key_permissions_waiter.Get().value(), + expected_key->key_permissions)); } void KcerFuzzer::RunGetCertProvisioningProfileId() {
diff --git a/chromeos/components/kcer/kcer_nss/kcer_nss_unittest.cc b/chromeos/components/kcer/kcer_nss/kcer_nss_unittest.cc index 5d0aaab..8bd0c4ab 100644 --- a/chromeos/components/kcer/kcer_nss/kcer_nss_unittest.cc +++ b/chromeos/components/kcer/kcer_nss/kcer_nss_unittest.cc
@@ -12,7 +12,6 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/memory/raw_ref.h" -#include "base/strings/stringprintf.h" #include "base/task/bind_post_task.h" #include "base/test/test_future.h" #include "chromeos/components/kcer/kcer.h" @@ -108,15 +107,6 @@ return res.str(); } -std::string ToString(const std::optional<chaps::KeyPermissions>& val) { - if (!val.has_value()) { - return "<empty>"; - } - // Should be updated if `KeyPermissions` struct is changed. - return base::StringPrintf("[arc:%d corp:%d]", val->key_usages().arc(), - val->key_usages().corporate()); -} - std::unique_ptr<kcer::Kcer> CreateKcer( scoped_refptr<base::TaskRunner> token_task_runner, base::WeakPtr<kcer::internal::KcerToken> user_token, @@ -934,6 +924,19 @@ } { + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + key_permissions_waiter; + kcer_->GetKeyPermissions(PrivateKeyHandle(public_key), + key_permissions_waiter.GetCallback()); + ASSERT_TRUE(key_permissions_waiter.Get().has_value()); + const std::optional<chaps::KeyPermissions>& key_permissions = + key_permissions_waiter.Get().value(); + EXPECT_TRUE( + ExpectKeyPermissionsEqual(expected_key_permissions, key_permissions)); + } + + { expected_key_permissions.mutable_key_usages()->set_corporate(true); expected_key_permissions.mutable_key_usages()->set_arc(true); @@ -953,10 +956,8 @@ ASSERT_TRUE(key_permissions_waiter.Get().has_value()); const std::optional<chaps::KeyPermissions>& key_permissions = key_permissions_waiter.Get().value(); - EXPECT_TRUE(KeyPermissionsEqual(expected_key_permissions, key_permissions)) - << "ERROR: key_permissions: expected: " - << ToString(expected_key_permissions) - << ", actual: " << ToString(key_permissions); + EXPECT_TRUE( + ExpectKeyPermissionsEqual(expected_key_permissions, key_permissions)); } {
diff --git a/chromeos/components/kcer/kcer_nss/test_utils.cc b/chromeos/components/kcer/kcer_nss/test_utils.cc index ccdceebd..2b96b37 100644 --- a/chromeos/components/kcer/kcer_nss/test_utils.cc +++ b/chromeos/components/kcer/kcer_nss/test_utils.cc
@@ -7,6 +7,7 @@ #include "base/functional/bind.h" #include "base/logging.h" #include "base/run_loop.h" +#include "base/strings/stringprintf.h" #include "chromeos/components/kcer/kcer_token.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -15,6 +16,16 @@ using SignatureAlgorithm = crypto::SignatureVerifier::SignatureAlgorithm; namespace kcer { +namespace { +std::string ToString(const std::optional<chaps::KeyPermissions>& val) { + if (!val.has_value()) { + return "<empty>"; + } + // Should be updated if `KeyPermissions` struct is changed. + return base::StringPrintf("[arc:%d corp:%d]", val->key_usages().arc(), + val->key_usages().corporate()); +} +} // namespace TokenHolder::TokenHolder(Token token, bool initialize) { io_token_ = std::make_unique<internal::KcerTokenImplNss>(token); @@ -56,12 +67,20 @@ //============================================================================== -bool KeyPermissionsEqual(const std::optional<chaps::KeyPermissions>& a, - const std::optional<chaps::KeyPermissions>& b) { +[[nodiscard]] bool ExpectKeyPermissionsEqual( + const std::optional<chaps::KeyPermissions>& a, + const std::optional<chaps::KeyPermissions>& b) { + bool result = true; if (!a.has_value() || !b.has_value()) { - return (a.has_value() == b.has_value()); + result = (a.has_value() == b.has_value()); + } else { + result = (a->SerializeAsString() == b->SerializeAsString()); } - return (a->SerializeAsString() == b->SerializeAsString()); + if (!result) { + LOG(ERROR) << "ERROR: key_permissions: a: " << ToString(a) + << ", b: " << ToString(b); + } + return result; } bool VerifySignature(SigningScheme signing_scheme,
diff --git a/chromeos/components/kcer/kcer_nss/test_utils.h b/chromeos/components/kcer/kcer_nss/test_utils.h index 98a13718..6634f9e1 100644 --- a/chromeos/components/kcer/kcer_nss/test_utils.h +++ b/chromeos/components/kcer/kcer_nss/test_utils.h
@@ -49,8 +49,8 @@ }; // Compares two KerPermissions, returns true if they are equal. -bool KeyPermissionsEqual(const std::optional<chaps::KeyPermissions>& a, - const std::optional<chaps::KeyPermissions>& b); +bool ExpectKeyPermissionsEqual(const std::optional<chaps::KeyPermissions>& a, + const std::optional<chaps::KeyPermissions>& b); // Verifies `signature` created with `signing_scheme` and the public key from // `spki` for `data_to_sign`. By default (with `strict` == true) only returns
diff --git a/chromeos/components/kcer/kcer_token_impl.cc b/chromeos/components/kcer/kcer_token_impl.cc index 206ec82..a68c4aa6 100644 --- a/chromeos/components/kcer/kcer_token_impl.cc +++ b/chromeos/components/kcer/kcer_token_impl.cc
@@ -1768,18 +1768,179 @@ //============================================================================== +KcerTokenImpl::GetKeyPermissionsTask::GetKeyPermissionsTask( + PrivateKeyHandle in_key, + Kcer::GetKeyPermissionsCallback in_callback) + : key(std::move(in_key)), callback(std::move(in_callback)) {} +KcerTokenImpl::GetKeyPermissionsTask::GetKeyPermissionsTask( + GetKeyPermissionsTask&& other) = default; +KcerTokenImpl::GetKeyPermissionsTask::~GetKeyPermissionsTask() = default; + void KcerTokenImpl::GetKeyPermissions( PrivateKeyHandle key, Kcer::GetKeyPermissionsCallback callback) { - // TODO(244409232): Implement. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (is_blocked_) { + return task_queue_.push_back(base::BindOnce( + &KcerTokenImpl::GetKeyPermissions, weak_factory_.GetWeakPtr(), + std::move(key), std::move(callback))); + } + + // Block task queue, attach unblocking + // task to the callback. + auto unblocking_callback = BlockQueueGetUnblocker(std::move(callback)); + + if (!EnsurePkcs11IdIsSet(key)) { + return std::move(unblocking_callback) + .Run(base::unexpected(Error::kFailedToGetPkcs11Id)); + } + + GetKeyPermissionsImpl( + GetKeyPermissionsTask(std::move(key), std::move(unblocking_callback))); +} + +void KcerTokenImpl::GetKeyPermissionsImpl(GetKeyPermissionsTask task) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + task.attemps_left--; + if (task.attemps_left < 0) { + return std::move(task.callback) + .Run(base::unexpected(Error::kPkcs11SessionFailure)); + } + + PrivateKeyHandle key = task.key; + GetKeyAttributes( + std::move(key), {AttributeId::kKeyPermissions}, + base::BindOnce(&KcerTokenImpl::GetKeyPermissionsWithAttributes, + weak_factory_.GetWeakPtr(), std::move(task))); +} + +void KcerTokenImpl::GetKeyPermissionsWithAttributes( + GetKeyPermissionsTask task, + std::optional<Error> kcer_error, + chaps::AttributeList attributes, + uint32_t result_code) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (kcer_error.has_value()) { + return std::move(task.callback).Run(base::unexpected(kcer_error.value())); + } + if (SessionChapsClient::IsSessionError(result_code)) { + return GetKeyPermissionsImpl(std::move(task)); + } + if (result_code == chromeos::PKCS11_CKR_ATTRIBUTE_TYPE_INVALID) { + // Key permissions were never set on this key. + return std::move(task.callback).Run(std::nullopt); + } + if (result_code != chromeos::PKCS11_CKR_OK) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToReadAttribute)); + } + if (attributes.attributes_size() != 1) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToDecodeKeyAttributes)); + } + const chaps::Attribute& attr = attributes.attributes(0); + if ((attr.type() != static_cast<uint32_t>(AttributeId::kKeyPermissions)) || + !attr.has_value() || attr.value().empty()) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToDecodeKeyAttributes)); + } + + chaps::KeyPermissions key_permissions; + if (!key_permissions.ParseFromArray(attr.value().data(), + attr.value().size())) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToDecodeKeyAttributes)); + } + return std::move(task.callback).Run(std::move(key_permissions)); } //============================================================================== +KcerTokenImpl::GetCertProvisioningIdTask::GetCertProvisioningIdTask( + PrivateKeyHandle in_key, + Kcer::GetCertProvisioningProfileIdCallback in_callback) + : key(std::move(in_key)), callback(std::move(in_callback)) {} +KcerTokenImpl::GetCertProvisioningIdTask::GetCertProvisioningIdTask( + GetCertProvisioningIdTask&& other) = default; +KcerTokenImpl::GetCertProvisioningIdTask::~GetCertProvisioningIdTask() = + default; + void KcerTokenImpl::GetCertProvisioningProfileId( PrivateKeyHandle key, Kcer::GetCertProvisioningProfileIdCallback callback) { - // TODO(244409232): Implement. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (is_blocked_) { + return task_queue_.push_back(base::BindOnce( + &KcerTokenImpl::GetCertProvisioningProfileId, + weak_factory_.GetWeakPtr(), std::move(key), std::move(callback))); + } + + // Block task queue, attach unblocking + // task to the callback. + auto unblocking_callback = BlockQueueGetUnblocker(std::move(callback)); + + if (!EnsurePkcs11IdIsSet(key)) { + return std::move(unblocking_callback) + .Run(base::unexpected(Error::kFailedToGetPkcs11Id)); + } + + GetCertProvisioningIdImpl(GetCertProvisioningIdTask( + std::move(key), std::move(unblocking_callback))); +} + +void KcerTokenImpl::GetCertProvisioningIdImpl(GetCertProvisioningIdTask task) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + task.attemps_left--; + if (task.attemps_left < 0) { + return std::move(task.callback) + .Run(base::unexpected(Error::kPkcs11SessionFailure)); + } + + PrivateKeyHandle key = task.key; + GetKeyAttributes( + std::move(key), {AttributeId::kCertProvisioningId}, + base::BindOnce(&KcerTokenImpl::GetCertProvisioningIdWithAttributes, + weak_factory_.GetWeakPtr(), std::move(task))); +} + +void KcerTokenImpl::GetCertProvisioningIdWithAttributes( + GetCertProvisioningIdTask task, + std::optional<Error> kcer_error, + chaps::AttributeList attributes, + uint32_t result_code) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (kcer_error.has_value()) { + return std::move(task.callback).Run(base::unexpected(kcer_error.value())); + } + if (SessionChapsClient::IsSessionError(result_code)) { + return GetCertProvisioningIdImpl(std::move(task)); + } + if (result_code == chromeos::PKCS11_CKR_ATTRIBUTE_TYPE_INVALID) { + // Cert provisioning profile id was never set on this key. + return std::move(task.callback).Run(std::nullopt); + } + if (result_code != chromeos::PKCS11_CKR_OK) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToReadAttribute)); + } + if (attributes.attributes_size() != 1) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToDecodeKeyAttributes)); + } + const chaps::Attribute& attr = attributes.attributes(0); + if ((attr.type() != + static_cast<uint32_t>(AttributeId::kCertProvisioningId)) || + !attr.has_value() || attr.value().empty()) { + return std::move(task.callback) + .Run(base::unexpected(Error::kFailedToDecodeKeyAttributes)); + } + return std::move(task.callback).Run(attr.value()); } //============================================================================== @@ -1906,7 +2067,25 @@ void KcerTokenImpl::SetKeyPermissions(PrivateKeyHandle key, chaps::KeyPermissions key_permissions, Kcer::StatusCallback callback) { - // TODO(244409232): Implement. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (is_blocked_) { + return task_queue_.push_back(base::BindOnce( + &KcerTokenImpl::SetKeyPermissions, weak_factory_.GetWeakPtr(), + std::move(key), std::move(key_permissions), std::move(callback))); + } + + // Block task queue, attach unblocking task to the callback. + auto unblocking_callback = BlockQueueGetUnblocker(std::move(callback)); + + std::vector<uint8_t> serialized_permissions; + serialized_permissions.resize(key_permissions.ByteSizeLong()); + key_permissions.SerializeToArray(serialized_permissions.data(), + serialized_permissions.size()); + + return SetKeyAttribute( + std::move(key), HighLevelChapsClient::AttributeId::kKeyPermissions, + serialized_permissions, std::move(unblocking_callback)); } //============================================================================== @@ -1915,7 +2094,22 @@ PrivateKeyHandle key, std::string profile_id, Kcer::StatusCallback callback) { - // TODO(244409232): Implement. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + if (is_blocked_) { + return task_queue_.push_back( + base::BindOnce(&KcerTokenImpl::SetCertProvisioningProfileId, + weak_factory_.GetWeakPtr(), std::move(key), + std::move(profile_id), std::move(callback))); + } + + // Block task queue, attach unblocking task to the callback. + auto unblocking_callback = BlockQueueGetUnblocker(std::move(callback)); + + return SetKeyAttribute( + std::move(key), HighLevelChapsClient::AttributeId::kCertProvisioningId, + std::vector<uint8_t>(profile_id.begin(), profile_id.end()), + std::move(unblocking_callback)); } //==============================================================================
diff --git a/chromeos/components/kcer/kcer_token_impl.h b/chromeos/components/kcer/kcer_token_impl.h index 81aa2a5..3dcfb9a 100644 --- a/chromeos/components/kcer/kcer_token_impl.h +++ b/chromeos/components/kcer/kcer_token_impl.h
@@ -307,6 +307,39 @@ chaps::AttributeList attributes, uint32_t result_code); + struct GetKeyPermissionsTask { + GetKeyPermissionsTask(PrivateKeyHandle in_key, + Kcer::GetKeyPermissionsCallback in_callback); + GetKeyPermissionsTask(GetKeyPermissionsTask&& other); + ~GetKeyPermissionsTask(); + + const PrivateKeyHandle key; + Kcer::GetKeyPermissionsCallback callback; + int attemps_left = kDefaultAttempts; + }; + void GetKeyPermissionsImpl(GetKeyPermissionsTask task); + void GetKeyPermissionsWithAttributes(GetKeyPermissionsTask task, + std::optional<Error> kcer_error, + chaps::AttributeList attributes, + uint32_t result_code); + + struct GetCertProvisioningIdTask { + GetCertProvisioningIdTask( + PrivateKeyHandle in_key, + Kcer::GetCertProvisioningProfileIdCallback in_callback); + GetCertProvisioningIdTask(GetCertProvisioningIdTask&& other); + ~GetCertProvisioningIdTask(); + + const PrivateKeyHandle key; + Kcer::GetCertProvisioningProfileIdCallback callback; + int attemps_left = kDefaultAttempts; + }; + void GetCertProvisioningIdImpl(GetCertProvisioningIdTask task); + void GetCertProvisioningIdWithAttributes(GetCertProvisioningIdTask task, + std::optional<Error> kcer_error, + chaps::AttributeList attributes, + uint32_t result_code); + struct SetKeyAttributeTask { SetKeyAttributeTask(PrivateKeyHandle in_key, HighLevelChapsClient::AttributeId in_attribute_id,
diff --git a/chromeos/components/kcer/kcer_token_impl_unittest.cc b/chromeos/components/kcer/kcer_token_impl_unittest.cc index 2a6539e..da0577d 100644 --- a/chromeos/components/kcer/kcer_token_impl_unittest.cc +++ b/chromeos/components/kcer/kcer_token_impl_unittest.cc
@@ -11,6 +11,7 @@ #include "base/test/gmock_move_support.h" #include "base/test/test_future.h" #include "chromeos/components/kcer/chaps/mock_high_level_chaps_client.h" +#include "chromeos/components/kcer/kcer_nss/test_utils.h" #include "content/public/test/browser_task_environment.h" #include "net/cert/cert_database.h" #include "testing/gtest/include/gtest/gtest.h" @@ -1953,6 +1954,301 @@ EXPECT_EQ(info_waiter.Get().error(), Error::kPkcs11SessionFailure); } +// Test that GetKeyPermissions can successfully get key permissions. +TEST_F(KcerTokenImplTest, GetKeyPermissionsSuccess) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + chaps::KeyPermissions expected_key_permissions; + expected_key_permissions.mutable_key_usages()->set_corporate(true); + expected_key_permissions.mutable_key_usages()->set_arc(true); + chaps::AttributeList key_perm_attrs; + AddAttribute( + key_perm_attrs, pkcs11_custom_attributes::kCkaChromeOsKeyPermissions, + base::as_byte_span(expected_key_permissions.SerializeAsString())); + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce(RunOnceCallback<3>(key_perm_attrs, chromeos::PKCS11_CKR_OK)); + + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + result_waiter; + token_.GetKeyPermissions(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_TRUE(result_waiter.Get().has_value()); + const std::optional<chaps::KeyPermissions>& received_key_permissions = + result_waiter.Get().value(); + EXPECT_TRUE(ExpectKeyPermissionsEqual(expected_key_permissions, + received_key_permissions)); +} + +// Test that GetKeyPermissions correctly fails when it fails to find the key. +TEST_F(KcerTokenImplTest, GetKeyPermissionsFailToFindKey) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(std::vector<ObjectHandle>(), + chromeos::PKCS11_CKR_GENERAL_ERROR)); + + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + result_waiter; + token_.GetKeyPermissions(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kKeyNotFound); +} + +// Test that GetKeyPermissions correctly fails when it fails to read attributes. +TEST_F(KcerTokenImplTest, GetKeyPermissionsFailToReadAttributes) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce(RunOnceCallback<3>(chaps::AttributeList(), + chromeos::PKCS11_CKR_GENERAL_ERROR)); + + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + result_waiter; + token_.GetKeyPermissions(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kFailedToReadAttribute); +} + +// Test that GetKeyPermissions correctly fails when retrieved attributes are +// invalid. +TEST_F(KcerTokenImplTest, GetKeyPermissionsBadAttributes) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK)); + // Imitate bad key type in the response. + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce( + RunOnceCallback<3>(chaps::AttributeList(), chromeos::PKCS11_CKR_OK)); + + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + result_waiter; + token_.GetKeyPermissions(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kFailedToDecodeKeyAttributes); +} + +// Test that GetKeyPermissions retries several times when Chaps fails to find +// the key with a session error. +TEST_F(KcerTokenImplTest, GetKeyPermissionsRetryToFindKey) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + + EXPECT_CALL(chaps_client_, FindObjects) + .WillRepeatedly(RunOnceCallbackRepeatedly<2>( + std::vector<ObjectHandle>(), chromeos::PKCS11_CKR_SESSION_CLOSED)); + + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + result_waiter; + token_.GetKeyPermissions(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kPkcs11SessionFailure); +} + +// Test that GetKeyPermissions retries several times when Chaps fails to read +// attributes with a session error. +TEST_F(KcerTokenImplTest, GetKeyPermissionsRetryToReadAttributes) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + EXPECT_CALL(chaps_client_, FindObjects) + .Times(kDefaultAttempts) + .WillRepeatedly( + RunOnceCallbackRepeatedly<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .Times(kDefaultAttempts) + .WillRepeatedly(RunOnceCallbackRepeatedly<3>( + chaps::AttributeList(), chromeos::PKCS11_CKR_SESSION_CLOSED)); + + base::test::TestFuture< + base::expected<std::optional<chaps::KeyPermissions>, Error>> + result_waiter; + token_.GetKeyPermissions(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kPkcs11SessionFailure); +} + +// Test that GetCertProvisioningProfileId can successfully get cert provisioning +// profile id. +TEST_F(KcerTokenImplTest, GetCertProvisioningProfileIdSuccess) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + std::string expected_cert_prov_id = "new_cert_prov_id"; + chaps::AttributeList cert_prov_id_attrs; + AddAttribute( + cert_prov_id_attrs, + pkcs11_custom_attributes::kCkaChromeOsBuiltinProvisioningProfileId, + base::as_byte_span(expected_cert_prov_id)); + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce( + RunOnceCallback<3>(cert_prov_id_attrs, chromeos::PKCS11_CKR_OK)); + + base::test::TestFuture<base::expected<std::optional<std::string>, Error>> + result_waiter; + token_.GetCertProvisioningProfileId(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_TRUE(result_waiter.Get().has_value()); + EXPECT_EQ(expected_cert_prov_id, result_waiter.Get().value()); +} + +// Test that GetCertProvisioningProfileId correctly fails when it fails to find +// the key. +TEST_F(KcerTokenImplTest, GetCertProvisioningProfileIdFailToFindKey) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(std::vector<ObjectHandle>(), + chromeos::PKCS11_CKR_GENERAL_ERROR)); + + base::test::TestFuture<base::expected<std::optional<std::string>, Error>> + result_waiter; + token_.GetCertProvisioningProfileId(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kKeyNotFound); +} + +// Test that GetCertProvisioningProfileId correctly fails when it fails to read +// attributes. +TEST_F(KcerTokenImplTest, GetCertProvisioningProfileIdFailToReadAttributes) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce(RunOnceCallback<3>(chaps::AttributeList(), + chromeos::PKCS11_CKR_GENERAL_ERROR)); + + base::test::TestFuture<base::expected<std::optional<std::string>, Error>> + result_waiter; + token_.GetCertProvisioningProfileId(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kFailedToReadAttribute); +} + +// Test that GetCertProvisioningProfileId correctly fails when retrieved +// attributes are invalid. +TEST_F(KcerTokenImplTest, GetCertProvisioningProfileIdBadAttributes) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + EXPECT_CALL(chaps_client_, FindObjects) + .WillOnce(RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce( + RunOnceCallback<3>(chaps::AttributeList(), chromeos::PKCS11_CKR_OK)); + + base::test::TestFuture<base::expected<std::optional<std::string>, Error>> + result_waiter; + token_.GetCertProvisioningProfileId(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kFailedToDecodeKeyAttributes); +} + +// Test that GetCertProvisioningProfileId retries several times when Chaps fails +// to find the key with a session error. +TEST_F(KcerTokenImplTest, GetCertProvisioningProfileIdRetryToFindKey) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + + EXPECT_CALL(chaps_client_, FindObjects) + .WillRepeatedly(RunOnceCallbackRepeatedly<2>( + std::vector<ObjectHandle>(), chromeos::PKCS11_CKR_SESSION_CLOSED)); + + base::test::TestFuture<base::expected<std::optional<std::string>, Error>> + result_waiter; + token_.GetCertProvisioningProfileId(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kPkcs11SessionFailure); +} + +// Test that GetCertProvisioningProfileId retries several times when Chaps fails +// to read attributes with a session error. +TEST_F(KcerTokenImplTest, GetCertProvisioningProfileIdRetryToReadAttributes) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + ObjectHandle key_handle(1); + std::vector<ObjectHandle> key_handles{key_handle}; + + EXPECT_CALL(chaps_client_, FindObjects) + .Times(kDefaultAttempts) + .WillRepeatedly( + RunOnceCallbackRepeatedly<2>(key_handles, chromeos::PKCS11_CKR_OK)); + EXPECT_CALL(chaps_client_, + GetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .Times(kDefaultAttempts) + .WillRepeatedly(RunOnceCallbackRepeatedly<3>( + chaps::AttributeList(), chromeos::PKCS11_CKR_SESSION_CLOSED)); + + base::test::TestFuture<base::expected<std::optional<std::string>, Error>> + result_waiter; + token_.GetCertProvisioningProfileId(PrivateKeyHandle(public_key), + result_waiter.GetCallback()); + + ASSERT_FALSE(result_waiter.Get().has_value()); + EXPECT_EQ(result_waiter.Get().error(), Error::kPkcs11SessionFailure); +} + // Test that SetKeyNickname can successfully set a nickname. TEST_F(KcerTokenImplTest, SetKeyNicknameSuccess) { token_.InitializeWithoutNss(pkcs11_slot_id_); @@ -2108,6 +2404,82 @@ EXPECT_EQ(waiter.Get().error(), Error::kPkcs11SessionFailure); } +// Test that SetKeyPermissions can successfully set a new value. The +// implementation is largely shared with SetKeyNickname and the tests for it +// cover the fail cases. +TEST_F(KcerTokenImplTest, SetKeyPermissionsSuccess) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + + ObjectHandle key_handle{1}; + std::vector<ObjectHandle> key_handles{key_handle}; + chaps::AttributeList find_key_attrs; + EXPECT_CALL(chaps_client_, FindObjects(pkcs11_slot_id_, _, _)) + .WillOnce( + DoAll(MoveArg<1>(&find_key_attrs), + RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK))); + + chaps::AttributeList key_permissions_attrs; + EXPECT_CALL(chaps_client_, + SetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce(DoAll(MoveArg<2>(&key_permissions_attrs), + RunOnceCallback<3>(chromeos::PKCS11_CKR_OK))); + + chaps::KeyPermissions new_key_permissions; + new_key_permissions.mutable_key_usages()->set_corporate(true); + new_key_permissions.mutable_key_usages()->set_arc(true); + + base::test::TestFuture<base::expected<void, Error>> waiter; + token_.SetKeyPermissions(PrivateKeyHandle(public_key), new_key_permissions, + waiter.GetCallback()); + + EXPECT_TRUE(FindAttribute(find_key_attrs, chromeos::PKCS11_CKA_ID, + rsa_pkcs11_id_.value())); + std::string serialized_key_permissions = + new_key_permissions.SerializeAsString(); + EXPECT_TRUE(FindAttribute( + key_permissions_attrs, + static_cast<uint32_t>(AttributeId::kKeyPermissions), + base::as_bytes(base::make_span(serialized_key_permissions)))); + EXPECT_TRUE(waiter.Get().has_value()); +} + +// Test that SetCertProvisioningProfileId can successfully set a new value. The +// implementation is largely shared with SetKeyNickname and the tests for it +// cover the fail cases. +TEST_F(KcerTokenImplTest, SetCertProvisioningProfileIdSuccess) { + token_.InitializeWithoutNss(pkcs11_slot_id_); + PublicKey public_key(Token::kUser, rsa_pkcs11_id_, rsa_spki_); + + ObjectHandle key_handle{1}; + std::vector<ObjectHandle> key_handles{key_handle}; + chaps::AttributeList find_key_attrs; + EXPECT_CALL(chaps_client_, FindObjects(pkcs11_slot_id_, _, _)) + .WillOnce( + DoAll(MoveArg<1>(&find_key_attrs), + RunOnceCallback<2>(key_handles, chromeos::PKCS11_CKR_OK))); + + chaps::AttributeList cert_prov_id_attrs; + EXPECT_CALL(chaps_client_, + SetAttributeValue(pkcs11_slot_id_, key_handle, _, _)) + .WillOnce(DoAll(MoveArg<2>(&cert_prov_id_attrs), + RunOnceCallback<3>(chromeos::PKCS11_CKR_OK))); + + std::string new_profile_id = "new_profile_id"; + + base::test::TestFuture<base::expected<void, Error>> waiter; + token_.SetCertProvisioningProfileId(PrivateKeyHandle(public_key), + new_profile_id, waiter.GetCallback()); + + EXPECT_TRUE(FindAttribute(find_key_attrs, chromeos::PKCS11_CKA_ID, + rsa_pkcs11_id_.value())); + EXPECT_TRUE( + FindAttribute(cert_prov_id_attrs, + static_cast<uint32_t>(AttributeId::kCertProvisioningId), + base::as_byte_span(new_profile_id))); + EXPECT_TRUE(waiter.Get().has_value()); +} + // Test that all methods are queued until the token is initialized and unblocked // after that. In this scenario fail all the methods for simplicity. TEST_F(KcerTokenImplTest, AllMethodsAreBlockedUntilTokenInitialization) {
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index 825a15e1..128d43c8 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Daxili xəta</translation> <translation id="1124772482545689468">İstifadəçi</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">vurun</translation> <translation id="1145018782460575098">"Proqramı xarici cihazlar üçün güncəlləyin" pəncərəsi açıqdır. <ph name="NUM_UPDATES" /> güncəlləmə əlçatandır.</translation> <translation id="1145516343487477149">Ümumi Chromebook suallarına yardım məqalələri və cavablar tapın</translation> <translation id="1154390310959620237">Yalnız 5 qısayol fərdiləşdirmək olar. Yeni qısayol əlavə etmək üçün birini silin.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Skanlama sahəsinə sığdırın</translation> <translation id="1367951781824006909">Fayl seçin</translation> +<translation id="1371650399987522809">Google AI tərəfindən dəstəklənən divar kağızı üçün rəy</translation> <translation id="1387854245479784695">Bu, bütün nüvələrin birləşməsidir</translation> <translation id="1394661041439318933">Keysin batareya səviyyəsi: <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="1397738625398125236">Giriş test edilə bilər</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">Taçped</translation> <translation id="1561927818299383735">fon işığı rəngi</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> cihazını güncəlləmək mümkün deyil</translation> +<translation id="1566493343215789965">bölün</translation> <translation id="1567064801249837505">Albomlar</translation> <translation id="1572585716423026576">Divar kağızı kimi ayarlayın</translation> <translation id="1578784163189013834">Ekran qoruyucusu üçün arxa fon seçin</translation> <translation id="160633243685262989">Şəkli Önizləyin</translation> <translation id="1611649489706141841">irəli</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> tarixindən bəri data istifadəsi</translation> +<translation id="1615576200479539465">Şəkillər yaradılır...</translation> <translation id="1621067168122174824">Şarj testini icra edin</translation> <translation id="1626590945318984973">Qısayol əlçatan deyil. Funksiya və <ph name="META_KEY" /> düymələrindən istifadə etmədən yeni qısayola basın.</translation> <translation id="1639239467298939599">Yüklənir</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> saniyədə <ph name="RATE" /> deşarj edilib.</translation> <translation id="2880569433548999039">"Bulud axını" ekran qoruyucusu</translation> <translation id="2926057806159140518">İstifadəçi adınızı və parolunuzu daxil edin və ya QR kodunuzu skan edin</translation> +<translation id="2938573842839598578">Təxmini nəticə üçün <ph name="CATEGORY_TEXT" /> dəyərini <ph name="CONVERSION_RATE" /> dəyərinə <ph name="OPERATOR_TEXT" /></translation> <translation id="2940811910881150316">Cihazı test etmək mümkün deyil. Test etmək üçün qapağı yenidən açın.</translation> <translation id="2941112035454246133">Aşağı</translation> <translation id="3008341117444806826">YENİLƏYİN</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS güncəlləməsi</translation> <translation id="3527036260304016759">Alınmadı - Naməlum xəta</translation> <translation id="3532980081107202182">Təxminən <ph name="MIN_REMAINING" /> dəqiqə qalıb</translation> +<translation id="3547264467365135390">Düstur</translation> <translation id="3557205324756024651">Lokal kimlik (istəyə görə)</translation> <translation id="3565064564551103223">İcazə verilən IP'lər</translation> <translation id="3569407787324516067">Ekran qoruyucu</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">Yeniləyin</translation> <translation id="7180865173735832675">Fərdiləşdirin</translation> <translation id="7184043045742675738">Düyməni fərdiləşdirmək üçün istənilən düyməyə klikləyin. Maus və ya ox düymələri ilə mövqenin dəyişdirilməsi düyməsi.</translation> +<translation id="7206979415662233817">Xidmət şərtləri</translation> <translation id="7212547870105584639">Şəbəkə APN ayarlarını idarə edin. APN mobil şəbəkə ilə internet arasında əlaqə yaradır. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Xarici cihazlar üçün proqram güncəlləmələri</translation> <translation id="7216409898977639127">Mobil provayder</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">klaviatura rəngi</translation> <translation id="7317831949569936035">Məktəb qeydiyyatı</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">18 yaşınız tamam olmalıdır və Sİ divar kağızlarından istifadənin <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google Xidmət Şərtlərinə<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> və <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />Generativ süni intellekt əlavə xidmət şərtlərinə<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> tabe olması ilə razılaşmalısınız. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + Sİ ilə yalnız şəxsi və qeyri-kommersiya məqsədli istifadə üçün divar kağızı yarada bilərsiniz. Divar kağızı ilə bağlı kömək aldıqda divar kağızı təklifləri yaratmaq üçün mətn <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google Məxfilik Siyasətinə<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> əsasən Google AI-a göndərilir. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Axtarışda nəticəni görmək üçün Axtarış və Boşluq düyməsinə basın.</translation> <translation id="7343649194310845056">Şəbəkə Cihazları</translation> <translation id="7353413232959255829">Axtarış nəticəsi <ph name="LIST_POSITION" />/<ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Qısayola keçmək üçün Enter basın.</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index b698e87..39bd4713 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Унутраная памылка</translation> <translation id="1124772482545689468">Карыстальнік</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">памножыць</translation> <translation id="1145018782460575098">Акно абнаўлення ўбудаванага праграмнага забеспячэння для знешніх прылад адкрыта. Даступных абнаўленняў: <ph name="NUM_UPDATES" />.</translation> <translation id="1145516343487477149">Даведачныя артыкулы і адказы на распаўсюджаныя пытанні пра Chromebook</translation> <translation id="1154390310959620237">Можна наладзіць толькі 5 спалучэнняў клавіш. Каб дадаць новае спалучэнне клавіш, трэба выдаліць адно з ужо дададзеных.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Дапасаваць да вобласці сканіравання</translation> <translation id="1367951781824006909">Выбраць файл</translation> +<translation id="1371650399987522809">Водгук пра шпалеры на аснове AI ад Google</translation> <translation id="1387854245479784695">Гэта даныя па ўсіх ядрах разам</translation> <translation id="1394661041439318933">Узровень зараду акумулятара чахла: <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="1397738625398125236">Можна выканаць праверку ping для шлюза</translation> @@ -87,13 +89,16 @@ <translation id="155865706765934889">Сэнсарная панэль</translation> <translation id="1561927818299383735">колер падсветкі</translation> <translation id="1565038567006703504">Не ўдалося абнавіць прыладу "<ph name="DEVICE_NAME" />"</translation> +<translation id="1566493343215789965">падзяліць</translation> <translation id="1567064801249837505">Альбомы</translation> <translation id="1572585716423026576">Усталяваць як шпалеры</translation> <translation id="1578784163189013834">Выбраць фон застаўкі</translation> <translation id="160633243685262989">Перадпрагляд відарыса</translation> <translation id="1611649489706141841">наперад</translation> <translation id="1615335640928990664">Выкарыстанне трафіка з <ph name="FRIENDLY_DATE" /></translation> +<translation id="1615576200479539465">Генерыруюцца відарысы...</translation> <translation id="1621067168122174824">Выканаць праверку зарадкі</translation> +<translation id="1626590945318984973">Гэта спалучэнне клавіш недаступнае – выберыце іншае, націснуўшы клавішы ў такой камбінацыі, якая не будзе ўключаць у сябе функцыянальную клавішу і клавішу "<ph name="META_KEY" />".</translation> <translation id="1639239467298939599">Ідзе загрузка</translation> <translation id="1641857168437328880">Прылада для падачы дакументаў (адным бокам)</translation> <translation id="1643449475550628585">Змяняць відарыс шпалер штодня</translation> @@ -264,6 +269,7 @@ <translation id="2878387241690264070">Разраджана: <ph name="RATE" /> за <ph name="NUM_SECONDS" /> с.</translation> <translation id="2880569433548999039">Застаўка "Рух аблокаў"</translation> <translation id="2926057806159140518">Увядзіце імя карыстальніка і пароль або адсканіруйце QR-код</translation> +<translation id="2938573842839598578">Каб атрымаць прыблізны вынік, трэба <ph name="OPERATOR_TEXT" /> значэнне "<ph name="CATEGORY_TEXT" />" на <ph name="CONVERSION_RATE" /></translation> <translation id="2940811910881150316">Не ўдаецца пратэсціраваць прыладу. Каб пачаць тэсціраванне, адкрыйце яе вечка.</translation> <translation id="2941112035454246133">Нізкі</translation> <translation id="3008341117444806826">АБНАВІЦЬ</translation> @@ -336,6 +342,7 @@ <translation id="3517001332549868749">Абнаўленне Chrome OS</translation> <translation id="3527036260304016759">Збой: невядомая памылка</translation> <translation id="3532980081107202182">Прыблізны час да завяршэння: <ph name="MIN_REMAINING" /> хв</translation> +<translation id="3547264467365135390">Формула</translation> <translation id="3557205324756024651">Лакальнае пасведчанне (неабавязкова)</translation> <translation id="3565064564551103223">Дазволеныя IP-адрасы</translation> <translation id="3569407787324516067">Экранная застаўка</translation> @@ -453,7 +460,9 @@ <translation id="4394049700291259645">Выключыць</translation> <translation id="439429847087949098">Ідзе перазапуск прылады "<ph name="DEVICE_NAME" />"</translation> <translation id="4395835743215824109">наладзіць клавіятуру</translation> +<translation id="4403262788869804671">Спалучэнне клавіш, у якім не выкарыстоўваецца клавіша "<ph name="META_KEY" />", можа канфліктаваць са спалучэннямі клавіш іншых праграм. Націсніце гэта спалучэнне клавіш яшчэ раз, калі вы хочаце выкарыстоўваць яго і далей, або націсніце іншае спалучэнне клавіш, у якім выкарыстоўваецца клавіша "<ph name="KEY" />".</translation> <translation id="4415951057168511744">Бягучы аватар</translation> +<translation id="4417830657741848074">Адміністратар наладзіў некаторыя праграмы так, каб яны запускаліся аўтаматычна. Некаторыя з іх закрыць нельга.</translation> <translation id="4422041425070339732">стрэлка ўніз</translation> <translation id="4425149324548788773">Мой Дыск</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" />: выключана</translation> @@ -466,6 +475,7 @@ <translation id="4469288414739283461">Застаўка "Рух Зямлі"</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Не ўдалося праверыць сувязь з нестандартным сеткавым шлюзам</translation> +<translation id="4500722292849917410">Гэта спалучэнне клавіш недаступнае – выберыце іншае, націснуўшы клавішы ў такой камбінацыі, якая не будзе ўключаць у сябе клавішу-мадыфікатар (Ctrl, Alt, Shift або "<ph name="META_KEY" />").</translation> <translation id="4500966230243561393">Колер інтэрфейсу</translation> <translation id="4503223151711056411">Стрэлка ўлева</translation> <translation id="4507392511610824664">павялічыць яркасць</translation> @@ -513,6 +523,7 @@ <translation id="4832079907277790330">Выбраць папку ў праграме "Файлы"...</translation> <translation id="4835901797422965222">Няма актыўных сетак</translation> <translation id="4839698083503556542">Стварыце ўласны фільм</translation> +<translation id="48409034532829769">Адміністратар наладзіў праграму "<ph name="APP_NAME" />" так, каб яна запускалася аўтаматычна. Закрыць яе нельга.</translation> <translation id="484462545196658690">Аўтаматычна</translation> <translation id="4847902821209177679">Выбрана: <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />. Націсніце Enter, каб выбраць альбомы "<ph name="TOPIC_SOURCE" />"</translation> <translation id="484790837831576105">(Android) DNS-пераўтварэнне</translation> @@ -539,6 +550,7 @@ <translation id="4969079779290789265">Падзелены экран</translation> <translation id="4972592110715526173">змена рэжыму</translation> <translation id="498186245079027698">Праверце сканер і паўтарыце спробу. Упэўніцеся, што на прыладзе дастаткова месца для захавання файлаў адсканіраваных відарысаў.</translation> +<translation id="4982627662315910959">Гэта спалучэнне клавіш недаступнае – выберыце іншае, націснуўшы клавішы ў такой камбінацыі, якая будзе ўключаць клавішу Shift і яшчэ адну клавішу-мадыфікатар (Ctrl, Alt або "<ph name="META_KEY" />").</translation> <translation id="4985509611418653372">Запусціць</translation> <translation id="4987769320337599931">Брандмаўар</translation> <translation id="4988526792673242964">Старонкі</translation> @@ -840,11 +852,13 @@ <translation id="7180611975245234373">Абнавіць</translation> <translation id="7180865173735832675">Наладзіць</translation> <translation id="7184043045742675738">Каб наладзіць кнопку, націсніце на любую клавішу. Каб змяніць пазіцыю клавішы, выкарыстоўвайце мыш або клавішы са стрэлкамі.</translation> +<translation id="7206979415662233817">Умовы выкарыстання</translation> <translation id="7212547870105584639">Кіраванне наладамі сеткавых APN. З дапамогай APN устанаўліваецца падключэнне паміж сотавай сеткай і інтэрнэтам. <ph name="BEGIN_LINK_LEARN_MORE" />Даведацца больш<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Абнаўленні ўбудаванага праграмнага забеспячэння для знешніх прылад</translation> <translation id="7216409898977639127">Сотавы аператар</translation> <translation id="725133483556299729">Выбраць адрас электроннай пошты</translation> <translation id="7271040990581020067">Сканер зараз выкарыстоўваецца. Паўтарыце спробу пазней.</translation> +<translation id="7271932918253517778">Спалучэнні клавіш, у якіх выкарыстоўваюцца клавішы верхняга рада, павінны ўключаць у сябе клавішу "<ph name="META_KEY" />".</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> <translation id="7281657306185710294">Адчуванне брызу</translation> <translation id="7287310195820267359">Калекцыі шпалер</translation> @@ -857,6 +871,8 @@ <translation id="7311368985037279727">колер клавіятуры</translation> <translation id="7317831949569936035">Рэгістрацыя ў навучальнай установе</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">Выкарыстоўваць шпалеры ад AI можна, калі вам ужо споўнілася 18 гадоў і вы прынялі <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Умовы выкарыстання Google<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> і <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />Дадатковыя ўмовы выкарыстання генератыўнага штучнага інтэлекту<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" />. + <ph name="LINE_BREAK" /><ph name="LINE_BREAK" />Ствараць шпалеры з дапамогай AI можна толькі для асабістага і некамерцыйнага выкарыстання. Калі вы запытваеце генерыраванне шпалер, уведзены вамі тэкст адпраўляецца на серверы AI ад Google у адпаведнасці з <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Палітыкай прыватнасці Google<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />. <ph name="BEGIN_LINK_LEARN_MORE" />Даведацца больш<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />. Каб пабачыць вынік у Google Пошуку, націсніце "Пошук" і клавішу прабелу.</translation> <translation id="7343649194310845056">Сеткавыя прылады</translation> <translation id="7353413232959255829">Вынік пошуку <ph name="LIST_POSITION" /> з <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Каб перайсці да ярлыка, націсніце Enter.</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 37feab3..26e2b4a 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Interna greška</translation> <translation id="1124772482545689468">Korisnik</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">pomnožite</translation> <translation id="1145018782460575098">Prozor ažuriranja firmvera za vanjski uređaj je otvoren. Dostupan je sljedeći broj ažuriranja: <ph name="NUM_UPDATES" /></translation> <translation id="1145516343487477149">Pronađite članke za pomoć i odgovore na uobičajena pitanja o Chromebooku</translation> <translation id="1154390310959620237">Možete prilagoditi samo 5 prečica. Izbrišite jednu prečicu da dodate novu.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Prilagodi području za skeniranje</translation> <translation id="1367951781824006909">Odaberite fajl</translation> +<translation id="1371650399987522809">Povratne informacije za pozadinsku sliku koju omogućava Google AI</translation> <translation id="1387854245479784695">Ovo je agregacija svih jezgara</translation> <translation id="1394661041439318933">Uređaj ima <ph name="BATTERY_PERCENTAGE" />% baterije kućišta.</translation> <translation id="1397738625398125236">Pristupnik se može provjeriti pingom</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">Dodirna podloga</translation> <translation id="1561927818299383735">boja pozadinskog osvjetljenja</translation> <translation id="1565038567006703504">Nije moguće ažurirati uređaj <ph name="DEVICE_NAME" /></translation> +<translation id="1566493343215789965">podijelite</translation> <translation id="1567064801249837505">Albumi</translation> <translation id="1572585716423026576">Postavi kao pozadinsku sliku</translation> <translation id="1578784163189013834">Odaberite pozadinu čuvara ekrana</translation> <translation id="160633243685262989">Slika pregleda</translation> <translation id="1611649489706141841">prosljeđivanje</translation> <translation id="1615335640928990664">Prijenos podataka od datuma <ph name="FRIENDLY_DATE" /></translation> +<translation id="1615576200479539465">Generiranje slika…</translation> <translation id="1621067168122174824">Pokreni test punjenja</translation> <translation id="1626590945318984973">Prečica nije dostupna. Pritisnite novu prečicu bez korištenja funkcijske tipke i tipke <ph name="META_KEY" />.</translation> <translation id="1639239467298939599">Učitavanje</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070">Ispražnjeno <ph name="RATE" /> za <ph name="NUM_SECONDS" /> sek.</translation> <translation id="2880569433548999039">Čuvar ekrana s oblacima</translation> <translation id="2926057806159140518">Unesite korisničko ime i lozinku ili skenirajte QR kôd</translation> +<translation id="2938573842839598578">Za približan rezultat <ph name="OPERATOR_TEXT" /> vrijednost <ph name="CATEGORY_TEXT" /> sa <ph name="CONVERSION_RATE" /></translation> <translation id="2940811910881150316">Nije moguće testirati uređaj. Ponovo otvorite poklopac da testirate.</translation> <translation id="2941112035454246133">Niska</translation> <translation id="3008341117444806826">OSVJEŽI</translation> @@ -337,6 +342,7 @@ <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="3547264467365135390">Formula</translation> <translation id="3557205324756024651">Lokalni identitet (nije obavezno)</translation> <translation id="3565064564551103223">Dozvoljeni IP protokoli</translation> <translation id="3569407787324516067">Čuvar ekrana</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">Osvježi</translation> <translation id="7180865173735832675">Prilagodi</translation> <translation id="7184043045742675738">Kliknite na bilo koju tipku da prilagodite dugme. Premjestite tipku mišem ili tipkama sa strelicama.</translation> +<translation id="7206979415662233817">Uslovi korištenja usluge</translation> <translation id="7212547870105584639">Upravljajte mrežnim postavkama za APN. APN-ovi uspostavljaju vezu između mobilne mreže i interneta. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Ažuriranja firmvera za vanjske uređaje</translation> <translation id="7216409898977639127">Mobilni operater</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">boja tastature</translation> <translation id="7317831949569936035">Školska prijava</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">Morate imati najmanje 18 godina i prihvatiti da je vaše korištenje AI pozadinskih slika podložno <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Googleovim Uslovima korištenja usluge<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> i <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />Dodatnim uslovima korištenja usluge za generativni AI<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" />. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + Možete kreirati pozadinske slike putem AI-ja samo u lične i nekomercijalne svrhe. Kada dobijete pomoć za pozadinsku sliku, tekst se šalje na servere Google AI-ja radi generiranja prijedloga pozadinske slike podložno <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Googleovim Pravilima privatnosti<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; pritisnite tipku za pretraživanje i tipku za razmak da vidite rezultat u Google Pretraživanju.</translation> <translation id="7343649194310845056">Mrežni uređaji</translation> <translation id="7353413232959255829"><ph name="LIST_POSITION" />. rezultat pretraživanja od <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Pritisnite Enter da odete na prečicu.</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 97d2e9c..9abfdd0d 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -290,7 +290,7 @@ <translation id="3170673040743561620">سند را روی اسکنر قرار دهید</translation> <translation id="3174321110679064523">کاغذدیواری بامداد تا شامگاه</translation> <translation id="3188257591659621405">فایلهای من</translation> -<translation id="319101249942218879">تصویر چهرهنما تغییر کرد</translation> +<translation id="319101249942218879">تصویر چهرک تغییر کرد</translation> <translation id="3192947282887913208">فایلهای صوتی</translation> <translation id="3199982728237701504">تغذیهکننده سند (دورو)</translation> <translation id="3201315366910775591">دیگران میتوانند آلبومهای مشترک را بهروز کنند</translation> @@ -300,7 +300,7 @@ <translation id="3246869037381808805">کارهای چاپ قدیمیتر از ۱ روز برداشته میشوند</translation> <translation id="324961752321393509">سرپرستتان اجازه نمیدهد این برنامه را ببندید</translation> <translation id="3268178239013324452">انجام نشد - در باز است</translation> -<translation id="3275729367986477355">تصویر چهرهنما</translation> +<translation id="3275729367986477355">تصویر چهرک</translation> <translation id="3283504360622356314">{0,plural, =1{ویرایش فایل}one{ویرایش فایل}other{ویرایش فایلها}}</translation> <translation id="3286515922899063534"><ph name="CURRENT" /> گیگاهرتز</translation> <translation id="3291996639387199448">جهت کلید</translation> @@ -347,7 +347,7 @@ <translation id="3595596368722241419">باتری پر است</translation> <translation id="3600339377155080675">قرینه صفحهنمایش</translation> <translation id="3602290021589620013">پیشنمایش</translation> -<translation id="3603829704940252505">چهرهنما</translation> +<translation id="3603829704940252505">چهرک</translation> <translation id="3604713164406837697">تغییر کاغذدیواری</translation> <translation id="360565022852130722">شبکه Wi-Fi با پروتکل ضعیف WEP 802.1x ایمن شده است</translation> <translation id="3606583719724308068">تأخیر بالا در وبسایتهای HTTPS</translation> @@ -455,7 +455,7 @@ <translation id="439429847087949098">درحال بازراهاندازی <ph name="DEVICE_NAME" /></translation> <translation id="4395835743215824109">سفارشیسازی صفحهکلید</translation> <translation id="4403262788869804671">اگر میانبر کلید <ph name="META_KEY" /> داشته نباشد، ممکن است با میانبر برخیاز برنامهها تداخل پیدا کند. اگر میخواهید به استفاده از این میانبر ادامه دهید آن را دوباره فشار دهید، یا میانبر جدیدی را بااستفاده از کلید <ph name="KEY" /> فشار دهید.</translation> -<translation id="4415951057168511744">چهرهنمای کنونی</translation> +<translation id="4415951057168511744">چهرک کنونی</translation> <translation id="4417830657741848074">سرپرستتان برخیاز برنامهها را طوری تنظیم کرده است که خودکار اجرا شوند. برخیاز این برنامهها ممکن است بسته نشوند.</translation> <translation id="4422041425070339732">پیکان پایین</translation> <translation id="4425149324548788773">My Drive</translation> @@ -906,7 +906,7 @@ <translation id="7648838807254605802">تأخیر بالا در HTTPS</translation> <translation id="7656388927906093505">دستگاه موشواره است.</translation> <translation id="7658239707568436148">لغو</translation> -<translation id="7665800271478495366">تغییر چهرهنما</translation> +<translation id="7665800271478495366">تغییر چهرک</translation> <translation id="7683228889864052081">رنگمایه صفحهکلید</translation> <translation id="7690294790491645610">تأیید گذرواژه جدید</translation> <translation id="7701040980221191251">هیچکدام</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 898e721..22d28c0 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Interna pogreška</translation> <translation id="1124772482545689468">Korisnik</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">množenje</translation> <translation id="1145018782460575098">Otvoren je prozor za ažuriranje opreme za vanjske uređaje. Dostupna ažuriranja: <ph name="NUM_UPDATES" />.</translation> <translation id="1145516343487477149">Pronađite članke pomoći i odgovore na česta pitanja o Chromebooku</translation> <translation id="1154390310959620237">Možete prilagoditi samo 5 prečaca. Izbrišite prečac kako biste dodali novi.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Prilagodi području skeniranja</translation> <translation id="1367951781824006909">Odaberite datoteku</translation> +<translation id="1371650399987522809">Povratne informacije za pozadinu koju omogućuje Googleov AI</translation> <translation id="1387854245479784695">Ovo je agregacija svih jezgri</translation> <translation id="1394661041439318933">Uređaj ima <ph name="BATTERY_PERCENTAGE" />% baterije za kutijicu.</translation> <translation id="1397738625398125236">Pristupnik se može pingati</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">Dodirna površina</translation> <translation id="1561927818299383735">boja pozadinskog osvjetljenja</translation> <translation id="1565038567006703504">Ažuriranje uređaja <ph name="DEVICE_NAME" /> nije moguće</translation> +<translation id="1566493343215789965">dijeljenje</translation> <translation id="1567064801249837505">Albumi</translation> <translation id="1572585716423026576">Postavi kao pozadinu</translation> <translation id="1578784163189013834">Odabir pozadine čuvara zaslona</translation> <translation id="160633243685262989">Pregled slike</translation> <translation id="1611649489706141841">prosljeđivanje</translation> <translation id="1615335640928990664">Potrošnja podatkovnog prometa od <ph name="FRIENDLY_DATE" /></translation> +<translation id="1615576200479539465">Generiranje slika...</translation> <translation id="1621067168122174824">Pokreni test napunjenosti</translation> <translation id="1626590945318984973">Prečac nije dostupan. Pritisnite novi prečac bez upotrebe funkcijske tipke i tipke <ph name="META_KEY" />.</translation> <translation id="1639239467298939599">Učitavanje</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070">Ispražnjeno <ph name="RATE" /> za <ph name="NUM_SECONDS" /> s.</translation> <translation id="2880569433548999039">Čuvar zaslona s oblakom</translation> <translation id="2926057806159140518">Unesite korisničko ime i zaporku ili skenirajte QR kôd</translation> +<translation id="2938573842839598578">Za približan rezultat <ph name="OPERATOR_TEXT" /> vrijednost <ph name="CATEGORY_TEXT" /> s <ph name="CONVERSION_RATE" /></translation> <translation id="2940811910881150316">Testiranje uređaja nije uspjelo. Ponovo otvorite poklopac da biste testirali.</translation> <translation id="2941112035454246133">Nizak</translation> <translation id="3008341117444806826">OSVJEŽI</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">Ažuriranje OS-a Chrome</translation> <translation id="3527036260304016759">Nije uspjelo – nepoznata pogreška</translation> <translation id="3532980081107202182">Preostalo je oko <ph name="MIN_REMAINING" /> min</translation> +<translation id="3547264467365135390">Formula</translation> <translation id="3557205324756024651">Lokalni identitet (nije obavezno)</translation> <translation id="3565064564551103223">Dopušteni IP-jevi</translation> <translation id="3569407787324516067">Čuvar zaslona</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">Osvježi</translation> <translation id="7180865173735832675">Prilagodi</translation> <translation id="7184043045742675738">Kliknite bilo koju tipku da biste prilagodili gumb. Premjestite tipku pomoću miša ili tipki sa strelicama.</translation> +<translation id="7206979415662233817">Uvjeti pružanja usluge</translation> <translation id="7212547870105584639">Upravljajte postavkama APN-a mreže. APN-ovi uspostavljaju vezu između mobilne mreže i interneta. <ph name="BEGIN_LINK_LEARN_MORE" />Saznaj više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Ažuriranja opreme za vanjske uređaje</translation> <translation id="7216409898977639127">Davatelj mobilnih usluga</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">boja tipkovnice</translation> <translation id="7317831949569936035">Upis u školu</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">Morate imati najmanje 18 godina i prihvatiti da se na vašu upotrebu AI pozadina primjenjuju <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Googleovi uvjeti pružanja usluge<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> i <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />dodatni uvjeti pružanja usluge za generativni AI<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" />. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + Pozadine pomoću AI-ja možete izraditi samo za osobnu i nekomercijalnu upotrebu. Kada dobijete pomoć za pozadinu, tekst se šalje poslužiteljima Googleovog AI-ja radi generiranja prijedloga za pozadinu, u skladu s <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Googleovim pravilima o privatnosti<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />. <ph name="BEGIN_LINK_LEARN_MORE" />Saznajte više<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Pritisnite Pretraži i razmaknicu da biste vidjeli rezultate u Google pretraživanju.</translation> <translation id="7343649194310845056">Mrežni uređaji</translation> <translation id="7353413232959255829">Rezultat pretraživanja <ph name="LIST_POSITION" /> od <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Pritisnite Enter da biste otvorili prečac.</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 53c10e84..a03a2555 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">ಆಂತರಿಕ ದೋಷ</translation> <translation id="1124772482545689468">ಬಳಕೆದಾರ</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">ಗುಣಿಸಿ</translation> <translation id="1145018782460575098">ಬಾಹ್ಯ ಸಾಧನಗಳಿಗಾಗಿ ಫರ್ಮ್ವೇರ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ ವಿಂಡೋ ತೆರೆದಿದೆ. <ph name="NUM_UPDATES" /> ಅಪ್ಡೇಟ್ಗಳು ಲಭ್ಯವಿದೆ.</translation> <translation id="1145516343487477149">ಸಾಮಾನ್ಯ Chromebook ಪ್ರಶ್ನೆಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಸಹಾಯ ಒದಗಿಸುವ ಲೇಖನಗಳು ಹಾಗೂ ಉತ್ತರಗಳನ್ನು ಕಂಡುಕೊಳ್ಳಿ</translation> <translation id="1154390310959620237">ನೀವು ಕೇವಲ 5 ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಬಹುದು. ಹೊಸದನ್ನು ಸೇರಿಸಲು ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಅಳಿಸಿ.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ಸ್ಕ್ಯಾನ್ ಪ್ರದೇಶಕ್ಕೆ ಹೊಂದಿಸಿ</translation> <translation id="1367951781824006909">ಫೈಲ್ವೊಂದನ್ನು ಆರಿಸಿ</translation> +<translation id="1371650399987522809">Google AI ನಿಂದ ಬೆಂಬಲಿತವಾದ ವಾಲ್ಪೇಪರ್ಗಾಗಿ ಪ್ರತಿಕ್ರಿಯೆ</translation> <translation id="1387854245479784695">ಇದು ಎಲ್ಲಾ ಕೋರ್ಗಳ ಒಟ್ಟುಗೂಡಿಸುವಿಕೆಯಾಗಿದೆ</translation> <translation id="1394661041439318933">ಸಾಧನವು <ph name="BATTERY_PERCENTAGE" />% ಕೇಸ್ ಬ್ಯಾಟರಿಯನ್ನು ಹೊಂದಿದೆ.</translation> <translation id="1397738625398125236">ಗೇಟ್ವೇ ಅನ್ನು ಪಿಂಗ್ ಮಾಡಬಹುದು</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">ಟಚ್ಪ್ಯಾಡ್</translation> <translation id="1561927818299383735">ಬ್ಯಾಕ್ಲಿಟ್ ಬಣ್ಣ</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> +<translation id="1566493343215789965">ವಿಭಾಗಿಸಿ</translation> <translation id="1567064801249837505">ಆಲ್ಬಮ್ಗಳು</translation> <translation id="1572585716423026576">ವಾಲ್ಪೇಪರ್ ಆಗಿ ಹೊಂದಿಸಿ</translation> <translation id="1578784163189013834">ಸ್ಕ್ರೀನ್ ಸೇವರ್ ಹಿನ್ನೆಲೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="160633243685262989">ಚಿತ್ರವನ್ನು ಪೂರ್ವವೀಕ್ಷಿಸಿ</translation> <translation id="1611649489706141841">ಮುಂದೆ</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> ರಿಂದ ಡೇಟಾ ಬಳಕೆ</translation> +<translation id="1615576200479539465">ಚಿತ್ರಗಳನ್ನು ಜನರೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="1621067168122174824">ಚಾರ್ಜ್ ಪರೀಕ್ಷೆಯನ್ನು ರನ್ ಮಾಡಿ</translation> <translation id="1626590945318984973">ಶಾರ್ಟ್ಕಟ್ ಲಭ್ಯವಿಲ್ಲ. ಫಂಕ್ಷನ್ ಮತ್ತು <ph name="META_KEY" /> ಕೀಗಳನ್ನು ಬಳಸದೆಯೇ ಹೊಸ ಶಾರ್ಟ್ಕಟ್ ಒಂದನ್ನು ಒತ್ತಿ.</translation> <translation id="1639239467298939599">ಲೋಡ್ ಆಗುತ್ತಿದೆ</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> ಸೆಕೆಂಡ್ಗಳಲ್ಲಿ <ph name="RATE" /> ಡಿಸ್ಚಾರ್ಜ್ ಆಗಿದೆ.</translation> <translation id="2880569433548999039">ಮೋಡ ತೆಲುತ್ತಿರುವ ಸ್ಕ್ರೀನ್ ಸೇವರ್</translation> <translation id="2926057806159140518">ನಿಮ್ಮ ಬಳಕೆದಾರರ ಹೆಸರು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ ಅಥವಾ ನಿಮ್ಮ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> +<translation id="2938573842839598578">ಅಂದಾಜು ಫಲಿತಾಂಶಕ್ಕಾಗಿ, <ph name="CATEGORY_TEXT" /> ದ ಮೌಲ್ಯವನ್ನು <ph name="CONVERSION_RATE" /> ಸಂಖ್ಯೆಯಿಂದ <ph name="OPERATOR_TEXT" /> ಮಾಡಿ</translation> <translation id="2940811910881150316">ಸಾಧನವನ್ನು ಪರೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪರೀಕ್ಷಿಸಲು ಮುಚ್ಚಳವನ್ನು ಮತ್ತೆ ತೆರೆಯಿರಿ.</translation> <translation id="2941112035454246133">ಕಡಿಮೆ</translation> <translation id="3008341117444806826">ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS ಅಪ್ಡೇಟ್</translation> <translation id="3527036260304016759">ವಿಫಲವಾಗಿದೆ - ಅಪರಿಚಿತ ದೋಷ</translation> <translation id="3532980081107202182">ಸುಮಾರು <ph name="MIN_REMAINING" /> ಬಾಕಿ ಉಳಿದಿದೆ</translation> +<translation id="3547264467365135390">ಫಾರ್ಮುಲಾ</translation> <translation id="3557205324756024651">ಸ್ಥಳೀಯ ಗುರುತು (ಐಚ್ಛಿಕ)</translation> <translation id="3565064564551103223">ಅನುಮತಿಸಲಾದ IP ಗಳು</translation> <translation id="3569407787324516067">ಸ್ಕ್ರೀನ್ ಸೇವರ್</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> <translation id="7180865173735832675">ಕಸ್ಟಮೈಸ್</translation> <translation id="7184043045742675738">ನಿಮ್ಮ ಬಟನ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಯಾವುದೇ ಕೀ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ. ಮೌಸ್ ಅಥವಾ ಬಾಣದ ಕೀಗಳೊಂದಿಗೆ ಕೀಯ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸಿ.</translation> +<translation id="7206979415662233817">ಸೇವಾ ನಿಯಮಗಳು</translation> <translation id="7212547870105584639">ನೆಟ್ವರ್ಕ್ APN ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ. APN ಗಳು ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಹಾಗೂ ಇಂಟರ್ನೆಟ್ ನಡುವೆ ಕನೆಕ್ಷನ್ ಅನ್ನು ಸ್ಥಾಪಿಸುತ್ತವೆ. <ph name="BEGIN_LINK_LEARN_MORE" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">ಬಾಹ್ಯ ಸಾಧನಗಳಿಗಾಗಿ ಫರ್ಮ್ವೇರ್ ಅಪ್ಡೇಟ್ಗಳು</translation> <translation id="7216409898977639127">ಸೆಲ್ಯುಲಾರ್ ಒದಗಿಸುವವರು</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">ಕೀಬೋರ್ಡ್ ಬಣ್ಣ</translation> <translation id="7317831949569936035">ಶಾಲಾ ನೋಂದಣಿ</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">ನಿಮಗೆ ಕನಿಷ್ಟ 18 ವರ್ಷ ವಯಸ್ಸಿನವರಾಗಿರಬೇಕು ಮತ್ತು AI ವಾಲ್ಪೇಪರ್ನ ನಿಮ್ಮ ಬಳಕೆಯು <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google ಸೇವಾ ನಿಯಮಗಳು<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> ಮತ್ತು <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />ಜನರೇಟಿವ್ AI ಹೆಚ್ಚುವರಿ ಸೇವಾ ನಿಯಮಗಳಿಗೆ<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> ಒಳಪಟ್ಟಿರುತ್ತದೆ. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + ನೀವು ವೈಯಕ್ತಿಕ ಮತ್ತು ವಾಣಿಜ್ಯೇತರ ಬಳಕೆಗಾಗಿ ಮಾತ್ರ AI ಮೂಲಕ ವಾಲ್ಪೇಪರ್ಗಳನ್ನು ರಚಿಸಬಹುದು. ನೀವು ವಾಲ್ಪೇಪರ್ ಸಹಾಯವನ್ನು ಸ್ವೀಕರಿಸಿದಾಗ, <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google ನ ಗೌಪ್ಯತೆ ನೀತಿ<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> ಗೆ ಒಳಪಟ್ಟಿರುವ ವಾಲ್ಪೇಪರ್ ಸಲಹೆಗಳನ್ನು ರಚಿಸಲು Google AI ಸರ್ವರ್ಗಳಿಗೆ ಪಠ್ಯವನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತದೆ. <ph name="BEGIN_LINK_LEARN_MORE" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Search ನಲ್ಲಿ ಫಲಿತಾಂಶವನ್ನು ನೋಡಲು, Search ಜೊತೆಗೆ Space ಅನ್ನು ಒತ್ತಿರಿ.</translation> <translation id="7343649194310845056">ನೆಟ್ವರ್ಕ್ ಸಾಧನಗಳು</translation> <translation id="7353413232959255829"><ph name="LIST_SIZE" /> ರಲ್ಲಿ <ph name="LIST_POSITION" /> ಹುಡುಕಾಟ ಫಲಿತಾಂಶ: <ph name="SEARCH_RESULT_TEXT" />. ಶಾರ್ಟ್ಕಟ್ಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು Enter ಕೀ ಒತ್ತಿರಿ.</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index f314c7d..ba560ce0 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Ички ката</translation> <translation id="1124772482545689468">Колдонуучу</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">көбөйтүү</translation> <translation id="1145018782460575098">Тышкы түзмөктөрдө орнотулган программаны жаңыртуу терезеси ачык. <ph name="NUM_UPDATES" /> жаңыртуу бар.</translation> <translation id="1145516343487477149">Chromebook тууралуу көп берилүүчү суроолорго жоопторду жана макалаларды табасыз</translation> <translation id="1154390310959620237">5 ыкчам баскычты гана ыңгайлаштыра аласыз. Жаңы ыкчам баскычты кошуу үчүн эскисин өчүрүңүз.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Скандоо аймагы боюнча</translation> <translation id="1367951781824006909">Файл тандаңыз</translation> +<translation id="1371650399987522809">Google сунуштаган ЖИ технологиялары менен түзүлгөн тушкагаздар тууралуу пикир</translation> <translation id="1387854245479784695">Бул бардык зымдардын бириктирилген жери болуп эсептелет</translation> <translation id="1394661041439318933">Түзмөк кутучасынын батареясынын деңгээли: <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="1397738625398125236">Шлюздун байланышын текшерүүгө болот</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">Тийме такта</translation> <translation id="1561927818299383735">баскычтоптун жарыгынын түсү</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> жаңыртылбай жатат</translation> +<translation id="1566493343215789965">бөлүү</translation> <translation id="1567064801249837505">Альбомдор</translation> <translation id="1572585716423026576">Тушкагаз катары коюу</translation> <translation id="1578784163189013834">Көшөгөнүн фонун тандоо</translation> <translation id="160633243685262989">Сүрөттү алдын ала көрүү</translation> <translation id="1611649489706141841">багыттоо</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> бери колдонулган трафик</translation> +<translation id="1615576200479539465">Сүрөттөр түзүлүүдө...</translation> <translation id="1621067168122174824">Кубатталышын сыноо</translation> <translation id="1626590945318984973">Ыкчам баскыч жеткиликсиз. <ph name="META_KEY" /> жана функциялык баскычтары жок жаңы ыкчам баскычты басыңыз.</translation> <translation id="1639239467298939599">Жүктөлүүдө</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070">Батареянын кубаты <ph name="NUM_SECONDS" /> секундда <ph name="RATE" /> түгөндү.</translation> <translation id="2880569433548999039">Булут көшөгөсү</translation> <translation id="2926057806159140518">Колдонуучу атыңызды жана сырсөзүңүздү киргизип же QR кодуңузду скандаңыз</translation> +<translation id="2938573842839598578">Болжолдуу натыйжа үчүн <ph name="OPERATOR_TEXT" /> <ph name="CATEGORY_TEXT" /> маанисин төмөнкүгө бөлүңүз: <ph name="CONVERSION_RATE" /></translation> <translation id="2940811910881150316">Түзмөктү сыноого болбойт. Сынап көрүү үчүн капкагын кайра ачыңыз.</translation> <translation id="2941112035454246133">Төмөн</translation> <translation id="3008341117444806826">ЖАҢЫРТУУ</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS жаңыртуусу</translation> <translation id="3527036260304016759">Басылып чыгарылган жок - Белгисиз ката</translation> <translation id="3532980081107202182">Болжол менен <ph name="MIN_REMAINING" /> мүнөт калды</translation> +<translation id="3547264467365135390">Формула</translation> <translation id="3557205324756024651">Жергиликтүү идентификация (милдеттүү эмес)</translation> <translation id="3565064564551103223">Уруксат берилген IP-даректер</translation> <translation id="3569407787324516067">Көшөгө</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">Жаңылоо</translation> <translation id="7180865173735832675">Өзгөчөлөштүрүү</translation> <translation id="7184043045742675738">Баскычты тууралоо үчүн каалаган баскычты басыңыз. Чычкан же жебе баскычтары менен баскычты жылдырыңыз.</translation> +<translation id="7206979415662233817">Тейлөө шарттары</translation> <translation id="7212547870105584639">Тармактын APN параметрлерин тескеңиз. APN'дер мобилдик тармак менен Интернеттин ортосундагы байланышты түзүшөт. <ph name="BEGIN_LINK_LEARN_MORE" />Кеңири маалымат<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Тышкы түзмөктөр үчүн орнотулган программанын жаңыртуулары</translation> <translation id="7216409898977639127">Интернет провайдери</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">баскычтоптун түсү</translation> <translation id="7317831949569936035">Окуу жайын каттоо</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">Сиз кеминде 18 жашта болуп, ЖИ тушкагаздарын <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google'дун Тейлөө шарттарына<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> жана <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />Генеративдик ЖИни пайдалануунун кошумча шарттарына<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> ылайык колдонууга макул болушуңуз керек. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + ЖИ менен тушкагаздарды коммерциялык максатта эмес, жеке колдонуу үчүн гана түзө аласыз. Тушкагаз сунуштарын алуу үчүн сиз киргизген текст <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google'дун Купуялык саясатына<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> ылайык Google'дун ЖИ серверлерине жөнөтүлөт. <ph name="BEGIN_LINK_LEARN_MORE" />Кеңири маалымат<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Издөөдөгү натыйжаларды көрүү үчүн Издөө жана Боштук баскычтарын басыңыз.</translation> <translation id="7343649194310845056">Тармак түзмөктөрү</translation> <translation id="7353413232959255829"><ph name="LIST_SIZE" /> ичинен <ph name="LIST_POSITION" /> издөө натыйжасы көрсөтүлүүдө:<ph name="SEARCH_RESULT_TEXT" />. Ыкчам баскычка өтүү үчүн "Enter" баскычын басыңыз.</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 31b288f..afd6139 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">ຜິດພາດພາຍໃນ</translation> <translation id="1124772482545689468">ຜູ້ໃຊ້</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">ຄູນ</translation> <translation id="1145018782460575098">ເປີດໜ້າຈໍອັບເດດເຟີມແວສຳລັບອຸປະກອນພາຍນອກແລ້ວ. ມີ <ph name="NUM_UPDATES" /> ອັບເດດໃໝ່.</translation> <translation id="1145516343487477149">ຊອກຫາບົດຄວາມຊ່ວຍເຫຼືອ ແລະ ຄຳຕອບສຳລັບຄຳຖາມ Chromebook ທົ່ວໄປ</translation> <translation id="1154390310959620237">ທ່ານສາມາດປັບແຕ່ງທາງລັດໄດ້ 5 ອັນເທົ່ານັ້ນ. ລຶບທາງລັດໃດໜຶ່ງເພື່ອເພີ່ມອັນໃໝ່.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ພໍດີກັບພື້ນທີ່ສະແກນ</translation> <translation id="1367951781824006909">ເລືອກໄຟລ໌</translation> +<translation id="1371650399987522809">ຄຳຕິຊົມສຳລັບຮູບພື້ນຫຼັງທີ່ຂັບເຄື່ອນໂດຍ Google AI</translation> <translation id="1387854245479784695">ນີ້ແມ່ນການຮວບຮວມ core ທັງໝົດ</translation> <translation id="1394661041439318933">ອຸປະກອນມີແບັດເຕີຣີເຄສ <ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="1397738625398125236">ສາມາດທົດສອບການເຊື່ອມຕໍ່ເກດເວໄດ້</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">ແຜ່ນສໍາຜັດ</translation> <translation id="1561927818299383735">ສີຂອງແສງຈາກສາກຫຼັງ</translation> <translation id="1565038567006703504">ບໍ່ສາມາດອັບເດດ <ph name="DEVICE_NAME" /> ໄດ້</translation> +<translation id="1566493343215789965">ຫານ</translation> <translation id="1567064801249837505">ອະລະບ້ຳ</translation> <translation id="1572585716423026576">ຕັ້ງເປັນພາບພື້ນຫຼັງ</translation> <translation id="1578784163189013834">ເລືອກພື້ນຫຼັງສະກຣີນເຊັບເວີ</translation> <translation id="160633243685262989">ຮູບຕົວຢ່າງ</translation> <translation id="1611649489706141841">ສົ່ງຕໍ່</translation> <translation id="1615335640928990664">ການນຳໃຊ້ອິນເຕີເນັດນັບຕັ້ງແຕ່ <ph name="FRIENDLY_DATE" /></translation> +<translation id="1615576200479539465">ກຳລັງສ້າງຮູບ...</translation> <translation id="1621067168122174824">ເອີ້ນໃຊ້ການທົດສອບການສາກ</translation> <translation id="1626590945318984973">ບໍ່ສາມາດໃຊ້ທາງລັດໄດ້. ກົດຄີລັດໃໝ່ໂດຍໃຊ້ຟັງຊັນ ແລະ ປຸ່ມ <ph name="META_KEY" />.</translation> <translation id="1639239467298939599">ກໍາລັງໂຫຼດ</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070">ຄາຍປະຈຸ <ph name="RATE" /> ໃນ <ph name="NUM_SECONDS" /> ວິນາທີ.</translation> <translation id="2880569433548999039">ພາບພັກໜ້າຈໍການເຄື່ອນທີ່ຂອງເມກ</translation> <translation id="2926057806159140518">ລະບຸຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານຂອງທ່ານ ຫຼື ສະແກນລະຫັດ QR ທ່ານ</translation> +<translation id="2938573842839598578">ສຳລັບຜົນໄດ້ຮັບໂດຍປະມານ, ໃຫ້ເອົາຄ່າ <ph name="CATEGORY_TEXT" /> ມາ <ph name="OPERATOR_TEXT" /> ດ້ວຍ <ph name="CONVERSION_RATE" /></translation> <translation id="2940811910881150316">ບໍ່ສາມາດທົດສອບອຸປະກອນໄດ້. ເປີດຝາໜ້າຈໍອີກຄັ້ງເພື່ອທົດສອບ.</translation> <translation id="2941112035454246133">ຕໍ່າ</translation> <translation id="3008341117444806826">ໂຫຼດຂໍ້ມູນໃໝ່</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ອັບເດດ ChromeOS</translation> <translation id="3527036260304016759">ບໍ່ສຳເລັດ, ບໍ່ຮູ້ຈັກຂໍ້ຜິດພາດ</translation> <translation id="3532980081107202182">ຍັງເຫຼືອອີກປະມານ <ph name="MIN_REMAINING" /> ນາທີ</translation> +<translation id="3547264467365135390">ສູດຄິດໄລ່</translation> <translation id="3557205324756024651">ຂໍ້ມູນປະຈຳຕົວໃນເຄື່ອງ (ບໍ່ບັງຄັບ)</translation> <translation id="3565064564551103223">IP ທີ່ອະນຸຍາດ</translation> <translation id="3569407787324516067">ພາບພັກໜ້າຈໍ</translation> @@ -847,6 +853,7 @@ <translation id="7180611975245234373">ຣີເຟຣຊ</translation> <translation id="7180865173735832675">ກໍານົດເອງ</translation> <translation id="7184043045742675738">ຄລິກໃສ່ປຸ່ມໃດກໍໄດ້ເພື່ອປັບແຕ່ງປຸ່ມຂອງທ່ານ. ປ່ຽນຕຳແໜ່ງປຸ່ມດ້ວຍເມົ້າ ຫຼື ປຸ່ມລູກສອນ.</translation> +<translation id="7206979415662233817">ຂໍ້ກຳນົດບໍລິການ</translation> <translation id="7212547870105584639">ຈັດການການຕັ້ງຄ່າ APN ຂອງເຄືອຂ່າຍ. APN ສ້າງການເຊື່ອມຕໍ່ລະຫວ່າງເຄືອຂ່າຍມືຖື ແລະ ອິນເຕີເນັດ. <ph name="BEGIN_LINK_LEARN_MORE" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">ອັບເດດເຟີມແວສຳລັບອຸປະກອນພາຍໃນ</translation> <translation id="7216409898977639127">ຜູ້ໃຫ້ບໍລິການມືຖື</translation> @@ -865,6 +872,10 @@ <translation id="7311368985037279727">ສີຂອງແປ້ນພິມ</translation> <translation id="7317831949569936035">ການລົງທະບຽນເຂົ້າໂຮງຮຽນ</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">ທ່ານຕ້ອງມີອາຍຸ 18 ປີຂຶ້ນໄປ ແລະ ຍອມຮັບວ່າການນຳໃຊ້ຮູບພື້ນຫຼັງ AI ຂອງທ່ານຢູ່ພາຍໃຕ້ <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />ຂໍ້ກຳນົດບໍລິການຂອງ Google<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> ແລະ <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />ຂໍ້ກຳນົດບໍລິການເພີ່ມເຕີມຂອງ AI ສ້າງເນື້ອຫາ<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" />. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + ທ່ານສາມາດສ້າງຮູບພື້ນຫຼັງດ້ວຍ AI ສຳລັບການໃຊ້ສ່ວນຕົວ ແລະ ບໍ່ເປັນໄປເພື່ອການຄ້າເທົ່ານັ້ນ. ເມື່ອທ່ານໄດ້ຮັບຄວາມຊ່ວຍເຫຼືອກ່ຽວກັບຮູບພື້ນຫຼັງ, ຂໍ້ຄວາມຈະຖືກສົ່ງໄປຫາເຊີບເວີ Google AI ເພື່ອສ້າງຄຳແນະນຳກ່ຽວກັບຮູບພື້ນຫຼັງ, ໂດຍຢູ່ພາຍໃຕ້ <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງ Google<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />. <ph name="BEGIN_LINK_LEARN_MORE" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; ກົດຊອກຫາພ້ອມກັບຍະຫວ່າງເພື່ອເບິ່ງຜົນການຊອກຫາໃນ Google ຊອກຫາ.</translation> <translation id="7343649194310845056">ອຸປະກອນເຄືອຂ່າຍ</translation> <translation id="7353413232959255829">ຜົນການຊອກຫາ <ph name="LIST_POSITION" /> ຈາກ <ph name="LIST_SIZE" /> ລາຍການ: <ph name="SEARCH_RESULT_TEXT" />. ກົດ Enter ເພື່ອໄປທາງລັດ.</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 535083e2..717daf35 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">ആന്തരിക പിശക്</translation> <translation id="1124772482545689468">ഉപയോക്താവ്</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">ഗുണിക്കുക</translation> <translation id="1145018782460575098">'ബാഹ്യ ഉപകരണങ്ങൾക്കുള്ള ഫേംവെയർ അപ്ഡേറ്റ് ചെയ്യുക' വിൻഡോ തുറന്നിരിക്കുന്നു. <ph name="NUM_UPDATES" /> അപ്ഡേറ്റുകൾ ലഭ്യമാണ്.</translation> <translation id="1145516343487477149">Chromebook-മായി ബന്ധപ്പെട്ട പൊതുവായ ചോദ്യങ്ങൾക്കുള്ള സഹായ ലേഖനങ്ങളും ഉത്തരങ്ങളും കണ്ടെത്തുക</translation> <translation id="1154390310959620237">നിങ്ങൾക്ക് 5 കുറുക്കുവഴികൾ മാത്രമേ ഇഷ്ടാനുസൃതമാക്കാനാകൂ. പുതിയൊരെണ്ണം ചേർക്കാൻ ഒരു കുറുക്കുവഴി ഇല്ലാതാക്കുക.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">സ്കാൻ ഏരിയയ്ക്ക് അനുയോജ്യമാക്കുക</translation> <translation id="1367951781824006909">ഒരു ഫയല് തിരഞ്ഞെടുക്കുക</translation> +<translation id="1371650399987522809">Google AI കൊണ്ട് പ്രവർത്തിക്കുന്ന, വാൾപേപ്പറിനെ സംബന്ധിച്ച ഫീഡ്ബാക്ക്</translation> <translation id="1387854245479784695">ഇത് എല്ലാ കോറുകളുടെയും സംഗ്രഹമാണ്</translation> <translation id="1394661041439318933">ഉപകരണത്തിന്റെ കെയ്സിൽ <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററിയുണ്ട്.</translation> <translation id="1397738625398125236">ഗേറ്റ്വേ പിംഗ് ചെയ്യാൻ കഴിയും</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">ടച്ച്പാഡ്</translation> <translation id="1561927818299383735">ബാക്ക്ലൈറ്റിന്റെ നിറം</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> അപ്ഡേറ്റ് ചെയ്യാനാകുന്നില്ല</translation> +<translation id="1566493343215789965">ഹരിക്കുക</translation> <translation id="1567064801249837505">ആൽബങ്ങൾ</translation> <translation id="1572585716423026576">വാൾപേപ്പറായി സജ്ജീകരിക്കുക</translation> <translation id="1578784163189013834">സ്ക്രീൻ സേവർ പശ്ചാത്തലം തിരഞ്ഞെടുക്കുക</translation> <translation id="160633243685262989">പ്രിവ്യൂ ചിത്രം</translation> <translation id="1611649489706141841">കൈമാറുക</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> മുതലുള്ള ഡാറ്റാ ഉപയോഗം</translation> +<translation id="1615576200479539465">ചിത്രങ്ങൾ സൃഷ്ടിക്കുന്നു...</translation> <translation id="1621067168122174824">ചാർജ് ടെസ്റ്റ് റൺ ചെയ്യുക</translation> <translation id="1626590945318984973">കുറുക്കുവഴി ലഭ്യമല്ല. ഫംഗ്ഷനും <ph name="META_KEY" /> കീകളും ഉപയോഗിക്കാതെ ഒരു പുതിയ കുറുക്കുവഴി അമർത്തുക.</translation> <translation id="1639239467298939599">ലോഡുചെയ്യുന്നു</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> സെക്കൻഡിൽ <ph name="RATE" /> ഡിസ്ചാർജ് ചെയ്തു.</translation> <translation id="2880569433548999039">ക്ലൗഡ് ഫ്ലോ സ്ക്രീൻ സേവർ</translation> <translation id="2926057806159140518">നിങ്ങളുടെ ഉപയോക്തൃനാമവും പാസ്വേഡും നൽകുക അല്ലെങ്കിൽ നിങ്ങളുടെ QR കോഡ് സ്കാൻ ചെയ്യുക</translation> +<translation id="2938573842839598578">ഏകദേശ ഫലത്തിനായി, <ph name="CONVERSION_RATE" /> കൊണ്ട് <ph name="CATEGORY_TEXT" /> എന്ന മൂല്യത്തെ <ph name="OPERATOR_TEXT" /></translation> <translation id="2940811910881150316">ഉപകരണം പരീക്ഷിച്ച് നോക്കാനാകുന്നില്ല. പരീക്ഷിച്ച് നോക്കാൻ ലിഡ് വീണ്ടും തുറക്കുക.</translation> <translation id="2941112035454246133">താഴ്ന്ന</translation> <translation id="3008341117444806826">റീഫ്രഷ് ചെയ്യുക</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS അപ്ഡേറ്റ്</translation> <translation id="3527036260304016759">പ്രിന്റ് ചെയ്യാനായില്ല - അജ്ഞാതമായ പിശക്</translation> <translation id="3532980081107202182">ഏകദേശം <ph name="MIN_REMAINING" /> മിനിറ്റ് ശേഷിക്കുന്നു</translation> +<translation id="3547264467365135390">ഫോർമുല</translation> <translation id="3557205324756024651">ലോക്കൽ ഐഡന്റിറ്റി (ഓപ്ഷണൽ)</translation> <translation id="3565064564551103223">അനുവദനീയമായ IP-കൾ</translation> <translation id="3569407787324516067">സ്ക്രീൻ സേവർ</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">റീഫ്രഷ് ചെയ്യുക</translation> <translation id="7180865173735832675">ഇച്ഛാനുസൃതമാക്കുക</translation> <translation id="7184043045742675738">നിങ്ങളുടെ ബട്ടൺ ഇഷ്ടാനുസൃതമാക്കാൻ ഏതെങ്കിലും കീയിൽ ക്ലിക്ക് ചെയ്യുക. മൗസ് അല്ലെങ്കിൽ അമ്പടയാള കീകൾ ഉപയോഗിച്ച് കീയുടെ സ്ഥാനം മാറ്റുക.</translation> +<translation id="7206979415662233817">സേവന നിബന്ധനകൾ</translation> <translation id="7212547870105584639">നെറ്റ്വർക്ക് APN ക്രമീകരണം മാനേജ് ചെയ്യുക. സെല്ലുലാർ നെറ്റ്വർക്കിനും ഇന്റർനെറ്റിനും ഇടയിൽ APN-കൾ കണക്ഷൻ സ്ഥാപിക്കുന്നു. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">ബാഹ്യ ഉപകരണങ്ങൾക്കുള്ള ഫേംവെയർ അപ്ഡേറ്റുകൾ</translation> <translation id="7216409898977639127">സെല്ലുലാര് സേവനദാതാവ്</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">കീബോർഡിന്റെ നിറം</translation> <translation id="7317831949569936035">സ്കൂൾ എൻറോൾമെന്റ്</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">നിങ്ങൾക്ക് കുറഞ്ഞത് 18 വയസ്സ് പ്രായമുണ്ടായിരിക്കണം, കൂടാതെ നിങ്ങളുടെ AI വാൾപേപ്പറുകളുടെ ഉപയോഗം <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google സേവന നിബന്ധനകൾ<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" />, <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />ജനറേറ്റീവ് AI അധിക സേവന നിബന്ധനകൾ<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> എന്നിവയ്ക്ക് വിധേയമാണെന്ന് സമ്മതിക്കുകയും വേണം. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + വ്യക്തിപരവും വാണിജ്യേതരവുമായ ഉപയോഗത്തിനായി നിങ്ങൾക്ക് AI ഉപയോഗിച്ച് മാത്രമേ വാൾപേപ്പറുകൾ സൃഷ്ടിക്കാനാകൂ. നിങ്ങൾക്ക് വാൾപേപ്പറുമായി ബന്ധപ്പെട്ട സഹായം ലഭിക്കുമ്പോൾ, <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google-ന്റെ സ്വകാര്യതാ നയത്തിന്<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> വിധേയമായി വാൾപേപ്പർ നിർദ്ദേശങ്ങൾ സൃഷ്ടിക്കാൻ Google AI സെർവറുകളിലേക്ക് ടെക്സ്റ്റ് അയയ്ക്കും. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Search-ൽ ഫലം കാണാൻ Search+space അമർത്തുക.</translation> <translation id="7343649194310845056">നെറ്റ്വർക്ക് ഉപകരണങ്ങൾ</translation> <translation id="7353413232959255829"><ph name="LIST_SIZE" /> തിരയൽ ഫലങ്ങളിൽ <ph name="LIST_POSITION" />-ാമത്തേത്: <ph name="SEARCH_RESULT_TEXT" />. കുറുക്കുവഴിയിലേക്ക് നാവിഗേറ്റ് ചെയ്യാൻ Enter അമർത്തുക.</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index 874d0c9..82e6f5c 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">आन्तरिक त्रुटि</translation> <translation id="1124772482545689468">प्रयोगकर्ता</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">गुणन गर्नुहोस्</translation> <translation id="1145018782460575098">बाह्य डिभाइसको फर्मवेयर अपडेट गर्ने विन्डो खुला छ। <ph name="NUM_UPDATES" /> वटा अपडेट उपलब्ध छन्।</translation> <translation id="1145516343487477149">Chromebook सँग सम्बन्धित मद्दतसम्बन्धी लेख र त्यसका बारेमा सामान्यतया सोधिने प्रश्नहरूको जवाफ भेट्टाउनुहोस्</translation> <translation id="1154390310959620237">तपाईं ५ वटा सर्टकट मात्र कस्टमाइज गर्न सक्नुहुन्छ। नयाँ सर्टकट राख्न पुरानो सर्टकट मेटाउनुहोस्।</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">स्क्यान गर्ने क्षेत्रमा मिलाउनुहोस्</translation> <translation id="1367951781824006909">एउटा फाइल रोज्नुहोस्</translation> +<translation id="1371650399987522809">Google AI का सहायताले वालपेपर बनाउने सुविधासम्बन्धी प्रतिक्रिया</translation> <translation id="1387854245479784695">यसमा सबै कोरहरूको डेटा समावेश हुन्छ</translation> <translation id="1394661041439318933">यो डिभाइसको केसमा <ph name="BATTERY_PERCENTAGE" />% ब्याट्री बाँकी छ।</translation> <translation id="1397738625398125236">गेटवे पिङ गर्न सकिन्छ</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">टचप्याड</translation> <translation id="1561927818299383735">ब्याकलिटको रङ</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> अपडेट गर्न सकिएन</translation> +<translation id="1566493343215789965">भाग गर्नुहोस्</translation> <translation id="1567064801249837505">एल्बमहरू</translation> <translation id="1572585716423026576">वालपेपरका रूपमा सेट गर्नुहोस्</translation> <translation id="1578784163189013834">स्क्रिन सेभरको ब्याकग्राउन्ड चयन गर्नुहोस्</translation> <translation id="160633243685262989">फोटो प्रिभ्यू गर्नुहोस्</translation> <translation id="1611649489706141841">फर्वाड गर्नुहोस्</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> देखि प्रयोग गरिएको डेटा</translation> +<translation id="1615576200479539465">फोटो बनाइँदै छ...</translation> <translation id="1621067168122174824">ब्याट्रीको चार्जसम्बन्धी परीक्षण गर्नुहोस्</translation> <translation id="1626590945318984973">यो सर्टकट उपलब्ध छैन। फङ्सन की र <ph name="META_KEY" /> की प्रयोग नगरिकनै नयाँ सर्टकटमा थिच्नुहोस्।</translation> <translation id="1639239467298939599">लोड गर्दै</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> सेकेन्डमा <ph name="RATE" /> घट्यो।</translation> <translation id="2880569433548999039">क्लाउड फ्लो स्क्रिन सेभर</translation> <translation id="2926057806159140518">आफ्नो युजरनेम र पासवर्ड हाल्नुहोस् वा आफ्नो QR कोड स्क्यान गर्नुहोस्</translation> +<translation id="2938573842839598578">अनुमानित परिणाम प्राप्त गर्न <ph name="CATEGORY_TEXT" /> लाई <ph name="CONVERSION_RATE" /> ले <ph name="OPERATOR_TEXT" /></translation> <translation id="2940811910881150316">डिभाइसको परीक्षण गर्न सकिँदैन। परीक्षण गर्न लिड फेरि खोल्नुहोस्।</translation> <translation id="2941112035454246133">निम्न</translation> <translation id="3008341117444806826">पुनः ताजा गर्नुहोस्</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS को अपडेट</translation> <translation id="3527036260304016759">प्रिन्ट गर्न सकिएन - अज्ञात त्रुटि भयो</translation> <translation id="3532980081107202182"><ph name="MIN_REMAINING" /> मिनेट जति बाँकी छ</translation> +<translation id="3547264467365135390">सूत्र</translation> <translation id="3557205324756024651">लोकल आइडेन्टिटी (ऐच्छिक)</translation> <translation id="3565064564551103223">अनुमति दिइएका IP</translation> <translation id="3569407787324516067">स्क्रिन सेभर</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">ताजा गर्नुहोस्</translation> <translation id="7180865173735832675">कस्टमाइज गर्नुहोस्</translation> <translation id="7184043045742675738">आफ्नो बटन कस्टमाइज गर्न जुनसुकै कीमा क्लिक गर्नुहोस्। माउस वा एरो कीहरू प्रयोग गरेर की यताउता सार्नुहोस्।</translation> +<translation id="7206979415662233817">सेवाका सर्तहरू</translation> <translation id="7212547870105584639">नेटवर्क APN सम्बन्धी सेटिङ मिलाउनुहोस्। APN ले मोबाइल नेटवर्क र इन्टरनेटबिचको कनेक्सन बनाउँछ। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">बाह्य डिभाइसहरूका लागि फर्मवेयरसम्बन्धी अपडेटहरू</translation> <translation id="7216409898977639127">सेलुलर प्रदायक</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">किबोर्डको रङ</translation> <translation id="7317831949569936035">स्कुलको इमेल ठेगाना हालेर डिभाइस दर्ता गर्ने प्रक्रिया</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">तपाईंको उमेर कम्तीमा १८ वर्ष पुगेको हुनु पर्छ र तपाईंले AI वालपेपरहरूको प्रयोगमा <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google का सेवाका सर्त<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> र <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />जेनेरेटिभ AI का सेवाका अतिरिक्त सर्तहरू<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> लागू हुन्छन् भन्ने कुरामा सहमति जनाउनु पर्ने हुन्छ। + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + तपाईं AI प्रयोग गरेर व्यक्तिगत र गैर व्यापारिक प्रयोजनका लागि मात्र वालपेपर बनाउन सक्नुहुन्छ। तपाईंले वालपेपर बनाउन AI को मद्दत लिँदा वालपेपरका सुझावहरू देखाउने प्रयोजनका लागि तपाईंले हालेको टेक्स्ट <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google को गोपनीयता नीति<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />बमोजिम Google AI मा पठाइन्छ। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Search मा परिणाम हेर्न Search र Space बटन एकै चोटि थिच्नुहोस्।</translation> <translation id="7343649194310845056">नेटवर्कसम्बन्धी यन्त्रहरू</translation> <translation id="7353413232959255829"><ph name="LIST_SIZE" /> मध्ये <ph name="LIST_POSITION" /> औँ खोज परिणाम: <ph name="SEARCH_RESULT_TEXT" />। सर्टकटमा जान इन्टर की थिच्नुहोस्।</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 337135df..9e0783b 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">ਅੰਦਰੂਨੀ ਗੜਬੜ</translation> <translation id="1124772482545689468">ਵਰਤੋਂਕਾਰ</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">ਗੁਣਾ ਕਰੋ</translation> <translation id="1145018782460575098">ਬਾਹਰੀ ਡੀਵਾਈਸਾਂ ਲਈ ਅੱਪਡੇਟ ਫ਼ਰਮਵੇਅਰ ਵਿੰਡੋ ਖੁੱਲ੍ਹੀ ਹੈ। <ph name="NUM_UPDATES" /> ਅੱਪਡੇਟ ਉਪਲਬਧ ਹਨ।</translation> <translation id="1145516343487477149">ਮਦਦ ਲੇਖ ਅਤੇ Chromebook ਸੰਬੰਧੀ ਆਮ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਲੱਭੋ</translation> <translation id="1154390310959620237">ਤੁਸੀਂ ਸਿਰਫ਼ 5 ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰ ਸਕਦੇ ਹੋ। ਨਵਾਂ ਸ਼ਾਰਟਕੱਟ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕਿਸੇ ਇੱਕ ਨੂੰ ਮਿਟਾਓ।</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ਸਕੈਨ ਕਰਨ ਯੋਗ ਖੇਤਰ ਵਿੱਚ ਫਿੱਟ ਕਰੋ</translation> <translation id="1367951781824006909">ਇੱਕ ਫਾਈਲ ਚੁਣੋ</translation> +<translation id="1371650399987522809">Google AI ਵੱਲੋਂ ਸੰਚਾਲਿਤ ਵਾਲਪੇਪਰ ਲਈ ਵਿਚਾਰ</translation> <translation id="1387854245479784695">ਇਹ ਸਾਰੇ ਕੋਰ ਅੰਕੜਿਆਂ ਦਾ ਇਕੱਤਰੀਕਰਨ ਹੈ</translation> <translation id="1394661041439318933">ਡੀਵਾਈਸ ਦੇ ਕੇਸ ਦੀ ਬੈਟਰੀ ਦਾ ਪੱਧਰ <ph name="BATTERY_PERCENTAGE" />% ਹੈ।</translation> <translation id="1397738625398125236">ਗੇਟਵੇ ਨੂੰ ਪਿੰਗ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">ਟਚਪੈਡ</translation> <translation id="1561927818299383735">ਬੈਕਲਿਟ ਰੰਗ</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> ਨੂੰ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> +<translation id="1566493343215789965">ਭਾਗ ਕਰੋ</translation> <translation id="1567064801249837505">ਐਲਬਮਾਂ</translation> <translation id="1572585716423026576">ਵਾਲਪੇਪਰ ਵਜੋਂ ਸੈੱਟ ਕਰੋ</translation> <translation id="1578784163189013834">ਸਕ੍ਰੀਨ ਸੇਵਰ ਬੈਕਗ੍ਰਾਊਂਡ ਚੁਣੋ</translation> <translation id="160633243685262989">ਚਿੱਤਰ ਦੀ ਪੂਰਵ-ਝਲਕ ਦੇਖੋ</translation> <translation id="1611649489706141841">ਅੱਗੇ ਭੇਜੋ</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> ਤੋਂ ਡਾਟਾ ਵਰਤੋਂ</translation> +<translation id="1615576200479539465">ਚਿੱਤਰ ਸਿਰਜੇ ਜਾ ਰਹੇ ਹਨ...</translation> <translation id="1621067168122174824">ਚਾਰਜ ਟੈਸਟ ਚਲਾਓ</translation> <translation id="1626590945318984973">ਸ਼ਾਰਟਕੱਟ ਉਪਲਬਧ ਨਹੀਂ। ਫੰਕਸ਼ਨ ਅਤੇ <ph name="META_KEY" /> ਕੁੰਜੀਆਂ ਨੂੰ ਵਰਤੇ ਬਿਨਾਂ ਨਵਾਂ ਸ਼ਾਰਟਕੱਟ ਦਬਾਓ।</translation> <translation id="1639239467298939599">ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> ਸਕਿੰਟਾਂ ਵਿੱਚ <ph name="RATE" /> ਖਤਮ ਹੋਈ।</translation> <translation id="2880569433548999039">ਬੱਦਲ ਪ੍ਰਵਾਹ ਦਾ ਸਕ੍ਰੀਨ ਸੇਵਰ</translation> <translation id="2926057806159140518">ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਅਤੇ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ ਜਾਂ ਆਪਣਾ QR ਕੋਡ ਸਕੈਨ ਕਰੋ</translation> +<translation id="2938573842839598578">ਅੰਦਾਜ਼ਨ ਨਤੀਜੇ ਲਈ, <ph name="CONVERSION_RATE" /> 'ਤੇ <ph name="OPERATOR_TEXT" /> ਨੂੰ <ph name="CATEGORY_TEXT" /> ਮੁੱਲ ਵਿੱਚ ਬਦਲੋ</translation> <translation id="2940811910881150316">ਡੀਵਾਈਸ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਜਾਂਚ ਕਰਨ ਲਈ ਢੱਕਣ ਨੂੰ ਮੁੜ-ਖੋਲ੍ਹੋ।</translation> <translation id="2941112035454246133">ਘੱਟ</translation> <translation id="3008341117444806826">ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS ਸੰਬੰਧੀ ਅੱਪਡੇਟ</translation> <translation id="3527036260304016759">ਅਸਫਲ ਰਹੀ - ਅਗਿਆਤ ਗੜਬੜ</translation> <translation id="3532980081107202182">ਲਗਭਗ <ph name="MIN_REMAINING" /> ਮਿੰਟ ਬਾਕੀ</translation> +<translation id="3547264467365135390">ਫ਼ਾਰਮੂਲਾ</translation> <translation id="3557205324756024651">ਸਥਾਨਕ ਪਛਾਣ (ਵਿਕਲਪਿਕ)</translation> <translation id="3565064564551103223">ਮਨਜ਼ੂਰਸ਼ੁਦਾ IP</translation> <translation id="3569407787324516067">ਸਕ੍ਰੀਨ ਸੇਵਰ</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="7180865173735832675">ਵਿਉਂਤਬੱਧ ਕਰੋ</translation> <translation id="7184043045742675738">ਆਪਣੇ ਬਟਨ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਕਿਸੇ ਵੀ ਕੁੰਜੀ 'ਤੇ ਕਲਿੱਕ ਕਰੋ। ਮਾਊਸ ਜਾਂ ਤੀਰ ਕੁੰਜੀਆਂ ਨਾਲ ਕੁੰਜੀ ਦੀ ਥਾਂ ਬਦਲੋ।</translation> +<translation id="7206979415662233817">ਸੇਵਾ ਦੇ ਨਿਯਮ</translation> <translation id="7212547870105584639">ਨੈੱਟਵਰਕ APN ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। APN ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ ਵਿਚਕਾਰ ਕਨੈਕਸ਼ਨ ਸਥਾਪਤ ਕਰਦੇ ਹਨ। <ph name="BEGIN_LINK_LEARN_MORE" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">ਬਾਹਰੀ ਡੀਵਾਈਸਾਂ ਲਈ ਫ਼ਰਮਵੇਅਰ ਅੱਪਡੇਟ</translation> <translation id="7216409898977639127">ਸੈਲਿਊਲਰ ਪ੍ਰਦਾਨਕ</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">ਕੀ-ਬੋਰਡ ਦਾ ਰੰਗ</translation> <translation id="7317831949569936035">ਸਕੂਲ ਵਿੱਚ ਦਾਖਲੇ ਦੀ ਪ੍ਰਕਿਰਿਆ</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">ਤੁਹਾਡੀ ਉਮਰ ਘੱਟੋ-ਘੱਟ 18 ਸਾਲ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੀ AI ਵਾਲਪੇਪਰਾਂ ਦੀ ਵਰਤੋਂ <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> ਅਤੇ <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />ਜਨਰੇਟਿਵ AI ਵਧੀਕ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> ਦੇ ਅਧੀਨ ਹੈ। + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + ਤੁਸੀਂ ਸਿਰਫ਼ ਨਿੱਜੀ ਅਤੇ ਗੈਰ-ਵਪਾਰਕ ਵਰਤੋਂ ਲਈ AI ਨਾਲ ਵਾਲਪੇਪਰ ਬਣਾ ਸਕਦੇ ਹੋ। ਜਦੋਂ ਤੁਸੀਂ ਵਾਲਪੇਪਰ ਸੰਬੰਧੀ ਸਹਾਇਤਾ ਪ੍ਰਾਪਤ ਕਰਦੇ ਹੋ, ਤਾਂ <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google ਦੀ ਪਰਦੇਦਾਰੀ ਨੀਤੀ<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> ਦੇ ਅਧੀਨ, ਵਾਲਪੇਪਰ ਸੰਬੰਧੀ ਸੁਝਾਅ ਤਿਆਰ ਕਰਨ ਲਈ ਲਿਖਤ Google AI ਸਰਵਰਾਂ ਨੂੰ ਭੇਜੀ ਜਾਂਦੀ ਹੈ। <ph name="BEGIN_LINK_LEARN_MORE" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Google Search ਵਿੱਚ ਨਤੀਜਾ ਦੇਖਣ ਲਈ Search ਦੇ ਨਾਲ Space ਨੂੰ ਦਬਾਓ।</translation> <translation id="7343649194310845056">ਨੈੱਟਵਰਕ ਡੀਵਾਈਸ</translation> <translation id="7353413232959255829"><ph name="LIST_SIZE" /> ਵਿੱਚੋਂ <ph name="LIST_POSITION" /> ਖੋਜ ਨਤੀਜਾ: <ph name="SEARCH_RESULT_TEXT" />। ਸ਼ਾਰਟਕੱਟ 'ਤੇ ਨੈਵੀਗੇਟ ਕਰਨ ਲਈ Enter ਦਬਾਓ।</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index a145fa80..92ddc426 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -578,7 +578,7 @@ <translation id="5227902338748591677">Raspored tamne teme</translation> <translation id="5229344016299762883">Izađite iz prikaza preko celog ekrana</translation> <translation id="5234764350956374838">Odbaci</translation> -<translation id="5244638145904800454">{NUM_ROOL_APPS,plural,offset:1 =1{Administrator je podesio da se <ph name="APP_NAME" /> automatski pokreće svaki put kada se prijavite.}=2{Administrator je podesio da se <ph name="APP_NAME" /> i još 1 aplikacija automatski pokreću svaki put kada se prijavite.}one{Administrator je podesio da se <ph name="APP_NAME" /> i još # aplikacija automatski pokreću svaki put kada se prijavite.}few{Administrator je podesio da se <ph name="APP_NAME" /> i još # aplikacije automatski pokreću svaki put kada se prijavite.}other{Administrator je podesio da se <ph name="APP_NAME" /> i još # aplikacija automatski pokreću svaki put kada se prijavite.}}</translation> +<translation id="5244638145904800454">{NUM_ROOL_APPS,plural,offset:1 =1{Administrator je podesio da se <ph name="APP_NAME" /> automatski pokreće svaki put kada se prijavite.}=2{Administrator je podesio da se <ph name="APP_NAME" /> i još 1 aplikacija automatski pokreću svaki put kada se prijavite.}one{Administrator je podesio da se <ph name="APP_NAME" /> i još # aplikacija automatski pokreću svaki put kada se prijavite.}few{Administrator je podesio da se <ph name="APP_NAME" /> i još # aplikacije automatski pokreću svaki put kada se prijavite.}other{Administrator je podesio da se <ph name="APP_NAME" /> i još # aplikacija automatski pokreće svaki put kada se prijavite.}}</translation> <translation id="5252456968953390977">Roming</translation> <translation id="5257811368506016604">Omogućite režim svetle boje</translation> <translation id="5264277876637023664">Pokreni test procesora</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 2ffc743b..257229a 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -578,7 +578,7 @@ <translation id="5227902338748591677">Распоред тамне теме</translation> <translation id="5229344016299762883">Изађите из приказа преко целог екрана</translation> <translation id="5234764350956374838">Одбаци</translation> -<translation id="5244638145904800454">{NUM_ROOL_APPS,plural,offset:1 =1{Администратор је подесио да се <ph name="APP_NAME" /> аутоматски покреће сваки пут када се пријавите.}=2{Администратор је подесио да се <ph name="APP_NAME" /> и још 1 апликација аутоматски покрећу сваки пут када се пријавите.}one{Администратор је подесио да се <ph name="APP_NAME" /> и још # апликација аутоматски покрећу сваки пут када се пријавите.}few{Администратор је подесио да се <ph name="APP_NAME" /> и још # апликације аутоматски покрећу сваки пут када се пријавите.}other{Администратор је подесио да се <ph name="APP_NAME" /> и још # апликација аутоматски покрећу сваки пут када се пријавите.}}</translation> +<translation id="5244638145904800454">{NUM_ROOL_APPS,plural,offset:1 =1{Администратор је подесио да се <ph name="APP_NAME" /> аутоматски покреће сваки пут када се пријавите.}=2{Администратор је подесио да се <ph name="APP_NAME" /> и још 1 апликација аутоматски покрећу сваки пут када се пријавите.}one{Администратор је подесио да се <ph name="APP_NAME" /> и још # апликација аутоматски покрећу сваки пут када се пријавите.}few{Администратор је подесио да се <ph name="APP_NAME" /> и још # апликације аутоматски покрећу сваки пут када се пријавите.}other{Администратор је подесио да се <ph name="APP_NAME" /> и још # апликација аутоматски покреће сваки пут када се пријавите.}}</translation> <translation id="5252456968953390977">Роминг</translation> <translation id="5257811368506016604">Омогућите режим светле боје</translation> <translation id="5264277876637023664">Покрени тест процесора</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index fe0a69c..270129a 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -392,7 +392,7 @@ <translation id="3959413315969265597">Det gick inte att aktivera detta APN. Kontrollera att du lägger till ett standard-APN.</translation> <translation id="3966286471246132217">Du får mer exakta resultat om du stänger alla appar tills testet är slutfört.</translation> <translation id="3967822245660637423">Nedladdning slutförd</translation> -<translation id="3969602104473960991">Lösenordet för Chrome OS har uppdaterats</translation> +<translation id="3969602104473960991">Lösenordet för ChromeOS har uppdaterats</translation> <translation id="397105322502079400">Beräknar ...</translation> <translation id="39823212440917567">Utskriftsjobb som är äldre än <ph name="NUMBER_OF_DAYS" /> dagar tas bort</translation> <translation id="3993704782688964914"><ph name="DEVICE_NAME" /> har nu uppdaterats</translation> @@ -698,7 +698,7 @@ <translation id="6113701710518389813">Uppåtpiltangenten</translation> <translation id="6117895505466548728"><ph name="TITLE" /> och <ph name="NUMBER" /> album till</translation> <translation id="6122191549521593678">Online</translation> -<translation id="6122277663991249694">Tjänst för inmatningsmetod för Chrome OS</translation> +<translation id="6122277663991249694">Tjänst för inmatningsmetod för ChromeOS</translation> <translation id="6136285399872347291">backsteg</translation> <translation id="6137767437444130246">Användarcertifikat</translation> <translation id="6146993107019042706">Slutför genom att ange det nya lösenordet</translation> @@ -1007,7 +1007,7 @@ <translation id="8410244574650205435">Identifierades automatiskt</translation> <translation id="8420955526972171689">Kör tester och felsök vid problem med maskinvara</translation> <translation id="8422748173858722634">IMEI</translation> -<translation id="8431300646573772016">Nyheter i Chrome OS</translation> +<translation id="8431300646573772016">Nyheter i ChromeOS</translation> <translation id="843568408673868420">Internetanslutning</translation> <translation id="844521431886043384">DNS har inte konfigurerats</translation> <translation id="8456761643544401578">Automatiskt mörkt läge</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 00da7c7b8..b4818dd 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -1115,7 +1115,7 @@ <translation id="9122602430962285795">Щоб знову підключитися, перейдіть у налаштування</translation> <translation id="9126720536733509015">Зберігати кілька сторінок в один файл PDF</translation> <translation id="9133772297793293778">Натисніть від 1 до 4 модифікаторів і одну іншу клавішу на клавіатурі. Щоб вийти з режиму редагування, натисніть комбінацію клавіш Alt + Esc.</translation> -<translation id="9137526406337347448">Служби Google</translation> +<translation id="9137526406337347448">Сервіси Google</translation> <translation id="9138630967333032450">Ліва клавіша Shift</translation> <translation id="9149391708638971077">Виконати перевірку пам'яті</translation> <translation id="9161276708550942948">пробіл</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index 875f42d5..66a77ba 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">داخلی خرابی</translation> <translation id="1124772482545689468">صارف</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">ضرب دیں</translation> <translation id="1145018782460575098">خارجی آلات کے لیے فرم ویئر کو اپ ڈیٹ کریں کا ونڈو کھلا ہے۔ <ph name="NUM_UPDATES" /> اپ ڈیٹس دستیاب ہیں۔</translation> <translation id="1145516343487477149">امدادی مضامین اور Chromebook سے متعلق عام سوالات کے جوابات تلاش کریں</translation> <translation id="1154390310959620237">آپ صرف 5 شارٹ کٹس کو حسب ضرورت بنا سکتے ہیں۔ ایک نیا شارکٹ شامل کرنے کے لیے موجودہ کسی شارکٹ کو حذف کریں۔</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">اسکین کرنے کی جگہ تک فٹ کریں</translation> <translation id="1367951781824006909">ایک فائل منتخب کریں</translation> +<translation id="1371650399987522809">Google AI سے تقویت یافتہ وال پیپر کے لیے تاثرات</translation> <translation id="1387854245479784695">یہ سبھی کورز کا مجموعہ ہے</translation> <translation id="1394661041439318933">آلے کے کیس میں <ph name="BATTERY_PERCENTAGE" />فیصد بیٹری ہے۔</translation> <translation id="1397738625398125236">گیٹ وے کو پنگ کیا جا سکتا ہے</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">ٹچ پیڈ</translation> <translation id="1561927818299383735">بیک لٹ کا رنگ</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> کو اپ ڈیٹ نہیں کر سکتے</translation> +<translation id="1566493343215789965">تقسیم کریں</translation> <translation id="1567064801249837505">البمز</translation> <translation id="1572585716423026576">بطور وال پیپر سیٹ کریں</translation> <translation id="1578784163189013834">اسکرین سیور کا پس منظر منتخب کریں</translation> <translation id="160633243685262989">تصویر کا پیش منظر دیکھیں</translation> <translation id="1611649489706141841">فارورڈ کریں</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> سے ڈیٹا کا استعمال</translation> +<translation id="1615576200479539465">تصاویر تخلیق کی جا رہی ہیں...</translation> <translation id="1621067168122174824">چارج ٹیسٹ چلائیں</translation> <translation id="1626590945318984973">شارٹ کٹ دستیاب نہیں ہے۔ فنکشن اور <ph name="META_KEY" /> کی کلیدیں استعمال کیے بغیر نیا شارٹ کٹ دبائیں۔</translation> <translation id="1639239467298939599">لوڈ ہو رہی ہے</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> سیکنڈ میں <ph name="RATE" /> ڈسچارج ہوئی۔</translation> <translation id="2880569433548999039">کلاؤڈ فلو اسکرین سیور</translation> <translation id="2926057806159140518">اپنا صارف نام اور پاس ورڈ درج کریں یا اپنا QR کوڈ اسکین کریں</translation> +<translation id="2938573842839598578">ایک تخمینی نتیجے کے لیے، <ph name="CATEGORY_TEXT" /> قدر کو <ph name="CONVERSION_RATE" /> سے <ph name="OPERATOR_TEXT" /></translation> <translation id="2940811910881150316">آلہ کو ٹیسٹ نہیں کیا جا سکتا۔ ٹیسٹ کرنے کے لیے پپوٹوں کو دوبارہ کھولیں۔</translation> <translation id="2941112035454246133">کم</translation> <translation id="3008341117444806826">ریفریش کریں</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">Chrome OS اپ ڈیٹ</translation> <translation id="3527036260304016759">ناکام ہو گیا - نامعلوم خرابی</translation> <translation id="3532980081107202182">تقریباً <ph name="MIN_REMAINING" /> منٹ باقی ہیں</translation> +<translation id="3547264467365135390">فارمولہ</translation> <translation id="3557205324756024651">مقامی شناخت (اختیاری)</translation> <translation id="3565064564551103223">اجازت یافتہ IPs</translation> <translation id="3569407787324516067">اسکرین سیور</translation> @@ -456,7 +462,7 @@ <translation id="4395835743215824109">کی بورڈ کو حسب ضرورت بنانا</translation> <translation id="4403262788869804671"><ph name="META_KEY" /> کی کلید کے بغیر شارٹ کٹ کچھ ایپ کے شارٹ کٹ سے متصادم ہو سکتا ہے۔ اس شارٹ کٹ کا استعمال جاری رکھنے کے لیے اسے دوبارہ دبائیں یا <ph name="KEY" /> کی کلید کا استعمال کرتے ہوئے نیا شارٹ کٹ دبائیں۔</translation> <translation id="4415951057168511744">موجودہ اوتار</translation> -<translation id="4417830657741848074">کے منتظم نے کچھ ایپس کو خودکار طور پر شروع ہونے کے لیے سیٹ اپ کیا ہے۔ ہو سکتا ہے ان میں سے کچھ ایپس بند نہ ہوں۔</translation> +<translation id="4417830657741848074">آپ کے منتظم نے کچھ ایپس کو خودکار طور پر شروع ہونے کے لیے سیٹ اپ کیا ہے۔ ان میں سے کچھ ایپس کو بند نہیں کیا جا سکتا۔</translation> <translation id="4422041425070339732">نیچے کی طرف تیر کا نشان</translation> <translation id="4425149324548788773">میری ڈرائیو</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> آف ہے</translation> @@ -517,7 +523,7 @@ <translation id="4832079907277790330">فائلز ایپ میں فولڈر منتخب کریں...</translation> <translation id="4835901797422965222">کوئی فعال نیٹ ورک نہیں</translation> <translation id="4839698083503556542">اپنی خود کی مووی بنائیں</translation> -<translation id="48409034532829769">آپ کے منتظم نے "<ph name="APP_NAME" />" کو خودکار طور پر شروع ہونے کے لیے سیٹ اپ کیا ہے۔ ہو سکتا ہے یہ ایپ بند ہو۔</translation> +<translation id="48409034532829769">آپ کے منتظم نے "<ph name="APP_NAME" />" کو خودکار طور پر شروع ہونے کے لیے سیٹ اپ کیا ہے۔ اس ایپ کو بند نہیں کیا جا سکتا۔</translation> <translation id="484462545196658690">خودکار</translation> <translation id="4847902821209177679"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> منتخب کیا گیا، <ph name="TOPIC_SOURCE" /> البمز منتخب کرنے کے لیے Enter دبائیں</translation> <translation id="484790837831576105">(Android) DNS ریزولیوشن</translation> @@ -846,12 +852,13 @@ <translation id="7180611975245234373">ریفریش کریں</translation> <translation id="7180865173735832675">حسب ضرورت بنائیں</translation> <translation id="7184043045742675738">اپنے بٹن کو حسب ضرورت بنانے کے لیے کسی بھی کلید پر کلک کریں۔ ماؤس یا تیر کے نشان والی کلیدوں کے ساتھ کلید کی پوزیشن تبدیل کریں۔</translation> +<translation id="7206979415662233817">سروس کی شرائط</translation> <translation id="7212547870105584639">نیٹ ورک APN کی ترتیبات کا نظم کریں۔ APNs سیلولر نیٹ ورک اور انٹرنیٹ کے درمیان رابطہ قائم کرتے ہیں۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">بیرونی آلات کیلئے فرم ویئر اپ ڈیٹس</translation> <translation id="7216409898977639127">سیلولر فراہم کنندہ</translation> <translation id="725133483556299729">ای میل منتخب کریں</translation> <translation id="7271040990581020067">اسکینر فی الحال زیر استعمال ہے۔ بعد میں دوبارہ کوشش کریں۔</translation> -<translation id="7271932918253517778">اوپر والی قطار والے شارٹ کٹ میں <ph name="META_KEY" /> کی کلید شامل کرنے کی ضرورت ہے۔</translation> +<translation id="7271932918253517778">اوپر والی قطار کی کلیدوں والے شارٹ کٹ میں <ph name="META_KEY" /> کلید شامل کرنے کی ضرورت ہے۔</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> <translation id="7281657306185710294">ہوا کا جھونکا محسوس کریں</translation> <translation id="7287310195820267359">وال پیپر کے مجموعے</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">کی بورڈ کا رنگ</translation> <translation id="7317831949569936035">اسکول میں اندراج</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">آپ کی عمر کم از کم 18 سال ہونی چاہیے اور اس بات سے اتفاق کرتے ہیں کہ آپ کا AI وال پیپرز کا استعمال <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google کی سروس کی شرائط<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> اور <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />تخلیق کر سکنے والے AI نظام کی سروس کی اضافی شرائط<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> کے ساتھ مشروط ہے۔ + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + آپ صرف ذاتی اور غیر تجارتی استعمال کے لیے AI کے ساتھ وال پیپرز بنا سکتے ہیں۔ جب آپ وال پیپر کی مدد حاصل کرتے ہیں تو <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google کی رازداری کی پالیسی<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> کے ساتھ مشروط وال پیپر کی تجاویز تیار کرنے کے لیے Google AI سرورز ٹیکسٹ پیغام بھیجا جاتا ہے۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />؛ <ph name="RESULT_TEXT" />؛ Google تلاش میں نتیجہ دیکھنے کیلئے Search اور Space دبائیں۔</translation> <translation id="7343649194310845056">نیٹ ورک کے آلات</translation> <translation id="7353413232959255829"><ph name="LIST_SIZE" /> میں سے <ph name="LIST_POSITION" /> تلاش کا نتیجہ: <ph name="SEARCH_RESULT_TEXT" />۔ شارٹ کٹ پر نیویگیٹ کرنے کے لیے Enter دبائیں۔</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb index 83e4857c..8b61393 100644 --- a/chromeos/strings/chromeos_strings_uz.xtb +++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Ichki xatolik</translation> <translation id="1124772482545689468">Foydalanuvchi</translation> <translation id="1128128132059598906">EAP-TTLS</translation> +<translation id="1134416403025830762">koʻpaytiring</translation> <translation id="1145018782460575098">Tashqi qurilmalar uchun mikrodasturni yangilash oynasi ochiq. <ph name="NUM_UPDATES" /> ta yangilanish chiqdi.</translation> <translation id="1145516343487477149">Yordam maqolalari va umumiy Chromebook savollariga javoblar toping</translation> <translation id="1154390310959620237">5 tagacha tezkor tugmani moslash mumkin. Yangi tezkor tugma kiritish uchun boshqa birini oʻchiring.</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Skanerlash sohasiga moslash</translation> <translation id="1367951781824006909">Fayl tanlang</translation> +<translation id="1371650399987522809">Google AI yordamida yaratilgan fon rasmi yuzasidan fikr-mulohaza</translation> <translation id="1387854245479784695">Bu barcha yadrolarning faoliyati</translation> <translation id="1394661041439318933">Qurilma gʻilofining batareya quvvati: <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="1397738625398125236">Darvozani tekshirish mumkin</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">Sensorli panel</translation> <translation id="1561927818299383735">orqa chiroq rangi</translation> <translation id="1565038567006703504"><ph name="DEVICE_NAME" /> yangilanmadi</translation> +<translation id="1566493343215789965">boʻling</translation> <translation id="1567064801249837505">Albomlar</translation> <translation id="1572585716423026576">Fon rasmi sifatida belgilash</translation> <translation id="1578784163189013834">Ekran lavhasi uchun fon rasmini tanlash</translation> <translation id="160633243685262989">Rasmga razm solish</translation> <translation id="1611649489706141841">oldinga</translation> <translation id="1615335640928990664"><ph name="FRIENDLY_DATE" /> sanasidan keyingi trafik sarfi</translation> +<translation id="1615576200479539465">Rasmlar yaratilmoqda...</translation> <translation id="1621067168122174824">Quvvatlanishini tekshirish</translation> <translation id="1626590945318984973">Tezkor tugma ishlamayapti. Funksiya va <ph name="META_KEY" /> tugmachalarini bosmasdan qayta urinib koʻring.</translation> <translation id="1639239467298939599">Yuklanmoqda</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070"><ph name="NUM_SECONDS" /> soniyada <ph name="RATE" /> quvvat sarflandi.</translation> <translation id="2880569433548999039">Bulut manzaralari ekran lavhasi</translation> <translation id="2926057806159140518">Login va parolingizni kiriting yoki QR kodni skanerlang</translation> +<translation id="2938573842839598578">Yaqin natijalarni olish uchun <ph name="CATEGORY_TEXT" /> qiymatini <ph name="CONVERSION_RATE" /> ga <ph name="OPERATOR_TEXT" /></translation> <translation id="2940811910881150316">Qurilmani sinash imkonsiz. Sinash uchun qurlimani yopib, keyin qayta oching</translation> <translation id="2941112035454246133">Past</translation> <translation id="3008341117444806826">YANGILASH</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">ChromeOS yangilanishi</translation> <translation id="3527036260304016759">Bajarilmadi - Notanish xato</translation> <translation id="3532980081107202182">Taxminan <ph name="MIN_REMAINING" /> daqiqa qoldi</translation> +<translation id="3547264467365135390">Formula</translation> <translation id="3557205324756024651">Qurilmadagi hisob (ixtiyoriy)</translation> <translation id="3565064564551103223">Ruxsat etilgan IP manzillar</translation> <translation id="3569407787324516067">Ekran lavhasi</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">Yangilash</translation> <translation id="7180865173735832675">Sozlash</translation> <translation id="7184043045742675738">Tugmani sozlash uchun istalgan klaviatura tugmasini bosing. Sichqoncha yoki strelka tugmalari bilan tugma joylashuvini oʻzgartiring</translation> +<translation id="7206979415662233817">Xizmat shartlari</translation> <translation id="7212547870105584639">Tarmoq APN sozlamalarini boshqarish. APN sozlamalari mobil tarmoq va internet orasida aloqani taʼminlaydi. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Tashqi qurilmalar uchun mikrodastur yangilanishi</translation> <translation id="7216409898977639127">Mobil tarmoq</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">klaviatura rangi</translation> <translation id="7317831949569936035">Maktab uchun yozilish</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">AI fon rasmidan foydalanish uchun kamida 18 yoshga kirgan boʻlishingiz kerak. Bu funksiya ishlashida <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />Google xizmat shartlari<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> va <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />Generativ AI qoʻshimcha xizmat shartlari<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" /> amal qiladi. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + AI yordamida fon rasmlarini faqat shaxsiy yoki notijoriy maqsadlar uchun yaratish mumkin. Fon rasmini yaratishda yordam olishda siz kiritgan matn Google AI serverlariga yuboriladi va fon rasmlarini yaratib taklif qiladi. Bu funksiya ishlashida <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />Google Maxfiylik siyosati<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" /> amal qiladi. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Natijalarni Google Qidiruvida chiqarish uchun Qidiruv + Boʻshliq tugmalarini bosing.</translation> <translation id="7343649194310845056">Tarmoq qurilmalari</translation> <translation id="7353413232959255829"><ph name="LIST_POSITION" />/<ph name="LIST_SIZE" /> ta natija: <ph name="SEARCH_RESULT_TEXT" />. Tezkor tugmani ochish uchun Enter tugmasini bosing.</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index 0efa2f6..da5076e 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -21,6 +21,7 @@ <translation id="1119447706177454957">Iphutha langaphakathi</translation> <translation id="1124772482545689468">Umsebenzisi</translation> <translation id="1128128132059598906">I-EAP-TTLS</translation> +<translation id="1134416403025830762">phindaphinda</translation> <translation id="1145018782460575098">Iwindi lesibuyekezo se-firmware samadivayisi wangaphandle livuliwe. izibuyekezo ezitholakalayo <ph name="NUM_UPDATES" /></translation> <translation id="1145516343487477149">Thola izindaba ezichaza ngosizo nezimpendulo zemibuzo ye-Chromebook</translation> <translation id="1154390310959620237">Ungahlela ngendlela oyithandayo izinqamuleli ezi-5 kuphela. Sula isinqamuleli ukuze ufake esisha</translation> @@ -56,6 +57,7 @@ <translation id="1330426557709298164">I-JPG</translation> <translation id="1337912285145772892">Yifake endaweni yokuskena</translation> <translation id="1367951781824006909">Khetha ifayela</translation> +<translation id="1371650399987522809">Impendulo mayelana nesithombe sengemuva inikezwe ngosizo lwe-Google AI</translation> <translation id="1387854245479784695">Lokhu ukuhlanganiswa kwayo yonke iminyombo</translation> <translation id="1394661041439318933">Idivayisi inekesi lebhethri elingu-<ph name="BATTERY_PERCENTAGE" />%.</translation> <translation id="1397738625398125236">Umasango Ungaqhwetshwa</translation> @@ -87,12 +89,14 @@ <translation id="155865706765934889">Iphedi yokuthinta</translation> <translation id="1561927818299383735">umbala we-backlit</translation> <translation id="1565038567006703504">Ayikwazi ukubuyekeza i-<ph name="DEVICE_NAME" /></translation> +<translation id="1566493343215789965">hlukanisa</translation> <translation id="1567064801249837505">Ama-albhamu</translation> <translation id="1572585716423026576">Setha njengephephadonga</translation> <translation id="1578784163189013834">Khetha indawo engemuva yesilondolozi sesikrini</translation> <translation id="160633243685262989">Buka kuqala umfanekiso</translation> <translation id="1611649489706141841">dlulisela</translation> <translation id="1615335640928990664">Ukusetshenziswa kwedatha kusuka ngo-<ph name="FRIENDLY_DATE" /></translation> +<translation id="1615576200479539465">Ikhiqiza izithombe...</translation> <translation id="1621067168122174824">Qalisa ukuhlola kokushaja</translation> <translation id="1626590945318984973">Isinqamuleli asitholakali. Chofoza isinqamuleli esisha ngaphandle kokusebenzisa okukhethwayo nokhiye be-<ph name="META_KEY" />.</translation> <translation id="1639239467298939599">Iyalayisha</translation> @@ -265,6 +269,7 @@ <translation id="2878387241690264070">Iyekiswe ukushaja ngokungu-<ph name="RATE" /> kumasekhondi angu-<ph name="NUM_SECONDS" />.</translation> <translation id="2880569433548999039">Isigciniskrini sokugeleza se-cloud</translation> <translation id="2926057806159140518">Faka igama lomsebenzisi nephasiwedi yakho noma uskene ikhodi yakho ye-QR</translation> +<translation id="2938573842839598578">Ukuze uthole umphumela osendele eduze, <ph name="OPERATOR_TEXT" /> lokhu <ph name="CATEGORY_TEXT" /> ngalokhu <ph name="CONVERSION_RATE" /></translation> <translation id="2940811910881150316">Ayikwazi ukuhlola idivayisi. Vula kabusha isivalo ukuze uhlole.</translation> <translation id="2941112035454246133">Phansi</translation> <translation id="3008341117444806826">VUSELELA</translation> @@ -337,6 +342,7 @@ <translation id="3517001332549868749">Isibuyekezo se-ChromeOS</translation> <translation id="3527036260304016759">Yehlukile - Iphutha elingaziwa</translation> <translation id="3532980081107202182">Kusele cishe amaminithi angu-<ph name="MIN_REMAINING" /></translation> +<translation id="3547264467365135390">Ifomula</translation> <translation id="3557205324756024651">Ubunikazi bendawo (ongakukhetha)</translation> <translation id="3565064564551103223">Ama-IP avunyelwe</translation> <translation id="3569407787324516067">Isigcini sesikrini</translation> @@ -846,6 +852,7 @@ <translation id="7180611975245234373">Qala kabusha</translation> <translation id="7180865173735832675">Yenza ngokwezifiso</translation> <translation id="7184043045742675738">Chofoza kunoma yimuphi ukhiye ukuze wenze ngokwezifiso inkinobho yakho. Beka kabusha ukhiye nge-mouse noma okhiye bemicibisholo.</translation> +<translation id="7206979415662233817">Imigomo yesevisi</translation> <translation id="7212547870105584639">Phatha amasethingi enethiwekhi ye-APN. Ama-APN asungula ukuxhumana phakathi kwenethiwekhi yeselula ne-inthanethi. <ph name="BEGIN_LINK_LEARN_MORE" />Funda kabanzi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7212734716605298123">Izibuyekezo ze-Firmware zamadivayisi angaphandle</translation> <translation id="7216409898977639127">Umhlinzeki weselula</translation> @@ -864,6 +871,10 @@ <translation id="7311368985037279727">umbala wekhibhodi</translation> <translation id="7317831949569936035">Ukubhaliswa kwesikole</translation> <translation id="7319430975418800333">A3</translation> +<translation id="7331297744262591636">Kufanele ube okungenani neminyaka engu-18 ubudala futhi uvume ukuthi ukusebenzisa kwakho izithombe zengemuva ze-AI kungaphansi kokulawula <ph name="GOOGLE_TERMS_OF_SERVICE_LINK" />kweMigomo Yesevisi Ye-Google<ph name="END_LINK_GOOGLE_TERMS_OF_SERVICE" /> kanye <ph name="BEGIN_LINK_GEN_AI_TERMS_OF_SERVICE" />neMigomo Eyengeziwe Yesevisi Ye-AI<ph name="END_LINK_GEN_AI_TERMS_OF_SERVICE" />. + <ph name="LINE_BREAK" /> + <ph name="LINE_BREAK" /> + Ungakwazi ukusungula izithombe zengemuva nge-AI kuphela uma zizosetshenziswa nguwe siqu futhi zingeke zisetshenziselwe ezentengiso. Uma uthola usizo lwesithombe sengemuva, umyalezo uthunyelwa kumaseva e-Google AI ukuze akhiqize iziphakamiso zezithombe zengemuva, ngaphansi kokulawula <ph name="BEGIN_LINK_GOOGLE_PRIVACY_POLICY" />kweNqubomgomo Yobumfihlo Ye-Google<ph name="END_LINK_GOOGLE_PRIVACY_POLICY" />. <ph name="BEGIN_LINK_LEARN_MORE" />Funda kabanzi<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="7343581795491695942"><ph name="QUERY_TEXT" />; <ph name="RESULT_TEXT" />; Cindezela okuthi Sesha ne-Space ukuze ubone umphumela ku-Google Search.</translation> <translation id="7343649194310845056">Amadivayisi Enethiwekhi</translation> <translation id="7353413232959255829">Imiphumela yosesho engu-<ph name="LIST_POSITION" /> kwengu-<ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Cindezela u-Enter ukuze uzulele kusinqamuleli.</translation>
diff --git a/clank b/clank index 9798a6d..46a763c 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit 9798a6dc4119617e2b9d14d91c2d0e43d290097d +Subproject commit 46a763c388f69b4de7d25149a50b688b09c2906e
diff --git a/components/OWNERS b/components/OWNERS index 036e002..3b8ebbd 100644 --- a/components/OWNERS +++ b/components/OWNERS
@@ -44,8 +44,8 @@ per-file printing_component_strings.grdp=file://components/printing/OWNERS per-file privacy_sandbox_strings.grdp=file://components/privacy_sandbox/OWNERS per-file reset_password_strings.grdp=file://components/safe_browsing/OWNERS -per-file search_engine_choice_strings.grdp=file://chrome/browser/search_engine_choice/OWNERS -per-file search_engine_descriptions_strings.grd=file://chrome/browser/search_engine_choice/OWNERS +per-file search_engine_choice_strings.grdp=file://components/search_engines/search_engine_choice/OWNERS +per-file search_engine_descriptions_strings.grd=file://components/search_engines/search_engine_choice/OWNERS per-file security_interstitials_strings.grdp=file://components/security_interstitials/OWNERS per-file send_tab_to_self_strings.grdp=file://components/send_tab_to_self/OWNERS per-file site_settings_strings.grdp=file://components/browser_ui/site_settings/OWNERS
diff --git a/components/android_autofill/DEPS b/components/android_autofill/DEPS index 5e90163c..731e9d69 100644 --- a/components/android_autofill/DEPS +++ b/components/android_autofill/DEPS
@@ -2,6 +2,8 @@ "+components/autofill", "+components/password_manager/core/browser/password_form.h", "+components/password_manager/core/browser/form_parsing", + "+components/prefs", + "+components/user_prefs", "+content/public/android", "+content/public/browser", "+ui",
diff --git a/components/android_autofill/browser/BUILD.gn b/components/android_autofill/browser/BUILD.gn index 59e2fa2..81efc66e 100644 --- a/components/android_autofill/browser/BUILD.gn +++ b/components/android_autofill/browser/BUILD.gn
@@ -34,6 +34,7 @@ ] sources = [ + "java/src/org/chromium/components/autofill/AndroidAutofillClient.java", "java/src/org/chromium/components/autofill/AutofillHintsService.java", "java/src/org/chromium/components/autofill/AutofillManagerWrapper.java", "java/src/org/chromium/components/autofill/AutofillProvider.java", @@ -50,6 +51,7 @@ generate_jni("jni_headers") { sources = [ + "java/src/org/chromium/components/autofill/AndroidAutofillClient.java", "java/src/org/chromium/components/autofill/AutofillProvider.java", "java/src/org/chromium/components/autofill/FormData.java", "java/src/org/chromium/components/autofill/FormFieldData.java", @@ -92,6 +94,8 @@ sources = [ "android_autofill_bridge_factory.cc", "android_autofill_bridge_factory.h", + "android_autofill_client.cc", + "android_autofill_client.h", "autofill_provider_android.cc", "autofill_provider_android.h", "autofill_provider_android_bridge.h", @@ -115,6 +119,8 @@ "//components/autofill/android:keyboard_suppressor", "//components/autofill/content/browser", "//components/password_manager/core/browser/form_parsing", + "//components/prefs", + "//components/user_prefs", "//content/public/browser", "//third_party/jni_zero", "//ui/android",
diff --git a/components/android_autofill/browser/android_autofill_client.cc b/components/android_autofill/browser/android_autofill_client.cc new file mode 100644 index 0000000..36404c0 --- /dev/null +++ b/components/android_autofill/browser/android_autofill_client.cc
@@ -0,0 +1,417 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/android_autofill/browser/android_autofill_client.h" + +#include <utility> + +#include "base/android/build_info.h" +#include "base/android/jni_android.h" +#include "base/android/jni_string.h" +#include "base/android/locale_utils.h" +#include "base/android/scoped_java_ref.h" +#include "base/check_op.h" +#include "base/functional/function_ref.h" +#include "base/notreached.h" +#include "base/types/cxx23_to_underlying.h" +#include "components/android_autofill/browser/android_autofill_manager.h" +#include "components/android_autofill/browser/autofill_provider_android.h" +#include "components/android_autofill/browser/jni_headers/AndroidAutofillClient_jni.h" +#include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h" +#include "components/autofill/core/browser/payments/legal_message_line.h" +#include "components/autofill/core/browser/ui/autofill_popup_delegate.h" +#include "components/autofill/core/browser/ui/popup_item_ids.h" +#include "components/autofill/core/browser/ui/suggestion.h" +#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" +#include "components/autofill/core/common/aliases.h" +#include "components/prefs/pref_service.h" +#include "components/user_prefs/user_prefs.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/ssl_status.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/web_contents.h" +#include "ui/android/view_android.h" +#include "ui/gfx/geometry/rect_f.h" + +using base::android::AttachCurrentThread; +using base::android::ConvertUTF16ToJavaString; +using base::android::JavaParamRef; +using base::android::JavaRef; +using base::android::ScopedJavaLocalRef; +using content::WebContents; + +namespace android_autofill { + +void AndroidAutofillClient::CreateForWebContents( + content::WebContents* contents, + base::FunctionRef<void(const JavaRef<jobject>&)> notify_client_created) { + DCHECK(contents); + if (!FromWebContents(contents)) { + contents->SetUserData(UserDataKey(), + base::WrapUnique(new AndroidAutofillClient( + contents, std::move(notify_client_created)))); + } +} + +AndroidAutofillClient::~AndroidAutofillClient() { + HideAutofillPopup(autofill::PopupHidingReason::kTabGone); +} + +bool AndroidAutofillClient::IsOffTheRecord() { + return GetWebContents().GetBrowserContext()->IsOffTheRecord(); +} + +scoped_refptr<network::SharedURLLoaderFactory> +AndroidAutofillClient::GetURLLoaderFactory() { + return GetWebContents() + .GetBrowserContext() + ->GetDefaultStoragePartition() + ->GetURLLoaderFactoryForBrowserProcess(); +} + +autofill::AutofillCrowdsourcingManager* +AndroidAutofillClient::GetCrowdsourcingManager() { + if (autofill::AutofillProvider:: + is_crowdsourcing_manager_disabled_for_testing()) { + return nullptr; + } + if (!crowdsourcing_manager_) { + // Lazy initialization to avoid virtual function calls in the constructor. + crowdsourcing_manager_ = + std::make_unique<autofill::AutofillCrowdsourcingManager>( + this, GetChannel(), GetLogManager()); + } + return crowdsourcing_manager_.get(); +} + +autofill::PersonalDataManager* AndroidAutofillClient::GetPersonalDataManager() { + return nullptr; +} + +autofill::AutocompleteHistoryManager* +AndroidAutofillClient::GetAutocompleteHistoryManager() { + NOTREACHED_NORETURN(); +} + +PrefService* AndroidAutofillClient::GetPrefs() { + return const_cast<PrefService*>(std::as_const(*this).GetPrefs()); +} + +const PrefService* AndroidAutofillClient::GetPrefs() const { + return user_prefs::UserPrefs::Get(GetWebContents().GetBrowserContext()); +} + +syncer::SyncService* AndroidAutofillClient::GetSyncService() { + // TODO(b/321949351): Move this and other stubs into AutofillClient. + return nullptr; +} + +signin::IdentityManager* AndroidAutofillClient::GetIdentityManager() { + return nullptr; +} + +autofill::FormDataImporter* AndroidAutofillClient::GetFormDataImporter() { + return nullptr; +} + +autofill::payments::PaymentsNetworkInterface* +AndroidAutofillClient::GetPaymentsNetworkInterface() { + return nullptr; +} + +autofill::StrikeDatabase* AndroidAutofillClient::GetStrikeDatabase() { + return nullptr; +} + +ukm::UkmRecorder* AndroidAutofillClient::GetUkmRecorder() { + return nullptr; +} + +ukm::SourceId AndroidAutofillClient::GetUkmSourceId() { + // TODO(b/321677608): Consider UKM recording via delegate (non-WebView only). + return ukm::kInvalidSourceId; +} + +autofill::AddressNormalizer* AndroidAutofillClient::GetAddressNormalizer() { + return nullptr; +} + +const GURL& AndroidAutofillClient::GetLastCommittedPrimaryMainFrameURL() const { + return GetWebContents().GetPrimaryMainFrame()->GetLastCommittedURL(); +} + +url::Origin AndroidAutofillClient::GetLastCommittedPrimaryMainFrameOrigin() + const { + return GetWebContents().GetPrimaryMainFrame()->GetLastCommittedOrigin(); +} + +security_state::SecurityLevel +AndroidAutofillClient::GetSecurityLevelForUmaHistograms() { + // TODO(b/321677908): Consider recording for non-webview. + // Return the count value which will not be recorded. + return security_state::SecurityLevel::SECURITY_LEVEL_COUNT; +} + +const translate::LanguageState* AndroidAutofillClient::GetLanguageState() { + return nullptr; +} + +translate::TranslateDriver* AndroidAutofillClient::GetTranslateDriver() { + return nullptr; +} + +void AndroidAutofillClient::ShowAutofillSettings( + autofill::FillingProduct main_filling_product) { + NOTIMPLEMENTED(); +} + +void AndroidAutofillClient::ShowEditAddressProfileDialog( + const autofill::AutofillProfile& profile, + AddressProfileSavePromptCallback on_user_decision_callback) { + NOTREACHED(); +} + +void AndroidAutofillClient::ShowDeleteAddressProfileDialog( + const autofill::AutofillProfile& profile, + AddressProfileDeleteDialogCallback delete_dialog_callback) { + NOTREACHED(); +} + +void AndroidAutofillClient::ConfirmCreditCardFillAssist( + const autofill::CreditCard& card, + base::OnceClosure callback) { + NOTIMPLEMENTED(); +} + +void AndroidAutofillClient::ConfirmSaveAddressProfile( + const autofill::AutofillProfile& profile, + const autofill::AutofillProfile* original_profile, + SaveAddressProfilePromptOptions options, + AddressProfileSavePromptCallback callback) { + NOTIMPLEMENTED(); +} + +bool AndroidAutofillClient::HasCreditCardScanFeature() const { + return false; +} + +void AndroidAutofillClient::ScanCreditCard(CreditCardScanCallback callback) { + NOTIMPLEMENTED(); +} + +bool AndroidAutofillClient::ShowTouchToFillCreditCard( + base::WeakPtr<autofill::TouchToFillDelegate> delegate, + base::span<const autofill::CreditCard> cards_to_suggest) { + return false; +} + +void AndroidAutofillClient::HideTouchToFillCreditCard() {} + +void AndroidAutofillClient::ShowAutofillPopup( + const autofill::AutofillClient::PopupOpenArgs& open_args, + base::WeakPtr<autofill::AutofillPopupDelegate> delegate) { + suggestions_ = open_args.suggestions; + delegate_ = delegate; + + // Convert element_bounds to be in screen space. + gfx::Rect client_area = GetWebContents().GetContainerBounds(); + gfx::RectF element_bounds_in_screen_space = + open_args.element_bounds + client_area.OffsetFromOrigin(); + + ShowAutofillPopupImpl(element_bounds_in_screen_space, + open_args.text_direction == base::i18n::RIGHT_TO_LEFT, + open_args.suggestions); +} + +void AndroidAutofillClient::UpdateAutofillPopupDataListValues( + base::span<const autofill::SelectOption> datalist) { + // Leaving as an empty method since updating autofill popup window + // dynamically does not seem to be a useful feature when delegating to Android + // APIs. +} + +std::vector<autofill::Suggestion> AndroidAutofillClient::GetPopupSuggestions() + const { + NOTIMPLEMENTED(); + return {}; +} + +void AndroidAutofillClient::PinPopupView() { + NOTIMPLEMENTED(); +} + +autofill::AutofillClient::PopupOpenArgs +AndroidAutofillClient::GetReopenPopupArgs( + autofill::AutofillSuggestionTriggerSource trigger_source) const { + NOTIMPLEMENTED(); + return {}; +} + +void AndroidAutofillClient::UpdatePopup( + const std::vector<autofill::Suggestion>& suggestions, + autofill::FillingProduct main_filling_product, + autofill::AutofillSuggestionTriggerSource trigger_source) { + NOTIMPLEMENTED(); +} + +void AndroidAutofillClient::HideAutofillPopup( + autofill::PopupHidingReason reason) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); + if (!obj) { + return; + } + delegate_.reset(); + Java_AndroidAutofillClient_hideAutofillPopup(env, obj); +} + +bool AndroidAutofillClient::IsAutocompleteEnabled() const { + return false; +} + +bool AndroidAutofillClient::IsPasswordManagerEnabled() { + // Android 3P mode and WebView rely on the AndroidAutofillManager which + // doesn't call this function. If it ever does, the function needs to + // be implemented in a meaningful way. + NOTREACHED_NORETURN(); +} + +void AndroidAutofillClient::DidFillOrPreviewForm( + autofill::mojom::ActionPersistence action_persistence, + autofill::AutofillTriggerSource trigger_source, + bool is_refill) {} + +void AndroidAutofillClient::DidFillOrPreviewField( + const std::u16string& autofilled_value, + const std::u16string& profile_full_name) {} + +bool AndroidAutofillClient::IsContextSecure() const { + content::SSLStatus ssl_status; + content::NavigationEntry* navigation_entry = + GetWebContents().GetController().GetLastCommittedEntry(); + if (!navigation_entry) { + return false; + } + + ssl_status = navigation_entry->GetSSL(); + // Note: As of crbug.com/701018, Chrome relies on SecurityStateTabHelper to + // determine whether the page is secure, but WebView has no equivalent class. + // TODO(b/321679324): Consider injecting SecurityStateTabHelper for 3P chrome. + + return navigation_entry->GetURL().SchemeIsCryptographic() && + ssl_status.certificate && + !net::IsCertStatusError(ssl_status.cert_status) && + !(ssl_status.content_status & + content::SSLStatus::RAN_INSECURE_CONTENT); +} + +autofill::FormInteractionsFlowId +AndroidAutofillClient::GetCurrentFormInteractionsFlowId() { + // Currently not in use here. See `ChromeAutofillClient` for a proper + // implementation. + return {}; +} + +void AndroidAutofillClient::Dismissed(JNIEnv* env, + const JavaParamRef<jobject>& obj) { + anchor_view_.Reset(); +} + +void AndroidAutofillClient::SuggestionSelected( + JNIEnv* env, + const JavaParamRef<jobject>& object, + jint position) { + if (delegate_) { + delegate_->DidAcceptSuggestion(suggestions_[position], {.row = position}); + } +} + +AndroidAutofillClient::AndroidAutofillClient( + WebContents* contents, + base::FunctionRef<void(const JavaRef<jobject>&)> notify_client_created) + : autofill::ContentAutofillClient(contents) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jobject> delegate( + Java_AndroidAutofillClient_create(env, reinterpret_cast<intptr_t>(this))); + + notify_client_created(delegate); + java_ref_ = JavaObjectWeakGlobalRef(env, delegate); +} + +// TODO(b/321950502): Remove if unused! +void AndroidAutofillClient::ShowAutofillPopupImpl( + const gfx::RectF& element_bounds, + bool is_rtl, + const std::vector<autofill::Suggestion>& suggestions) { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); + if (!obj) { + return; + } + + // We need an array of AutofillSuggestion. + size_t count = suggestions.size(); + + ScopedJavaLocalRef<jobjectArray> data_array = + Java_AndroidAutofillClient_createAutofillSuggestionArray(env, count); + + for (size_t i = 0; i < count; ++i) { + ScopedJavaLocalRef<jstring> name = + ConvertUTF16ToJavaString(env, suggestions[i].main_text.value); + ScopedJavaLocalRef<jstring> label = + base::android::ConvertUTF8ToJavaString(env, std::string()); + // For Android, we only show the primary/first label in the matrix. + if (!suggestions[i].labels.empty()) { + label = ConvertUTF16ToJavaString(env, suggestions[i].labels[0][0].value); + } + + Java_AndroidAutofillClient_addToAutofillSuggestionArray( + env, data_array, i, name, label, + base::to_underlying(suggestions[i].popup_item_id)); + } + ui::ViewAndroid* view_android = GetWebContents().GetNativeView(); + if (!view_android) { + return; + } + + const ScopedJavaLocalRef<jobject> current_view = anchor_view_.view(); + if (!current_view) { + anchor_view_ = view_android->AcquireAnchorView(); + } + + const ScopedJavaLocalRef<jobject> view = anchor_view_.view(); + if (!view) { + return; + } + + view_android->SetAnchorRect(view, element_bounds); + Java_AndroidAutofillClient_showAutofillPopup(env, obj, view, is_rtl, + data_array); +} + +content::WebContents& AndroidAutofillClient::GetWebContents() const { + // While a const_cast is not ideal. The Autofill API uses const in various + // spots and the content public API doesn't have const accessors. So the const + // cast is the lesser of two evils. + return const_cast<content::WebContents&>( + ContentAutofillClient::GetWebContents()); +} + +std::unique_ptr<autofill::AutofillManager> AndroidAutofillClient::CreateManager( + base::PassKey<autofill::ContentAutofillDriver> pass_key, + autofill::ContentAutofillDriver& driver) { + return base::WrapUnique(new autofill::AndroidAutofillManager(&driver, this)); +} + +void AndroidAutofillClient::InitAgent( + base::PassKey<autofill::ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<autofill::mojom::AutofillAgent>& agent) { + agent->SetUserGestureRequired(false); + agent->SetSecureContextRequired(true); + agent->SetFocusRequiresScroll(false); + agent->SetQueryPasswordSuggestion(true); +} + +} // namespace android_autofill
diff --git a/android_webview/browser/aw_autofill_client.h b/components/android_autofill/browser/android_autofill_client.h similarity index 63% rename from android_webview/browser/aw_autofill_client.h rename to components/android_autofill/browser/android_autofill_client.h index 0af1c28..89e8492 100644 --- a/android_webview/browser/aw_autofill_client.h +++ b/components/android_autofill/browser/android_autofill_client.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ANDROID_WEBVIEW_BROWSER_AW_AUTOFILL_CLIENT_H_ -#define ANDROID_WEBVIEW_BROWSER_AW_AUTOFILL_CLIENT_H_ +#ifndef COMPONENTS_ANDROID_AUTOFILL_BROWSER_ANDROID_AUTOFILL_CLIENT_H_ +#define COMPONENTS_ANDROID_AUTOFILL_BROWSER_ANDROID_AUTOFILL_CLIENT_H_ #include <memory> #include <string> @@ -12,8 +12,10 @@ #include "base/android/jni_weak_ref.h" #include "base/compiler_specific.h" #include "base/dcheck_is_on.h" +#include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "components/autofill/content/browser/content_autofill_client.h" +#include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/core/browser/autofill_trigger_details.h" #include "components/autofill/core/browser/payments/legal_message_line.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" @@ -43,27 +45,40 @@ class PersonalDataManager; class PrefService; -namespace android_webview { +namespace android_autofill { -// Manager delegate for the autofill functionality. +// One Android implementation of the AutofillClient. If used, the Android +// Autofill framework is responsible for autofill and password management. // -// Android O and beyond uses `AndroidAutofillManager`, unlike Chrome, which -// uses `BrowserAutofillManager`. +// This client is +// a) always used on WebView, and +// b) used on Clank if users switch to a 3P provider and thus disable the +// built-in `BrowserAutofillManager`. // -// Android WebView supports enabling Autofill feature for each webview -// instance (different than the browser which supports enabling/disabling for a -// profile). Since there is only one pref service for a given browser context, -// we cannot enable this feature via UserPrefs. Rather, we always keep the -// feature enabled at the pref service, and control it via the delegates. -// Lifetime: WebView -class AwAutofillClient : public autofill::ContentAutofillClient { +// By using this client, the embedder responds to requests from the Android +// Autofill API asking for a "virtual view structure". This class defers to +// parsing logic in renderer and components/autofill to identify forms. The +// forms are translated into that virtual view structure by the Java-side of +// this component (see AndroidAutofillClient.java using AutofillProvider.java). +// Any higher layer only needs to forward the API requests to this client. The +// same applies to filling: the data filling happens in renderer code and only +// requires the embedder to forward the data to be filled. +// The UI (except for datalist dropdowns) are handled entirely by the Platform. +// Neither WebView nor Chrome can control whether e.g. a dropdown or +// keyboard-inlined suggestion are served to the user. +// +// Lifetime is the same as the WebContents object it's attachted to. +class AndroidAutofillClient : public autofill::ContentAutofillClient { public: - static void CreateForWebContents(content::WebContents* contents); + static void CreateForWebContents( + content::WebContents* contents, + base::FunctionRef<void(const base::android::JavaRef<jobject>&)> + notify_client_created); - AwAutofillClient(const AwAutofillClient&) = delete; - AwAutofillClient& operator=(const AwAutofillClient&) = delete; + AndroidAutofillClient(const AndroidAutofillClient&) = delete; + AndroidAutofillClient& operator=(const AndroidAutofillClient&) = delete; - ~AwAutofillClient() override; + ~AndroidAutofillClient() override; // AutofillClient: bool IsOffTheRecord() override; @@ -139,10 +154,28 @@ const base::android::JavaParamRef<jobject>& obj, jint position); - private: - friend class content::WebContentsUserData<AwAutofillClient>; + // ContentAutofillClient: + std::unique_ptr<autofill::AutofillManager> CreateManager( + base::PassKey<autofill::ContentAutofillDriver> pass_key, + autofill::ContentAutofillDriver& driver) override; + void InitAgent(base::PassKey<autofill::ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<autofill::mojom::AutofillAgent>& + agent) override; - explicit AwAutofillClient(content::WebContents* web_contents); + private: + friend class content::WebContentsUserData<AndroidAutofillClient>; + + // Ownership: The native object is created by either AwContents or + // ChromeAutofillClient and owned by the WebContents it's attached to. + // The native object creates the Java peer which delegates autofill + // functionality at the Java side to the Android Autofill API. The Java peer + // is owned by Java AwContents or the ContentView. The native object only + // maintains a weak ref to it. + // TODO(b/322164882): Use the WebContentsUserData template or return the Ref. + explicit AndroidAutofillClient( + content::WebContents* web_contents, + base::FunctionRef<void(const base::android::JavaRef<jobject>&)> + notify_client_created); void ShowAutofillPopupImpl( const gfx::RectF& element_bounds, @@ -160,12 +193,8 @@ base::WeakPtr<autofill::AutofillPopupDelegate> delegate_; std::unique_ptr<autofill::AutofillCrowdsourcingManager> crowdsourcing_manager_; - -#if DCHECK_IS_ON() - bool use_android_autofill_manager_; -#endif }; -} // namespace android_webview +} // namespace android_autofill -#endif // ANDROID_WEBVIEW_BROWSER_AW_AUTOFILL_CLIENT_H_ +#endif // COMPONENTS_ANDROID_AUTOFILL_BROWSER_ANDROID_AUTOFILL_CLIENT_H_
diff --git a/components/android_autofill/browser/android_autofill_manager.cc b/components/android_autofill/browser/android_autofill_manager.cc index 0ea1923..2e7ddce 100644 --- a/components/android_autofill/browser/android_autofill_manager.cc +++ b/components/android_autofill/browser/android_autofill_manager.cc
@@ -23,16 +23,6 @@ using base::TimeTicks; -void AndroidDriverInitHook(AutofillClient* client, - ContentAutofillDriver* driver) { - driver->set_autofill_manager( - base::WrapUnique(new AndroidAutofillManager(driver, client))); - driver->GetAutofillAgent()->SetUserGestureRequired(false); - driver->GetAutofillAgent()->SetSecureContextRequired(true); - driver->GetAutofillAgent()->SetFocusRequiresScroll(false); - driver->GetAutofillAgent()->SetQueryPasswordSuggestion(true); -} - AndroidAutofillManager::AndroidAutofillManager(AutofillDriver* driver, AutofillClient* client) : AutofillManager(driver, client) {
diff --git a/components/android_autofill/browser/android_autofill_manager.h b/components/android_autofill/browser/android_autofill_manager.h index 0aed24b9..14b88d77 100644 --- a/components/android_autofill/browser/android_autofill_manager.h +++ b/components/android_autofill/browser/android_autofill_manager.h
@@ -20,24 +20,14 @@ namespace autofill { class AutofillProvider; -class ContentAutofillDriver; class FormEventLoggerWeblayerAndroid; -// Creates an AndroidAutofillManager and attaches it to the `driver`. -// -// This hook is to be passed to CreateForWebContentsAndDelegate(). -// It is the glue between ContentAutofillDriver[Factory] and -// AndroidAutofillManager. -// -// Other embedders (which don't want to use AndroidAutofillManager) shall use -// other implementations. -void AndroidDriverInitHook(AutofillClient* client, - ContentAutofillDriver* driver); - // This class forwards AutofillManager calls to AutofillProvider. class AndroidAutofillManager : public AutofillManager, public AutofillManager::Observer { public: + AndroidAutofillManager(AutofillDriver* driver, AutofillClient* client); + AndroidAutofillManager(const AndroidAutofillManager&) = delete; AndroidAutofillManager& operator=(const AndroidAutofillManager&) = delete; @@ -85,11 +75,6 @@ const url::Origin& triggered_origin); protected: - friend void AndroidDriverInitHook(AutofillClient* client, - ContentAutofillDriver* driver); - - AndroidAutofillManager(AutofillDriver* driver, AutofillClient* client); - void OnFormSubmittedImpl(const FormData& form, bool known_success, mojom::SubmissionSource source) override;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AndroidAutofillClient.java similarity index 70% rename from android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java rename to components/android_autofill/browser/java/src/org/chromium/components/autofill/AndroidAutofillClient.java index 9f57938..27e77fcf 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwAutofillClient.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AndroidAutofillClient.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.android_webview; +package org.chromium.components.autofill; import android.content.Context; import android.view.View; @@ -11,31 +11,26 @@ import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; -import org.chromium.android_webview.common.Lifetime; import org.chromium.base.ContextUtils; -import org.chromium.components.autofill.AutofillDelegate; -import org.chromium.components.autofill.AutofillPopup; -import org.chromium.components.autofill.AutofillSuggestion; -import org.chromium.components.autofill.PopupItemId; /** - * Java counterpart to the AwAutofillClient. This class is owned by AwContents and has - * a weak reference from native side. + * Java counterpart to AndroidAutofillClient. This class is created by AwContents or ContentView and + * has a weak reference from native side. Its lifetime matches the duration of the WebView or the + * WebContents using it. */ -@Lifetime.WebView -@JNINamespace("android_webview") -public class AwAutofillClient { - private final long mNativeAwAutofillClient; +@JNINamespace("android_autofill") +public class AndroidAutofillClient { + private final long mNativeAndroidAutofillClient; private AutofillPopup mAutofillPopup; private Context mContext; @CalledByNative - public static AwAutofillClient create(long nativeClient) { - return new AwAutofillClient(nativeClient); + public static AndroidAutofillClient create(long nativeClient) { + return new AndroidAutofillClient(nativeClient); } - private AwAutofillClient(long nativeAwAutofillClient) { - mNativeAwAutofillClient = nativeAwAutofillClient; + private AndroidAutofillClient(long nativeAndroidAutofillClient) { + mNativeAndroidAutofillClient = nativeAndroidAutofillClient; } public void init(Context context) { @@ -48,7 +43,8 @@ if (mAutofillPopup == null) { if (ContextUtils.activityFromContext(mContext) == null) { - AwAutofillClientJni.get().dismissed(mNativeAwAutofillClient, AwAutofillClient.this); + AndroidAutofillClientJni.get() + .dismissed(mNativeAndroidAutofillClient, AndroidAutofillClient.this); return; } try { @@ -59,18 +55,18 @@ new AutofillDelegate() { @Override public void dismissed() { - AwAutofillClientJni.get() + AndroidAutofillClientJni.get() .dismissed( - mNativeAwAutofillClient, - AwAutofillClient.this); + mNativeAndroidAutofillClient, + AndroidAutofillClient.this); } @Override public void suggestionSelected(int listIndex) { - AwAutofillClientJni.get() + AndroidAutofillClientJni.get() .suggestionSelected( - mNativeAwAutofillClient, - AwAutofillClient.this, + mNativeAndroidAutofillClient, + AndroidAutofillClient.this, listIndex); } @@ -84,7 +80,8 @@ } catch (RuntimeException e) { // Deliberately swallowing exception because bad fraemwork implementation can // throw exceptions in ListPopupWindow constructor. - AwAutofillClientJni.get().dismissed(mNativeAwAutofillClient, AwAutofillClient.this); + AndroidAutofillClientJni.get() + .dismissed(mNativeAndroidAutofillClient, AndroidAutofillClient.this); return; } } @@ -129,8 +126,9 @@ @NativeMethods interface Natives { - void dismissed(long nativeAwAutofillClient, AwAutofillClient caller); + void dismissed(long nativeAndroidAutofillClient, AndroidAutofillClient caller); - void suggestionSelected(long nativeAwAutofillClient, AwAutofillClient caller, int position); + void suggestionSelected( + long nativeAndroidAutofillClient, AndroidAutofillClient caller, int position); } }
diff --git a/components/autofill/OWNERS b/components/autofill/OWNERS index c927a49..1f2a0be7 100644 --- a/components/autofill/OWNERS +++ b/components/autofill/OWNERS
@@ -6,3 +6,4 @@ pkotwicz@chromium.org smcgruer@chromium.org rouslan@chromium.org +jihadghanna@google.com
diff --git a/components/autofill/content/browser/content_autofill_client.cc b/components/autofill/content/browser/content_autofill_client.cc index 614217e..94b2676 100644 --- a/components/autofill/content/browser/content_autofill_client.cc +++ b/components/autofill/content/browser/content_autofill_client.cc
@@ -6,13 +6,9 @@ namespace autofill { -ContentAutofillClient::ContentAutofillClient( - content::WebContents* web_contents, - ContentAutofillDriverFactory::DriverInitCallback driver_init_hook) +ContentAutofillClient::ContentAutofillClient(content::WebContents* web_contents) : content::WebContentsUserData<ContentAutofillClient>(*web_contents), - autofill_driver_factory_(web_contents, - this, - std::move(driver_init_hook)) {} + autofill_driver_factory_(web_contents, this) {} ContentAutofillClient::~ContentAutofillClient() = default;
diff --git a/components/autofill/content/browser/content_autofill_client.h b/components/autofill/content/browser/content_autofill_client.h index 734f585..19e4272 100644 --- a/components/autofill/content/browser/content_autofill_client.h +++ b/components/autofill/content/browser/content_autofill_client.h
@@ -5,10 +5,13 @@ #ifndef COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_CLIENT_H_ #define COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_CLIENT_H_ +#include "base/types/pass_key.h" #include "components/autofill/content/browser/content_autofill_driver_factory.h" +#include "components/autofill/content/common/mojom/autofill_agent.mojom.h" #include "components/autofill/core/browser/autofill_client.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_user_data.h" +#include "mojo/public/cpp/bindings/associated_remote.h" namespace autofill { @@ -17,9 +20,7 @@ : public AutofillClient, public content::WebContentsUserData<ContentAutofillClient> { public: - ContentAutofillClient( - content::WebContents* web_contents, - ContentAutofillDriverFactory::DriverInitCallback driver_init_hook); + explicit ContentAutofillClient(content::WebContents* web_contents); ContentAutofillClient(const ContentAutofillClient&) = delete; ContentAutofillClient& operator=(const ContentAutofillClient&) = delete; ~ContentAutofillClient() override; @@ -28,6 +29,18 @@ // particular, transitively by members of subclasses). ContentAutofillDriverFactory* GetAutofillDriverFactory(); + // Called by ContentAutofillDriver's constructor to inject embedder-specific + // behaviour. Implementations should not call into `driver`. + virtual std::unique_ptr<AutofillManager> CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) = 0; + + // Called by ContentAutofillDriverFactory to tweak the AutofillAgent in to the + // embedder's needs. + virtual void InitAgent( + base::PassKey<ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<mojom::AutofillAgent>& agent) = 0; + private: friend class content::WebContentsUserData<ContentAutofillClient>;
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc index 1902e93..57c88121 100644 --- a/components/autofill/content/browser/content_autofill_driver.cc +++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -83,7 +83,9 @@ ContentAutofillDriver::ContentAutofillDriver( content::RenderFrameHost* render_frame_host, ContentAutofillDriverFactory* owner) - : render_frame_host_(*render_frame_host), owner_(*owner) {} + : render_frame_host_(*render_frame_host), owner_(*owner) { + autofill_manager_ = owner_->client()->CreateManager(/*pass_key=*/{}, *this); +} ContentAutofillDriver::~ContentAutofillDriver() { owner_->router().UnregisterDriver(this, @@ -419,9 +421,9 @@ } router().SetFormToBeProbablySubmitted( this, GetFormWithFrameAndFormMetaData(form), - [](autofill::AutofillDriver* target, const FormData* optional_form) { - cast(target)->potentially_submitted_form_ = - base::OptionalFromPtr(optional_form); + [](autofill::AutofillDriver* target, + base::optional_ref<const FormData> form) { + cast(target)->potentially_submitted_form_ = form.CopyAsOptional(); }); } @@ -433,7 +435,7 @@ } std::vector<FormData> updated_forms = raw_updated_forms; for (FormData& form : updated_forms) - SetFrameAndFormMetaData(form, nullptr); + SetFrameAndFormMetaData(form, std::nullopt); std::vector<FormGlobalId> removed_forms; removed_forms.reserve(raw_removed_forms.size()); @@ -485,7 +487,7 @@ } FormData form = raw_form; FormFieldData field = raw_field; - SetFrameAndFormMetaData(form, &field); + SetFrameAndFormMetaData(form, field); router().TextFieldDidChange( this, std::move(form), field, TransformBoundingBoxToViewportCoordinates(bounding_box), timestamp, @@ -505,7 +507,7 @@ } FormData form = raw_form; FormFieldData field = raw_field; - SetFrameAndFormMetaData(form, &field); + SetFrameAndFormMetaData(form, field); router().TextFieldDidScroll( this, std::move(form), field, TransformBoundingBoxToViewportCoordinates(bounding_box), @@ -525,7 +527,7 @@ } FormData form = raw_form; FormFieldData field = raw_field; - SetFrameAndFormMetaData(form, &field); + SetFrameAndFormMetaData(form, field); router().SelectControlDidChange( this, std::move(form), field, TransformBoundingBoxToViewportCoordinates(bounding_box), @@ -546,7 +548,7 @@ } FormData form = raw_form; FormFieldData field = raw_field; - SetFrameAndFormMetaData(form, &field); + SetFrameAndFormMetaData(form, field); router().AskForValuesToFill( this, std::move(form), field, TransformBoundingBoxToViewportCoordinates(bounding_box), trigger_source, @@ -588,7 +590,7 @@ } FormData form = raw_form; FormFieldData field = raw_field; - SetFrameAndFormMetaData(form, &field); + SetFrameAndFormMetaData(form, field); router().FocusOnFormField( this, std::move(form), field, TransformBoundingBoxToViewportCoordinates(bounding_box), @@ -648,7 +650,7 @@ } FormData form = raw_form; FormFieldData field = raw_field; - SetFrameAndFormMetaData(form, &field); + SetFrameAndFormMetaData(form, field); router().JavaScriptChangedAutofilledValue( this, std::move(form), field, old_value, [](autofill::AutofillDriver* target, const FormData& form, @@ -691,7 +693,7 @@ void ContentAutofillDriver::SetFrameAndFormMetaData( FormData& form, - FormFieldData* optional_field) const { + base::optional_ref<FormFieldData> field) const { form.host_frame = GetFrameToken(); // GetLastCommittedURL doesn't include URL updates due to document.open() and @@ -710,23 +712,25 @@ // The form signature must not be calculated before setting FormData::url. FormSignature form_signature = CalculateFormSignature(form); - auto SetFieldMetaData = [&](FormFieldData& field) { - field.host_frame = form.host_frame; - field.host_form_id = form.unique_renderer_id; - field.origin = render_frame_host_->GetLastCommittedOrigin(); - field.host_form_signature = form_signature; - field.bounds = TransformBoundingBoxToViewportCoordinates(field.bounds); + auto SetFieldMetaData = [&](FormFieldData& f) { + f.host_frame = form.host_frame; + f.host_form_id = form.unique_renderer_id; + f.origin = render_frame_host_->GetLastCommittedOrigin(); + f.host_form_signature = form_signature; + f.bounds = TransformBoundingBoxToViewportCoordinates(f.bounds); }; - for (FormFieldData& field : form.fields) - SetFieldMetaData(field); - if (optional_field) - SetFieldMetaData(*optional_field); + for (FormFieldData& f : form.fields) { + SetFieldMetaData(f); + } + if (field.has_value()) { + SetFieldMetaData(*field); + } } FormData ContentAutofillDriver::GetFormWithFrameAndFormMetaData( FormData form) const { - SetFrameAndFormMetaData(form, nullptr); + SetFrameAndFormMetaData(form, std::nullopt); return form; }
diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h index 5d7ebf6c..d39ae04 100644 --- a/components/autofill/content/browser/content_autofill_driver.h +++ b/components/autofill/content/browser/content_autofill_driver.h
@@ -13,6 +13,7 @@ #include "base/memory/raw_ref.h" #include "base/types/optional_ref.h" #include "build/build_config.h" +#include "components/autofill/content/browser/content_autofill_client.h" #include "components/autofill/content/common/mojom/autofill_agent.mojom.h" #include "components/autofill/content/common/mojom/autofill_driver.mojom.h" #include "components/autofill/core/browser/autofill_driver.h" @@ -119,19 +120,14 @@ static ContentAutofillDriver* GetForRenderFrameHost( content::RenderFrameHost* render_frame_host); - // Partially constructs the ContentAutofillDriver: afterwards, the caller - // *must* set a non-null AutofillManager with set_autofill_manager(). - // Outside of unittests, this is done by ContentAutofillDriverFactory. + // Part of the initialization may be embedder-specific, implemented in + // ContentAutofillClient::CreateManager(). ContentAutofillDriver(content::RenderFrameHost* render_frame_host, ContentAutofillDriverFactory* owner); ContentAutofillDriver(const ContentAutofillDriver&) = delete; ContentAutofillDriver& operator=(const ContentAutofillDriver&) = delete; ~ContentAutofillDriver() override; - void set_autofill_manager(std::unique_ptr<AutofillManager> autofill_manager) { - autofill_manager_ = std::move(autofill_manager); - } - content::RenderFrameHost* render_frame_host() { return &*render_frame_host_; } const content::RenderFrameHost* render_frame_host() const { return &*render_frame_host_; @@ -303,14 +299,13 @@ const FormFieldData& field, const gfx::RectF& bounding_box) override; - // Sets parameters of |form| and |optional_field| that can be extracted from - // |render_frame_host_|. |optional_field| is treated as if it is a field of - // |form|. + // Sets parameters of |form| and |field| that can be extracted from + // |render_frame_host_|. |field| is treated as if it is a field of |form|. // // These functions must be called for every FormData and FormFieldData // received from the renderer. void SetFrameAndFormMetaData(FormData& form, - FormFieldData* optional_field) const; + base::optional_ref<FormFieldData> field) const; // Returns a copy of `form` after applying `SetFormAndFormMetaData` to it. [[nodiscard]] FormData GetFormWithFrameAndFormMetaData(FormData form) const; [[nodiscard]] std::optional<FormData> GetFormWithFrameAndFormMetaData( @@ -347,11 +342,11 @@ // to avoid duplicates fired by AutofillAgent. std::set<FormGlobalId> submitted_forms_; - std::unique_ptr<AutofillManager> autofill_manager_ = nullptr; - mojo::AssociatedReceiver<mojom::AutofillDriver> receiver_{this}; mojo::AssociatedRemote<mojom::AutofillAgent> autofill_agent_; + + std::unique_ptr<AutofillManager> autofill_manager_ = nullptr; }; } // namespace autofill
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.cc b/components/autofill/content/browser/content_autofill_driver_factory.cc index bb14be8..2d05701 100644 --- a/components/autofill/content/browser/content_autofill_driver_factory.cc +++ b/components/autofill/content/browser/content_autofill_driver_factory.cc
@@ -25,33 +25,6 @@ class ScopedAutofillManagersObservation; -namespace { - -bool ShouldEnableHeavyFormDataScraping(const version_info::Channel channel) { - switch (channel) { - case version_info::Channel::CANARY: - case version_info::Channel::DEV: - return true; - case version_info::Channel::STABLE: - case version_info::Channel::BETA: - case version_info::Channel::UNKNOWN: - return false; - } - NOTREACHED(); - return false; -} - -} // namespace - -void BrowserDriverInitHook(AutofillClient* client, - const std::string& app_locale, - ContentAutofillDriver* driver) { - driver->set_autofill_manager( - std::make_unique<BrowserAutofillManager>(driver, client, app_locale)); - if (client && ShouldEnableHeavyFormDataScraping(client->GetChannel())) - driver->GetAutofillAgent()->EnableHeavyFormDataScraping(); -} - // static ContentAutofillDriverFactory* ContentAutofillDriverFactory::FromWebContents( content::WebContents* contents) { @@ -86,11 +59,8 @@ ContentAutofillDriverFactory::ContentAutofillDriverFactory( content::WebContents* web_contents, - AutofillClient* client, - DriverInitCallback driver_init_hook) - : content::WebContentsObserver(web_contents), - client_(client), - driver_init_hook_(std::move(driver_init_hook)) {} + ContentAutofillClient* client) + : content::WebContentsObserver(web_contents), client_(client) {} ContentAutofillDriverFactory::~ContentAutofillDriverFactory() { for (Observer& observer : observers_) { @@ -98,13 +68,6 @@ } } -std::unique_ptr<ContentAutofillDriver> -ContentAutofillDriverFactory::CreateDriver(content::RenderFrameHost* rfh) { - auto driver = std::make_unique<ContentAutofillDriver>(rfh, this); - driver_init_hook_.Run(driver.get()); - return driver; -} - ContentAutofillDriver* ContentAutofillDriverFactory::DriverForFrame( content::RenderFrameHost* render_frame_host) { // Within fenced frames and their descendants, Password Manager should for now @@ -131,12 +94,13 @@ // calls `DriverForFrame(render_frame_host)`. // 5. `render_frame_host->~RenderFrameHostImpl()` finishes. if (render_frame_host->IsRenderFrameLive()) { - driver = CreateDriver(render_frame_host); + driver = std::make_unique<ContentAutofillDriver>(render_frame_host, this); for (Observer& observer : observers_) { observer.OnContentAutofillDriverCreated(*this, *driver); } DCHECK_EQ(driver_map_.find(render_frame_host)->second.get(), driver.get()); + client()->InitAgent(/*pass_key=*/{}, driver->GetAutofillAgent()); } else { driver_map_.erase(iter); DCHECK_EQ(driver_map_.count(render_frame_host), 0u);
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.h b/components/autofill/content/browser/content_autofill_driver_factory.h index 956c7046..bf09c6c 100644 --- a/components/autofill/content/browser/content_autofill_driver_factory.h +++ b/components/autofill/content/browser/content_autofill_driver_factory.h
@@ -23,29 +23,15 @@ namespace autofill { +class ContentAutofillClient; class ContentAutofillDriver; class ScopedAutofillManagersObservation; -// Creates an BrowserAutofillManager and attaches it to the `driver`. -// -// This hook is to be passed to CreateForWebContentsAndDelegate(). -// It is the glue between ContentAutofillDriver[Factory] and -// BrowserAutofillManager. -// -// Other embedders (which don't want to use BrowserAutofillManager) shall use -// other implementations. -void BrowserDriverInitHook(AutofillClient* client, - const std::string& app_locale, - ContentAutofillDriver* driver); - // Manages lifetime of ContentAutofillDriver. Owned by ContentAutofillClient, // therefore one Factory per WebContents. Creates one Driver per // RenderFrameHost. class ContentAutofillDriverFactory : public content::WebContentsObserver { public: - using DriverInitCallback = - base::RepeatingCallback<void(ContentAutofillDriver*)>; - // Observer of ContentAutofillDriverFactory events. // // Using this observer is preferable over registering a WebContentsObserver @@ -81,8 +67,7 @@ mojo::PendingAssociatedReceiver<mojom::AutofillDriver> pending_receiver); ContentAutofillDriverFactory(content::WebContents* web_contents, - AutofillClient* client, - DriverInitCallback driver_init_hook); + ContentAutofillClient* client); ContentAutofillDriverFactory(ContentAutofillDriverFactory&) = delete; ContentAutofillDriverFactory& operator=(ContentAutofillDriverFactory&) = delete; @@ -101,7 +86,7 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; - AutofillClient* client() { return client_; } + ContentAutofillClient* client() { return client_; } AutofillDriverRouter& router() { return router_; } @@ -120,11 +105,7 @@ private: friend class ContentAutofillDriverFactoryTestApi; - std::unique_ptr<ContentAutofillDriver> CreateDriver( - content::RenderFrameHost* rfh); - - raw_ptr<AutofillClient> client_; - DriverInitCallback driver_init_hook_; + raw_ptr<ContentAutofillClient> client_; // Routes events between different ContentAutofillDrivers. // Must be destroyed after |driver_map_|'s elements.
diff --git a/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc b/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc index 3a8d4d59..1556552 100644 --- a/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc +++ b/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc
@@ -6,6 +6,7 @@ #include "base/functional/bind.h" #include "components/autofill/content/browser/content_autofill_driver.h" +#include "components/autofill/content/browser/content_autofill_driver_test_api.h" #include "components/autofill/core/browser/test_browser_autofill_manager.h" namespace autofill { @@ -13,25 +14,8 @@ // static std::unique_ptr<ContentAutofillDriverFactory> ContentAutofillDriverFactoryTestApi::Create(content::WebContents* web_contents, - TestAutofillClient* client) { - return Create( - web_contents, client, - base::BindRepeating( - [](TestAutofillClient* client, ContentAutofillDriver* driver) { - driver->set_autofill_manager( - std::make_unique<TestBrowserAutofillManager>(driver, client)); - }, - client)); -} - -// static -std::unique_ptr<ContentAutofillDriverFactory> -ContentAutofillDriverFactoryTestApi::Create( - content::WebContents* web_contents, - AutofillClient* client, - ContentAutofillDriverFactory::DriverInitCallback driver_init_hook) { - return base::WrapUnique( - new ContentAutofillDriverFactory(web_contents, client, driver_init_hook)); + ContentAutofillClient* client) { + return std::make_unique<ContentAutofillDriverFactory>(web_contents, client); } ContentAutofillDriverFactoryTestApi::ContentAutofillDriverFactoryTestApi( @@ -40,8 +24,10 @@ void ContentAutofillDriverFactoryTestApi::SetDriver( content::RenderFrameHost* rfh, - std::unique_ptr<ContentAutofillDriver> driver) { - factory_->driver_map_[rfh] = std::move(driver); + std::unique_ptr<ContentAutofillDriver> new_driver) { + std::unique_ptr<ContentAutofillDriver>& old_driver = + factory_->driver_map_[rfh]; + old_driver = std::move(new_driver); } ContentAutofillDriver* ContentAutofillDriverFactoryTestApi::GetDriver(
diff --git a/components/autofill/content/browser/content_autofill_driver_factory_test_api.h b/components/autofill/content/browser/content_autofill_driver_factory_test_api.h index d86986f..55404d04 100644 --- a/components/autofill/content/browser/content_autofill_driver_factory_test_api.h +++ b/components/autofill/content/browser/content_autofill_driver_factory_test_api.h
@@ -17,16 +17,9 @@ class ContentAutofillDriverFactoryTestApi { public: - // Creates a factory of ContentAutofillDrivers whose managers are - // TestBrowserAutofillManager. static std::unique_ptr<ContentAutofillDriverFactory> Create( content::WebContents* web_contents, - TestAutofillClient* client); - - static std::unique_ptr<ContentAutofillDriverFactory> Create( - content::WebContents* web_contents, - AutofillClient* client, - ContentAutofillDriverFactory::DriverInitCallback driver_init_hook); + ContentAutofillClient* client); explicit ContentAutofillDriverFactoryTestApi( ContentAutofillDriverFactory* factory); @@ -34,7 +27,7 @@ size_t num_drivers() const { return factory_->driver_map_.size(); } void SetDriver(content::RenderFrameHost* rfh, - std::unique_ptr<ContentAutofillDriver> driver); + std::unique_ptr<ContentAutofillDriver> new_driver); ContentAutofillDriver* GetDriver(content::RenderFrameHost* rfh); base::ObserverList<ContentAutofillDriverFactory::Observer>& observers() { @@ -47,7 +40,7 @@ void AddObserverAtIndex(ContentAutofillDriverFactory::Observer* observer, size_t index); - void set_client(AutofillClient* client) { factory_->client_ = client; } + void set_client(ContentAutofillClient* client) { factory_->client_ = client; } private: const raw_ref<ContentAutofillDriverFactory> factory_;
diff --git a/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc b/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc index 0838938..d6658d8 100644 --- a/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc +++ b/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc
@@ -14,9 +14,9 @@ #include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/content/browser/content_autofill_driver_factory.h" #include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h" -#include "components/autofill/content/common/mojom/autofill_agent.mojom.h" -#include "components/autofill/core/browser/test_autofill_client.h" -#include "components/autofill/core/browser/test_autofill_driver.h" +#include "components/autofill/content/browser/test_autofill_client_injector.h" +#include "components/autofill/content/browser/test_content_autofill_client.h" +#include "components/autofill/content/browser/test_content_autofill_driver.h" #include "components/autofill/core/common/autofill_features.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" @@ -24,8 +24,6 @@ #include "content/public/test/back_forward_cache_util.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" -#include "mojo/public/cpp/bindings/associated_receiver_set.h" -#include "mojo/public/cpp/bindings/associated_remote.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" @@ -59,114 +57,18 @@ (override)); }; -class MockAutofillAgent : public mojom::AutofillAgent { - public: - void BindPendingReceiver(mojo::ScopedInterfaceEndpointHandle handle) { - receivers_.Add(this, mojo::PendingAssociatedReceiver<mojom::AutofillAgent>( - std::move(handle))); - } - - MOCK_METHOD(void, TriggerFormExtraction, (), (override)); - MOCK_METHOD(void, - TriggerFormExtractionWithResponse, - (base::OnceCallback<void(bool)>), - (override)); - MOCK_METHOD( - void, - ExtractForm, - (FormRendererId form, - base::OnceCallback<void(const std::optional<FormData>&)> callback), - (override)); - MOCK_METHOD(void, - ApplyFormAction, - (mojom::ActionType action_type, - mojom::ActionPersistence action_persistence, - const FormData::FillData& form), - (override)); - MOCK_METHOD(void, - ApplyFieldAction, - (mojom::ActionPersistence action_persistence, - mojom::TextReplacement text_replacement, - FieldRendererId field, - const std::u16string& value), - (override)); - MOCK_METHOD(void, - FieldTypePredictionsAvailable, - (const std::vector<FormDataPredictions>& forms), - (override)); - MOCK_METHOD(void, ClearSection, (), (override)); - MOCK_METHOD(void, ClearPreviewedForm, (), (override)); - MOCK_METHOD(void, - TriggerSuggestions, - (FieldRendererId field_id, - AutofillSuggestionTriggerSource trigger_source), - (override)); - MOCK_METHOD(void, - SetSuggestionAvailability, - (FieldRendererId field, - mojom::AutofillSuggestionAvailability suggestion_availability), - (override)); - MOCK_METHOD(void, - AcceptDataListSuggestion, - (FieldRendererId field, const ::std::u16string& value), - (override)); - MOCK_METHOD(void, - PreviewPasswordSuggestion, - (const ::std::u16string& username, - const ::std::u16string& password), - (override)); - MOCK_METHOD(void, - PreviewPasswordGenerationSuggestion, - (const ::std::u16string& password), - (override)); - MOCK_METHOD(void, SetUserGestureRequired, (bool required), (override)); - MOCK_METHOD(void, SetSecureContextRequired, (bool required), (override)); - MOCK_METHOD(void, SetFocusRequiresScroll, (bool require), (override)); - MOCK_METHOD(void, SetQueryPasswordSuggestion, (bool query), (override)); - MOCK_METHOD(void, EnableHeavyFormDataScraping, (), (override)); - MOCK_METHOD(void, - GetPotentialLastFourCombinationsForStandaloneCvc, - (base::OnceCallback<void(const std::vector<std::string>&)>), - (override)); - - private: - mojo::AssociatedReceiverSet<mojom::AutofillAgent> receivers_; -}; - } // namespace // Test case with one frame. class ContentAutofillDriverFactoryTest : public content::RenderViewHostTestHarness { public: - explicit ContentAutofillDriverFactoryTest( - version_info::Channel channel = version_info::Channel::UNKNOWN) - : channel_(channel) {} - - void SetUp() override { - content::RenderViewHostTestHarness::SetUp(); - - client_ = std::make_unique<TestAutofillClient>(); - client_->set_channel_for_testing(channel_); - - agent_ = std::make_unique<MockAutofillAgent>(); - blink::AssociatedInterfaceProvider* remote_interfaces = - web_contents()->GetPrimaryMainFrame()->GetRemoteAssociatedInterfaces(); - remote_interfaces->OverrideBinderForTesting( - mojom::AutofillAgent::Name_, - base::BindRepeating(&MockAutofillAgent::BindPendingReceiver, - base::Unretained(agent_.get()))); - - factory_ = ContentAutofillDriverFactoryTestApi::Create( - web_contents(), client_.get(), - base::BindRepeating(&BrowserDriverInitHook, client_.get(), "en-US")); + TestContentAutofillClient* client() { + return autofill_client_injector_[web_contents()]; } - void TearDown() override { - factory_.reset(); - client_.reset(); - agent_.reset(); - content::RenderViewHostTestHarness::TearDown(); + ContentAutofillDriverFactory& factory() { + return *client()->GetAutofillDriverFactory(); } void NavigateMainFrame(std::string_view url) { @@ -176,22 +78,20 @@ } protected: - version_info::Channel channel_; - std::unique_ptr<MockAutofillAgent> agent_; - std::unique_ptr<TestAutofillClient> client_; - std::unique_ptr<ContentAutofillDriverFactory> factory_; + TestAutofillClientInjector<TestContentAutofillClient> + autofill_client_injector_; }; TEST_F(ContentAutofillDriverFactoryTest, MainDriver) { NavigateMainFrame("https://a.com/"); ContentAutofillDriver* main_driver = - test_api(*factory_).GetDriver(main_rfh()); + test_api(factory()).GetDriver(main_rfh()); EXPECT_TRUE(main_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 1u); - EXPECT_EQ(factory_->DriverForFrame(main_rfh()), main_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 1u); - EXPECT_EQ(factory_->DriverForFrame(main_rfh()), main_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 1u); + EXPECT_EQ(test_api(factory()).num_drivers(), 1u); + EXPECT_EQ(factory().DriverForFrame(main_rfh()), main_driver); + EXPECT_EQ(test_api(factory()).num_drivers(), 1u); + EXPECT_EQ(factory().DriverForFrame(main_rfh()), main_driver); + EXPECT_EQ(test_api(factory()).num_drivers(), 1u); } // Test case with two frames: the main frame and one child frame. @@ -223,16 +123,16 @@ NavigateChildFrame("https://b.com/"); ASSERT_TRUE(main_rfh()); ASSERT_TRUE(child_rfh()); - ContentAutofillDriver* main_driver = factory_->DriverForFrame(main_rfh()); - ContentAutofillDriver* child_driver = factory_->DriverForFrame(child_rfh()); + ContentAutofillDriver* main_driver = factory().DriverForFrame(main_rfh()); + ContentAutofillDriver* child_driver = factory().DriverForFrame(child_rfh()); EXPECT_TRUE(main_driver); EXPECT_TRUE(child_driver); - EXPECT_EQ(factory_->DriverForFrame(main_rfh()), main_driver); - EXPECT_EQ(factory_->DriverForFrame(child_rfh()), child_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 2u); - EXPECT_EQ(factory_->DriverForFrame(main_rfh()), main_driver); - EXPECT_EQ(factory_->DriverForFrame(child_rfh()), child_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 2u); + EXPECT_EQ(factory().DriverForFrame(main_rfh()), main_driver); + EXPECT_EQ(factory().DriverForFrame(child_rfh()), child_driver); + EXPECT_EQ(test_api(factory()).num_drivers(), 2u); + EXPECT_EQ(factory().DriverForFrame(main_rfh()), main_driver); + EXPECT_EQ(factory().DriverForFrame(child_rfh()), child_driver); + EXPECT_EQ(test_api(factory()).num_drivers(), 2u); } // Test case with two frames, where the parameter selects one of them. @@ -255,17 +155,17 @@ NavigateMainFrame("https://a.com/"); NavigateChildFrame("https://b.com/"); ASSERT_TRUE(picked_rfh() == main_rfh() || picked_rfh() == child_rfh()); - ContentAutofillDriver* main_driver = factory_->DriverForFrame(main_rfh()); - ContentAutofillDriver* child_driver = factory_->DriverForFrame(child_rfh()); + ContentAutofillDriver* main_driver = factory().DriverForFrame(main_rfh()); + ContentAutofillDriver* child_driver = factory().DriverForFrame(child_rfh()); EXPECT_TRUE(main_driver); EXPECT_TRUE(child_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 2u); - factory_->RenderFrameDeleted(picked_rfh()); - EXPECT_EQ(test_api(*factory_).num_drivers(), 1u); + EXPECT_EQ(test_api(factory()).num_drivers(), 2u); + factory().RenderFrameDeleted(picked_rfh()); + EXPECT_EQ(test_api(factory()).num_drivers(), 1u); if (picked_rfh() == main_rfh()) - EXPECT_EQ(test_api(*factory_).GetDriver(child_rfh()), child_driver); + EXPECT_EQ(test_api(factory()).GetDriver(child_rfh()), child_driver); else - EXPECT_EQ(test_api(*factory_).GetDriver(main_rfh()), main_driver); + EXPECT_EQ(test_api(factory()).GetDriver(main_rfh()), main_driver); } // Test case with one frame, with BFcache enabled or disabled depending on the @@ -301,11 +201,11 @@ SameDocumentNavigation) { NavigateMainFrame("https://a.com/"); content::RenderFrameHost* orig_rfh = main_rfh(); - ContentAutofillDriver* orig_driver = factory_->DriverForFrame(orig_rfh); + ContentAutofillDriver* orig_driver = factory().DriverForFrame(orig_rfh); NavigateMainFrame("https://a.com/#same-site"); ASSERT_EQ(orig_rfh, main_rfh()); - EXPECT_EQ(test_api(*factory_).GetDriver(orig_rfh), orig_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 1u); + EXPECT_EQ(test_api(factory()).GetDriver(orig_rfh), orig_driver); + EXPECT_EQ(test_api(factory()).num_drivers(), 1u); // TODO(crbug.com/1200511): Test that |router_| has been untouched. To this // end, call `orig_driver->FormsSeen({FormData{}})` above and then check @@ -320,7 +220,7 @@ SameOriginNavigation) { NavigateMainFrame("https://a.com/"); content::RenderFrameHost* orig_rfh = main_rfh(); - ContentAutofillDriver* orig_driver = factory_->DriverForFrame(orig_rfh); + ContentAutofillDriver* orig_driver = factory().DriverForFrame(orig_rfh); // TODO(crbug.com/1200511): Use mock AutofillManagers and expect a call of // AutofillManager::Reset(), which is blocked by ContentAutofillDriver's use @@ -331,11 +231,11 @@ // if BFCache is disabled the driver for |orig_rfh| has now been removed in // ContentAutofillDriverFactory::RenderFrameDeleted(). if (use_bfcache()) { - EXPECT_EQ(test_api(*factory_).GetDriver(orig_rfh), orig_driver); + EXPECT_EQ(test_api(factory()).GetDriver(orig_rfh), orig_driver); } else if (main_rfh() != orig_rfh) { - EXPECT_EQ(test_api(*factory_).GetDriver(orig_rfh), nullptr); + EXPECT_EQ(test_api(factory()).GetDriver(orig_rfh), nullptr); } - EXPECT_EQ(test_api(*factory_).num_drivers(), use_bfcache() ? 2u : 1u); + EXPECT_EQ(test_api(factory()).num_drivers(), use_bfcache() ? 2u : 1u); } // Tests that that a driver is removed and replaced with a fresh one after a @@ -345,11 +245,11 @@ NavigateMainFrame("https://a.com/"); content::RenderFrameHost* orig_rfh = main_rfh(); content::GlobalRenderFrameHostId orig_rfh_id = orig_rfh->GetGlobalId(); - ContentAutofillDriver* orig_driver = factory_->DriverForFrame(orig_rfh); + ContentAutofillDriver* orig_driver = factory().DriverForFrame(orig_rfh); ASSERT_EQ(orig_rfh, main_rfh()); - EXPECT_EQ(test_api(*factory_).GetDriver(orig_rfh), orig_driver); - EXPECT_EQ(test_api(*factory_).num_drivers(), 1u); + EXPECT_EQ(test_api(factory()).GetDriver(orig_rfh), orig_driver); + EXPECT_EQ(test_api(factory()).num_drivers(), 1u); NavigateMainFrame("https://different-origin-after-navigation.com/"); @@ -359,11 +259,11 @@ // BFcache is enabled (or main_rfh() happens to have the same address as // |orig_rfh|). if (use_bfcache()) - EXPECT_EQ(test_api(*factory_).GetDriver(orig_rfh), orig_driver); + EXPECT_EQ(test_api(factory()).GetDriver(orig_rfh), orig_driver); else if (main_rfh() != orig_rfh) - EXPECT_EQ(test_api(*factory_).GetDriver(orig_rfh), nullptr); - EXPECT_NE(test_api(*factory_).GetDriver(main_rfh()), nullptr); - EXPECT_EQ(test_api(*factory_).num_drivers(), use_bfcache() ? 2u : 1u); + EXPECT_EQ(test_api(factory()).GetDriver(orig_rfh), nullptr); + EXPECT_NE(test_api(factory()).GetDriver(main_rfh()), nullptr); + EXPECT_EQ(test_api(factory()).num_drivers(), use_bfcache() ? 2u : 1u); } // Fixture for testing that Autofill is enabled in fenced frames. @@ -391,40 +291,9 @@ content::RenderFrameHost* fenced_frame_subframe = content::RenderFrameHostTester::For(fenced_frame_root) ->AppendChild("iframe"); - EXPECT_NE(nullptr, factory_->DriverForFrame(main_rfh())); - EXPECT_NE(nullptr, factory_->DriverForFrame(fenced_frame_root)); - EXPECT_NE(nullptr, factory_->DriverForFrame(fenced_frame_subframe)); -} - -struct AgentSetupParam { - version_info::Channel channel; - bool heavy_scraping_enabled; -}; - -class ContentAutofillDriverFactoryTest_AgentSetup - : public ContentAutofillDriverFactoryTest, - public ::testing::WithParamInterface<AgentSetupParam> { - public: - ContentAutofillDriverFactoryTest_AgentSetup() - : ContentAutofillDriverFactoryTest(GetParam().channel) {} -}; - -INSTANTIATE_TEST_SUITE_P( - ContentAutofillDriverFactoryTest, - ContentAutofillDriverFactoryTest_AgentSetup, - testing::Values(AgentSetupParam{version_info::Channel::CANARY, true}, - AgentSetupParam{version_info::Channel::DEV, true}, - AgentSetupParam{version_info::Channel::UNKNOWN, false}, - AgentSetupParam{version_info::Channel::BETA, false}, - AgentSetupParam{version_info::Channel::STABLE, false})); - -TEST_P(ContentAutofillDriverFactoryTest_AgentSetup, - EnableHeavyFormDataScraping) { - EXPECT_CALL(*agent_, EnableHeavyFormDataScraping()) - .Times(GetParam().heavy_scraping_enabled ? 1 : 0); - NavigateMainFrame("https://a.com/"); - base::RunLoop().RunUntilIdle(); - testing::Mock::VerifyAndClearExpectations(agent_.get()); + EXPECT_NE(nullptr, factory().DriverForFrame(main_rfh())); + EXPECT_NE(nullptr, factory().DriverForFrame(fenced_frame_root)); + EXPECT_NE(nullptr, factory().DriverForFrame(fenced_frame_subframe)); } // Tests the notifications of ContentAutofillDriverFactory::Observer. @@ -433,12 +302,12 @@ public: void SetUp() override { ContentAutofillDriverFactoryTest::SetUp(); - factory_->AddObserver(&observer_); + factory().AddObserver(&observer_); } void TearDown() override { - if (factory_) { - factory_->RemoveObserver(&observer_); + if (client()) { + factory().RemoveObserver(&observer_); } ContentAutofillDriverFactoryTest::TearDown(); } @@ -454,22 +323,22 @@ TEST_F(ContentAutofillDriverFactoryTest_Observer, FactoryDestroyed) { EXPECT_CALL(observer_, - OnContentAutofillDriverFactoryDestroyed(Ref(*factory_))); - factory_.reset(); + OnContentAutofillDriverFactoryDestroyed(Ref(factory()))); + DeleteContents(); } TEST_F(ContentAutofillDriverFactoryTest_Observer, DriverCreated) { EXPECT_CALL(observer_, OnContentAutofillDriverCreated( - Ref(*factory_), IsKnownDriver(factory_.get()))); + Ref(factory()), IsKnownDriver(&factory()))); NavigateMainFrame("https://a.com/"); } TEST_F(ContentAutofillDriverFactoryTest_Observer, DriverDeleted) { EXPECT_CALL(observer_, OnContentAutofillDriverCreated); EXPECT_CALL(observer_, OnContentAutofillDriverWillBeDeleted( - Ref(*factory_), IsKnownDriver(factory_.get()))); + Ref(factory()), IsKnownDriver(&factory()))); NavigateMainFrame("https://a.com/"); - factory_->RenderFrameDeleted(main_rfh()); + factory().RenderFrameDeleted(main_rfh()); } } // namespace autofill
diff --git a/components/autofill/content/browser/content_autofill_driver_test_api.h b/components/autofill/content/browser/content_autofill_driver_test_api.h index a5deff0c..4981d03 100644 --- a/components/autofill/content/browser/content_autofill_driver_test_api.h +++ b/components/autofill/content/browser/content_autofill_driver_test_api.h
@@ -7,6 +7,7 @@ #include "base/memory/raw_ref.h" #include "components/autofill/content/browser/content_autofill_driver.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" namespace autofill { @@ -16,6 +17,10 @@ explicit ContentAutofillDriverTestApi(ContentAutofillDriver* driver) : driver_(*driver) {} + void set_autofill_manager(std::unique_ptr<AutofillManager> autofill_manager) { + driver_->autofill_manager_ = std::move(autofill_manager); + } + void SetFrameAndFormMetaData(FormData& form, FormFieldData* field) const { driver_->SetFrameAndFormMetaData(form, field); }
diff --git a/components/autofill/content/browser/test_autofill_driver_injector.h b/components/autofill/content/browser/test_autofill_driver_injector.h index 0c160852..6bcc05f 100644 --- a/components/autofill/content/browser/test_autofill_driver_injector.h +++ b/components/autofill/content/browser/test_autofill_driver_injector.h
@@ -13,6 +13,7 @@ #include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/content/browser/content_autofill_driver_factory.h" #include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h" +#include "components/autofill/content/browser/content_autofill_driver_test_api.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/test/browser_test_utils.h" @@ -162,8 +163,9 @@ ContentAutofillDriverFactory* factory) { auto* client = ContentAutofillClient::FromWebContents(web_contents()); auto driver = std::make_unique<T>(rfh, factory); - driver->set_autofill_manager(std::make_unique<BrowserAutofillManager>( - driver.get(), client, "en-US")); + test_api(*driver).set_autofill_manager( + std::make_unique<BrowserAutofillManager>(driver.get(), client, + "en-US")); return driver; }
diff --git a/components/autofill/content/browser/test_autofill_manager_injector.h b/components/autofill/content/browser/test_autofill_manager_injector.h index c7862e50..305ace2 100644 --- a/components/autofill/content/browser/test_autofill_manager_injector.h +++ b/components/autofill/content/browser/test_autofill_manager_injector.h
@@ -9,6 +9,7 @@ #include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/content/browser/content_autofill_driver_factory.h" #include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h" +#include "components/autofill/content/browser/content_autofill_driver_test_api.h" #include "components/autofill/content/browser/test_autofill_driver_injector.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" @@ -149,7 +150,7 @@ ContentAutofillDriver& driver) override { std::unique_ptr<T> new_manager = CreateManager(&driver); owner_->managers_[driver.render_frame_host()] = new_manager.get(); - driver.set_autofill_manager(std::move(new_manager)); + test_api(driver).set_autofill_manager(std::move(new_manager)); } void OnContentAutofillDriverWillBeDeleted(
diff --git a/components/autofill/content/browser/test_content_autofill_client.cc b/components/autofill/content/browser/test_content_autofill_client.cc index bbb9f4b..68afc885 100644 --- a/components/autofill/content/browser/test_content_autofill_client.cc +++ b/components/autofill/content/browser/test_content_autofill_client.cc
@@ -4,14 +4,22 @@ #include "components/autofill/content/browser/test_content_autofill_client.h" +#include <memory> + +#include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/core/browser/browser_autofill_manager.h" +#include "components/autofill/core/browser/test_browser_autofill_manager.h" namespace autofill { -TestContentAutofillClient::TestContentAutofillClient( - content::WebContents* web_contents) - : TestContentAutofillClient( - web_contents, - base::BindRepeating(&BrowserDriverInitHook, this, "en-US")) {} +std::unique_ptr<AutofillManager> TestContentAutofillClient::CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) { + return std::make_unique<BrowserAutofillManager>(&driver, this, "en-US"); +} + +void TestContentAutofillClient::InitAgent( + base::PassKey<ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<mojom::AutofillAgent>& agent) {} } // namespace autofill
diff --git a/components/autofill/content/browser/test_content_autofill_client.h b/components/autofill/content/browser/test_content_autofill_client.h index 5d1a521..826713a 100644 --- a/components/autofill/content/browser/test_content_autofill_client.h +++ b/components/autofill/content/browser/test_content_autofill_client.h
@@ -19,10 +19,19 @@ class TestContentAutofillClient : public TestAutofillClientTemplate<ContentAutofillClient> { public: - explicit TestContentAutofillClient(content::WebContents* web_contents); - using TestAutofillClientTemplate< ContentAutofillClient>::TestAutofillClientTemplate; + + // ContentAutofillClient: + std::unique_ptr<AutofillManager> CreateManager( + base::PassKey<ContentAutofillDriver> pass_key, + ContentAutofillDriver& driver) override; + void InitAgent( + base::PassKey<ContentAutofillDriverFactory> pass_key, + const mojo::AssociatedRemote<mojom::AutofillAgent>& agent) override; + + private: + bool use_test_autofill_manager_ = false; }; } // namespace autofill
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc index cb3d12c..f640435d 100644 --- a/components/autofill/content/renderer/autofill_agent.cc +++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -833,7 +833,7 @@ form_control.SetSuggestedValue(blink::WebString::FromUTF16(value)); form_util::PreviewSuggestion(form_control.SuggestedValue().Utf16(), form_control.Value().Utf16(), - &form_control); + form_control); break; } break;
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index dee0dc6..7071f75 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -14,6 +14,7 @@ #include <utility> #include <vector> +#include "base/check_deref.h" #include "base/check_op.h" #include "base/command_line.h" #include "base/containers/contains.h" @@ -1094,10 +1095,10 @@ // causing the background to be blue. void FillFormField(const FormFieldData::FillData& data, bool is_initiating_node, - blink::WebFormControlElement* field, + blink::WebFormControlElement& field, FieldDataManager& field_data_manager) { - CHECK(!IsCheckableElement(*field)); - WebInputElement input_element = field->DynamicTo<WebInputElement>(); + CHECK(!IsCheckableElement(field)); + WebInputElement input_element = field.DynamicTo<WebInputElement>(); WebAutofillState new_autofill_state = data.is_autofilled ? WebAutofillState::kAutofilled : WebAutofillState::kNotFilled; @@ -1110,28 +1111,28 @@ } if (IsTextInput(input_element)) { - field_data_manager.UpdateFieldDataMap(GetFieldRendererId(*field), value, + field_data_manager.UpdateFieldDataMap(GetFieldRendererId(field), value, FieldPropertiesFlags::kAutofilled); } - field->SetAutofillValue(blink::WebString::FromUTF16(value), - new_autofill_state); + field.SetAutofillValue(blink::WebString::FromUTF16(value), + new_autofill_state); // Changing the field's value might trigger JavaScript, which is capable of // destroying the frame. - if (!field->GetDocument().GetFrame()) { + if (!field.GetDocument().GetFrame()) { return; } if (is_initiating_node && (IsTextInput(input_element) || IsMonthInput(input_element) || - IsTextAreaElement(*field))) { - auto length = base::checked_cast<unsigned>(field->Value().length()); - field->SetSelectionRange(length, length); + IsTextAreaElement(field))) { + auto length = base::checked_cast<unsigned>(field.Value().length()); + field.SetSelectionRange(length, length); // selectionchange event is capable of destroying the frame. - if (!field->GetDocument().GetFrame()) { + if (!field.GetDocument().GetFrame()) { return; } // Clear the current IME composition (the underline), if there is one. - field->GetDocument().GetFrame()->UnmarkText(); + field.GetDocument().GetFrame()->UnmarkText(); } } @@ -1139,13 +1140,13 @@ // Also sets the "autofilled" attribute, causing the background to be blue. void PreviewFormField(const FormFieldData::FillData& data, bool is_initiating_node, - blink::WebFormControlElement* field, + blink::WebFormControlElement& field, FieldDataManager& field_data_manager) { - CHECK(!IsCheckableElement(*field)); + CHECK(!IsCheckableElement(field)); // Preview input, textarea and select fields. For input fields, excludes // checkboxes and radio buttons, as there is no provision for // setSuggestedCheckedValue in WebInputElement. - WebInputElement input_element = field->DynamicTo<WebInputElement>(); + WebInputElement input_element = field.DynamicTo<WebInputElement>(); WebAutofillState new_autofill_state = data.is_autofilled ? WebAutofillState::kPreviewed : WebAutofillState::kNotFilled; @@ -1155,15 +1156,15 @@ input_element.SetSuggestedValue(blink::WebString::FromUTF16( data.value.substr(0, input_element.MaxLength()))); input_element.SetAutofillState(new_autofill_state); - } else if (IsTextAreaElement(*field) || IsSelectOrSelectListElement(*field)) { - field->SetSuggestedValue(blink::WebString::FromUTF16(data.value)); - field->SetAutofillState(new_autofill_state); + } else if (IsTextAreaElement(field) || IsSelectOrSelectListElement(field)) { + field.SetSuggestedValue(blink::WebString::FromUTF16(data.value)); + field.SetAutofillState(new_autofill_state); } if (is_initiating_node && - (IsTextInput(input_element) || IsTextAreaElement(*field))) { + (IsTextInput(input_element) || IsTextAreaElement(field))) { // Select the part of the text that the user didn't type. - PreviewSuggestion(field->SuggestedValue().Utf16(), field->Value().Utf16(), + PreviewSuggestion(field.SuggestedValue().Utf16(), field.Value().Utf16(), field); } } @@ -2311,7 +2312,7 @@ field.value != element.Value().Utf16() || !base::FeatureList::IsEnabled( features::kAutofillHighlightOnlyChangedValuesInPreviewMode)) { - fill_or_preview(field, is_initiating_element, &element, + fill_or_preview(field, is_initiating_element, element, field_data_manager); } continue; @@ -2339,7 +2340,8 @@ autofillable_elements_index_pairs) { filled_fields.emplace_back(*filled_element, filled_element->GetAutofillState()); - fill_or_preview(*field_data, false, filled_element, field_data_manager); + fill_or_preview(*field_data, false, CHECK_DEREF(filled_element), + field_data_manager); } // A focus event is emitted for the initiating element after autofilling is @@ -2444,8 +2446,8 @@ void PreviewSuggestion(const std::u16string& suggestion, const std::u16string& user_input, - blink::WebFormControlElement* input_element) { - input_element->SetSelectionRange( + blink::WebFormControlElement& input_element) { + input_element.SetSelectionRange( base::checked_cast<unsigned>(user_input.length()), base::checked_cast<unsigned>(suggestion.length())); }
diff --git a/components/autofill/content/renderer/form_autofill_util.h b/components/autofill/content/renderer/form_autofill_util.h index 94f5536..bf763541 100644 --- a/components/autofill/content/renderer/form_autofill_util.h +++ b/components/autofill/content/renderer/form_autofill_util.h
@@ -362,7 +362,7 @@ // |input_element| by calling value(), because of http://crbug.com/507714. void PreviewSuggestion(const std::u16string& suggestion, const std::u16string& user_input, - blink::WebFormControlElement* input_element); + blink::WebFormControlElement& input_element); // Returns the aggregated values of the descendants of |element| that are // non-empty text nodes. This is a faster alternative to |innerText()| for
diff --git a/components/autofill/content/renderer/form_tracker_browsertest.cc b/components/autofill/content/renderer/form_tracker_browsertest.cc index e09b9f9..3d5e8fc 100644 --- a/components/autofill/content/renderer/form_tracker_browsertest.cc +++ b/components/autofill/content/renderer/form_tracker_browsertest.cc
@@ -4,10 +4,13 @@ #include "components/autofill/content/renderer/form_tracker.h" +#include "base/test/scoped_feature_list.h" #include "components/autofill/content/renderer/autofill_agent_test_api.h" #include "components/autofill/content/renderer/autofill_renderer_test.h" +#include "components/autofill/core/common/autofill_features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/web/web_form_control_element.h" #include "third_party/blink/public/web/web_local_frame.h" @@ -26,21 +29,42 @@ MOCK_METHOD1(OnInferredFormSubmission, void(mojom::SubmissionSource)); }; -class FormTrackerTest : public test::AutofillRendererTest { +class FormTrackerTest : public test::AutofillRendererTest, + public testing::WithParamInterface<bool> { public: + FormTrackerTest() { + if (GetParam()) { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/ + {blink::features::kAutofillUseDomNodeIdForRendererId, + features::kAutofillReplaceCachedWebElementsByRendererIds, + features::kAutofillImproveSubmissionDetection}, + /*disabled_features=*/{}); + } else { + scoped_feature_list_.InitAndDisableFeature( + features::kAutofillImproveSubmissionDetection); + } + } blink::WebFormControlElement GetFormControlById(const std::string& id) { return GetMainFrame() ->GetDocument() .GetElementById(blink::WebString::FromUTF8(id)) .DynamicTo<blink::WebFormControlElement>(); } + + protected: + base::test::ScopedFeatureList scoped_feature_list_; }; +INSTANTIATE_TEST_SUITE_P(AutofillSubmissionTest, + FormTrackerTest, + ::testing::Bool()); + // Check that submission is detected on a page with no <form> when in sequence: // 1) User types into a field. // 2) Page does an XHR. // 3) Page hides all of the inputs. -TEST_F(FormTrackerTest, FormlessXHRThenHide) { +TEST_P(FormTrackerTest, FormlessXHRThenHide) { LoadHTML("<!DOCTYPE HTML><input id='input1'><input id='input2'/>"); blink::WebFormControlElement input1 = GetFormControlById("input1"); @@ -63,15 +87,15 @@ // FormTracker should detect a submission after the <input>s are hidden. EXPECT_CALL(observer, OnInferredFormSubmission).Times(1); ExecuteJavaScriptForTests( - "document.getElementById('input1').style.display = 'none';" - "document.getElementById('input2').style.display = 'none';"); + R"(document.getElementById('input1').style.display = 'none'; + document.getElementById('input2').style.display = 'none';)"); } // Check that submission is detected on a page with no <form> when in sequence: // 1) User types into a field. // 2) Page hides all of the inputs. // 3) Page does an XHR. -TEST_F(FormTrackerTest, FormlessHideThenXhr) { +TEST_P(FormTrackerTest, FormlessHideThenXhr) { LoadHTML("<!DOCTYPE HTML><input id='input1'><input id='input2'/>"); blink::WebFormControlElement input1 = GetFormControlById("input1");
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 928046c..6962a39 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -955,7 +955,7 @@ username_autofill_state_ = username_element.GetAutofillState(); username_element.SetSuggestedValue(username); form_util::PreviewSuggestion(username_element.SuggestedValue().Utf16(), - username_query_prefix_, &username_element); + username_query_prefix_, username_element); } if (!password_element.IsNull()) { password_autofill_state_ = password_element.GetAutofillState();
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 609d0ed..8af16a7 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -42,16 +42,15 @@ # The order of sources must be so that it matches the PatternSource enum # values in regex_patterns.h. - if (!use_internal_autofill_patterns) { - sources = [ "form_parsing/resources/legacy_regex_patterns.json" ] - } else { - sources = [ + sources = [ "form_parsing/resources/legacy_regex_patterns.json" ] + if (use_internal_autofill_patterns) { + sources += [ "form_parsing/internal_resources/0_default_regex_patterns.json", "form_parsing/internal_resources/1_experimental_regex_patterns.json", "form_parsing/internal_resources/2_nextgen_regex_patterns.json", - "form_parsing/resources/legacy_regex_patterns.json", ] } + script = "form_parsing/transpile_regex_patterns.py" outputs = [ "$target_gen_dir/form_parsing/regex_patterns_inl.h" ] args = [ "--input" ] + rebase_path(sources, root_build_dir) + [ "--output" ] + @@ -300,8 +299,6 @@ "metrics/autofill_metrics.h", "metrics/autofill_metrics_utils.cc", "metrics/autofill_metrics_utils.h", - "metrics/converge_to_extreme_length_address_metrics.cc", - "metrics/converge_to_extreme_length_address_metrics.h", "metrics/fallback_autocomplete_unrecognized_metrics.cc", "metrics/fallback_autocomplete_unrecognized_metrics.h", "metrics/field_filling_stats_and_score_metrics.cc", @@ -790,6 +787,7 @@ static_library("test_support") { testonly = true sources = [ + "address_data_cleaner_test_api.h", "autofill_form_test_utils.cc", "autofill_form_test_utils.h", "autofill_manager_test_api.h", @@ -1102,7 +1100,6 @@ "merchant_promo_code_manager_unittest.cc", "metrics/address_rewriter_in_profile_subset_metrics_unittest.cc", "metrics/autofill_metrics_unittest.cc", - "metrics/converge_to_extreme_length_address_metrics_unittest.cc", "metrics/fallback_autocomplete_unrecognized_metrics_unittest.cc", "metrics/field_filling_stats_and_score_metrics_unittest.cc", "metrics/form_events/address_form_event_logger_unittest.cc",
diff --git a/components/autofill/core/browser/address_data_cleaner.cc b/components/autofill/core/browser/address_data_cleaner.cc index ac21f5d0..b8a81f0f 100644 --- a/components/autofill/core/browser/address_data_cleaner.cc +++ b/components/autofill/core/browser/address_data_cleaner.cc
@@ -204,37 +204,33 @@ continue; } - // The profiles are found to be mergeable. Attempt to update the existing - // profile. This returns true if the merge was successful, or if the - // merge would have been successful but the existing profile IsVerified() - // and will not accept updates from `profile_to_merge`. - if (existing_profile.SaveAdditionalInfo( - *profile_to_merge, personal_data_manager_->app_locale())) { - profiles_to_delete.insert(profile_to_merge->guid()); + // The profiles are found to be mergeable; update the existing profile. + existing_profile.SaveAdditionalInfo(*profile_to_merge, + personal_data_manager_->app_locale()); + profiles_to_delete.insert(profile_to_merge->guid()); - // Account profiles track from which service they originate. This allows - // Autofill to distinguish between Chrome and non-Chrome account - // profiles and measure the added utility of non-Chrome profiles. Since - // the `existing_profile` matched the information that was already - // present in Autofill (`profile_to_merge`), the account profile doesn't - // provide any utility. To capture this in the metric, the merged - // profile is treated as a Chrome account profile. - if (existing_profile.source() == AutofillProfile::Source::kAccount) { - existing_profile.set_initial_creator_id( - AutofillProfile::kInitialCreatorOrModifierChrome); - existing_profile.set_last_modifier_id( - AutofillProfile::kInitialCreatorOrModifierChrome); - } + // Account profiles track from which service they originate. This allows + // Autofill to distinguish between Chrome and non-Chrome account + // profiles and measure the added utility of non-Chrome profiles. Since + // the `existing_profile` matched the information that was already + // present in Autofill (`profile_to_merge`), the account profile doesn't + // provide any utility. To capture this in the metric, the merged + // profile is treated as a Chrome account profile. + if (existing_profile.source() == AutofillProfile::Source::kAccount) { + existing_profile.set_initial_creator_id( + AutofillProfile::kInitialCreatorOrModifierChrome); + existing_profile.set_last_modifier_id( + AutofillProfile::kInitialCreatorOrModifierChrome); + } - // Now try to merge the new resulting profile with the rest of the - // existing profiles. - profile_to_merge = &existing_profile; - // Account profiles cannot be merged into other profiles, since that - // would delete them. Note that the `existing_profile` (now - // `profile_to_merge`) might be verified. - if (profile_to_merge->source() == AutofillProfile::Source::kAccount) { - break; - } + // Now try to merge the new resulting profile with the rest of the + // existing profiles. + profile_to_merge = &existing_profile; + // Account profiles cannot be merged into other profiles, since that + // would delete them. Note that the `existing_profile` (now + // `profile_to_merge`) might be verified. + if (profile_to_merge->source() == AutofillProfile::Source::kAccount) { + break; } } }
diff --git a/components/autofill/core/browser/address_data_cleaner.h b/components/autofill/core/browser/address_data_cleaner.h index 1ad9316..5c1c2fd 100644 --- a/components/autofill/core/browser/address_data_cleaner.h +++ b/components/autofill/core/browser/address_data_cleaner.h
@@ -38,7 +38,7 @@ void MaybeCleanupAddressDataAfterSyncChange(syncer::ModelType model_type); private: - friend class AddressDataCleanerTest; + friend class AddressDataCleanerTestApi; // Shared implementation of `MaybeCleanupAddressData()` and // `MaybeCleanupAddressDataAfterSyncChange()`
diff --git a/components/autofill/core/browser/address_data_cleaner_test_api.h b/components/autofill/core/browser/address_data_cleaner_test_api.h new file mode 100644 index 0000000..64d561fa --- /dev/null +++ b/components/autofill/core/browser/address_data_cleaner_test_api.h
@@ -0,0 +1,34 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_DATA_CLEANER_TEST_API_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_DATA_CLEANER_TEST_API_H_ + +#include "base/memory/raw_ref.h" +#include "components/autofill/core/browser/address_data_cleaner.h" + +namespace autofill { + +class AddressDataCleanerTestApi { + public: + explicit AddressDataCleanerTestApi(AddressDataCleaner& data_cleaner) + : data_cleaner_(data_cleaner) {} + + void ApplyAddressDedupingRoutine() { + data_cleaner_->ApplyAddressDedupingRoutine(); + } + + void DeleteDisusedAddresses() { data_cleaner_->DeleteDisusedAddresses(); } + + private: + const raw_ref<AddressDataCleaner> data_cleaner_; +}; + +inline AddressDataCleanerTestApi test_api(AddressDataCleaner& data_cleaner) { + return AddressDataCleanerTestApi(data_cleaner); +} + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_ADDRESS_DATA_CLEANER_TEST_API_H_
diff --git a/components/autofill/core/browser/address_data_cleaner_unittest.cc b/components/autofill/core/browser/address_data_cleaner_unittest.cc index 8764424..60f5a85 100644 --- a/components/autofill/core/browser/address_data_cleaner_unittest.cc +++ b/components/autofill/core/browser/address_data_cleaner_unittest.cc
@@ -7,6 +7,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "components/autofill/core/browser/address_data_cleaner_test_api.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/test_personal_data_manager.h" @@ -28,25 +29,15 @@ public: AddressDataCleanerTest() : prefs_(test::PrefServiceForTesting()), - address_data_cleaner_(&test_pdm_, - /*alternative_state_name_map_updater=*/nullptr, - prefs_.get()) {} + data_cleaner_(&test_pdm_, + /*alternative_state_name_map_updater=*/nullptr, + prefs_.get()) {} - void ApplyAddressDedupingRoutine() { - address_data_cleaner_.ApplyAddressDedupingRoutine(); - } - - void DeleteDisusedAddresses() { - address_data_cleaner_.DeleteDisusedAddresses(); - } - - TestPersonalDataManager& personal_data() { return test_pdm_; } - - private: + protected: base::test::TaskEnvironment task_environment_; std::unique_ptr<PrefService> prefs_; TestPersonalDataManager test_pdm_; - AddressDataCleaner address_data_cleaner_; + AddressDataCleaner data_cleaner_; }; // Tests that ApplyAddressDedupingRoutine merges the profile values correctly, @@ -61,7 +52,7 @@ profile1.SetRawInfo(ADDRESS_HOME_LINE1, u"742. Evergreen Terrace"); profile1.set_use_count(10); profile1.set_use_date(AutofillClock::Now() - base::Days(1)); - personal_data().AddProfile(profile1); + test_pdm_.AddProfile(profile1); AutofillProfile profile2(AddressCountryCode("")); profile2.SetRawInfo(NAME_MIDDLE, u"Jay"); @@ -69,7 +60,7 @@ profile2.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, u"12345678910"); profile2.set_use_count(5); profile2.set_use_date(AutofillClock::Now() - base::Days(3)); - personal_data().AddProfile(profile2); + test_pdm_.AddProfile(profile2); AutofillProfile profile3(AddressCountryCode("")); profile3.SetRawInfo(NAME_MIDDLE, u"J"); @@ -77,16 +68,16 @@ profile3.SetRawInfo(COMPANY_NAME, u"Fox"); profile3.set_use_count(3); profile3.set_use_date(AutofillClock::Now() - base::Days(5)); - personal_data().AddProfile(profile3); + test_pdm_.AddProfile(profile3); base::HistogramTester histogram_tester; - ApplyAddressDedupingRoutine(); + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); // `profile1` should have been merged into `profile2` which should then have // been merged into `profile3`. Therefore there should only be 1 saved // profile. - ASSERT_EQ(1U, personal_data().GetProfiles().size()); - AutofillProfile deduped_profile = *personal_data().GetProfiles()[0]; + ASSERT_EQ(1U, test_pdm_.GetProfiles().size()); + AutofillProfile deduped_profile = *test_pdm_.GetProfiles()[0]; // Since profiles with higher ranking scores are merged into profiles with // lower ranking scores, the result of the merge should be contained in @@ -125,23 +116,23 @@ // `StandardProfile()`, but the `UpdateableStandardProfile()` remains // unaffected. AutofillProfile standard_profile = test::StandardProfile(); - personal_data().AddProfile(standard_profile); - personal_data().AddProfile(test::UpdateableStandardProfile()); + test_pdm_.AddProfile(standard_profile); + test_pdm_.AddProfile(test::UpdateableStandardProfile()); AutofillProfile different_profile = test::DifferentFromStandardProfile(); - personal_data().AddProfile(different_profile); + test_pdm_.AddProfile(different_profile); - ApplyAddressDedupingRoutine(); - EXPECT_THAT(personal_data().GetProfiles(), + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); + EXPECT_THAT(test_pdm_.GetProfiles(), UnorderedElementsAre(Pointee(standard_profile), Pointee(different_profile))); } TEST_F(AddressDataCleanerTest, ApplyAddressDedupingRoutine_Metrics) { - personal_data().AddProfile(test::StandardProfile()); - personal_data().AddProfile(test::UpdateableStandardProfile()); + test_pdm_.AddProfile(test::StandardProfile()); + test_pdm_.AddProfile(test::UpdateableStandardProfile()); base::HistogramTester histogram_tester; - ApplyAddressDedupingRoutine(); + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); histogram_tester.ExpectUniqueSample( "Autofill.NumberOfProfilesConsideredForDedupe", 2, 1); histogram_tester.ExpectUniqueSample( @@ -154,28 +145,28 @@ ApplyAddressDedupingRoutine_OncePerVersion) { // The deduping routine should be run a first time and merge the // `UpdateableStandardProfile()` (subset) into the `StandardProfile()`. - personal_data().AddProfile(test::StandardProfile()); - personal_data().AddProfile(test::UpdateableStandardProfile()); - ApplyAddressDedupingRoutine(); - EXPECT_EQ(1U, personal_data().GetProfiles().size()); + test_pdm_.AddProfile(test::StandardProfile()); + test_pdm_.AddProfile(test::UpdateableStandardProfile()); + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); + EXPECT_EQ(1U, test_pdm_.GetProfiles().size()); // Add another duplicate profile and expect that the routine isn't run again. - personal_data().AddProfile(test::StandardProfile()); - ApplyAddressDedupingRoutine(); - EXPECT_EQ(2U, personal_data().GetProfiles().size()); + test_pdm_.AddProfile(test::StandardProfile()); + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); + EXPECT_EQ(2U, test_pdm_.GetProfiles().size()); } // Tests that `kAccount` profiles are not deduplicated against each other. TEST_F(AddressDataCleanerTest, Deduplicate_kAccountPairs) { AutofillProfile account_profile1 = test::StandardProfile(); account_profile1.set_source_for_testing(AutofillProfile::Source::kAccount); - personal_data().AddProfile(account_profile1); + test_pdm_.AddProfile(account_profile1); AutofillProfile account_profile2 = test::StandardProfile(); account_profile2.set_source_for_testing(AutofillProfile::Source::kAccount); - personal_data().AddProfile(account_profile2); + test_pdm_.AddProfile(account_profile2); - ApplyAddressDedupingRoutine(); - EXPECT_THAT(personal_data().GetProfiles(), + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); + EXPECT_THAT(test_pdm_.GetProfiles(), UnorderedElementsAre(Pointee(account_profile1), Pointee(account_profile2))); } @@ -190,14 +181,13 @@ account_profile.set_initial_creator_id(non_chrome_service); account_profile.set_last_modifier_id(non_chrome_service); account_profile.set_source_for_testing(AutofillProfile::Source::kAccount); - personal_data().AddProfile(account_profile); - personal_data().AddProfile(test::SubsetOfStandardProfile()); + test_pdm_.AddProfile(account_profile); + test_pdm_.AddProfile(test::SubsetOfStandardProfile()); // Expect that only the account profile remains and that it became a Chrome- // originating profile. - ApplyAddressDedupingRoutine(); - std::vector<AutofillProfile*> deduped_profiles = - personal_data().GetProfiles(); + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); + std::vector<AutofillProfile*> deduped_profiles = test_pdm_.GetProfiles(); ASSERT_THAT(deduped_profiles, UnorderedElementsAre(Pointee(account_profile))); EXPECT_EQ(deduped_profiles[0]->initial_creator_id(), AutofillProfile::kInitialCreatorOrModifierChrome); @@ -210,13 +200,13 @@ TEST_F(AddressDataCleanerTest, Deduplicate_kAccountSubset) { AutofillProfile account_profile = test::SubsetOfStandardProfile(); account_profile.set_source_for_testing(AutofillProfile::Source::kAccount); - personal_data().AddProfile(account_profile); + test_pdm_.AddProfile(account_profile); AutofillProfile local_profile = test::StandardProfile(); - personal_data().AddProfile(local_profile); + test_pdm_.AddProfile(local_profile); - ApplyAddressDedupingRoutine(); + test_api(data_cleaner_).ApplyAddressDedupingRoutine(); EXPECT_THAT( - personal_data().GetProfiles(), + test_pdm_.GetProfiles(), UnorderedElementsAre(Pointee(account_profile), Pointee(local_profile))); } @@ -224,16 +214,15 @@ // Create a disused address (deletable). AutofillProfile profile1 = test::GetFullProfile(); profile1.set_use_date(AutofillClock::Now() - base::Days(400)); - personal_data().AddProfile(profile1); + test_pdm_.AddProfile(profile1); // Create a recently-used address (not deletable). AutofillProfile profile2 = test::GetFullCanadianProfile(); profile1.set_use_date(AutofillClock::Now() - base::Days(4)); - personal_data().AddProfile(profile2); + test_pdm_.AddProfile(profile2); - DeleteDisusedAddresses(); - EXPECT_THAT(personal_data().GetProfiles(), - UnorderedElementsAre(Pointee(profile2))); + test_api(data_cleaner_).DeleteDisusedAddresses(); + EXPECT_THAT(test_pdm_.GetProfiles(), UnorderedElementsAre(Pointee(profile2))); } } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_driver_router.cc b/components/autofill/core/browser/autofill_driver_router.cc index 5d6c210..7bae23d 100644 --- a/components/autofill/core/browser/autofill_driver_router.cc +++ b/components/autofill/core/browser/autofill_driver_router.cc
@@ -151,9 +151,10 @@ void AutofillDriverRouter::SetFormToBeProbablySubmitted( AutofillDriver* source, std::optional<FormData> form, - void (*callback)(AutofillDriver* target, const FormData* optional_form)) { + void (*callback)(AutofillDriver* target, + base::optional_ref<const FormData> form)) { if (!form) { - callback(source, nullptr); + callback(source, std::nullopt); return; }
diff --git a/components/autofill/core/browser/autofill_driver_router.h b/components/autofill/core/browser/autofill_driver_router.h index 82a95df..b5b10b0 100644 --- a/components/autofill/core/browser/autofill_driver_router.h +++ b/components/autofill/core/browser/autofill_driver_router.h
@@ -9,6 +9,7 @@ #include <string> #include "base/containers/flat_map.h" +#include "base/types/optional_ref.h" #include "components/autofill/core/browser/autofill_driver.h" #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/form_forest.h" @@ -248,7 +249,8 @@ void SetFormToBeProbablySubmitted( AutofillDriver* source, std::optional<FormData> form, - void (*callback)(AutofillDriver* target, const FormData* optional_form)); + void (*callback)(AutofillDriver* target, + base::optional_ref<const FormData> form)); // Events called by the browser, passed to the renderer: // Keep in alphabetic order.
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index c413582..10c25557 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -62,7 +62,8 @@ {ADDRESS_HOME_DEPENDENT_LOCALITY, HtmlFieldType::kAddressLine2}, {ADDRESS_HOME_DEPENDENT_LOCALITY, HtmlFieldType::kAddressLine3}, {ADDRESS_HOME_OVERFLOW_AND_LANDMARK, HtmlFieldType::kAddressLine2}, - {ADDRESS_HOME_OVERFLOW, HtmlFieldType::kAddressLine2}}); + {ADDRESS_HOME_OVERFLOW, HtmlFieldType::kAddressLine2}, + {ADDRESS_HOME_OVERFLOW, HtmlFieldType::kAddressLine3}}); // This list includes pairs (heuristic_type, server_type) that express which // heuristics predictions should be prioritized over server predictions. The @@ -86,7 +87,8 @@ {ADDRESS_HOME_LANDMARK, ADDRESS_HOME_LINE2}, {ADDRESS_HOME_BETWEEN_STREETS_OR_LANDMARK, ADDRESS_HOME_LINE2}, {ADDRESS_HOME_OVERFLOW_AND_LANDMARK, ADDRESS_HOME_LINE2}, - {ADDRESS_HOME_OVERFLOW, ADDRESS_HOME_LINE2}}); + {ADDRESS_HOME_OVERFLOW, ADDRESS_HOME_LINE2}, + {ADDRESS_HOME_OVERFLOW, ADDRESS_HOME_LINE3}}); // Returns true, if the prediction is non-experimental and should be used by // autofill or password manager.
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc index ca4bd70..4752dd42 100644 --- a/components/autofill/core/browser/autofill_test_utils.cc +++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -972,7 +972,6 @@ BankAccount bank_account( instrument_id, u"nickname", GURL("http://www.example.com"), u"bank_name", u"account_number", BankAccount::AccountType::kChecking); - bank_account.AddPaymentRail(PaymentInstrument::PaymentRail::kPix); return bank_account; }
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc index 8147597..0f895ef 100644 --- a/components/autofill/core/browser/browser_autofill_manager.cc +++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -44,6 +44,8 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" #include "base/threading/thread_restrictions.h" +#include "base/time/tick_clock.h" +#include "base/time/time.h" #include "base/uuid.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -603,13 +605,12 @@ const AutofillField& field, absl::variant<const AutofillProfile*, const CreditCard*> profile_or_credit_card, - const std::u16string* optional_cvc) + base::optional_ref<const std::u16string> cvc) : filled_field_id(field.global_id()), filled_field_signature(field.GetFieldSignature()), - filled_origin(field.origin), - original_fill_time(base::TimeTicks::Now()) { + filled_origin(field.origin) { DCHECK(absl::holds_alternative<const CreditCard*>(profile_or_credit_card) || - !optional_cvc); + !cvc.has_value()); if (absl::holds_alternative<const AutofillProfile*>(profile_or_credit_card)) { profile_or_credit_card_with_cvc = @@ -618,7 +619,7 @@ profile_or_credit_card)) { profile_or_credit_card_with_cvc = std::make_pair(*absl::get<const CreditCard*>(profile_or_credit_card), - optional_cvc ? *optional_cvc : std::u16string()); + cvc.has_value() ? *cvc : std::u16string()); } } @@ -1391,7 +1392,7 @@ } FillOrPreviewDataModelForm(action_persistence, form, field, &credit_card_, - /*optional_cvc=*/nullptr, form_structure, + /*cvc=*/std::nullopt, form_structure, autofill_field, trigger_details); } @@ -1406,7 +1407,7 @@ if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) return; FillOrPreviewDataModelForm(action_persistence, form, field, &profile, - /*optional_cvc=*/nullptr, form_structure, + /*cvc=*/std::nullopt, form_structure, autofill_field, trigger_details); } @@ -1417,18 +1418,15 @@ const FormFieldData& field, const std::u16string& value, PopupItemId popup_item_id) { - if (AutofillField* autofill_field = GetAutofillField(form, field); - autofill_field && action_persistence == mojom::ActionPersistence::kFill && - (popup_item_id == PopupItemId::kCreditCardFieldByFieldFilling || - popup_item_id == PopupItemId::kAddressFieldByFieldFilling)) { - // TODO(crbug.com/1345089): Only use AutofillField. - const FormFieldData* const filled_field = &field; - form_autofill_history_.AddFormFillEntry( - base::make_span(&filled_field, 1u), - base::make_span(&autofill_field, 1u), - GetFillingProductFromPopupItemId(popup_item_id), - /*is_refill=*/false); + FormStructure* form_structure = nullptr; + AutofillField* autofill_field = nullptr; + if (GetCachedFormAndField(form, field, &form_structure, &autofill_field) && + autofill_field && action_persistence == mojom::ActionPersistence::kFill) { autofill_field->is_autofilled = true; + form_structure->set_last_filling_timestamp(base::TimeTicks::Now()); + // After field filling, refills are not allowed. Resetting the corresponding + // FillingContext prevents this from happening. + SetFillingContext(form.global_id(), nullptr); autofill_field->AppendLogEventIfNotRepeated(FillFieldLogEvent{ .fill_event_id = GetNextFillEventId(), .had_value_before_filling = ToOptionalBoolean(!field.value.empty()), @@ -1436,6 +1434,19 @@ .was_autofilled_before_security_policy = ToOptionalBoolean(true), .had_value_after_filling = ToOptionalBoolean(true), .filling_method = AutofillFillingMethod::kFieldByFieldFilling}); + // Undo is currently only supported for Address/CreditCard filling. Do not + // store other information in the filling history as this information will + // never be used. + if ((popup_item_id == PopupItemId::kCreditCardFieldByFieldFilling || + popup_item_id == PopupItemId::kAddressFieldByFieldFilling)) { + // TODO(crbug.com/1345089): Only use AutofillField. + const FormFieldData* const filled_field = &field; + form_autofill_history_.AddFormFillEntry( + base::make_span(&filled_field, 1u), + base::make_span(&autofill_field, 1u), + GetFillingProductFromPopupItemId(popup_item_id), + /*is_refill=*/false); + } } driver().ApplyFieldAction(action_persistence, text_replacement, field.global_id(), value); @@ -1838,28 +1849,24 @@ // We are interested in reporting the events where JavaScript resets an // autofilled value immediately after filling. For a reset, the value // needs to be empty. - if (!field.value.empty()) - return; - - FormStructure* form_structure = nullptr; - AutofillField* autofill_field = nullptr; - if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) - return; - - FillingContext* filling_context = - GetFillingContext(form_structure->global_id()); - if (!filling_context) - return; - - base::TimeTicks now = base::TimeTicks::Now(); - base::TimeDelta delta = now - filling_context->original_fill_time; - - // If the filling happened too long ago, maybe this is just an effect of - // the user pressing a "reset form" button. - if (delta >= limit_before_refill_) { + if (!field.value.empty()) { return; } - + FormStructure* form_structure = nullptr; + AutofillField* autofill_field = nullptr; + if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) { + return; + } + if (!form_structure->last_filling_timestamp()) { + return; + } + // If the filling happened too long ago, maybe this is just an effect of + // the user pressing a "reset form" button. + if (base::TimeDelta delta = + base::TimeTicks::Now() - *form_structure->last_filling_timestamp(); + delta >= limit_before_refill_) { + return; + } auto* logger = GetEventFormLogger(*autofill_field); if (logger) { logger->OnAutofilledFieldWasClearedByJavaScriptShortlyAfterFill( @@ -2188,7 +2195,8 @@ const FormFieldData& trigger_field, const Section& filling_section, const FieldTypeSet& field_types_to_fill, - const DenseSet<FieldTypeGroup>* optional_type_groups_originally_filled, + base::optional_ref<const DenseSet<FieldTypeGroup>> + type_groups_originally_filled, FillingProduct filling_product, bool skip_unrecognized_autocomplete_fields, bool is_refill, @@ -2272,9 +2280,8 @@ // On a refill, only fill fields from type groups that were present during // the initial fill. - if (is_refill && optional_type_groups_originally_filled && - !base::Contains(*optional_type_groups_originally_filled, - field_group_type)) { + if (is_refill && type_groups_originally_filled.has_value() && + !base::Contains(*type_groups_originally_filled, field_group_type)) { skip_reasons[field_id] = FieldFillingSkipReason::kRefillNotInInitialFill; continue; } @@ -2384,10 +2391,9 @@ autofill_field.set_autofilled_type(previous_state.autofilled_type); } - // Do not attempt a refill after an Undo operation. - if (FillingContext* filling_context = GetFillingContext(form.global_id())) { - SetFillingContext(form.global_id(), nullptr); - } + // After Undo, refills are not allowed. Resetting the corresponding + // FillingContext prevents this from happening. + SetFillingContext(form.global_id(), nullptr); // Since Undo only affects fields that were already filled, and only sets // values to fields to something that already existed in it prior to the @@ -2412,7 +2418,7 @@ const FormFieldData& field, absl::variant<const AutofillProfile*, const CreditCard*> profile_or_credit_card, - const std::u16string* optional_cvc, + base::optional_ref<const std::u16string> cvc, FormStructure* form_structure, AutofillField* autofill_trigger_field, const AutofillTriggerDetails& trigger_details, @@ -2420,7 +2426,7 @@ bool is_credit_card = absl::holds_alternative<const CreditCard*>(profile_or_credit_card); - DCHECK(is_credit_card || !optional_cvc); + DCHECK(is_credit_card || !cvc.has_value()); DCHECK(form_structure); DCHECK(autofill_trigger_field); @@ -2459,7 +2465,7 @@ SetFillingContext( form_structure->global_id(), std::make_unique<FillingContext>(*autofill_trigger_field, - profile_or_credit_card, optional_cvc)); + profile_or_credit_card, cvc)); } // Only record the types that are filled for an eventual refill if all the @@ -2562,7 +2568,7 @@ : std::map<FieldGlobalId, std::u16string>(); const FieldFillingData filling_content = GetFieldFillingData( *autofill_field, profile_or_credit_card, forced_fill_values, - result_form.fields[i], optional_cvc ? *optional_cvc : u"", + result_form.fields[i], cvc.has_value() ? *cvc : u"", action_persistence, &failure_to_fill); if (!filling_content.value_to_fill.empty()) { return base::FastHash( @@ -2610,12 +2616,11 @@ // FillField() may also fill a field if it had been autofilled or manually // filled before, and also returns true in such a case; however, such fields // don't reach this code. - const bool is_newly_autofilled = - FillField(*autofill_field, profile_or_credit_card, forced_fill_values, - result_form.fields[i], should_notify, - optional_cvc ? *optional_cvc : u"", - data_util::DetermineGroups(*form_structure), - action_persistence, &failure_to_fill); + const bool is_newly_autofilled = FillField( + *autofill_field, profile_or_credit_card, forced_fill_values, + result_form.fields[i], should_notify, cvc.has_value() ? *cvc : u"", + data_util::DetermineGroups(*form_structure), action_persistence, + &failure_to_fill); if (is_newly_autofilled) newly_filled_field_ids.insert(result_form.fields[i].global_id()); @@ -2711,7 +2716,6 @@ LOG_AF(buffer) << Tr{} << field_number << "Actually did not fill field because of the iframe " "security policy."; - // Record in this AutofillField object's last FillFieldLogEvent object // that this field was actually not filled due to the iframe security // policy. @@ -2730,26 +2734,23 @@ } } } - - // Save filling history to support undoing it later if needed. if (action_persistence == mojom::ActionPersistence::kFill) { + form_structure->set_last_filling_timestamp(base::TimeTicks::Now()); + // Save filling history to support undoing it later if needed. form_autofill_history_.AddFormFillEntry( safe_newly_filled_fields.old_values, safe_newly_filled_fields.cached, is_credit_card ? FillingProduct::kCreditCard : FillingProduct::kAddress, is_refill); } - LOG_AF(buffer) << CTag{"table"}; LOG_AF(log_manager()) << LoggingScope::kFilling << LogMessage::kSendFillingData << Br{} << std::move(buffer); - if (filling_context) { // When a new preview/fill starts, previously forced_fill_values should be // ignored the operation could be for a different card or address. filling_context->forced_fill_values.clear(); } - OnDidFillOrPreviewForm( action_persistence, *form_structure, *autofill_trigger_field, safe_newly_filled_fields.new_values, newly_filled_field_ids, safe_fields, @@ -2926,7 +2927,7 @@ *last_address_fields_to_fill_for_section, trigger_autofill_field->Type().GetStorableType()) : kAllFieldTypes, - /*optional_type_groups_originally_filled=*/nullptr, + /*type_groups_originally_filled=*/std::nullopt, FillingProduct::kAddress, /*skip_unrecognized_autocomplete_fields=*/trigger_source != AutofillSuggestionTriggerSource::kManualFallbackAddress, @@ -3452,7 +3453,11 @@ void BrowserAutofillManager::SetFillingContext( FormGlobalId form_id, std::unique_ptr<FillingContext> context) { - filling_context_[form_id] = std::move(context); + if (context) { + filling_context_[form_id] = std::move(context); + } else { + filling_context_.erase(form_id); + } } BrowserAutofillManager::FillingContext* @@ -3468,10 +3473,9 @@ // filled before. FillingContext* filling_context = GetFillingContext(form_structure.global_id()); - if (filling_context == nullptr) { + if (!form_structure.last_filling_timestamp() || filling_context == nullptr) { return false; } - // Confirm that the form changed by running a DeepEqual check on the filled // form and the received form. Other trigger reasons do not need this check // since they do not depend on the form changing. @@ -3481,10 +3485,8 @@ *filling_context->filled_form)) { return false; } - - base::TimeTicks now = base::TimeTicks::Now(); - base::TimeDelta delta = now - filling_context->original_fill_time; - + base::TimeDelta delta = + base::TimeTicks::Now() - *form_structure.last_filling_timestamp(); return !filling_context->attempted_refill && delta < limit_before_refill_; } @@ -3574,8 +3576,7 @@ mojom::ActionPersistence::kFill, form, field, &absl::get<AutofillProfile>( filling_context->profile_or_credit_card_with_cvc), - /*optional_cvc=*/nullptr, form_structure, autofill_field, - trigger_details, + /*cvc=*/std::nullopt, form_structure, autofill_field, trigger_details, /*is_refill=*/true); } else { NOTREACHED();
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h index 57b9af3..4eb46d7 100644 --- a/components/autofill/core/browser/browser_autofill_manager.h +++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -413,7 +413,7 @@ FillingContext(const AutofillField& field, absl::variant<const AutofillProfile*, const CreditCard*> profile_or_credit_card, - const std::u16string* optional_cvc); + base::optional_ref<const std::u16string> optional_cvc); ~FillingContext(); // Whether a refill attempt was made. @@ -429,8 +429,6 @@ const FieldSignature filled_field_signature; // The security origin from which the field was filled. url::Origin filled_origin; - // The time at which the initial fill occurred. - const base::TimeTicks original_fill_time; // The timer used to trigger a refill. base::OneShotTimer on_refill_timer; // The field type groups that were initially filled. @@ -468,17 +466,17 @@ // TODO(crbug.com/1481035): Make `optional_type_groups_originally_filled` also // a FieldTypeSet. base::flat_map<FieldGlobalId, FieldFillingSkipReason> - GetFieldFillingSkipReasons( - const FormData& form, - const FormStructure& form_structure, - const FormFieldData& trigger_field, - const Section& filling_section, - const FieldTypeSet& field_types_to_fill, - const DenseSet<FieldTypeGroup>* optional_type_groups_originally_filled, - FillingProduct filling_product, - bool skip_unrecognized_autocomplete_fields, - bool is_refill, - bool is_expired_credit_card) const; + GetFieldFillingSkipReasons(const FormData& form, + const FormStructure& form_structure, + const FormFieldData& trigger_field, + const Section& filling_section, + const FieldTypeSet& field_types_to_fill, + base::optional_ref<const DenseSet<FieldTypeGroup>> + type_groups_originally_filled, + FillingProduct filling_product, + bool skip_unrecognized_autocomplete_fields, + bool is_refill, + bool is_expired_credit_card) const; // When `FillOrPreviewCreditCardForm()` fetches a credit card, this gets // called once the fetching has finished. If successful, the `credit_card` is @@ -524,7 +522,7 @@ const FormFieldData& field, absl::variant<const AutofillProfile*, const CreditCard*> profile_or_credit_card, - const std::u16string* optional_cvc, + base::optional_ref<const std::u16string> optional_cvc, FormStructure* form_structure, AutofillField* autofill_field, const AutofillTriggerDetails& trigger_details,
diff --git a/components/autofill/core/browser/browser_autofill_manager_test_api.h b/components/autofill/core/browser/browser_autofill_manager_test_api.h index a14780f..229c706 100644 --- a/components/autofill/core/browser/browser_autofill_manager_test_api.h +++ b/components/autofill/core/browser/browser_autofill_manager_test_api.h
@@ -106,11 +106,11 @@ const FormFieldData& field, absl::variant<const AutofillProfile*, const CreditCard*> profile_or_credit_card, - const std::u16string* optional_cvc, + base::optional_ref<const std::u16string> cvc, FormStructure* form_structure, AutofillField* autofill_field) { return manager_->FillOrPreviewDataModelForm( - action_persistence, form, field, profile_or_credit_card, optional_cvc, + action_persistence, form, field, profile_or_credit_card, cvc, form_structure, autofill_field, {.trigger_source = AutofillTriggerSource::kPopup}); }
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc index cd20b503..cf2531e0 100644 --- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -2957,9 +2957,9 @@ .WillOnce((DoAll(SaveArg<2>(&response_data), Return(std::vector<FieldGlobalId>{})))); test_api(*browser_autofill_manager_) - .FillOrPreviewDataModelForm(mojom::ActionPersistence::kFill, form, - form.fields.front(), profile, nullptr, - form_structure, autofill_field); + .FillOrPreviewDataModelForm( + mojom::ActionPersistence::kFill, form, form.fields.front(), profile, + /*cvc=*/std::nullopt, form_structure, autofill_field); std::vector<FormFieldData> filled_fields(response_data.fields.begin(), response_data.fields.begin() + 2); std::vector<FormFieldData> skipped_fields(response_data.fields.begin() + 2, @@ -2991,9 +2991,9 @@ FormData response_data; EXPECT_CALL(*autofill_driver_, ApplyFormAction).Times(0); test_api(*browser_autofill_manager_) - .FillOrPreviewDataModelForm(mojom::ActionPersistence::kFill, form, - form.fields.front(), profile, nullptr, - form_structure, autofill_field); + .FillOrPreviewDataModelForm( + mojom::ActionPersistence::kFill, form, form.fields.front(), profile, + /*cvc=*/std::nullopt, form_structure, autofill_field); } TEST_F(BrowserAutofillManagerTest, SkipFillIfFieldIsMeaningfullyPreFilled) { @@ -3026,9 +3026,9 @@ .WillOnce((DoAll(SaveArg<2>(&filled_form), Return(std::vector<FieldGlobalId>{})))); test_api(*browser_autofill_manager_) - .FillOrPreviewDataModelForm(mojom::ActionPersistence::kFill, form, - form.fields.front(), profile, nullptr, - form_structure, autofill_field); + .FillOrPreviewDataModelForm( + mojom::ActionPersistence::kFill, form, form.fields.front(), profile, + /*cvc=*/std::nullopt, form_structure, autofill_field); auto expect_hash = [&](const FormFieldData& field, std::optional<size_t> expected_hash) { @@ -3098,9 +3098,9 @@ .WillOnce((DoAll(SaveArg<2>(&filled_form), Return(std::vector<FieldGlobalId>{})))); test_api(*browser_autofill_manager_) - .FillOrPreviewDataModelForm(mojom::ActionPersistence::kFill, form, - form.fields.front(), profile, nullptr, - form_structure, autofill_field); + .FillOrPreviewDataModelForm( + mojom::ActionPersistence::kFill, form, form.fields.front(), profile, + /*cvc=*/std::nullopt, form_structure, autofill_field); const auto& filled_fields = filled_form.fields; EXPECT_TRUE(filled_fields[0].is_autofilled); @@ -3129,7 +3129,7 @@ test_api(*browser_autofill_manager_) .FillOrPreviewDataModelForm( mojom::ActionPersistence::kFill, form, form.fields.front(), - personal_data().GetProfiles().front(), /*optional_cvc=*/nullptr, + personal_data().GetProfiles().front(), /*cvc=*/std::nullopt, form_structure, autofill_field); // Undo early returns if it has no filling history for the trigger field, @@ -3203,7 +3203,7 @@ test_api(*browser_autofill_manager_) .FillOrPreviewDataModelForm( mojom::ActionPersistence::kFill, form, form.fields.front(), - personal_data().GetCreditCards()[0], /*optional_cvc=*/nullptr, + personal_data().GetCreditCards()[0], /*cvc=*/std::nullopt, form_structure, autofill_field); }
diff --git a/components/autofill/core/browser/data_model/autofill_i18n_api.cc b/components/autofill/core/browser/data_model/autofill_i18n_api.cc index 2889b8e..d4eac52 100644 --- a/components/autofill/core/browser/data_model/autofill_i18n_api.cc +++ b/components/autofill/core/browser/data_model/autofill_i18n_api.cc
@@ -330,6 +330,11 @@ return false; } + if (country_code == AddressCountryCode("IN") && + !base::FeatureList::IsEnabled(features::kAutofillUseINAddressModel)) { + return false; + } + return kAutofillModelRules.find(country_code.value()) != kAutofillModelRules.end(); }
diff --git a/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc b/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc index a59346c..bcaacc6 100644 --- a/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc +++ b/components/autofill/core/browser/data_model/autofill_i18n_api_unittest.cc
@@ -62,50 +62,43 @@ }; TEST_F(AutofillI18nApiTest, GetAddressComponentModel_ReturnsNonEmptyModel) { - for (const auto& [country_code, properties] : kAutofillModelRules) { - // Make sure that the process of building the model finishes and returns a - // non empty hierarchy. - AddressComponentsStore model = CreateAddressComponentModel( - AddressCountryCode(std::string(country_code))); + CountryDataMap *country_data_map = CountryDataMap::GetInstance(); + for (const std::string &country_code : country_data_map->country_codes()) { + // Make sure that the process of building the model finishes and returns a + // non empty hierarchy. + AddressComponentsStore model = + CreateAddressComponentModel(AddressCountryCode(country_code)); - FieldTypeSet field_type_set; - model.Root()->GetSupportedTypes(&field_type_set); - EXPECT_FALSE(field_type_set.empty()); - EXPECT_FALSE(field_type_set.contains_any( - {NO_SERVER_DATA, UNKNOWN_TYPE, EMPTY_TYPE})); + FieldTypeSet field_type_set; + model.Root()->GetSupportedTypes(&field_type_set); + EXPECT_FALSE(field_type_set.empty()); + EXPECT_FALSE(field_type_set.contains_any( + {NO_SERVER_DATA, UNKNOWN_TYPE, EMPTY_TYPE})); - EXPECT_EQ(test_api(model.Root()).GetRootNode().GetStorageType(), - ADDRESS_HOME_ADDRESS); - } + EXPECT_EQ(test_api(model.Root()).GetRootNode().GetStorageType(), + ADDRESS_HOME_ADDRESS); + } } TEST_F(AutofillI18nApiTest, GetAddressComponentModel_ReturnedModelIsTree) { - for (const auto& [country_code, tree_def] : kAutofillModelRules) { + CountryDataMap *country_data_map = CountryDataMap::GetInstance(); + for (const std::string &country_code : country_data_map->country_codes()) { // Currently, the model for kAddressModel should comprise all the nodes in // the rules. - AddressComponentsStore model = CreateAddressComponentModel( - AddressCountryCode(std::string(country_code))); + AddressComponentsStore model = + CreateAddressComponentModel(AddressCountryCode(country_code)); AddressComponent* root = model.Root(); FieldTypeSet supported_types; EXPECT_TRUE(IsTree(root, &supported_types)); - - // Test that all field types in the country rules are accessible through - // the root (i.e. the tree is connected). - for (const auto& [node_type, children_types] : tree_def) { - EXPECT_TRUE(test_api(root).GetNodeForType(node_type)); - - for (FieldType child_type : children_types) { - EXPECT_TRUE(test_api(root).GetNodeForType(child_type)); - } - } } } TEST_F(AutofillI18nApiTest, GetAddressComponentModel_CountryNodeHasValue) { - for (const auto& [country_code, tree_def] : kAutofillModelRules) { - AddressComponentsStore model = CreateAddressComponentModel( - AddressCountryCode(std::string(country_code))); + CountryDataMap *country_data_map = CountryDataMap::GetInstance(); + for (const std::string &country_code : country_data_map->country_codes()) { + AddressComponentsStore model = + CreateAddressComponentModel(AddressCountryCode(country_code)); std::u16string expected_country = country_code != kLegacyHierarchyCountryCodeString ? base::UTF8ToUTF16(country_code)
diff --git a/components/autofill/core/browser/data_model/autofill_i18n_hierarchies.h b/components/autofill/core/browser/data_model/autofill_i18n_hierarchies.h index 50a8184..7285ec32 100644 --- a/components/autofill/core/browser/data_model/autofill_i18n_hierarchies.h +++ b/components/autofill/core/browser/data_model/autofill_i18n_hierarchies.h
@@ -11,6 +11,7 @@ #include <string_view> #include "base/containers/fixed_flat_map.h" +#include "base/containers/fixed_flat_set.h" #include "base/containers/span.h" #include "components/autofill/core/browser/field_types.h" @@ -27,6 +28,12 @@ inline constexpr FieldType kFieldTypeChildren_DE_ADDRESS_HOME_STREET_LOCATION[] = {ADDRESS_HOME_STREET_NAME, ADDRESS_HOME_HOUSE_NUMBER}; inline constexpr FieldType kFieldTypeChildren_DE_ADDRESS_HOME_STREET_ADDRESS[] = {ADDRESS_HOME_STREET_LOCATION, ADDRESS_HOME_OVERFLOW}; inline constexpr FieldType kFieldTypeChildren_DE_ADDRESS_HOME_ADDRESS[] = {ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_CITY, ADDRESS_HOME_STATE, ADDRESS_HOME_ZIP, ADDRESS_HOME_COUNTRY}; +// Field types for country IN. +inline constexpr FieldType kFieldTypeChildren_IN_ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY[] = {ADDRESS_HOME_STREET_LOCATION, ADDRESS_HOME_DEPENDENT_LOCALITY}; +inline constexpr FieldType kFieldTypeChildren_IN_ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK[] = {ADDRESS_HOME_LANDMARK, ADDRESS_HOME_DEPENDENT_LOCALITY}; +inline constexpr FieldType kFieldTypeChildren_IN_ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK[] = {ADDRESS_HOME_STREET_LOCATION, ADDRESS_HOME_LANDMARK}; +inline constexpr FieldType kFieldTypeChildren_IN_ADDRESS_HOME_STREET_ADDRESS[] = {ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY, ADDRESS_HOME_LANDMARK, ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK, ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK}; +inline constexpr FieldType kFieldTypeChildren_IN_ADDRESS_HOME_ADDRESS[] = {ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_CITY, ADDRESS_HOME_STATE, ADDRESS_HOME_ZIP, ADDRESS_HOME_COUNTRY}; // Field types for country MX. inline constexpr FieldType kFieldTypeChildren_MX_ADDRESS_HOME_STREET_LOCATION[] = {ADDRESS_HOME_STREET_NAME, ADDRESS_HOME_HOUSE_NUMBER}; inline constexpr FieldType kFieldTypeChildren_MX_ADDRESS_HOME_APT[] = {ADDRESS_HOME_APT_TYPE, ADDRESS_HOME_APT_NUM}; @@ -66,6 +73,13 @@ FieldTypeDescription{.field_type = ADDRESS_HOME_STREET_LOCATION, .children = kFieldTypeChildren_DE_ADDRESS_HOME_STREET_LOCATION}, FieldTypeDescription{.field_type = ADDRESS_HOME_STREET_ADDRESS, .children = kFieldTypeChildren_DE_ADDRESS_HOME_STREET_ADDRESS}, FieldTypeDescription{.field_type = ADDRESS_HOME_ADDRESS, .children = kFieldTypeChildren_DE_ADDRESS_HOME_ADDRESS}}; +// Node properties for country IN. +inline constexpr FieldTypeDescription kModel_IN[] = { + FieldTypeDescription{.field_type = ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY, .children = kFieldTypeChildren_IN_ADDRESS_HOME_STREET_LOCATION_AND_LOCALITY}, + FieldTypeDescription{.field_type = ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK, .children = kFieldTypeChildren_IN_ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK}, + FieldTypeDescription{.field_type = ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK, .children = kFieldTypeChildren_IN_ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK}, + FieldTypeDescription{.field_type = ADDRESS_HOME_STREET_ADDRESS, .children = kFieldTypeChildren_IN_ADDRESS_HOME_STREET_ADDRESS}, + FieldTypeDescription{.field_type = ADDRESS_HOME_ADDRESS, .children = kFieldTypeChildren_IN_ADDRESS_HOME_ADDRESS}}; // Node properties for country MX. inline constexpr FieldTypeDescription kModel_MX[] = { FieldTypeDescription{.field_type = ADDRESS_HOME_STREET_LOCATION, .children = kFieldTypeChildren_MX_ADDRESS_HOME_STREET_LOCATION}, @@ -94,11 +108,20 @@ base::MakeFixedFlatMap<std::string_view, base::span<const FieldTypeDescription>>({ {"BR", kModel_BR}, {"DE", kModel_DE}, + {"IN", kModel_IN}, {"MX", kModel_MX}, {"US", kModel_US}, {"XX", kModel_XX} }); +// Set of pairs (country_code, field_type) that represent collection of +// synthesized nodes for all countries. +inline constexpr auto kAutofillSynthesizeNodes = + base::MakeFixedFlatSet<std::pair<std::string_view, FieldType>>({ + {"IN", ADDRESS_HOME_DEPENDENT_LOCALITY_AND_LANDMARK}, + {"IN", ADDRESS_HOME_STREET_LOCATION_AND_LANDMARK} + }); + } // namespace autofill::i18n_model_definition #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_I18N_HIERARCHIES_H_
diff --git a/components/autofill/core/browser/data_model/autofill_profile.cc b/components/autofill/core/browser/data_model/autofill_profile.cc index 0a1e1c61..76e1895 100644 --- a/components/autofill/core/browser/data_model/autofill_profile.cc +++ b/components/autofill/core/browser/data_model/autofill_profile.cc
@@ -928,13 +928,11 @@ } } -bool AutofillProfile::SaveAdditionalInfo(const AutofillProfile& profile, +void AutofillProfile::SaveAdditionalInfo(const AutofillProfile& profile, const std::string& app_locale) { - AutofillProfileComparator comparator(app_locale); - // SaveAdditionalInfo should not have been called if the profiles were not // already deemed to be mergeable. - DCHECK(comparator.AreMergeable(*this, profile)); + DCHECK(AutofillProfileComparator(app_locale).AreMergeable(*this, profile)); if (MergeDataFrom(profile, app_locale)) { AutofillMetrics::LogProfileActionOnFormSubmitted( @@ -943,7 +941,6 @@ AutofillMetrics::LogProfileActionOnFormSubmitted( AutofillMetrics::EXISTING_PROFILE_USED); } - return true; } // static
diff --git a/components/autofill/core/browser/data_model/autofill_profile.h b/components/autofill/core/browser/data_model/autofill_profile.h index 0084fb3..7c5cedd 100644 --- a/components/autofill/core/browser/data_model/autofill_profile.h +++ b/components/autofill/core/browser/data_model/autofill_profile.h
@@ -182,8 +182,7 @@ // Saves info from |profile| into |this|, provided |this| and |profile| do not // have any direct conflicts (i.e. data is present but different). - // Returns true if |this| and |profile| are similar. - bool SaveAdditionalInfo(const AutofillProfile& profile, + void SaveAdditionalInfo(const AutofillProfile& profile, const std::string& app_locale); // Creates a differentiating label for each of the |profiles|.
diff --git a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc index 93b2364..e820493 100644 --- a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc +++ b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
@@ -1560,7 +1560,7 @@ b.SetRawInfo(NAME_FULL, u"Marion Mitchell Morrison"); b.FinalizeAfterImport(); - EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US")); + a.SaveAdditionalInfo(b, "en-US"); EXPECT_EQ(u"Marion", a.GetRawInfo(NAME_FIRST)); EXPECT_EQ(u"Mitchell", a.GetRawInfo(NAME_MIDDLE)); @@ -1579,7 +1579,7 @@ AutofillProfile b = a; b.SetRawInfo(NAME_FULL, u""); - EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US")); + a.SaveAdditionalInfo(b, "en-US"); EXPECT_EQ(u"Marion", a.GetRawInfo(NAME_FIRST)); EXPECT_EQ(u"Mitchell", a.GetRawInfo(NAME_MIDDLE)); @@ -1608,7 +1608,7 @@ b.SetRawInfoWithVerificationStatus(NAME_FULL, u"", kObserved); b.FinalizeAfterImport(); - EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US")); + a.SaveAdditionalInfo(b, "en-US"); // The first, middle and last names should have their first letter in // uppercase and have acquired diacritics. @@ -1632,7 +1632,7 @@ AutofillProfile b = a; b.SetRawInfo(NAME_MIDDLE, u""); - EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US")); + a.SaveAdditionalInfo(b, "en-US"); EXPECT_EQ(u"Marion", a.GetRawInfo(NAME_FIRST)); EXPECT_EQ(u"Mitchell", a.GetRawInfo(NAME_MIDDLE)); @@ -1653,7 +1653,7 @@ b.SetRawInfo(NAME_FULL, u"Marion Mitchell Morrison"); b.FinalizeAfterImport(); - EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US")); + a.SaveAdditionalInfo(b, "en-US"); // The first, middle and last names should be kept and name full should be // added.
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.cc b/components/autofill/core/browser/data_model/autofill_structured_address.cc index 94c9b99c..e5c4cbfb 100644 --- a/components/autofill/core/browser/data_model/autofill_structured_address.cc +++ b/components/autofill/core/browser/data_model/autofill_structured_address.cc
@@ -21,7 +21,6 @@ #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/geo/address_rewriter.h" #include "components/autofill/core/browser/geo/alternative_state_name_map.h" -#include "components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.h" #include "components/autofill/core/common/autofill_features.h" namespace autofill { @@ -152,12 +151,8 @@ } // Otherwise, prefer the longer or shorter street address depending on the // feature `kAutofillConvergeToExtremeLengthStreetAddress` parameterization. - const bool has_newer_value_precedence = - features::kAutofillConvergeToLonger.Get() ? old_length < new_length - : old_length > new_length; - autofill_metrics::LogAddressUpdateLengthConvergenceStatus( - has_newer_value_precedence); - return has_newer_value_precedence; + return features::kAutofillConvergeToLonger.Get() ? old_length < new_length + : old_length > new_length; } return false; }
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc index f58364a..803cc03 100644 --- a/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc +++ b/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc
@@ -767,166 +767,45 @@ .empty()); } -struct HasNewerStreetAddressPrecedenceInMergingTestCase { - // State and parameterization of feature - // `kAutofillConvergeToExtremeLengthStreetAddress`. - enum class FeatureState { - kDisabled = 0, - kShorter = 1, - kLonger = 2 - } feature_state; - std::u16string old_street_address_name, new_street_address_name; - VerificationStatus old_street_address_status, new_street_address_status; - bool expect_newer_precedence; -}; - -class HasNewerStreetAddressPrecedenceInMergingTest - : public testing::TestWithParam< - HasNewerStreetAddressPrecedenceInMergingTestCase> { - public: - HasNewerStreetAddressPrecedenceInMergingTest() { - using TestFeatureState = - HasNewerStreetAddressPrecedenceInMergingTestCase::FeatureState; - HasNewerStreetAddressPrecedenceInMergingTestCase test_case = GetParam(); - old_address_ = i18n_model_definition::CreateAddressComponentModel(); - test_api(old_address_.Root()) - .GetNodeForType(ADDRESS_HOME_COUNTRY) - ->SetValue(u"US", VerificationStatus::kParsed); - new_address_ = i18n_model_definition::CreateAddressComponentModel(); - test_api(new_address_.Root()) - .GetNodeForType(ADDRESS_HOME_COUNTRY) - ->SetValue(u"US", VerificationStatus::kParsed); - if (test_case.feature_state != TestFeatureState::kDisabled) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kAutofillConvergeToExtremeLengthStreetAddress, - {{features::kAutofillConvergeToLonger.name, - test_case.feature_state == TestFeatureState::kLonger ? "true" - : "false"}}); - } else { - scoped_feature_list_.InitAndDisableFeature( - features::kAutofillConvergeToExtremeLengthStreetAddress); - } - } - - protected: - base::test::ScopedFeatureList scoped_feature_list_; - AddressComponentsStore old_address_; - AddressComponentsStore new_address_; -}; - // Tests the logging of which street name (old or new) was chosen during merging // when the feature `kAutofillConvergeToExtremeLengthStreetAddress` is enabled. -TEST_P(HasNewerStreetAddressPrecedenceInMergingTest, - HasNewerStreetAddressPrecedenceInMergingTestCase) { - HasNewerStreetAddressPrecedenceInMergingTestCase test_case = GetParam(); - auto* old_street = - test_api(old_address_.Root()).GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); - auto* new_street = - test_api(new_address_.Root()).GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); - old_street->SetValue(test_case.old_street_address_name, - test_case.old_street_address_status); - new_street->SetValue(test_case.new_street_address_name, - test_case.new_street_address_status); +TEST_F(AutofillStructuredAddress, + NewerAndLongerStreetAddressHasPrecedenceInMerging) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters( + features::kAutofillConvergeToExtremeLengthStreetAddress, + {{features::kAutofillConvergeToLonger.name, "true"}}); - old_street->MergeWithComponent(*new_street); - EXPECT_EQ(old_street->GetValue() == new_street->GetValue(), - test_case.expect_newer_precedence); + AddressComponentsStore old_address_1 = + i18n_model_definition::CreateAddressComponentModel(); + AddressComponentsStore old_address_2 = + i18n_model_definition::CreateAddressComponentModel(); + AddressComponentsStore new_longer_address = + i18n_model_definition::CreateAddressComponentModel(); + AddressComponentsStore new_shorter_address = + i18n_model_definition::CreateAddressComponentModel(); + auto* old_street_1 = test_api(old_address_1.Root()) + .GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); + auto* old_street_2 = test_api(old_address_2.Root()) + .GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); + auto* new_longer_street = test_api(new_longer_address.Root()) + .GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); + auto* new_shorter_street = test_api(new_shorter_address.Root()) + .GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); + + old_street_1->SetValue(u"123 Main Street Av", VerificationStatus::kParsed); + old_street_2->SetValue(u"123 Main Street Av", VerificationStatus::kParsed); + new_longer_street->SetValue(u"123 Main Street Avenue", + VerificationStatus::kParsed); + new_shorter_street->SetValue(u"123 Main St Av", VerificationStatus::kParsed); + + old_street_1->MergeWithComponent(*new_longer_street); + EXPECT_EQ(old_street_1->GetValue(), new_longer_street->GetValue()); + + old_street_2->MergeWithComponent(*new_shorter_street); + EXPECT_NE(old_street_2->GetValue(), new_shorter_street->GetValue()); } -INSTANTIATE_TEST_SUITE_P( - StreetAddressConvergenceTest, - HasNewerStreetAddressPrecedenceInMergingTest, - testing::Values( - // When the feature is disabled, always prefer the newer value. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kDisabled, - .old_street_address_name = u"205 Main Street", - .new_street_address_name = u"205 Main St", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = true}, - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kDisabled, - .old_street_address_name = u"205 Main St", - .new_street_address_name = u"205 Main Street", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = true}, - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kDisabled, - .old_street_address_name = u"205 Main St", - .new_street_address_name = u"205 Main Street", - .old_street_address_status = VerificationStatus::kUserVerified, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = false}, - // Converge to longer --> prefer the new one. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kLonger, - .old_street_address_name = u"205 Main St", - .new_street_address_name = u"205 Main Street", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = true}, - // Converge to longer --> prefer the old one. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kLonger, - .old_street_address_name = u"205 Main Street", - .new_street_address_name = u"205 Main St", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = false}, - // Converge to longer, but prefer the new one, having better status. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kLonger, - .old_street_address_name = u"205 Main Street", - .new_street_address_name = u"205 Main St", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kUserVerified, - .expect_newer_precedence = true}, - // Converge to shorter --> prefer the new one. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kShorter, - .old_street_address_name = u"205 Main Street", - .new_street_address_name = u"205 Main St", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = true}, - // Converge to shorter --> prefer the old one. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kShorter, - .old_street_address_name = u"205 Main St", - .new_street_address_name = u"205 Main Street", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = false}, - // Converge to shorter, but prefer the old one, having better status. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kShorter, - .old_street_address_name = u"205 Main Street", - .new_street_address_name = u"205 Main St", - .old_street_address_status = VerificationStatus::kUserVerified, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = false}, - // Equivalent post rewriting, same status, same length --> prefer the - // old one. - HasNewerStreetAddressPrecedenceInMergingTestCase{ - .feature_state = HasNewerStreetAddressPrecedenceInMergingTestCase:: - FeatureState::kShorter, - .old_street_address_name = u"205 Main Street Av", - .new_street_address_name = u"205 Main St Avenue", - .old_street_address_status = VerificationStatus::kParsed, - .new_street_address_status = VerificationStatus::kParsed, - .expect_newer_precedence = false})); - struct MergeStatesWithCanonicalNamesTestCase { std::string older_state; VerificationStatus older_status;
diff --git a/components/autofill/core/browser/data_model/bank_account.cc b/components/autofill/core/browser/data_model/bank_account.cc index 95a768c..41766f4 100644 --- a/components/autofill/core/browser/data_model/bank_account.cc +++ b/components/autofill/core/browser/data_model/bank_account.cc
@@ -22,7 +22,12 @@ : PaymentInstrument(instrument_id, nickname, display_icon_url), bank_name_(bank_name), account_number_suffix_(account_number_suffix), - account_type_(account_type) {} + account_type_(account_type) { + // This is hardcoded since BankAccounts are only supported for the Pix payment + // rails. When this condition changes, the supported payment rails would need + // to be added and retrieved from the autofill table. + AddPaymentRail(PaymentInstrument::PaymentRail::kPix); +} BankAccount::~BankAccount() = default; @@ -31,15 +36,15 @@ } bool BankAccount::AddToDatabase(PaymentsAutofillTable* database) const { - return database->AddBankAccount(*this); + return database->AddMaskedBankAccount(*this); } bool BankAccount::UpdateInDatabase(PaymentsAutofillTable* database) const { - return database->UpdateBankAccount(*this); + return database->UpdateMaskedBankAccount(*this); } bool BankAccount::DeleteFromDatabase(PaymentsAutofillTable* database) const { - return database->RemoveBankAccount(*this); + return database->RemoveMaskedBankAccount(*this); } } // namespace autofill
diff --git a/components/autofill/core/browser/data_model/bank_account_unittest.cc b/components/autofill/core/browser/data_model/bank_account_unittest.cc index 97dad9e6..00cefa3 100644 --- a/components/autofill/core/browser/data_model/bank_account_unittest.cc +++ b/components/autofill/core/browser/data_model/bank_account_unittest.cc
@@ -20,6 +20,7 @@ EXPECT_EQ(BankAccount::AccountType::kChecking, bank_account.account_type()); EXPECT_EQ(PaymentInstrument::InstrumentType::kBankAccount, bank_account.GetInstrumentType()); + EXPECT_TRUE(bank_account.IsSupported(PaymentInstrument::PaymentRail::kPix)); } } // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/regex_patterns.cc b/components/autofill/core/browser/form_parsing/regex_patterns.cc index aff93a5..81e803df 100644 --- a/components/autofill/core/browser/form_parsing/regex_patterns.cc +++ b/components/autofill/core/browser/form_parsing/regex_patterns.cc
@@ -32,13 +32,13 @@ CHECK(it != kPatternMap.end()); #if BUILDFLAG(USE_INTERNAL_AUTOFILL_PATTERNS) switch (pattern_source) { - case PatternSource::kDefault: - return it->second[0]; - case PatternSource::kExperimental: - return it->second[1]; - case PatternSource::kNextGen: - return it->second[2]; case PatternSource::kLegacy: + return it->second[0]; + case PatternSource::kDefault: + return it->second[1]; + case PatternSource::kExperimental: + return it->second[2]; + case PatternSource::kNextGen: return it->second[3]; } #else @@ -93,4 +93,10 @@ }; } +bool AreMatchingPatternsEqual(PatternSource a, + PatternSource b, + LanguageCode language_code) { + return AreMatchingPatternsEqualImpl(a, b, language_code); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/regex_patterns.h b/components/autofill/core/browser/form_parsing/regex_patterns.h index 9f550bb..5b7f4c1 100644 --- a/components/autofill/core/browser/form_parsing/regex_patterns.h +++ b/components/autofill/core/browser/form_parsing/regex_patterns.h
@@ -118,6 +118,13 @@ // pattern name. bool IsSupportedLanguageCode(LanguageCode language_code); +// Checks if all the matching patterns for the given PatternSources and +// language are the same - meaning that computing predictions for both is +// unnecessary, since it will yield the same result. +bool AreMatchingPatternsEqual(PatternSource a, + PatternSource b, + LanguageCode language_code); + } // namespace autofill #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_REGEX_PATTERNS_H_
diff --git a/components/autofill/core/browser/form_parsing/transpile_regex_patterns.py b/components/autofill/core/browser/form_parsing/transpile_regex_patterns.py index f18b7e9..b841557 100755 --- a/components/autofill/core/browser/form_parsing/transpile_regex_patterns.py +++ b/components/autofill/core/browser/form_parsing/transpile_regex_patterns.py
@@ -28,6 +28,61 @@ import json5 as json +# Generates a function AreMatchingPatternsEqualImpl(a, b, lang_code), which +# tests whether the patterns for PatternSources a and b in language lang_code +# match. This can be used to avoid unnecessarily recomputing heuristics. +# All return values are precomputed, making this a constant time operation at +# runtime. +# - `name_to_lang_to_id_to_patternrefs`: See `generate_cpp_constants()` for a +# description. +# - `lang_array`: A sorted list language codes for which lookups should be +# precomputed. +# - [`min_pattern_id`, `max_pattern_id`] all valid PatternSources IDs for which +# lookups should be precomputed. +def generate_matching_pattern_equals(name_to_lang_to_id_to_patternrefs, + lang_array, min_pattern_id, max_pattern_id): + # Tests if all patterns of `lang` match between to pattern source ids. + # "PATTERN_SOURCE_DUMMY" is ignored, since it is only just to identify the + # patterns for debugging purposes. + def patterns_match(a_id, b_id, lang): + return all(lang_to_id_to_patternrefs[lang][a_id] == + lang_to_id_to_patternrefs[lang][b_id] + for name, lang_to_id_to_patternrefs in + name_to_lang_to_id_to_patternrefs.items() + if name != "PATTERN_SOURCE_DUMMY") + + yield '// Checks if all the matching patterns for the given PatternSources' + yield '// and language are the same - meaning that computing predictions for' + yield '// both is unnecessary, since it will yield the same result.' + yield 'constexpr bool AreMatchingPatternsEqualImpl(PatternSource a,' + yield ' PatternSource b,' + yield ' LanguageCode lang_code) {' + yield ' if (a == b) {' + yield ' return true;' + yield ' }' + yield ' auto a_id = base::to_underlying(a);' + yield ' auto b_id = base::to_underlying(b);' + yield ' if (a_id > b_id) {' + yield ' std::swap(a_id, b_id);' + yield ' }' + + # Precompute the result for all provided pattern ids and languages. + for a_id in range(min_pattern_id, max_pattern_id + 1): + for b_id in range(a_id + 1, max_pattern_id + 1): + langs = [lang for lang in lang_array if patterns_match(a_id, b_id, lang)] + if langs == []: + continue + yield f' if (a_id == {a_id} && b_id == {b_id}) {{' + if langs == lang_array: + yield ' return true;' + else: + disjunction = " || ".join(f"*lang_code == \"{lang}\"" for lang in langs) + yield f' return {disjunction};' + yield ' }' + + yield ' return false;' + yield '}' + # Generates a set of C++ constexpr constants to facilitate lookup of a set of # MatchingPatterns by a given tuple (pattern name, language code). # @@ -268,15 +323,20 @@ yield '' language_array = sorted( - set(f'"{lang}"' for lang_to_id_to_patternrefs in + set(lang for lang_to_id_to_patternrefs in name_to_lang_to_id_to_patternrefs.values() for lang in lang_to_id_to_patternrefs.keys() if lang != '')) yield '// The set of language codes across all language source ids and' yield '// pattern names.' yield 'constexpr auto kLanguages = base::MakeFixedFlatSet<const char*>({' - yield f' {", ".join(language_array)}' + quoted_languages = [f'"{lang}"' for lang in language_array] + yield f' {", ".join(quoted_languages)}' yield '}, LanguageComparator());' + yield '' + yield from generate_matching_pattern_equals(name_to_lang_to_id_to_patternrefs, + language_array, min_pattern_id, max_pattern_id) + def generate_cpp_lines(id_to_name_to_lang_to_patterns): yield """// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be @@ -285,12 +345,14 @@ #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_REGEX_PATTERNS_INL_H_ #define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_REGEX_PATTERNS_INL_H_ +#include <algorithm> #include <array> #include "base/containers/fixed_flat_map.h" #include "base/containers/fixed_flat_set.h" #include "base/containers/span.h" #include "base/strings/string_piece.h" +#include "base/types/cxx23_to_underlying.h" #include "components/autofill/core/browser/form_parsing/regex_patterns.h" #include "components/autofill/core/common/dense_set.h"
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index e84dacb..8a99d9b 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -199,22 +199,13 @@ log_manager); // The active heuristic source might not be a pattern source. + std::optional<FieldCandidatesMap> active_predictions; if (std::optional<PatternSource> pattern_source = GetActivePatternSource()) { context.pattern_source = *pattern_source; - AssignBestFieldTypes(ParseFieldTypesWithPatterns(context), *pattern_source); + active_predictions = ParseFieldTypesWithPatterns(context); + AssignBestFieldTypes(*active_predictions, *pattern_source); } - - if (!base::FeatureList::IsEnabled( - features::kAutofillDisableShadowHeuristics)) { - for (HeuristicSource heuristic_source : GetNonActiveHeuristicSources()) { - if (auto shadow_source = - HeuristicSourceToPatternSource(heuristic_source)) { - context.pattern_source = *shadow_source; - AssignBestFieldTypes(ParseFieldTypesWithPatterns(context), - *shadow_source); - } - } - } + DetermineNonActiveHeuristicTypes(std::move(active_predictions), context); UpdateAutofillCount(); IdentifySections(/*ignore_autocomplete=*/false); @@ -248,6 +239,34 @@ LogDetermineHeuristicTypesMetrics(); } +void FormStructure::DetermineNonActiveHeuristicTypes( + std::optional<FieldCandidatesMap> active_predictions, + ParsingContext& context) { + if (base::FeatureList::IsEnabled( + features::kAutofillDisableShadowHeuristics)) { + return; + } + std::optional<PatternSource> active_pattern_source = + HeuristicSourceToPatternSource(GetActiveHeuristicSource()); + for (HeuristicSource heuristic_source : GetNonActiveHeuristicSources()) { + std::optional<PatternSource> pattern_source = + HeuristicSourceToPatternSource(heuristic_source); + if (!pattern_source) { + continue; + } + if (active_pattern_source && + AreMatchingPatternsEqual(*active_pattern_source, *pattern_source, + context.page_language)) { + // No need to recompute the predictions - just copy the results. + AssignBestFieldTypes(*active_predictions, *pattern_source); + } else { + // Run heuristics. + context.pattern_source = *pattern_source; + ParseFieldTypesWithPatterns(context); + } + } +} + // static std::vector<FormDataPredictions> FormStructure::GetFieldTypePredictions( const std::vector<raw_ptr<FormStructure, VectorExperimental>>& @@ -556,9 +575,12 @@ UpdateAutofillCount(); - // Update form parsed timestamp + // Preserve timestamp from the cache as a new form from the renderer does not + // know the parsing/filling history, as this information is computed in the + // browser. form_parsed_timestamp_ = std::min(form_parsed_timestamp_, cached_form.form_parsed_timestamp_); + last_filling_timestamp_ = cached_form.last_filling_timestamp_; // The form signature should match between query and upload requests to the // server. On many websites, form elements are dynamically added, removed, or
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h index 0301c77..984e9956 100644 --- a/components/autofill/core/browser/form_structure.h +++ b/components/autofill/core/browser/form_structure.h
@@ -309,6 +309,13 @@ return form_parsed_timestamp_; } + std::optional<base::TimeTicks> last_filling_timestamp() const { + return last_filling_timestamp_; + } + void set_last_filling_timestamp(base::TimeTicks last_filling_timestamp) { + last_filling_timestamp_ = last_filling_timestamp; + } + bool all_fields_are_passwords() const { return all_fields_are_passwords_; } FormSignature form_signature() const { return form_signature_; } @@ -390,6 +397,16 @@ // Sets the rank of each field in the form. void DetermineFieldRanks(); + // Considers all `GetNonActiveHeuristicSources()` and computes predictions + // for the PatternSources among them. If some of them match the + // `active_predictions`, applying the regexes is skipped entirely. + // `active_predictions` is nullopt if the active HeuristicSource is not a + // PatternSource. + // Reuses the `context` used to compute the main predictions for caching. + void DetermineNonActiveHeuristicTypes( + std::optional<FieldCandidatesMap> active_predictions, + ParsingContext& context); + // Classifies each field using the regular expressions. The classifications // are returned, but not assigned to the `fields_` yet. Use // `AssignBestFieldTypes()` to do so. @@ -510,6 +527,9 @@ // The timestamp (not wallclock time) when this form was initially parsed. base::TimeTicks form_parsed_timestamp_; + // The timestamp (not wallclock time) when this form was last filled. + std::optional<base::TimeTicks> last_filling_timestamp_; + // If phone number rationalization has been performed for a given section. std::set<Section> phone_rationalized_;
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine.cc b/components/autofill/core/browser/form_structure_rationalization_engine.cc index bd0050d7..583dfe9 100644 --- a/components/autofill/core/browser/form_structure_rationalization_engine.cc +++ b/components/autofill/core/browser/form_structure_rationalization_engine.cc
@@ -267,52 +267,86 @@ const std::vector<std::unique_ptr<AutofillField>>& fields, LogManager* log_manager) { auto create_rules = [] { - return std::to_array( - {RationalizationRuleBuilder() - // A name for the rule (for logging purposes). - .SetRuleName("Fix colonia as address-line2 in MX") + return std::to_array({ + RationalizationRuleBuilder() + // A name for the rule (for logging purposes). + .SetRuleName("Fix colonia as address-line2 in MX") - // Only if the requirements specified in the environment are all - // met, the RationalizationRule is executed. - .SetEnvironmentCondition( - EnvironmentConditionBuilder() - .SetCountryList({GeoIpCountryCode("MX")}) - .SetFeature( - &features::kAutofillEnableRationalizationEngineForMX) - .Build()) + // Only if the requirements specified in the environment are all + // met, the RationalizationRule is executed. + .SetEnvironmentCondition( + EnvironmentConditionBuilder() + .SetCountryList({GeoIpCountryCode("MX")}) + .SetFeature( + &features::kAutofillEnableRationalizationEngineForMX) + .Build()) - // This is the core field to which the rule applies. - .SetTriggerField(FieldCondition{ - // The trigger field needs to be an ADDRESS_HOME_LINE2. - .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE2}, - // Lookup in legacy_regex_patterns. - .regex_reference_match = "ADDRESS_HOME_DEPENDENT_LOCALITY", - }) + // This is the core field to which the rule applies. + .SetTriggerField(FieldCondition{ + // The trigger field needs to be an ADDRESS_HOME_LINE2. + .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE2}, + // Lookup in legacy_regex_patterns. + .regex_reference_match = "ADDRESS_HOME_DEPENDENT_LOCALITY", + }) - // All of the following conditions need to be met for actions to be - // executed. The .location specifies which fields to consider. It - // also binds the fields to a label that is later referenced in - // actions. - .SetOtherFieldConditions({ - FieldCondition{ - .location = FieldLocation::kLastClassifiedPredecessor, - .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE1}, - }, - }) + // All of the following conditions need to be met for actions to be + // executed. The .location specifies which fields to consider. It + // also binds the fields to a label that is later referenced in + // actions. + .SetOtherFieldConditions({ + FieldCondition{ + .location = FieldLocation::kLastClassifiedPredecessor, + .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE1}, + }, + }) - // What actions to perform on the trigger fields and other fields - // that had conditions. - .SetActions({ - SetTypeAction{ - .target = FieldLocation::kLastClassifiedPredecessor, - .set_overall_type = ADDRESS_HOME_STREET_ADDRESS, - }, - SetTypeAction{ - .target = FieldLocation::kTriggerField, - .set_overall_type = ADDRESS_HOME_DEPENDENT_LOCALITY, - }, - }) - .Build()}); + // What actions to perform on the trigger fields and other fields + // that had conditions. + .SetActions({ + SetTypeAction{ + .target = FieldLocation::kLastClassifiedPredecessor, + .set_overall_type = ADDRESS_HOME_STREET_ADDRESS, + }, + SetTypeAction{ + .target = FieldLocation::kTriggerField, + .set_overall_type = ADDRESS_HOME_DEPENDENT_LOCALITY, + }, + }) + .Build(), + RationalizationRuleBuilder() + .SetRuleName("Fix address-overflow as address-line2 in DE") + .SetEnvironmentCondition( + EnvironmentConditionBuilder() + .SetCountryList({GeoIpCountryCode("DE")}) + .SetFeature(&features::kAutofillUseDEAddressModel) + .Build()) + + .SetTriggerField(FieldCondition{ + .possible_overall_types = FieldTypeSet{ADDRESS_HOME_LINE2}, + .regex_reference_match = "OVERFLOW", // In the case of Germany, + // overflow references the + // Adresszusatz field. + }) + .SetOtherFieldConditions({ + FieldCondition{ + .location = FieldLocation::kLastClassifiedPredecessor, + .possible_overall_types = + FieldTypeSet{ADDRESS_HOME_LINE1, + ADDRESS_HOME_STREET_ADDRESS}, + }, + }) + .SetActions({ + SetTypeAction{ + .target = FieldLocation::kLastClassifiedPredecessor, + .set_overall_type = ADDRESS_HOME_STREET_LOCATION, + }, + SetTypeAction{ + .target = FieldLocation::kTriggerField, + .set_overall_type = ADDRESS_HOME_OVERFLOW, + }, + }) + .Build(), + }); }; static const base::NoDestructor<decltype(create_rules())> kRationalizationRules(create_rules());
diff --git a/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc b/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc index 050c109..7a000f7d8 100644 --- a/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc +++ b/components/autofill/core/browser/form_structure_rationalization_engine_unittest.cc
@@ -420,5 +420,33 @@ ADDRESS_HOME_CITY, ADDRESS_HOME_STATE)); } +// Test that the actions are applied if all conditions are met. +TEST(FormStructureRationalizationEngine, TestDEOverflowRuleIsApplied) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + {kTestFeatureForFormStructureRationalizationEngine, + features::kAutofillUseDEAddressModel}, + {}); + + std::vector<std::unique_ptr<AutofillField>> fields = CreateFields({ + {u"Name", u"n", NAME_FIRST}, + {u"Nachname", u"a", NAME_LAST}, + {u"Straße und Hausnummer", u"addressline1", ADDRESS_HOME_LINE1}, + {u"Adresszusatz", u"adresszusatz", ADDRESS_HOME_LINE2}, + {u"PLZ", u"plz", ADDRESS_HOME_ZIP}, + {u"Ort", u"ort", ADDRESS_HOME_CITY}, + }); + + GeoIpCountryCode kDE = GeoIpCountryCode("DE"); + ParsingContext kDEContext(kDE, LanguageCode("de"), PatternSource::kLegacy); + ApplyRationalizationEngineRules(kDEContext, fields, nullptr); + + EXPECT_THAT(GetTypes(fields), + ElementsAre(NAME_FIRST, NAME_LAST, + /*changed*/ ADDRESS_HOME_STREET_LOCATION, + /*changed*/ ADDRESS_HOME_OVERFLOW, ADDRESS_HOME_ZIP, + ADDRESS_HOME_CITY)); +} + } // namespace } // namespace autofill::rationalization
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index 63fc4c20..f50129c 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -579,21 +579,6 @@ EXPECT_TRUE(form_structure->ShouldBeParsed()); } -// Tests that unmappable autocomplete values containing "address" are treated -// as HtmlFieldType::kUnspecified instead of -// HtmlFieldType::kUnrecognized. -TEST_F(FormStructureTestImpl, IgnoreUnmappableAutocompleteValues) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature( - features::kAutofillIgnoreUnmappableAutocompleteValues); - - CheckFormStructureTestData( - {{{.description_for_logging = "IgnoreUnmappableAutocompleteValues", - .fields = {{.autocomplete_attribute = "address-info"}}}, - {.determine_heuristic_type = true}, - {.expected_html_type = {HtmlFieldType::kUnspecified}}}}); -} - // Tests that ShouldBeParsed returns true for a form containing less than three // fields if at least one has an autocomplete attribute. TEST_F(FormStructureTestImpl, DetermineHeuristicTypes_AutocompleteFalse) {
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc index a9ba0c2..41e5038 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -7078,16 +7078,9 @@ // Dynamically change the form. form.fields.pop_back(); - // Simulate checking whether to fill a dynamic form after the form was filled - // initially. - test_api(autofill_manager()) - .ShouldTriggerRefill(FormStructure(form), - RefillTriggerReason::kFormChanged); - EXPECT_THAT(histogram_tester.GetAllSamples("Autofill.FormEvents.Address"), - BucketsInclude(Bucket(FORM_EVENT_DID_DYNAMIC_REFILL, 0))); - // Trigger a refill, the refill metric should be updated. autofill_manager().OnFormsSeen({form}, /*removed_forms=*/{}); + test_api(autofill_manager()).TriggerRefill(form, /*trigger_details=*/{}); EXPECT_THAT(histogram_tester.GetAllSamples("Autofill.FormEvents.Address"), BucketsInclude(Bucket(FORM_EVENT_DID_DYNAMIC_REFILL, 1))); }
diff --git a/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.cc b/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.cc deleted file mode 100644 index d394b2fc..0000000 --- a/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.cc +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.h" - -#include "base/metrics/histogram_functions.h" - -namespace autofill::autofill_metrics { - -void LogAddressUpdateLengthConvergenceStatus(bool convergence_status) { - base::UmaHistogramBoolean("Autofill.NewerStreetAddressWithSameStatusIsChosen", - convergence_status); -} - -} // namespace autofill::autofill_metrics
diff --git a/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.h b/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.h deleted file mode 100644 index fc32c5cb..0000000 --- a/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics.h +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_CONVERGE_TO_EXTREME_LENGTH_ADDRESS_METRICS_H_ -#define COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_CONVERGE_TO_EXTREME_LENGTH_ADDRESS_METRICS_H_ - -namespace autofill::autofill_metrics { - -// Records the result of trying to merge two token-equivalent addresses with -// equal verification statuses but different string-lengths, whenever the -// feature `kAutofillConvergeToExtremeLengthStreetAddress` is enabled. -void LogAddressUpdateLengthConvergenceStatus(bool convergence_status); - -} // namespace autofill::autofill_metrics - -#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_CONVERGE_TO_EXTREME_LENGTH_ADDRESS_METRICS_H_
diff --git a/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics_unittest.cc b/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics_unittest.cc deleted file mode 100644 index f3295ac6..0000000 --- a/components/autofill/core/browser/metrics/converge_to_extreme_length_address_metrics_unittest.cc +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2023 The Chromium Authors -// 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 "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "components/autofill/core/browser/data_model/autofill_i18n_api.h" -#include "components/autofill/core/browser/data_model/autofill_structured_address_component.h" -#include "components/autofill/core/browser/data_model/autofill_structured_address_component_test_api.h" -#include "components/autofill/core/browser/field_types.h" -#include "components/autofill/core/browser/metrics/autofill_metrics_test_base.h" -#include "components/autofill/core/common/autofill_features.h" -#include "testing/gtest/include/gtest/gtest.h" - -using ::base::Bucket; -using ::base::BucketsAre; - -namespace autofill::autofill_metrics { - -class ConvergeToExtremeLengthAddressMetricsTest - : public autofill_metrics::AutofillMetricsBaseTest, - public testing::Test { - public: - void SetUp() override { - SetUpHelper(); - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kAutofillConvergeToExtremeLengthStreetAddress, - {{features::kAutofillConvergeToLonger.name, "true" /*longer*/}}); - - old_address_ = i18n_model_definition::CreateAddressComponentModel(); - new_address_ = i18n_model_definition::CreateAddressComponentModel(); - old_street_ = test_api(old_address_.Root()) - .GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); - new_street_ = test_api(new_address_.Root()) - .GetNodeForType(ADDRESS_HOME_STREET_ADDRESS); - } - void TearDown() override { TearDownHelper(); } - - protected: - base::test::ScopedFeatureList scoped_feature_list_; - AddressComponentsStore old_address_; - AddressComponentsStore new_address_; - raw_ptr<AddressComponent> old_street_ = nullptr; - raw_ptr<AddressComponent> new_street_ = nullptr; -}; - -// Tests the logging of preferring old street address value during merging, when -// the feature `kAutofillConvergeToExtremeLengthStreetAddress` is enabled. -TEST_F(ConvergeToExtremeLengthAddressMetricsTest, LogPreferringOldValue) { - old_street_->SetValue(u"Wall Street", VerificationStatus::kParsed); - new_street_->SetValue(u"Wall St", VerificationStatus::kParsed); - - base::HistogramTester histogram_tester; - old_street_->MergeWithComponent(*new_street_); - - histogram_tester.ExpectUniqueSample( - "Autofill.NewerStreetAddressWithSameStatusIsChosen", false, 1); -} - -// Tests the logging of preferring new street address value during merging, when -// the feature `kAutofillConvergeToExtremeLengthStreetAddress` is enabled. -TEST_F(ConvergeToExtremeLengthAddressMetricsTest, LogPreferringNewValue) { - old_street_->SetValue(u"Wall St", VerificationStatus::kParsed); - new_street_->SetValue(u"Wall Street", VerificationStatus::kParsed); - - base::HistogramTester histogram_tester; - old_street_->MergeWithComponent(*new_street_); - - histogram_tester.ExpectUniqueSample( - "Autofill.NewerStreetAddressWithSameStatusIsChosen", true, 1); -} - -} // namespace autofill::autofill_metrics
diff --git a/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc b/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc index 8bd3e2e0..6ef777b 100644 --- a/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc +++ b/components/autofill/core/browser/webdata/payments/payments_autofill_table.cc
@@ -183,61 +183,32 @@ // kValueEncrypted = "value_encrypted" // kLastUpdatedTimestamp = "last_updated_timestamp" -constexpr std::string_view kPaymentInstrumentsTable = "payment_instruments"; +constexpr std::string_view kMaskedBankAccountsMetadataTable = + "masked_bank_accounts_metadata"; // kInstrumentId = "instrument_id" -constexpr std::string_view kInstrumentType = "instrument_type"; -// kNickname = "nickname" -constexpr std::string_view kDisplayIconUrl = "display_icon_url"; -constexpr std::initializer_list<std::pair<std::string_view, std::string_view>> - kPaymentInstrumentsColumnNamesAndTypes = { - {kInstrumentId, "INTEGER NOT NULL"}, - {kInstrumentType, "INTEGER NOT NULL"}, - {kDisplayIconUrl, "VARCHAR"}, - {kNickname, "VARCHAR"}}; -constexpr std::initializer_list<std::string_view> - kPaymentInstrumentsCompositePrimaryKey = {kInstrumentId, kInstrumentType}; - -constexpr std::string_view kPaymentInstrumentsMetadataTable = - "payment_instruments_metadata"; -// kInstrumentId = "instrument_id" -// kInstrumentType = "instrument_type" // kUseCount = "use_count" // kUseDate = "use_date" constexpr std::initializer_list<std::pair<std::string_view, std::string_view>> - kPaymentInstrumentsMetadataColumnNamesAndTypes = { + kMaskedBankAccountsMetadataColumnNamesAndTypes = { {kInstrumentId, "INTEGER NOT NULL"}, - {kInstrumentType, "INTEGER NOT NULL"}, {kUseCount, "INTEGER NOT NULL DEFAULT 0"}, {kUseDate, "INTEGER NOT NULL DEFAULT 0"}}; -constexpr std::initializer_list<std::string_view> - kPaymentInstrumentsMetadataCompositePrimaryKey = {kInstrumentId, - kInstrumentType}; -constexpr std::string_view kPaymentInstrumentSupportedRailsTable = - "payment_instrument_supported_rails"; -// kInstrumentId = "instrument_id" -// kInstrumentType = "instrument_type" -constexpr std::string_view kPaymentRail = "payment_rail"; -constexpr std::initializer_list<std::pair<std::string_view, std::string_view>> - kPaymentInstrumentSupportedRailsColumnNamesAndTypes = { - {kInstrumentId, "INTEGER NOT NULL"}, - {kInstrumentType, "INTEGER NOT NULL"}, - {kPaymentRail, "INTEGER NOT NULL"}}; -constexpr std::initializer_list<std::string_view> - kPaymentInstrumentSupportedRailsCompositePrimaryKey = { - kInstrumentId, kInstrumentType, kPaymentRail}; - -constexpr std::string_view kBankAccountsTable = "bank_accounts"; +constexpr std::string_view kMaskedBankAccountsTable = "masked_bank_accounts"; // kInstrumentId = "instrument_id" // kBankName = "bank_name" constexpr std::string_view kAccountNumberSuffix = "account_number_suffix"; constexpr std::string_view kAccountType = "account_type"; +// kNickname = "nickname" +constexpr std::string_view kDisplayIconUrl = "display_icon_url"; constexpr std::initializer_list<std::pair<std::string_view, std::string_view>> - bank_accounts_column_names_and_types = { + kMaskedBankAccountsColumnNamesAndTypes = { {kInstrumentId, "INTEGER PRIMARY KEY NOT NULL"}, {kBankName, "VARCHAR"}, {kAccountNumberSuffix, "VARCHAR"}, - {kAccountType, "INTEGER DEFAULT 0"}}; + {kAccountType, "INTEGER DEFAULT 0"}, + {kDisplayIconUrl, "VARCHAR"}, + {kNickname, "VARCHAR"}}; constexpr std::string_view kMaskedCreditCardBenefitsTable = "masked_credit_card_benefits"; @@ -321,34 +292,15 @@ s->BindInt64(index++, server_cvc.last_updated_timestamp.ToTimeT()); } -void BindPaymentInstrumentToStatement( - sql::Statement* s, - const PaymentInstrument& payment_instrument) { - int index = 0; - s->BindInt64(index++, payment_instrument.instrument_id()); - s->BindInt(index++, static_cast<int>(payment_instrument.GetInstrumentType())); - s->BindString16(index++, payment_instrument.nickname()); - s->BindString(index++, payment_instrument.display_icon_url().spec()); -} - -void BindPaymentInstrumentSupportedRailsToStatement( - sql::Statement* s, - int64_t instrument_id, - PaymentInstrument::InstrumentType instrument_type, - PaymentInstrument::PaymentRail payment_rail) { - int index = 0; - s->BindInt64(index++, instrument_id); - s->BindInt(index++, static_cast<int>(instrument_type)); - s->BindInt(index++, static_cast<int>(payment_rail)); -} - -void BindBankAccountToStatement(sql::Statement* s, - const BankAccount& bank_account) { +void BindMaskedBankAccountToStatement(const BankAccount& bank_account, + sql::Statement* s) { int index = 0; s->BindInt64(index++, bank_account.instrument_id()); s->BindString16(index++, bank_account.bank_name()); s->BindString16(index++, bank_account.account_number_suffix()); s->BindInt(index++, static_cast<int>(bank_account.account_type())); + s->BindString16(index++, bank_account.nickname()); + s->BindString(index++, bank_account.display_icon_url().spec()); } void BindIbanToStatement(const Iban& iban, @@ -475,10 +427,6 @@ } // namespace -PaymentInstrumentFields::PaymentInstrumentFields() = default; - -PaymentInstrumentFields::~PaymentInstrumentFields() = default; - PaymentsAutofillTable::PaymentsAutofillTable() : autofill_table_encryptor_( AutofillTableEncryptorFactory::GetInstance()->Create()) { @@ -503,10 +451,9 @@ InitServerCreditCardCloudTokenDataTable() && InitOfferDataTable() && InitOfferEligibleInstrumentTable() && InitOfferMerchantDomainTable() && InitVirtualCardUsageDataTable() && InitStoredCvcTable() && - InitMaskedIbansTable() && InitMaskedIbansMetadataTable() && - InitBankAccountsTable() && InitPaymentInstrumentsTable() && - InitPaymentInstrumentsMetadataTable() && - InitPaymentInstrumentSupportedRailsTable() && + InitMaskedBankAccountsTable() && + InitMaskedBankAccountsMetadataTable() && InitMaskedIbansTable() && + InitMaskedIbansMetadataTable() && InitMaskedCreditCardBenefitsTable() && InitBenefitMerchantDomainsTable(); } @@ -580,223 +527,58 @@ case 119: *update_compatible_version = true; return MigrateToVersion119AddMaskedIbanTablesAndRenameLocalIbanTable(); - case 120: - *update_compatible_version = false; - return MigrateToVersion120AddPaymentInstrumentAndBankAccountTables(); case 123: *update_compatible_version = false; return MigrateToVersion123AddProductTermsUrlColumnAndAddCardBenefitsTables(); + case 124: + *update_compatible_version = true; + return MigrateToVersion124AndDeletePaymentInstrumentRelatedTablesAndAddMaskedBankAccountTable(); } return true; } -std::unique_ptr<BankAccount> PaymentsAutofillTable::GetBankAccount( - const PaymentInstrumentFields& payment_instrument_fields) { +std::unique_ptr<BankAccount> PaymentsAutofillTable::GetMaskedBankAccount( + int64_t instrument_id) { sql::Statement s; - SelectBuilder(db_, s, kBankAccountsTable, - {kInstrumentId, kBankName, kAccountNumberSuffix, kAccountType}, + SelectBuilder(db_, s, kMaskedBankAccountsTable, + {kBankName, kAccountNumberSuffix, kAccountType, kNickname, + kDisplayIconUrl}, "WHERE instrument_id = ?"); - s.BindInt64(0, payment_instrument_fields.instrument_id); + s.BindInt64(0, instrument_id); if (!s.Step()) { return nullptr; } int index = 0; - auto instrument_id = s.ColumnInt64(index++); auto bank_name = s.ColumnString16(index++); auto account_number_suffix = s.ColumnString16(index++); int account_type = s.ColumnInt(index++); + auto nickname = s.ColumnString16(index++); + auto display_icon_url = s.ColumnString16(index++); if (account_type > static_cast<int>(BankAccount::AccountType::kTransactingAccount) || account_type < static_cast<int>(BankAccount::AccountType::kUnknown)) { return nullptr; } - auto bank_account = std::make_unique<BankAccount>( - instrument_id, payment_instrument_fields.nickname, - payment_instrument_fields.display_icon_url, bank_name, + return std::make_unique<BankAccount>( + instrument_id, nickname, GURL(display_icon_url), bank_name, account_number_suffix, static_cast<BankAccount::AccountType>(account_type)); - for (PaymentInstrument::PaymentRail payment_rail : - payment_instrument_fields.payment_rails) { - bank_account->AddPaymentRail(payment_rail); - } - return bank_account; } -bool PaymentsAutofillTable::AddPaymentInstrument( - const PaymentInstrument& payment_instrument) { - sql::Statement payment_instruments_insert; - InsertBuilder(db_, payment_instruments_insert, kPaymentInstrumentsTable, - {kInstrumentId, kInstrumentType, kNickname, kDisplayIconUrl}); - BindPaymentInstrumentToStatement(&payment_instruments_insert, - payment_instrument); - if (!payment_instruments_insert.Run()) { - return false; - } - - for (PaymentInstrument::PaymentRail payment_rail : - payment_instrument.supported_rails()) { - sql::Statement payment_instrument_supported_rails_insert; - InsertBuilder(db_, payment_instrument_supported_rails_insert, - kPaymentInstrumentSupportedRailsTable, - {kInstrumentId, kInstrumentType, kPaymentRail}); - BindPaymentInstrumentSupportedRailsToStatement( - &payment_instrument_supported_rails_insert, - payment_instrument.instrument_id(), - payment_instrument.GetInstrumentType(), payment_rail); - if (!payment_instrument_supported_rails_insert.Run()) { - return false; - } - } - - return true; -} - -bool PaymentsAutofillTable::UpdatePaymentInstrument( - const PaymentInstrument& payment_instrument) { - sql::Statement payment_instruments_update; - UpdateBuilder( - db_, payment_instruments_update, kPaymentInstrumentsTable, - {kInstrumentId, kInstrumentType, kNickname, kDisplayIconUrl}, - base::StrCat({kInstrumentId, "=?1 AND ", kInstrumentType, "=?2"})); - BindPaymentInstrumentToStatement(&payment_instruments_update, - payment_instrument); - if (!payment_instruments_update.Run()) { - return false; - } - - // Delete all rails for the given instrument_id and instrument_type and then - // insert them back. - sql::Statement payment_instrument_supported_rails_delete; - DeleteBuilder( - db_, payment_instrument_supported_rails_delete, - kPaymentInstrumentSupportedRailsTable, - base::StrCat({kInstrumentId, "=?1 AND ", kInstrumentType, "=?2"})); - payment_instrument_supported_rails_delete.BindInt64( - 0, payment_instrument.instrument_id()); - payment_instrument_supported_rails_delete.BindInt64( - 1, static_cast<int>(payment_instrument.GetInstrumentType())); - if (!payment_instrument_supported_rails_delete.Run()) { - return false; - } - for (PaymentInstrument::PaymentRail payment_rail : - payment_instrument.supported_rails()) { - sql::Statement payment_instrument_supported_rails_insert; - InsertBuilder(db_, payment_instrument_supported_rails_insert, - kPaymentInstrumentSupportedRailsTable, - {kInstrumentId, kInstrumentType, kPaymentRail}); - BindPaymentInstrumentSupportedRailsToStatement( - &payment_instrument_supported_rails_insert, - payment_instrument.instrument_id(), - payment_instrument.GetInstrumentType(), payment_rail); - if (!payment_instrument_supported_rails_insert.Run()) { - return false; - } - } - return true; -} - -bool PaymentsAutofillTable::RemovePaymentInstrument( - const PaymentInstrument& payment_instrument) { - sql::Statement payment_instruments_delete; - DeleteBuilder( - db_, payment_instruments_delete, kPaymentInstrumentsTable, - base::StrCat({kInstrumentId, "=?1 AND ", kInstrumentType, "=?2"})); - payment_instruments_delete.BindInt64(0, payment_instrument.instrument_id()); - payment_instruments_delete.BindInt64( - 1, static_cast<int>(payment_instrument.GetInstrumentType())); - if (!payment_instruments_delete.Run()) { - return false; - } - - sql::Statement payment_instrument_supported_rails_delete; - DeleteBuilder( - db_, payment_instrument_supported_rails_delete, - kPaymentInstrumentSupportedRailsTable, - base::StrCat({kInstrumentId, "=?1 AND ", kInstrumentType, "=?2"})); - payment_instrument_supported_rails_delete.BindInt64( - 0, payment_instrument.instrument_id()); - payment_instrument_supported_rails_delete.BindInt64( - 1, static_cast<int>(payment_instrument.GetInstrumentType())); - if (!payment_instrument_supported_rails_delete.Run()) { - return false; - } - return true; -} - -std::unique_ptr<PaymentInstrument> PaymentsAutofillTable::GetPaymentInstrument( - int64_t instrument_id, - PaymentInstrument::InstrumentType instrument_type) { +bool PaymentsAutofillTable::AddMaskedBankAccount( + const BankAccount& bank_account) { sql::Transaction transaction(db_); if (!transaction.Begin()) { - return nullptr; - } - sql::Statement select_payment_instrument_details; - SelectBuilder(db_, select_payment_instrument_details, - kPaymentInstrumentsTable, - {kInstrumentId, kNickname, kDisplayIconUrl}, - base::StrCat({"WHERE ", kInstrumentId, " = ? AND ", - kInstrumentType, " = ?"})); - select_payment_instrument_details.BindInt64(0, instrument_id); - select_payment_instrument_details.BindInt(1, - static_cast<int>(instrument_type)); - if (!select_payment_instrument_details.Step()) { - return nullptr; - } - auto payment_instrument_fields = std::make_unique<PaymentInstrumentFields>(); - int index = 0; - payment_instrument_fields->instrument_id = - select_payment_instrument_details.ColumnInt64(index++); - payment_instrument_fields->instrument_type = instrument_type; - payment_instrument_fields->nickname = - select_payment_instrument_details.ColumnString16(index++); - payment_instrument_fields->display_icon_url = - GURL(select_payment_instrument_details.ColumnString(index++)); - - sql::Statement select_payment_rails; - SelectBuilder(db_, select_payment_rails, - kPaymentInstrumentSupportedRailsTable, {kPaymentRail}, - base::StrCat({"WHERE ", kInstrumentId, " = ? AND ", - kInstrumentType, " = ?"})); - select_payment_rails.BindInt64(0, instrument_id); - select_payment_rails.BindInt(1, static_cast<int>(instrument_type)); - constexpr int index_for_payment_rail = 0; - while (select_payment_rails.Step()) { - int payment_rail = select_payment_rails.ColumnInt(index_for_payment_rail); - if (payment_rail > static_cast<int>(PaymentInstrument::PaymentRail::kPix) || - payment_rail < - static_cast<int>(PaymentInstrument::PaymentRail::kUnknown)) { - return nullptr; - } - payment_instrument_fields->payment_rails.insert( - static_cast<PaymentInstrument::PaymentRail>(payment_rail)); - } - // Fetch the details from instrument type specific tables. - switch (instrument_type) { - case PaymentInstrument::InstrumentType::kBankAccount: { - return GetBankAccount(*payment_instrument_fields); - } - case PaymentInstrument::InstrumentType::kUnknown: - NOTREACHED(); - break; - } - return nullptr; -} - -bool PaymentsAutofillTable::AddBankAccount(const BankAccount& bank_account) { - sql::Transaction transaction(db_); - if (!transaction.Begin()) { - return false; - } - if (!AddPaymentInstrument(bank_account)) { return false; } // Add bank account. sql::Statement insert; - InsertBuilder(db_, insert, kBankAccountsTable, - {kInstrumentId, kBankName, kAccountNumberSuffix, kAccountType}); - BindBankAccountToStatement(&insert, bank_account); + InsertBuilder(db_, insert, kMaskedBankAccountsTable, + {kInstrumentId, kBankName, kAccountNumberSuffix, kAccountType, + kNickname, kDisplayIconUrl}); + BindMaskedBankAccountToStatement(bank_account, &insert); if (!insert.Run()) { return false; } @@ -804,21 +586,20 @@ return transaction.Commit(); } -bool PaymentsAutofillTable::UpdateBankAccount(const BankAccount& bank_account) { +bool PaymentsAutofillTable::UpdateMaskedBankAccount( + const BankAccount& bank_account) { sql::Transaction transaction(db_); if (!transaction.Begin()) { return false; } - if (!UpdatePaymentInstrument(bank_account)) { - return false; - } // Update bank account. sql::Statement update; - UpdateBuilder(db_, update, kBankAccountsTable, - {kInstrumentId, kBankName, kAccountNumberSuffix, kAccountType}, + UpdateBuilder(db_, update, kMaskedBankAccountsTable, + {kInstrumentId, kBankName, kAccountNumberSuffix, kAccountType, + kNickname, kDisplayIconUrl}, base::StrCat({kInstrumentId, "=?1"})); - BindBankAccountToStatement(&update, bank_account); + BindMaskedBankAccountToStatement(bank_account, &update); if (!update.Run()) { return false; } @@ -826,24 +607,22 @@ return transaction.Commit(); } -bool PaymentsAutofillTable::RemoveBankAccount(const BankAccount& bank_account) { +bool PaymentsAutofillTable::RemoveMaskedBankAccount( + const BankAccount& bank_account) { sql::Transaction transaction(db_); if (!transaction.Begin()) { return false; } - if (!RemovePaymentInstrument(bank_account)) { - return false; - } - sql::Statement bank_accounts_delete; - DeleteBuilder(db_, bank_accounts_delete, kBankAccountsTable, + DeleteBuilder(db_, bank_accounts_delete, kMaskedBankAccountsTable, base::StrCat({kInstrumentId, "=?"})); bank_accounts_delete.BindInt64(0, bank_account.instrument_id()); if (!bank_accounts_delete.Run()) { return false; } - + // TODO(crbug.com/1475426) : Delete row from `masked_bank_accounts_metadata` + // table. return transaction.Commit(); } @@ -1834,7 +1613,8 @@ kServerCardCloudTokenDataTable, kOfferDataTable, kOfferEligibleInstrumentTable, kOfferMerchantDomainTable, kVirtualCardUsageDataTable, kMaskedCreditCardBenefitsTable, - kBenefitMerchantDomainsTable}) { + kBenefitMerchantDomainsTable, kMaskedBankAccountsTable, + kMaskedBankAccountsMetadataTable}) { Delete(db_, table_name); changed |= db_->GetLastChangeCount() > 0; } @@ -2181,24 +1961,6 @@ } bool PaymentsAutofillTable:: - MigrateToVersion120AddPaymentInstrumentAndBankAccountTables() { - sql::Transaction transaction(db_); - return transaction.Begin() && - CreateTable(db_, kBankAccountsTable, - bank_accounts_column_names_and_types) && - CreateTable(db_, kPaymentInstrumentsTable, - kPaymentInstrumentsColumnNamesAndTypes, - kPaymentInstrumentsCompositePrimaryKey) && - CreateTable(db_, kPaymentInstrumentsMetadataTable, - kPaymentInstrumentsMetadataColumnNamesAndTypes, - kPaymentInstrumentsMetadataCompositePrimaryKey) && - CreateTable(db_, kPaymentInstrumentSupportedRailsTable, - kPaymentInstrumentSupportedRailsColumnNamesAndTypes, - kPaymentInstrumentSupportedRailsCompositePrimaryKey) && - transaction.Commit(); -} - -bool PaymentsAutofillTable:: MigrateToVersion123AddProductTermsUrlColumnAndAddCardBenefitsTables() { sql::Transaction transaction(db_); return transaction.Begin() && db_->DoesTableExist(kMaskedCreditCardsTable) && @@ -2210,6 +1972,20 @@ transaction.Commit(); } +bool PaymentsAutofillTable:: + MigrateToVersion124AndDeletePaymentInstrumentRelatedTablesAndAddMaskedBankAccountTable() { + sql::Transaction transaction(db_); + return transaction.Begin() && DropTableIfExists(db_, "payment_instruments") && + DropTableIfExists(db_, "payment_instruments_metadata") && + DropTableIfExists(db_, "bank_accounts") && + DropTableIfExists(db_, "payment_instrument_supported_rails") && + CreateTable(db_, kMaskedBankAccountsTable, + kMaskedBankAccountsColumnNamesAndTypes) && + CreateTable(db_, kMaskedBankAccountsMetadataTable, + kMaskedBankAccountsMetadataColumnNamesAndTypes) && + transaction.Commit(); +} + void PaymentsAutofillTable::AddMaskedCreditCards( const std::vector<CreditCard>& credit_cards) { DCHECK_GT(db_->transaction_nesting(), 0); @@ -2416,28 +2192,14 @@ {kLastFour, "VARCHAR"}}); } -bool PaymentsAutofillTable::InitBankAccountsTable() { - return CreateTableIfNotExists(db_, kBankAccountsTable, - bank_accounts_column_names_and_types); +bool PaymentsAutofillTable::InitMaskedBankAccountsTable() { + return CreateTableIfNotExists(db_, kMaskedBankAccountsTable, + kMaskedBankAccountsColumnNamesAndTypes); } -bool PaymentsAutofillTable::InitPaymentInstrumentsTable() { - return CreateTableIfNotExists(db_, kPaymentInstrumentsTable, - kPaymentInstrumentsColumnNamesAndTypes, - kPaymentInstrumentsCompositePrimaryKey); -} - -bool PaymentsAutofillTable::InitPaymentInstrumentsMetadataTable() { - return CreateTableIfNotExists(db_, kPaymentInstrumentsMetadataTable, - kPaymentInstrumentsMetadataColumnNamesAndTypes, - kPaymentInstrumentsMetadataCompositePrimaryKey); -} - -bool PaymentsAutofillTable::InitPaymentInstrumentSupportedRailsTable() { - return CreateTableIfNotExists( - db_, kPaymentInstrumentSupportedRailsTable, - kPaymentInstrumentSupportedRailsColumnNamesAndTypes, - kPaymentInstrumentSupportedRailsCompositePrimaryKey); +bool PaymentsAutofillTable::InitMaskedBankAccountsMetadataTable() { + return CreateTableIfNotExists(db_, kMaskedBankAccountsMetadataTable, + kMaskedBankAccountsMetadataColumnNamesAndTypes); } bool PaymentsAutofillTable::InitMaskedCreditCardBenefitsTable() {
diff --git a/components/autofill/core/browser/webdata/payments/payments_autofill_table.h b/components/autofill/core/browser/webdata/payments/payments_autofill_table.h index 6c3b8f3..fee7264 100644 --- a/components/autofill/core/browser/webdata/payments/payments_autofill_table.h +++ b/components/autofill/core/browser/webdata/payments/payments_autofill_table.h
@@ -49,31 +49,6 @@ const base::Time last_updated_timestamp; }; -// Temporary struct used to store the data retrieved from the -// `payment_instrument` and `payment_instrument_supported_rails` tables. -struct PaymentInstrumentFields { - public: - PaymentInstrumentFields(); - ~PaymentInstrumentFields(); - - // The server generated id for the payment instrument. - int64_t instrument_id = 0; - - // The nickname set by the user for the payment instrument. - std::u16string nickname; - - // The type of payment instrument. This is used to determine which table to - // fetch the remaining instrument details from. - PaymentInstrument::InstrumentType instrument_type = - PaymentInstrument::InstrumentType::kUnknown; - - // The URL for the display icon that can be used in the UI. - GURL display_icon_url; - - // The payment rails that are supported for this payment instrument. - std::set<PaymentInstrument::PaymentRail> payment_rails; -}; - // This class manages the various payments Autofill tables within the SQLite // database passed to the constructor. It expects the following schemas: // @@ -312,56 +287,18 @@ // The timestamp of the most recent update to the data // entry. // ----------------------------------------------------------------------------- -// payment_instruments This table contains basic details that apply to all -// payment instruments synced from Payments backend via -// Chrome Sync. This does not apply to credit cards or IBAN -// for legacy reasons. -// The pair of (`instrument_id`, `instrument_type`) are the -// composite primary key for this table +// masked_bank_accounts_metadata +// Metadata (currently, usage data) about masked bank +// accounts. This will be synced. This is not part of the +// `masked_bank_accounts` table as that table is deleted +// and recreated on every sync where as this table is +// simply updated after a sync. // -// instrument_id The server-generated id for the payment instrument. -// instrument_type The type of payment instrument. This is an integer -// mapping to one of the following types: {BankAccount}. -// This determines which table to query for fetching the -// instrument details. -// nickname The nickname set by the user for the payment instrument. -// display_icon_url The URL for the icon to be displayed when showing the -// payment instrument to the user. +// instrument_id The server-generated id for the bank account. +// use_count The number of times this bank account has been used. +// use_date The date this bank account was last used. // ----------------------------------------------------------------------------- -// payment_instruments_metadata -// Metadata (currently, usage data) about payment -// instruments. This will be synced. -// The pair of (`instrument_id`, `instrument_type`) are the -// composite primary key for this table and can be used as -// the foreign key to the `payment_instruments` table. -// -// instrument_id The server-generated id for the payment instrument. -// instrument_type The type of payment instrument. This is an integer -// mapping to one of the following types: {BankAccount}. -// use_count The number of times this payment instrument has been -// used. -// use_date The date this payment instrument was last used. -// ----------------------------------------------------------------------------- -// payment_instrument_supported_rails -// This table stores the mapping of what payment instrument -// is supported for which payment rails, where a rail can -// loosely represent the different ways in which Chrome can -// intercept a user's payment journey and assist in -// completing it. For example: Pix, UPI, Card number, IBAN -// etc. -// The tuple of (`instrument_id`, `instrument_type`, -// `payment_rail`) are the composite primary key for this -// table. The pair of can (`instrument_id`, -// `instrument_type`) can be used as foreign key to the -// `payment_instruments` table. -// -// instrument_id The server-generated id for the payment instrument. -// instrument_type The type of payment instrument. This is an integer -// mapping to one of the following types: {BankAccount}. -// payment_rail This is an integer mapping to one of the following -// types: {Pix}. -// ----------------------------------------------------------------------------- -// bank_accounts This table contains the bank account data synced via +// masked_bank_accounts This table contains the bank account data synced via // Chrome Sync. // // instrument_id The identifier assigned by the GPay server to this bank @@ -373,6 +310,9 @@ // account_type The type of bank account. This is an integer mapping to // one of the following types: {Checking, Savings, Current, // Salary, Transacting} +// nickname The nickname set by the user for the payment instrument. +// display_icon_url The URL for the icon to be displayed when showing the +// payment instrument to the user. // ----------------------------------------------------------------------------- // masked_credit_card_benefits // This table contains the multi-valued benefits fields @@ -427,25 +367,16 @@ bool CreateTablesIfNecessary() override; bool MigrateToVersion(int version, bool* update_compatible_version) override; - // Fetches a PaymentInstrument from the autofill db. This will query the below - // 3 tables to generate a PaymentInstrument object. - // `payment_instruments` - // `payment_instrument_supported_rails` - // instrument type specific table - // Note: The actual object will be one of the derived class of - // PaymentInstrument and can be determined - // by calling the `GetInstrumentType` method on it. - std::unique_ptr<PaymentInstrument> GetPaymentInstrument( - int64_t instrument_id, - PaymentInstrument::InstrumentType instrument_type); - // Records a single BankAccount in the bank accounts table. Returns true if // the BankAccount was successfully added to the database. - bool AddBankAccount(const BankAccount& bank_account); + bool AddMaskedBankAccount(const BankAccount& bank_account); // Returns true if the BankAccount was successfully updated in the database. - bool UpdateBankAccount(const BankAccount& bank_account); + bool UpdateMaskedBankAccount(const BankAccount& bank_account); // Delete the bank account from the database. - bool RemoveBankAccount(const BankAccount& bank_account); + bool RemoveMaskedBankAccount(const BankAccount& bank_account); + // Retrieve the data from the `masked_bank_accounts` table and return a + // BankAccount object. + std::unique_ptr<BankAccount> GetMaskedBankAccount(int64_t instrument_id); // Records a single IBAN in the local_ibans table. bool AddLocalIban(const Iban& iban); @@ -650,8 +581,9 @@ bool MigrateToVersion116AddStoredCvcTable(); bool MigrateToVersion118RemovePaymentsUpiVpaTable(); bool MigrateToVersion119AddMaskedIbanTablesAndRenameLocalIbanTable(); - bool MigrateToVersion120AddPaymentInstrumentAndBankAccountTables(); bool MigrateToVersion123AddProductTermsUrlColumnAndAddCardBenefitsTables(); + bool + MigrateToVersion124AndDeletePaymentInstrumentRelatedTablesAndAddMaskedBankAccountTable(); private: // Adds to |masked_credit_cards| and updates |server_card_metadata|. @@ -666,33 +598,6 @@ bool DeleteFromMaskedCreditCards(const std::string& id); bool DeleteFromUnmaskedCreditCards(const std::string& id); - // Retrieve the data from the `bank_accounts` table and return a BankAccount - // object. The `payment_instrument_fields` contain the fields retrieved from - // the `payment_instruments` and `payment_instrument_supported_rails` tables - // which are required to generate the BankAccount object. - std::unique_ptr<BankAccount> GetBankAccount( - const PaymentInstrumentFields& payment_instrument_fields); - - // Adds a single PaymentInstrument to the autofill db. This will add at least - // one row to the `payment_instruments` and - // `payment_instrument_supported_rails` tables and depending on the type of - // PaymentInstrument, an entry will be added to the corresponding instrument - // type specific table. Returns true only if all of the updates to - // `payment_instruments`,`payment_instrument_supported_rails` and the - // instrument type specific tables are successfully updated. This method - // should be called from within an sql transaction. - bool AddPaymentInstrument(const PaymentInstrument& payment_instrument); - // Updates the `payment_instrument`, `payment_instrument_supported_rails` and - // the instrument type specific tables. Returns true only if the updates to - // all three tables are successful.This method should be called from within an - // sql transaction. - bool UpdatePaymentInstrument(const PaymentInstrument& payment_instrument); - // Deletes the payment instrument from the `payment_instrument`, - // `payment_instrument_supported_rails` and the instrument type specific - // tables. Returns true only if the updates to all the three tables are - // successful.This method should be called from within an sql transaction. - bool RemovePaymentInstrument(const PaymentInstrument& payment_instrument); - bool InitCreditCardsTable(); bool InitLocalIbansTable(); bool InitMaskedCreditCardsTable(); @@ -707,10 +612,8 @@ bool InitOfferEligibleInstrumentTable(); bool InitOfferMerchantDomainTable(); bool InitVirtualCardUsageDataTable(); - bool InitBankAccountsTable(); - bool InitPaymentInstrumentsTable(); - bool InitPaymentInstrumentsMetadataTable(); - bool InitPaymentInstrumentSupportedRailsTable(); + bool InitMaskedBankAccountsTable(); + bool InitMaskedBankAccountsMetadataTable(); bool InitMaskedCreditCardBenefitsTable(); bool InitBenefitMerchantDomainsTable();
diff --git a/components/autofill/core/browser/webdata/payments/payments_autofill_table_unittest.cc b/components/autofill/core/browser/webdata/payments/payments_autofill_table_unittest.cc index ca38fe8c..898e96ed 100644 --- a/components/autofill/core/browser/webdata/payments/payments_autofill_table_unittest.cc +++ b/components/autofill/core/browser/webdata/payments/payments_autofill_table_unittest.cc
@@ -1741,38 +1741,22 @@ TEST_F(PaymentsAutofillTableTest, AddBankAccount) { BankAccount bank_account_to_store_1 = test::CreatePixBankAccount(100); BankAccount bank_account_to_store_2 = test::CreatePixBankAccount(200); - bank_account_to_store_2.AddPaymentRail( - PaymentInstrument::PaymentRail::kUnknown); bank_account_to_store_1.AddToDatabase(table_.get()); bank_account_to_store_2.AddToDatabase(table_.get()); // Verify bank account 1 is correctly retrieved. - std::unique_ptr<PaymentInstrument> payment_instrument_1 = - table_->GetPaymentInstrument( - bank_account_to_store_1.instrument_id(), - PaymentInstrument::InstrumentType::kBankAccount); - BankAccount* bank_account_from_db_1( - static_cast<BankAccount*>(payment_instrument_1.get())); + std::unique_ptr<BankAccount> bank_account_from_db_1 = + table_->GetMaskedBankAccount(bank_account_to_store_1.instrument_id()); ASSERT_TRUE(bank_account_from_db_1); EXPECT_EQ(bank_account_to_store_1, *bank_account_from_db_1); - EXPECT_TRUE(bank_account_from_db_1->IsSupported( - PaymentInstrument::PaymentRail::kPix)); // Verify bank account 2 is correctly retrieved. - std::unique_ptr<PaymentInstrument> payment_instrument_2 = - table_->GetPaymentInstrument( - bank_account_to_store_2.instrument_id(), - PaymentInstrument::InstrumentType::kBankAccount); - BankAccount* bank_account_from_db_2( - static_cast<BankAccount*>(payment_instrument_2.get())); + std::unique_ptr<BankAccount> bank_account_from_db_2 = + table_->GetMaskedBankAccount(bank_account_to_store_2.instrument_id()); ASSERT_TRUE(bank_account_from_db_2); EXPECT_EQ(bank_account_to_store_2, *bank_account_from_db_2); - EXPECT_TRUE(bank_account_from_db_2->IsSupported( - PaymentInstrument::PaymentRail::kPix)); - EXPECT_TRUE(bank_account_from_db_2->IsSupported( - PaymentInstrument::PaymentRail::kUnknown)); } TEST_F(PaymentsAutofillTableTest, UpdateBankAccount) { @@ -1783,136 +1767,44 @@ 100, u"updated_nickname", GURL("http://www.updated-example.com"), u"updated_bank_name", u"updated_account_number_suffix", BankAccount::AccountType::kSalary); - updated_bank_account_to_store.AddPaymentRail( - PaymentInstrument::PaymentRail::kPix); - updated_bank_account_to_store.AddPaymentRail( - PaymentInstrument::PaymentRail::kUnknown); ASSERT_TRUE(updated_bank_account_to_store.UpdateInDatabase(table_.get())); - std::unique_ptr<PaymentInstrument> payment_instrument = - table_->GetPaymentInstrument( - bank_account_to_store.instrument_id(), - PaymentInstrument::InstrumentType::kBankAccount); - BankAccount* bank_account_from_db( - static_cast<BankAccount*>(payment_instrument.get())); + std::unique_ptr<BankAccount> bank_account_from_db = + table_->GetMaskedBankAccount(bank_account_to_store.instrument_id()); ASSERT_TRUE(bank_account_from_db); EXPECT_EQ(updated_bank_account_to_store, *bank_account_from_db); - // Verify existing payment rail is still supported. - EXPECT_TRUE( - bank_account_from_db->IsSupported(PaymentInstrument::PaymentRail::kPix)); - // Verify updated payment rail is supported. - EXPECT_TRUE(bank_account_from_db->IsSupported( - PaymentInstrument::PaymentRail::kUnknown)); -} - -TEST_F(PaymentsAutofillTableTest, UpdateBankAccount_RemoveSupportedRail) { - // Add 2 supported payment rails. - BankAccount bank_account_to_store = test::CreatePixBankAccount(100); - bank_account_to_store.AddPaymentRail( - PaymentInstrument::PaymentRail::kUnknown); - ASSERT_TRUE(bank_account_to_store.AddToDatabase(table_.get())); - - BankAccount updated_bank_account_to_store( - 100, bank_account_to_store.nickname(), - bank_account_to_store.display_icon_url(), - bank_account_to_store.bank_name(), - bank_account_to_store.account_number_suffix(), - bank_account_to_store.account_type()); - // Add only 1 supported payment rail. - updated_bank_account_to_store.AddPaymentRail( - PaymentInstrument::PaymentRail::kUnknown); - - ASSERT_TRUE(updated_bank_account_to_store.UpdateInDatabase(table_.get())); - - std::unique_ptr<PaymentInstrument> payment_instrument = - table_->GetPaymentInstrument( - bank_account_to_store.instrument_id(), - PaymentInstrument::InstrumentType::kBankAccount); - BankAccount* bank_account_from_db( - static_cast<BankAccount*>(payment_instrument.get())); - - ASSERT_TRUE(bank_account_from_db); - EXPECT_EQ(updated_bank_account_to_store, *bank_account_from_db); - // Verify existing payment rail is no longer supported. - EXPECT_FALSE( - bank_account_from_db->IsSupported(PaymentInstrument::PaymentRail::kPix)); - // Verify updated payment rail is supported. - EXPECT_TRUE(bank_account_from_db->IsSupported( - PaymentInstrument::PaymentRail::kUnknown)); } TEST_F(PaymentsAutofillTableTest, RemoveBankAccount) { BankAccount bank_account_to_store = test::CreatePixBankAccount(100); - bank_account_to_store.AddPaymentRail( - PaymentInstrument::PaymentRail::kUnknown); ASSERT_TRUE(bank_account_to_store.AddToDatabase(table_.get())); // Remove bank account from db. ASSERT_TRUE(bank_account_to_store.DeleteFromDatabase(table_.get())); - // Verify row is deleted from payment_instruments table. - sql::Statement payment_instruments_select( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT COUNT(*) " - "FROM payment_instruments WHERE instrument_id = ? AND " - "instrument_type = ?")); - payment_instruments_select.BindInt64(0, - bank_account_to_store.instrument_id()); - payment_instruments_select.BindInt64( - 1, static_cast<int>(bank_account_to_store.GetInstrumentType())); - - EXPECT_TRUE(payment_instruments_select.Step()); - EXPECT_EQ(0, payment_instruments_select.ColumnInt(0)); - - // Verify row is deleted from payment_instrument_supported_rails table. - sql::Statement payment_instrument_supported_rails_select( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT COUNT(*) " - "FROM payment_instrument_supported_rails WHERE instrument_id = ? AND " - "instrument_type = ?")); - payment_instrument_supported_rails_select.BindInt64( - 0, bank_account_to_store.instrument_id()); - payment_instrument_supported_rails_select.BindInt64( - 1, static_cast<int>(bank_account_to_store.GetInstrumentType())); - - EXPECT_TRUE(payment_instrument_supported_rails_select.Step()); - EXPECT_EQ(0, payment_instrument_supported_rails_select.ColumnInt(0)); - // Verify row is deleted from bank_accounts table. sql::Statement bank_accounts_select( db_->GetSQLConnection()->GetUniqueStatement( "SELECT COUNT(*) " - "FROM bank_accounts WHERE instrument_id = ?")); + "FROM masked_bank_accounts WHERE instrument_id = ?")); bank_accounts_select.BindInt64(0, bank_account_to_store.instrument_id()); EXPECT_TRUE(bank_accounts_select.Step()); EXPECT_EQ(0, bank_accounts_select.ColumnInt(0)); } TEST_F(PaymentsAutofillTableTest, GetPaymentInstrument) { - sql::Statement payment_instruments_insert( - db_->GetSQLConnection()->GetUniqueStatement( - "INSERT INTO payment_instruments (instrument_id, instrument_type, " - "nickname, display_icon_url) VALUES(100, 1, 'nickname', " - "'http://display-icon-url.com')")); - sql::Statement payment_instrument_supported_rails_insert( - db_->GetSQLConnection()->GetUniqueStatement( - "INSERT INTO payment_instrument_supported_rails (instrument_id, " - "instrument_type, payment_rail)VALUES(100, 1, 1)")); sql::Statement bank_accounts_insert( db_->GetSQLConnection()->GetUniqueStatement( - "INSERT INTO bank_accounts (instrument_id, bank_name, " - "account_number_suffix, account_type) VALUES(100, 'bank_name', " - "'account_number_suffix', 1)")); - EXPECT_TRUE(payment_instruments_insert.Run()); - EXPECT_TRUE(payment_instrument_supported_rails_insert.Run()); + "INSERT INTO masked_bank_accounts (instrument_id, bank_name, " + "account_number_suffix, account_type, nickname, display_icon_url) " + "VALUES(100, 'bank_name', " + "'account_number_suffix', 1, 'nickname', " + "'http://display-icon-url.com')")); EXPECT_TRUE(bank_accounts_insert.Run()); - std::unique_ptr<PaymentInstrument> payment_instrument = - table_->GetPaymentInstrument( - 100, PaymentInstrument::InstrumentType::kBankAccount); - BankAccount* bank_account_from_db( - static_cast<BankAccount*>(payment_instrument.get())); + std::unique_ptr<BankAccount> bank_account_from_db = + table_->GetMaskedBankAccount(100); ASSERT_TRUE(bank_account_from_db); EXPECT_EQ(100, bank_account_from_db->instrument_id()); @@ -1924,8 +1816,6 @@ EXPECT_EQ(GURL("http://display-icon-url.com"), bank_account_from_db->display_icon_url()); EXPECT_EQ(u"bank_name", bank_account_from_db->bank_name()); - EXPECT_TRUE( - bank_account_from_db->IsSupported(PaymentInstrument::PaymentRail::kPix)); } } // namespace autofill
diff --git a/components/autofill/core/common/autocomplete_parsing_util.cc b/components/autofill/core/common/autocomplete_parsing_util.cc index 45cbd943..2ea0135 100644 --- a/components/autofill/core/common/autocomplete_parsing_util.cc +++ b/components/autofill/core/common/autocomplete_parsing_util.cc
@@ -156,17 +156,6 @@ : std::nullopt; } -// If the autocomplete `value` doesn't match any of Autofill's supported values, -// Autofill should remain enabled for good intended values. This function checks -// if there is reason to believe so, by matching `value` against patterns like -// "address". -// Ignoring autocomplete="off" and alike is treated separately in -// `ParseAutocompleteAttribute()`. -bool ShouldIgnoreAutocompleteValue(std::string_view value) { - static constexpr char16_t kRegex[] = u"address"; - return MatchesRegex<kRegex>(base::UTF8ToUTF16(value)); -} - } // namespace std::string AutocompleteParsingResult::ToString() const { @@ -204,14 +193,7 @@ // `value` cannot be mapped to any HtmlFieldType. By classifying the field // as HtmlFieldType::kUnrecognized Autofill is effectively disabled. - // Instead, check if we have reason to ignore the value and treat the field as - // HtmlFieldType::kUnspecified. This makes us ignore the autocomplete - // value. - return ShouldIgnoreAutocompleteValue(value) && - base::FeatureList::IsEnabled( - features::kAutofillIgnoreUnmappableAutocompleteValues) - ? HtmlFieldType::kUnspecified - : HtmlFieldType::kUnrecognized; + return HtmlFieldType::kUnrecognized; } std::optional<AutocompleteParsingResult> ParseAutocompleteAttribute(
diff --git a/components/autofill/core/common/autocomplete_parsing_util.h b/components/autofill/core/common/autocomplete_parsing_util.h index 3b86fc1d..73997c3 100644 --- a/components/autofill/core/common/autocomplete_parsing_util.h +++ b/components/autofill/core/common/autocomplete_parsing_util.h
@@ -53,9 +53,7 @@ // Parses `value` as an HTML field type and converts it to the corresponding // HtmlFieldType, if it is supposed by Autofill. -// HtmlFieldType::kUnspecified is returned if `value` is empty, or if -// `value` is supposed to be ignored by -// `kAutofillIgnoreUnmappableAutocompleteValues`. Otherwise +// HtmlFieldType::kUnspecified is returned if `value` is empty. Otherwise // HtmlFieldType::kUnrecognized is returned. HtmlFieldType FieldTypeFromAutocompleteAttributeValue(std::string value);
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index b99c079..3d8127a 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -292,6 +292,12 @@ "AutofillEnableSupportForPhoneNumberTrunkTypes", base::FEATURE_DISABLED_BY_DEFAULT); +// Changes the mechanisms of FormTracker and the requirements for firing +// submission on formless elements. +BASE_FEATURE(kAutofillImproveSubmissionDetection, + "AutofillImproveSubmissionDetection", + base::FEATURE_DISABLED_BY_DEFAULT); + // If enabled, whenever form controls are removed from the DOM, the ChromeClient // is informed about this. This enables Autofill to trigger a reparsing of // forms. @@ -327,6 +333,12 @@ "AutofillUseDEAddressModel", base::FEATURE_DISABLED_BY_DEFAULT); +// Enables using the a custom address model for India, overriding the legacy +// one. +BASE_FEATURE(kAutofillUseINAddressModel, + "AutofillUseINAddressModel", + base::FEATURE_DISABLED_BY_DEFAULT); + // Changes Autofill Clear Form into Undo Autofill. BASE_FEATURE(kAutofillUndo, "AutofillUndo", base::FEATURE_DISABLED_BY_DEFAULT); @@ -334,7 +346,7 @@ // merging. BASE_FEATURE(kAutofillConvergeToExtremeLengthStreetAddress, "AutofillConvergeToExtremeLengthStreetAddress", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam<bool> kAutofillConvergeToLonger{ &kAutofillConvergeToExtremeLengthStreetAddress, "converge_to_longer", true}; @@ -343,13 +355,6 @@ "AutofillStreetNameOrHouseNumberPrecedenceOverAutocomplete", base::FEATURE_ENABLED_BY_DEFAULT); -// When enabled, HTML autocomplete values that do not map to any known type, but -// look reasonable (e.g. contain "address") are simply ignored. Without the -// feature, Autofill is disabled on such fields. -BASE_FEATURE(kAutofillIgnoreUnmappableAutocompleteValues, - "AutofillIgnoreUnmappableAutocompleteValues", - base::FEATURE_DISABLED_BY_DEFAULT); - // When enabled, some local heuristic predictions will take precedence over the // autocomplete attribute and server predictions, when determining a field's // overall type.
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index e770128..aa586e4 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -100,6 +100,8 @@ COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillEnableSupportForPhoneNumberTrunkTypes); COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillImproveSubmissionDetection); +COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillDetectRemovedFormControls); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillReplaceCachedWebElementsByRendererIds); @@ -110,6 +112,8 @@ COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillUseDEAddressModel); COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillUseINAddressModel); +COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillUndo); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillConvergeToExtremeLengthStreetAddress); @@ -119,8 +123,6 @@ BASE_DECLARE_FEATURE( kAutofillStreetNameOrHouseNumberPrecedenceOverAutocomplete); COMPONENT_EXPORT(AUTOFILL) -BASE_DECLARE_FEATURE(kAutofillIgnoreUnmappableAutocompleteValues); -COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillLocalHeuristicsOverrides); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillHighlightOnlyChangedValuesInPreviewMode);
diff --git a/components/autofill/core/common/dense_set.h b/components/autofill/core/common/dense_set.h index bbb4f0d..b2d979d 100644 --- a/components/autofill/core/common/dense_set.h +++ b/components/autofill/core/common/dense_set.h
@@ -15,7 +15,7 @@ #include "base/check.h" #include "base/check_op.h" #include "base/containers/span.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/numerics/safe_conversions.h" namespace autofill { @@ -311,9 +311,7 @@ return owner_->bitset_.get_bit(index_); } - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const DenseSet* owner_ = nullptr; + raw_ptr<const DenseSet<T, Traits>> owner_ = nullptr; // The current index is in the interval [0, owner_->max_size()]. Index index_ = 0;
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index bdeac75..731a5a1 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -14,6 +14,7 @@ #import "base/format_macros.h" #import "base/json/json_reader.h" #import "base/json/json_writer.h" +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "base/metrics/field_trial.h" #import "base/metrics/histogram_macros.h" @@ -126,7 +127,7 @@ PrefObserverDelegate> { // The WebState this instance is observing. Will be null after // -webStateDestroyed: has been called. - web::WebState* _webState; + raw_ptr<web::WebState> _webState; // Bridge to observe the web state from Objective-C. std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; @@ -136,7 +137,7 @@ _webFramesManagerObserverBridge; // The pref service for which this agent was created. - PrefService* _prefService; + raw_ptr<PrefService> _prefService; // The unique renderer ID of the most recent autocomplete field; // tracks the currently-focused form element in order to force filling of
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm index 70e3630d..34e2bff9 100644 --- a/components/autofill/ios/browser/autofill_agent_unittests.mm +++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -5,6 +5,7 @@ #import "components/autofill/ios/browser/autofill_agent.h" #include "base/apple/bundle_locations.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/strcat.h" #include "base/strings/sys_string_conversions.h" @@ -127,8 +128,8 @@ // frames. autofill::TestAutofillClient client_; web::FakeWebState fake_web_state_; - web::FakeWebFrame* fake_main_frame_ = nullptr; - web::FakeWebFramesManager* fake_web_frames_manager_ = nullptr; + raw_ptr<web::FakeWebFrame> fake_main_frame_ = nullptr; + raw_ptr<web::FakeWebFramesManager> fake_web_frames_manager_ = nullptr; AutofillAgent* autofill_agent_; };
diff --git a/components/autofill/ios/browser/autofill_driver_ios.h b/components/autofill/ios/browser/autofill_driver_ios.h index 35ad7b6b..a4869f75 100644 --- a/components/autofill/ios/browser/autofill_driver_ios.h +++ b/components/autofill/ios/browser/autofill_driver_ios.h
@@ -9,6 +9,7 @@ #import "base/containers/flat_map.h" #import "base/containers/flat_set.h" +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "components/autofill/core/browser/autofill_client.h" #import "components/autofill/core/browser/browser_autofill_manager.h" @@ -149,7 +150,7 @@ using web::WebFrameUserData<AutofillDriverIOS>::FromWebFrame; // The WebState with which this object is associated. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; // The id of the WebFrame with which this object is associated. // "" if frame messaging is disabled. @@ -175,7 +176,7 @@ bool processed_ = false; // The embedder's AutofillClient instance. - AutofillClient* client_; + raw_ptr<AutofillClient> client_; // BrowserAutofillManager instance via which this object drives the shared // Autofill code.
diff --git a/components/autofill/ios/browser/autofill_driver_ios_factory.h b/components/autofill/ios/browser/autofill_driver_ios_factory.h index 74fb40d7..ee6d189b 100644 --- a/components/autofill/ios/browser/autofill_driver_ios_factory.h +++ b/components/autofill/ios/browser/autofill_driver_ios_factory.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/memory/raw_ptr.h" #include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/ios/browser/autofill_driver_ios_bridge.h" #include "ios/web/public/web_state_user_data.h" @@ -42,8 +43,8 @@ id<AutofillDriverIOSBridge> bridge, const std::string& app_locale); - web::WebState* web_state_ = nullptr; - AutofillClient* client_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; + raw_ptr<AutofillClient> client_ = nullptr; id<AutofillDriverIOSBridge> bridge_ = nil; std::string app_locale_; WEB_STATE_USER_DATA_KEY_DECL();
diff --git a/components/autofill/ios/browser/test_autofill_manager_injector.h b/components/autofill/ios/browser/test_autofill_manager_injector.h index 1aeae5a..03a38cf8 100644 --- a/components/autofill/ios/browser/test_autofill_manager_injector.h +++ b/components/autofill/ios/browser/test_autofill_manager_injector.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_AUTOFILL_IOS_BROWSER_TEST_AUTOFILL_MANAGER_INJECTOR_H_ #define COMPONENTS_AUTOFILL_IOS_BROWSER_TEST_AUTOFILL_MANAGER_INJECTOR_H_ +#include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/core/browser/browser_autofill_manager.h" @@ -92,7 +93,7 @@ return std::make_unique<T>(driver, client); } - web::WebState* web_state_; + raw_ptr<web::WebState> web_state_; base::ScopedObservation<web::WebFramesManager, web::WebFramesManager::Observer> frames_manager_observation_{this};
diff --git a/components/autofill/ios/form_util/form_activity_observer_bridge.h b/components/autofill/ios/form_util/form_activity_observer_bridge.h index f4fde61f..616c19c 100644 --- a/components/autofill/ios/form_util/form_activity_observer_bridge.h +++ b/components/autofill/ios/form_util/form_activity_observer_bridge.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#include "base/memory/raw_ptr.h" #include "components/autofill/ios/form_util/form_activity_observer.h" @protocol FormActivityObserver<NSObject> @@ -67,7 +68,7 @@ const FormRemovalParams& params) override; private: - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; __weak id<FormActivityObserver> owner_ = nil; };
diff --git a/components/autofill/ios/form_util/test_form_activity_observer.h b/components/autofill/ios/form_util/test_form_activity_observer.h index c133bdd..8cd757e3 100644 --- a/components/autofill/ios/form_util/test_form_activity_observer.h +++ b/components/autofill/ios/form_util/test_form_activity_observer.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_AUTOFILL_IOS_FORM_UTIL_TEST_FORM_ACTIVITY_OBSERVER_H_ #define COMPONENTS_AUTOFILL_IOS_FORM_UTIL_TEST_FORM_ACTIVITY_OBSERVER_H_ +#include "base/memory/raw_ptr.h" #include "components/autofill/ios/form_util/form_activity_observer.h" #include "components/autofill/ios/form_util/form_activity_params.h" @@ -16,8 +17,8 @@ // Arguments passed to |DocumentSubmitted|. struct TestSubmitDocumentInfo { TestSubmitDocumentInfo(); - web::WebState* web_state = nullptr; - web::WebFrame* sender_frame = nullptr; + raw_ptr<web::WebState> web_state = nullptr; + raw_ptr<web::WebFrame> sender_frame = nullptr; std::string form_name; std::string form_data; bool has_user_gesture; @@ -25,15 +26,15 @@ // Arguments passed to |FormActivityRegistered|. struct TestFormActivityInfo { - web::WebState* web_state = nullptr; - web::WebFrame* sender_frame = nullptr; + raw_ptr<web::WebState> web_state = nullptr; + raw_ptr<web::WebFrame> sender_frame = nullptr; FormActivityParams form_activity; }; // Arguments passed to |FormRemovalRegistered|. struct TestFormRemovalInfo { - web::WebState* web_state = nullptr; - web::WebFrame* sender_frame = nullptr; + raw_ptr<web::WebState> web_state = nullptr; + raw_ptr<web::WebFrame> sender_frame = nullptr; FormRemovalParams form_removal_params; }; @@ -70,7 +71,7 @@ const FormRemovalParams& params) override; private: - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; std::unique_ptr<TestSubmitDocumentInfo> submit_document_info_; std::unique_ptr<TestFormActivityInfo> form_activity_info_; std::unique_ptr<TestFormRemovalInfo> form_removal_info_;
diff --git a/components/autofill/ios/form_util/test_form_activity_tab_helper.h b/components/autofill/ios/form_util/test_form_activity_tab_helper.h index 5c957cf4..dfec51c 100644 --- a/components/autofill/ios/form_util/test_form_activity_tab_helper.h +++ b/components/autofill/ios/form_util/test_form_activity_tab_helper.h
@@ -7,6 +7,8 @@ #include <string> +#include "base/memory/raw_ptr.h" + namespace web { class WebFrame; class WebState; @@ -37,7 +39,7 @@ bool has_user_gesture); private: - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; }; } // namespace autofill
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 1dcb19a..7163ad3 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
@@ -415,7 +415,7 @@ <translation id="783819812427904514">将视频取消静音</translation> <translation id="7846076177841592234">取消选择</translation> <translation id="7882806643839505685">允许特定网站播放声音。</translation> -<translation id="789180354981963912">阻止无痕模式下的第三方 Cookie:</translation> +<translation id="789180354981963912">在无痕模式下阻止第三方 Cookie:</translation> <translation id="7940722705963108451">提醒我</translation> <translation id="7974024493641668069">{COUNT,plural, =1{<ph name="FPS_OWNER" /> 的网站群组中有 <ph name="FPS_MEMBERS_COUNT" /> 个网站能查看您在该群组中的活动记录}other{<ph name="FPS_OWNER" /> 的网站群组中有 <ph name="FPS_MEMBERS_COUNT" /> 个网站能查看您在该群组中的活动记录}}</translation> <translation id="7986741934819883144">选择联系人</translation>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java index c390b5c3..1b55d4d 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java
@@ -141,7 +141,7 @@ // Apply the status bar color in case the website had override them. UiUtils.setStatusBarColor(dialogWindow, mActivity.getWindow().getStatusBarColor()); UiUtils.setStatusBarIconColor( - dialogWindow, + dialogWindow.getDecorView().getRootView(), !ColorUtils.shouldUseLightForegroundOnBackground( mActivity.getWindow().getStatusBarColor())); }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java index 1668d13..1479cd6 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java
@@ -643,7 +643,8 @@ Window window = ((Activity) context).getWindow(); UiUtils.setStatusBarColor(window, color); UiUtils.setStatusBarIconColor( - window, !ColorUtils.shouldUseLightForegroundOnBackground(color)); + window.getDecorView().getRootView(), + !ColorUtils.shouldUseLightForegroundOnBackground(color)); } public View getSearchViewForTests() {
diff --git a/components/browsing_data/content/browsing_data_model.cc b/components/browsing_data/content/browsing_data_model.cc index 70b395f..a4b4183f 100644 --- a/components/browsing_data/content/browsing_data_model.cc +++ b/components/browsing_data/content/browsing_data_model.cc
@@ -896,8 +896,6 @@ attribution_reporting::features::kConversionMeasurement); bool is_private_aggregation_enabled = base::FeatureList::IsEnabled(blink::features::kPrivateAggregationApi); - bool is_migrate_storage_to_bdm_enabled = base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM); bool is_cookies_tree_model_deprecated = base::FeatureList::IsEnabled( browsing_data::features::kDeprecateCookiesTreeModel); @@ -910,17 +908,22 @@ // until `finished_callback` has been run. Thus, it's safe to pass raw `this` // to backend callbacks. - // Issued Trust Tokens: + // Issued Trust Tokens storage_partition_->GetNetworkContext()->GetStoredTrustTokenCounts( base::BindOnce(&OnTrustTokenIssuanceInfoLoaded, this, completion)); + // Quota Storage + quota_helper_->StartFetching( + base::BindOnce(&OnQuotaStorageLoaded, this, completion)); + storage_partition_->GetDOMStorageContext()->GetLocalStorageUsage( + base::BindOnce(&OnLocalStorageLoaded, this, completion)); // Shared storage origins if (is_shared_storage_enabled) { storage_partition_->GetSharedStorageManager()->FetchOrigins( base::BindOnce(&OnSharedStorageLoaded, this, completion)); } - // Shared Dictionaries. + // Shared Dictionaries if (is_shared_dictionary_enabled) { storage_partition_->GetNetworkContext()->GetSharedDictionaryUsageInfo( base::BindOnce(&OnSharedDictionaryUsageLoaded, this, completion)); @@ -944,13 +947,7 @@ base::BindOnce(&OnPrivateAggregationLoaded, this, completion)); } - if (is_migrate_storage_to_bdm_enabled) { - quota_helper_->StartFetching( - base::BindOnce(&OnQuotaStorageLoaded, this, completion)); - storage_partition_->GetDOMStorageContext()->GetLocalStorageUsage( - base::BindOnce(&OnLocalStorageLoaded, this, completion)); - } - + // Cookies if (is_cookies_tree_model_deprecated) { storage_partition_->GetCookieManagerForBrowserProcess()->GetAllCookies( base::BindOnce(&OnCookiesLoaded, this, completion));
diff --git a/components/browsing_data/core/features.cc b/components/browsing_data/core/features.cc index 6060759c..385014d 100644 --- a/components/browsing_data/core/features.cc +++ b/components/browsing_data/core/features.cc
@@ -14,8 +14,4 @@ BASE_FEATURE(kDeprecateCookiesTreeModel, "DeprecateCookiesTreeModel", base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kMigrateStorageToBDM, - "MigrateStorageToBDM", - base::FEATURE_ENABLED_BY_DEFAULT); } // namespace browsing_data::features
diff --git a/components/browsing_data/core/features.h b/components/browsing_data/core/features.h index 9877fd4..50103b7 100644 --- a/components/browsing_data/core/features.h +++ b/components/browsing_data/core/features.h
@@ -16,10 +16,6 @@ // Deprecate CookiesTReeModel and use BrowsingDataModel as the only browsing // data interface. BASE_DECLARE_FEATURE(kDeprecateCookiesTreeModel); - -// Enables `BrowsingDataModel` to be the sole handler for storage i.e. local -// storage and quota managed storage. -BASE_DECLARE_FEATURE(kMigrateStorageToBDM); } // namespace browsing_data::features #endif // COMPONENTS_BROWSING_DATA_CORE_FEATURES_H_
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index a66b4df..f142f4e 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "30.8", - "log_list_timestamp": "2024-01-24T12:56:41Z", + "version": "30.9", + "log_list_timestamp": "2024-01-25T12:54:32Z", "operators": [ { "name": "Google",
diff --git a/components/content_settings/browser/page_specific_content_settings.cc b/components/content_settings/browser/page_specific_content_settings.cc index c071c8e..8c1d1381 100644 --- a/components/content_settings/browser/page_specific_content_settings.cc +++ b/components/content_settings/browser/page_specific_content_settings.cc
@@ -24,7 +24,6 @@ #include "components/browsing_data/content/local_storage_helper.h" #include "components/browsing_data/content/service_worker_helper.h" #include "components/browsing_data/content/shared_worker_helper.h" -#include "components/browsing_data/core/features.h" #include "components/content_settings/common/content_settings_agent.mojom.h" #include "components/content_settings/core/browser/content_settings_info.h" #include "components/content_settings/core/browser/content_settings_registry.h" @@ -689,42 +688,37 @@ } PageSpecificContentSettings* settings = GetForFrame(rfh); if (settings) { - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - auto bdm_storage_type = ([storage_type]() { - switch (storage_type) { - case StorageType::LOCAL_STORAGE: - return BrowsingDataModel::StorageType::kLocalStorage; - case StorageType::SESSION_STORAGE: - return BrowsingDataModel::StorageType::kSessionStorage; - case StorageType::FILE_SYSTEM: - case StorageType::INDEXED_DB: - case StorageType::DATABASE: - case StorageType::CACHE: - case StorageType::WEB_LOCKS: - return BrowsingDataModel::StorageType::kQuotaStorage; - } - })(); - - if (storage_type == StorageType::SESSION_STORAGE) { - auto* web_contents = content::WebContents::FromRenderFrameHost(rfh); - const auto& session_storage_namespace_map = - web_contents->GetController().GetSessionStorageNamespaceMap(); - const auto& storage_partition_config = - web_contents->GetSiteInstance()->GetStoragePartitionConfig(); - const auto& namespace_id = - session_storage_namespace_map.at(storage_partition_config); - - content::SessionStorageUsageInfo session_storage_usage_info{ - storage_key, namespace_id->id()}; - settings->OnBrowsingDataAccessed(session_storage_usage_info, - bdm_storage_type, blocked_by_policy); - } else { - settings->OnBrowsingDataAccessed(storage_key, bdm_storage_type, - blocked_by_policy); + auto bdm_storage_type = ([storage_type]() { + switch (storage_type) { + case StorageType::LOCAL_STORAGE: + return BrowsingDataModel::StorageType::kLocalStorage; + case StorageType::SESSION_STORAGE: + return BrowsingDataModel::StorageType::kSessionStorage; + case StorageType::FILE_SYSTEM: + case StorageType::INDEXED_DB: + case StorageType::DATABASE: + case StorageType::CACHE: + case StorageType::WEB_LOCKS: + return BrowsingDataModel::StorageType::kQuotaStorage; } + })(); + + if (storage_type == StorageType::SESSION_STORAGE) { + auto* web_contents = content::WebContents::FromRenderFrameHost(rfh); + const auto& session_storage_namespace_map = + web_contents->GetController().GetSessionStorageNamespaceMap(); + const auto& storage_partition_config = + web_contents->GetSiteInstance()->GetStoragePartitionConfig(); + const auto& namespace_id = + session_storage_namespace_map.at(storage_partition_config); + + content::SessionStorageUsageInfo session_storage_usage_info{ + storage_key, namespace_id->id()}; + settings->OnBrowsingDataAccessed(session_storage_usage_info, + bdm_storage_type, blocked_by_policy); } else { - settings->OnStorageAccessed(storage_type, storage_key, blocked_by_policy); + settings->OnBrowsingDataAccessed(storage_key, bdm_storage_type, + blocked_by_policy); } } } @@ -771,15 +765,9 @@ PageSpecificContentSettings* settings = GetForFrame( content::RenderFrameHost::FromID(render_process_id, render_frame_id)); if (settings) { - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - settings->OnBrowsingDataAccessed( - browsing_data::SharedWorkerInfo{worker_url, name, storage_key}, - BrowsingDataModel::StorageType::kSharedWorker, blocked_by_policy); - } else { - settings->OnSharedWorkerAccessed(worker_url, name, storage_key, - blocked_by_policy); - } + settings->OnBrowsingDataAccessed( + browsing_data::SharedWorkerInfo{worker_url, name, storage_key}, + BrowsingDataModel::StorageType::kSharedWorker, blocked_by_policy); } } @@ -1100,19 +1088,12 @@ content::Page* originating_page) { DCHECK(scope.is_valid()); originating_page = originating_page ? originating_page : &page(); - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM)) { - auto& model = allowed_result ? allowed_browsing_data_model_ - : blocked_browsing_data_model_; - // The size isn't relevant here and won't be displayed in the UI. - model->AddBrowsingData(storage_key, - BrowsingDataModel::StorageType::kQuotaStorage, - /*storage_size=*/0); - } else { - auto& local_shared_objects = allowed_result ? allowed_local_shared_objects_ - : blocked_local_shared_objects_; - local_shared_objects.service_workers()->Add(url::Origin::Create(scope)); - } + auto& model = allowed_result ? allowed_browsing_data_model_ + : blocked_browsing_data_model_; + // The size isn't relevant here and won't be displayed in the UI. + model->AddBrowsingData(storage_key, + BrowsingDataModel::StorageType::kQuotaStorage, + /*storage_size=*/0); if (allowed_result.javascript_blocked_by_policy()) { OnContentBlocked(ContentSettingsType::JAVASCRIPT);
diff --git a/components/content_settings/browser/page_specific_content_settings_unittest.cc b/components/content_settings/browser/page_specific_content_settings_unittest.cc index 8ba1a48..edb3ebc 100644 --- a/components/content_settings/browser/page_specific_content_settings_unittest.cc +++ b/components/content_settings/browser/page_specific_content_settings_unittest.cc
@@ -961,8 +961,7 @@ PageSpecificContentSettingsWithBDMTest() { scoped_feature_list_.InitWithFeaturesAndParameters( /*enabled_features=*/ - {{browsing_data::features::kMigrateStorageToBDM, {}}, - {browsing_data::features::kDeprecateCookiesTreeModel, {}}}, + {{browsing_data::features::kDeprecateCookiesTreeModel, {}}}, /*disabled_features=*/{}); }
diff --git a/components/crash/core/common/crash_key.h b/components/crash/core/common/crash_key.h index 521e79d..970f1f35 100644 --- a/components/crash/core/common/crash_key.h +++ b/components/crash/core/common/crash_key.h
@@ -109,8 +109,7 @@ // If the crash key is set, this is the index into the storage that can be // used to set/clear the key without requiring a linear scan of the storage // table. This will be |num_entries| if unset. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: #global-scope RAW_PTR_EXCLUSION size_t* index_array_; size_t index_array_count_; }; @@ -195,11 +194,8 @@ bool is_set() const { return breakpad_key_->is_set(); } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer + // RAW_PTR_EXCLUSION: #global-scope RAW_PTR_EXCLUSION CrashKeyStringImpl* breakpad_key_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer RAW_PTR_EXCLUSION crashpad::Annotation* crashpad_key_; };
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn index 86a28f2..689dd090 100644 --- a/components/cronet/android/BUILD.gn +++ b/components/cronet/android/BUILD.gn
@@ -347,6 +347,7 @@ "java/src/org/chromium/net/impl/VersionSafeCallbacks.java", "java/src/org/chromium/net/telemetry/CronetLoggerImpl.java", "java/src/org/chromium/net/telemetry/ExperimentalOptions.java", + "java/src/org/chromium/net/telemetry/OptionalBoolean.java", "java/src/org/chromium/net/telemetry/RateLimiter.java", "java/src/org/chromium/net/telemetry/SizeBuckets.java", _generated_impl_version_java,
diff --git a/components/cronet/android/api.txt b/components/cronet/android/api.txt index 4b3b00d9..11e5f27 100644 --- a/components/cronet/android/api.txt +++ b/components/cronet/android/api.txt
@@ -48,34 +48,31 @@ protected org.chromium.net.CallbackException(java.lang.String, java.lang.Throwable); } public class org.chromium.net.ConnectionMigrationOptions$Builder { - public org.chromium.net.ConnectionMigrationOptions$Builder setDefaultNetworkMigration(int); - public org.chromium.net.ConnectionMigrationOptions$Builder setPathDegradationMigration(int); - public org.chromium.net.ConnectionMigrationOptions$Builder setAllowServerMigration(int); - public org.chromium.net.ConnectionMigrationOptions$Builder setMigrateIdleConnections(int); + public org.chromium.net.ConnectionMigrationOptions$Builder enableDefaultNetworkMigration(boolean); + public org.chromium.net.ConnectionMigrationOptions$Builder enablePathDegradationMigration(boolean); + public org.chromium.net.ConnectionMigrationOptions$Builder allowServerMigration(boolean); + public org.chromium.net.ConnectionMigrationOptions$Builder migrateIdleConnections(boolean); public org.chromium.net.ConnectionMigrationOptions$Builder setIdleConnectionMigrationPeriodSeconds(long); - public org.chromium.net.ConnectionMigrationOptions$Builder setAllowNonDefaultNetworkUsage(int); + public org.chromium.net.ConnectionMigrationOptions$Builder allowNonDefaultNetworkUsage(boolean); public org.chromium.net.ConnectionMigrationOptions$Builder setMaxTimeOnNonDefaultNetworkSeconds(long); public org.chromium.net.ConnectionMigrationOptions$Builder setMaxWriteErrorNonDefaultNetworkMigrationsCount(int); public org.chromium.net.ConnectionMigrationOptions$Builder setMaxPathDegradingNonDefaultNetworkMigrationsCount(int); - public org.chromium.net.ConnectionMigrationOptions$Builder setRetryPreHandshakeErrorsOnNonDefaultNetwork(int); + public org.chromium.net.ConnectionMigrationOptions$Builder retryPreHandshakeErrorsOnNonDefaultNetwork(boolean); public org.chromium.net.ConnectionMigrationOptions build(); } public interface org.chromium.net.ConnectionMigrationOptions$Experimental extends java.lang.annotation.Annotation { } public class org.chromium.net.ConnectionMigrationOptions { - public static final int MIGRATION_OPTION_UNSPECIFIED; - public static final int MIGRATION_OPTION_ENABLED; - public static final int MIGRATION_OPTION_DISABLED; - public int getDefaultNetworkMigration(); - public int getPathDegradationMigration(); - public int getAllowServerMigration(); - public int getMigrateIdleConnections(); + public java.lang.Boolean getEnableDefaultNetworkMigration(); + public java.lang.Boolean getEnablePathDegradationMigration(); + public java.lang.Boolean getAllowServerMigration(); + public java.lang.Boolean getMigrateIdleConnections(); public java.lang.Long getIdleMigrationPeriodSeconds(); - public int getRetryPreHandshakeErrorsOnAlternateNetwork(); - public int getAllowNonDefaultNetworkUsage(); + public java.lang.Boolean getRetryPreHandshakeErrorsOnAlternateNetwork(); + public java.lang.Boolean getAllowNonDefaultNetworkUsage(); public java.lang.Long getMaxTimeOnNonDefaultNetworkSeconds(); - public java.lang.Integer getMaxWriteErrorNonDefaultNetworkMigrationsCount(); - public java.lang.Integer getMaxPathDegradingNonDefaultNetworkMigrationsCount(); + public java.lang.Integer getMaxWriteErrorEagerMigrationsCount(); + public java.lang.Integer getMaxPathDegradingEagerMigrationsCount(); public org.chromium.net.ConnectionMigrationOptions(org.chromium.net.ConnectionMigrationOptions$Builder); public static org.chromium.net.ConnectionMigrationOptions$Builder builder(); } @@ -636,4 +633,4 @@ public static org.chromium.net.apihelpers.JsonCronetCallback forJsonBody(org.chromium.net.apihelpers.RedirectHandler, org.chromium.net.apihelpers.CronetRequestCompletionListener<org.json.JSONObject>); public static org.chromium.net.apihelpers.UrlRequestCallbacks$CallbackAndResponseFuturePair<org.json.JSONObject, org.chromium.net.apihelpers.JsonCronetCallback> forJsonBody(org.chromium.net.apihelpers.RedirectHandler); } -Stamp: 11bf64b410aa8f188618a3f733d38fa6 +Stamp: c70494071c55da3be9bb3f922762ba95
diff --git a/components/cronet/android/api/src/org/chromium/net/ConnectionMigrationOptions.java b/components/cronet/android/api/src/org/chromium/net/ConnectionMigrationOptions.java index ca42c0f..aed120b 100644 --- a/components/cronet/android/api/src/org/chromium/net/ConnectionMigrationOptions.java +++ b/components/cronet/android/api/src/org/chromium/net/ConnectionMigrationOptions.java
@@ -4,13 +4,9 @@ package org.chromium.net; -import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresOptIn; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - /** * A class configuring Cronet's connection migration functionality. * @@ -30,50 +26,34 @@ * Migration specification</a> */ public class ConnectionMigrationOptions { - /** Option is unspecified, platform default value will be used. */ - public static final int MIGRATION_OPTION_UNSPECIFIED = 0; - - /** Option is enabled. */ - public static final int MIGRATION_OPTION_ENABLED = 1; - - /** Option is disabled. */ - public static final int MIGRATION_OPTION_DISABLED = 2; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef( - flag = false, - value = { - MIGRATION_OPTION_UNSPECIFIED, - MIGRATION_OPTION_ENABLED, - MIGRATION_OPTION_DISABLED, - }) - @interface State {} - - private final @State int mEnableDefaultNetworkMigration; - private final @State int mEnablePathDegradationMigration; - private final @State int mAllowServerMigration; - private final @State int mMigrateIdleConnections; + @Nullable private final Boolean mEnableDefaultNetworkMigration; + @Nullable private final Boolean mEnablePathDegradationMigration; + @Nullable private final Boolean mAllowServerMigration; + @Nullable private final Boolean mMigrateIdleConnections; @Nullable private final Long mIdleMigrationPeriodSeconds; - private final @State int mRetryPreHandshakeErrorsOnAlternateNetwork; - private final @State int mAllowNonDefaultNetworkUsage; + @Nullable private final Boolean mRetryPreHandshakeErrorsOnAlternateNetwork; + @Nullable private final Boolean mAllowNonDefaultNetworkUsage; @Nullable private final Long mMaxTimeOnNonDefaultNetworkSeconds; - @Nullable private final Integer mMaxWriteErrorNonDefaultNetworkMigrationsCount; - @Nullable private final Integer mMaxPathDegradingNonDefaultNetworkMigrationsCount; + @Nullable private final Integer mMaxWriteErrorEagerMigrationsCount; + @Nullable private final Integer mMaxPathDegradingEagerMigrationsCount; - public @State int getDefaultNetworkMigration() { + @Nullable + public Boolean getEnableDefaultNetworkMigration() { return mEnableDefaultNetworkMigration; } - public @State int getPathDegradationMigration() { + @Nullable + public Boolean getEnablePathDegradationMigration() { return mEnablePathDegradationMigration; } - public @State int getAllowServerMigration() { + @Nullable + public Boolean getAllowServerMigration() { return mAllowServerMigration; } - public @State int getMigrateIdleConnections() { + @Nullable + public Boolean getMigrateIdleConnections() { return mMigrateIdleConnections; } @@ -82,11 +62,13 @@ return mIdleMigrationPeriodSeconds; } - public @State int getRetryPreHandshakeErrorsOnAlternateNetwork() { + @Nullable + public Boolean getRetryPreHandshakeErrorsOnAlternateNetwork() { return mRetryPreHandshakeErrorsOnAlternateNetwork; } - public @State int getAllowNonDefaultNetworkUsage() { + @Nullable + public Boolean getAllowNonDefaultNetworkUsage() { return mAllowNonDefaultNetworkUsage; } @@ -96,13 +78,13 @@ } @Nullable - public Integer getMaxWriteErrorNonDefaultNetworkMigrationsCount() { - return mMaxWriteErrorNonDefaultNetworkMigrationsCount; + public Integer getMaxWriteErrorEagerMigrationsCount() { + return mMaxWriteErrorEagerMigrationsCount; } @Nullable - public Integer getMaxPathDegradingNonDefaultNetworkMigrationsCount() { - return mMaxPathDegradingNonDefaultNetworkMigrationsCount; + public Integer getMaxPathDegradingEagerMigrationsCount() { + return mMaxPathDegradingEagerMigrationsCount; } public ConnectionMigrationOptions(Builder builder) { @@ -115,70 +97,65 @@ builder.mRetryPreHandshakeErrorsOnAlternateNetwork; this.mAllowNonDefaultNetworkUsage = builder.mAllowNonDefaultNetworkUsage; this.mMaxTimeOnNonDefaultNetworkSeconds = builder.mMaxTimeOnNonDefaultNetworkSeconds; - this.mMaxWriteErrorNonDefaultNetworkMigrationsCount = - builder.mMaxWriteErrorNonDefaultNetworkMigrationsCount; - this.mMaxPathDegradingNonDefaultNetworkMigrationsCount = - builder.mMaxPathDegradingNonDefaultMigrationsCount; + this.mMaxWriteErrorEagerMigrationsCount = builder.mMaxWriteErrorEagerMigrationsCount; + this.mMaxPathDegradingEagerMigrationsCount = builder.mMaxPathDegradingEagerMigrationsCount; } /** Builder for {@link ConnectionMigrationOptions}. */ public static class Builder { - private @State int mEnableDefaultNetworkConnectionMigration; - private @State int mEnablePathDegradationMigration; - private @State int mAllowServerMigration; - private @State int mMigrateIdleConnections; + @Nullable private Boolean mEnableDefaultNetworkConnectionMigration; + @Nullable private Boolean mEnablePathDegradationMigration; + @Nullable private Boolean mAllowServerMigration; + @Nullable private Boolean mMigrateIdleConnections; @Nullable private Long mIdleConnectionMigrationPeriodSeconds; - private @State int mRetryPreHandshakeErrorsOnAlternateNetwork; - private @State int mAllowNonDefaultNetworkUsage; + @Nullable private Boolean mRetryPreHandshakeErrorsOnAlternateNetwork; + @Nullable private Boolean mAllowNonDefaultNetworkUsage; @Nullable private Long mMaxTimeOnNonDefaultNetworkSeconds; - @Nullable private Integer mMaxWriteErrorNonDefaultNetworkMigrationsCount; - @Nullable private Integer mMaxPathDegradingNonDefaultMigrationsCount; + @Nullable private Integer mMaxWriteErrorEagerMigrationsCount; + @Nullable private Integer mMaxPathDegradingEagerMigrationsCount; Builder() {} /** - * Sets whether to enable the possibility of migrating connections on default network - * change. If enabled, active QUIC connections will be migrated onto the new network when - * the platform indicates that the default network is changing. + * Enables the possibility of migrating connections on default network change. If enabled, + * active QUIC connections will be migrated onto the new network when the platform indicates + * that the default network is changing. * * @see <a href="https://developer.android.com/training/basics/network-ops/reading-network-state#listening-events">Android * Network State</a> - * @param defaultNetworkMigration Must be one of {@link - * ConnectionMigrationOptions#MIGRATION_OPTION_DISABLED MIGRATION_OPTION_*}. + * * @return this builder for chaining */ - public Builder setDefaultNetworkMigration(@State int defaultNetworkMigration) { - this.mEnableDefaultNetworkConnectionMigration = defaultNetworkMigration; + public Builder enableDefaultNetworkMigration( + boolean enableDefaultNetworkConnectionMigration) { + this.mEnableDefaultNetworkConnectionMigration = enableDefaultNetworkConnectionMigration; return this; } /** - * Sets whether to enable the possibility of migrating connections if the current path is - * performing poorly. + * Enables the possibility of migrating connections if the current path is performing + * poorly. * * <p>Depending on other configuration, this can result to migrating the connections within * the same default network, or to a non-default network. * - * @see #setAllowNonDefaultNetworkUsage(int) - * @param pathDegradationMigration Must be one of {@link - * ConnectionMigrationOptions#MIGRATION_OPTION_DISABLED MIGRATION_OPTION_*}. + * @see #allowNonDefaultNetworkUsage(boolean) + * * @return this builder for chaining */ - public Builder setPathDegradationMigration(@State int pathDegradationMigration) { - this.mEnablePathDegradationMigration = pathDegradationMigration; + public Builder enablePathDegradationMigration(boolean enable) { + this.mEnablePathDegradationMigration = enable; return this; } /** - * Sets whether to enable the possibility of migrating connections to an alternate server - * address at the server's request. + * Enables the possibility of migrating connections to an alternate server address + * at the server's request. * - * @param allowServerMigration Must be one of {@link - * ConnectionMigrationOptions#MIGRATION_OPTION_DISABLED MIGRATION_OPTION_*}. * @return this builder for chaining */ @Experimental - public Builder setAllowServerMigration(@State int allowServerMigration) { + public Builder allowServerMigration(boolean allowServerMigration) { this.mAllowServerMigration = allowServerMigration; return this; } @@ -191,12 +168,10 @@ * idle period for which connections will still be migrated can be customized using {@link * #setIdleConnectionMigrationPeriodSeconds}. * - * @param migrateIdleConnections Must be one of {@link - * ConnectionMigrationOptions#MIGRATION_OPTION_DISABLED MIGRATION_OPTION_*}. * @return this builder for chaining */ @Experimental - public Builder setMigrateIdleConnections(@State int migrateIdleConnections) { + public Builder migrateIdleConnections(boolean migrateIdleConnections) { this.mMigrateIdleConnections = migrateIdleConnections; return this; } @@ -205,7 +180,7 @@ * Sets the maximum idle period for which connections will still be migrated, in seconds. * The setting is shared for all connection migration types. * - * <p>Only relevant if {@link #setMigrateIdleConnections(int)} is enabled. + * <p>Only relevant if {@link #migrateIdleConnections(boolean)} is enabled. * * @return this builder for chaining */ @@ -217,21 +192,20 @@ } /** - * Sets whether connections can be migrated to an alternate network when Cronet detects a - * degradation of the path currently in use. + * Sets whether connections can be migrated to an alternate network when Cronet detects + * a degradation of the path currently in use. * * <p>Note: This setting can result in requests being sent on non-default metered networks. - * Make sure you're using metered networks sparingly, and fine tune parameters like {@link - * #setMaxPathDegradingNonDefaultNetworkMigrationsCount(int)} and {@link - * #setMaxTimeOnNonDefaultNetworkSeconds} to limit the time on non-default networks. + * Make sure you're using metered networks sparingly, and fine tune parameters like + * {@link #setMaxPathDegradingNonDefaultNetworkMigrationsCount(int)} + * and {@link #setMaxTimeOnNonDefaultNetworkSeconds} to limit the time on non-default + * networks. * - * @param allowNonDefaultNetworkUsage Must be one of {@link - * ConnectionMigrationOptions#MIGRATION_OPTION_DISABLED MIGRATION_OPTION_*}. * @return this builder for chaining */ @Experimental - public Builder setAllowNonDefaultNetworkUsage(@State int allowNonDefaultNetworkUsage) { - this.mAllowNonDefaultNetworkUsage = allowNonDefaultNetworkUsage; + public Builder allowNonDefaultNetworkUsage(boolean enable) { + this.mAllowNonDefaultNetworkUsage = enable; return this; } @@ -241,7 +215,7 @@ * migration off the default network for each connection measures and compares to this value * separately. * - * <p>Only relevant if {@link #setAllowNonDefaultNetworkUsage(int)} is enabled. + * <p>Only relevant if {@link #allowNonDefaultNetworkUsage(boolean)} is enabled. * * @return this builder for chaining */ @@ -256,14 +230,14 @@ * Sets the maximum number of migrations to the non-default network upon encountering write * errors. Counted cumulatively per network per connection. * - * <p>Only relevant if {@link #setAllowNonDefaultNetworkUsage(int)} is enabled. + * <p>Only relevant if {@link #allowNonDefaultNetworkUsage(boolean)} is enabled. * * @return this builder for chaining */ @Experimental public Builder setMaxWriteErrorNonDefaultNetworkMigrationsCount( int maxWriteErrorEagerMigrationsCount) { - this.mMaxWriteErrorNonDefaultNetworkMigrationsCount = maxWriteErrorEagerMigrationsCount; + this.mMaxWriteErrorEagerMigrationsCount = maxWriteErrorEagerMigrationsCount; return this; } @@ -271,14 +245,14 @@ * Sets the maximum number of migrations to the non-default network upon encountering path * degradation for the existing connection. Counted cumulatively per network per connection. * - * <p>Only relevant if {@link #setAllowNonDefaultNetworkUsage(int)} is enabled. + * <p>Only relevant if {@link #allowNonDefaultNetworkUsage(boolean)} is enabled. * * @return this builder for chaining */ @Experimental public Builder setMaxPathDegradingNonDefaultNetworkMigrationsCount( int maxPathDegradingEagerMigrationsCount) { - this.mMaxPathDegradingNonDefaultMigrationsCount = maxPathDegradingEagerMigrationsCount; + this.mMaxPathDegradingEagerMigrationsCount = maxPathDegradingEagerMigrationsCount; return this; } @@ -286,19 +260,17 @@ * Sets whether connections with pre-handshake errors should be retried on an alternative * network. * - * <p>If true, a new connection may be established an alternate network if it fails on the - * default network before handshake is confirmed. + * <p>If true, a new connection may be established an alternate network if it fails + * on the default network before handshake is confirmed. * - * <p>Note: similarly to {@link #setAllowNonDefaultNetworkUsage(int)} this setting can + * <p>Note: similarly to {@link #allowNonDefaultNetworkUsage(boolean)} this setting can * result in requests being sent on non-default metered networks. Use with caution! * - * @param retryPreHandshakeErrorsOnAlternateNetwork Must be one of {@link - * ConnectionMigrationOptions#MIGRATION_OPTION_DISABLED MIGRATION_OPTION_*}. * @return this builder for chaining */ @Experimental - public Builder setRetryPreHandshakeErrorsOnNonDefaultNetwork( - @State int retryPreHandshakeErrorsOnAlternateNetwork) { + public Builder retryPreHandshakeErrorsOnNonDefaultNetwork( + boolean retryPreHandshakeErrorsOnAlternateNetwork) { this.mRetryPreHandshakeErrorsOnAlternateNetwork = retryPreHandshakeErrorsOnAlternateNetwork; return this;
diff --git a/components/cronet/android/api/src/org/chromium/net/ExperimentalOptionsTranslatingCronetEngineBuilder.java b/components/cronet/android/api/src/org/chromium/net/ExperimentalOptionsTranslatingCronetEngineBuilder.java index 361f6c9..279fed1 100644 --- a/components/cronet/android/api/src/org/chromium/net/ExperimentalOptionsTranslatingCronetEngineBuilder.java +++ b/components/cronet/android/api/src/org/chromium/net/ExperimentalOptionsTranslatingCronetEngineBuilder.java
@@ -3,9 +3,6 @@ // found in the LICENSE file. package org.chromium.net; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_UNSPECIFIED; - import androidx.annotation.VisibleForTesting; import org.json.JSONException; @@ -247,59 +244,52 @@ (experimentalOptions) -> { JSONObject quicOptions = createDefaultIfAbsent(experimentalOptions, "QUIC"); - if (options.getDefaultNetworkMigration() != MIGRATION_OPTION_UNSPECIFIED) { + if (options.getEnableDefaultNetworkMigration() != null) { quicOptions.put( "migrate_sessions_on_network_change_v2", - options.getDefaultNetworkMigration() == MIGRATION_OPTION_ENABLED); + options.getEnableDefaultNetworkMigration()); } - if (options.getAllowServerMigration() != MIGRATION_OPTION_UNSPECIFIED) { + if (options.getAllowServerMigration() != null) { quicOptions.put( - "allow_server_migration", - options.getAllowServerMigration() == MIGRATION_OPTION_ENABLED); + "allow_server_migration", options.getAllowServerMigration()); } - if (options.getMigrateIdleConnections() != MIGRATION_OPTION_UNSPECIFIED) { + if (options.getMigrateIdleConnections() != null) { quicOptions.put( - "migrate_idle_sessions", - options.getMigrateIdleConnections() == MIGRATION_OPTION_ENABLED); + "migrate_idle_sessions", options.getMigrateIdleConnections()); } if (options.getIdleMigrationPeriodSeconds() != null) { quicOptions.put( "idle_session_migration_period_seconds", options.getIdleMigrationPeriodSeconds()); } - if (options.getRetryPreHandshakeErrorsOnAlternateNetwork() - != MIGRATION_OPTION_UNSPECIFIED) { + if (options.getRetryPreHandshakeErrorsOnAlternateNetwork() != null) { quicOptions.put( "retry_on_alternate_network_before_handshake", - options.getRetryPreHandshakeErrorsOnAlternateNetwork() - == MIGRATION_OPTION_ENABLED); + options.getRetryPreHandshakeErrorsOnAlternateNetwork()); } if (options.getMaxTimeOnNonDefaultNetworkSeconds() != null) { quicOptions.put( "max_time_on_non_default_network_seconds", options.getMaxTimeOnNonDefaultNetworkSeconds()); } - if (options.getMaxPathDegradingNonDefaultNetworkMigrationsCount() != null) { + if (options.getMaxPathDegradingEagerMigrationsCount() != null) { quicOptions.put( "max_migrations_to_non_default_network_on_path_degrading", - options.getMaxPathDegradingNonDefaultNetworkMigrationsCount()); + options.getMaxPathDegradingEagerMigrationsCount()); } - if (options.getMaxWriteErrorNonDefaultNetworkMigrationsCount() != null) { + if (options.getMaxWriteErrorEagerMigrationsCount() != null) { quicOptions.put( "max_migrations_to_non_default_network_on_write_error", - options.getMaxWriteErrorNonDefaultNetworkMigrationsCount()); + options.getMaxWriteErrorEagerMigrationsCount()); } - if (options.getPathDegradationMigration() != MIGRATION_OPTION_UNSPECIFIED) { - boolean pathDegradationValue = - options.getPathDegradationMigration() == MIGRATION_OPTION_ENABLED; + if (options.getEnablePathDegradationMigration() != null) { + boolean pathDegradationValue = options.getEnablePathDegradationMigration(); boolean skipPortMigrationFlag = false; - if (options.getAllowNonDefaultNetworkUsage() - != MIGRATION_OPTION_UNSPECIFIED) { + if (options.getAllowNonDefaultNetworkUsage() != null) { boolean nonDefaultNetworkValue = - options.getAllowNonDefaultNetworkUsage() - == MIGRATION_OPTION_ENABLED; + options.getAllowNonDefaultNetworkUsage(); if (!pathDegradationValue && nonDefaultNetworkValue) { // Misconfiguration which doesn't translate easily to the JSON flags throw new IllegalArgumentException(
diff --git a/components/cronet/android/api_version.txt b/components/cronet/android/api_version.txt index f64f5d8d..6f4247a 100644 --- a/components/cronet/android/api_version.txt +++ b/components/cronet/android/api_version.txt
@@ -1 +1 @@ -27 +26
diff --git a/components/cronet/android/java/src/org/chromium/net/telemetry/ExperimentalOptions.java b/components/cronet/android/java/src/org/chromium/net/telemetry/ExperimentalOptions.java index 1653ae55..352725c 100644 --- a/components/cronet/android/java/src/org/chromium/net/telemetry/ExperimentalOptions.java +++ b/components/cronet/android/java/src/org/chromium/net/telemetry/ExperimentalOptions.java
@@ -227,42 +227,6 @@ return String.join(",", nStr); } - /** - * The generated CronetStatsLog class has an optionalBoolean(UNSET,TRUE,FALSE) variable for each - * of the experimental options. Since these values will always be the same for the options, we - * picked one of them and used it to create a private variable that we can use to make the code - * more readable. - */ - public static enum OptionalBoolean { - UNSET( - CronetStatsLog - .CRONET_ENGINE_CREATED__EXPERIMENTAL_OPTIONS_QUIC_STORE_SERVER_CONFIGS_IN_PROPERTIES__OPTIONAL_BOOLEAN_UNSET), - TRUE( - CronetStatsLog - .CRONET_ENGINE_CREATED__EXPERIMENTAL_OPTIONS_QUIC_STORE_SERVER_CONFIGS_IN_PROPERTIES__OPTIONAL_BOOLEAN_TRUE), - FALSE( - CronetStatsLog - .CRONET_ENGINE_CREATED__EXPERIMENTAL_OPTIONS_QUIC_STORE_SERVER_CONFIGS_IN_PROPERTIES__OPTIONAL_BOOLEAN_FALSE); - - private final int mValue; - - private OptionalBoolean(int value) { - this.mValue = value; - } - - public int getValue() { - return mValue; - } - - public static OptionalBoolean fromBoolean(Boolean value) { - if (value == null) { - return UNSET; - } - - return value ? TRUE : FALSE; - } - } - private boolean isNullOrEmpty(String str) { return str == null || str.isEmpty(); }
diff --git a/components/cronet/android/java/src/org/chromium/net/telemetry/OptionalBoolean.java b/components/cronet/android/java/src/org/chromium/net/telemetry/OptionalBoolean.java new file mode 100644 index 0000000..8ab40c6 --- /dev/null +++ b/components/cronet/android/java/src/org/chromium/net/telemetry/OptionalBoolean.java
@@ -0,0 +1,41 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.net.telemetry; + +/** + * The generated CronetStatsLog class has an optionalBoolean(UNSET,TRUE,FALSE) variable for each of + * the experimental options. Since these values will always be the same for the options, we picked + * one of them and used it to create a private variable that we can use to make the code more + * readable. + */ +enum OptionalBoolean { + UNSET( + CronetStatsLog + .CRONET_ENGINE_CREATED__EXPERIMENTAL_OPTIONS_QUIC_STORE_SERVER_CONFIGS_IN_PROPERTIES__OPTIONAL_BOOLEAN_UNSET), + TRUE( + CronetStatsLog + .CRONET_ENGINE_CREATED__EXPERIMENTAL_OPTIONS_QUIC_STORE_SERVER_CONFIGS_IN_PROPERTIES__OPTIONAL_BOOLEAN_TRUE), + FALSE( + CronetStatsLog + .CRONET_ENGINE_CREATED__EXPERIMENTAL_OPTIONS_QUIC_STORE_SERVER_CONFIGS_IN_PROPERTIES__OPTIONAL_BOOLEAN_FALSE); + + private final int mValue; + + private OptionalBoolean(int value) { + this.mValue = value; + } + + public int getValue() { + return mValue; + } + + public static OptionalBoolean fromBoolean(Boolean value) { + if (value == null) { + return UNSET; + } + + return value ? TRUE : FALSE; + } +}
diff --git a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java index 5c8a638..74c77bc 100644 --- a/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java +++ b/components/cronet/android/sample/src/org/chromium/cronet_sample_apk/Options.java
@@ -4,10 +4,6 @@ package org.chromium.cronet_sample_apk; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_DISABLED; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_UNSPECIFIED; - import androidx.annotation.OptIn; import org.chromium.net.ConnectionMigrationOptions; @@ -53,8 +49,7 @@ new Action<>() { @Override public void configureBuilder(ActionData data, Boolean value) { - data.getMigrationBuilder() - .setDefaultNetworkMigration(booleanToMigrationState(value)); + data.getMigrationBuilder().enableDefaultNetworkMigration(value); } }, false)), @@ -62,26 +57,22 @@ new BooleanOption( "migrate_sessions_early_v2", "Enable QUIC early session migration. This will make quic send probing" - + " packets when the network is degrading, QUIC will migrate the" - + " sessions to a different network even before the original network" - + " has disconnected.", + + " packets when the network is degrading, QUIC will migrate the " + + "sessions to a different network even before the original network " + + "has disconnected.", new Action<Boolean>() { @Override @OptIn(markerClass = ConnectionMigrationOptions.Experimental.class) public void configureBuilder(ActionData data, Boolean value) { - int migrationState = booleanToMigrationState(value); - data.getMigrationBuilder() - .setPathDegradationMigration(migrationState); - data.getMigrationBuilder() - .setAllowNonDefaultNetworkUsage(migrationState); + data.getMigrationBuilder().enablePathDegradationMigration(value); + data.getMigrationBuilder().allowNonDefaultNetworkUsage(value); } }, false)), SLOW_DOWNLOAD( new BooleanOption( "Slow Download (10s)", - "Hang the onReadCompleted for 10s before proceeding. This should simulate" - + " slow connection.", + "Hang the onReadCompleted for 10s before proceeding. This should simulate slow connection.", new Action<>() {}, false)); @@ -94,14 +85,6 @@ public Option<?> getOption() { return mOption; } - - private static int booleanToMigrationState(Boolean value) { - if (value == null) { - return MIGRATION_OPTION_UNSPECIFIED; - } - - return value ? MIGRATION_OPTION_ENABLED : MIGRATION_OPTION_DISABLED; - } } private static final Map<OptionsIdentifier, Option> OPTIONS =
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java index 9a653a3..69c7f57 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/BidirectionalStreamTest.java
@@ -26,7 +26,7 @@ import org.junit.runner.RunWith; import org.chromium.base.Log; -import org.chromium.base.test.util.DoNotBatch; +import org.chromium.base.test.util.Batch; import org.chromium.net.CronetTestRule.CronetImplementation; import org.chromium.net.CronetTestRule.IgnoreFor; import org.chromium.net.CronetTestRule.RequiresMinAndroidApi; @@ -51,7 +51,7 @@ import java.util.regex.Pattern; /** Test functionality of BidirectionalStream interface. */ -@DoNotBatch(reason = "crbug/1459563") +@Batch(Batch.UNIT_TESTS) @RunWith(AndroidJUnit4.class) @IgnoreFor( implementations = {CronetImplementation.FALLBACK}, @@ -1858,7 +1858,8 @@ } @Test - @RequiresMinAndroidApi(Build.VERSION_CODES.M) + // TODO(crbug/1521765): Enable on Android M once fixed. + @RequiresMinAndroidApi(Build.VERSION_CODES.N) public void testBindToDefaultNetworkSucceeds() { ConnectivityManagerDelegate delegate = new ConnectivityManagerDelegate(mTestRule.getTestFramework().getContext());
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUploadTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUploadTest.java index b2074bf..931245a 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUploadTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUploadTest.java
@@ -15,7 +15,7 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.util.DoNotBatch; +import org.chromium.base.test.util.Batch; import org.chromium.net.CronetTestRule.CronetImplementation; import org.chromium.net.CronetTestRule.IgnoreFor; import org.chromium.net.impl.CronetUploadDataStream; @@ -30,7 +30,7 @@ * Tests that directly drive {@code CronetUploadDataStream} and {@code UploadDataProvider} to * simulate different ordering of reset, init, read, and rewind calls. */ -@DoNotBatch(reason = "crbug/1459563") +@Batch(Batch.UNIT_TESTS) @RunWith(AndroidJUnit4.class) @IgnoreFor( implementations = {CronetImplementation.FALLBACK, CronetImplementation.AOSP_PLATFORM},
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestHTTPSTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestHTTPSTest.java index 4df5aab..d984b31 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestHTTPSTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestHTTPSTest.java
@@ -17,14 +17,14 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.util.DoNotBatch; +import org.chromium.base.test.util.Batch; import org.chromium.net.CronetTestRule.CronetImplementation; import org.chromium.net.CronetTestRule.IgnoreFor; import org.chromium.net.TestUrlRequestCallback.ResponseStep; import org.chromium.net.test.ServerCertificate; /** Test functionality of CronetUrlRequest when SSL is enabled. */ -@DoNotBatch(reason = "crbug/1459563") +@Batch(Batch.UNIT_TESTS) @RunWith(AndroidJUnit4.class) public class CronetUrlRequestHTTPSTest { private static final String TAG = CronetUrlRequestHTTPSTest.class.getSimpleName();
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java index cc25dbc..9db1473 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java
@@ -9,9 +9,6 @@ import static org.junit.Assert.assertThrows; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_DISABLED; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED; - import androidx.annotation.OptIn; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.MediumTest; @@ -55,8 +52,7 @@ CronetEngine.Builder builder = new CronetEngine.Builder(mockBuilderImpl); builder.setConnectionMigrationOptions( - ConnectionMigrationOptions.builder() - .setDefaultNetworkMigration(MIGRATION_OPTION_ENABLED)); + ConnectionMigrationOptions.builder().enableDefaultNetworkMigration(true)); builder.build(); assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull(); @@ -72,12 +68,11 @@ CronetEngine.Builder builder = new CronetEngine.Builder(mockBuilderImpl); builder.setConnectionMigrationOptions( - ConnectionMigrationOptions.builder() - .setDefaultNetworkMigration(MIGRATION_OPTION_ENABLED)); + ConnectionMigrationOptions.builder().enableDefaultNetworkMigration(true)); builder.build(); - assertThat(mockBuilderImpl.mConnectionMigrationOptions.getDefaultNetworkMigration()) - .isEqualTo(MIGRATION_OPTION_ENABLED); + assertThat(mockBuilderImpl.mConnectionMigrationOptions.getEnableDefaultNetworkMigration()) + .isTrue(); assertThat(mockBuilderImpl.mEffectiveExperimentalOptions).isNull(); } @@ -92,8 +87,7 @@ CronetEngine.Builder builder = new ExperimentalCronetEngine.Builder(mockBuilderImpl); builder.setConnectionMigrationOptions( - ConnectionMigrationOptions.builder() - .setDefaultNetworkMigration(MIGRATION_OPTION_ENABLED)); + ConnectionMigrationOptions.builder().enableDefaultNetworkMigration(true)); ((ExperimentalCronetEngine.Builder) builder) .setExperimentalOptions( "{\"QUIC\": {\"migrate_sessions_on_network_change_v2\": false}}"); @@ -112,8 +106,7 @@ CronetEngine.Builder builder = new CronetEngine.Builder(mockBuilderImpl); builder.setConnectionMigrationOptions( - ConnectionMigrationOptions.builder() - .setAllowNonDefaultNetworkUsage(MIGRATION_OPTION_ENABLED)); + ConnectionMigrationOptions.builder().allowNonDefaultNetworkUsage(true)); builder.build(); assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull(); @@ -127,8 +120,7 @@ CronetEngine.Builder builder = new CronetEngine.Builder(mockBuilderImpl); builder.setConnectionMigrationOptions( - ConnectionMigrationOptions.builder() - .setPathDegradationMigration(MIGRATION_OPTION_ENABLED)); + ConnectionMigrationOptions.builder().enablePathDegradationMigration(true)); builder.build(); assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull(); @@ -145,8 +137,8 @@ builder.setConnectionMigrationOptions( ConnectionMigrationOptions.builder() - .setPathDegradationMigration(MIGRATION_OPTION_ENABLED) - .setAllowNonDefaultNetworkUsage(MIGRATION_OPTION_ENABLED)); + .enablePathDegradationMigration(true) + .allowNonDefaultNetworkUsage(true)); builder.build(); assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull(); @@ -163,8 +155,8 @@ builder.setConnectionMigrationOptions( ConnectionMigrationOptions.builder() - .setPathDegradationMigration(MIGRATION_OPTION_ENABLED) - .setAllowNonDefaultNetworkUsage(MIGRATION_OPTION_DISABLED)); + .enablePathDegradationMigration(true) + .allowNonDefaultNetworkUsage(false)); builder.build(); assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull(); @@ -181,8 +173,8 @@ builder.setConnectionMigrationOptions( ConnectionMigrationOptions.builder() - .setPathDegradationMigration(MIGRATION_OPTION_DISABLED) - .setAllowNonDefaultNetworkUsage(MIGRATION_OPTION_ENABLED)); + .enablePathDegradationMigration(false) + .allowNonDefaultNetworkUsage(true)); IllegalArgumentException e = assertThrows(IllegalArgumentException.class, builder::build); assertThat(e) @@ -266,14 +258,14 @@ ConnectionMigrationOptions connectionMigrationOptions = ConnectionMigrationOptions.builder() - .setDefaultNetworkMigration(MIGRATION_OPTION_DISABLED) - .setPathDegradationMigration(MIGRATION_OPTION_ENABLED) - .setAllowServerMigration(MIGRATION_OPTION_DISABLED) - .setMigrateIdleConnections(MIGRATION_OPTION_ENABLED) + .enableDefaultNetworkMigration(false) + .enablePathDegradationMigration(true) + .allowServerMigration(false) + .migrateIdleConnections(true) .setIdleConnectionMigrationPeriodSeconds( toTelephoneKeyboardSequence("idlePeriod")) - .setRetryPreHandshakeErrorsOnNonDefaultNetwork(MIGRATION_OPTION_DISABLED) - .setAllowNonDefaultNetworkUsage(MIGRATION_OPTION_ENABLED) + .retryPreHandshakeErrorsOnNonDefaultNetwork(false) + .allowNonDefaultNetworkUsage(true) .setMaxTimeOnNonDefaultNetworkSeconds( toTelephoneKeyboardSequence("maxTimeNotDefault")) .setMaxWriteErrorNonDefaultNetworkMigrationsCount(
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java index e29742c6..5b7bef3 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java
@@ -11,8 +11,6 @@ import static com.google.common.truth.Truth.assertWithMessage; import static com.google.common.truth.TruthJUnit.assume; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_DISABLED; -import static org.chromium.net.ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED; import static org.chromium.net.truth.UrlResponseInfoSubject.assertThat; import android.content.Context; @@ -205,8 +203,8 @@ @OptIn(markerClass = org.chromium.net.ConnectionMigrationOptions.Experimental.class) private static void disableDefaultNetworkMigration(CronetEngine.Builder engineBuilder) { ConnectionMigrationOptions.Builder optionBuilder = ConnectionMigrationOptions.builder(); - optionBuilder.setDefaultNetworkMigration(MIGRATION_OPTION_DISABLED); - optionBuilder.setMigrateIdleConnections(MIGRATION_OPTION_DISABLED); + optionBuilder.enableDefaultNetworkMigration(false); + optionBuilder.migrateIdleConnections(false); engineBuilder.setConnectionMigrationOptions(optionBuilder.build()); } @@ -233,8 +231,8 @@ @OptIn(markerClass = org.chromium.net.ConnectionMigrationOptions.Experimental.class) private static void enableDefaultNetworkMigration(CronetEngine.Builder engineBuilder) { ConnectionMigrationOptions.Builder optionBuilder = ConnectionMigrationOptions.builder(); - optionBuilder.setDefaultNetworkMigration(MIGRATION_OPTION_ENABLED); - optionBuilder.setMigrateIdleConnections(MIGRATION_OPTION_ENABLED); + optionBuilder.enableDefaultNetworkMigration(true); + optionBuilder.migrateIdleConnections(true); engineBuilder.setConnectionMigrationOptions(optionBuilder.build()); disableSessionHandling(engineBuilder);
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/telemetry/ExperimentalOptionsTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/telemetry/ExperimentalOptionsTest.java index 7cc3fa1..1298967 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/telemetry/ExperimentalOptionsTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/telemetry/ExperimentalOptionsTest.java
@@ -21,7 +21,6 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.Batch; -import org.chromium.net.telemetry.ExperimentalOptions.OptionalBoolean; @RunWith(AndroidJUnit4.class) @Batch(Batch.UNIT_TESTS)
diff --git a/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java b/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java index 224a352d..0742627 100644 --- a/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java +++ b/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
@@ -6,7 +6,15 @@ import android.content.Context; import android.os.Build; -import android.os.ConditionVariable; + +import org.chromium.base.Log; +import org.chromium.net.test.util.CertTestUtil; + +import java.io.File; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; @@ -30,12 +38,6 @@ import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SupportedCipherSuiteFilter; -import org.chromium.base.Log; -import org.chromium.net.test.util.CertTestUtil; - -import java.io.File; -import java.util.concurrent.CountDownLatch; - /** Wrapper class to start a HTTP/2 test server. */ public final class Http2TestServer { private static Channel sServerChannel; @@ -49,6 +51,8 @@ public static final String SERVER_CERT_PEM; private static final String SERVER_KEY_PKCS8_PEM; + // Used to start http2 test server. + private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(1); static { // TODO(crbug/1490552): Fallback to MockCertVerifier when custom CAs are not supported. @@ -165,15 +169,16 @@ new File(CertTestUtil.CERTS_DIRECTORY + certFileName), new File(CertTestUtil.CERTS_DIRECTORY + keyFileName), hangingUrlLatch); - new Thread(http2TestServerRunnable).start(); - http2TestServerRunnable.blockUntilStarted(); - return true; + // This will run synchronously as we can't run the test before we have + // started the test-server, if the test-server has failed to start then + // the caller should assert on the value returned to make sure that the test + // fails if the server has failed to start up. + return EXECUTOR.submit(http2TestServerRunnable).get(); } private Http2TestServer() {} - private static class Http2TestServerRunnable implements Runnable { - private final ConditionVariable mBlock = new ConditionVariable(); + private static class Http2TestServerRunnable implements Callable<Boolean> { private final SslContext mSslCtx; private final CountDownLatch mHangingUrlLatch; @@ -204,46 +209,34 @@ mHangingUrlLatch = hangingUrlLatch; } - public void blockUntilStarted() { - mBlock.block(); - } - @Override - public void run() { - boolean retry = false; - do { + public Boolean call() throws Exception { + for(int retries = 0; retries < 10; retries++) { try { // Configure the server. EventLoopGroup group = new NioEventLoopGroup(); - try { - ServerBootstrap b = new ServerBootstrap(); - b.option(ChannelOption.SO_BACKLOG, 1024); - b.group(group) - .channel(NioServerSocketChannel.class) - .handler(new LoggingHandler(LogLevel.INFO)) - .childHandler( - new Http2ServerInitializer(mSslCtx, mHangingUrlLatch)); + ServerBootstrap b = new ServerBootstrap(); + b.option(ChannelOption.SO_BACKLOG, 1024); + b.group(group) + .channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)) + .childHandler(new Http2ServerInitializer(mSslCtx, mHangingUrlLatch)); - sServerChannel = b.bind(PORT).sync().channel(); - Log.i(TAG, "Netty HTTP/2 server started on " + getServerUrl()); - mBlock.open(); - sServerChannel.closeFuture().sync(); - } finally { - group.shutdownGracefully(); - } - Log.i(TAG, "Stopped Http2TestServerRunnable!"); - retry = false; + sServerChannel = b.bind(PORT).sync().channel(); + Log.i(TAG, "Netty HTTP/2 server started on " + getServerUrl()); + return true; } catch (Exception e) { - Log.e(TAG, "Netty server failed to start", e); - // Retry once if we hit https://github.com/netty/netty/issues/2616 before the - // server starts. - retry = - !retry - && sServerChannel == null - && e.toString() - .contains("java.nio.channels.ClosedChannelException"); + // Netty test server fails to startup and this is a common issue + // https://github.com/netty/netty/issues/2616. It is not well understood + // why this is happening or how to fix it, we can workaround this by + // trying to restart the server several times before giving up. + // See crbug/1519471 for more information. + Log.w(TAG, "Netty server failed to start", e); + // Sleep for half a second before trying again. + Thread.sleep(/* milliseconds = */ 500); } - } while (retry); + } + return false; } }
diff --git a/components/dom_distiller/ios/distiller_page_factory_ios.h b/components/dom_distiller/ios/distiller_page_factory_ios.h index 98b64bb6..95856ac 100644 --- a/components/dom_distiller/ios/distiller_page_factory_ios.h +++ b/components/dom_distiller/ios/distiller_page_factory_ios.h
@@ -7,6 +7,7 @@ #include <memory> +#include "base/memory/raw_ptr.h" #include "components/dom_distiller/core/distiller_page.h" namespace web { @@ -34,7 +35,7 @@ std::unique_ptr<SourcePageHandle> handle) const override; private: - web::BrowserState* browser_state_; + raw_ptr<web::BrowserState> browser_state_; }; } // namespace dom_distiller
diff --git a/components/dom_distiller/ios/distiller_page_ios.h b/components/dom_distiller/ios/distiller_page_ios.h index 7f4d2281..28d29345e 100644 --- a/components/dom_distiller/ios/distiller_page_ios.h +++ b/components/dom_distiller/ios/distiller_page_ios.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "components/dom_distiller/core/distiller_page.h" #include "ios/web/public/web_state_observer.h" @@ -66,7 +67,7 @@ GURL url_; std::string script_; - web::BrowserState* browser_state_; + raw_ptr<web::BrowserState> browser_state_; std::unique_ptr<web::WebState> web_state_; std::unique_ptr<DistillerPageMediaBlocker> media_blocker_;
diff --git a/components/enterprise/browser/reporting/real_time_uploader_unittest.cc b/components/enterprise/browser/reporting/real_time_uploader_unittest.cc index c240b0f7..5b30faf 100644 --- a/components/enterprise/browser/reporting/real_time_uploader_unittest.cc +++ b/components/enterprise/browser/reporting/real_time_uploader_unittest.cc
@@ -43,11 +43,6 @@ std::make_unique<reporting::test::ReportQueueProviderTestHelper>(); } - void TearDown() override { - helper_.reset(); - task_environment_.RunUntilIdle(); // Drain remaining scheduled tasks. - } - std::unique_ptr<ExtensionsWorkflowEvent> CreateReportAndGetSerializedString( const std::string& id, std::string* serialized_string) {
diff --git a/components/favicon/ios/web_favicon_driver.h b/components/favicon/ios/web_favicon_driver.h index 1b650d1..f7c3a045 100644 --- a/components/favicon/ios/web_favicon_driver.h +++ b/components/favicon/ios/web_favicon_driver.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_FAVICON_IOS_WEB_FAVICON_DRIVER_H_ #define COMPONENTS_FAVICON_IOS_WEB_FAVICON_DRIVER_H_ +#include "base/memory/raw_ptr.h" #include "components/favicon/core/favicon_driver_impl.h" #import "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h" #include "ios/web/public/web_state_observer.h" @@ -83,7 +84,7 @@ // The WebState this instance is observing. Will be null after // WebStateDestroyed has been called. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; WEB_STATE_USER_DATA_KEY_DECL(); };
diff --git a/components/feedback/redaction_tool/url_canon.h b/components/feedback/redaction_tool/url_canon.h index 58d7918..f9043e0 100644 --- a/components/feedback/redaction_tool/url_canon.h +++ b/components/feedback/redaction_tool/url_canon.h
@@ -124,8 +124,8 @@ return true; } - // `buffer_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION T* buffer_ = nullptr; size_t buffer_len_ = 0;
diff --git a/components/feedback/redaction_tool/url_canon_stdstring.h b/components/feedback/redaction_tool/url_canon_stdstring.h index 64697435..7a3068cb 100644 --- a/components/feedback/redaction_tool/url_canon_stdstring.h +++ b/components/feedback/redaction_tool/url_canon_stdstring.h
@@ -53,8 +53,8 @@ void Resize(size_t sz) override; protected: - // `str_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data and tab_search:top100:2020). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data and tab_search:top100:2020. RAW_PTR_EXCLUSION std::string* str_; };
diff --git a/components/gwp_asan/client/gwp_asan.cc b/components/gwp_asan/client/gwp_asan.cc index ab4c240..b1ae297 100644 --- a/components/gwp_asan/client/gwp_asan.cc +++ b/components/gwp_asan/client/gwp_asan.cc
@@ -12,6 +12,7 @@ #include "base/allocator/partition_alloc_support.h" #include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_buildflags.h" +#include "base/containers/flat_set.h" #include "base/debug/crash_logging.h" #include "base/feature_list.h" #include "base/functional/callback_helpers.h" @@ -120,7 +121,12 @@ BASE_FEATURE(kLightweightUafDetector, "LightweightUafDetector", - base::FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(IS_WIN) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +); constexpr base::FeatureParam<LightweightDetectorMode>::Option kLightweightUafDetectorModeOptions[] = { @@ -199,6 +205,35 @@ return frequency.ValueOrDie(); } +// Don't use both GWP-ASan and LUD at the same time for performance +// reasons. When both features are enabled, we prefer GWP-ASan to +// compensate for its lower sampling rate. +bool IsMutuallyExclusiveFeatureAllowed(const base::Feature& feature) { + static auto disabled_features = []() { + constexpr double kGwpAsanPickProbability = 0.9; + + base::flat_set<const base::Feature*> disabled_features; + + bool gwp_asan_enabled = + base::FeatureList::IsEnabled(internal::kGwpAsanMalloc) || + base::FeatureList::IsEnabled(internal::kGwpAsanPartitionAlloc); + bool lud_enabled = + base::FeatureList::IsEnabled(internal::kLightweightUafDetector); + if (gwp_asan_enabled && lud_enabled) { + if (base::RandDouble() <= kGwpAsanPickProbability) { + disabled_features.emplace(&internal::kLightweightUafDetector); + } else { + disabled_features.emplace(&internal::kGwpAsanMalloc); + disabled_features.emplace(&internal::kGwpAsanPartitionAlloc); + } + } + + return disabled_features; + }(); + + return disabled_features.find(&feature) == disabled_features.end(); +} + } // namespace // Exported for testing. @@ -209,6 +244,10 @@ if (!base::FeatureList::IsEnabled(feature)) return absl::nullopt; + if (!IsMutuallyExclusiveFeatureAllowed(feature)) { + return absl::nullopt; + } + static_assert( AllocatorState::kMaxRequestedSlots <= std::numeric_limits<int>::max(), "kMaxRequestedSlots out of range"); @@ -268,6 +307,10 @@ return false; } + if (!IsMutuallyExclusiveFeatureAllowed(feature)) { + return false; + } + if (!SampleProcess(feature, boost_sampling)) { return false; }
diff --git a/components/gwp_asan/client/lightweight_detector/malloc_shims.h b/components/gwp_asan/client/lightweight_detector/malloc_shims.h index fb34eede..8e31679 100644 --- a/components/gwp_asan/client/lightweight_detector/malloc_shims.h +++ b/components/gwp_asan/client/lightweight_detector/malloc_shims.h
@@ -7,7 +7,7 @@ #include <stddef.h> -#include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_exclusion.h" #include "build/build_config.h" #include "components/gwp_asan/client/export.h" #include "components/gwp_asan/client/gwp_asan.h" @@ -34,16 +34,16 @@ ; } - // By the time `address` arrives here, it has already been passed to a - // `free()`-like function, and assigning a dangling `T*` to a `raw_ptr<T>` is - // forbidden. + // RAW_PTR_EXCLUSION: By the time `address` arrives here, it has already been + // passed to a `free()`-like function, and assigning a dangling `T*` to a + // `raw_ptr<T>` is forbidden. RAW_PTR_EXCLUSION void* address = nullptr; uint32_t size = 0; // Intentionally not `size_t` to save space. FreeFunctionKind free_fn_kind = FreeFunctionKind::kUnknown; #if BUILDFLAG(IS_APPLE) // Not used on other platforms. - // On macOS and iOS, this is a pointer to an OS-internal `malloc_zone_t`, - // which can't be protected by raw_ptr<T>. + // RAW_PTR_EXCLUSION: On macOS and iOS, this is a pointer to an OS-internal + // `malloc_zone_t`, which can't be protected by raw_ptr<T>. RAW_PTR_EXCLUSION void* context = nullptr; #endif // BUILDFLAG(IS_APPLE) };
diff --git a/components/history/core/browser/url_row.h b/components/history/core/browser/url_row.h index bf1df57a..a50d7ce 100644 --- a/components/history/core/browser/url_row.h +++ b/components/history/core/browser/url_row.h
@@ -10,7 +10,7 @@ #include <string> #include <vector> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ref.h" #include "base/time/time.h" #include "components/query_parser/snippet.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -106,14 +106,10 @@ public: explicit URLRowHasURL(const GURL& url) : url_(url) {} - bool operator()(const URLRow& row) { - return row.url() == url_; - } + bool operator()(const URLRow& row) { return row.url() == (*url_); } private: - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const GURL& url_; + const raw_ref<const GURL> url_; }; protected:
diff --git a/components/omnibox/browser/url_index_private_data.cc b/components/omnibox/browser/url_index_private_data.cc index d291628..6e25194 100644 --- a/components/omnibox/browser/url_index_private_data.cc +++ b/components/omnibox/browser/url_index_private_data.cc
@@ -989,12 +989,14 @@ bool URLIndexPrivateData::HistoryItemFactorGreater::operator()( const HistoryID h1, const HistoryID h2) { - auto entry1(history_info_map_.find(h1)); - if (entry1 == history_info_map_.end()) + auto entry1(history_info_map_->find(h1)); + if (entry1 == history_info_map_->end()) { return false; - auto entry2(history_info_map_.find(h2)); - if (entry2 == history_info_map_.end()) + } + auto entry2(history_info_map_->find(h2)); + if (entry2 == history_info_map_->end()) { return true; + } const history::URLRow& r1(entry1->second.url_row); const history::URLRow& r2(entry2->second.url_row); // First cut: typed count, visit count, recency.
diff --git a/components/omnibox/browser/url_index_private_data.h b/components/omnibox/browser/url_index_private_data.h index 1c28a52b..ddb274e 100644 --- a/components/omnibox/browser/url_index_private_data.h +++ b/components/omnibox/browser/url_index_private_data.h
@@ -14,7 +14,7 @@ #include "base/containers/stack.h" #include "base/files/file_path.h" #include "base/gtest_prod_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ref.h" #include "base/memory/ref_counted.h" #include "base/time/time.h" #include "components/history/core/browser/history_service.h" @@ -206,9 +206,7 @@ bool operator()(const HistoryID h1, const HistoryID h2); private: - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const HistoryInfoMap& history_info_map_; + const raw_ref<const HistoryInfoMap> history_info_map_; }; // Information about a URL host aggregated from all URLs of that host. Used to
diff --git a/components/open_from_clipboard/clipboard_recent_content_impl_ios.mm b/components/open_from_clipboard/clipboard_recent_content_impl_ios.mm index 8904d30b..7d2f3dc6 100644 --- a/components/open_from_clipboard/clipboard_recent_content_impl_ios.mm +++ b/components/open_from_clipboard/clipboard_recent_content_impl_ios.mm
@@ -464,39 +464,46 @@ __weak __typeof(self) weakSelf = self; NSSet<UIPasteboardDetectionPattern>* urlPattern = [NSSet setWithObject:UIPasteboardDetectionPatternProbableWebURL]; - [pasteboard - detectValuesForPatterns:urlPattern - completionHandler:^( - NSDictionary<UIPasteboardDetectionPattern, id>* values, - NSError* error) { - // On iOS 16, users can deny access to the clipboard. - if (error) { - weakSelf.cachedURL = nil; - callback(nil); - return; - } - NSURL* url = [NSURL - URLWithString: - values[UIPasteboardDetectionPatternProbableWebURL]]; + [pasteboard detectValuesForPatterns:urlPattern + completionHandler:^( + NSDictionary<UIPasteboardDetectionPattern, id>* values, + NSError* error) { + [weakSelf callCompletionHandlerWithValues:values + callback:callback + error:error]; + }]; +} - // |detectValuesForPatterns:| will return a url even if the url - // is missing a scheme. In this case, default to https. - if (url && url.scheme == nil) { - NSURLComponents* components = - [[NSURLComponents alloc] initWithURL:url - resolvingAgainstBaseURL:NO]; - components.scheme = kDefaultScheme; - url = components.URL; - } +// Helper method for completion handler block to ensure `self` isn't retained. +- (void)callCompletionHandlerWithValues: + (NSDictionary<UIPasteboardDetectionPattern, id>*)values + callback:(void (^)(NSURL*))callback + error:(NSError*)error { + // On iOS 16, users can deny access to the clipboard. + if (error) { + self.cachedURL = nil; + callback(nil); + return; + } + NSURL* url = + [NSURL URLWithString:values[UIPasteboardDetectionPatternProbableWebURL]]; - if (![self.authorizedSchemes containsObject:url.scheme]) { - weakSelf.cachedURL = nil; - callback(nil); - } else { - weakSelf.cachedURL = url; - callback(url); - } - }]; + // |detectValuesForPatterns:| will return a url even if the url + // is missing a scheme. In this case, default to https. + if (url && url.scheme == nil) { + NSURLComponents* components = [[NSURLComponents alloc] initWithURL:url + resolvingAgainstBaseURL:NO]; + components.scheme = kDefaultScheme; + url = components.URL; + } + + if (![self.authorizedSchemes containsObject:url.scheme]) { + self.cachedURL = nil; + callback(nil); + } else { + self.cachedURL = url; + callback(url); + } } // The underlying logic to check the recent text, with the addition of a
diff --git a/components/os_crypt/sync/keychain_password_mac.h b/components/os_crypt/sync/keychain_password_mac.h index dd7a4ba..0c0b067 100644 --- a/components/os_crypt/sync/keychain_password_mac.h +++ b/components/os_crypt/sync/keychain_password_mac.h
@@ -8,6 +8,7 @@ #include <string> #include "base/component_export.h" +#include "base/memory/raw_ref.h" namespace crypto { class AppleKeychain; @@ -41,7 +42,7 @@ static COMPONENT_EXPORT(OS_CRYPT) KeychainNameType& GetAccountName(); private: - const crypto::AppleKeychain& keychain_; + const raw_ref<const crypto::AppleKeychain> keychain_; }; #endif // COMPONENTS_OS_CRYPT_SYNC_KEYCHAIN_PASSWORD_MAC_H_
diff --git a/components/os_crypt/sync/keychain_password_mac.mm b/components/os_crypt/sync/keychain_password_mac.mm index 901caf0..e7a65e9 100644 --- a/components/os_crypt/sync/keychain_password_mac.mm +++ b/components/os_crypt/sync/keychain_password_mac.mm
@@ -81,7 +81,7 @@ std::string KeychainPassword::GetPassword() const { UInt32 password_length = 0; void* password_data = nullptr; - OSStatus error = keychain_.FindGenericPassword( + OSStatus error = keychain_->FindGenericPassword( GetServiceName().size(), GetServiceName().c_str(), GetAccountName().size(), GetAccountName().c_str(), &password_length, &password_data, /*item=*/nullptr); @@ -89,13 +89,13 @@ if (error == noErr) { std::string password = std::string(static_cast<char*>(password_data), password_length); - keychain_.ItemFreeContent(password_data); + keychain_->ItemFreeContent(password_data); return password; } if (error == errSecItemNotFound) { std::string password = AddRandomPasswordToKeychain( - keychain_, GetServiceName(), GetAccountName()); + *keychain_, GetServiceName(), GetAccountName()); return password; }
diff --git a/components/page_info/page_info.cc b/components/page_info/page_info.cc index 488d98d..cc90deb 100644 --- a/components/page_info/page_info.cc +++ b/components/page_info/page_info.cc
@@ -22,7 +22,6 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/browsing_data/content/browsing_data_helper.h" -#include "components/browsing_data/core/features.h" #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/browser/ui/cookie_controls_controller.h" #include "components/content_settings/core/browser/content_settings_registry.h" @@ -1513,16 +1512,8 @@ void PageInfo::PresentSiteData(base::OnceClosure done) { auto* settings = GetPageSpecificContentSettings(); - if (settings) { - if (base::FeatureList::IsEnabled( - browsing_data::features::kMigrateStorageToBDM) && - weak_factory_.GetWeakPtr()) { - PresentSiteDataInternal(std::move(done)); - } else { - settings->allowed_local_shared_objects().UpdateIgnoredEmptyStorageKeys( - base::BindOnce(&PageInfo::PresentSiteDataInternal, - weak_factory_.GetWeakPtr(), std::move(done))); - } + if (settings && weak_factory_.GetWeakPtr()) { + PresentSiteDataInternal(std::move(done)); } else { std::move(done).Run(); }
diff --git a/components/password_manager/core/browser/export/password_csv_writer.cc b/components/password_manager/core/browser/export/password_csv_writer.cc index 54520d23..b47168c 100644 --- a/components/password_manager/core/browser/export/password_csv_writer.cc +++ b/components/password_manager/core/browser/export/password_csv_writer.cc
@@ -8,7 +8,6 @@ #include "components/password_manager/core/browser/affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/export/csv_writer.h" #include "components/password_manager/core/browser/ui/credential_ui_entry.h" -#include "components/sync/base/features.h" namespace password_manager { @@ -34,9 +33,7 @@ } record[kUsernameColumnName] = base::UTF16ToUTF8(credential.username); record[kPasswordColumnName] = base::UTF16ToUTF8(credential.password); - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - record[kNoteColumnName] = base::UTF16ToUTF8(credential.note); - } + record[kNoteColumnName] = base::UTF16ToUTF8(credential.note); return record; } @@ -45,15 +42,12 @@ // static std::string PasswordCSVWriter::SerializePasswords( const std::vector<CredentialUIEntry>& credentials) { - std::vector<std::string> header(4); + std::vector<std::string> header(5); header[0] = kTitleColumnName; header[1] = kUrlColumnName; header[2] = kUsernameColumnName; header[3] = kPasswordColumnName; - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - header.resize(5); - header[4] = kNoteColumnName; - } + header[4] = kNoteColumnName; std::vector<std::map<std::string, std::string>> records; records.reserve(credentials.size()); @@ -63,6 +57,16 @@ } } + std::sort(records.begin(), records.end(), [&header]( + const std::map<std::string, std::string>& lhs, + const std::map<std::string, std::string>& rhs) { + for (const std::string& headerVal : header) { + if (lhs.at(headerVal) < rhs.at(headerVal)) return true; + if (lhs.at(headerVal) > rhs.at(headerVal)) return false; + } + return false; + }); + std::string result; WriteCSV(header, records, &result); return result;
diff --git a/components/password_manager/core/browser/export/password_csv_writer_unittest.cc b/components/password_manager/core/browser/export/password_csv_writer_unittest.cc index 365c6e76..62e76fb 100644 --- a/components/password_manager/core/browser/export/password_csv_writer_unittest.cc +++ b/components/password_manager/core/browser/export/password_csv_writer_unittest.cc
@@ -9,11 +9,9 @@ #include <vector> #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "components/password_manager/core/browser/import/csv_password.h" #include "components/password_manager/core/browser/import/csv_password_sequence.h" #include "components/password_manager/core/browser/ui/credential_ui_entry.h" -#include "components/sync/base/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -38,18 +36,7 @@ } // namespace -class PasswordCSVWriterTest : public testing::TestWithParam<bool> { - public: - void SetUp() override { - feature_list_.InitWithFeatureState(syncer::kPasswordNotesWithBackup, - GetParam()); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -TEST_P(PasswordCSVWriterTest, SerializePasswords_ZeroPasswords) { +TEST(PasswordCSVWriterTest, SerializePasswords_ZeroPasswords) { std::vector<CredentialUIEntry> credentials; CSVPasswordSequence seq(PasswordCSVWriter::SerializePasswords(credentials)); @@ -58,7 +45,7 @@ EXPECT_EQ(seq.begin(), seq.end()); } -TEST_P(PasswordCSVWriterTest, SerializePasswords_SinglePassword) { +TEST(PasswordCSVWriterTest, SerializePasswords_SinglePassword) { const std::u16string kNoteValue = base::UTF8ToUTF16("Note Line 1" + kLineEnding + "Note Line 2"); std::vector<CredentialUIEntry> credentials; @@ -71,7 +58,7 @@ credentials.emplace_back(form); CSVPasswordSequence seq(PasswordCSVWriter::SerializePasswords(credentials)); - ASSERT_EQ(CSVPassword::Status::kOK, seq.result()); + ASSERT_EQ(seq.result(), CSVPassword::Status::kOK); std::vector<CredentialUIEntry> pwds; for (const auto& pwd : seq) { @@ -80,20 +67,15 @@ EXPECT_THAT(pwds, ElementsAre(FormHasOriginUsernamePassword( "https://example.com/", "Someone", "Secret"))); - // TODO(crbug.com/1383938): remove this when CSVPasswordSequence will - // support notes. std::string expected = - base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup) - ? "name,url,username,password,note" + kLineEnding + - "example.com,https://example.com/,Someone,Secret,\"Note Line " - "1" + - kLineEnding + "Note Line 2\"" + kLineEnding - : "name,url,username,password" + kLineEnding + - "example.com,https://example.com/,Someone,Secret" + kLineEnding; - EXPECT_EQ(expected, PasswordCSVWriter::SerializePasswords(credentials)); + "name,url,username,password,note" + kLineEnding + + "example.com,https://example.com/,Someone,Secret,\"Note Line " + "1" + + kLineEnding + "Note Line 2\"" + kLineEnding; + EXPECT_EQ(PasswordCSVWriter::SerializePasswords(credentials), expected); } -TEST_P(PasswordCSVWriterTest, SerializePasswords_TwoPasswords) { +TEST(PasswordCSVWriterTest, SerializePasswords_TwoPasswords) { std::vector<CredentialUIEntry> credentials; PasswordForm form; form.signon_realm = "https://example.com/"; @@ -108,7 +90,7 @@ credentials.emplace_back(form); CSVPasswordSequence seq(PasswordCSVWriter::SerializePasswords(credentials)); - ASSERT_EQ(CSVPassword::Status::kOK, seq.result()); + ASSERT_EQ(seq.result(), CSVPassword::Status::kOK); std::vector<CredentialUIEntry> pwds; for (const auto& pwd : seq) { @@ -121,7 +103,7 @@ "Anyone", "None"))); } -TEST_P(PasswordCSVWriterTest, SerializePasswordsWritesNames) { +TEST(PasswordCSVWriterTest, SerializePasswordsWritesNames) { std::vector<CredentialUIEntry> credentials; PasswordForm form; form.signon_realm = "https://example.com/"; @@ -145,24 +127,48 @@ form.username_value = u"a"; form.password_value = u"b"; credentials.emplace_back(form); - std::string expected = - base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup) - ? "name,url,username,password,note" + kLineEnding + - "example.com,https://example.com/,a,b," + kLineEnding + - "Netflix,android://Jzj5T2E45Hb33D-lk-" - "EHZVCrb7a064dEicTwrTYQYGXO99JqE2YERhbMP1qLogwJiy87OsB" - "zC09Gk094Z-U_hg==@com.netflix.mediaclient,a,b," + - kLineEnding - : "name,url,username,password" + kLineEnding + - "example.com,https://example.com/,a,b" + kLineEnding + - "Netflix,android://Jzj5T2E45Hb33D-lk-" - "EHZVCrb7a064dEicTwrTYQYGXO99JqE2YERhbMP1qLogwJiy87OsB" - "zC09Gk094Z-U_hg==@com.netflix.mediaclient,a,b" + - kLineEnding; - EXPECT_EQ(expected, PasswordCSVWriter::SerializePasswords(credentials)); + std::string expected = "name,url,username,password,note" + kLineEnding + + "Netflix,android://Jzj5T2E45Hb33D-lk-" + "EHZVCrb7a064dEicTwrTYQYGXO99JqE2YERhbMP1qLogwJiy87OsB" + "zC09Gk094Z-U_hg==@com.netflix.mediaclient,a,b," + + kLineEnding + "example.com,https://example.com/,a,b," + + kLineEnding; + EXPECT_EQ(PasswordCSVWriter::SerializePasswords(credentials), expected); } -TEST_P(PasswordCSVWriterTest, SerializeAffiliatedPasswords) { +TEST(PasswordCSVWriterTest, SerializePasswordsIsSorted) { + std::vector<CredentialUIEntry> credentials; + PasswordForm form; + form.signon_realm = "https://example.com/"; + form.url = GURL("https://example.com"); + form.username_value = u"a"; + form.password_value = u"b"; + credentials.emplace_back(form); + form.signon_realm = "https://other.org/"; + form.url = GURL("https://other.org"); + form.username_value = u"a"; + form.password_value = u"b"; + credentials.emplace_back(form); + form.signon_realm = "https://example.com/"; + form.url = GURL("https://example.com"); + form.username_value = u"someone"; + form.password_value = u"secret"; + credentials.emplace_back(form); + form.signon_realm = "https://example.org/"; + form.url = GURL("https://example.org"); + form.username_value = u"a"; + form.password_value = u"b"; + credentials.emplace_back(form); + std::string expected = "name,url,username,password,note" + kLineEnding + + "example.com,https://example.com/,a,b," + kLineEnding + + "example.com,https://example.com/,someone,secret," + + kLineEnding + "example.org,https://example.org/,a,b," + + kLineEnding + "other.org,https://other.org/,a,b," + + kLineEnding; + EXPECT_EQ(PasswordCSVWriter::SerializePasswords(credentials), expected); +} + +TEST(PasswordCSVWriterTest, SerializeAffiliatedPasswords) { std::vector<CredentialUIEntry> credentials; PasswordForm form1; form1.signon_realm = "https://example.com/"; @@ -177,7 +183,7 @@ credentials.emplace_back(std::vector<PasswordForm>{form1, form2}); CSVPasswordSequence seq(PasswordCSVWriter::SerializePasswords(credentials)); - ASSERT_EQ(CSVPassword::Status::kOK, seq.result()); + ASSERT_EQ(seq.result(), CSVPassword::Status::kOK); std::vector<CredentialUIEntry> pwds; for (const auto& pwd : seq) { @@ -190,6 +196,4 @@ "username", "Secret"))); } -INSTANTIATE_TEST_SUITE_P(All, PasswordCSVWriterTest, testing::Bool()); - } // namespace password_manager
diff --git a/components/password_manager/core/browser/import/password_importer.cc b/components/password_manager/core/browser/import/password_importer.cc index db5cbfa..95ff0bda 100644 --- a/components/password_manager/core/browser/import/password_importer.cc +++ b/components/password_manager/core/browser/import/password_importer.cc
@@ -24,9 +24,7 @@ #include "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/password_manager/core/browser/ui/credential_utils.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" -#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/services/csv_password/csv_password_parser_service.h" -#include "components/sync/base/features.h" using password_manager::ImportEntry; namespace password_manager { @@ -169,8 +167,7 @@ return base::unexpected(with_status(ImportEntry::Status::LONG_USERNAME)); } - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup) && - csv_password.GetNote().length() > 1000) { + if (csv_password.GetNote().length() > 1000) { return base::unexpected(with_status(ImportEntry::Status::LONG_NOTE)); } @@ -233,7 +230,6 @@ std::u16string ComputeNotesConcatenation(const std::u16string& local_note, const std::u16string& imported_note, NotesImportMetrics& metrics) { - CHECK(base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); CHECK_LE(imported_note.size(), PasswordImporter::MAX_NOTE_LENGTH); if (imported_note.empty()) { @@ -406,8 +402,7 @@ if (!forms.empty()) { duplicates_count++; - if (!base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup) || - imported_credential.note.empty()) { + if (imported_credential.note.empty()) { // Duplicates are reported as successfully imported credentials. results.number_imported++; return; @@ -420,14 +415,6 @@ return; } - if (!base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - CredentialUIEntry imported_credential_without_note = imported_credential; - imported_credential_without_note.note.clear(); - incoming_passwords.add_credentials.emplace_back( - std::move(imported_credential_without_note)); - return; - } - // Valid credential with no conflicts and no duplicates. incoming_passwords.add_credentials.push_back(imported_credential); }
diff --git a/components/password_manager/core/browser/import/password_importer_unittest.cc b/components/password_manager/core/browser/import/password_importer_unittest.cc index 57d68b5a..6bbd4fc5 100644 --- a/components/password_manager/core/browser/import/password_importer_unittest.cc +++ b/components/password_manager/core/browser/import/password_importer_unittest.cc
@@ -12,7 +12,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "components/password_manager/core/browser/affiliation/fake_affiliation_service.h" #include "components/password_manager/core/browser/import/csv_password_sequence.h" @@ -20,8 +19,6 @@ #include "components/password_manager/core/browser/password_store/test_password_store.h" #include "components/password_manager/core/browser/ui/credential_ui_entry.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/base/features.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -62,8 +59,6 @@ class PasswordImporterTest : public testing::Test { public: PasswordImporterTest() : receiver_{&service_}, importer_(&presenter_) { - feature_list_.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); - CHECK(temp_directory_.CreateUniqueTempDir()); mojo::PendingRemote<mojom::CSVPasswordParser> pending_remote{ receiver_.BindNewPipeAndPassRemote()}; @@ -170,7 +165,6 @@ import_results_ = results; } - base::test::ScopedFeatureList feature_list_; base::test::TaskEnvironment task_environment_; password_manager::ImportResults import_results_; bool results_callback_called_ = false;
diff --git a/components/password_manager/core/browser/password_store/login_database.cc b/components/password_manager/core/browser/password_store/login_database.cc index 38e6af8..bde61b5a 100644 --- a/components/password_manager/core/browser/password_store/login_database.cc +++ b/components/password_manager/core/browser/password_store/login_database.cc
@@ -42,7 +42,6 @@ #include "components/password_manager/core/browser/password_store/psl_matching_helper.h" #include "components/password_manager/core/browser/sql_table_builder.h" #include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/base/features.h" #include "components/sync/base/model_type.h" #include "components/sync/model/metadata_batch.h" #include "components/sync/protocol/entity_metadata.pb.h" @@ -2454,19 +2453,12 @@ std::vector<PasswordNote> LoginDatabase::GetPasswordNotes( FormPrimaryKey primary_key) const { - if (!base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - return {}; - } return password_notes_table_.GetPasswordNotes(primary_key); } void LoginDatabase::UpdatePasswordNotes( FormPrimaryKey primary_key, const std::vector<PasswordNote>& notes) { - if (!base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - return; - } - password_notes_table_.RemovePasswordNotes(primary_key); for (const PasswordNote& note : notes) { password_notes_table_.InsertOrReplace(primary_key, note);
diff --git a/components/password_manager/core/browser/password_store/login_database_unittest.cc b/components/password_manager/core/browser/password_store/login_database_unittest.cc index 1e4afa3..77d85fa 100644 --- a/components/password_manager/core/browser/password_store/login_database_unittest.cc +++ b/components/password_manager/core/browser/password_store/login_database_unittest.cc
@@ -37,7 +37,6 @@ #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" -#include "components/sync/base/features.h" #include "components/sync/base/model_type.h" #include "components/sync/model/metadata_batch.h" #include "components/sync/protocol/entity_metadata.pb.h" @@ -2488,9 +2487,6 @@ } TEST_F(LoginDatabaseTest, RetrievesNoteWithLogin) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); - PasswordForm form = GenerateExamplePasswordForm(); std::ignore = db().AddLogin(form); PasswordNote note(u"example note", base::Time::Now()); @@ -2506,9 +2502,6 @@ } TEST_F(LoginDatabaseTest, AddLoginWithNotePersistsThem) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); - PasswordForm form = GenerateExamplePasswordForm(); PasswordNote note(u"example note", base::Time::Now()); form.notes = {note}; @@ -2520,9 +2513,6 @@ } TEST_F(LoginDatabaseTest, RemoveLoginRemovesNoteAttachedToTheLogin) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); - PasswordForm form = GenerateExamplePasswordForm(); PasswordNote note = PasswordNote(u"example note", base::Time::Now()); form.notes = {note};
diff --git a/components/password_manager/core/browser/store_metrics_reporter.cc b/components/password_manager/core/browser/store_metrics_reporter.cc index 74874c12f..a995b60 100644 --- a/components/password_manager/core/browser/store_metrics_reporter.cc +++ b/components/password_manager/core/browser/store_metrics_reporter.cc
@@ -24,11 +24,9 @@ #include "components/password_manager/core/browser/password_store/password_store_consumer.h" #include "components/password_manager/core/browser/password_store/password_store_interface.h" #include "components/password_manager/core/browser/password_sync_util.h" -#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/safe_browsing/core/common/features.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" -#include "components/sync/base/features.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/gaia_urls.h" @@ -295,10 +293,6 @@ void ReportPasswordNotesMetrics( bool is_account_store, const std::vector<std::unique_ptr<PasswordForm>>& forms) { - if (!base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - return; - } - base::StringPiece suffix_for_store = GetMetricsSuffixForStore(is_account_store);
diff --git a/components/password_manager/core/browser/store_metrics_reporter_unittest.cc b/components/password_manager/core/browser/store_metrics_reporter_unittest.cc index 33975a4..3804fa47 100644 --- a/components/password_manager/core/browser/store_metrics_reporter_unittest.cc +++ b/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
@@ -29,7 +29,6 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" -#include "components/sync/base/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -150,8 +149,7 @@ // should be mocked. OSCryptMocker::SetUp(); - feature_list_.InitWithFeatures({features::kPasswordReuseDetectionEnabled, - syncer::kPasswordNotesWithBackup}, + feature_list_.InitWithFeatures({features::kPasswordReuseDetectionEnabled}, {}); prefs_.registry()->RegisterBooleanPref(prefs::kCredentialsEnableService,
diff --git a/components/password_manager/core/browser/sync/password_proto_utils.cc b/components/password_manager/core/browser/sync/password_proto_utils.cc index d36557f..077d0b0 100644 --- a/components/password_manager/core/browser/sync/password_proto_utils.cc +++ b/components/password_manager/core/browser/sync/password_proto_utils.cc
@@ -9,7 +9,6 @@ #include "base/strings/utf_string_conversions.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/base/features.h" #include "components/sync/protocol/password_specifics.pb.h" using autofill::FormData; @@ -281,10 +280,8 @@ : password_form.federation_origin.Serialize()); *password_data.mutable_password_issues() = PasswordIssuesMapToProto(password_form.password_issues); - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - *password_data.mutable_notes() = - PasswordNotesToProto(password_form.notes, base_password_data.notes()); - } + *password_data.mutable_notes() = + PasswordNotesToProto(password_form.notes, base_password_data.notes()); password_data.set_sender_email(base::UTF16ToUTF8(password_form.sender_email)); password_data.set_sender_name(base::UTF16ToUTF8(password_form.sender_name)); password_data.set_date_received_windows_epoch_micros( @@ -349,9 +346,7 @@ password.federation_origin = url::Origin::Create(GURL(password_data.federation_url())); password.password_issues = PasswordIssuesMapFromProto(password_data); - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - password.notes = PasswordNotesFromProto(password_data.notes()); - } + password.notes = PasswordNotesFromProto(password_data.notes()); password.sender_email = base::UTF8ToUTF16(password_data.sender_email()); password.sender_name = base::UTF8ToUTF16(password_data.sender_name()); password.date_received =
diff --git a/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc b/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc index 421bdf254..82131e0 100644 --- a/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc +++ b/components/password_manager/core/browser/sync/password_proto_utils_unittest.cc
@@ -4,12 +4,8 @@ #include "components/password_manager/core/browser/sync/password_proto_utils.h" -#include "base/feature_list.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "components/password_manager/core/browser/password_form.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/base/features.h" #include "components/sync/protocol/password_specifics.pb.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -81,11 +77,9 @@ password_specifics.set_federation_url(std::string()); *password_specifics.mutable_password_issues() = CreatePasswordIssues(issue_types); - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - // The current code always populates notes for outgoing protos even when - // non-exists. - password_specifics.mutable_notes(); - } + // The current code always populates notes for outgoing protos even when none + // exist. + password_specifics.mutable_notes(); password_specifics.set_sender_email("sender@example.com"); password_specifics.set_sender_name("Sender Name"); password_specifics.set_date_received_windows_epoch_micros( @@ -204,30 +198,19 @@ } TEST(PasswordProtoUtilsTest, ConvertSpecificsToFormAndBack) { - for (bool is_notes_enabled : {false, true}) { - base::test::ScopedFeatureList scoped_feature_list; - if (is_notes_enabled) { - scoped_feature_list.InitAndEnableFeature( - syncer::kPasswordNotesWithBackup); - } else { - scoped_feature_list.InitAndDisableFeature( - syncer::kPasswordNotesWithBackup); - } - sync_pb::PasswordSpecifics specifics; - *specifics.mutable_client_only_encrypted_data() = CreateSpecificsData( - "http://www.origin.com/", "username_element", "username_value", - "password_element", "signon_realm", - /*issue_types=*/{}); - *specifics.mutable_unencrypted_metadata() = - CreateSpecificsMetadata(specifics.client_only_encrypted_data()); + sync_pb::PasswordSpecifics specifics; + *specifics.mutable_client_only_encrypted_data() = + CreateSpecificsData("http://www.origin.com/", "username_element", + "username_value", "password_element", "signon_realm", + /*issue_types=*/{}); + *specifics.mutable_unencrypted_metadata() = + CreateSpecificsMetadata(specifics.client_only_encrypted_data()); - EXPECT_THAT( - SpecificsFromPassword( - PasswordFromSpecifics(specifics.client_only_encrypted_data()), - /*base_password_data=*/{}) - .SerializeAsString(), - Eq(specifics.SerializeAsString())); - } + EXPECT_EQ(SpecificsFromPassword( + PasswordFromSpecifics(specifics.client_only_encrypted_data()), + /*base_password_data=*/{}) + .SerializeAsString(), + specifics.SerializeAsString()); } TEST(PasswordProtoUtilsTest, CopiesPasswordIssuesToMetadata) {
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 69d2709..bff8c2f 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -166,10 +166,8 @@ remote_password_specifics.avatar_url() && local_password_specifics.federation_url() == remote_password_specifics.federation_url() && - (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup) - ? PasswordNotesFromProto(local_password_specifics.notes()) == - PasswordNotesFromProto(remote_password_specifics.notes()) - : true); + PasswordNotesFromProto(local_password_specifics.notes()) == + PasswordNotesFromProto(remote_password_specifics.notes()); } // Returns true iff |remote_password_specifics| and |local_password_specifics| @@ -364,8 +362,7 @@ } else if (syncer::IsInitialSyncDone( batch->GetModelTypeState().initial_sync_state()) && !batch->GetModelTypeState() - .notes_enabled_before_initial_sync_for_passwords() && - base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { + .notes_enabled_before_initial_sync_for_passwords()) { // The browser has just been upgraded to a version that supports password // notes. Therefore, the metadata are cleared to enforce the initial sync // flow and download any potential passwords notes on the server. The @@ -376,18 +373,6 @@ batch = std::make_unique<syncer::MetadataBatch>(); sync_metadata_read_error = SyncMetadataReadError:: kPasswordsRequireRedownloadForPotentialNotesOnTheServer; - } else if (syncer::IsInitialSyncDone( - batch->GetModelTypeState().initial_sync_state()) && - batch->GetModelTypeState() - .notes_enabled_before_initial_sync_for_passwords() && - !base::FeatureList::IsEnabled( - syncer::kPasswordNotesWithBackup)) { - // The feature was enabled before, but not anymore (e.g. due to experiment - // ramp-down). Clear the flag to enforce the initial sync flow when the - // feature is enabled again. - sync_pb::ModelTypeState model_state = batch->GetModelTypeState(); - model_state.set_notes_enabled_before_initial_sync_for_passwords(false); - batch->SetModelTypeState(model_state); } else if (DoesPasswordStoreContainAccidentalBatchDeletions( password_store_sync_->IsAccountStore(), batch->GetAllMetadata())) {
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index 5f232276..893658e 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -1021,8 +1021,6 @@ TEST_F(PasswordSyncBridgeTest, ShouldRemoveSyncMetadataToRedownloadPasswordNotes) { base::HistogramTester histogram_tester; - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata) .WillByDefault([&]() { @@ -1054,8 +1052,6 @@ PasswordSyncBridgeTest, ShouldNotRemoveSyncMetadataToRedownloadPasswordNotesWhenHasBeenAlreadyRedownloaded) { base::HistogramTester histogram_tester; - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata) .WillByDefault([&]() { @@ -1081,70 +1077,6 @@ syncer::WipeModelUponSyncDisabledBehavior::kNever, base::DoNothing()); } -TEST_F( - PasswordSyncBridgeTest, - ShouldNotRemoveSyncMetadataToRedownloadPasswordNotesWhenFeatureIsDisabled) { - base::HistogramTester histogram_tester; - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature(syncer::kPasswordNotesWithBackup); - - ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata) - .WillByDefault([&]() { - auto metadata_batch = std::make_unique<syncer::MetadataBatch>(); - sync_pb::ModelTypeState model_type_state; - model_type_state.set_initial_sync_state( - sync_pb::ModelTypeState_InitialSyncState_INITIAL_SYNC_DONE); - metadata_batch->SetModelTypeState(model_type_state); - return metadata_batch; - }); - - EXPECT_CALL(mock_processor(), ModelReadyToSync(MetadataBatchContains( - /*state=*/syncer::HasInitialSyncDone(), - /*entities=*/testing::SizeIs(0)))); - EXPECT_CALL(*mock_sync_metadata_store_sync(), DeleteAllSyncMetadata).Times(0); - - auto bridge = std::make_unique<PasswordSyncBridge>( - mock_processor().CreateForwardingProcessor(), mock_password_store_sync(), - syncer::WipeModelUponSyncDisabledBehavior::kNever, base::DoNothing()); -} - -TEST_F(PasswordSyncBridgeTest, - ShouldClearNotesBeforeSyncFlagWhenFeatureIsDisabled) { - base::HistogramTester histogram_tester; - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature(syncer::kPasswordNotesWithBackup); - - ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata) - .WillByDefault([&]() { - auto metadata_batch = std::make_unique<syncer::MetadataBatch>(); - sync_pb::ModelTypeState model_type_state; - model_type_state.set_initial_sync_state( - sync_pb::ModelTypeState_InitialSyncState_INITIAL_SYNC_DONE); - model_type_state.set_notes_enabled_before_initial_sync_for_passwords( - true); - metadata_batch->SetModelTypeState(model_type_state); - return metadata_batch; - }); - - EXPECT_CALL( - mock_processor(), - ModelReadyToSync(syncer::MetadataBatchContains( - testing::AllOf( - testing::Property( - &sync_pb::ModelTypeState::initial_sync_state, - sync_pb::ModelTypeState_InitialSyncState_INITIAL_SYNC_DONE), - testing::Property( - &sync_pb::ModelTypeState:: - notes_enabled_before_initial_sync_for_passwords, - false)), - /*entities=*/testing::SizeIs(0)))); - EXPECT_CALL(*mock_sync_metadata_store_sync(), DeleteAllSyncMetadata).Times(0); - - auto bridge = std::make_unique<PasswordSyncBridge>( - mock_processor().CreateForwardingProcessor(), mock_password_store_sync(), - syncer::WipeModelUponSyncDisabledBehavior::kNever, base::DoNothing()); -} - TEST_F(PasswordSyncBridgeTest, ShouldNotRemoveSyncMetadataWhenSpecificsCacheIsEmpty) { ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata) @@ -1283,7 +1215,7 @@ model_type_state.set_initial_sync_state( sync_pb::ModelTypeState_InitialSyncState_INITIAL_SYNC_DONE); model_type_state.set_notes_enabled_before_initial_sync_for_passwords( - base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); + true); auto metadata_batch = std::make_unique<syncer::MetadataBatch>(); metadata_batch->SetModelTypeState(model_type_state); metadata_batch->AddMetadata(
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter.cc index 5b1df88..d881c02 100644 --- a/components/password_manager/core/browser/ui/saved_passwords_presenter.cc +++ b/components/password_manager/core/browser/ui/saved_passwords_presenter.cc
@@ -16,7 +16,6 @@ #include "base/check.h" #include "base/containers/contains.h" #include "base/containers/fixed_flat_set.h" -#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/notreached.h" @@ -31,8 +30,6 @@ #include "components/password_manager/core/browser/ui/credential_utils.h" #include "components/password_manager/core/browser/ui/password_undo_helper.h" #include "components/password_manager/core/browser/ui/passwords_grouper.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/base/features.h" #include "components/webauthn/core/browser/passkey_model.h" #include "components/webauthn/core/browser/passkey_model_change.h" #include "url/gurl.h" @@ -659,8 +656,7 @@ new_form.password_issues.clear(); } - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup) && - note_changed) { + if (note_changed) { new_form.SetNoteWithEmptyUniqueDisplayName(updated_credential.note); }
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc index 37eeb2ca..fbf7db8c 100644 --- a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc +++ b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
@@ -18,7 +18,6 @@ #include "base/test/gmock_move_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_mock_time_task_runner.h" #include "base/time/time.h" @@ -31,8 +30,6 @@ #include "components/password_manager/core/browser/password_store/password_store_interface.h" #include "components/password_manager/core/browser/password_store/test_password_store.h" #include "components/password_manager/core/browser/ui/credential_ui_entry.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/sync/base/features.h" #include "components/sync/protocol/webauthn_credential_specifics.pb.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -126,7 +123,6 @@ } private: - base::test::ScopedFeatureList feature_list_; base::test::SingleThreadTaskEnvironment task_env_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; scoped_refptr<TestPasswordStore> store_ = @@ -483,8 +479,6 @@ } TEST_F(SavedPasswordsPresenterTest, EditOnlyNoteFirstTime) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); PasswordForm form = CreateTestPasswordForm(PasswordForm::Store::kProfileStore); form.notes.emplace_back(u"display name", u"note with non-empty display name", @@ -516,8 +510,6 @@ } TEST_F(SavedPasswordsPresenterTest, EditingNotesShouldNotResetPasswordIssues) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); PasswordForm form = CreateTestPasswordForm(PasswordForm::Store::kProfileStore); @@ -548,8 +540,6 @@ } TEST_F(SavedPasswordsPresenterTest, EditOnlyNoteSecondTime) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); PasswordNote kExistingNote = PasswordNote(u"existing note", base::Time::Now()); PasswordForm form = @@ -579,8 +569,6 @@ } TEST_F(SavedPasswordsPresenterTest, EditNoteAsEmpty) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); PasswordForm form = CreateTestPasswordForm(PasswordForm::Store::kProfileStore); form.notes = {PasswordNote(u"existing note", base::Time::Now())}; @@ -1114,7 +1102,6 @@ } private: - base::test::ScopedFeatureList feature_list_; base::test::SingleThreadTaskEnvironment task_env_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; scoped_refptr<TestPasswordStore> profile_store_ = @@ -1998,7 +1985,6 @@ void RunUntilIdle() { task_env_.RunUntilIdle(); } private: - base::test::ScopedFeatureList feature_list_; base::test::SingleThreadTaskEnvironment task_env_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; scoped_refptr<MockPasswordStoreInterface> profile_store_ =
diff --git a/components/password_manager/ios/account_select_fill_data.h b/components/password_manager/ios/account_select_fill_data.h index 34644d2..69381a3 100644 --- a/components/password_manager/ios/account_select_fill_data.h +++ b/components/password_manager/ios/account_select_fill_data.h
@@ -10,6 +10,7 @@ #include <string> #include <vector> +#include "base/memory/raw_ptr.h" #include "components/autofill/core/common/unique_ids.h" #include "url/gurl.h" @@ -125,7 +126,7 @@ // should be const. // Keeps information about last form that was requested in // RetrieveSuggestions. - mutable const FormInfo* last_requested_form_ = nullptr; + mutable raw_ptr<const FormInfo> last_requested_form_ = nullptr; // Keeps id of the last requested field if it was password otherwise the empty // string. autofill::FieldRendererId last_requested_password_field_id_;
diff --git a/components/password_manager/ios/ios_password_manager_driver.h b/components/password_manager/ios/ios_password_manager_driver.h index 507570b..8dbcd7f 100644 --- a/components/password_manager/ios/ios_password_manager_driver.h +++ b/components/password_manager/ios/ios_password_manager_driver.h
@@ -7,6 +7,7 @@ #include <vector> +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "components/password_manager/core/browser/password_generation_frame_helper.h" #include "components/password_manager/core/browser/password_manager_driver.h" @@ -87,7 +88,7 @@ base::WeakPtr<web::WebState> web_state_; __weak id<PasswordManagerDriverBridge> bridge_; // (weak) - password_manager::PasswordManagerInterface* password_manager_; + raw_ptr<password_manager::PasswordManagerInterface> password_manager_; std::unique_ptr<password_manager::PasswordGenerationFrameHelper> password_generation_helper_; int id_;
diff --git a/components/password_manager/ios/ios_password_manager_driver_factory.h b/components/password_manager/ios/ios_password_manager_driver_factory.h index 064d9e90..6795cf4e 100644 --- a/components/password_manager/ios/ios_password_manager_driver_factory.h +++ b/components/password_manager/ios/ios_password_manager_driver_factory.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_PASSWORD_MANAGER_IOS_IOS_PASSWORD_MANAGER_DRIVER_FACTORY_H_ #define COMPONENTS_PASSWORD_MANAGER_IOS_IOS_PASSWORD_MANAGER_DRIVER_FACTORY_H_ +#include "base/memory/raw_ptr.h" #include "components/password_manager/core/browser/password_manager_interface.h" #import "components/password_manager/ios/ios_password_manager_driver.h" #include "components/password_manager/ios/password_manager_driver_bridge.h" @@ -55,7 +56,7 @@ password_manager::PasswordManagerInterface* password_manager); id<PasswordManagerDriverBridge> bridge_; - password_manager::PasswordManagerInterface* password_manager_; + raw_ptr<password_manager::PasswordManagerInterface> password_manager_; int next_free_id = 0; WEB_STATE_USER_DATA_KEY_DECL();
diff --git a/components/password_manager/ios/ios_password_manager_driver_factory_unittest.mm b/components/password_manager/ios/ios_password_manager_driver_factory_unittest.mm index b8feb3f..bbe4828 100644 --- a/components/password_manager/ios/ios_password_manager_driver_factory_unittest.mm +++ b/components/password_manager/ios/ios_password_manager_driver_factory_unittest.mm
@@ -4,6 +4,7 @@ #import "components/password_manager/ios/ios_password_manager_driver_factory.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/password_manager/core/browser/password_manager.h" #import "components/password_manager/core/browser/password_manager_client.h" @@ -31,7 +32,7 @@ protected: web::FakeWebState web_state_; - web::FakeWebFramesManager* web_frames_manager_; + raw_ptr<web::FakeWebFramesManager> web_frames_manager_; std::unique_ptr<password_manager::PasswordManager> password_manager_; SharedPasswordController* password_controller_; password_manager::StubPasswordManagerClient password_manager_client_;
diff --git a/components/password_manager/ios/ios_password_manager_driver_unittest.mm b/components/password_manager/ios/ios_password_manager_driver_unittest.mm index 738efe1d..fbc1f05 100644 --- a/components/password_manager/ios/ios_password_manager_driver_unittest.mm +++ b/components/password_manager/ios/ios_password_manager_driver_unittest.mm
@@ -4,6 +4,7 @@ #import "components/password_manager/ios/ios_password_manager_driver.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/ios/browser/autofill_java_script_feature.h" #import "components/password_manager/core/browser/password_manager.h" @@ -90,10 +91,10 @@ } protected: - web::FakeWebFramesManager* web_frames_manager_; + raw_ptr<web::FakeWebFramesManager> web_frames_manager_; web::FakeWebState web_state_; - IOSPasswordManagerDriver* driver_; - IOSPasswordManagerDriver* driver2_; + raw_ptr<IOSPasswordManagerDriver> driver_; + raw_ptr<IOSPasswordManagerDriver> driver2_; id password_controller_; testing::StrictMock<MockPasswordManagerClient> password_manager_client_; PasswordManager password_manager_ =
diff --git a/components/password_manager/ios/password_controller_driver_helper.mm b/components/password_manager/ios/password_controller_driver_helper.mm index c24869d..210d611 100644 --- a/components/password_manager/ios/password_controller_driver_helper.mm +++ b/components/password_manager/ios/password_controller_driver_helper.mm
@@ -4,10 +4,11 @@ #import "components/password_manager/ios/password_controller_driver_helper.h" +#import "base/memory/raw_ptr.h" #import "components/password_manager/ios/ios_password_manager_driver_factory.h" @implementation PasswordControllerDriverHelper { - web::WebState* _webState; + raw_ptr<web::WebState> _webState; } #pragma mark - Initialization
diff --git a/components/password_manager/ios/password_controller_driver_helper_unittest.mm b/components/password_manager/ios/password_controller_driver_helper_unittest.mm index 59635dc..185f3eb 100644 --- a/components/password_manager/ios/password_controller_driver_helper_unittest.mm +++ b/components/password_manager/ios/password_controller_driver_helper_unittest.mm
@@ -4,6 +4,7 @@ #import "components/password_manager/ios/password_controller_driver_helper.h" +#import "base/memory/raw_ptr.h" #import "components/password_manager/core/browser/password_generation_frame_helper.h" #import "components/password_manager/core/browser/password_manager.h" #import "components/password_manager/core/browser/password_manager_client.h" @@ -49,7 +50,7 @@ web::FakeWebState web_state_; id password_controller_; PasswordControllerDriverHelper* password_controller_helper_; - web::FakeWebFramesManager* web_frames_manager_; + raw_ptr<web::FakeWebFramesManager> web_frames_manager_; testing::StrictMock<MockPasswordManagerClient> password_manager_client_; PasswordManager password_manager_ = PasswordManager(&password_manager_client_);
diff --git a/components/password_manager/ios/password_form_helper.mm b/components/password_manager/ios/password_form_helper.mm index 0cf7ee0..0f1de4e 100644 --- a/components/password_manager/ios/password_form_helper.mm +++ b/components/password_manager/ios/password_form_helper.mm
@@ -9,6 +9,7 @@ #import "base/debug/crash_logging.h" #import "base/debug/dump_without_crashing.h" #include "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #import "base/strings/string_number_conversions.h" @@ -65,7 +66,7 @@ @implementation PasswordFormHelper { // The WebState this instance is observing. Will be null after // -webStateDestroyed: has been called. - web::WebState* _webState; + raw_ptr<web::WebState> _webState; // Bridge to observe WebState from Objective-C. std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge;
diff --git a/components/password_manager/ios/password_suggestion_helper_unittest.mm b/components/password_manager/ios/password_suggestion_helper_unittest.mm index 5cd71a79..2667a737 100644 --- a/components/password_manager/ios/password_suggestion_helper_unittest.mm +++ b/components/password_manager/ios/password_suggestion_helper_unittest.mm
@@ -4,6 +4,7 @@ #import "components/password_manager/ios/password_suggestion_helper.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "components/autofill/core/common/autofill_test_utils.h" @@ -96,8 +97,8 @@ web::FakeWebState web_state_; id delegate_; PasswordSuggestionHelper* helper_; - web::FakeWebFrame* main_frame_; - web::FakeWebFramesManager* frames_manager_; + raw_ptr<web::FakeWebFrame> main_frame_; + raw_ptr<web::FakeWebFramesManager> frames_manager_; }; // Tests that the suggestions check query passes when there is fill data for the
diff --git a/components/password_manager/ios/shared_password_controller.mm b/components/password_manager/ios/shared_password_controller.mm index da370917..23d5f7b 100644 --- a/components/password_manager/ios/shared_password_controller.mm +++ b/components/password_manager/ios/shared_password_controller.mm
@@ -16,6 +16,7 @@ #include "base/apple/foundation_util.h" #include "base/feature_list.h" #include "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/scoped_multi_source_observation.h" #include "base/strings/sys_string_conversions.h" @@ -114,11 +115,11 @@ @end @implementation SharedPasswordController { - PasswordManagerInterface* _passwordManager; + raw_ptr<PasswordManagerInterface> _passwordManager; // The WebState this instance is observing. Will be null after // -webStateDestroyed: has been called. - web::WebState* _webState; + raw_ptr<web::WebState> _webState; PasswordControllerDriverHelper* _driverHelper;
diff --git a/components/password_manager/ios/shared_password_controller_unittest.mm b/components/password_manager/ios/shared_password_controller_unittest.mm index 38eaf6c..31cb089 100644 --- a/components/password_manager/ios/shared_password_controller_unittest.mm +++ b/components/password_manager/ios/shared_password_controller_unittest.mm
@@ -4,6 +4,7 @@ #import "components/password_manager/ios/shared_password_controller.h" +#import "base/memory/raw_ptr.h" #include "base/strings/sys_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #import "base/test/scoped_feature_list.h" @@ -239,7 +240,7 @@ std::unique_ptr<TestAutofillManagerInjector<TestBrowserAutofillManager>> autofill_manager_injector_; web::FakeWebState web_state_; - web::FakeWebFramesManager* web_frames_manager_; + raw_ptr<web::FakeWebFramesManager> web_frames_manager_; testing::StrictMock<MockPasswordManager> password_manager_; testing::StrictMock<MockPasswordGenerationFrameHelper> password_generation_helper_; @@ -953,7 +954,7 @@ base::test::TaskEnvironment task_environment_; autofill::TestAutofillClient autofill_client_; web::FakeWebState web_state_; - web::FakeWebFramesManager* web_frames_manager_; + raw_ptr<web::FakeWebFramesManager> web_frames_manager_; testing::StrictMock<MockPasswordManager> password_manager_; PasswordSuggestionHelper* suggestion_helper_; id form_helper_;
diff --git a/components/pdf/browser/pdf_stream_delegate.h b/components/pdf/browser/pdf_stream_delegate.h index 5d5e8284..d33151f6 100644 --- a/components/pdf/browser/pdf_stream_delegate.h +++ b/components/pdf/browser/pdf_stream_delegate.h
@@ -35,10 +35,9 @@ GURL stream_url; GURL original_url; - // Script to be injected into the internal plugin frame. This should point - // at an immutable string with static storage duration. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union + // Script to be injected into the internal plugin frame. + // RAW_PTR_EXCLUSION: Points to an immutable string with static storage + // duration. RAW_PTR_EXCLUSION const std::string* injected_script = nullptr; SkColor background_color = SK_ColorTRANSPARENT;
diff --git a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc index 9ce3c39..5a518de 100644 --- a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc +++ b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc
@@ -109,7 +109,7 @@ PrintToString(expected_event_type) + " on " + PrintToString(expected_node_id)) { const auto& event = arg; - return Matches(expected_event_type)(event.event_params.event) && + return Matches(expected_event_type)(event.event_params->event) && Matches(expected_node_id)(event.node_id); }
diff --git a/components/performance_manager/public/resource_attribution/query_results.h b/components/performance_manager/public/resource_attribution/query_results.h index a6a849e..e0e83d2 100644 --- a/components/performance_manager/public/resource_attribution/query_results.h +++ b/components/performance_manager/public/resource_attribution/query_results.h
@@ -42,6 +42,16 @@ // Method used to assign measurement results to the resource context. MeasurementAlgorithm algorithm; + // Constructor ensures both `measurement_time` and `algorithm` are set. + // + // Since there's no default constructor, any ResultType class containing + // metadata also can't be default-constructed. This ensures none of them have + // an invalid or uninitialized state. Use std::optional<ResultType> when + // default-construction is needed. + ResultMetadata(base::TimeTicks measurement_time, + MeasurementAlgorithm algorithm) + : measurement_time(measurement_time), algorithm(algorithm) {} + friend constexpr auto operator<=>(const ResultMetadata&, const ResultMetadata&) = default; friend constexpr bool operator==(const ResultMetadata&,
diff --git a/components/performance_manager/resource_attribution/cpu_measurement_monitor.cc b/components/performance_manager/resource_attribution/cpu_measurement_monitor.cc index db9535d..80d6e68 100644 --- a/components/performance_manager/resource_attribution/cpu_measurement_monitor.cc +++ b/components/performance_manager/resource_attribution/cpu_measurement_monitor.cc
@@ -57,26 +57,9 @@ resource_context); } -// Returns true if `result` is in the default-initialized state. -bool IsEmptyCPUTimeResult(const CPUTimeResult& result) { - if (result.metadata.measurement_time.is_null()) { - CHECK(result.start_time.is_null()); - CHECK(result.cumulative_cpu.is_zero()); - return true; - } - return false; -} - -// CHECK's that `result` obeys all constraints: either it is empty (both start -// and end timestamps are null, and `cumulative_cpu` is zero) or the start and -// end timestamps form a positive interval and `cumulative_cpu` will fit into -// that interval. +// CHECK's that `result` obeys all constraints: the start and end timestamps +// form a positive interval and `cumulative_cpu` will fit into that interval. void ValidateCPUTimeResult(const CPUTimeResult& result) { - // Empty struct is valid. - if (IsEmptyCPUTimeResult(result)) { - return; - } - // Start and end must form a valid interval. CHECK(!result.metadata.measurement_time.is_null()); CHECK(!result.start_time.is_null()); @@ -87,51 +70,6 @@ CHECK(!result.cumulative_cpu.is_negative()); } -// Adds the measurement in `delta` to `result`. The start time of `delta` must -// follow the end time of `result`. Used for adding successive measurements of -// process, frame and worker contexts, so the algorithm in the metadata for -// `result` should match that of `delta`. There may be gaps between deltas, such -// as if a process died and was restarted. -void ApplySequentialDelta(CPUTimeResult& result, const CPUTimeResult& delta) { - CHECK(!IsEmptyCPUTimeResult(delta)); - ValidateCPUTimeResult(delta); - if (IsEmptyCPUTimeResult(result)) { - result = delta; - } else { - ValidateCPUTimeResult(result); - CHECK_EQ(result.metadata.algorithm, delta.metadata.algorithm); - CHECK_LE(result.metadata.measurement_time, delta.start_time); - result.metadata.measurement_time = delta.metadata.measurement_time; - result.cumulative_cpu += delta.cumulative_cpu; - } - - // Adding a valid delta to a valid result should produce a valid result. - ValidateCPUTimeResult(result); -} - -// Adds the measurement in `delta` to `result`. Delta may start before `result` -// or end after it. Used for adding frame and worker measurements to page -// contexts, since the frames and workers can be added in any order. The -// algorithm in the metadata for `result` will be set to kSum. -void ApplyOverlappingDelta(CPUTimeResult& result, const CPUTimeResult& delta) { - CHECK(!IsEmptyCPUTimeResult(delta)); - ValidateCPUTimeResult(delta); - if (IsEmptyCPUTimeResult(result)) { - result = delta; - result.metadata.algorithm = MeasurementAlgorithm::kSum; - } else { - ValidateCPUTimeResult(result); - CHECK_EQ(result.metadata.algorithm, MeasurementAlgorithm::kSum); - result.metadata.measurement_time = std::max( - result.metadata.measurement_time, delta.metadata.measurement_time); - result.start_time = std::min(result.start_time, delta.start_time); - result.cumulative_cpu += delta.cumulative_cpu; - } - - // Adding a valid delta to a valid result should produce a valid result. - ValidateCPUTimeResult(result); -} - } // namespace CPUMeasurementMonitor::CPUMeasurementMonitor() @@ -193,10 +131,6 @@ QueryResultMap results; for (const auto& [context, result] : measurement_results_) { ValidateCPUTimeResult(result); - if (IsEmptyCPUTimeResult(result)) { - // Don't include empty measurements in the public results. - continue; - } results.emplace(context, QueryResults{.cpu_time_result = result}); } @@ -383,16 +317,16 @@ absl::visit(base::Overloaded{ [&nodes_to_skip](GraphChangeAddFrame change) { - nodes_to_skip.insert(change.frame_node); + nodes_to_skip.insert(change.frame_node.get()); }, [&nodes_to_skip](GraphChangeAddWorker change) { - nodes_to_skip.insert(change.worker_node); + nodes_to_skip.insert(change.worker_node.get()); }, [&extra_nodes](GraphChangeRemoveFrame change) { - extra_nodes.insert(change.frame_node); + extra_nodes.insert(change.frame_node.get()); }, [&extra_nodes](GraphChangeRemoveWorker change) { - extra_nodes.insert(change.worker_node); + extra_nodes.insert(change.worker_node.get()); }, [](auto change) { // Do nothing. @@ -423,29 +357,69 @@ // Add the new process, frame and worker measurements to the existing // measurements. - ApplySequentialDelta(measurement_results_[context], delta); + ApplySequentialDelta(context, delta); // Aggregate new frame and worker measurements to pages. if (ContextIs<FrameContext>(context)) { const FrameNode* frame_node = AsContext<FrameContext>(context).GetFrameNode(); CHECK(frame_node); - ApplyOverlappingDelta( - measurement_results_[frame_node->GetPageNode()->GetResourceContext()], - delta); + ApplyOverlappingDelta(frame_node->GetPageNode()->GetResourceContext(), + delta); } else if (ContextIs<WorkerContext>(context)) { const WorkerNode* worker_node = AsContext<WorkerContext>(context).GetWorkerNode(); CHECK(worker_node); for (const PageNode* page_node : GetWorkerClientPages(worker_node, graph_change)) { - ApplyOverlappingDelta( - measurement_results_[page_node->GetResourceContext()], delta); + ApplyOverlappingDelta(page_node->GetResourceContext(), delta); } } } } +void CPUMeasurementMonitor::ApplySequentialDelta(const ResourceContext& context, + const CPUTimeResult& delta) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + ValidateCPUTimeResult(delta); + auto [it, inserted] = measurement_results_.try_emplace(context, delta); + if (inserted) { + // First result for `context`, use `delta` unchanged. + return; + } + CPUTimeResult& result = it->second; + ValidateCPUTimeResult(result); + CHECK_EQ(result.metadata.algorithm, delta.metadata.algorithm); + CHECK_LE(result.metadata.measurement_time, delta.start_time); + result.metadata.measurement_time = delta.metadata.measurement_time; + result.cumulative_cpu += delta.cumulative_cpu; + + // Adding a valid delta to a valid result should produce a valid result. + ValidateCPUTimeResult(result); +} + +void CPUMeasurementMonitor::ApplyOverlappingDelta(const PageContext& context, + const CPUTimeResult& delta) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + ValidateCPUTimeResult(delta); + auto [it, inserted] = measurement_results_.try_emplace(context, delta); + if (inserted) { + // First result for `context`, use `delta` with correct algorithm for pages. + it->second.metadata.algorithm = MeasurementAlgorithm::kSum; + return; + } + CPUTimeResult& result = it->second; + ValidateCPUTimeResult(result); + CHECK_EQ(result.metadata.algorithm, MeasurementAlgorithm::kSum); + result.metadata.measurement_time = std::max(result.metadata.measurement_time, + delta.metadata.measurement_time); + result.start_time = std::min(result.start_time, delta.start_time); + result.cumulative_cpu += delta.cumulative_cpu; + + // Adding a valid delta to a valid result should produce a valid result. + ValidateCPUTimeResult(result); +} + base::Value::Dict CPUMeasurementMonitor::DescribeContextData( const ResourceContext& context) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -628,12 +602,12 @@ // is measured. CHECK(!cpu_delta.is_negative()); const auto [_, inserted] = measurement_deltas.emplace( - context, CPUTimeResult{ - .metadata = {.measurement_time = measurement_interval_end, - .algorithm = algorithm}, - .start_time = measurement_interval_start, - .cumulative_cpu = cpu_delta, - }); + context, + CPUTimeResult{ + .metadata = ResultMetadata(measurement_interval_end, algorithm), + .start_time = measurement_interval_start, + .cumulative_cpu = cpu_delta, + }); CHECK(inserted); };
diff --git a/components/performance_manager/resource_attribution/cpu_measurement_monitor.h b/components/performance_manager/resource_attribution/cpu_measurement_monitor.h index 2c3eccc..bb9524a 100644 --- a/components/performance_manager/resource_attribution/cpu_measurement_monitor.h +++ b/components/performance_manager/resource_attribution/cpu_measurement_monitor.h
@@ -165,6 +165,22 @@ const std::map<ResourceContext, CPUTimeResult>& measurement_deltas, GraphChange graph_change = NoGraphChange()); + // Adds the measurement in `delta` to the result for `context`. The start time + // of `delta` must follow the end time of the result. Used for adding + // successive measurements of process, frame and worker contexts, so the + // algorithm in the metadata for the result should match that of `delta`. + // There may be gaps between deltas, such as if a process died and was + // restarted. + void ApplySequentialDelta(const ResourceContext& context, + const CPUTimeResult& delta); + + // Adds the measurement in `delta` to the result for `context`. Delta may + // start before the result or end after it. Used for adding frame and worker + // measurements to page contexts, since the frames and workers can be added in + // any order. + void ApplyOverlappingDelta(const PageContext& context, + const CPUTimeResult& delta); + // Returns description of the most recent measurement of `context` for // NodeDataDescriber, or an empty dict if there is none. base::Value::Dict DescribeContextData(const ResourceContext& context) const;
diff --git a/components/performance_manager/resource_attribution/cpu_measurement_monitor_unittest.cc b/components/performance_manager/resource_attribution/cpu_measurement_monitor_unittest.cc index e540442..dc72be20 100644 --- a/components/performance_manager/resource_attribution/cpu_measurement_monitor_unittest.cc +++ b/components/performance_manager/resource_attribution/cpu_measurement_monitor_unittest.cc
@@ -1391,7 +1391,8 @@ base::TimeTicks measurement_time) { results[frame8->GetResourceContext()] = QueryResults{ .cpu_time_result = CPUTimeResult{ - .metadata = {.measurement_time = measurement_time}, + .metadata = ResultMetadata( + measurement_time, MeasurementAlgorithm::kDirectMeasurement), .start_time = half_first_interval, .cumulative_cpu = (measurement_time - half_first_interval) * 0.4, }};
diff --git a/components/performance_manager/resource_attribution/graph_change.h b/components/performance_manager/resource_attribution/graph_change.h index 48426cd..d77dc8e 100644 --- a/components/performance_manager/resource_attribution/graph_change.h +++ b/components/performance_manager/resource_attribution/graph_change.h
@@ -5,7 +5,7 @@ #ifndef COMPONENTS_PERFORMANCE_MANAGER_RESOURCE_ATTRIBUTION_GRAPH_CHANGE_H_ #define COMPONENTS_PERFORMANCE_MANAGER_RESOURCE_ATTRIBUTION_GRAPH_CHANGE_H_ -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "third_party/abseil-cpp/absl/types/variant.h" namespace performance_manager { @@ -22,26 +22,26 @@ struct GraphChangeAddFrame { explicit GraphChangeAddFrame(const FrameNode* node) : frame_node(node) {} - RAW_PTR_EXCLUSION const FrameNode* frame_node; + raw_ptr<const FrameNode> frame_node; }; struct GraphChangeRemoveFrame { explicit GraphChangeRemoveFrame(const FrameNode* node) : frame_node(node) {} - RAW_PTR_EXCLUSION const FrameNode* frame_node; + raw_ptr<const FrameNode> frame_node; }; struct GraphChangeAddWorker { explicit GraphChangeAddWorker(const WorkerNode* node) : worker_node(node) {} - RAW_PTR_EXCLUSION const WorkerNode* worker_node; + raw_ptr<const WorkerNode> worker_node; }; struct GraphChangeRemoveWorker { explicit GraphChangeRemoveWorker(const WorkerNode* node) : worker_node(node) {} - RAW_PTR_EXCLUSION const WorkerNode* worker_node; + raw_ptr<const WorkerNode> worker_node; }; struct GraphChangeAddClientFrameToWorker { @@ -49,8 +49,8 @@ const FrameNode* client_node) : worker_node(node), client_frame_node(client_node) {} - RAW_PTR_EXCLUSION const WorkerNode* worker_node; - RAW_PTR_EXCLUSION const FrameNode* client_frame_node; + raw_ptr<const WorkerNode> worker_node; + raw_ptr<const FrameNode> client_frame_node; }; struct GraphChangeRemoveClientFrameFromWorker { @@ -58,8 +58,8 @@ const FrameNode* client_node) : worker_node(node), client_frame_node(client_node) {} - RAW_PTR_EXCLUSION const WorkerNode* worker_node; - RAW_PTR_EXCLUSION const FrameNode* client_frame_node; + raw_ptr<const WorkerNode> worker_node; + raw_ptr<const FrameNode> client_frame_node; }; struct GraphChangeAddClientWorkerToWorker { @@ -67,8 +67,8 @@ const WorkerNode* client_node) : worker_node(node), client_worker_node(client_node) {} - RAW_PTR_EXCLUSION const WorkerNode* worker_node; - RAW_PTR_EXCLUSION const WorkerNode* client_worker_node; + raw_ptr<const WorkerNode> worker_node; + raw_ptr<const WorkerNode> client_worker_node; }; struct GraphChangeRemoveClientWorkerFromWorker { @@ -76,8 +76,8 @@ const WorkerNode* client_node) : worker_node(node), client_worker_node(client_node) {} - RAW_PTR_EXCLUSION const WorkerNode* worker_node; - RAW_PTR_EXCLUSION const WorkerNode* client_worker_node; + raw_ptr<const WorkerNode> worker_node; + raw_ptr<const WorkerNode> client_worker_node; }; using GraphChange = absl::variant<NoGraphChange,
diff --git a/components/performance_manager/resource_attribution/memory_measurement_provider.cc b/components/performance_manager/resource_attribution/memory_measurement_provider.cc index 44cd5e8..c948c6a 100644 --- a/components/performance_manager/resource_attribution/memory_measurement_provider.cc +++ b/components/performance_manager/resource_attribution/memory_measurement_provider.cc
@@ -59,8 +59,8 @@ // Create a result with metadata if the key isn't in the map yet. const auto [it, inserted] = results.try_emplace( context, QueryResults{.memory_summary_result = MemorySummaryResult{ - .metadata = {.measurement_time = now, - .algorithm = algorithm}}}); + .metadata = ResultMetadata(now, algorithm), + }}); MemorySummaryResult& result = it->second.memory_summary_result.value(); if (!inserted) { CHECK_LE(result.metadata.measurement_time, now);
diff --git a/components/performance_manager/resource_attribution/queries_unittest.cc b/components/performance_manager/resource_attribution/queries_unittest.cc index e212cf0d..b9bfe82 100644 --- a/components/performance_manager/resource_attribution/queries_unittest.cc +++ b/components/performance_manager/resource_attribution/queries_unittest.cc
@@ -172,8 +172,7 @@ MeasurementAlgorithm expected_algorithm, base::TimeTicks expected_measurement_time = base::TimeTicks::Now()) { return { - .metadata = {.measurement_time = expected_measurement_time, - .algorithm = expected_algorithm}, + .metadata = ResultMetadata(expected_measurement_time, expected_algorithm), .resident_set_size_kb = kFakeResidentSetSize, .private_footprint_kb = kFakePrivateFootprint, };
diff --git a/components/permissions/permission_hats_trigger_helper.cc b/components/permissions/permission_hats_trigger_helper.cc index 49aabdc..41d629d 100644 --- a/components/permissions/permission_hats_trigger_helper.cc +++ b/components/permissions/permission_hats_trigger_helper.cc
@@ -420,8 +420,8 @@ double probability = probability_vector.size() == 1 ? probability_vector[0] : 1.0; const std::string& supplied_trigger_id = - is_custom_invitation_experiment ? custom_invitation_trigger_id_vector[0] - : permission_trigger_id_vector[0]; + is_custom_invitation_arm ? custom_invitation_trigger_id_vector[0] + : permission_trigger_id_vector[0]; return PermissionHatsTriggerHelper::SurveyParametersForHats( probability, supplied_trigger_id, custom_invitation); } else if (permission_trigger_id_vector.size() != probability_vector.size()) { @@ -443,9 +443,8 @@ request_filter_vector[i])) { double probability = probability_vector[i]; const std::string& supplied_trigger_id = - is_custom_invitation_experiment - ? custom_invitation_trigger_id_vector[i] - : permission_trigger_id_vector[i]; + is_custom_invitation_arm ? custom_invitation_trigger_id_vector[i] + : permission_trigger_id_vector[i]; return PermissionHatsTriggerHelper::SurveyParametersForHats( probability, supplied_trigger_id, custom_invitation, message_identifier);
diff --git a/components/policy/core/common/policy_loader_ios.h b/components/policy/core/common/policy_loader_ios.h index 7ec7c87..e07365ed 100644 --- a/components/policy/core/common/policy_loader_ios.h +++ b/components/policy/core/common/policy_loader_ios.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_POLICY_CORE_COMMON_POLICY_LOADER_IOS_H_ #define COMPONENTS_POLICY_CORE_COMMON_POLICY_LOADER_IOS_H_ +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "components/policy/core/common/async_policy_loader.h" @@ -40,7 +41,7 @@ const base::Value& value); // The schema used by |ValidatePolicyData()|. - const Schema* policy_schema_; + raw_ptr<const Schema> policy_schema_; // Used to Bind() a WeakPtr to |this| for the callback passed to the // |notification_observer_|.
diff --git a/components/policy/resources/templates/policy_definitions/Network/DnsOverHttpsTemplatesWithIdentifiers.yaml b/components/policy/resources/templates/policy_definitions/Network/DnsOverHttpsTemplatesWithIdentifiers.yaml index 5f34893..2d116a4 100644 --- a/components/policy/resources/templates/policy_definitions/Network/DnsOverHttpsTemplatesWithIdentifiers.yaml +++ b/components/policy/resources/templates/policy_definitions/Network/DnsOverHttpsTemplatesWithIdentifiers.yaml
@@ -1,6 +1,12 @@ caption: Specify URI template of desired DNS-over-HTTPS resolver with identity information desc: |- - The URI template of the desired DNS-over-HTTPS resolver. To specify multiple DNS-over-HTTPS resolvers, separate the corresponding URI templates with spaces. This policy is very similar to <ph name="DOH_TEMPLATES_POLICY_NAME">DnsOverHttpsTemplates</ph> which it will override if specified. In contrast to that it supports specifying identify information. + The URI template of the desired DNS-over-HTTPS resolver. To specify multiple DNS-over-HTTPS resolvers, separate the corresponding URI templates with spaces. This policy is very similar to <ph name="DOH_TEMPLATES_POLICY_NAME">DnsOverHttpsTemplates</ph> which it will override if specified. + In contrast to the <ph name="DOH_TEMPLATES_POLICY_NAME">DnsOverHttpsTemplates</ph> policy, this policy supports specifying identity information. + Identifiers are specified using variable placeholders which are replaced with user or device information in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. The identifiers are not sent to the DNS server in plain text; instead they are hashed with the <ph name="SHA256">SHA-256</ph> algorithm and uppercase hex encoded. + + Identifiers are specified between curly brackets, preceded by the dollar sign. For user identification, use the following placeholders <ph name="USER_EMAIL">USER_EMAIL</ph>, <ph name="USER_EMAIL_DOMAIN">USER_EMAIL_DOMAIN</ph> and <ph name="USER_EMAIL_NAME">USER_EMAIL_NAME</ph>. For device identification, use the following placeholders <ph name="DEVICE_DIRECTORY_ID">DEVICE_DIRECTORY_ID</ph>, <ph name="DEVICE_SERIAL_NUMBER">DEVICE_SERIAL_NUMBER</ph>, <ph name="DEVICE_ASSET_ID">DEVICE_ASSET_ID</ph> and <ph name="DEVICE_ANNOTATED_LOCATION">DEVICE_ANNOTATED_LOCATION</ph>. + + Before version 122, device identifiers were not replaced for unaffiliated users. Starting version 122, the device placeholders are replaced with the value <ph name="DEVICE_NOT_MANAGED">DEVICE_NOT_MANAGED</ph>, which is hashed and hex encoded. If the <ph name="DOH_MODE_POLICY_NAME">DnsOverHttpsMode</ph> is set to <ph name="SECURE_DNS_MODE_SECURE">"secure"</ph> then either this policy or <ph name="DOH_TEMPLATES_POLICY_NAME">DnsOverHttpsTemplates</ph> must be set and not empty. @@ -9,7 +15,7 @@ If the URI template contains a <ph name="HTTP_VARIABLE_DNS">dns</ph> variable, requests to the resolver will use <ph name="HTTP_METHOD_GET">GET</ph>; otherwise requests will use <ph name="HTTP_METHOD_POST">POST</ph>. In version 114 and later, <ph name="DOH_SALT_POLICY_NAME">DnsOverHttpsSalt</ph> is optional if this policy is set. -example_value: https://dns.example.net/dns-query{?dns} +example_value: https://dns.example.net/${USER_EMAIL_DOMAIN}/dns-query{?dns} features: dynamic_refresh: true per_profile: false
diff --git a/components/reading_list/ios/reading_list_model_bridge_observer.h b/components/reading_list/ios/reading_list_model_bridge_observer.h index 4bf04e53..1dcebdd5 100644 --- a/components/reading_list/ios/reading_list_model_bridge_observer.h +++ b/components/reading_list/ios/reading_list_model_bridge_observer.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#include "base/memory/raw_ptr.h" #include "components/reading_list/core/reading_list_model_observer.h" // Protocol duplicating all Reading List Model Observer methods in Objective-C. @@ -83,7 +84,7 @@ __unsafe_unretained id<ReadingListModelBridgeObserver> observer_; - ReadingListModel* model_; // weak + raw_ptr<ReadingListModel> model_; // weak }; #endif // COMPONENTS_READING_LIST_IOS_READING_LIST_MODEL_BRIDGE_OBSERVER_H_
diff --git a/components/reporting/client/report_queue_factory_unittest.cc b/components/reporting/client/report_queue_factory_unittest.cc index a7de6ef..8fd499a 100644 --- a/components/reporting/client/report_queue_factory_unittest.cc +++ b/components/reporting/client/report_queue_factory_unittest.cc
@@ -67,7 +67,6 @@ void TearDown() override { helper_.reset(); - task_environment_.RunUntilIdle(); // Drain remaining scheduled tasks. } const Destination destination_ = Destination::UPLOAD_EVENTS;
diff --git a/components/reporting/client/report_queue_provider_test_helper.cc b/components/reporting/client/report_queue_provider_test_helper.cc index 53c396c..30077b5 100644 --- a/components/reporting/client/report_queue_provider_test_helper.cc +++ b/components/reporting/client/report_queue_provider_test_helper.cc
@@ -4,6 +4,8 @@ #include "components/reporting/client/report_queue_provider_test_helper.h" +#include <memory> + #include "base/task/sequenced_task_runner.h" #include "components/reporting/client/mock_report_queue_provider.h" #include "components/reporting/client/report_queue_provider.h" @@ -12,9 +14,8 @@ namespace reporting::test { ReportQueueProviderTestHelper::ReportQueueProviderTestHelper() - : provider_(new ::testing::NiceMock<MockReportQueueProvider>(), - base::OnTaskRunnerDeleter( - base::SequencedTaskRunner::GetCurrentDefault())) {} + : provider_( + std::make_unique<::testing::NiceMock<MockReportQueueProvider>>()) {} ReportQueueProviderTestHelper::~ReportQueueProviderTestHelper() = default;
diff --git a/components/reporting/client/report_queue_provider_test_helper.h b/components/reporting/client/report_queue_provider_test_helper.h index 2e1ee7e..c057f8b 100644 --- a/components/reporting/client/report_queue_provider_test_helper.h +++ b/components/reporting/client/report_queue_provider_test_helper.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_REPORTING_CLIENT_REPORT_QUEUE_PROVIDER_TEST_HELPER_H_ #define COMPONENTS_REPORTING_CLIENT_REPORT_QUEUE_PROVIDER_TEST_HELPER_H_ +#include <memory> + #include "components/reporting/client/report_queue_provider.h" namespace reporting { @@ -19,7 +21,7 @@ MockReportQueueProvider* mock_provider() const; private: - ReportQueueProvider::SmartPtr<MockReportQueueProvider> provider_; + std::unique_ptr<MockReportQueueProvider> provider_; }; } // namespace test } // namespace reporting
diff --git a/components/reporting/client/report_queue_provider_unittest.cc b/components/reporting/client/report_queue_provider_unittest.cc index 59bd8ee..c365abc 100644 --- a/components/reporting/client/report_queue_provider_unittest.cc +++ b/components/reporting/client/report_queue_provider_unittest.cc
@@ -44,7 +44,6 @@ void TearDown() override { helper_.reset(); - task_environment_.RunUntilIdle(); // Drain remaining scheduled tasks. } base::test::TaskEnvironment task_environment_{
diff --git a/components/resources/OWNERS b/components/resources/OWNERS index 88c095a..8d27e77 100644 --- a/components/resources/OWNERS +++ b/components/resources/OWNERS
@@ -15,7 +15,7 @@ per-file policy_resources.grdp=file://components/policy/OWNERS per-file printing_resources.grdp=file://printing/OWNERS per-file plus_address_resources.grdp=file://components/plus_addresses/OWNERS -per-file search_engine_choice_scaled_resources.grdp=file://chrome/browser/search_engine_choice/OWNERS +per-file search_engine_choice_scaled_resources.grdp=file://components/search_engines/search_engine_choice/OWNERS per-file security_interstitials_dev_ui_resources.grdp=file://components/security_interstitials/OWNERS per-file security_interstitials_resources.grdp=file://components/security_interstitials/OWNERS per-file sync_driver_resources.grdp=file://components/sync/OWNERS
diff --git a/components/resources/default_100_percent/search_engine_choice/OWNERS b/components/resources/default_100_percent/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/components/resources/default_100_percent/search_engine_choice/OWNERS +++ b/components/resources/default_100_percent/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/components/resources/default_200_percent/search_engine_choice/OWNERS b/components/resources/default_200_percent/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/components/resources/default_200_percent/search_engine_choice/OWNERS +++ b/components/resources/default_200_percent/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/components/resources/default_300_percent/search_engine_choice/OWNERS b/components/resources/default_300_percent/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/components/resources/default_300_percent/search_engine_choice/OWNERS +++ b/components/resources/default_300_percent/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/components/search_engine_choice_strings.grdp b/components/search_engine_choice_strings.grdp index 9750d8a..caee89b9 100644 --- a/components/search_engine_choice_strings.grdp +++ b/components/search_engine_choice_strings.grdp
@@ -82,4 +82,8 @@ <message name="IDS_SEARCH_ENGINE_CHOICE_CHEVRON_A11Y_LABEL" desc="Accessibility action to expand the search engine description."> Search engine details </message> + + <message name="IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CONFIRMATION_TOAST_LABEL" desc="This confirmation message is intended to help users understand that their choice is now saved. It appears after the user changes their default search engine in Chrome settings. (A search engine provides answers to search queries; this is different from a browser, which displays web pages. A search engine powers many experiences within a browser.)"> + <ph name="SEARCH_ENGINE_NAME">$1<ex>Google</ex></ph> is now your default search engine + </message> </grit-part>
diff --git a/components/search_engine_choice_strings_grdp/IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CONFIRMATION_TOAST_LABEL.png.sha1 b/components/search_engine_choice_strings_grdp/IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CONFIRMATION_TOAST_LABEL.png.sha1 new file mode 100644 index 0000000..5ff1d926 --- /dev/null +++ b/components/search_engine_choice_strings_grdp/IDS_SEARCH_ENGINE_CHOICE_SETTINGS_CONFIRMATION_TOAST_LABEL.png.sha1
@@ -0,0 +1 @@ +ae22db40f2bd53b50c7df60c8b0aab106b325f60 \ No newline at end of file
diff --git a/components/search_engine_choice_strings_grdp/OWNERS b/components/search_engine_choice_strings_grdp/OWNERS index 4b1c099..a8ff91d 100644 --- a/components/search_engine_choice_strings_grdp/OWNERS +++ b/components/search_engine_choice_strings_grdp/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/components/search_engines/OWNERS b/components/search_engines/OWNERS index a384b83d..388f7d2 100644 --- a/components/search_engines/OWNERS +++ b/components/search_engines/OWNERS
@@ -1,7 +1,7 @@ file://components/omnibox/OWNERS -per-file search_engine_choice*=file://chrome/browser/search_engine_choice/OWNERS -per-file generated_marketing_snippets*=file://chrome/browser/search_engine_choice/OWNERS +per-file search_engine_choice*=file://components/search_engines/search_engine_choice/OWNERS +per-file generated_marketing_snippets*=file://components/search_engines/search_engine_choice/OWNERS # TODO: noparent it. -per-file choice_made_location.h=file://chrome/browser/search_engine_choice/OWNERS +per-file choice_made_location.h=file://components/search_engines/search_engine_choice/OWNERS
diff --git a/components/search_engines/search_engine_choice/OWNERS b/components/search_engines/search_engine_choice/OWNERS new file mode 100644 index 0000000..6c1ceef --- /dev/null +++ b/components/search_engines/search_engine_choice/OWNERS
@@ -0,0 +1,3 @@ +dgn@chromium.org +droger@chromium.org +jyammine@google.com \ No newline at end of file
diff --git a/components/search_engines/template_url_service.h b/components/search_engines/template_url_service.h index 9e442aa..e2b43ef 100644 --- a/components/search_engines/template_url_service.h +++ b/components/search_engines/template_url_service.h
@@ -19,7 +19,6 @@ #include "base/functional/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/time/default_clock.h" @@ -118,9 +117,7 @@ // Search metadata that's often used to persist into History. struct SearchMetadata { - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION const TemplateURL* template_url; + raw_ptr<const TemplateURL> template_url; GURL normalized_url; std::u16string search_terms; };
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 1f669f6..77fff96 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> wil jou kamera en mikrofoon gebruik</translation> <translation id="5035135400558156732">Tuinmaak</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Meld weer aan en kom dan terug na hierdie oortjie om skryfhulp te kry</translation> <translation id="5039762155821394373">Lettergrootte</translation> <translation id="5039804452771397117">Laat toe</translation> <translation id="5040262127954254034">Privaatheid</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index c749110..fe2916c 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -2064,7 +2064,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን መጠቀም ይፈልጋል</translation> <translation id="5035135400558156732">የጓሮ አትክልት</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">እንደገና ይግቡ፣ ከዚያም የጽሑፍ እርዳታ ለማግኘት ወደዚህ ትር ይመለሱ</translation> <translation id="5039762155821394373">የቅርጸ-ቁምፊ መጠን</translation> <translation id="5039804452771397117">ፍቀድ</translation> <translation id="5040262127954254034">ግላዊነት</translation> @@ -3929,7 +3928,6 @@ <translation id="8687429322371626002">የእርስዎ መሣሪያ እና መለያ የሚተዳደሩት በ<ph name="MANAGER" /> ነው።</translation> <translation id="8688672835843460752">ይገኛል</translation> <translation id="868922510921656628">ገጾች በስብስብብ</translation> -<translation id="8693163814413702888">ይህ ቋንቋ ገና አይደገፍም።</translation> <translation id="8693639060656817812">ስለ የመከታተል ጥበቃ ተገኝነት የበለጠ ለመረዳት</translation> <translation id="869891660844655955">የሚያበቀበት ጊዜ</translation> <translation id="8699041776323235191">የHID መሣሪያ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 1b707290..2b9d50e 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -2065,7 +2065,6 @@ <translation id="503498442187459473">يريد <ph name="HOST" /> استخدام الكاميرا والميكروفون.</translation> <translation id="5035135400558156732">بستنة</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">يجب تسجيل الدخول مجددًا ثم الرجوع إلى علامة التبويب هذه للحصول على المساعدة في الكتابة.</translation> <translation id="5039762155821394373">حجم الخط</translation> <translation id="5039804452771397117">سماح</translation> <translation id="5040262127954254034">الخصوصية</translation> @@ -3739,7 +3738,7 @@ <translation id="8296205692406981542">منتزهات وحدائق عامة ومحلية</translation> <translation id="8297545700510100061">يتم استخدام ملفات تعريف الارتباط وبيانات المواقع الإلكترونية الأخرى لتذكُّر بياناتك، مثلاً بهدف تسجيل دخولك أو تقديم إعلانات مخصّصة لك. لإدارة ملفات تعريف الارتباط لجميع المواقع الإلكترونية، يمكنك الانتقال إلى <ph name="SETTINGS" />.</translation> <translation id="8298115750975731693">قد يتتطلب Wi-Fi الذي تستخدمه (<ph name="WIFI_NAME" />) زيارة <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> -<translation id="8301894345671534559">إدخال الرمز</translation> +<translation id="8301894345671534559">أدخِل الرمز</translation> <translation id="8303854710873047864">تم عرض قسم "<ph name="SECTION" />"</translation> <translation id="830498451218851433">الطي إلى نصفَين</translation> <translation id="8308653357438598313">بث فيديوهات مباشرة</translation> @@ -3770,7 +3769,7 @@ <translation id="8368001212524806591">تتبُّع السعر</translation> <translation id="8368027906805972958">جهاز غير معروف أو غير متوافق (<ph name="DEVICE_ID" />)</translation> <translation id="8368476060205742148">خدمات Google Play</translation> -<translation id="8369073279043109617">الحصول على رمز جديد</translation> +<translation id="8369073279043109617">احصل على رمز جديد</translation> <translation id="8371841335382565017">عرض قائمة أجهزة البث</translation> <translation id="8371889962595521444">شهادات الجذر المُخصَّصة</translation> <translation id="8374636051559112948">يختلف من جهاز إلى آخر</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index c4c6b757..2288996 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" />এ আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰিব বিচাৰে</translation> <translation id="5035135400558156732">বাগিছাৰ কাম</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">পুনৰ ছাইন ইন কৰক, তাৰ পাছত লিখাৰ ক্ষেত্ৰত সহায় পাবলৈ এই টেবটোলৈ উভতি আহক</translation> <translation id="5039762155821394373">ফ’ণ্টৰ আকাৰ</translation> <translation id="5039804452771397117">অনুমতি দিয়ক</translation> <translation id="5040262127954254034">গোপনীয়তা</translation> @@ -3924,7 +3923,6 @@ <translation id="8687429322371626002">আপোনাৰ ডিভাইচ আৰু একাউণ্ট <ph name="MANAGER" />এ পৰিচালনা কৰে।</translation> <translation id="8688672835843460752">উপলব্ধ</translation> <translation id="868922510921656628">প্ৰতিটো ছেটত পৃষ্ঠাৰ সংখ্যা</translation> -<translation id="8693163814413702888">এই ভাষাটো এই পৰ্যন্ত সমৰ্থিত হোৱা নাই।</translation> <translation id="8693639060656817812">ট্ৰেক কৰাৰ পৰা সুৰক্ষিত কৰাৰ সুবিধাটোৰ উপলব্ধতাৰ বিষয়ে অধিক জানক</translation> <translation id="869891660844655955">ম্যাদ উকলাৰ তাৰিখ</translation> <translation id="8699041776323235191">HID ডিভাইচ</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index c57b0ac..464ac47 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">Deşik açın</translation> <translation id="1446396933673057385">Dəqiqliyin yoxlanması</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">"<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" açar sözləri "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" açar sözləri ilə eyni lüğətdə ola bilməz</translation> <translation id="1452803302401719440">Valideynin seçdiyi ayarlar onlayn təhlükəsizliyinizi təmin edir</translation> <translation id="1455413310270022028">Pozan</translation> <translation id="1458140305240870199">Alt geyimləri</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Daxil olduğunuz zaman bu cihaza əlavə edilmiş köməkçi cihazlar</translation> <translation id="2450021089947420533">Baxışlar</translation> +<translation id="2452837234288608067">Kömək etmək alınmadı. Yenidən cəhd edin.</translation> <translation id="2456755709261364512">Batareya <ph name="REQUIRED_BATTERY_PRECENT" />%-dən çox şarj edilməlidir</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> axtarın</translation> <translation id="2463739503403862330">Doldurun</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">Adın doldurulması</translation> <translation id="2726001110728089263">Yan Qab</translation> <translation id="2728127805433021124">Server sertifikatı zəif imza alqoritmi istifadə olunaraq daxil edildi.</translation> +<translation id="272937284275742856">Ödəniş detalları yoxlanır...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Bağlantı Diaqnostikası İşləyir<ph name="END_LINK" /></translation> <translation id="2730600605555029057">Klassik musiqi</translation> <translation id="2731382536835015353">44 x 68 düym</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">Kriket</translation> <translation id="2959113999220720579">Üz və bədənə qulluq</translation> <translation id="2962073860865348475">12 x 18 düym</translation> +<translation id="2967098518029543669">Google Hesabında yadda saxlayın</translation> <translation id="2968103128155246731">Ven və minivenlər</translation> <translation id="2972581237482394796">&Yenidən edin</translation> <translation id="2977665033722899841">Hazırda <ph name="ROW_NAME" /> seçilib. <ph name="ROW_CONTENT" /></translation> @@ -1379,6 +1383,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" /> rəqəmli doğrulama kodu daxil edin</translation> <translation id="3681007416295224113">Sertifikat məlumatı</translation> <translation id="3681421644246505351">Chrome son baxış tarixçənizə əsaslanaraq maraqlandığınız mövzuları qeyd edir.</translation> +<translation id="3682094733650754138">Ünvanın daxil edilməsi seçilib</translation> <translation id="3689867156802445220">Bina nömrəsi</translation> <translation id="3693327506115126094">Kimliyinizi necə doğrulayacağınızı seçin</translation> <translation id="3698629142018988477">"Sayt yaradın" düyməsi, aktivləşdirərək Google Saytda cəld yeni sayt yaradın</translation> @@ -2056,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> kameranızı və mikrofonunuzu istifadə etmək istəyir</translation> <translation id="5035135400558156732">Bağçılıq</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Yazarkən kömək almaq üçün yenidən daxil olun, sonra bu taba qayıdın</translation> <translation id="5039762155821394373">Şrift Ölçüsü</translation> <translation id="5039804452771397117">İcazə verin</translation> <translation id="5040262127954254034">Məxfilik</translation> @@ -2787,6 +2791,7 @@ <translation id="6491663123807473970"><ph name="URL" /> MIDI cihazlarını istifadə etmək istəyir</translation> <translation id="6493924760403974580">Bu tətbiq yalnız bu ölçünü dəstəkləyir.</translation> <translation id="6494750904506170417">popap və yönləndirmələr</translation> +<translation id="6495664197699704593">Bu parol yalnız bu cihazda yadda saxlanır. Onu digər cihazlarda istifadə etmək üçün <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">Biznes əməliyyatları</translation> <translation id="6499038740797743453">Parol sıfırlansın?</translation> <translation id="6502510275417601303">Yeni ödəniş ayarı haqqında xəbərdarlıq bağlanıb</translation> @@ -2901,6 +2906,7 @@ <translation id="6732087373923685049">kamera</translation> <translation id="6737708609449480586">Bişmiş məhsullar</translation> <translation id="6738516213925468394">Data <ph name="TIME" /> tarixində <ph name="BEGIN_LINK" />sinxronizasiya parolu<ph name="END_LINK" /> ilə şifrələnib. Sinxronizasiyanı başlatmaq üçün klikləyin.</translation> +<translation id="6740851646645036700">Yazı köməyi limitinə çatdınız. Sonra cəhd edin.</translation> <translation id="674375294223700098">Naməlum server sertifikatı xətası</translation> <translation id="6744009308914054259">Bağlantı gözlənilərkən oflayn məqalələri oxumaq üçün Endirilənlərə baxa bilərsiniz.</translation> <translation id="6745592621698551453">İndi Güncəlləşdirin</translation> @@ -2957,6 +2963,7 @@ <translation id="6860888819347870819">Şəkildə şəkil rejiminə daxil olmaq istəyə bilər</translation> <translation id="6864189428899665393">267 x 389 mm</translation> <translation id="686485648936420384">İstehlak resursları</translation> +<translation id="6865166112578825782">Ünvanı daxil edin</translation> <translation id="6865412394715372076">Bu kart hazırda doğrulana bilməz</translation> <translation id="6868573634057275953">Güncəllənməni davam etdirin</translation> <translation id="6869334554832814367">Şəxsi istiqrazlar</translation> @@ -3426,6 +3433,7 @@ <translation id="7701040980221191251">Heç biri</translation> <translation id="7701544340847569275">Güncəllənmədə xətalar oldu</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ilə davam edin (güvənsiz)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Yazmağa kömək et</translation> <translation id="7705992072972338699">Optik disk (çox parlaq)</translation> <translation id="770607638235926858">Xizəksürmə və snoubordinq</translation> <translation id="7706689436519265630">Kopyaladığınız və ya köçürdüyünüz fayllar təhlil üçün Google Cloud'a və ya üçüncü tərəflərə göndərilir. Məsələn, onlar həssas data və ya zərərli proqrama görə skanlana və şirkət siyasətlərinə əsasən saxlana bilər.</translation> @@ -3645,6 +3653,7 @@ <translation id="8161095570253161196">Baxmağa davam edin</translation> <translation id="8163866351304776260">Soldan dördlü deşik açın</translation> <translation id="8164078261547504572">Qiymətlər düşəndə e-məktub almaq istəyirsiniz?</translation> +<translation id="8169175551046720804">"<ph name="DATA_CONTROLS_KEYS" />" açar sözləri eyni lüğətdə ola bilməz</translation> <translation id="8175796834047840627">Daxil olduğunuza görə Chrome kartları Google Hesabında yadda saxlamağı təklif edir. Bunu ayarlarda dəyişə bilərsiniz.</translation> <translation id="8176440868214972690">Bu cihazın administratoru aşağıdakı veb saytlara ayarlar və ya siyasətlər kimi bəzi məlumatlar göndərib.</translation> <translation id="817820454357658398">Qadınlar üçün gigiyena məhsulları</translation> @@ -4040,6 +4049,7 @@ <translation id="8949410982325929394">Ton</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">Hüquq və hökümət</translation> +<translation id="8952569554322479410">Veb-sayt indicə <ph name="REQUEST_TYPE" /> üçün giriş istədi. Bu 1 dəqiqəlik sorğuda iştirak edərək veb-sayt sorğularını təkmilləşdirməyə kömək edin.</translation> <translation id="8954252855949068147">Geyim</translation> <translation id="8956124158020778855">Bu ayarı aktiv etdikdən sonra yazmağa başlamaq üçün bu taba qayıdın.</translation> <translation id="8957210676456822347">Kaptiv Portal Doğrulanması</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 10df005..17a3705 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">Дзірка</translation> <translation id="1446396933673057385">Праверка дакладнасці</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">Ключы "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" нельга наладзіць у тым жа слоўніку, што і ключы "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />"</translation> <translation id="1452803302401719440">Налады, якія абралі твае бацькі, абараняюць цябе ў інтэрнэце</translation> <translation id="1455413310270022028">Сцірка</translation> <translation id="1458140305240870199">Нацельная бялізна</translation> @@ -465,6 +466,7 @@ <translation id="1828959155404624835">Пракат аўтамабіляў</translation> <translation id="1834321415901700177">На гэтым сайце знаходзяцца шкодныя праграмы</translation> <translation id="1838374766361614909">Ачысціць поле пошуку</translation> +<translation id="1839331950812095887">Некалькі слоў, якія падсумуюць вашы думкі.</translation> <translation id="1839551713262164453">Пра праверцы значэнняў палітыкі адбыліся памылкі</translation> <translation id="1842969606798536927">Аплаціць</translation> <translation id="1846432862466000825">Пластык архіўнай якасці</translation> @@ -698,6 +700,7 @@ <translation id="2293443924986248631">Калі ўключыць гэту наладу, сайты не змогуць выкарыстоўваць файлы cookie для адсочвання вас у інтэрнэце. Функцыі на некаторых сайтах могуць перастаць працаваць.</translation> <translation id="2295831393422400053">Каб выкарыстоўваць дапамогу з напісаннем, уключыце наладу "Палепшыць пошук і прагляд"</translation> <translation id="2300306941146563769">Не запампавана</translation> +<translation id="2301098101308036335">Якія вэб-сайты наведваюцца і калі.</translation> <translation id="230286397113210245">Кнопка "Адкрыць акно ў рэжыме інкогніта". Каб адкрыць новае акно ў рэжыме інкогніта для прыватнага прагляду вэб-старонак, націсніце яе.</translation> <translation id="2312234273148520048">Прыправы і заправы</translation> <translation id="2316087952091171402">Менш за <ph name="UPPER_ESTIMATE" />. Некаторыя сайты могуць загружацца павальней пры наступным наведванні.</translation> @@ -765,6 +768,7 @@ <ph name="LIST_ITEM" />звесткі, уведзеныя ў формах.<ph name="END_LIST" /></translation> <translation id="2448295565072560657">Перыферыйныя прылады, падключаныя да прылады пры выкананым уваходзе ва ўліковы запіс</translation> <translation id="2450021089947420533">Шляхі карыстальніка</translation> +<translation id="2452837234288608067">Не ўдалося дапамагчы з гэтым запытам. Паўтарыце спробу.</translation> <translation id="2456755709261364512">Зарад акумулятара павінен быць большым за <ph name="REQUIRED_BATTERY_PRECENT" />%</translation> <translation id="2462599289530201834">Пошук: <ph name="KEYWORD_SHORT_NAME" /></translation> <translation id="2463739503403862330">Запоўніць</translation> @@ -906,6 +910,7 @@ <translation id="2725927759457695883">Запоўніць усе палі імя/назвы</translation> <translation id="2726001110728089263">Бакавы латок</translation> <translation id="2728127805433021124">Сертыфікат сервера падпісаны з выкарыстаннем ненадзейнага алгарытму.</translation> +<translation id="272937284275742856">Бяспечна правяраюцца звесткі пра спосаб аплаты...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Запусціць дыягностыку падключэння<ph name="END_LINK" />.</translation> <translation id="2730600605555029057">Класічная музыка</translation> <translation id="2731382536835015353">44 x 68 цаляў</translation> @@ -1005,6 +1010,7 @@ <translation id="2958544468932521864">Крыкет</translation> <translation id="2959113999220720579">Догляд твару і цела</translation> <translation id="2962073860865348475">12 x 18 цаляў</translation> +<translation id="2967098518029543669">захаваць пароль ва Уліковым запісе Google</translation> <translation id="2968103128155246731">Мікрааўтобусы і мінівэны</translation> <translation id="2972581237482394796">&Узнавіць</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, радок выбраны. <ph name="ROW_CONTENT" /></translation> @@ -1362,6 +1368,7 @@ <translation id="3655670868607891010">Калі вы часта бачыце гэта паведамленне, паспрабуйце наступнае: <ph name="HELP_LINK" />.</translation> <translation id="365641980390710834">Паўсядзённае адзенне</translation> <translation id="3658742229777143148">Рэдакцыя</translation> +<translation id="3659521826520353662">Якія вызначаныя адміністратарам вэб-сайты наведваюцца і калі: <ph name="ALLOWLISTED_WEBSITES" /></translation> <translation id="3664782872746246217">Ключавыя словы:</translation> <translation id="3665100783276035932">Большасць сайтаў павінны працаваць як належыць</translation> <translation id="3667704023705708645">Венчурны капітал</translation> @@ -1377,6 +1384,7 @@ <translation id="3678914302246317895">Увядзіце <ph name="OTP_LENGTH" />-значны код спраўджання</translation> <translation id="3681007416295224113">Інфармацыя аб сертыфікаце</translation> <translation id="3681421644246505351">Chrome вызначае цікавыя для вас тэмы на падставе нядаўняй гісторыі прагляду вамі сайтаў.</translation> +<translation id="3682094733650754138">Выбраны варыянт "Запоўніць адрас"</translation> <translation id="3689867156802445220">Нумар дома</translation> <translation id="3693327506115126094">Выберыце спосаб спраўджання асобы</translation> <translation id="3698629142018988477">Кнопка "Стварыць сайт". Каб хутка стварыць новы сайт з дапамогай Google Сайтаў, націсніце яе.</translation> @@ -1452,6 +1460,7 @@ <translation id="3812398568375898177">Гэта важнае абнаўленне, якое паляпшае прадукцыйнасць праграм для Android на ChromeOS.</translation> <translation id="3815434930383843058">8 x 12 цаляў</translation> <translation id="3816482573645936981">Значэнне (замененае)</translation> +<translation id="382115839591654906">Код CVC карткі "<ph name="CARD_NAME" />"</translation> <translation id="3823019343150397277">Нумар IBAN</translation> <translation id="3823402221513322552">Вашым браўзерам кіруе <ph name="BROWSER_DOMAIN" />, а профілем – <ph name="PROFILE_DOMAIN" /></translation> <translation id="382518646247711829">Калі вы выкарыстоўваеце проксі-сервер...</translation> @@ -2053,7 +2062,6 @@ <translation id="503498442187459473"><ph name="HOST" /> запытвае доступ да камеры і мікрафона</translation> <translation id="5035135400558156732">Догляд саду</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Каб атрымаць дапамогу з напісаннем, увайдзіце зноў і вярніцеся на гэту ўкладку</translation> <translation id="5039762155821394373">Памер шрыфту</translation> <translation id="5039804452771397117">Дазволіць</translation> <translation id="5040262127954254034">Прыватнасць</translation> @@ -2782,6 +2790,7 @@ <translation id="6491663123807473970">Сайт <ph name="URL" /> запытвае дазвол на выкарыстанне вашых прылад MIDI</translation> <translation id="6493924760403974580">Праграма падтрымлівае толькі гэты памер.</translation> <translation id="6494750904506170417">усплывальныя вокны і перанакіраванні</translation> +<translation id="6495664197699704593">Пароль захаваны толькі на гэтай прыладзе. Каб выкарыстоўваць яго на іншых прыладах, вы можаце <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">Камерцыйная дзейнасць</translation> <translation id="6499038740797743453">Скінуць пароль?</translation> <translation id="6502510275417601303">Абвестка пра новую наладу аплаты закрыта</translation> @@ -2896,6 +2905,7 @@ <translation id="6732087373923685049">камера</translation> <translation id="6737708609449480586">Хлебабулачныя вырабы</translation> <translation id="6738516213925468394">Даныя былі зашыфраваны з дапамогай <ph name="BEGIN_LINK" />фразы-пароля для сінхранізацыі<ph name="END_LINK" /> <ph name="TIME" />. Увядзіце яе, каб пачаць сінхранізацыю.</translation> +<translation id="6740851646645036700">Вы дасягнулі часовага ліміту на дапамогу з напісаннем. Паўтарыце спробу пазней.</translation> <translation id="674375294223700098">Невядомая памылка сертыфіката сервера.</translation> <translation id="6744009308914054259">Пакуль чакаецца падключэнне, вы можаце пачытаць артыкулы, спампаваныя раней.</translation> <translation id="6745592621698551453">Абнавіць</translation> @@ -2952,6 +2962,7 @@ <translation id="6860888819347870819">Сайт можа запытваць дазвол на адкрыццё акон у рэжыме "відарыс у відарысе"</translation> <translation id="6864189428899665393">267 x 389 мм</translation> <translation id="686485648936420384">Спажывецкія рэсурсы</translation> +<translation id="6865166112578825782">Запоўніць адрас</translation> <translation id="6865412394715372076">Гэту картку спраўдзіць пакуль што не ўдаецца</translation> <translation id="6868573634057275953">Узнавіць абнаўленне</translation> <translation id="6869334554832814367">Крэдыты фізічным асобам</translation> @@ -3199,6 +3210,7 @@ <translation id="7341357280245177602">Ужываныя аўтамабілі</translation> <translation id="7346048084945669753">Карыстальнік далучаны:</translation> <translation id="7346062987309535530">Сталовы посуд</translation> +<translation id="7346081071264046066">"Прымі запрашэнне на вяселле, выказаўшы пры гэтым захапленне".</translation> <translation id="7352651011704765696">Нешта пайшло не так</translation> <translation id="7353601530677266744">Камандны радок</translation> <translation id="7354880545102894991">Лоў-косты і гарачыя туры</translation> @@ -3421,6 +3433,7 @@ <translation id="7701040980221191251">Няма</translation> <translation id="7701544340847569275">Абнаўленне завершана з памылкамі</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Перайсці на сайт <ph name="SITE" /> (небяспечна)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Дапамога з напісаннем</translation> <translation id="7705992072972338699">Высакаглянцавы аптычны дыск</translation> <translation id="770607638235926858">Лыжы і снаўборд</translation> <translation id="7706689436519265630">Скапіраваныя або перамешчаныя файлы перасылаюцца для аналізу ў Google Cloud або трэцім бакам. У прыватнасці, яны могуць быць правераны на наяўнасць канфідэнцыяльных даных або шкодных праграм альбо адпраўлены на захоўванне ў адпаведнасці з палітыкамі кампаніі.</translation> @@ -3640,6 +3653,7 @@ <translation id="8161095570253161196">Узнавіць прагляд</translation> <translation id="8163866351304776260">Чатыры дзіркі злева</translation> <translation id="8164078261547504572">Хочаце атрымліваць электронныя лісты пры зніжэнні цэн?</translation> +<translation id="8169175551046720804">Ключы "<ph name="DATA_CONTROLS_KEYS" />" нельга наладзіць у тым жа слоўніку</translation> <translation id="8175796834047840627">Chrome прапаноўвае захоўваць карткі ва Уліковым запісе Google, бо вы ўвайшлі ў сістэму. Гэту функцыю можна выключыць у наладах.</translation> <translation id="8176440868214972690">Адміністратар гэтай прылады адправіў на наступныя вэб-сайты пэўныя звесткі (напрыклад, налады або палітыкі).</translation> <translation id="817820454357658398">Сродкі жаночай гігіены</translation> @@ -4035,6 +4049,7 @@ <translation id="8949410982325929394">Тон</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">Закон і ўрад</translation> +<translation id="8952569554322479410">Вэб-сайт запытвае наступны дазвол на доступ: <ph name="REQUEST_TYPE" />. Прайдзіце апытанне, каб дапамагчы нам палепшыць працэс запыту дазволаў вэб-сайтамі. Гэта зойме адну хвіліну.</translation> <translation id="8954252855949068147">Адзенне і аксесуары</translation> <translation id="8956124158020778855">Уключыўшы наладу, вярніцеся на гэту ўкладку і пачніце пісаць.</translation> <translation id="8957210676456822347">Аўтарызацыя праз партал узаемадзеяння</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index bbdb90d..ad2e4de6 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> иска да използва камерата и микрофона ви</translation> <translation id="5035135400558156732">Градинарство</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Влезте отново в профила си, след което се върнете в този раздел, за да получите помощ с писането</translation> <translation id="5039762155821394373">Размер на шрифта</translation> <translation id="5039804452771397117">Разрешаване</translation> <translation id="5040262127954254034">Поверителност</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 7aa8a52..7ee5f3b 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> আপনার ক্যামেরা ও মাইক্রোফোন ব্যবহার করতে চায়</translation> <translation id="5035135400558156732">বাগান করা</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">আবার সাইন-ইন করুন, তারপর লেখার ব্যাপারে সহায়তা পেতে এই ট্যাবে ফিরে আসুন</translation> <translation id="5039762155821394373">ফন্ট সাইজ</translation> <translation id="5039804452771397117">অনুমতি দিন</translation> <translation id="5040262127954254034">গোপনীয়তা</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index d212987..6595842d 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">Bušenje</translation> <translation id="1446396933673057385">Provjera tačnosti</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">Ključevi "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" se ne mogu postaviti u isti rječnik kao i ključevi "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />"</translation> <translation id="1452803302401719440">Postavke koje je tvoj roditelj odabrao ti pružaju veću sigurnost online</translation> <translation id="1455413310270022028">Gumica</translation> <translation id="1458140305240870199">Donji veš</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Periferni uređaji priključeni na ovaj uređaj dok ste prijavljeni</translation> <translation id="2450021089947420533">Iskustva pregledanja</translation> +<translation id="2452837234288608067">Pružanje pomoći nije uspjelo. Pokušajte ponovo.</translation> <translation id="2456755709261364512">Baterija se mora napuniti na više od <ph name="REQUIRED_BATTERY_PRECENT" />%</translation> <translation id="2462599289530201834">Pretražite upit <ph name="KEYWORD_SHORT_NAME" /></translation> <translation id="2463739503403862330">Popuni</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">Popunite ime i prezime</translation> <translation id="2726001110728089263">Bočna ladica</translation> <translation id="2728127805433021124">Certifikat servera je potpisan korištenjem slabog algoritma za potpisivanje.</translation> +<translation id="272937284275742856">Sigurno potvrđivanje podataka o plaćanju…</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Pokrenuti dijagnostiku povezivosti<ph name="END_LINK" /></translation> <translation id="2730600605555029057">Klasična muzika</translation> <translation id="2731382536835015353">44 x 68 in</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">Kriket</translation> <translation id="2959113999220720579">Njega lica i tijela</translation> <translation id="2962073860865348475">12 x 18 in</translation> +<translation id="2967098518029543669">sačuvajte je na Google račun</translation> <translation id="2968103128155246731">Kombi i minikombi vozila</translation> <translation id="2972581237482394796">&Ponovi</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, trenutno odabrano. <ph name="ROW_CONTENT" /></translation> @@ -1383,6 +1387,7 @@ <translation id="3678914302246317895">Unesite <ph name="OTP_LENGTH" />-cifreni kôd za potvrdu</translation> <translation id="3681007416295224113">Informacije o potvrdi</translation> <translation id="3681421644246505351">Chrome bilježi teme koje vas zanimaju na osnovu vaše nedavne historije pregledanja.</translation> +<translation id="3682094733650754138">Odabrana je opcija popunjavanja polja za adresu</translation> <translation id="3689867156802445220">Broj zgrade</translation> <translation id="3693327506115126094">Odaberite kako ćete potvrditi svoj identitet</translation> <translation id="3698629142018988477">Dugme Kreiraj web lokaciju, aktivirajte da brzo kreirate novu web lokaciju na usluzi Google Web lokacije</translation> @@ -2060,7 +2065,6 @@ <translation id="503498442187459473"><ph name="HOST" /> želi koristiti vašu kameru i mikrofon</translation> <translation id="5035135400558156732">Baštovanstvo</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Prijavite se ponovo, a zatim se vratite na ovu karticu da dobijete pomoć za pisanje</translation> <translation id="5039762155821394373">Veličina fonta</translation> <translation id="5039804452771397117">Dozvoli</translation> <translation id="5040262127954254034">Privatnost</translation> @@ -2791,6 +2795,7 @@ <translation id="6491663123807473970"><ph name="URL" /> želi koristiti vaše MIDI uređaje</translation> <translation id="6493924760403974580">Ova aplikacija podržava samo ovu veličinu.</translation> <translation id="6494750904506170417">skočni prozori i preusmjeravanja</translation> +<translation id="6495664197699704593">Lozinka je sačuvana samo na ovaj uređaj. Da je koristite na drugim uređajima, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">Poslovne operacije</translation> <translation id="6499038740797743453">Poništiti lozinku?</translation> <translation id="6502510275417601303">Obavještenje o novoj postavci plaćanja je zatvoreno</translation> @@ -2905,6 +2910,7 @@ <translation id="6732087373923685049">kamera</translation> <translation id="6737708609449480586">Pekarski proizvodi</translation> <translation id="6738516213925468394">Vaši podaci su šifrirani vašim <ph name="BEGIN_LINK" />izrazom za pristup sinhroniziranju<ph name="END_LINK" /> u <ph name="TIME" />. Unesite ga da započnete sinhronizaciju.</translation> +<translation id="6740851646645036700">Zasad se dosegnuli ograničenje pomoći za pisanje. Pokušajte ponovo kasnije.</translation> <translation id="674375294223700098">Nepoznata greška potvrde servera.</translation> <translation id="6744009308914054259">Posjetite Preuzimanja da pročitate članke van mreže dok čekate vezu.</translation> <translation id="6745592621698551453">Ažuriraj sada</translation> @@ -2961,6 +2967,7 @@ <translation id="6860888819347870819">Može tražiti odobrenje da unosi sliku u slici</translation> <translation id="6864189428899665393">267 x 389 mm</translation> <translation id="686485648936420384">Potrošački izvori</translation> +<translation id="6865166112578825782">Popunite polje za adresu</translation> <translation id="6865412394715372076">Ovu karticu sada ne možemo potvrditi</translation> <translation id="6868573634057275953">Nastavite ažuriranje</translation> <translation id="6869334554832814367">Lični zajmovi</translation> @@ -3430,6 +3437,7 @@ <translation id="7701040980221191251">Nema</translation> <translation id="7701544340847569275">Ažuriranje je završeno s greškama</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nastavi na <ph name="SITE" /> (nesigurno)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Pomozi mi da napišem</translation> <translation id="7705992072972338699">Optički disk (visoki sjaj)</translation> <translation id="770607638235926858">Skijanje i bordanje</translation> <translation id="7706689436519265630">Fajlovi koje kopirate ili premjestite se šalju na Google Cloud ili trećim stranama na analizu. Naprimjer, mogu se skenirati radi otkrivanja postojanja osjetljivih podataka ili zlonamjernog softvera i mogu se pohranjivati na osnovu pravila kompanije.</translation> @@ -3649,6 +3657,7 @@ <translation id="8161095570253161196">Nastavi pregledanje</translation> <translation id="8163866351304776260">Četverostruko bušenje na lijevoj strani</translation> <translation id="8164078261547504572">Želite li primati e-poruke kada dođe do pada cijena?</translation> +<translation id="8169175551046720804">Ključevi "<ph name="DATA_CONTROLS_KEYS" />" se ne mogu postaviti u isti rječnik</translation> <translation id="8175796834047840627">Chrome vam nudi pohranjivanje vaših kartica na Google računu zato što ste prijavljeni. Ovo ponašanje možete promjeniti u postavkama</translation> <translation id="8176440868214972690">Administrator ovog uređaja je poslao određene informacije web lokacijama u nastavku, naprimjer postavke ili pravila.</translation> <translation id="817820454357658398">Proizvodi za žensku higijenu</translation> @@ -4044,6 +4053,7 @@ <translation id="8949410982325929394">Ton</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">Zakon i uprava</translation> +<translation id="8952569554322479410">Web lokacija je upravo zatražila pristup stavci <ph name="REQUEST_TYPE" />. Pomozite nam da poboljšamo način na koji web lokacije traže pristup popunjavanjem ove 1-minutne ankete.</translation> <translation id="8954252855949068147">Odjeća</translation> <translation id="8956124158020778855">Nakon što uključite ovu postavku, vratite se na ovu karticu da počnete pisati.</translation> <translation id="8957210676456822347">Postupak odobrenja na zaštitnom portalu</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 5eb87c3..f1be61c 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> vol utilitzar la càmera i el micròfon</translation> <translation id="5035135400558156732">Jardineria</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Inicia la sessió de nou i, a continuació, torna a aquesta pestanya per obtenir ajuda per escriure</translation> <translation id="5039762155821394373">Cos de font</translation> <translation id="5039804452771397117">Permet</translation> <translation id="5040262127954254034">Privadesa</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index ba000ec3..50513c3 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473">Web <ph name="HOST" /> chce použít váš mikrofon a kameru</translation> <translation id="5035135400558156732">Zahradničení</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Pokud chcete získat pomoc s psaním, znovu se přihlaste a poté se vraťte na tuto kartu</translation> <translation id="5039762155821394373">Velikost písma</translation> <translation id="5039804452771397117">Povolit</translation> <translation id="5040262127954254034">Ochrana soukromí</translation> @@ -3924,7 +3923,6 @@ <translation id="8687429322371626002">Vaše zařízení a účet spravuje doména <ph name="MANAGER" />.</translation> <translation id="8688672835843460752">Dostupné</translation> <translation id="868922510921656628">Počet stránek na sadu</translation> -<translation id="8693163814413702888">Tento jazyk zatím není podporován.</translation> <translation id="8693639060656817812">Další informace o dostupnosti ochrany před sledováním</translation> <translation id="869891660844655955">Datum vypršení platnosti</translation> <translation id="8699041776323235191">Zařízení HID</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index f9e88646..453af49 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473">Mae <ph name="HOST" /> eisiau defnyddio'ch camera a'ch meicroffon</translation> <translation id="5035135400558156732">Garddio</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Mewngofnodwch eto, yna dewch yn ôl i'r tab hwn i gael help ysgrifennu</translation> <translation id="5039762155821394373">Maint y Ffont</translation> <translation id="5039804452771397117">Caniatáu</translation> <translation id="5040262127954254034">Preifatrwydd</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 8f0165be1..7a920cc 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> anmoder om at bruge dit kamera og din mikrofon</translation> <translation id="5035135400558156732">Havearbejde</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Log ind igen, og vend derefter tilbage til denne fane for at få hjælp til at skrive</translation> <translation id="5039762155821394373">Skriftstørrelse</translation> <translation id="5039804452771397117">Tillad</translation> <translation id="5040262127954254034">Privatliv</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index ed034cb..db363ec4 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -376,7 +376,7 @@ <translation id="1662550410081243962">Zahlungsmethoden speichern und ausfüllen</translation> <translation id="1663943134801823270">Die Karten und Adressen stammen aus Chrome. Sie werden in den <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> verwaltet.</translation> <translation id="1664389769577564606">Flexofotopolymer</translation> -<translation id="1668071460721346172">E-Mail anfordern</translation> +<translation id="1668071460721346172">E-Mail erhalten</translation> <translation id="1671391448414634642">Seiten auf <ph name="SOURCE_LANGUAGE" /> werden ab jetzt auf <ph name="TARGET_LANGUAGE" /> übersetzt.</translation> <translation id="1674504678466460478"><ph name="SOURCE_LANGUAGE" /> – <ph name="TARGET_LANGUAGE" /></translation> <translation id="1674542638006317838">Eine begrenzte Liste mit URLs der von dir besuchten Seiten, auf denen <ph name="BEGIN_LINK" />Probleme aufgrund von veralteter Technologie<ph name="END_LINK" /> auftreten.</translation> @@ -1824,7 +1824,7 @@ <translation id="457875822857220463">Lieferung</translation> <translation id="4579699065574932398">Banking</translation> <translation id="4582204425268416675">Karte entfernen</translation> -<translation id="4582595824823167856">SMS empfangen</translation> +<translation id="4582595824823167856">SMS erhalten</translation> <translation id="4586607503179159908">Zahlungsmethode bestätigt</translation> <translation id="4587425331216688090">Adresse aus Chrome entfernen?</translation> <translation id="459089498662672729">Die Administratorrichtlinie empfiehlt, keine Inhalte aus <ph name="ORIGIN_NAME" /> an dieser Stelle einzufügen</translation> @@ -2058,7 +2058,6 @@ <translation id="503498442187459473"><ph name="HOST" /> möchte deine Kamera und dein Mikrofon verwenden</translation> <translation id="5035135400558156732">Gärtnern</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Melde dich wieder an und kehre dann zu diesem Tab zurück, um Hilfe beim Schreiben zu erhalten</translation> <translation id="5039762155821394373">Schriftgröße</translation> <translation id="5039804452771397117">Zulassen</translation> <translation id="5040262127954254034">Datenschutz</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index a5574af..c3bb100 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473">Ο ιστότοπος <ph name="HOST" /> επιθυμεί να χρησιμοποιήσει την κάμερα και το μικρόφωνο σας</translation> <translation id="5035135400558156732">Κηπουρική</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Συνδεθείτε ξανά και έπειτα επιστρέψτε σε αυτή την καρτέλα για να λάβετε βοήθεια σχετικά με το γράψιμο</translation> <translation id="5039762155821394373">Μέγεθος γραμματοσειράς</translation> <translation id="5039804452771397117">Επιτρέπεται</translation> <translation id="5040262127954254034">Απόρρητο</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index cccb9a4..14f2e0f 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> wants to use your camera and microphone</translation> <translation id="5035135400558156732">Gardening</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Sign in again, then come back to this tab to get writing help</translation> <translation id="5039762155821394373">Font size</translation> <translation id="5039804452771397117">Allow</translation> <translation id="5040262127954254034">Privacy</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index fc5e492..c013d2c 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1422,7 +1422,7 @@ <translation id="3744111561329211289">Sincronización en segundo plano</translation> <translation id="3744212718085287312">¿Quieres aumentar el nivel de seguridad con una tarjeta virtual la próxima vez?</translation> <translation id="3744899669254331632">No puedes visitar <ph name="SITE" /> en este momento porque el sitio web envió credenciales encriptadas que Chromium no puede procesar. Los ataques y errores de red generalmente son temporales, por lo que esta página probablemente funcionará de nuevo más tarde.</translation> -<translation id="3745599309295009257">El texto, el contenido y la URL de la página en la que escribas se enviarán a Google, lo revisarán personas y se usará para mejorar esta función. No ingreses información personal (como datos médicos o financieros) ni uses esta herramienta en sitios que contengan información privada o sensible.</translation> +<translation id="3745599309295009257">El texto, el contenido y la URL de la página en la que escribas se enviarán a Google, serán revisados por personas y se usarán para mejorar esta función. No ingreses información personal (como datos médicos o financieros) ni uses esta herramienta en sitios que contengan información privada o sensible.</translation> <translation id="3748009735914587286">Metal (brillo intenso)</translation> <translation id="3748148204939282805">Es posible que los atacantes en <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> intenten engañarte para que realices alguna acción peligrosa, como instalar software o revelar información personal (p. ej., contraseñas, números de teléfono o tarjetas de crédito). <ph name="BEGIN_LEARN_MORE_LINK" />Más información<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="3748912308089554501">Industria aeronáutica</translation> @@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> desea usar tu cámara y micrófono</translation> <translation id="5035135400558156732">Jardinería</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Vuelve a acceder y, luego, regresa a esta pestaña para obtener ayuda con la escritura</translation> <translation id="5039762155821394373">Tamaño de fuente</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidad</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 98a9d52..8e504abe 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> quiere utilizar la cámara y el micrófono</translation> <translation id="5035135400558156732">Jardinería</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Inicia sesión de nuevo y vuelve a esta pestaña para obtener ayuda con la escritura</translation> <translation id="5039762155821394373">Tamaño de fuente</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidad</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 29d6c5b..001d013 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> soovib kasutada teie kaamerat ja mikrofoni</translation> <translation id="5035135400558156732">Aiandus</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Logige uuesti sisse ja naaske sellele vahelehele, et kirjutamisabi saada</translation> <translation id="5039762155821394373">Fondi suurus</translation> <translation id="5039804452771397117">Luba</translation> <translation id="5040262127954254034">Privaatsus</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 0ef88dde..c51dd73 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -2056,7 +2056,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ostalariak zure kamera eta mikrofonoa erabili nahi ditu</translation> <translation id="5035135400558156732">Lorezaintza</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Idazteko laguntza jasotzeko, hasi saioa berriro eta itzuli fitxa honetara</translation> <translation id="5039762155821394373">Letra-tamaina</translation> <translation id="5039804452771397117">Baimendu</translation> <translation id="5040262127954254034">Pribatutasuna</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 8ef7b9e..006fe239 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> میخواهد از دوربین و میکروفن شما استفاده کند</translation> <translation id="5035135400558156732">باغبانی</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">دوباره به سیستم وارد شوید، سپس برای دریافت کمک در نوشتن دوباره به این برگه برگردید</translation> <translation id="5039762155821394373">اندازه قلم</translation> <translation id="5039804452771397117">اجازه دادن</translation> <translation id="5040262127954254034">حریم خصوصی</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 8a2b8337..4225e5d 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> haluaa käyttää kameraasi ja mikrofoniasi.</translation> <translation id="5035135400558156732">Puutarhanhoito</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Kirjaudu uudelleen sisään ja palaa sitten tälle välilehdelle, niin saat apua kirjoittamiseen</translation> <translation id="5039762155821394373">Fonttikoko</translation> <translation id="5039804452771397117">Salli</translation> <translation id="5040262127954254034">Tietosuoja</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 744912b..987673d5 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473">Gustong gamitin ng <ph name="HOST" /> ang iyong camera at mikropono</translation> <translation id="5035135400558156732">Gardening</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Mag-sign in ulit, pagkatapos ay bumalik sa tab na ito para makatanggap ng tulong sa pagsusulat</translation> <translation id="5039762155821394373">Laki ng Font</translation> <translation id="5039804452771397117">Payagan</translation> <translation id="5040262127954254034">Privacy</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 6069cf4e..54c9584 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473">L'hôte <ph name="HOST" /> veut utiliser votre appareil photo et votre microphone</translation> <translation id="5035135400558156732">Jardinage</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Connectez-vous à nouveau, puis revenez sur cet onglet pour obtenir de l'aide à la rédaction</translation> <translation id="5039762155821394373">Taille de police</translation> <translation id="5039804452771397117">Autoriser</translation> <translation id="5040262127954254034">Confidentialité</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index b8ebe982f..c254fea 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> souhaite utiliser votre appareil photo et votre micro</translation> <translation id="5035135400558156732">Jardinage</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Reconnectez-vous, puis revenez sur cet onglet pour obtenir de l'aide pour écrire</translation> <translation id="5039762155821394373">Taille de police</translation> <translation id="5039804452771397117">Autoriser</translation> <translation id="5040262127954254034">Confidentialité</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 7080e73..3088f8f 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473">O host <ph name="HOST" /> quere utilizar a túa cámara e o micrófono</translation> <translation id="5035135400558156732">Xardinaxe</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Inicia sesión de novo e volve a esta pestana para obter axuda para escribir</translation> <translation id="5039762155821394373">Tamaño do tipo de letra</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidade</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 277a506..5803776 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -2065,7 +2065,6 @@ <translation id="503498442187459473"><ph name="HOST" /> તમારા કૅમેરા અને માઇક્રોફોનનો ઉપયોગ કરવા માગે છે</translation> <translation id="5035135400558156732">બાગકામ</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ફરીથી સાઇન ઇન કરો, પછી લેખન સંબંધિત સહાય મેળવવા માટે આ ટૅબ પર પાછા આવો</translation> <translation id="5039762155821394373">ફૉન્ટનું કદ</translation> <translation id="5039804452771397117">મંજૂરી આપો</translation> <translation id="5040262127954254034">પ્રાઇવસી</translation> @@ -3929,7 +3928,6 @@ <translation id="8687429322371626002">તમારું ડિવાઇસ અને એકાઉન્ટ <ph name="MANAGER" /> દ્વારા મેનેજ કરવામાં આવે છે.</translation> <translation id="8688672835843460752">ઉપલબ્ધ</translation> <translation id="868922510921656628">સેટ દીઠ પેજ</translation> -<translation id="8693163814413702888">આ ભાષા હજુ સુધી સપોર્ટ કરતી નથી.</translation> <translation id="8693639060656817812">ટ્રૅકિંગ સંબંધિત સુરક્ષાની ઉપલબ્ધતા વિશે વધુ જાણો</translation> <translation id="869891660844655955">સમાપ્તિ તારીખ</translation> <translation id="8699041776323235191">HID ડિવાઇસ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index aed52557..bb52c04 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -698,7 +698,7 @@ <translation id="2289385804009217824">ट्रिम करें</translation> <translation id="2292556288342944218">आपका इंटरनेट कनेक्शन ब्लॉक कर दिया गया है</translation> <translation id="2293443924986248631">इसके चालू होने पर, साइटें उन कुकी का इस्तेमाल नहीं कर सकतीं जो आपको वेब पर ट्रैक करती हैं. शायद कुछ साइटों पर सुविधाएं ठीक से काम न करें.</translation> -<translation id="2295831393422400053">'लिखने में मेरी मदद करें' सुविधा का इस्तेमाल करने के लिए, 'खोजों और ब्राउज़िंग को बेहतर बनाएं' सेटिंग को चालू करें</translation> +<translation id="2295831393422400053">'लिखने में मेरी मदद करो' सुविधा का इस्तेमाल करने के लिए, 'खोजों और ब्राउज़िंग को बेहतर बनाएं' सेटिंग को चालू करें</translation> <translation id="2300306941146563769">अपलोड नहीं की गई</translation> <translation id="2301098101308036335">कौनसी वेबसाइटें देखी गई हैं और कब.</translation> <translation id="230286397113210245">'गुप्त विंडो में खोलें' बटन, नई गुप्त विंडो खोलकर निजी तौर पर ब्राउज़ करने के लिए इसे चालू करें</translation> @@ -1421,7 +1421,7 @@ <translation id="3744111561329211289">बैकग्राउंड सिंक</translation> <translation id="3744212718085287312">क्या अगली बार वर्चुअल कार्ड का इस्तेमाल करके, इसे और सुरक्षित बनाना है?</translation> <translation id="3744899669254331632">आप इस समय <ph name="SITE" /> पर नहीं जा सकते क्योंकि वेबसाइट ने ऐसे अव्यवस्थित क्रेडेंशियल भेजे थे जिन्हें क्रोमियम प्रोसेस नहीं कर सकता. नेटवर्क की गड़बड़ी और हमले आमतौर पर कुछ समय के लिए होते हैं, इसलिए हो सकता है कि यह पेज बाद में काम करेगा.</translation> -<translation id="3745599309295009257">जिस पेज पर लिखा जा रहा है, उसका टेक्स्ट, कॉन्टेंट और यूआरएल, Google को भेजा जाएगा. इसके बाद, मैन्युअल तरीके से इसकी समीक्षा होगी और उसका इस्तेमाल इस सुविधा को बेहतर बनाने के लिए किया जाएगा. ऐसी साइटें जिनमें निजी या संवेदनशील जानकारी मौजूद हो उनमें अपनी निजी जानकारी, जैसे मेडिकल या फ़ाइनेंस से जुड़ी जानकारी डालने से बचें.</translation> +<translation id="3745599309295009257">जिस पेज पर लिखा जा रहा है, उसका टेक्स्ट, कॉन्टेंट और यूआरएल, Google को भेजा जाएगा. इसके बाद, मैन्युअल तरीके से इसकी समीक्षा होगी और उसका इस्तेमाल इस सुविधा को बेहतर बनाने के लिए किया जाएगा. ऐसी साइटों में अपनी निजी जानकारी (जैसे, मेडिकल या फ़ाइनेंस से जुड़ी जानकारी) डालने से बचें जिनमें आपसे निजी या संवेदनशील जानकारी मांगी जा रही हो.</translation> <translation id="3748009735914587286">मेटल (हाई-ग्लॉस)</translation> <translation id="3748148204939282805"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपको सॉफ़्टवेयर इंस्टॉल करने या आपकी व्यक्तिगत जानकारी (उदाहरण के लिए, पासवर्ड, फ़ोन नंबर या क्रेडिट कार्ड) हासिल करने जैसा खतरनाक काम करने के लिए फंसा सकते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />ज़्यादा जानें<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="3748912308089554501">एविएशन इंडस्ट्री</translation> @@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> आपके कैमरा और माइक्रोफ़ोन का उपयोग करना चाहता है</translation> <translation id="5035135400558156732">बागबानी</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">फिर से साइन इन करें. इसके बाद, लिखने में मदद पाने के लिए इस टैब पर वापस आएं</translation> <translation id="5039762155821394373">फ़ॉन्ट साइज़</translation> <translation id="5039804452771397117">अनुमति दें</translation> <translation id="5040262127954254034">निजता</translation> @@ -2497,7 +2496,7 @@ <translation id="5925040402342933574">ऑप्टिकल डिस्क (सेमी-ग्लॉस)</translation> <translation id="5926982310317673627">जिम और हेल्थ क्लब</translation> <translation id="5928444777041341328">घर और बगीचा</translation> -<translation id="5930147475897662863">'लिखने में मेरी मदद करें' सुविधा का इस्तेमाल करने के लिए, इस सेटिंग को चालू करें</translation> +<translation id="5930147475897662863">'लिखने में मेरी मदद करो' सुविधा का इस्तेमाल करने के लिए, इस सेटिंग को चालू करें</translation> <translation id="5932224571077948991">साइट में तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं</translation> <translation id="5937560539988385583">पेज का अनुवाद हो गया</translation> <translation id="5938153366081463283">वर्चुअल कार्ड जोड़ें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 045b5d63..8d0a917 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">Bušenje</translation> <translation id="1446396933673057385">Provjera točnosti</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941"><ph name="DATA_CONTROLS_FIRST_KEY_SET" />: ne može se postaviti u istom rječniku kao i <ph name="DATA_CONTROLS_SECOND_KEY_SET" /></translation> <translation id="1452803302401719440">Postavke koje je odabrao tvoj roditelj sad te štite online</translation> <translation id="1455413310270022028">Gumica</translation> <translation id="1458140305240870199">Donje rublje</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Periferni uređaji priključeni na ovaj uređaj dok ste prijavljeni</translation> <translation id="2450021089947420533">Putovanja</translation> +<translation id="2452837234288608067">Ne možemo vam pomoći s tim. Pokušajte ponovno.</translation> <translation id="2456755709261364512">Baterija mora biti napunjena iznad <ph name="REQUIRED_BATTERY_PRECENT" />%</translation> <translation id="2462599289530201834">Pretražite <ph name="KEYWORD_SHORT_NAME" /></translation> <translation id="2463739503403862330">Ispuni</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">Unesite ime i prezime</translation> <translation id="2726001110728089263">Bočna ladica</translation> <translation id="2728127805433021124">Certifikat poslužitelja potpisan je slabim algoritmom potpisa.</translation> +<translation id="272937284275742856">Sigurno potvrđivanje podataka o plaćanju...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />pokrenuti Dijagnostiku povezivosti<ph name="END_LINK" /></translation> <translation id="2730600605555029057">Klasična glazba</translation> <translation id="2731382536835015353">44 x 68 inča</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">Kriket</translation> <translation id="2959113999220720579">Njega lica i tijela</translation> <translation id="2962073860865348475">12 x 18 inča</translation> +<translation id="2967098518029543669">spremite je na svojem Google računu</translation> <translation id="2968103128155246731">Kombiji i minikombiji</translation> <translation id="2972581237482394796">&Vrati poništeno</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, trenutačno odabrano. <ph name="ROW_CONTENT" /></translation> @@ -1382,6 +1386,7 @@ <translation id="3678914302246317895">Unesite <ph name="OTP_LENGTH" />-znamenkasti kontrolni kôd</translation> <translation id="3681007416295224113">Podaci o certifikatu</translation> <translation id="3681421644246505351">Chrome bilježi teme koje vas zanimaju na temelju vaše nedavne povijesti pregledavanja.</translation> +<translation id="3682094733650754138">Odabrana je opcija unosa adrese</translation> <translation id="3689867156802445220">Broj zgrade</translation> <translation id="3693327506115126094">Odaberite kako ćete potvrditi da ste to vi</translation> <translation id="3698629142018988477">Gumb Izradi web-lokaciju, aktivirajte ga da biste brzo izradili novu web-lokaciju u Google web-lokacijama</translation> @@ -2059,7 +2064,6 @@ <translation id="503498442187459473"><ph name="HOST" /> želi upotrijebiti vašu kameru i mikrofon</translation> <translation id="5035135400558156732">Vrtlarstvo</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Ponovo se prijavite, a zatim se vratite na ovu karticu da biste dobili pomoć pri pisanju</translation> <translation id="5039762155821394373">Veličina fonta</translation> <translation id="5039804452771397117">Dopusti</translation> <translation id="5040262127954254034">Privatnost</translation> @@ -2790,6 +2794,7 @@ <translation id="6491663123807473970">Web-lokacija <ph name="URL" /> želi upotrijebiti vaše MIDI uređaje</translation> <translation id="6493924760403974580">Aplikacija podržava samo ovu veličinu.</translation> <translation id="6494750904506170417">skočni prozori i preusmjeravanja</translation> +<translation id="6495664197699704593">Zaporka se sprema samo na ovaj uređaj. Da biste je upotrebljavali na svojim drugim uređajima, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">Poslovne operacije</translation> <translation id="6499038740797743453">Želite li poništiti zaporku?</translation> <translation id="6502510275417601303">Zatvoreno je upozorenje o novoj postavci plaćanja</translation> @@ -2904,6 +2909,7 @@ <translation id="6732087373923685049">kamera</translation> <translation id="6737708609449480586">Peciva i kolači</translation> <translation id="6738516213925468394">Vaši su podaci kriptirani vašom <ph name="BEGIN_LINK" />šifrom za sinkronizaciju<ph name="END_LINK" /> <ph name="TIME" />. Unesite je da biste pokrenuli sinkronizaciju.</translation> +<translation id="6740851646645036700">Dosegnuli ste ograničenje pomoći pri pisanju. Pokušajte ponovo kasnije.</translation> <translation id="674375294223700098">Nepoznata pogreška certifikata poslužitelja</translation> <translation id="6744009308914054259">Dok čekate vezu, možete otvoriti Preuzimanja i čitati offline članke.</translation> <translation id="6745592621698551453">Ažuriraj sada</translation> @@ -2960,6 +2966,7 @@ <translation id="6860888819347870819">Može tražiti dopuštenje za unos slike u slici</translation> <translation id="6864189428899665393">267 x 389 mm</translation> <translation id="686485648936420384">Izvori informacija za potrošače</translation> +<translation id="6865166112578825782">Upišite adresu</translation> <translation id="6865412394715372076">Trenutačno nije moguće potvrditi karticu</translation> <translation id="6868573634057275953">Nastavite ažuriranje</translation> <translation id="6869334554832814367">Osobni krediti</translation> @@ -3429,6 +3436,7 @@ <translation id="7701040980221191251">Nema ih</translation> <translation id="7701544340847569275">Ažuriranje je završeno s pogreškama</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Idi na web-lokaciju <ph name="SITE" /> (nije sigurno)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Pomoć pri pisanju</translation> <translation id="7705992072972338699">Optički disk (visoki sjaj)</translation> <translation id="770607638235926858">Skijanje i snowboarding</translation> <translation id="7706689436519265630">Datoteke koje kopirate ili premjestite šalju se Google Cloudu ili trećim stranama na analizu. Na primjer, mogu se pregledavati radi otkrivanja osjetljivih podataka ili zlonamjernog softvera i mogu se pohranjivati na temelju pravila tvrtke.</translation> @@ -3648,6 +3656,7 @@ <translation id="8161095570253161196">Nastavi pregledavanje</translation> <translation id="8163866351304776260">Četverostruko bušenje s lijeve strane</translation> <translation id="8164078261547504572">Želite li primati e-poruke kada cijene padnu?</translation> +<translation id="8169175551046720804"><ph name="DATA_CONTROLS_KEYS" />: ne može se postaviti u istom rječniku</translation> <translation id="8175796834047840627">Chrome vam nudi spremanje vaših kartica na vaš Google račun jer ste prijavljeni. To ponašanje možete promijeniti u postavkama.</translation> <translation id="8176440868214972690">Administrator uređaja poslao je neke podatke, poput postavki ili pravila, sljedećim web-lokacijama.</translation> <translation id="817820454357658398">Proizvodi za žensku higijenu</translation> @@ -4044,6 +4053,7 @@ <translation id="8949410982325929394">Ton</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">Pravo i vlada</translation> +<translation id="8952569554322479410">Web-lokacija upravo je zatražila pristup vašem <ph name="REQUEST_TYPE" />. Ispunite ovu jednominutnu anketu i pomozite nam da poboljšamo način na koji web-lokacije traže pristup.</translation> <translation id="8954252855949068147">Odjeća</translation> <translation id="8956124158020778855">Nakon što uključite tu postavku, vratite se na ovu karticu da biste počeli pisati.</translation> <translation id="8957210676456822347">Autorizacija obaveznog portala za autentifikaciju</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 23c9139..3f35e2e5 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -2058,7 +2058,6 @@ <translation id="503498442187459473">A(z) <ph name="HOST" /> webhely használni szeretné a kamerát és a mikrofont</translation> <translation id="5035135400558156732">Kertészkedés</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Jelentkezzen be újra, majd térjen vissza erre a lapra, hogy segítséget kaphasson az írással kapcsolatban</translation> <translation id="5039762155821394373">Betűméret</translation> <translation id="5039804452771397117">Engedélyezés</translation> <translation id="5040262127954254034">Adatvédelem</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index efaf596..878aa2ab 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -2069,7 +2069,6 @@ <translation id="503498442187459473"><ph name="HOST" /> կայքն ուզում է օգտագործել տեսախցիկն ու խոսափողը</translation> <translation id="5035135400558156732">Այգեգործություն</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Նորից մուտք գործեք, այնուհետև վերադարձեք այս ներդիր՝ գրելու հետ կապված օգնություն ստանալու համար</translation> <translation id="5039762155821394373">Տառաչափ</translation> <translation id="5039804452771397117">Թույլ տալ</translation> <translation id="5040262127954254034">Գաղտնիություն</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index e5b778f..37d57966 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ingin menggunakan kamera dan mikrofon Anda</translation> <translation id="5035135400558156732">Berkebun</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Login lagi, lalu kembali ke tab ini untuk mendapatkan bantuan penulisan</translation> <translation id="5039762155821394373">Ukuran Font</translation> <translation id="5039804452771397117">Izinkan</translation> <translation id="5040262127954254034">Privasi</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index cd14553..165c5d981 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> vill fá að nota myndavélina og hljóðnemann</translation> <translation id="5035135400558156732">Garðyrkja</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Skráðu þig aftur inn og opnaðu síðan þennan flipa aftur til að fá aðstoð við skrif</translation> <translation id="5039762155821394373">Leturstærð</translation> <translation id="5039804452771397117">Leyfa</translation> <translation id="5040262127954254034">Persónuvernd</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index fc88265..aac5160e 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -2057,7 +2057,6 @@ <translation id="503498442187459473"><ph name="HOST" /> vuole usare la fotocamera e il microfono</translation> <translation id="5035135400558156732">Giardinaggio</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Accedi di nuovo, quindi torna a questa scheda per ricevere aiuto per la scrittura</translation> <translation id="5039762155821394373">Dimensioni carattere</translation> <translation id="5039804452771397117">Consenti</translation> <translation id="5040262127954254034">Privacy</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 8e8861d7..316d8ef 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -2064,7 +2064,6 @@ <translation id="503498442187459473"><ph name="HOST" /> רוצה להשתמש במצלמה ובמיקרופון שלך</translation> <translation id="5035135400558156732">גינון</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">צריך להיכנס שוב לחשבון ואז לחזור לכרטיסייה הזו כדי לקבל עזרה בכתיבה</translation> <translation id="5039762155821394373">גודל גופן</translation> <translation id="5039804452771397117">זה בסדר</translation> <translation id="5040262127954254034">פרטיות</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index d40743d..0cf14ab 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> から、カメラとマイクの使用許可を求められています</translation> <translation id="5035135400558156732">ガーデニング</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">もう一度ログインしてこのタブに戻ると、文章作成サポートを使用できます</translation> <translation id="5039762155821394373">フォントサイズ</translation> <translation id="5039804452771397117">許可する</translation> <translation id="5040262127954254034">プライバシー</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 3d270d4..67a9f3c 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ითხოვს თქვენი კამერისა და მიკროფონის გამოყენების ნებართვას</translation> <translation id="5035135400558156732">მებაღეობა</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ხელახლა შედით სისტემაში, შემდეგ დაბრუნდით ამ ჩანართზე, დაწერაში დახმარება რომ მიიღოთ</translation> <translation id="5039762155821394373">შრიფტის ზომა</translation> <translation id="5039804452771397117">დაშვება</translation> <translation id="5040262127954254034">კონფიდენციალურობა</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 21e5624..0b37df6 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -2059,7 +2059,6 @@ <translation id="503498442187459473"><ph name="HOST" /> хосты камераңыз бен микрофоныңызды пайдаланғысы келеді</translation> <translation id="5035135400558156732">Бағбаншылық</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Жазу бойынша көмек алу үшін аккаунтқа қайта кіріп, осы қойындыға оралыңыз.</translation> <translation id="5039762155821394373">Қаріп өлшемі</translation> <translation id="5039804452771397117">Рұқсат беру</translation> <translation id="5040262127954254034">Құпиялық</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 23925b1..7fc42925 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -2069,7 +2069,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ចង់ប្រើកាមេរ៉ា និងមីក្រូហ្វូនរបស់អ្នក</translation> <translation id="5035135400558156732">ការថែសួនច្បារ</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ចូលគណនីម្តងទៀត រួចត្រឡប់មកផ្ទាំងនេះវិញ ដើម្បីទទួលបានជំនួយក្នុងការសរសេរ</translation> <translation id="5039762155821394373">ទំហំពុម្ពអក្សរ</translation> <translation id="5039804452771397117">អនុញ្ញាត</translation> <translation id="5040262127954254034">ឯកជនភាព</translation> @@ -3935,7 +3934,6 @@ <translation id="8687429322371626002">ឧបករណ៍ និងគណនីរបស់អ្នកស្ថិតក្រោមការគ្រប់គ្រងរបស់ <ph name="MANAGER" />។</translation> <translation id="8688672835843460752">នៅសល់</translation> <translation id="868922510921656628">ទំព័រក្នុងការកំណត់មួយលើក</translation> -<translation id="8693163814413702888">មិនទាន់អាចប្រើភាសានេះបាននៅឡើយទេ។</translation> <translation id="8693639060656817812">ស្វែងយល់បន្ថែមអំពីលទ្ធភាពប្រើការការពារការតាមដាន</translation> <translation id="869891660844655955">កាលបរិច្ឆេទការផុតកំណត់</translation> <translation id="8699041776323235191">ឧបករណ៍ HID</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 0cb9c17..88203d8 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">ತೂತು ಮಾಡಿ</translation> <translation id="1446396933673057385">ನಿಖರತೆಯ ಪರಿಶೀಲನೆ</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">"<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" ನಂತೆ ಅದೇ ನಿಘಂಟಿನಲ್ಲಿ "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" ಕೀಲಿಗಳನ್ನು ಸೆಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="1452803302401719440">ನಿಮ್ಮ ಪೋಷಕರು ಆಯ್ಕೆಮಾಡಿದ ಸೆಟ್ಟಿಂಗ್ಗಳು ಇದೀಗ ನಿಮ್ಮನ್ನು ಆನ್ಲೈನ್ನಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿರಿಸುತ್ತಿವೆ</translation> <translation id="1455413310270022028">ಎರೇಸರ್</translation> <translation id="1458140305240870199">ಒಳಉಡುಪುಗಳು</translation> @@ -768,6 +769,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿರುವಾಗ ಈ ಸಾಧನಕ್ಕೆ ಬಾಹ್ಯೋಪಕರಣಗಳನ್ನು ಅಳವಡಿಸಲಾಗಿದೆ</translation> <translation id="2450021089947420533">ಪ್ರಯಾಣಗಳು</translation> +<translation id="2452837234288608067">ಈ ಕುರಿತು ಸಹಾಯ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="2456755709261364512">ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು <ph name="REQUIRED_BATTERY_PRECENT" />% % ಗಿಂತ ಹೆಚ್ಚು ಚಾರ್ಜ್ ಆಗಿರಬೇಕು</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> ಅನ್ನು ಹುಡುಕಿ</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">ಪೂರ್ಣ ಹೆಸರನ್ನು ಭರ್ತಿ ಮಾಡಿ</translation> <translation id="2726001110728089263">ಪಕ್ಕದ ಟ್ರೇ</translation> <translation id="2728127805433021124">ಕ್ಷೀಣವಾದ ಸಹಿ ಅಲ್ಗಾರಿದಮ್ ಬಳಸಿಕೊಂಡು ಸರ್ವರ್ನ ಪ್ರಮಾಣಪತ್ರಕ್ಕೆ ಸಹಿ ಮಾಡಲಾಗಿದೆ.</translation> +<translation id="272937284275742856">ನಿಮ್ಮ ಪಾವತಿ ವಿವರಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />ಸಂಪರ್ಕ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ಸ್ ರನ್ ಆಗುತ್ತಿದೆ<ph name="END_LINK" /></translation> <translation id="2730600605555029057">ಶಾಸ್ತ್ರೀಯ ಸಂಗೀತ</translation> <translation id="2731382536835015353">44 x 68 ಇಂಚು</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">ಕ್ರಿಕೆಟ್</translation> <translation id="2959113999220720579">ಮುಖ ಮತ್ತು ದೇಹದ ಆರೈಕೆ</translation> <translation id="2962073860865348475">12 x 18 ಇಂಚು</translation> +<translation id="2967098518029543669">ಇದನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಿ</translation> <translation id="2968103128155246731">ವ್ಯಾನ್ಗಳು ಮತ್ತು ಮಿನಿವ್ಯಾನ್ಗಳು</translation> <translation id="2972581237482394796">&ಮತ್ತೆಮಾಡು</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, ಪ್ರಸ್ತುತವಾಗಿ ಆಯ್ಕೆ ಮಾಡಿರುವುದು. <ph name="ROW_CONTENT" /></translation> @@ -1380,6 +1384,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" />-ಅಂಕಿಯ ಪರಿಶೀಲನೆ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ</translation> <translation id="3681007416295224113">ಪ್ರಮಾಣಪತ್ರ ಮಾಹಿತಿ</translation> <translation id="3681421644246505351">ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸದ ಆಧಾರದ ಮೇಲೆ ಆಸಕ್ತಿಯ ವಿಷಯಗಳನ್ನು Chrome ಗುರುತು ಹಾಕಿಕೊಳ್ಳುತ್ತದೆ.</translation> +<translation id="3682094733650754138">ವಿಳಾಸ ಭರ್ತಿಮಾಡುವ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಲಾಗಿದೆ</translation> <translation id="3689867156802445220">ಕಟ್ಟಡದ ಸಂಖ್ಯೆ</translation> <translation id="3693327506115126094">ಯಾವ ರೀತಿಯಲ್ಲಿ ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಲು ನೀವು ಬಯಸುತ್ತೀರಿ ಎಂಬುದನ್ನು ಆರಿಸಿ</translation> <translation id="3698629142018988477">ಸೈಟ್ ರಚಿಸಿ ಬಟನ್, ತ್ವರಿತವಾಗಿ Google Sites ನಲ್ಲಿ ಹೊಸ ಸೈಟ್ ರಚಿಸಲು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -2057,7 +2062,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಬಳಸಲು ಬಯಸುತ್ತದೆ</translation> <translation id="5035135400558156732">ತೋಟಗಾರಿಕೆ</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ಮತ್ತೊಮ್ಮೆ ಸೈನ್ ಇನ್ ಮಾಡಿ, ನಂತರ ಬರವಣಿಗೆಯ ಸಹಾಯ ಪಡೆಯಲು ಈ ಟ್ಯಾಬ್ಗೆ ಹಿಂತಿರುಗಿ</translation> <translation id="5039762155821394373">ಫಾಂಟ್ ಗಾತ್ರ</translation> <translation id="5039804452771397117">ಅನುಮತಿಸಿ</translation> <translation id="5040262127954254034">ಗೌಪ್ಯತೆ</translation> @@ -2787,6 +2791,7 @@ <translation id="6491663123807473970"><ph name="URL" /> ನಿಮ್ಮ MIDI ಸಾಧನಗಳನ್ನು ಬಳಸಲು ಬಯಸುತ್ತಿದೆ</translation> <translation id="6493924760403974580">ಈ ಆ್ಯಪ್ ಈ ಗಾತ್ರವನ್ನು ಮಾತ್ರ ಬೆಂಬಲಿಸುತ್ತದೆ.</translation> <translation id="6494750904506170417">ಪಾಪ್-ಅಪ್ಗಳು ಹಾಗೂ ಮರುನಿರ್ದೇಶನಗಳು</translation> +<translation id="6495664197699704593">ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಸೇವ್ ಮಾಡಲಾಗಿದೆ. ಇದನ್ನು ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸಲು, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">ವ್ಯಾಪಾರ ಕಾರ್ಯಾಚರಣೆಗಳು</translation> <translation id="6499038740797743453">ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಬೇಕೆ?</translation> <translation id="6502510275417601303">ಹೊಸ ಪಾವತಿ ಸೆಟ್ಟಿಂಗ್ ಕುರಿತಾದ ಅಲರ್ಟ್ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ</translation> @@ -2902,6 +2907,7 @@ <translation id="6732087373923685049">ಕ್ಯಾಮರಾ</translation> <translation id="6737708609449480586">ಬೇಯಿಸಿದ ವಸ್ತುಗಳು</translation> <translation id="6738516213925468394">ನಿಮ್ಮ ಡೇಟಾವನ್ನು <ph name="TIME" /> ಸಮಯಕ್ಕೆ ನಿಮ್ಮ <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್<ph name="END_LINK" /> ನೊಂದಿಗೆ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು ಅದನ್ನು ನಮೂದಿಸಿ.</translation> +<translation id="6740851646645036700">ನೀವು ಈಗ ನಿಮ್ಮ ಬರವಣಿಗೆಯ ಸಹಾಯದ ಮಿತಿಯನ್ನು ತಲುಪಿದ್ದೀರಿ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="674375294223700098">ಅಪರಿಚಿತ ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರ ದೋಷ.</translation> <translation id="6744009308914054259">ಸಂಪರ್ಕಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸುತ್ತಿರುವಾಗ, ಆಫ್ಲೈನ್ ಲೇಖನಗಳನ್ನು ಓದಲು ನೀವು ಡೌನ್ಲೋಡ್ಗಳಿಗೆ ಭೇಟಿ ನೀಡಬಹುದು.</translation> <translation id="6745592621698551453">ಈಗ ಅಪ್ಡೇಟ್ ಮಾಡು</translation> @@ -2958,6 +2964,7 @@ <translation id="6860888819347870819">ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೋಡ್ ಅನ್ನು ಬಳಸಲು ಕೇಳಬಹುದು</translation> <translation id="6864189428899665393">267 x 389 ಮಿಮೀ</translation> <translation id="686485648936420384">ಗ್ರಾಹಕ ಸಂಪನ್ಮೂಲಗಳು</translation> +<translation id="6865166112578825782">ವಿಳಾಸವನ್ನು ಭರ್ತಿ ಮಾಡಿ</translation> <translation id="6865412394715372076">ಈ ಕಾರ್ಡ್ ಅನ್ನು ಈಗಲೇ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="6868573634057275953">ಅಪ್ಡೇಟ್ ಅನ್ನು ಪುನರಾರಂಭಿಸಿ</translation> <translation id="6869334554832814367">ವೈಯಕ್ತಿಕ ಸಾಲಗಳು</translation> @@ -3426,6 +3433,7 @@ <translation id="7701040980221191251">ಯಾವುದೂ ಇಲ್ಲ</translation> <translation id="7701544340847569275">ದೋಷಗಳೊಂದಿಗೆ ಅಪ್ಡೇಟ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ಗೆ (ಅಸುರಕ್ಷಿತ) ಮುಂದುವರೆಸು<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">ನನಗೆ ಬರೆಯಲು ಸಹಾಯ ಮಾಡಿ</translation> <translation id="7705992072972338699">ಆಪ್ಟಿಕಲ್ ಡಿಸ್ಕ್ (ಹೆಚ್ಚಿನ ಹೊಳಪು)</translation> <translation id="770607638235926858">ಸ್ಕೀಯಿಂಗ್ ಮತ್ತು ಸ್ನೋಬೋರ್ಡಿಂಗ್</translation> <translation id="7706689436519265630">ನೀವು ನಕಲಿಸುವ ಅಥವಾ ಸರಿಸುವ ಫೈಲ್ಗಳನ್ನು ವಿಶ್ಲೇಷಣೆಗಾಗಿ Google Cloud ಅಥವಾ ಥರ್ಡ್-ಪಾರ್ಟಿಗಳಿಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಅವುಗಳನ್ನು ಸೂಕ್ಷ್ಮವಾದ ವೈಯಕ್ತಿಕ ಡೇಟಾ ಅಥವಾ ಮಾಲ್ವೇರ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲು ಸ್ಕ್ಯಾನ್ ಮಾಡಬಹುದು ಹಾಗೂ ಕಂಪನಿಯ ನೀತಿಗಳ ಆಧಾರದ ಮೇಲೆ ಸಂಗ್ರಹಿಸಬಹುದು.</translation> @@ -3645,6 +3653,7 @@ <translation id="8161095570253161196">ಬ್ರೌಸ್ ಮಾಡುವಿಕೆಯನ್ನು ಪುನರಾರಂಭಿಸಿ</translation> <translation id="8163866351304776260">ಎಡಭಾಗದಲ್ಲಿ ನಾಲ್ಕು ತೂತುಗಳನ್ನು ಮಾಡಿ</translation> <translation id="8164078261547504572">ಬೆಲೆಗಳು ಕುಸಿತವಾದಾಗ ಇಮೇಲ್ ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ಪಡೆಯಬೇಕೇ?</translation> +<translation id="8169175551046720804">"<ph name="DATA_CONTROLS_KEYS" />" ಕೀಲಿಗಳನ್ನು ಅದೇ ನಿಘಂಟಿನಲ್ಲಿ ಸೆಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="8175796834047840627">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಕಾರಣದಿಂದಾಗಿ, ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲು Chrome ಅವಕಾಶ ನೀಡುತ್ತಿದೆ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಬದಲಿಸಬಹುದು.</translation> <translation id="8176440868214972690">ಈ ಸಾಧನದ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಥವಾ ಕಾರ್ಯನೀತಿಗಳಂತಹ ಕೆಲವು ಮಾಹಿತಿಯನ್ನು ಈ ಕೆಳಗಿನ ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ಕಳುಹಿಸಿದ್ದಾರೆ.</translation> <translation id="817820454357658398">ಮಹಿಳೆಯರ ನೈರ್ಮಲ್ಯದ ಉತ್ಪನ್ನಗಳು</translation> @@ -4041,6 +4050,7 @@ <translation id="8949410982325929394">ಟೋನ್</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">ಕಾನೂನು ಮತ್ತು ಸರ್ಕಾರ</translation> +<translation id="8952569554322479410">ವೆಬ್ಸೈಟ್ ಈಗಷ್ಟೇ ನಿಮ್ಮ <ph name="REQUEST_TYPE" /> ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ವಿನಂತಿಸಿದೆ. ಈ 1-ನಿಮಿಷದ ಸಮೀಕ್ಷೆಯನ್ನು ಕೈಗೊಳ್ಳಿ ಮತ್ತು ಸೈಟ್ಗಳು ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ವಿನಂತಿಸುವ ವಿಧಾನವನ್ನು ಸುಧಾರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="8954252855949068147">ಉಡುಪು</translation> <translation id="8956124158020778855">ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆನ್ ಮಾಡಿದ ನಂತರ, ಬರೆಯುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು ಈ ಟ್ಯಾಬ್ಗೆ ಹಿಂತಿರುಗಿ.</translation> <translation id="8957210676456822347">ಕ್ಯಾಪ್ಟಿವ್ ಪೋರ್ಟಲ್ ದೃಢೀಕರಣ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 8084844..b64e724 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" />에서 카메라와 마이크를 사용하려고 합니다.</translation> <translation id="5035135400558156732">원예</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">다시 로그인한 후 이 탭으로 돌아와 작성 지원 기능을 이용하세요.</translation> <translation id="5039762155821394373">글꼴 크기</translation> <translation id="5039804452771397117">허용</translation> <translation id="5040262127954254034">개인정보 보호</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 0e444bf..8306b920 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">Тешүү</translation> <translation id="1446396933673057385">Тактыгын текшерүү</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">"<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" ачкычтарын "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" ачкычтары менен бир сөздүктө туураласа болбойт</translation> <translation id="1452803302401719440">Ата-энең тандаган жөндөөлөр онлайн коопсуздугуңду камсыз кылат</translation> <translation id="1455413310270022028">Өчүргүч</translation> <translation id="1458140305240870199">Ич кийимдер</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Көмөкчү жабдыктар түзмөккө кирип турганыңызда тиркелди</translation> <translation id="2450021089947420533">Саякаттар</translation> +<translation id="2452837234288608067">Ишке ашкан жок. Кайра аракет кылыңыз.</translation> <translation id="2456755709261364512">Батареяңыздын кубаты <ph name="REQUIRED_BATTERY_PRECENT" />% жогору болушу керек</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> издеңиз</translation> <translation id="2463739503403862330">Толтуруу</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">Толук аты-жөнүн толтуруу</translation> <translation id="2726001110728089263">Капталкы түпкүч</translation> <translation id="2728127805433021124">Сервердин тастыктамасына чабал колтамга алгоритми кол койгон.</translation> +<translation id="272937284275742856">Төлөмүңүздүн чоо-жайы коопсуз жол менен ырасталууда...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Туташуу мүчүлүштүгүн аныктоону иштетиңиз<ph name="END_LINK" /></translation> <translation id="2730600605555029057">Классикалык музыка</translation> <translation id="2731382536835015353">44 x 68 дюйм</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">Крикет</translation> <translation id="2959113999220720579">Бетке жана денеге кам көрүү</translation> <translation id="2962073860865348475">12 x 18 дюйм</translation> +<translation id="2967098518029543669">аны Google аккаунтуңузга сактаңыз</translation> <translation id="2968103128155246731">Фургондор жана микроавтобустар</translation> <translation id="2972581237482394796">&Кайталоо</translation> <translation id="2977665033722899841">Учурда <ph name="ROW_NAME" /> тандалган. <ph name="ROW_CONTENT" /></translation> @@ -1382,6 +1386,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" /> орундуу текшерүү кодун киргизиңиз</translation> <translation id="3681007416295224113">Тастыктама маалыматы</translation> <translation id="3681421644246505351">Соңку көрүлгөн вебсайттардын негизинде Chrome сизди кызыктырган темаларды белгилеп турат.</translation> +<translation id="3682094733650754138">Даректи толтуруу параметри тандалды</translation> <translation id="3689867156802445220">Имараттын номери</translation> <translation id="3693327506115126094">Өзүңүздү кантип ырастай турганыңызды тандаңыз</translation> <translation id="3698629142018988477">"Сайт түзүү" баскычы. Google Сайттарда жаңы сайтты тез түзүү үчүн иштетиңиз</translation> @@ -2059,7 +2064,6 @@ <translation id="503498442187459473"><ph name="HOST" /> камера менен микрофонуңузду колдонгону жатат</translation> <translation id="5035135400558156732">Багбанчылык</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Кайра кирип, жазуу боюнча жардам алуу үчүн бул өтмөккө кайтып келиңиз</translation> <translation id="5039762155821394373">Арип өлчөмү</translation> <translation id="5039804452771397117">Уруксат берүү</translation> <translation id="5040262127954254034">Купуялык</translation> @@ -2790,6 +2794,7 @@ <translation id="6491663123807473970"><ph name="URL" /> MIDI түзмөктөрүңүздү колдонгону жатат</translation> <translation id="6493924760403974580">Бул колдонмо ушул өлчөмдө гана иштейт.</translation> <translation id="6494750904506170417">калкыма терезелер жана багыттоолор</translation> +<translation id="6495664197699704593">Бул сырсөз ушул түзмөктө гана сакталат. Аны башка түзмөктөрдө колдонуу үчүн (<ph name="GOOGLE_PASSWORD_MANAGER" />) Google аккаунтуңузда сактаңыз.</translation> <translation id="6497295192259406877">Бизнес иштери</translation> <translation id="6499038740797743453">Сырсөздү өзгөртүү</translation> <translation id="6502510275417601303">Жаңы төлөм параметри жөнүндө эскертүү жабык</translation> @@ -2904,6 +2909,7 @@ <translation id="6732087373923685049">камера</translation> <translation id="6737708609449480586">Меште бышырылган азыктар</translation> <translation id="6738516213925468394">Дайын-даректериңиз <ph name="BEGIN_LINK" />шайкештирүүчү өткөрүүчү сүйлөм<ph name="END_LINK" /> менен <ph name="TIME" /> шифрлеген. Шайкештирип баштоо үчүн, аны киргизиңиз.</translation> +<translation id="6740851646645036700">Азырынча жазуу боюнча жардамдын чегине жеттиңиз. Кийинчерээк кайталап көрүңүз.</translation> <translation id="674375294223700098">Сервер тастыктамасынын белгисиз катасы.</translation> <translation id="6744009308914054259">Интернет байланышын күткөнчө, Жүктөлүп алынган файлдарды ачып, макалаларды оффлайнда окуп туруңуз.</translation> <translation id="6745592621698551453">Азыр жаңыртуу</translation> @@ -2960,6 +2966,7 @@ <translation id="6860888819347870819">Сүрөттөгү сүрөт режимине кирүү үчүн уруксат сурай алат</translation> <translation id="6864189428899665393">267 x 389 мм.</translation> <translation id="686485648936420384">Керектөөчү ресурстары</translation> +<translation id="6865166112578825782">Даректи толтуруңуз</translation> <translation id="6865412394715372076">Бул картаны учурда ырастоо мүмкүн эмес</translation> <translation id="6868573634057275953">Жаңыртууну улантуу</translation> <translation id="6869334554832814367">Жеке насыялар</translation> @@ -3429,6 +3436,7 @@ <translation id="7701040980221191251">Эч бир</translation> <translation id="7701544340847569275">Жаңыртуу каталарсыз аяктады</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> Улантуу <ph name="SITE" /> (кооптуу)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Жазууга жардам бер функциясы</translation> <translation id="7705992072972338699">Оптикалык диск (өтө жылтырак)</translation> <translation id="770607638235926858">Лыжа жана сноуборд тебүү</translation> <translation id="7706689436519265630">Көчүрүлгөн же жылдырылган файлдар Google Булутка же үчүнчү тараптын кызматтарына талдоо үчүн жөнөтүлөт. Мисалы, аларда купуя маалыматтын же кесепеттүү программанын болуусу текшерилип, компаниянын эрежелеринин негизинде сакталышы мүмкүн.</translation> @@ -3648,6 +3656,7 @@ <translation id="8161095570253161196">Карай берүү</translation> <translation id="8163866351304776260">Сол жагын төрт жолу тешүү</translation> <translation id="8164078261547504572">Баалар төмөндөгөндө электрондук каттарды алгыңыз келеби?</translation> +<translation id="8169175551046720804">"<ph name="DATA_CONTROLS_KEYS" />" ачкычтарын бир сөздүктө туураласа болбойт</translation> <translation id="8175796834047840627">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди параметрлерге өтүп, өзгөртүп койсоңуз болот.</translation> <translation id="8176440868214972690">Бул түзмөктүн администратору жөндөөлөр же саясаттар сыяктуу айрым маалыматты төмөндөгү вебсайттарга жөнөттү.</translation> <translation id="817820454357658398">Аялдардын гигиенасы үчүн өнүмдөр</translation> @@ -4043,6 +4052,7 @@ <translation id="8949410982325929394">Тон</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">Мыйзам жана өкмөт</translation> +<translation id="8952569554322479410">Вебсайт төмөнкүгө уруксат сурады: <ph name="REQUEST_TYPE" />. Бул 1 мүнөттүк сурамжылоого катышып, вебсайттардын уруксат сурамдарын жакшыртууга жардам бериңиз.</translation> <translation id="8954252855949068147">Кийим</translation> <translation id="8956124158020778855">Бул параметрди күйгүзгөндөн кийин жазып баштоо үчүн, бул өтмөккө кайтыңыз.</translation> <translation id="8957210676456822347">Туткундоочу порталга уруксат алуу</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index d7555d1b..a84a2e8 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">ເຈາະຮູ</translation> <translation id="1446396933673057385">ກວດສອບຄວາມຖືກຕ້ອງ</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">ບໍ່ສາມາດຕັ້ງຄ່າລະຫັດ "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" ໃນວັດຈະນານຸກົມດຽວກັນກັບ "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" ໄດ້</translation> <translation id="1452803302401719440">ການຕັ້ງຄ່າທີ່ພໍ່ແມ່ຂອງທ່ານເລືອກໄວ້ຕອນນີ້ເຮັດໃຫ້ທ່ານອອນລາຍປອດໄພຍິ່ງຂຶ້ນ</translation> <translation id="1455413310270022028">ຢາງລຶບ</translation> <translation id="1458140305240870199">ຊຸດຊັ້ນໃນ</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">ມີການເຊື່ອມຕໍ່ອຸປະກອນຕໍ່ພ່ວງເຂົ້າກັບອຸປະກອນນີ້ໃນລະຫວ່າງທີ່ທ່ານຢູ່ໃນລະບົບ</translation> <translation id="2450021089947420533">ບັນທຶກ</translation> +<translation id="2452837234288608067">ບໍ່ສາມາດຊ່ວຍເຫຼືອຕໍ່ກັບສິ່ງນັ້ນໄດ້. ກະລຸນາລອງໃໝ່.</translation> <translation id="2456755709261364512">ຕ້ອງສາກແບັດເຕີຣີຂອງທ່ານໃຫ້ຫຼາຍກວ່າ <ph name="REQUIRED_BATTERY_PRECENT" />%</translation> <translation id="2462599289530201834">ຊອກຫາ <ph name="KEYWORD_SHORT_NAME" /></translation> <translation id="2463739503403862330">ຕື່ມຂໍ້ມູນ</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">ຕື່ມຊື່ເຕັມ</translation> <translation id="2726001110728089263">ຖາດຂ້າງ</translation> <translation id="2728127805433021124">ໃບຢັ້ງຢືນຂອງເຊີບເວີໄດ້ຮັບການລົງລາຍເຊັນດ້ວຍການໃຊ້ຂັ້ນຕອນການລົງລາຍເຊັນອ່ອນແອ</translation> +<translation id="272937284275742856">ກຳລັງຢັ້ງຢືນລາຍລະອຽດການຈ່າຍເງິນຂອງທ່ານຢ່າງປອດໄພ...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />ກຳລັງເປີດໃຊ້ Connectivity Diagnostics<ph name="END_LINK" /></translation> <translation id="2730600605555029057">ເພງຄລາດສິກ</translation> <translation id="2731382536835015353">44 x 68 ນິ້ວ</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">ຄຣິກເກັດ</translation> <translation id="2959113999220720579">ການຮັກສາໜ້າ ແລະ ຮ່າງກາຍ</translation> <translation id="2962073860865348475">12 x 18 ນິ້ວ</translation> +<translation id="2967098518029543669">ບັນທຶກໄວ້ໃນບັນຊີ Google ຂອງທ່ານ</translation> <translation id="2968103128155246731">ລົດຕູ້ ແລະ ລົດຕູ້ນ້ອຍ</translation> <translation id="2972581237482394796">ເຮັດຄືນ</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, ເລືອກແລ້ວໃນປັດຈຸບັນ. <ph name="ROW_CONTENT" /></translation> @@ -1383,6 +1387,7 @@ <translation id="3678914302246317895">ລະບຸລະຫັດການຢັ້ງຢືນ <ph name="OTP_LENGTH" /> ຕົວເລກ</translation> <translation id="3681007416295224113">ຂໍ້ມູນໃບຢັ້ງຢືນ</translation> <translation id="3681421644246505351">Chrome ຈະບັນທຶກຫົວຂໍ້ທີ່ສົນໃຈໂດຍອີງຕາມປະຫວັດການທ່ອງເວັບຫຼ້າສຸດຂອງທ່ານ.</translation> +<translation id="3682094733650754138">ເລືອກຕົວເລືອກຕື່ມທີ່ຢູ່ແລ້ວ</translation> <translation id="3689867156802445220">ໝາຍເລກອາຄານ</translation> <translation id="3693327506115126094">ເລືອກວິທີທີ່ທ່ານຈະຢັ້ງຢືນວ່າແມ່ນທ່ານແທ້</translation> <translation id="3698629142018988477">ປຸ່ມສ້າງເວັບໄຊ, ເປີດນຳໃຊ້ເພື່ອສ້າງເວັບໄຊໃໝ່ໃນ Google Sites ຢ່າງວ່ອງໄວ</translation> @@ -2060,7 +2065,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ຕ້ອງການໃຊ້ໂທລະສັບ ແລະ ໄມໂຄຣໂຟນຂອງທ່ານ</translation> <translation id="5035135400558156732">ການຈັດສວນ</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ເຂົ້າສູ່ລະບົບອີກຄັ້ງ, ຈາກນັ້ນໃຫ້ກັບມາແຖບນີ້ເພື່ອຮັບຄວາມຊ່ວຍເຫຼືອໃນການຂຽນ</translation> <translation id="5039762155821394373">ຂະໜາດຟອນ</translation> <translation id="5039804452771397117">ອະນຸຍາດ</translation> <translation id="5040262127954254034">ຄວາມເປັນສ່ວນຕົວ</translation> @@ -2791,6 +2795,7 @@ <translation id="6491663123807473970"><ph name="URL" /> ຕ້ອງການໃຊ້ອຸປະກອນ MIDI ຂອງທ່ານ</translation> <translation id="6493924760403974580">ແອັບນີ້ຮອງຮັບຂະໜາດນີ້ເທົ່ານັ້ນ.</translation> <translation id="6494750904506170417">ປັອບອັບ ແລະ ການປ່ຽນເສັ້ນທາງ</translation> +<translation id="6495664197699704593">ລະຫັດຜ່ານນີ້ຈະຖືກບັນທຶກໄວ້ໃນອຸປະກອນນີ້ເທົ່ານັ້ນ. ເພື່ອໃຊ້ໃນອຸປະກອນອື່ນໆຂອງທ່ານ, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">ການດຳເນີນທຸລະກິດ</translation> <translation id="6499038740797743453">ຣີເຊັດລະຫັດຜ່ານບໍ?</translation> <translation id="6502510275417601303">ແຈ້ງເຕືອນກ່ຽວກັບການຕັ້ງຄ່າການຈ່າຍເງິນໃໝ່ແມ່ນປິດແລ້ວ</translation> @@ -2905,6 +2910,7 @@ <translation id="6732087373923685049">ກ້ອງຖ່າຍຮູບ</translation> <translation id="6737708609449480586">ເຂົ້າໜົມອົບ</translation> <translation id="6738516213925468394">ຂໍ້ມູນຂອງທ່ານຖືກເຂົ້າລະຫັດໄວ້ດ້ວຍ <ph name="BEGIN_LINK" />ລະຫັດຜ່ານການຊິ້ງຂໍ້ມູນ<ph name="END_LINK" /> ເມື່ອ <ph name="TIME" />. ກະລຸນາປ້ອນມັນເພື່ອເລີ່ມການຊິ້ງຂໍ້ມູນ</translation> +<translation id="6740851646645036700">ທ່ານໄດ້ໃຊ້ຄວາມຊ່ວຍເຫຼືອໃນການຂຽນຂອງທ່ານຈົນຮອດຂີດຈຳກັດແລ້ວໃນຕອນນີ້. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ.</translation> <translation id="674375294223700098">ໃບຢັ້ງຢືນເຊີບເວີບໍ່ຮູ້ຈັກຜິດພາດ.</translation> <translation id="6744009308914054259">ໃນຂະນະທີ່ລໍຖ້າການເຊື່ອມຕໍ່, ທ່ານສາມາດເຂົ້າຫາການດາວໂຫຼດເພື່ອອ່ານບົດຄວາມອອບລາຍໄດ້.</translation> <translation id="6745592621698551453">ອັບເດດດຽວນີ້</translation> @@ -2961,6 +2967,7 @@ <translation id="6860888819347870819">ສາມາດຂໍເຂົ້າໄປການສະແດງຜົນຊ້ອນກັນໄດ້</translation> <translation id="6864189428899665393">267 x 389 ມມ</translation> <translation id="686485648936420384">ຂໍ້ມູນຜູ້ບໍລິໂພກ</translation> +<translation id="6865166112578825782">ຕື່ມທີ່ຢູ່</translation> <translation id="6865412394715372076">ບໍ່ສາມາດຢັ້ງຢືນບັດນີ້ໄດ້ໃນຕອນນີ້</translation> <translation id="6868573634057275953">ອັບເດດຕໍ່</translation> <translation id="6869334554832814367">ການໃຫ້ຄຳປຶກສາກ່ຽວກັບສິນເຊື່ອສ່ວນບຸກຄົນ</translation> @@ -3430,6 +3437,7 @@ <translation id="7701040980221191251">ບໍ່ມີ</translation> <translation id="7701544340847569275">ອັບເດດສຳເລັດໂດຍມີຂໍ້ຜິດພາດ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ໄປຫາ<ph name="SITE" /> (ບໍ່ປອດໄພ)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">ຊ່ວຍຂ້ອຍຂຽນ</translation> <translation id="7705992072972338699">ອັອບຕິຄອລດິສ (ມັນວາວຫຼາຍ)</translation> <translation id="770607638235926858">ຫຼິ້ນສະກີ ແລະ ສະໂນບອດ</translation> <translation id="7706689436519265630">ໄຟລ໌ທີ່ທ່ານສຳເນົາ ຫຼື ຍ້າຍອອກຈະຖືກສົ່ງໃຫ້ Google Cloud ຫຼື ພາກສ່ວນທີສາມເພື່ອວິເຄາະ. ຕົວຢ່າງ: ພວກມັນອາດຖືກສະແກນເພື່ອຊອກຫາຂໍ້ມູນທີ່ລະອຽດອ່ອນ ຫຼື ເມົາແວ ແລະ ອາດຖືກຈັດເກັບຕາມນະໂຍບາຍບໍລິສັດ.</translation> @@ -3649,6 +3657,7 @@ <translation id="8161095570253161196">ສືບຕໍ່ເລືອກເບິ່ງ</translation> <translation id="8163866351304776260">ເຈາະຮູຢູ່ເບື້ອງຍ້າຍສີ່ຮູ</translation> <translation id="8164078261547504572">ຕ້ອງການໃຫ້ສົ່ງອີເມວບອກເມື່ອຫຼຸດລາຄາບໍ?</translation> +<translation id="8169175551046720804">ບໍ່ສາມາດຕັ້ງຄ່າລະຫັດ "<ph name="DATA_CONTROLS_KEYS" />" ໃນວັດຈະນານຸກົມດຽວກັນໄດ້</translation> <translation id="8175796834047840627">Chrome ກຳລັງສະເໜີບັນທຶກບັດຂອງທ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານ ເພາະວ່າທ່ານເຂົ້າສູ່ລະບົບຢູ່. ທ່ານສາມາດປ່ຽນລັກສະນະການນໍາໃຊ້ນີ້ໄດ້ໃນການຕັ້ງຄ່າ.</translation> <translation id="8176440868214972690">ຜູ້ເບິ່ງແຍງລະບົບຂອງອຸປະກອນນີ້ໄດ້ສົ່ງຂໍ້ມູນຈຳນວນໜຶ່ງໄປໃຫ້ເວັບໄຊຕໍ່ໄປນີ້ແລ້ວ ເຊັ່ນ: ການຕັ້ງຄ່າ ຫຼື ນະໂຍບາຍ.</translation> <translation id="817820454357658398">ຜະລິດຕະພັນສຸຂະອະນາໄມສຳລັບຜູ້ຍິງ</translation> @@ -4044,6 +4053,7 @@ <translation id="8949410982325929394">ລະດັບສຽງ</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">ກົດໝາຍ ແລະ ລັດຖະບານ</translation> +<translation id="8952569554322479410">ເວັບໄຊໄດ້ຮ້ອງຂໍສິດເຂົ້າເຖິງ <ph name="REQUEST_TYPE" /> ຂອງທ່ານ. ຊ່ວຍພວກເຮົາປັບປຸງວິທີທີ່ເວັບໄຊຮ້ອງຂໍສິດເຂົ້າເຖິງໂດຍເຮັດແບບສຳຫຼວດ 1 ນາທີນີ້.</translation> <translation id="8954252855949068147">ເຄື່ອງແຕ່ງກາຍ</translation> <translation id="8956124158020778855">ຫຼັງຈາກທີ່ທ່ານເປີດການຕັ້ງຄ່ານີ້ແລ້ວ, ໃຫ້ກັບມາແຖບນີ້ເພື່ອເລີ່ມຂຽນ.</translation> <translation id="8957210676456822347">ການໃຫ້ສິດທາງເຂົ້າຈັບໜ້າຈໍ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 6dacc50..18cae4b 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> nori naudoti kamerą ir mikrofoną</translation> <translation id="5035135400558156732">Sodininkystė</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Prisijunkite dar kartą, tada sugrįžkite į šį skirtuką ir gaukite pagalbos rašydami</translation> <translation id="5039762155821394373">Šrifto dydis</translation> <translation id="5039804452771397117">Leisti</translation> <translation id="5040262127954254034">Privatumas</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 7f6ee66..26a91cec 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -2059,7 +2059,6 @@ <translation id="503498442187459473"><ph name="HOST" /> vēlas lietot jūsu kameru un mikrofonu.</translation> <translation id="5035135400558156732">Dārzkopība</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Vēlreiz pierakstieties un pēc tam atgriezieties šajā cilnē, lai saņemtu palīdzību rakstīšanā.</translation> <translation id="5039762155821394373">Fonta lielums</translation> <translation id="5039804452771397117">Atļaut</translation> <translation id="5040262127954254034">Konfidencialitāte</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 3f7ed47..7f28d98 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> сака да ги користи вашата камера и микрофон</translation> <translation id="5035135400558156732">Градинарство</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Најавете се повторно, па вратете се на картичкава за да добиете помош за пишување</translation> <translation id="5039762155821394373">Големина на фонтот</translation> <translation id="5039804452771397117">Дозволи</translation> <translation id="5040262127954254034">Приватност</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index cdf5200..46b5113 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">പഞ്ച് ചെയ്യുക</translation> <translation id="1446396933673057385">കൃത്യതാ പരിശോധന</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941"><ph name="DATA_CONTROLS_FIRST_KEY_SET" /> എന്നീ കീകൾ, <ph name="DATA_CONTROLS_SECOND_KEY_SET" /> എന്നീ കീകളുള്ളത് പോലെ ഒരേ നിഘണ്ടുവിൽ സജ്ജീകരിക്കാനാകില്ല</translation> <translation id="1452803302401719440">നിങ്ങളുടെ രക്ഷിതാവ് തിരഞ്ഞെടുത്ത ക്രമീകരണം നിങ്ങളെ ഓൺലൈനിൽ കൂടുതൽ സുരക്ഷിതരായി നിലനിർത്തുന്നു</translation> <translation id="1455413310270022028">ഇറേസർ</translation> <translation id="1458140305240870199">അടിവസ്ത്രങ്ങൾ</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">നിങ്ങൾ ലോഗിൻ ചെയ്തിരിക്കുമ്പോൾ ഈ ഉപകരണത്തിൽ അറ്റാച്ച് ചെയ്തിരിക്കുന്ന പെരിഫറലുകൾ</translation> <translation id="2450021089947420533">ജേർണികൾ</translation> +<translation id="2452837234288608067">അതുമായി ബന്ധപ്പെട്ട് സഹായിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ.</translation> <translation id="2456755709261364512">നിങ്ങളുടെ ബാറ്ററിക്ക് <ph name="REQUIRED_BATTERY_PRECENT" />%-ന് മുകളിൽ ചാർജ് ഉണ്ടായിരിക്കണം</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> തിരയുക</translation> <translation id="2463739503403862330">പൂരിപ്പിക്കുക</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">മുഴുവൻ പേര് നൽകുക</translation> <translation id="2726001110728089263">വശത്തുള്ള ട്രേ</translation> <translation id="2728127805433021124">ഒരു ദുർബ്ബല സിഗ്നേച്ചർ ആൽഗരിതം ഉപയോഗിച്ച് സെർവറിന്റെ സർട്ടിഫിക്കറ്റ് സൈൻ ചെയ്തു.</translation> +<translation id="272937284275742856">നിങ്ങളുടെ പേയ്മെന്റ് വിശദാംശങ്ങൾ സുരക്ഷിതമായി പരിശോധിച്ചുറപ്പിക്കുന്നു...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />കണക്റ്റിവിറ്റി ഡയഗണോസ്റ്റിക്സ് റൺ ചെയ്യുന്നു<ph name="END_LINK" /></translation> <translation id="2730600605555029057">ശാസ്ത്രീയ സംഗീതം</translation> <translation id="2731382536835015353">44 x 68 ഇഞ്ച്</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">ക്രിക്കറ്റ്</translation> <translation id="2959113999220720579">മുഖ, ശരീര സംരക്ഷണം</translation> <translation id="2962073860865348475">12 x 18 ഇഞ്ച്</translation> +<translation id="2967098518029543669">നിങ്ങളുടെ Google Account-ൽ ഇത് സംരക്ഷിക്കുക</translation> <translation id="2968103128155246731">വാനുകളും മിനിവാനുകളും</translation> <translation id="2972581237482394796">&വീണ്ടും ചെയ്യുക</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, നിലവിൽ തിരഞ്ഞെടുത്തു. <ph name="ROW_CONTENT" /></translation> @@ -1382,6 +1386,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" /> അക്ക പരിശോധിച്ചുറപ്പിക്കൽ കോഡ് നൽകുക</translation> <translation id="3681007416295224113">സര്ട്ടിഫിക്കറ്റ് വിവരങ്ങള്</translation> <translation id="3681421644246505351">നിങ്ങളുടെ അടുത്തിടെയുള്ള ബ്രൗസിംഗ് ചരിത്രം അടിസ്ഥാനമാക്കി നിങ്ങൾക്ക് താൽപ്പര്യമുള്ള വിഷയങ്ങൾ Chrome രേഖപ്പെടുത്തുന്നു.</translation> +<translation id="3682094733650754138">വിലാസം പൂരിപ്പിക്കുക ഓപ്ഷൻ തിരഞ്ഞെടുത്തു</translation> <translation id="3689867156802445220">കെട്ടിട നമ്പർ</translation> <translation id="3693327506115126094">ഇത് നിങ്ങൾ തന്നെയാണെന്ന് എങ്ങനെ പരിശോധിച്ചുറപ്പിക്കുമെന്ന് തിരഞ്ഞെടുക്കുക</translation> <translation id="3698629142018988477">'സൈറ്റ് സൃഷ്ടിക്കുക' ബട്ടൺ, Google Sites-ൽ വേഗത്തിൽ പുതിയൊരു സൈറ്റ് സൃഷ്ടിക്കാൻ സജീവമാക്കുക</translation> @@ -2059,7 +2064,6 @@ <translation id="503498442187459473">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കാൻ <ph name="HOST" /> ആഗ്രഹിക്കുന്നു</translation> <translation id="5035135400558156732">പൂന്തോട്ടപരിപാലനം</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">വീണ്ടും സൈൻ ഇൻ ചെയ്ത ശേഷം, എഴുതാൻ സഹായം തേടാൻ ഈ ടാബിലേക്ക് മടങ്ങിയെത്തുക</translation> <translation id="5039762155821394373">ഫോണ്ട് വലുപ്പം</translation> <translation id="5039804452771397117">അനുവദിക്കൂ</translation> <translation id="5040262127954254034">സ്വകാര്യത</translation> @@ -2790,6 +2794,7 @@ <translation id="6491663123807473970"><ph name="URL" /> -ന് നിങ്ങളുടെ MIDI ഉപകരണങ്ങൾ ഉപയോഗിക്കേണ്ടതുണ്ട്</translation> <translation id="6493924760403974580">ഈ ആപ്പ് ഈ വലുപ്പം മാത്രമേ പിന്തുണയ്ക്കുന്നുള്ളൂ.</translation> <translation id="6494750904506170417">പോപ്-അപ്പുകളും റീഡയറക്റ്റുകളും</translation> +<translation id="6495664197699704593">ഈ പാസ്വേഡ് ഈ ഉപകരണത്തിൽ മാത്രമാണ് സംരക്ഷിച്ചിരിക്കുന്നത്. നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിൽ ഇത് ഉപയോഗിക്കാൻ, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">ബിസിനസ് പ്രവർത്തനങ്ങൾ</translation> <translation id="6499038740797743453">പാസ്വേഡ് റീസെറ്റ് ചെയ്യണോ?</translation> <translation id="6502510275417601303">പുതിയ പേയ്മെന്റ് ക്രമീകരണത്തെക്കുറിച്ചുള്ള മുന്നറിയിപ്പ് അടച്ചു</translation> @@ -2904,6 +2909,7 @@ <translation id="6732087373923685049">ക്യാമറ</translation> <translation id="6737708609449480586">ബേക്ക് ചെയ്ത ഭക്ഷണസാധനങ്ങൾ</translation> <translation id="6738516213925468394"><ph name="TIME" />-ന് നിങ്ങളുടെ <ph name="BEGIN_LINK" />സമന്വയ പാസ്ഫ്രെയ്സ്<ph name="END_LINK" /> ഉപയോഗിച്ച് ഡാറ്റ എൻക്രിപ്റ്റ് ചെയ്തു. സമന്വയം ആരംഭിക്കുന്നതിന് ഇത് നൽകുക.</translation> +<translation id="6740851646645036700">നിങ്ങൾ ഇപ്പോൾ എഴുതുന്നതുമായി ബന്ധപ്പെട്ട സഹായ പരിധിയിലെത്തി. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="674375294223700098">അറിയപ്പെടാത്ത സെര്വര് സര്ട്ടിഫിക്കറ്റ് പിശക്.</translation> <translation id="6744009308914054259">കണക്ഷനായി കാത്തിരിക്കുമ്പോൾ, ഓഫ്ലൈൻ ലേഖനങ്ങൾ വായിക്കാനായി നിങ്ങൾക്ക് ഡൗൺലോഡുകൾ സന്ദർശിക്കാം.</translation> <translation id="6745592621698551453">ഇപ്പോൾ അപ്ഡേറ്റ് ചെയ്യുക</translation> @@ -2960,6 +2966,7 @@ <translation id="6860888819347870819">ചിത്രത്തിനുള്ളിൽ ചിത്രത്തിലേക്ക് കടക്കാൻ ആവശ്യപ്പെടാം</translation> <translation id="6864189428899665393">267 x 389 mm</translation> <translation id="686485648936420384">ഉപയോക്തൃ ഉറവിടങ്ങൾ</translation> +<translation id="6865166112578825782">വിലാസം പൂരിപ്പിക്കുക</translation> <translation id="6865412394715372076">ഈ കാർഡ് ഇപ്പോൾ പരിശോധിച്ചുറപ്പിക്കാനാവില്ല</translation> <translation id="6868573634057275953">അപ്ഡേറ്റ് ചെയ്യൽ പുനരാരംഭിക്കുക</translation> <translation id="6869334554832814367">വ്യക്തിഗത വായ്പകൾ</translation> @@ -3427,6 +3434,7 @@ <translation id="7701040980221191251">ഒന്നുമില്ല</translation> <translation id="7701544340847569275">പിശകുകളോടെ അപ്ഡേറ്റ് പൂർത്തിയായി</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> എന്നതിലേക്ക് പോകുക (സുരക്ഷിതമല്ല)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">എന്നെ എഴുതാൻ സഹായിക്കൂ</translation> <translation id="7705992072972338699">ഒപ്റ്റിക്കൽ ഡിസ്ക് (ഹൈ ഗ്ലോസ്)</translation> <translation id="770607638235926858">സ്കീയിംഗ്, സ്നോബോർഡിംഗ്</translation> <translation id="7706689436519265630">നിങ്ങൾ പകർത്തുകയോ നീക്കുകയോ ചെയ്യുന്ന ഫയലുകൾ വിശകലനത്തിനായി Google Cloud-ലേക്കോ മൂന്നാം കക്ഷികൾക്കോ അയയ്ക്കുന്നു. ഉദാഹരണത്തിന്, സെൻസിറ്റീവായിട്ടുള്ള വ്യക്തിപരമായ ഡാറ്റയോ മാൽവെയറോ ഉണ്ടോയെന്നറിയാൻ അവ സ്കാൻ ചെയ്തേക്കാം, കൂടാതെ കമ്പനിയുടെ നയങ്ങൾ അടിസ്ഥാനമാക്കി അവ സംഭരിക്കുകയും ചെയ്തേക്കാം.</translation> @@ -3646,6 +3654,7 @@ <translation id="8161095570253161196">ബ്രൗസിംഗ് പുനരാരംഭിക്കുക</translation> <translation id="8163866351304776260">ഇടതുവശത്ത് നാല് തവണ പഞ്ച് ചെയ്യുക</translation> <translation id="8164078261547504572">വിലയിടിയുമ്പോൾ ഇമെയിലുകൾ വേണോ?</translation> +<translation id="8169175551046720804">"<ph name="DATA_CONTROLS_KEYS" />" എന്നീ കീകൾ ഒരേ നിഘണ്ടുവിൽ സജ്ജീകരിക്കാനാകില്ല</translation> <translation id="8175796834047840627">സൈൻ ഇൻ ചെയ്തിരിക്കുന്നതിനാൽ നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് കാർഡുകൾ സംരക്ഷിക്കാമെന്ന് Chrome വാഗ്ദാനം ചെയ്യുന്നു. ക്രമീകരണത്തിൽ ഈ രീതി മാറ്റാനാകും.</translation> <translation id="8176440868214972690">ഈ ഉപകരണത്തിന്റെ അഡ്മിൻ, ക്രമീകരണമോ നയങ്ങളോ പോലുള്ള ചില വിവരങ്ങൾ ഇനിപ്പറയുന്ന വെബ്സൈറ്റുകളിലേക്ക് അയച്ചു.</translation> <translation id="817820454357658398">സ്ത്രീകളുടെ ശുചിത്വവുമായി ബന്ധപ്പെട്ട ഉൽപ്പന്നങ്ങൾ</translation> @@ -4041,6 +4050,7 @@ <translation id="8949410982325929394">ടോൺ</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">നിയമവും സർക്കാരും</translation> +<translation id="8952569554322479410">ഒരു വെബ്സൈറ്റ് നിങ്ങളുടെ <ph name="REQUEST_TYPE" /> എന്നതിലേക്ക് ഇപ്പോൾ ആക്സസ് അഭ്യർത്ഥിച്ചു. ഈ ഒരു മിനിറ്റ് സർവേയിൽ പങ്കെടുത്ത്, വെബ്സൈറ്റുകൾ എങ്ങനെ ആക്സസ് അഭ്യർത്ഥിക്കുന്നു എന്നത് മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കൂ.</translation> <translation id="8954252855949068147">അപ്പാരെൽ</translation> <translation id="8956124158020778855">നിങ്ങൾ ഈ ക്രമീകരണം ഓണാക്കിയതിന് ശേഷം ഈ ടാബിലേക്ക് മടങ്ങിയെത്തി എഴുതാൻ തുടങ്ങുക.</translation> <translation id="8957210676456822347">ക്യാപ്റ്റീവ് പോർട്ടൽ അംഗീകരിക്കൽ</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 9b7c4f7e..06accb9 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> таны камер болон микрофоныг ашиглах хүсэлтэй байна</translation> <translation id="5035135400558156732">Цэцэрлэгжүүлэлт</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Бичих тусламж авахын тулд дахин нэвтрээд, энэ таб руу буцаж ирнэ үү</translation> <translation id="5039762155821394373">Фонтын хэмжээ</translation> <translation id="5039804452771397117">Зөвшөөрөх</translation> <translation id="5040262127954254034">Нууцлал</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 4f2bc1a..894d5321d 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -2059,7 +2059,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ला तुमचा कॅमेरा आणि मायक्रोफोन वापरायचा आहे</translation> <translation id="5035135400558156732">बागकाम</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">पुन्हा साइन इन करा, त्यानंतर लिहिण्यात मदत मिळवण्यासाठी या टॅबवर परत या</translation> <translation id="5039762155821394373">फॉंटचा आकार</translation> <translation id="5039804452771397117">परवानगी द्या</translation> <translation id="5040262127954254034">गोपनीयता</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 663e1f2..7492d50 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> mahu menggunakan kamera dan mikrofon anda</translation> <translation id="5035135400558156732">Berkebun</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Log masuk sekali lagi, kemudian kembali kepada tab ini untuk mendapatkan bantuan penulisan</translation> <translation id="5039762155821394373">Saiz Fon</translation> <translation id="5039804452771397117">Benarkan</translation> <translation id="5040262127954254034">Privasi</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index fb3b122a..7ec313e 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -2061,7 +2061,6 @@ <translation id="503498442187459473"><ph name="HOST" /> သည် သင့်ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို အသုံးပြုလိုသည်</translation> <translation id="5035135400558156732">ဥယျာဉ်ခြံလုပ်ကိုင်ခြင်း</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ထပ်မံလက်မှတ်ထိုးဝင်ပြီး ရေးသားမှုအကူအညီ ရယူရန် ဤတဘ်သို့ ပြန်လာပါ</translation> <translation id="5039762155821394373">ဖောင့်အရွယ်အစား</translation> <translation id="5039804452771397117">ခွင့်ပြုရန်</translation> <translation id="5040262127954254034">ကိုယ်ရေးအချက်အလက်လုံခြုံမှု</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index f200756..0234787 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">प्वाल</translation> <translation id="1446396933673057385">सत्यताको जाँच</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">"<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" नामक कीहरूलाई "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" नामक कीहरू सेट गरिएकै डिक्सनरीमा सेट गर्न सकिँदैन</translation> <translation id="1452803302401719440">तपाईंका अभिभावकले तपाईंका लागि रोज्नुभएका सेटिङले अहिले तपाईंलाई इन्टरनेटमा सुरक्षित राखिरहेका छन्</translation> <translation id="1455413310270022028">मेट्ने साधन</translation> <translation id="1458140305240870199">भित्री वस्त्रहरू</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">तपाईं लग इन भएका बेला यो डिभाइससँग एट्याच गरिएका सहायक डिभाइसहरू</translation> <translation id="2450021089947420533">Journeys</translation> +<translation id="2452837234288608067">यस सम्बन्धमा मद्दत गर्न सकिएन। फेरि प्रयास गर्नुहोस्।</translation> <translation id="2456755709261364512">तपाईंको ब्याट्री अनिवार्य रूपमा कम्तीमा पनि <ph name="REQUIRED_BATTERY_PRECENT" />% हुने गरी चार्ज गरिएको हुनु पर्छ</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> खोज्नुहोस्</translation> <translation id="2463739503403862330">पूर्ण जानकारी भर्नुहोस्</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">नाम थर भर्नुहोस्</translation> <translation id="2726001110728089263">छेउको ट्रे</translation> <translation id="2728127805433021124">सर्भरको प्रमाणपत्र एक कमजोर हस्ताक्षर अल्गोरिदम प्रयोग गर्दै हस्ताक्षर गरिएको छ।</translation> +<translation id="272937284275742856">तपाईंका भुक्तानी विवरणहरू सुरक्षित रूपमा पुष्टि गरिँदै छन्...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />जडान सम्बन्धी निदान चलाएर हेर्नुहोस्<ph name="END_LINK" /></translation> <translation id="2730600605555029057">शास्त्रीय सङ्गीत</translation> <translation id="2731382536835015353">४४ x ६८ इन्च</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">क्रिकेट</translation> <translation id="2959113999220720579">अनुहार तथा शरीरको हेरचाह</translation> <translation id="2962073860865348475">१२ x १८ इन्च</translation> +<translation id="2967098518029543669">यो पासवर्ड आफ्नो Google खातामा सेभ गर्नुहोस्</translation> <translation id="2968103128155246731">भ्यान तथा मिनिभ्यानहरू</translation> <translation id="2972581237482394796">&फेरि गर्नुहोस्</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, हाल चयन गरिएको छ। <ph name="ROW_CONTENT" /></translation> @@ -1380,6 +1384,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" /> अङ्कको पुष्टि कोड हाल्नुहोस्</translation> <translation id="3681007416295224113">प्रमाणपत्र जानकारी</translation> <translation id="3681421644246505351">Chrome ले तपाईंको हालसालैको ब्राउजिङ हिस्ट्रीका आधारमा तपाईंका रुचिका विषयहरू थाहा पाउँछ।</translation> +<translation id="3682094733650754138">ठेगाना भर्ने विकल्प छनौट गरिएको थियो</translation> <translation id="3689867156802445220">बिल्डिङ नम्बर</translation> <translation id="3693327506115126094">यो कार्य गर्न खोज्ने व्यक्ति तपाईं नै हो भन्ने कुरा पुष्टि गर्ने तरिका छनौट गर्नुहोस्</translation> <translation id="3698629142018988477">साइट बनाउने बटन, Google Sites प्रयोग गरी तुरुन्तै नयाँ साइट बनाउन यो बटन थिच्नुहोस्</translation> @@ -2058,7 +2063,6 @@ <translation id="503498442187459473"><ph name="HOST" /> तपाईंको क्यामेरा र माइक्रोफोन प्रयोग गर्न चाहन्छ</translation> <translation id="5035135400558156732">बागवानी</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">फेरि साइन इन गर्नुहोस् अनि लेख्ने सम्बन्धमा मद्दत प्राप्त गर्न यो ट्याबमा फर्कनुहोस्</translation> <translation id="5039762155821394373">फन्टको आकार</translation> <translation id="5039804452771397117">अनुमति दिनुहोस्</translation> <translation id="5040262127954254034">गोपनीयता</translation> @@ -2789,6 +2793,7 @@ <translation id="6491663123807473970"><ph name="URL" /> ले तपाईंका MIDI डिभाइसहरू प्रयोग गर्ने अनुमति माग्दै छ</translation> <translation id="6493924760403974580">यो एप यो आकारमा मात्र चल्छ।</translation> <translation id="6494750904506170417">पप-अप तथा रिडिरेक्टहरू</translation> +<translation id="6495664197699704593">यो पासवर्ड यस डिभाइसमा मात्र सेभ गरिएको छ। यो पासवर्ड अन्य डिभाइसहरूमा प्रयोग गर्न <ph name="GOOGLE_PASSWORD_MANAGER" />।</translation> <translation id="6497295192259406877">व्यावसायिक क्रियाकलापहरू</translation> <translation id="6499038740797743453">पासवर्ड रिसेट गर्ने हो?</translation> <translation id="6502510275417601303">भुक्तानीसम्बन्धी नयाँ सेटिङ मिलाउने अलर्ट बन्द गरिएको छ</translation> @@ -2903,6 +2908,7 @@ <translation id="6732087373923685049">क्यामेरा</translation> <translation id="6737708609449480586">आगोको भट्टीमा पकाइएका परिकारहरू</translation> <translation id="6738516213925468394">तपाईंको डेटा तपाईंको <ph name="BEGIN_LINK" />पासफ्रेज सिंक गर्नुहोस्<ph name="END_LINK" /> मार्फत <ph name="TIME" /> मा इन्क्रिप्ट गरियो। सिंक प्रक्रिया सुरु गर्न उक्स पासफ्रेज प्रविष्टि गर्नुहोस्।</translation> +<translation id="6740851646645036700">तपाईं अहिले लेखनसम्बन्धी थप मद्दत प्राप्त गर्न सक्नुहुन्न। पछि फेरि प्रयास गर्नुहोस्।</translation> <translation id="674375294223700098">अज्ञात सर्भर सर्टिफिकेट त्रुटि।</translation> <translation id="6744009308914054259">इन्टरनेटको प्रतीक्षा गर्दा गर्दै तपाईं अफलाइन लेखहरू पढ्न डाउनलोडहरू नामक फोल्डरमा जान सक्नुहुन्छ।</translation> <translation id="6745592621698551453">अहिले अपडेट गर्नुहोस्</translation> @@ -2959,6 +2965,7 @@ <translation id="6860888819347870819">यसले picture-in-picture मोडमा प्रवेश गर्ने अनुमति माग्न सक्छ</translation> <translation id="6864189428899665393">२६७x३८९ मि.मि.</translation> <translation id="686485648936420384">उपभोक्ता स्रोतसाधन</translation> +<translation id="6865166112578825782">ठेगाना भर्नुहोस्</translation> <translation id="6865412394715372076">यो कार्ड यस बखत पुष्टि गर्न सकिँदैन</translation> <translation id="6868573634057275953">अपडेट गर्ने कार्य सुचारु गर्नुहोस्</translation> <translation id="6869334554832814367">व्यक्तिगत कर्जा</translation> @@ -3428,6 +3435,7 @@ <translation id="7701040980221191251">कुनै पनि होइन</translation> <translation id="7701544340847569275">अपडेट गर्ने कार्य त्रुटिसहित सम्पन्न भएको छ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> मा अगाडि बढ्नु (असुरक्षित छ)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">मलाई लेख्न मद्दत गरियोस्</translation> <translation id="7705992072972338699">अप्टिकल डिस्क (हाई-ग्लस)</translation> <translation id="770607638235926858">स्किइङ तथा स्नोबोर्डिङ</translation> <translation id="7706689436519265630">तपाईंले कपी गर्नुभएका वा सार्नुभएका फाइलहरू विश्लेषण गर्ने प्रयोजनका लागि Google Cloud मा वा तेस्रा पक्षकहाँ पठाइन्छन्। उदाहरणका लागि, ती फाइलमा संवेदनशील डेटा वा मालवेयर छन् कि छैनन् भनी जाँच गरिन सक्छ र कम्पनीका नीतिका आधारमा ती फाइल भण्डारण गरिन सक्छ।</translation> @@ -3647,6 +3655,7 @@ <translation id="8161095570253161196">ब्राउज गर्ने कार्य सुचारु गर्नुहोस्</translation> <translation id="8163866351304776260">बायाँपट्टि चार प्वाल</translation> <translation id="8164078261547504572">मूल्य घट्दा इमेल प्राप्त गर्न चाहनुहुन्छ?</translation> +<translation id="8169175551046720804">"<ph name="DATA_CONTROLS_KEYS" />" नामक कीहरूलाई एउटै डिक्सनरीमा सेट गर्न सकिँदैन</translation> <translation id="8175796834047840627">तपाईं साइन इन हुनुभएकाले Chrome ले तपाईंको Google खातामा तपाईंका कार्डहरू सुरक्षित गरिदिने प्रस्ताव गर्दै छ। तपाईं सेटिङहरूमा गई उक्त व्यवहार परिवर्तन गर्न सक्नुहुन्छ।</translation> <translation id="8176440868214972690">यो डिभाइसका एड्मिनले निम्न वेबसाइटहरूमा सेटिङ वा नीतिहरू जस्ता केही जानकारी पठाउनुभएको छ।</translation> <translation id="817820454357658398">महिलालाई सफा रहन सघाउने उत्पादनहरू</translation> @@ -4042,6 +4051,7 @@ <translation id="8949410982325929394">टोन</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">कानुन तथा सरकार</translation> +<translation id="8952569554322479410">एउटा वेबसाइटले भर्खरै तपाईंको <ph name="REQUEST_TYPE" /> प्रयोग गर्ने अनुमति मागेको छ। यो १ मिनेटको सर्वेक्षण पूरा गरेर हामीलाई वेबसाइटहरूले अनुमति माग्ने तरिकामा सुधार ल्याउन मद्दत गर्नुहोस्।</translation> <translation id="8954252855949068147">लत्ताकपडा</translation> <translation id="8956124158020778855">यो सेटिङ अन गरेपछि यस ट्याबमा फर्केर लेख्न थाल्नुहोस्।</translation> <translation id="8957210676456822347">क्याप्टिभ पोर्टल प्राधिकरण</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 592c836..5ff1d961 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -2055,7 +2055,6 @@ <translation id="503498442187459473"><ph name="HOST" /> wil gebruikmaken van je camera en microfoon</translation> <translation id="5035135400558156732">Tuinieren</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Log opnieuw in en kom daarna terug naar dit tabblad om schrijfhulp te krijgen</translation> <translation id="5039762155821394373">Lettergrootte</translation> <translation id="5039804452771397117">Toestaan</translation> <translation id="5040262127954254034">Privacy</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 0b246f8..85d4731b 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ber om å bruke kameraet ditt og mikrofonen din</translation> <translation id="5035135400558156732">Hagearbeid</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Logg på igjen, og kom tilbake til denne fanen for å få skrivehjelp</translation> <translation id="5039762155821394373">Skriftstørrelse</translation> <translation id="5039804452771397117">Tillat</translation> <translation id="5040262127954254034">Personvern</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 9f12f1b1..4112dea8 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -61,7 +61,7 @@ <translation id="1094777233105318927">ଆପଣଙ୍କ ବ୍ରାଉଜର, OS, ଡିଭାଇସ, ଇନଷ୍ଟଲ କରାଯାଇଥିବା ସଫ୍ଟୱେର ଏବଂ ଫାଇଲଗୁଡ଼ିକ ବିଷୟରେ ସୂଚନା</translation> <translation id="1096545575934602868">ଏହି ଫିଲ୍ଡରେ <ph name="MAX_ITEMS_LIMIT" />ରୁ ଅଧିକ ଏଣ୍ଟ୍ରି ରହିବା ଉଚିତ ନୁହେଁ। ସମସ୍ତ ପରବର୍ତ୍ତୀ ଏଣ୍ଟ୍ରିଗୁଡ଼ିକୁ ଖାରଜ କରାଯିବ।</translation> <translation id="1099928364755383720">ସ୍ୱତଃ ପିକଚର-ଇନ-ପିକଚର</translation> -<translation id="1100782917270858593">"ଆପଣଙ୍କ ସନ୍ଧାନ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ" ବଟନ, ଆପଣଙ୍କ ସନ୍ଧାନ ପୁଣି ଆରମ୍ଭ କରି Chrome ଇତିହାସରେ ପ୍ରାସଙ୍ଗିକ କାର୍ଯ୍ୟକଳାପ ଦେଖିବାକୁ Enter ଦବାନ୍ତୁ</translation> +<translation id="1100782917270858593">"ଆପଣଙ୍କ ସର୍ଚ୍ଚ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ" ବଟନ, ଆପଣଙ୍କ ସର୍ଚ୍ଚ ପୁଣି ଆରମ୍ଭ କରି Chrome ଇତିହାସରେ ପ୍ରାସଙ୍ଗିକ କାର୍ଯ୍ୟକଳାପ ଦେଖିବାକୁ Enter ଦବାନ୍ତୁ</translation> <translation id="1101672080107056897">ତ୍ରୁଟି ସମ୍ବନ୍ଧିତ କାର୍ଯ୍ୟ</translation> <translation id="1103523840287552314">ସର୍ବଦା <ph name="LANGUAGE" /> ଅନୁବାଦ କରନ୍ତୁ</translation> <translation id="1104409666019087579">କିଛି ଆବଶ୍ୟକ ଫିଲ୍ଡ ଖାଲି ଅଛି। ସେଭ କରିବା ପୂର୍ବରୁ ସେଗୁଡ଼ିକୁ ପୂରଣ କରନ୍ତୁ।</translation> @@ -1022,7 +1022,7 @@ <translation id="2988216301273604645">ଆପଣ ବ୍ରାଉଜ କରିବା ସମୟରେ ଆପଣଙ୍କୁ ଟ୍ରାକ କରିବା ପାଇଁ ବ୍ୟବହାର କରିପାରୁଥିବା ସୂଚନା ପରିମାଣକୁ Chrome ସୀମିତ କରେ। ଆପଣଙ୍କ ନିଜ ସୁରକ୍ଷାର ଲେଭେଲ ବାଛିବା ପାଇଁ ଆପଣ ଆପଣଙ୍କ ସେଟିଂସ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="2989742184762224133">ଉପର ପଟରେ ଦୁଇଟି ଷ୍ଟାପଲ୍</translation> <translation id="2991174974383378012">ୱେବ୍ସାଇଟ୍ ସହିତ ସେୟାର୍ କରାଯାଇଛି</translation> -<translation id="299122504639061328">ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସନ୍ଧାନ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସନ୍ଧାନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="299122504639061328">ଆପଣଙ୍କ ଡିଫଲ୍ଟ ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ଏବଂ ସାଇଟ ସର୍ଚ୍ଚକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="2991571918955627853">ବର୍ତ୍ତମାନ ଆପଣ <ph name="SITE" />କୁ ଯାଇପାରିବେ ନାହିଁ କାରଣ ୱେବ୍ସାଇଟ୍ HSTS ବ୍ୟବହାର କରେ। ସାଧାରଣତଃ ନେଟ୍ୱର୍କ ତ୍ରୁଟି ଏବଂ ଆକ୍ରମଣ ଅସ୍ଥାୟୀ ଅଟେ, ତେଣୁ ସମ୍ଭବତଃ ଏହି ପୃଷ୍ଠା ପରେ କାର୍ଯ୍ୟ କରିବ।</translation> <translation id="2991865971341174470">ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ ଯାହା ଫଳରେ Chrome ଆପଣଙ୍କ ପେମେଣ୍ଟ ସୂଚନା ପୂରଣ କରିପାରିବ।</translation> <translation id="2995517112308048736">ଫାଇଲର ଆକାର:</translation> @@ -1793,7 +1793,7 @@ <translation id="4506599922270137252">ସିଷ୍ଟମ୍ ବ୍ୟବସ୍ଥାପକଙ୍କ ସହ ଯୋଗାଯୋଗ କରାଯାଉଛି</translation> <translation id="450710068430902550">ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ଙ୍କ ସହିତ ସେୟାର୍ କରାଯାଉଛି</translation> <translation id="4509074745930862522"><ph name="TRANSLATE_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Translate ବ୍ୟବହାର କରି ଏହି ପୃଷ୍ଠାକୁ ଅନୁବାଦ କରିବାକୁ Tab କରି Enter ଦବାନ୍ତୁ</translation> -<translation id="4514308731478712184">ସନ୍ଧାନ ବନ୍ଦ କରନ୍ତୁ</translation> +<translation id="4514308731478712184">ସର୍ଚ୍ଚ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="4515275063822566619">କାର୍ଡ ଓ ଠିକଣାଗୁଡ଼ିକ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟ (<ph name="ACCOUNT_EMAIL" />)ରୁ ଆସିଛି। ଆପଣ ସେଗୁଡ଼ିକୁ <ph name="BEGIN_LINK" />ସେଟିଂସ୍<ph name="END_LINK" />ରେ ପରିଚାଳନ କରିପାରିବେ।</translation> <translation id="4519245469315452746">ଅପଡେଟ ଚାଲିଥିବା ସମୟରେ ଆପଣଙ୍କ ଡିଭାଇସ ବାଧାପ୍ରାପ୍ତ ହୋଇଛି।</translation> <translation id="4520048001084013693">ଆଡମିନିଷ୍ଟ୍ରେଟର ନୀତି ଅନୁଯାୟୀ ଏହି ଫାଇଲ ଡାଉନଲୋଡ କରିବାକୁ ବ୍ଲକ କରାଯାଇଛି</translation> @@ -2058,7 +2058,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ଆପଣଙ୍କର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରିବାକୁ ଚାହୁଁଛନ୍ତି</translation> <translation id="5035135400558156732">ବଗିଚା କାମ</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ଲେଖିବାରେ ସହାୟତା ପାଇବାକୁ ପୁଣି ସାଇନ ଇନ କରି ଏହି ଟାବ ଫେରନ୍ତୁ</translation> <translation id="5039762155821394373">ଫଣ୍ଟର ଆକାର</translation> <translation id="5039804452771397117">ଅନୁମତି</translation> <translation id="5040262127954254034">ଗୋପନୀୟତା</translation> @@ -2392,7 +2391,7 @@ <translation id="5699628521141772782">ଡେରି ଏବଂ ଅଣ୍ଡା</translation> <translation id="5700761515355162635">ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ଅନୁମତି ଦିଆଯାଇଛି</translation> <translation id="5701381305118179107">କେନ୍ଦ୍ର</translation> -<translation id="5707154300732650394">ଆପଣଙ୍କ ସନ୍ଧାନ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ</translation> +<translation id="5707154300732650394">ଆପଣଙ୍କ ସର୍ଚ୍ଚ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="57094364128775171">ଜଟିଳ ପାସ୍ୱର୍ଡ ପରାମର୍ଶ କରନ୍ତୁ…</translation> <translation id="571403275720188526">(arm64)</translation> <translation id="571510845185711675">ପଶୁ ଚିକିତ୍ସକମାନେ</translation> @@ -2661,7 +2660,7 @@ <translation id="6265794661083428563"><ph name="POLICY_NAME" /> ନୀତିର ମୂଲ୍ୟ କପି କରନ୍ତୁ</translation> <translation id="6266934640124581640">ହାଲ୍କା ଟିଲ୍</translation> <translation id="6270066318535733958">ନୌକା ଚାଳନା</translation> -<translation id="6272088941196661550">ଆପଣଙ୍କ Chrome ଇତିହାସରେ ପ୍ରାସଙ୍ଗିକ କାର୍ଯ୍ୟକଳାପ ଦେଖିବାକୁ ଆପଣଙ୍କ ସନ୍ଧାନ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ</translation> +<translation id="6272088941196661550">ଆପଣଙ୍କ Chrome ଇତିହାସରେ ପ୍ରାସଙ୍ଗିକ କାର୍ଯ୍ୟକଳାପ ଦେଖିବାକୁ ଆପଣଙ୍କ ସର୍ଚ୍ଚ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="6272383483618007430">Google ଅପଡେଟ୍</translation> <translation id="6279183038361895380">ଆପଣଙ୍କର କର୍ସର୍ ଦେଖାଇବାକୁ |<ph name="ACCELERATOR" />| ଦବାନ୍ତୁ</translation> <translation id="6280223929691119688">ଏହି ଠିକଣାକୁ ପହଞ୍ଚାଇପାରିବ ନାହିଁ। ଏକ ଭିନ୍ନ ଠିକଣା ଚୟନ କରନ୍ତୁ।</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index af2c51ee1..1ef5874 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">ਮੋਰੀ</translation> <translation id="1446396933673057385">ਸਟੀਕਤਾ ਦੀ ਜਾਂਚ</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">ਕੁੰਜੀਆਂ "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" ਨੂੰ "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" ਕੁੰਜੀਆਂ ਵਾਂਗ ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</translation> <translation id="1452803302401719440">ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਚੁਣੀਆਂ ਗਈਆਂ ਸੈਟਿੰਗਾਂ ਹੁਣ ਤੁਹਾਨੂੰ ਆਨਲਾਈਨ ਸੁਰੱਖਿਅਤ ਰੱਖ ਰਹੀਆਂ ਹਨ</translation> <translation id="1455413310270022028">ਰਬੜ</translation> <translation id="1458140305240870199">ਅੰਦਰੂਨੀ ਵਸਤਰ</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">ਤੁਹਾਡੇ ਲੌਗ-ਇਨ ਕੀਤੇ ਹੋਣ ਦੌਰਾਨ ਇਸ ਡੀਵਾਈਸ ਨਾਲ ਜੁੜੇ ਪੈਰੀਫਿਰਲ</translation> <translation id="2450021089947420533">ਖੋਜ ਸਫ਼ਰ</translation> +<translation id="2452837234288608067">ਇਸ ਸੰਬੰਧੀ ਮਦਦ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="2456755709261364512">ਤੁਹਾਡੀ ਬੈਟਰੀ <ph name="REQUIRED_BATTERY_PRECENT" />% ਤੋਂ ਵੱਧ ਚਾਰਜ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> ਖੋਜੋ</translation> <translation id="2463739503403862330">ਭਰੋ</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">ਪੂਰਾ ਨਾਮ ਭਰੋ</translation> <translation id="2726001110728089263">ਸਾਈਡ ਟ੍ਰੇਅ</translation> <translation id="2728127805433021124">ਸਰਵਰ ਦਾ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਇੱਕ ਕਮਜ਼ੋਰ ਹਸਤਾਖਰ ਅਲਗੋਰਿਦਮ ਵਰਤਦੇ ਹੋਏ ਸਾਈਨ ਹੋਇਆ ਹੈ।</translation> +<translation id="272937284275742856">ਤੁਹਾਡੇ ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ ਦੀ ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ ਪੁਸ਼ਟੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />ਕਨੈਕਟੀਵਿਟੀ ਨਿਦਾਨ ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ<ph name="END_LINK" /></translation> <translation id="2730600605555029057">ਸ਼ਾਸਤਰੀ ਸੰਗੀਤ</translation> <translation id="2731382536835015353">44 x 68 ਇੰਚ</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">ਕ੍ਰਿਕਟ</translation> <translation id="2959113999220720579">ਚਿਹਰੇ ਅਤੇ ਸਰੀਰ ਦੀ ਦੇਖਭਾਲ</translation> <translation id="2962073860865348475">12 x 18 ਇੰਚ</translation> +<translation id="2967098518029543669">ਇਸ ਨੂੰ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ</translation> <translation id="2968103128155246731">ਵੈਨ ਅਤੇ ਮਿਨੀਵੈਨ</translation> <translation id="2972581237482394796">&ਰੀਡੂ</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣਿਆ ਗਿਆ। <ph name="ROW_CONTENT" /></translation> @@ -1380,6 +1384,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" />-ਅੰਕੀ ਪੁਸ਼ਟੀਕਰਨ ਕੋਡ ਦਾਖਲ ਕਰੋ</translation> <translation id="3681007416295224113">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਬਾਰੇ ਜਾਣਕਾਰੀ</translation> <translation id="3681421644246505351">Chrome ਤੁਹਾਡੇ ਹਾਲੀਆ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਆਧਾਰ 'ਤੇ ਦਿਲਚਸਪੀ ਵਾਲੇ ਵਿਸ਼ਿਆਂ ਨੂੰ ਨੋਟ ਕਰਦਾ ਹੈ।</translation> +<translation id="3682094733650754138">'ਪਤਾ ਭਰੋ' ਵਿਕਲਪ ਚੁਣਿਆ ਗਿਆ ਸੀ</translation> <translation id="3689867156802445220">ਇਮਾਰਤ ਨੰਬਰ</translation> <translation id="3693327506115126094">ਚੁਣੋ ਕਿ ਤੁਹਾਡੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਿਵੇਂ ਕੀਤੀ ਜਾਵੇ</translation> <translation id="3698629142018988477">'ਸਾਈਟ ਬਣਾਓ' ਬਟਨ, Google Sites ਵਿੱਚ ਤੇਜ਼ੀ ਨਾਲ ਨਵੀਂ ਸਾਈਟ ਬਣਾਉਣ ਲਈ ਇਸਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ</translation> @@ -2057,7 +2062,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ਦੀ ਤੁਹਾਡਾ ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਤਣ ਦੀ ਇੱਛਾ ਹੈ</translation> <translation id="5035135400558156732">ਬਾਗਬਾਨੀ</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰੋ, ਫਿਰ ਲਿਖਣ ਵਿੱਚ ਮਦਦ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇਸ ਟੈਬ 'ਤੇ ਵਾਪਸ ਆਓ</translation> <translation id="5039762155821394373">ਫ਼ੌਂਟ ਆਕਾਰ</translation> <translation id="5039804452771397117">ਆਗਿਆ ਦਿਓ</translation> <translation id="5040262127954254034">ਪਰਦੇਦਾਰੀ</translation> @@ -2787,6 +2791,7 @@ <translation id="6491663123807473970"><ph name="URL" /> ਤੁਹਾਡੇ MIDI ਡੀਵਾਈਸਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ</translation> <translation id="6493924760403974580">ਇਹ ਐਪ ਸਿਰਫ਼ ਇਸ ਆਕਾਰ ਦਾ ਸਮਰਥਨ ਕਰਦੀ ਹੈ।</translation> <translation id="6494750904506170417">ਪੌਪ-ਅੱਪ ਅਤੇ ਰੀਡਾਇਰੈਕਟ</translation> +<translation id="6495664197699704593">ਇਹ ਪਾਸਵਰਡ ਸਿਰਫ਼ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਸਨੂੰ ਤੁਹਾਡੇ ਹੋਰ ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਰਤਣ ਲਈ, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">ਕਾਰੋਬਾਰੀ ਕਾਰਵਾਈਆਂ</translation> <translation id="6499038740797743453">ਕੀ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਕਰਨਾ ਹੈ?</translation> <translation id="6502510275417601303">ਨਵੀਂ ਭੁਗਤਾਨ ਸੈਟਿੰਗ ਬਾਰੇ ਅਲਰਟ ਬੰਦ ਹੈ</translation> @@ -2901,6 +2906,7 @@ <translation id="6732087373923685049">ਕੈਮਰਾ</translation> <translation id="6737708609449480586">ਬੇਕ ਕੀਤੀਆਂ ਚੀਜ਼ਾਂ</translation> <translation id="6738516213925468394">ਤੁਹਾਡਾ ਡਾਟਾ ਤੁਹਾਡੇ <ph name="BEGIN_LINK" />ਸਿੰਕ ਪਾਸਫਰੇਜ਼<ph name="END_LINK" /> ਨਾਲ <ph name="TIME" /> ਵਜੇ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਗਿਆ। ਸਿੰਕ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਇਸਨੂੰ ਦਾਖਲ ਕਰੋ।</translation> +<translation id="6740851646645036700">ਤੁਹਾਡੀ ਫ਼ਿਲਹਾਲ ਤੁਹਾਡੀ ਲਿਖਣ ਸੰਬੰਧੀ ਸਹਾਇਤਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ ਹੈ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="674375294223700098">ਅਗਿਆਤ ਸਰਵਰ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਗੜਬੜ।</translation> <translation id="6744009308914054259">ਕਨੈਕਸ਼ਨ ਦੀ ਉਡੀਕ ਕਰਨ ਵੇਲੇ, ਆਫ਼ਲਾਈਨ ਲੇਖ ਪੜ੍ਹਨ ਲਈ ਤੁਸੀਂ ਡਾਊਨਲੋਡ 'ਤੇ ਜਾ ਸਕਦੇ ਹੋ।</translation> <translation id="6745592621698551453">ਹੁਣ ਅੱਪਡੇਟ ਕਰੋ</translation> @@ -2957,6 +2963,7 @@ <translation id="6860888819347870819">ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਦਾਖਲ ਕਰਨ ਲਈ ਲਈ ਕਿਹਾ ਜਾ ਸਕਦਾ ਹੈ</translation> <translation id="6864189428899665393">267 x 389 ਮਿ.ਮੀ.</translation> <translation id="686485648936420384">ਖਪਤਕਾਰ ਸਰੋਤ</translation> +<translation id="6865166112578825782">ਪਤਾ ਭਰੋ</translation> <translation id="6865412394715372076">ਇਸ ਕਾਰਡ ਦੀ ਫਿਲਹਾਲ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</translation> <translation id="6868573634057275953">ਅੱਪਡੇਟ ਮੁੜ-ਚਾਲੂ ਕਰੋ</translation> <translation id="6869334554832814367">ਨਿੱਜੀ ਲੋਨ</translation> @@ -3426,6 +3433,7 @@ <translation id="7701040980221191251">ਕੋਈ ਨਹੀਂ</translation> <translation id="7701544340847569275">ਅੱਪਡੇਟ ਗੜਬੜਾਂ ਨਾਲ ਪੂਰਾ ਹੋਇਆ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ਲਈ ਅੱਗੇ ਵੱਧੋ (ਅਸੁਰੱਖਿਅਤ)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">ਲਿਖਣ ਵਿੱਚ ਮੇਰੀ ਮਦਦ ਕਰੋ</translation> <translation id="7705992072972338699">ਔਪਟੀਕਲ ਡਿਸਕ (ਹਾਈ-ਗਲੋਸ)</translation> <translation id="770607638235926858">ਸਕੀਇੰਗ ਅਤੇ ਸਨੋਬੋਰਡਿੰਗ</translation> <translation id="7706689436519265630">ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਪੀ ਕੀਤੀਆਂ ਜਾਂ ਕਿਸੇ ਹੋਰ ਥਾਂ 'ਤੇ ਲਿਜਾਈਆਂ ਜਾਣ ਵਾਲੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ Google ਕਲਾਊਡ ਜਾਂ ਤੀਜੀਆਂ ਧਿਰਾਂ ਨੂੰ ਵਿਸ਼ਲੇਸ਼ਣ ਲਈ ਭੇਜਿਆ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਉਨ੍ਹਾਂ ਨੂੰ ਸੰਵੇਦਨਸ਼ੀਲ ਡਾਟੇ ਜਾਂ ਮਾਲਵੇਅਰ ਲਈ ਸਕੈਨ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ ਕੰਪਨੀ ਦੀਆਂ ਨੀਤੀਆਂ ਦੇ ਆਧਾਰ 'ਤੇ ਸਟੋਰ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> @@ -3645,6 +3653,7 @@ <translation id="8161095570253161196">ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ</translation> <translation id="8163866351304776260">ਖੱਬੇ ਪਾਸੇ ਚਾਰ ਮੋਰੀਆਂ</translation> <translation id="8164078261547504572">ਕੀ ਤੁਸੀਂ ਕੀਮਤਾਂ ਘਟਣ 'ਤੇ ਈਮੇਲਾਂ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> +<translation id="8169175551046720804">ਕੁੰਜੀਆਂ "<ph name="DATA_CONTROLS_KEYS" />" ਨੂੰ ਉਸੇ ਸ਼ਬਦਕੋਸ਼ ਵਿੱਚ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</translation> <translation id="8175796834047840627">ਤੁਹਾਡੇ ਸਾਈਨ-ਇਨ ਹੋਣ ਕਰਕੇ Chrome ਤੁਹਾਡੇ ਕਾਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਵਤੀਰੇ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="8176440868214972690">ਇਸ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਅੱਗੇ ਦਿੱਤੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਕੁਝ ਜਾਣਕਾਰੀ ਭੇਜੀ ਹੈ, ਜਿਵੇਂ ਸੈਟਿੰਗਾਂ ਜਾਂ ਨੀਤੀਆਂ।</translation> <translation id="817820454357658398">ਔਰਤਾਂ ਨਾਲ ਸੰਬੰਧਿਤ ਸਿਹਤ ਸੰਬੰਧੀ ਉਤਪਾਦ</translation> @@ -4040,6 +4049,7 @@ <translation id="8949410982325929394">ਟੋਨ</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">ਕਨੂੰਨ ਅਤੇ ਸਰਕਾਰ</translation> +<translation id="8952569554322479410">ਵੈੱਬਸਾਈਟ ਨੇ ਹੁਣੇ ਤੁਹਾਡੀ <ph name="REQUEST_TYPE" /> ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਕਿਹਾ ਹੈ। ਇਸ 1-ਮਿੰਟ ਦੇ ਸਰਵੇਖਣ ਨੂੰ ਪੂਰਾ ਕਰ ਕੇ ਵੈੱਬਸਾਈਟਾਂ ਵੱਲੋਂ ਪਹੁੰਚ ਦੀ ਮੰਗ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰੋ।</translation> <translation id="8954252855949068147">ਲਿਬਾਸ</translation> <translation id="8956124158020778855">ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਇਸ ਟੈਬ 'ਤੇ ਵਾਪਸ ਆਓ।</translation> <translation id="8957210676456822347">ਕੈਪਟਿਵ ਪੋਰਟਲ ਇਖਤਿਆਰੀਕਰਨ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 8d2c62f..785d61ab 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> chce korzystać z kamery i mikrofonu</translation> <translation id="5035135400558156732">Ogrodnictwo</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Zaloguj się ponownie i wróć na tę kartę, aby uzyskać pomoc w pisaniu</translation> <translation id="5039762155821394373">Rozmiar czcionki</translation> <translation id="5039804452771397117">Zezwalaj</translation> <translation id="5040262127954254034">Prywatność</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index dde00c2..9e65725 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> quer usar sua câmera e seu microfone</translation> <translation id="5035135400558156732">Jardinagem</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Faça login de novo e volte a esta guia para receber ajuda com a escrita</translation> <translation id="5039762155821394373">Tamanho da fonte</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidade</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 9869db9..3c39c68 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -1948,7 +1948,7 @@ <translation id="4803924862070940586"><ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation> <translation id="4809079943450490359">Instruções do administrador do dispositivo:</translation> <translation id="4811450222531576619">Saiba mais sobre a respetiva origem e tópico</translation> -<translation id="4812751092864334025">Tecnologia em dispositivos de vestir</translation> +<translation id="4812751092864334025">Tecnologia em wearable</translation> <translation id="4813512666221746211">Erro de rede</translation> <translation id="4816492930507672669">Ajustar à página</translation> <translation id="4819347708020428563">Quer editar anotações na vista predefinida?</translation> @@ -2065,7 +2065,6 @@ <translation id="503498442187459473"><ph name="HOST" /> quer utilizar a câmara e o microfone.</translation> <translation id="5035135400558156732">Jardinagem</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Inicie sessão novamente e, em seguida, regresse a este separador para obter ajuda na escrita</translation> <translation id="5039762155821394373">Tamanho da letra</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidade</translation> @@ -3929,7 +3928,6 @@ <translation id="8687429322371626002">O seu dispositivo e conta são geridos por <ph name="MANAGER" />.</translation> <translation id="8688672835843460752">Disponível</translation> <translation id="868922510921656628">Páginas por conjunto</translation> -<translation id="8693163814413702888">Este idioma ainda não é suportado.</translation> <translation id="8693639060656817812">Saber mais acerca da disponibilidade da Proteção Antirrastreio</translation> <translation id="869891660844655955">Data de expiração</translation> <translation id="8699041776323235191">Dispositivo HID</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index c9722b73..e2be20e 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> dorește să utilizeze camera foto și microfonul</translation> <translation id="5035135400558156732">Grădinărit</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Conectează-te din nou, apoi revino la această filă pentru a primi ajutor la scriere</translation> <translation id="5039762155821394373">Dimensiunea fontului</translation> <translation id="5039804452771397117">Permite</translation> <translation id="5040262127954254034">Confidențialitate</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 87929fd..6d091f37 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1164,7 +1164,7 @@ <translation id="3270847123878663523">&Отменить изменение порядка</translation> <translation id="3271648667212143903"><ph name="ORIGIN" /> запрашивает разрешение на подключение</translation> <translation id="3272091146646336650">Super B</translation> -<translation id="3272112314896217187">Введите код подтверждения из <ph name="NUMBER_OF_DIGITS" /> цифр.</translation> +<translation id="3272112314896217187">Введите код подтверждения из <ph name="NUMBER_OF_DIGITS" /> цифр</translation> <translation id="3272643614306383237">Менее 1 МБ. Возможно, некоторые сайты будут загружаться медленнее, когда вы откроете их в следующий раз.</translation> <translation id="3281350579597955952">{0,plural, =1{Администратор не рекомендует открывать этот файл в месте назначения "<ph name="DESTINATION_NAME" />".}one{Администратор не рекомендует открывать эти файлы в месте назначения "<ph name="DESTINATION_NAME" />".}few{Администратор не рекомендует открывать эти файлы в месте назначения "<ph name="DESTINATION_NAME" />".}many{Администратор не рекомендует открывать эти файлы в месте назначения "<ph name="DESTINATION_NAME" />".}other{Администратор не рекомендует открывать эти файлы в месте назначения "<ph name="DESTINATION_NAME" />".}}</translation> <translation id="3282085321714087552">Ваша организация (<ph name="ENROLLMENT_DOMAIN" />) отправила на следующие веб-сайты некоторые данные, такие как настройки и правила.</translation> @@ -1379,7 +1379,7 @@ <translation id="3677008721441257057">Возможно, вы хотели открыть сайт <a href="#" id="dont-proceed-link"><ph name="DOMAIN" /></a>?</translation> <translation id="3678029195006412963">Не удалось подписать запрос</translation> <translation id="3678529606614285348">Открыть страницу в новом окне в режиме инкогнито (Ctrl + Shift + N)</translation> -<translation id="3678914302246317895">Введите <ph name="OTP_LENGTH" />-значный код подтверждения.</translation> +<translation id="3678914302246317895">Введите <ph name="OTP_LENGTH" />-значный код подтверждения</translation> <translation id="3681007416295224113">Данные сертификата</translation> <translation id="3681421644246505351">Chrome определяет интересующие вас темы на основе недавней истории браузера.</translation> <translation id="3689867156802445220">Номер дома</translation> @@ -2059,7 +2059,6 @@ <translation id="503498442187459473">Сайт <ph name="HOST" /> запрашивает доступ к камере и микрофону.</translation> <translation id="5035135400558156732">Садоводство</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Войдите в аккаунт ещё раз, а затем вернитесь на эту вкладку, чтобы сгенерировать текст.</translation> <translation id="5039762155821394373">Размер шрифта</translation> <translation id="5039804452771397117">Разрешить</translation> <translation id="5040262127954254034">Конфиденциальность</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index b66b433..a60aa9b 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> හට ඔබේ කැමරාව සහ මයික්රෆෝනය භාවිතා කිරීමට අවශ්යයි</translation> <translation id="5035135400558156732">උද්යානකරණය</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">නැවත පුරන්න, පසුව ලිවීමේ උදවු ලබා ගැනීමට මෙම පටිත්ත වෙත ආපසු එන්න</translation> <translation id="5039762155821394373">ෆොන්ට තරම</translation> <translation id="5039804452771397117">ඉඩදෙන්න</translation> <translation id="5040262127954254034">රහස්යතාවය</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index a335a567..d7f35af 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -2056,7 +2056,6 @@ <translation id="503498442187459473"><ph name="HOST" /> chce použiť váš fotoaparát a mikrofón</translation> <translation id="5035135400558156732">Záhradkárstvo</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Ak chcete získať pomoc s písaním, znova sa prihláste a vráťte sa na túto kartu</translation> <translation id="5039762155821394373">Veľkosť písma</translation> <translation id="5039804452771397117">Povoliť</translation> <translation id="5040262127954254034">Ochrana súkromia</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 9eccf25..90594daa 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> želi uporabiti kamero in mikrofon</translation> <translation id="5035135400558156732">Vrtnarjenje</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Znova se prijavite, nato se vrnite na ta zavihek, če želite pomoč pri pisanju</translation> <translation id="5039762155821394373">Velikost pisave</translation> <translation id="5039804452771397117">Dovoli</translation> <translation id="5040262127954254034">Zasebnost</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 3d64b234..4bb286c 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> kërkon të përdorë kamerën dhe mikrofonin</translation> <translation id="5035135400558156732">Kopshtaria</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Identifikohu përsëri dhe më pas kthehu te kjo skedë për të marrë ndihmë për të shkuarit</translation> <translation id="5039762155821394373">Madhësia e fontit</translation> <translation id="5039804452771397117">Lejo</translation> <translation id="5040262127954254034">Privatësia</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index be16b248..08a5e73 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> želi da koristi kameru i mikrofon</translation> <translation id="5035135400558156732">Baštovanstvo</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Prijavite se ponovo, pa se vratite na ovu karticu da biste dobili pomoć pri pisanju</translation> <translation id="5039762155821394373">Veličina fonta</translation> <translation id="5039804452771397117">Dozvoli</translation> <translation id="5040262127954254034">Privatnost</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index dfb6b08a..2aec05f1 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> жели да користи камеру и микрофон</translation> <translation id="5035135400558156732">Баштованство</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Пријавите се поново, па се вратите на ову картицу да бисте добили помоћ при писању</translation> <translation id="5039762155821394373">Величина фонта</translation> <translation id="5039804452771397117">Дозволи</translation> <translation id="5040262127954254034">Приватност</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 3720f83..22314c01b 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -703,7 +703,7 @@ <translation id="230286397113210245">Knappen Öppna ett inkognitofönster: aktivera om du vill öppna ett nytt inkognitofönster och surfa privat</translation> <translation id="2312234273148520048">Smakförstärkare och dressingar</translation> <translation id="2316087952091171402">Mindre än <ph name="UPPER_ESTIMATE" /> Vissa webbplatser kan läsas in långsammare nästa gång du besöker dem.</translation> -<translation id="2316159751672436664">Anpassa tillgänglighetsverktygen i inställningarna för Chrome OS</translation> +<translation id="2316159751672436664">Anpassa tillgänglighetsverktygen i inställningarna för ChromeOS</translation> <translation id="2316887270356262533">Frigör mindre än 1 MB. Vissa webbplatser kan läsas in långsammare nästa gång du besöker dem.</translation> <translation id="2317259163369394535"><ph name="DOMAIN" /> kräver användarnamn och lösenord.</translation> <translation id="2318594867107319532">Senaste tidsstämpel för princip:</translation> @@ -1594,7 +1594,7 @@ <translation id="4123572138124678573">Tre hål längst ned</translation> <translation id="412601465078863288">Tidsgränsen för uppladdning överskreds</translation> <translation id="4127317221386336246">Accessoarer</translation> -<translation id="4127575959421463246">Letar du efter Chrome OS-flaggor? Besök</translation> +<translation id="4127575959421463246">Letar du efter ChromeOS-flaggor? Besök</translation> <translation id="4129401438321186435">{COUNT,plural, =1{1 till}other{# till}}</translation> <translation id="4130226655945681476">Kontrollera nätverkskablar, modem och router</translation> <translation id="4132448310531350254">Dubbla hanterare för filnamnstillägget <ph name="FILE_EXTENSION" /> refereras av apparna <ph name="POLICY_IDS_LIST" />.</translation> @@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> vill använda kameran och mikrofonen</translation> <translation id="5035135400558156732">Trädgårdsarbete</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Logga in igen och återgå sedan till den här fliken för att få hjälp med att skriva</translation> <translation id="5039762155821394373">Teckensnittsstorlek</translation> <translation id="5039804452771397117">Tillåt</translation> <translation id="5040262127954254034">Integritet</translation> @@ -2301,7 +2300,7 @@ <translation id="5521782189689806907">Skåp</translation> <translation id="5523118979700054094">Policynamn</translation> <translation id="5525755241743357906">Filen har kopierats eller flyttats</translation> -<translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />: tryck på Tabb och sedan på Retur om du vill anpassa tillgänglighetsverktygen i inställningarna för Chrome OS.</translation> +<translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />: tryck på Tabb och sedan på Retur om du vill anpassa tillgänglighetsverktygen i inställningarna för ChromeOS.</translation> <translation id="5528532273234423708">Automatisering i hemmet</translation> <translation id="55293785478302737">Kanthäftning</translation> <translation id="553377674408670169">Jobb inom utbildning</translation> @@ -3697,7 +3696,7 @@ <translation id="8249463483885748674">Standardprov och inträdesprov</translation> <translation id="824968735947741546">Översätter <ph name="SOURCE" /> (identifierades automatiskt) till <ph name="TARGET" /></translation> <translation id="8250094606476360498">Den här adressen har sparats på den här enheten. Om du vill använda den i olika produkter från Google sparar du den i Google-kontot, <ph name="ACCOUNT" />.</translation> -<translation id="8252991034201168845">Knappen Hantera tillgänglighetsinställningar: tryck på Retur om du vill anpassa tillgänglighetsverktygen i inställningarna för Chrome OS</translation> +<translation id="8252991034201168845">Knappen Hantera tillgänglighetsinställningar: tryck på Retur om du vill anpassa tillgänglighetsverktygen i inställningarna för ChromeOS</translation> <translation id="8253091569723639551">En faktureringsadress måste anges</translation> <translation id="8257387598443225809">Den här appen har utformats för mobila enheter</translation> <translation id="825929999321470778">Visa alla sparade lösenord</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index bacdd5fd..83ed2ec 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> inataka kutumia kamera na maikrofoni yako</translation> <translation id="5035135400558156732">Utunzaji bustani</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Ingia katika akaunti tena, kisha urudi kwenye kichupo hiki ili upate usaidizi wa kuandika</translation> <translation id="5039762155821394373">Ukubwa wa Fonti</translation> <translation id="5039804452771397117">Ruhusu</translation> <translation id="5040262127954254034">Faragha</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index cdad909..8d871e3 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -2056,7 +2056,6 @@ <translation id="503498442187459473"><ph name="HOST" /> உங்கள் கேமராவையும் மைக்ரோஃபோனையும் பயன்படுத்த விரும்புகிறது</translation> <translation id="5035135400558156732">தோட்ட வேலை</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">எழுதுவதற்கு உதவிபெற, மீண்டும் உள்நுழைந்து இந்தப் பிரிவுக்கு மீண்டும் வரவும்</translation> <translation id="5039762155821394373">எழுத்து வடிவ அளவு</translation> <translation id="5039804452771397117">அனுமதி</translation> <translation id="5040262127954254034">தனியுரிமை</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 507ade2..8ca4067 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> మీ కెమెరాను మరియు మైక్రోఫోన్ను ఉపయోగించాలనుకుంటోంది</translation> <translation id="5035135400558156732">తోటపని</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">మళ్లీ సైన్ ఇన్ చేసి, తర్వాత తిరిగి ఈ ట్యాబ్కు వచ్చి రాయడంలో సహాయం పొందండి</translation> <translation id="5039762155821394373">ఫాంట్ సైజ్</translation> <translation id="5039804452771397117">అనుమతించండి</translation> <translation id="5040262127954254034">గోప్యత</translation> @@ -3924,7 +3923,6 @@ <translation id="8687429322371626002"><ph name="MANAGER" /> మీ పరికరాన్ని, ఖాతాను మేనేజ్ చేస్తోంది.</translation> <translation id="8688672835843460752">అందుబాటులో ఉంది</translation> <translation id="868922510921656628">ఒక సెట్లో ఉన్న పేజీలు</translation> -<translation id="8693163814413702888">ఈ భాషకు ఇంకా సపోర్ట్ లేదు.</translation> <translation id="8693639060656817812">'ట్రాకింగ్ నుండి రక్షణ లభ్యత' గురించి మరింత తెలుసుకోండి</translation> <translation id="869891660844655955">గడువు తేదీ</translation> <translation id="8699041776323235191">HID పరికరం</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index f746e4b5..ec1409a 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -2059,7 +2059,6 @@ <translation id="503498442187459473"><ph name="HOST" /> ต้องการใช้กล้องถ่ายรูปและไมโครโฟนของคุณ</translation> <translation id="5035135400558156732">การทำสวน</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">ลงชื่อเข้าใช้อีกครั้ง แล้วกลับมาที่แท็บนี้เพื่อรับความช่วยเหลือในการเขียน</translation> <translation id="5039762155821394373">ขนาดแบบอักษร</translation> <translation id="5039804452771397117">อนุญาต</translation> <translation id="5040262127954254034">ความเป็นส่วนตัว</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 2d586cc..c4d7f83c 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> kameranızı ve mikrofonunuzu kullanmak istiyor</translation> <translation id="5035135400558156732">Bahçıvanlık</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Tekrar oturum açtıktan sonra yazma konusunda yardım almak için bu sekmeye dönün</translation> <translation id="5039762155821394373">Yazı Tipi Boyutu</translation> <translation id="5039804452771397117">İzin ver</translation> <translation id="5040262127954254034">Gizlilik</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index c1009b1..fdece64 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -1253,7 +1253,7 @@ <translation id="3441653493275994384">Екран</translation> <translation id="3443504041532578451">Оптичний диск (сатиновий)</translation> <translation id="344449859752187052">Сторонні файли cookie заблоковано</translation> -<translation id="3447644283769633681">Заблокувати всі файли cookie третіх сторін</translation> +<translation id="3447644283769633681">Заблокувати всі сторонні файли cookie</translation> <translation id="3447661539832366887">Власник цього пристрою вимкнув гру з динозавром.</translation> <translation id="3447884698081792621">Показати сертифікат (видавець: <ph name="ISSUER" />)</translation> <translation id="3450323514459570273">Може просити дозвіл керувати пристроями MIDI й перепрограмовувати їх</translation> @@ -1447,7 +1447,7 @@ <translation id="3793574014653384240">Кількість і причини останніх аварійних завершень роботи</translation> <translation id="3795344968043407227">Інді й альтернативна музика</translation> <translation id="3799805948399000906">Запит на шрифт</translation> -<translation id="3801265110651850478">Надсилати запит "Do Not Track" разом із трафіком веб-перегляду</translation> +<translation id="3801265110651850478">Надсилати запит Do Not Track разом із трафіком веб-перегляду</translation> <translation id="380329542618494757">Повне ім’я</translation> <translation id="3806932344025766608">На сайті, який ви намагаєтеся відвідати, зловмисники можуть обманом змусити вас установити програмне забезпечення або розкрити вашу інформацію, зокрема пароль, номер телефону чи кредитної картки. Chrome радить повернутися на безпечну сторінку. <ph name="BEGIN_LEARN_MORE_LINK" />Докладніше<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="3807270098669886186">Постачальники телефонних послуг</translation> @@ -2060,7 +2060,6 @@ <translation id="503498442187459473">Сайт <ph name="HOST" /> хоче отримати доступ до ваших камери й мікрофона</translation> <translation id="5035135400558156732">Садівництво</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Увійдіть знову, а потім поверніться на цю вкладку, щоб отримати допомогу з написанням тексту</translation> <translation id="5039762155821394373">Розмір шрифту</translation> <translation id="5039804452771397117">Дозволити</translation> <translation id="5040262127954254034">Конфіденційність</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index f27ae119..5cd4093 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -259,6 +259,7 @@ <translation id="1442987760062738829">سوراخ کریں</translation> <translation id="1446396933673057385">درستگی چیک</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">کلیدیں "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" کلیدوں کی طرح ایک ہی ڈکشنری میں سیٹ نہیں کی جا سکتیں</translation> <translation id="1452803302401719440">آپ کے والدین نے جن ترتیبات کا انتخاب کیا ہے، اب وہ آپ کو آن لائن تحفظ فراہم کر رہے ہیں</translation> <translation id="1455413310270022028">صافی</translation> <translation id="1458140305240870199">زیر جامے</translation> @@ -770,6 +771,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">آپ کے لاگ ان ہونے کے دوران اس آلے سے منسلک کردہ پیریفیرلز</translation> <translation id="2450021089947420533">صارف کے تجربے</translation> +<translation id="2452837234288608067">اس میں مدد نہیں کر سکا۔ دوبارہ کوشش کریں۔</translation> <translation id="2456755709261364512">آپ کی بیٹری <ph name="REQUIRED_BATTERY_PRECENT" />فیصد سے زیادہ چارج ہونی چاہیے</translation> <translation id="2462599289530201834"><ph name="KEYWORD_SHORT_NAME" /> تلاش کریں</translation> <translation id="2463739503403862330">پُر کریں</translation> @@ -911,6 +913,7 @@ <translation id="2725927759457695883">مکمل نام پُر کریں</translation> <translation id="2726001110728089263">سائڈ ٹرے</translation> <translation id="2728127805433021124">سرور کا سرٹیفیکیٹ ایک کمزور دستخط الگورتھم استعمال کر کے دستخط کیا ہوا ہے۔</translation> +<translation id="272937284275742856">آپ کی ادائیگی کی تفصیلات کی محفوظ طریقے سے تصدیق ہو رہی ہے...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />کنیکٹوٹی کی تشخیصات چلانے کی<ph name="END_LINK" /></translation> <translation id="2730600605555029057">کلاسیکل موسیقی</translation> <translation id="2731382536835015353">44 x 68 انچ</translation> @@ -1010,6 +1013,7 @@ <translation id="2958544468932521864">کرکٹ</translation> <translation id="2959113999220720579">چہرے اور جسم کی نگہداشت</translation> <translation id="2962073860865348475">12 x 18 انچ</translation> +<translation id="2967098518029543669">اسے اپنے Google اکاؤنٹ میں محفوظ کریں</translation> <translation id="2968103128155246731">وینز اور منی وینز</translation> <translation id="2972581237482394796">&واپس لائیں</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />، فی الحال منتخب کردہ۔ <ph name="ROW_CONTENT" /></translation> @@ -1385,6 +1389,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" /> ہندسی توثیقی کوڈ درج کریں</translation> <translation id="3681007416295224113">سرٹیفکیٹ کی معلومات</translation> <translation id="3681421644246505351">Chrome آپ کی حالیہ براؤزنگ کی سرگزشت کی بنیاد پر دلچسپی کے موضوعات کو نوٹ کرتا ہے۔</translation> +<translation id="3682094733650754138">مکمل پتہ پُر کریں کا اختیار منتخب کیا گیا</translation> <translation id="3689867156802445220">بلڈنگ نمبر</translation> <translation id="3693327506115126094">اپنی توثیق کئے جانے کا طریقہ منتخب کریں</translation> <translation id="3698629142018988477">سائٹ تخلیق کریں بٹن، Google Sites میں تیزی سے نئی سائٹ تخلیق کرنے کے لیے فعال کریں</translation> @@ -2062,7 +2067,6 @@ <translation id="503498442187459473"><ph name="HOST" /> آپ کا کیمرا اور مائیکروفون استعمال کرنا چاہتا ہے</translation> <translation id="5035135400558156732">باغبانی</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">دوبارہ سائن ان کریں، پھر تحریری مدد حاصل کرنے کے لیے اس ٹیب پر واپس آئیں</translation> <translation id="5039762155821394373">فونٹ سائز</translation> <translation id="5039804452771397117">اجازت دیں</translation> <translation id="5040262127954254034">رازداری</translation> @@ -2794,6 +2798,7 @@ <translation id="6491663123807473970"><ph name="URL" /> آپ کے MIDI آلات استعمال کرنا چاہتا ہے</translation> <translation id="6493924760403974580">یہ ایپ صرف اس سائز کو سپورٹ کرتی ہے۔</translation> <translation id="6494750904506170417">پوپ اپس اور ری ڈائریکٹس</translation> +<translation id="6495664197699704593">یہ پاس ورڈ صرف اس آلے میں محفوظ ہے۔ اسے اپنے دوسرے آلات پر استعمال کرنے کے لیے، <ph name="GOOGLE_PASSWORD_MANAGER" />۔</translation> <translation id="6497295192259406877">کاروباری آپریشنز</translation> <translation id="6499038740797743453">پاس ورڈ کو ری سیٹ کریں؟</translation> <translation id="6502510275417601303">ادائیگی کی نئی ترتیب کے بارے میں الرٹ بند ہے</translation> @@ -2908,6 +2913,7 @@ <translation id="6732087373923685049">کیمرا</translation> <translation id="6737708609449480586">سینکی ہوئی اشیاء</translation> <translation id="6738516213925468394">آپ کے ڈیٹا کی آپ کے <ph name="BEGIN_LINK" />مطابقت پذیر پاس فریز<ph name="END_LINK" /> کے ساتھ <ph name="TIME" /> کو مرموز کاری کی گئی تھی۔ مطابقت پذیری شروع کرنے کیلئے اسے درج کریں۔</translation> +<translation id="6740851646645036700">آپ ابھی کے لیے اپنی تحریری مدد کی حد کو پہنچ گئے ہیں۔ بعد میں دوبارہ کوشش کریں۔</translation> <translation id="674375294223700098">سرور سرٹیفکیٹ میں نامعلوم خرابی۔</translation> <translation id="6744009308914054259">کنکشن کا انتظار کرنے کے دوران، آف لائن مضامین پڑھنے کے لیے آپ ڈاؤن لوڈز ملاحظہ کر سکتے ہیں۔</translation> <translation id="6745592621698551453">ابھی اپ ڈیٹ کریں</translation> @@ -2964,6 +2970,7 @@ <translation id="6860888819347870819">تصویر میں تصویر داخل کرنے کے لیے کہہ سکتی ہے</translation> <translation id="6864189428899665393">267 x 389 مل میٹر</translation> <translation id="686485648936420384">صارف کے وسائل</translation> +<translation id="6865166112578825782">پتہ درج کریں</translation> <translation id="6865412394715372076">ابھی اس کارڈ کی توثیق نہیں کی جا سکتی</translation> <translation id="6868573634057275953">اپ ڈیٹ دوبارہ شروع کریں</translation> <translation id="6869334554832814367">ذاتی قرضے</translation> @@ -3433,6 +3440,7 @@ <translation id="7701040980221191251">کوئی نہیں</translation> <translation id="7701544340847569275">خرابیوں کے ساتھ اپ ڈیٹ مکمل ہو گئی</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> کی طرف بڑھیں (غیر محفوظ)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">لکھنے میں میری مدد کریں</translation> <translation id="7705992072972338699">آپٹیکل ڈسک (ہائی گلوس)</translation> <translation id="770607638235926858">اسکیئنگ اور سنو بورڈنگ</translation> <translation id="7706689436519265630">جن فائلز کو آپ کاپی یا منتقل کرتے ہیں وہ Google کلاؤڈ یا فریقین ثالث کو تجزیے کیلئے بھیجی جاتی ہیں۔ مثال کے طور پر، انہیں حساس ڈیٹا یا میلوئیر کیلئے اسکین کیا جا سکتا ہے اور کمپنی کی پالیسیوں کی بنیاد پر اسٹور کیا جا سکتا ہے۔</translation> @@ -3652,6 +3660,7 @@ <translation id="8161095570253161196">براؤزنگ دوبارہ شروع کریں</translation> <translation id="8163866351304776260">بائیں طرف مستطیل سوراخ</translation> <translation id="8164078261547504572">قیمتیں گرنے پر ای میلز چاہتے ہیں؟</translation> +<translation id="8169175551046720804">کلیدیں "<ph name="DATA_CONTROLS_KEYS" />" ایک ہی ڈکشنری میں سیٹ نہیں کی جا سکتیں</translation> <translation id="8175796834047840627">آپ کے سائن ان ہونے کی وجہ سے Chrome آپ کے کارڈز کو آپ کے Google اکاؤنٹ میں محفوظ کرنے کی پیشکش کر رہا ہے۔ آپ اس برتاؤ کو ترتیبات میں تبدیل کر سکتے ہیں۔</translation> <translation id="8176440868214972690">اس آلہ کے منتظم نے کچھ معلومات جیسے ترتیبات یا پالیسیاں درج ذیل ویب سائٹ پر بھیجی ہیں۔</translation> <translation id="817820454357658398">نسوانی صفائی ستھرائی کے پروڈکٹس</translation> @@ -4047,6 +4056,7 @@ <translation id="8949410982325929394">ٹون</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">قانون اور حکومت</translation> +<translation id="8952569554322479410">ایک ویب سائٹ نے ابھی آپ کی <ph name="REQUEST_TYPE" /> تک رسائی کے لیے کہا ہے۔ اس 1 منٹ کے سروے میں حصہ لے کر ویب سائٹس رسائی کے لیے کس طرح کہتی ہیں اس کو بہتر بنانے میں ہماری مدد کریں۔</translation> <translation id="8954252855949068147">لباس</translation> <translation id="8956124158020778855">اس ترتیب کو آن کرنے کے بعد، لکھنا شروع کرنے کے لیے اس ٹیب پر واپس آئیں۔</translation> <translation id="8957210676456822347">کیپٹو پورٹل اجازت دہندگی</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 6690935..6b450d96 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -42,7 +42,7 @@ <translation id="1062407476771304334">Almashtirish</translation> <translation id="1064054731605354900">A3x5</translation> <translation id="106701514854093668">Kompyuterdagi xatcho‘plar</translation> -<translation id="1067029985695494416">Qidiruv tizimi axboroti</translation> +<translation id="1067029985695494416">Qidiruv tizimi tafsilotlari</translation> <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" /> tilidagi sahifalar hech qachon tarjima qilinmasin</translation> <translation id="1070333806075222467">Metall (yaltiroq)</translation> <translation id="1070853536588271387">Gibrid va muqobil transport</translation> @@ -258,6 +258,7 @@ <translation id="1442987760062738829">Teshik ochish</translation> <translation id="1446396933673057385">Aniqlik tekshiruvi</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">"<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" kalitlari "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />" kalitlari bilan bir xil lugʻatda sozlanmaydi</translation> <translation id="1452803302401719440">Ota-onangiz belgilagan sozlamalar internetdagi harakatlaringizni himoyalaydi</translation> <translation id="1455413310270022028">Oʻchirgʻich</translation> <translation id="1458140305240870199">Ichki kiyim</translation> @@ -768,6 +769,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Tizimga kirganingizda bu qurilmaga tashqi qurilmalar taʼminoti biriktirilgan</translation> <translation id="2450021089947420533">Tarixlar</translation> +<translation id="2452837234288608067">Xatolik yuz berdi. Qayta urining.</translation> <translation id="2456755709261364512">Batareya quvvati <ph name="REQUIRED_BATTERY_PRECENT" />% dan yuqori boʻlishi kerak</translation> <translation id="2462599289530201834">Qidiruv: <ph name="KEYWORD_SHORT_NAME" /></translation> <translation id="2463739503403862330">To‘ldirish</translation> @@ -909,6 +911,7 @@ <translation id="2725927759457695883">Toʻliq nomini kiritish</translation> <translation id="2726001110728089263">Yon tarnov</translation> <translation id="2728127805433021124">Server sertifikati kuchsiz imzo algoritmi yordamida imzolangan.</translation> +<translation id="272937284275742856">Toʻlov tafsilotlari xavfsiz tekshirilmoqda...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Aloqa diagnostikasini ishga tushiring<ph name="END_LINK" /></translation> <translation id="2730600605555029057">Klassik musiqa</translation> <translation id="2731382536835015353">44 x 68 in</translation> @@ -1008,6 +1011,7 @@ <translation id="2958544468932521864">Kriket</translation> <translation id="2959113999220720579">Yuz va tana parvarishi</translation> <translation id="2962073860865348475">12 x 18 in</translation> +<translation id="2967098518029543669">uni Google hisobingizda saqlang</translation> <translation id="2968103128155246731">Mikroavtobus va minivenlar</translation> <translation id="2972581237482394796">&Qaytarish</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, hozirda tanlandi. <ph name="ROW_CONTENT" /></translation> @@ -1378,6 +1382,7 @@ <translation id="3678914302246317895"><ph name="OTP_LENGTH" /> xonali tasdiqlash kodini kiriting</translation> <translation id="3681007416295224113">Sertifikat haqida ma’lumot</translation> <translation id="3681421644246505351">Chrome oxirgi brauzer tarixi asosida qiziqish mavzularini qayd qiladi.</translation> +<translation id="3682094733650754138">Manzilni kiritish tanlandi</translation> <translation id="3689867156802445220">Bino raqami</translation> <translation id="3693327506115126094">Shaxsingizni tasdiqlash usulini tanlang</translation> <translation id="3698629142018988477">Sayt yaratish tugmasi, Google Sitesda yangi saytni tez yaratish uchun faollashtiring</translation> @@ -2055,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> kamera va mikrofoningizdan foydalanishni istaydi</translation> <translation id="5035135400558156732">Bogʻdorchilik</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Hisobga kirib, yozishda yordam olish uchun shu sahifaga qayting</translation> <translation id="5039762155821394373">Shrift hajmi</translation> <translation id="5039804452771397117">Ruxsat berish</translation> <translation id="5040262127954254034">Shaxsiy ma’lumotlar</translation> @@ -2785,6 +2789,7 @@ <translation id="6491663123807473970"><ph name="URL" /> MIDI qurilmalardan foydalanishni xohlaydi</translation> <translation id="6493924760403974580">Bu ilova faqat shu oʻlchamda ishlaydi.</translation> <translation id="6494750904506170417">qalquvchi oyna va yoʻnaltirishlar</translation> +<translation id="6495664197699704593">Bu parol faqat mazkur qurilmada saqlangan. Boshqa qurilmalarda foydalanish uchun <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">Biznes faoliyati</translation> <translation id="6499038740797743453">Parolni o‘zgartirish</translation> <translation id="6502510275417601303">Yangi toʻlov sozlamalari haqidagi ogohlantirish yopildi</translation> @@ -2899,6 +2904,7 @@ <translation id="6732087373923685049">kamera</translation> <translation id="6737708609449480586">Pishiriqlar</translation> <translation id="6738516213925468394">Maʼlumotlaringiz <ph name="TIME" /> sanasida <ph name="BEGIN_LINK" />kodli ibora<ph name="END_LINK" /> bilan shifrlangan. Sinxronizatsiyani boshlash uchun uni kiriting.</translation> +<translation id="6740851646645036700">Matn yordamchisidan foydalanish kunlik limitiga yetdi. Keyinroq qayta urining.</translation> <translation id="674375294223700098">Sertifikat serverida noma’lum xato</translation> <translation id="6744009308914054259">Aloqa o‘rnatilguncha Yuklanmalar jildini ochib oflayn maqolalar o‘qishingiz mumkin.</translation> <translation id="6745592621698551453">Hozir yangilash</translation> @@ -2955,6 +2961,7 @@ <translation id="6860888819347870819">Tasvir ustida tasvir rejimiga kirishni soʻrashi mumkin</translation> <translation id="6864189428899665393">267 x 389 mm</translation> <translation id="686485648936420384">Isteʼmolchilar uchun</translation> +<translation id="6865166112578825782">Manzilni kiriting</translation> <translation id="6865412394715372076">Hozir bu kartani tekshirib bo‘lmaydi</translation> <translation id="6868573634057275953">Yangilashni davom etish</translation> <translation id="6869334554832814367">Isteʼmol krediti</translation> @@ -3424,6 +3431,7 @@ <translation id="7701040980221191251">Hech qanday</translation> <translation id="7701544340847569275">Yangilanish xato bilan yakunlandi</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> saytiga o‘tish (xavfli)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Matn yordamchisi</translation> <translation id="7705992072972338699">Optik disk (juda yaltiroq)</translation> <translation id="770607638235926858">Muzda uchish va snoubording</translation> <translation id="7706689436519265630">Siz nusxa olgan yoki koʻchirgan fayllar tekshiruv uchun Google Cloud va boshqa tashqi xizmatlarga yuboriladi. Masalan, tarkibida maxfiy yoki zararli axborotlar mavjudligini aniqlash uchun tekshirilishi va kompaniya siyosati asosida saqlanishi mumkin.</translation> @@ -3643,6 +3651,7 @@ <translation id="8161095570253161196">Koʻrishda davom etish</translation> <translation id="8163866351304776260">Chapdan 4 ta teshik ochish</translation> <translation id="8164078261547504572">Narxlar tushganda xat olishni istaysizmi?</translation> +<translation id="8169175551046720804">"<ph name="DATA_CONTROLS_KEYS" />" kalitlari bir xil lugʻatda sozlanmaydi</translation> <translation id="8175796834047840627">Hisobingizga kirganingiz uchun Chrome kartalarni Google hisobingizga saqlashni taklif qilmoqda. Buni sozlamalar orqali oʻzgartirish mumkin.</translation> <translation id="8176440868214972690">Bu qurilma administratori quyidagi saytlarga sozlamalar va qoidalar kabi ayrim axborotlarni yubordi.</translation> <translation id="817820454357658398">Ayollar gigiyena mahsulotlari</translation> @@ -4038,6 +4047,7 @@ <translation id="8949410982325929394">Tovush</translation> <translation id="8949493680961858543">A1x4</translation> <translation id="8951415078585015151">Qonun va hukumat</translation> +<translation id="8952569554322479410">Sayt <ph name="REQUEST_TYPE" /> bilan ishlashga ruxsat olmoqchi. 1 daqiqalik soʻrovnoma orqali saytlar ruxsat olishini yaxshilashimizga yordam bering.</translation> <translation id="8954252855949068147">Kiyim-kechak</translation> <translation id="8956124158020778855">Sozlamani yoqib, yozishni boshlash uchun shu sahifaga qayting.</translation> <translation id="8957210676456822347">Tegishli portalga kirish</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 3f85b61..38f5901 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -2060,7 +2060,6 @@ <translation id="503498442187459473"><ph name="HOST" /> muốn sử dụng máy ảnh và micrô của bạn</translation> <translation id="5035135400558156732">Làm vườn</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">Đăng nhập lại rồi quay lại thẻ này để được trợ giúp khi viết</translation> <translation id="5039762155821394373">Cỡ chữ</translation> <translation id="5039804452771397117">Cho phép</translation> <translation id="5040262127954254034">Quyền riêng tư</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 95cca71..d05da98 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1251,7 +1251,7 @@ <translation id="3441653493275994384">屏幕</translation> <translation id="3443504041532578451">光盘(磨光)</translation> <translation id="344449859752187052">已阻止第三方 Cookie</translation> -<translation id="3447644283769633681">拦截所有第三方 Cookie</translation> +<translation id="3447644283769633681">阻止所有第三方 Cookie</translation> <translation id="3447661539832366887">此设备的所有者已关闭恐龙游戏。</translation> <translation id="3447884698081792621">显示证书(由<ph name="ISSUER" />签发)</translation> <translation id="3450323514459570273">可以请求控制您的 MIDI 设备以及为其重新编程</translation> @@ -2056,7 +2056,6 @@ <translation id="503498442187459473"><ph name="HOST" /> 想使用您的摄像头和麦克风</translation> <translation id="5035135400558156732">园艺</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">请重新登录,然后返回此标签页以获取写作帮助</translation> <translation id="5039762155821394373">字号</translation> <translation id="5039804452771397117">允许</translation> <translation id="5040262127954254034">隐私权</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 9fc657b..247dcf11 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -2059,7 +2059,6 @@ <translation id="503498442187459473"><ph name="HOST" /> 要求使用相機和麥克風</translation> <translation id="5035135400558156732">園藝</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">請重新登入並返回此分頁,才能取得撰寫協助</translation> <translation id="5039762155821394373">字型大小</translation> <translation id="5039804452771397117">允許</translation> <translation id="5040262127954254034">私隱權</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 845021a8..664dac7 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -2058,7 +2058,6 @@ <translation id="503498442187459473"><ph name="HOST" /> 要求使用攝影機和麥克風</translation> <translation id="5035135400558156732">園藝</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5036337510084622581">請重新登入並返回這個分頁,才能取得撰寫協助</translation> <translation id="5039762155821394373">字型大小</translation> <translation id="5039804452771397117">允許</translation> <translation id="5040262127954254034">隱私權</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 2468f66..e7faa46b 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -258,6 +258,7 @@ <translation id="1442987760062738829">Ukushaya</translation> <translation id="1446396933673057385">Ukuhlola ukunemba</translation> <translation id="1447067628680007684">(x86_64)</translation> +<translation id="1448166547804028941">Okhiye abalandelayo "<ph name="DATA_CONTROLS_FIRST_KEY_SET" />" abanakusethwa kusichazamazwi esisodwa nokhiye abalandelayo "<ph name="DATA_CONTROLS_SECOND_KEY_SET" />"</translation> <translation id="1452803302401719440">Amasethingi akhethwe umzali wakho manje zikugcina uphephile ku-inthanethi</translation> <translation id="1455413310270022028">Isisuli</translation> <translation id="1458140305240870199">Okokwembatha ngaphansi</translation> @@ -769,6 +770,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Izinsiza zinamathiselwa kule divayisi ngenkathi ungene ngemvume</translation> <translation id="2450021089947420533">Amahambo</translation> +<translation id="2452837234288608067">Asikwazanga ukusiza kulokho. Zama futhi.</translation> <translation id="2456755709261364512">Ibhethri lakho kumele lishajwe ngaphezu kuka-<ph name="REQUIRED_BATTERY_PRECENT" />%</translation> <translation id="2462599289530201834">Sesha i-<ph name="KEYWORD_SHORT_NAME" /></translation> <translation id="2463739503403862330">Gcwalisa</translation> @@ -910,6 +912,7 @@ <translation id="2725927759457695883">Gcwalisa igama eliphelele</translation> <translation id="2726001110728089263">Ithileyi Lasohlangothini</translation> <translation id="2728127805433021124">Isitifiketi seseva sisayinwe kusetshenziswa i-algorithm yesiginesha ebuthaka.</translation> +<translation id="272937284275742856">Sisaqinisekisa ngokuphephile imininingwane yakho yenkokhelo...</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Iqalisa ukuxilongwa kokuxhumeka<ph name="END_LINK" /></translation> <translation id="2730600605555029057">Umculo we-classical</translation> <translation id="2731382536835015353">U-44 x 68 phakathi</translation> @@ -1009,6 +1012,7 @@ <translation id="2958544468932521864">I-Cricket</translation> <translation id="2959113999220720579">Ukunakekelwa kobuso nomzimba</translation> <translation id="2962073860865348475">U-12 x 18 phakathi</translation> +<translation id="2967098518029543669">yilondoloze ku-Google Account yakho</translation> <translation id="2968103128155246731">Amaveni namaveni amancane</translation> <translation id="2972581237482394796">&Yenza futhi</translation> <translation id="2977665033722899841">I-<ph name="ROW_NAME" />, manje ikhethiwe. <ph name="ROW_CONTENT" /></translation> @@ -1380,6 +1384,7 @@ <translation id="3678914302246317895">Faka ikhodi yokuqinisekisa yamadijithi angu-<ph name="OTP_LENGTH" /></translation> <translation id="3681007416295224113">Ulwazi lesitifiketi</translation> <translation id="3681421644246505351">I-Chrome yazisa izihloko onentshisekelo kuzo ngokusekelwe kumlando wakho wakamuva wokubhrawuza.</translation> +<translation id="3682094733650754138">Usebenzise inketho ethi gcwalisa ikheli</translation> <translation id="3689867156802445220">Inombolo yesakhiwo</translation> <translation id="3693327506115126094">Khetha, ukuthi uzoqinisekisa kanjani ukuthi uguwena</translation> <translation id="3698629142018988477">Sungula inkinobho yesayithi, yenza kusebenze ukuze usungule isayithi entsha ku-Google Sites ngokushesha</translation> @@ -2057,7 +2062,6 @@ <translation id="503498442187459473">I-<ph name="HOST" /> ifuna ukusebenzisa ikhamera yakho nemakrofoni</translation> <translation id="5035135400558156732">Ukwenza ingadi</translation> <translation id="503574301575803523">I-SRA3</translation> -<translation id="5036337510084622581">Ngena ngemvume futhi, bese ubuyela kule thebhu ukuze uthole usizo lokubhala</translation> <translation id="5039762155821394373">Usayizi wefonti</translation> <translation id="5039804452771397117">Vumela</translation> <translation id="5040262127954254034">Ubumfihlo</translation> @@ -2788,6 +2792,7 @@ <translation id="6491663123807473970"><ph name="URL" /> ifuna ukusebenzisa amadivayisi akho e-MIDI</translation> <translation id="6493924760403974580">Le app isekela kuphela lo sayizi.</translation> <translation id="6494750904506170417">okwesikhashana nokuqondiswa kabusha</translation> +<translation id="6495664197699704593">Le phasiwedi ilondolozwe kule divayisi kuphela. Ukuze uyisebenzise nakwamanye amadivayisi akho, <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="6497295192259406877">Imisebenzi yebhizinisi</translation> <translation id="6499038740797743453">Setha kabusha iphasiwedi?</translation> <translation id="6502510275417601303">Isexwayiso esimayelana nesethingi yenkokhelo sivaliwe</translation> @@ -2902,6 +2907,7 @@ <translation id="6732087373923685049">ikhamera</translation> <translation id="6737708609449480586">Ukudla Okubhakiwe</translation> <translation id="6738516213925468394">Idatha yakho ibethelwe <ph name="BEGIN_LINK" />ngomshwana wakho wokuvumelanisa<ph name="END_LINK" /> ngo-<ph name="TIME" />. Ifake ukuze uqale ukuvumelanisa.</translation> +<translation id="6740851646645036700">Usufinyelele umkhawulo wakho wosizo lokubhala okwamanje. Zama futhi emuva kwesikhathi.</translation> <translation id="674375294223700098">Iphutha leseva yesitifiketi elingaziwa.</translation> <translation id="6744009308914054259">Ngenkathi ulindele ukuxhumeka, ungavakashela kokulandiwe ukuze ufunde ama-athikili angaxhunyiwe kwi-inthanethi.</translation> <translation id="6745592621698551453">Buyekeza manje</translation> @@ -2958,6 +2964,7 @@ <translation id="6860888819347870819">Ingacela ukufaka isithombe-esithombeni</translation> <translation id="6864189428899665393">U-267 x 389 mm</translation> <translation id="686485648936420384">Izinsiza sekhasimende</translation> +<translation id="6865166112578825782">Gcwalisa ikheli</translation> <translation id="6865412394715372076">Leli khadi alikwazi ukuqinisekiswa khona manje</translation> <translation id="6868573634057275953">Qhubeka ngesibuyekezo</translation> <translation id="6869334554832814367">Izimalimboleko zomuntu siqu</translation> @@ -3427,6 +3434,7 @@ <translation id="7701040980221191251">Lutho</translation> <translation id="7701544340847569275">Ukubuyekeza kuqedwe ngamaphutha</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Qhubekala ku-<ph name="SITE" /> (akuphephile)<ph name="END_LINK" /></translation> +<translation id="7705085181312584869">Ngisize Ngibhale</translation> <translation id="7705992072972338699">Idiski Ebonakalayo (i-Gloss-Ephezulu)</translation> <translation id="770607638235926858">I-Skiing ne-Snowboarding</translation> <translation id="7706689436519265630">Amafayela owakopishayo noma owahambisayo athunyelwa ku-Google Cloud noma inkampani engahlangene ngqo ukuze uhlaziye. Ngokwesibonelo, zingase askenwe idatha ebucayi noma uhlelo olungayilungele ikhompyutha futhi angase agcinwe ngokusekelwe kuzinqubomgomo zenkampani.</translation> @@ -3646,6 +3654,7 @@ <translation id="8161095570253161196">Qhubeka nokubhrawuza</translation> <translation id="8163866351304776260">Ukushaya okune kwesokunxele</translation> <translation id="8164078261547504572">Ufuna ama-imeyili uma izintengo zehla?</translation> +<translation id="8169175551046720804">Okhiye "<ph name="DATA_CONTROLS_KEYS" />" abanakusethwa kusichazamazwi esisodwa</translation> <translation id="8175796834047840627">I-Chrome inikezela ngokulondoloza amakhadi akho ku-akhawunti yakho ye-Google ngoba ungene ngemvume. Ungashintsha lokhu kuziphatha kuzilungiselelo.</translation> <translation id="8176440868214972690">Umlawuli wale divayisi uthumele ulwazi kumawebhusayithi alandelayo, njengamasethingi noma izinqumbomgomo.</translation> <translation id="817820454357658398">Imikhiqizo Yenhlanzeko Yabesifazane</translation> @@ -4041,6 +4050,7 @@ <translation id="8949410982325929394">Ithoni</translation> <translation id="8949493680961858543">I-A1x4</translation> <translation id="8951415078585015151">Umthetho nohulumeni</translation> +<translation id="8952569554322479410">Iwubhusayithi isanda kucela ukufinyelela ku-<ph name="REQUEST_TYPE" /> yakho. Sisize sithuthukise indlela amawebhusayithi acela ngayo ukufinyelela izinto ngokwenza le nhlolovo yomzuzu ongu-1.</translation> <translation id="8954252855949068147">Okokwembatha</translation> <translation id="8956124158020778855">Ngemva kokuvula leli sethingi, buyela kule thebhu ukuze uqale ukubhala.</translation> <translation id="8957210676456822347">I-Captive Portal Authorization</translation>
diff --git a/components/supervised_user/core/browser/BUILD.gn b/components/supervised_user/core/browser/BUILD.gn index 0a05db6..5b3b797 100644 --- a/components/supervised_user/core/browser/BUILD.gn +++ b/components/supervised_user/core/browser/BUILD.gn
@@ -196,6 +196,7 @@ "//components/content_settings/core/browser:test_support", "//components/prefs:test_support", "//components/resources:components_resources", + "//components/safe_search_api:test_support", "//components/signin/public/base", "//components/signin/public/base:test_support", "//components/signin/public/identity_manager",
diff --git a/components/supervised_user/core/browser/supervised_user_service.cc b/components/supervised_user/core/browser/supervised_user_service.cc index 1e14f95..48e58ba7 100644 --- a/components/supervised_user/core/browser/supervised_user_service.cc +++ b/components/supervised_user/core/browser/supervised_user_service.cc
@@ -20,6 +20,7 @@ #include "build/build_config.h" #include "components/prefs/pref_service.h" #include "components/signin/public/identity_manager/identity_manager.h" +#include "components/supervised_user/core/browser/kids_chrome_management_url_checker_client.h" #include "components/supervised_user/core/browser/supervised_user_preferences.h" #include "components/supervised_user/core/browser/supervised_user_service_observer.h" #include "components/supervised_user/core/browser/supervised_user_settings_service.h" @@ -154,9 +155,14 @@ platform_delegate_(std::move(platform_delegate)), can_show_first_time_interstitial_banner_( can_show_first_time_interstitial_banner) { + CHECK(url_filter_delegate); + std::string country = url_filter_delegate->GetCountryCode(); + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client = + std::make_unique<KidsChromeManagementURLCheckerClient>( + identity_manager, url_loader_factory, country); url_filter_ = std::make_unique<SupervisedUserURLFilter>( - user_prefs, std::move(check_webstore_url_callback), - std::move(url_filter_delegate)); + user_prefs, std::move(url_checker_client), + std::move(check_webstore_url_callback)); url_filter_->AddObserver(this); } @@ -279,7 +285,6 @@ supervised_user::FilteringBehavior behavior = SupervisedUserURLFilter::BehaviorFromInt(behavior_value); url_filter_->SetDefaultFilteringBehavior(behavior); - UpdateAsyncUrlChecker(); for (SupervisedUserServiceObserver& observer : observer_list_) { observer.OnURLFilterChanged(); @@ -294,8 +299,6 @@ } void SupervisedUserService::OnSafeSitesSettingChanged() { - UpdateAsyncUrlChecker(); - WebFilterType filter_type = url_filter_->GetWebFilterType(); if (!AreWebFilterPrefsDefault(*user_prefs_) && current_web_filter_type_ != filter_type) { @@ -304,25 +307,6 @@ } } -void SupervisedUserService::UpdateAsyncUrlChecker() { - int behavior_value = - user_prefs_->GetInteger(prefs::kDefaultSupervisedUserFilteringBehavior); - supervised_user::FilteringBehavior behavior = - SupervisedUserURLFilter::BehaviorFromInt(behavior_value); - - bool use_online_check = - IsSafeSitesEnabled(user_prefs_.get()) || - behavior == supervised_user::FilteringBehavior::kBlock; - - if (use_online_check != url_filter_->HasAsyncURLChecker()) { - if (use_online_check) { - url_filter_->InitAsyncURLChecker(identity_manager_, url_loader_factory_); - } else { - url_filter_->ClearAsyncURLChecker(); - } - } -} - void SupervisedUserService::UpdateManualHosts() { const base::Value::Dict& dict = user_prefs_->GetDict(prefs::kSupervisedUserManualHosts);
diff --git a/components/supervised_user/core/browser/supervised_user_service.h b/components/supervised_user/core/browser/supervised_user_service.h index 1ccf8d3..dd90121 100644 --- a/components/supervised_user/core/browser/supervised_user_service.h +++ b/components/supervised_user/core/browser/supervised_user_service.h
@@ -186,8 +186,6 @@ void OnSafeSitesSettingChanged(); - void UpdateAsyncUrlChecker(); - // Updates the manual overrides for hosts in the URL filters when the // corresponding preference is changed. void UpdateManualHosts();
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.cc b/components/supervised_user/core/browser/supervised_user_url_filter.cc index 6f87572..3f74fa5c 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter.cc +++ b/components/supervised_user/core/browser/supervised_user_url_filter.cc
@@ -233,11 +233,12 @@ SupervisedUserURLFilter::SupervisedUserURLFilter( PrefService& user_prefs, - ValidateURLSupportCallback check_webstore_url_callback, - std::unique_ptr<Delegate> service_delegate) + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client, + ValidateURLSupportCallback check_webstore_url_callback) : default_behavior_(FilteringBehavior::kAllow), user_prefs_(user_prefs), - service_delegate_(std::move(service_delegate)), + async_url_checker_(std::make_unique<safe_search_api::URLChecker>( + std::move(url_checker_client))), check_webstore_url_callback_(std::move(check_webstore_url_callback)) {} SupervisedUserURLFilter::~SupervisedUserURLFilter() { @@ -607,7 +608,7 @@ // Any non-default reason trumps the async checker. // Also, if we're blocking anyway, then there's no need to check it. if (reason != supervised_user::FilteringBehaviorReason::DEFAULT || - behavior == FilteringBehavior::kBlock || !async_url_checker_) { + behavior == FilteringBehavior::kBlock) { std::move(callback).Run(behavior, reason, false); for (Observer& observer : observers_) { observer.OnURLChecked(url, behavior, reason, false); @@ -616,7 +617,7 @@ } } - // Runs mature url filter if the |async_url_checker_| exists. + // Runs mature url filter. return RunAsyncChecker(url, std::move(callback)); } @@ -649,7 +650,7 @@ return true; } - // Runs mature url filter if the |async_url_checker_| exists. + // Runs mature url filter. return RunAsyncChecker(url, std::move(callback)); } @@ -685,33 +686,11 @@ url_map_ = std::move(url_map); } -void SupervisedUserURLFilter::InitAsyncURLChecker( - signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) { - DCHECK(service_delegate_); - std::string country = service_delegate_->GetCountryCode(); - - std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client = - std::make_unique<KidsChromeManagementURLCheckerClient>( - identity_manager, url_loader_factory, country); - async_url_checker_ = std::make_unique<safe_search_api::URLChecker>( - std::move(url_checker_client)); -} - -void SupervisedUserURLFilter::ClearAsyncURLChecker() { - async_url_checker_.reset(); -} - -bool SupervisedUserURLFilter::HasAsyncURLChecker() const { - return async_url_checker_.get() != nullptr; -} - void SupervisedUserURLFilter::Clear() { default_behavior_ = FilteringBehavior::kAllow; url_map_.clear(); allowed_host_list_.clear(); blocked_host_list_.clear(); - async_url_checker_.reset(); is_filter_initialized_ = false; } @@ -799,9 +778,8 @@ bool SupervisedUserURLFilter::RunAsyncChecker( const GURL& url, FilteringBehaviorCallback callback) const { - // The parental setting may allow all sites to be visited. In such case, the - // |async_url_checker_| will not be created. - if (!async_url_checker_) { + // The parental setting may allow all sites to be visited. + if (GetWebFilterType() == WebFilterType::kAllowAllSites) { std::move(callback).Run(FilteringBehavior::kAllow, supervised_user::FilteringBehaviorReason::DEFAULT, false); @@ -814,6 +792,12 @@ base::Unretained(this), std::move(callback))); } +void SupervisedUserURLFilter::SetURLCheckerClientForTesting( + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client) { + async_url_checker_.reset( + new safe_search_api::URLChecker(std::move(url_checker_client))); +} + void SupervisedUserURLFilter::CheckCallback( FilteringBehaviorCallback callback, const GURL& url,
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.h b/components/supervised_user/core/browser/supervised_user_url_filter.h index 5d4d046a..d47ef21 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter.h +++ b/components/supervised_user/core/browser/supervised_user_url_filter.h
@@ -111,8 +111,8 @@ SupervisedUserURLFilter( PrefService& user_prefs, - ValidateURLSupportCallback check_webstore_url_callback, - std::unique_ptr<Delegate> delegate); + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client, + ValidateURLSupportCallback check_webstore_url_callback); virtual ~SupervisedUserURLFilter(); @@ -192,17 +192,6 @@ // Sets the set of manually allowed or blocked URLs. void SetManualURLs(std::map<GURL, bool> url_map); - // Initializes the experimental asynchronous checker. - void InitAsyncURLChecker( - signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); - - // Clears any asynchronous checker. - void ClearAsyncURLChecker(); - - // Returns whether the asynchronous checker is set up. - bool HasAsyncURLChecker() const; - // Removes all filter entries, clears the async checker if present, and resets // the default behavior to "allow". void Clear(); @@ -228,6 +217,10 @@ // Set value for `is_filter_initialized_`. void SetFilterInitialized(bool is_filter_initialized); + // Sets safe_search_api::URLCheckerClient for SafeSites classification. + void SetURLCheckerClientForTesting( + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client); + private: friend class SupervisedUserURLFilterTest; friend class SupervisedUserURLFilteringWithConflictsTest;
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc b/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc index 9981755..632874d 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc +++ b/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc
@@ -15,9 +15,9 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "components/prefs/testing_pref_service.h" +#include "components/safe_search_api/fake_url_checker_client.h" #include "components/supervised_user/core/browser/supervised_user_preferences.h" #include "components/supervised_user/core/common/supervised_user_utils.h" -#include "components/supervised_user/test_support/supervised_user_url_filter_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -76,8 +76,8 @@ TestingPrefServiceSimple pref_service_; SupervisedUserURLFilter filter_ = SupervisedUserURLFilter( pref_service_, - base::BindRepeating([](const GURL& url) { return false; }), - std::make_unique<FakeURLFilterDelegate>()); + std::make_unique<safe_search_api::FakeURLCheckerClient>(), + base::BindRepeating([](const GURL& url) { return false; })); supervised_user::FilteringBehavior behavior_; supervised_user::FilteringBehaviorReason reason_; @@ -460,8 +460,6 @@ filter_.SetDefaultFilteringBehavior(FilteringBehavior::kAllow); - ExpectURLInDefaultAllowlist("https://m.youtube.com/feed/trending"); - ExpectURLInDefaultAllowlist("https://com.google"); ExpectURLInManualAllowlist("https://youtube.com/feed/trending"); ExpectURLInManualAllowlist("https://google.com/humans.txt"); ExpectURLInManualDenylist("https://youtube.com/robots.txt"); @@ -537,8 +535,8 @@ TestingPrefServiceSimple pref_service_; SupervisedUserURLFilter filter_ = SupervisedUserURLFilter( pref_service_, - base::BindRepeating([](const GURL& url) { return false; }), - std::make_unique<FakeURLFilterDelegate>()); + std::make_unique<safe_search_api::FakeURLCheckerClient>(), + base::BindRepeating([](const GURL& url) { return false; })); }; // Tests that the new histogram that records www-subdomain conflicts
diff --git a/components/sync/base/features.cc b/components/sync/base/features.cc index bf762569..dc9d20f 100644 --- a/components/sync/base/features.cc +++ b/components/sync/base/features.cc
@@ -22,15 +22,6 @@ base::FEATURE_DISABLED_BY_DEFAULT); #endif -BASE_FEATURE(kPasswordNotesWithBackup, - "PasswordNotesWithBackup", -#if BUILDFLAG(IS_ANDROID) - base::FEATURE_DISABLED_BY_DEFAULT -#else - base::FEATURE_ENABLED_BY_DEFAULT -#endif -); - BASE_FEATURE(kSharingOfferKeyPairBootstrap, "SharingOfferKeyPairBootstrap", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/sync/base/features.h b/components/sync/base/features.h index 969957d..93c0096 100644 --- a/components/sync/base/features.h +++ b/components/sync/base/features.h
@@ -35,20 +35,6 @@ BASE_DECLARE_FEATURE(kPassExplicitSyncPassphraseToGmsCore); #endif -// Enables adding, displaying and modifying extra notes to stored credentials. -// When enabled, "PasswordViewPageInSettings" feature in the password manager -// codebase is ignored and the new password view subpage is force enabled. When -// enabled, Sync machinery will read and writes password notes to the -// `encrypted_notes_backup` field inside the PasswordSpecifics proto. Together -// with the logic on the server. this protects against notes being overwritten -// by legacy clients not supporting password notes. -// This feature is added here instead of the password manager codebase to avoid -// cycle dependencies. -// This feature is used in Credential Provider Extension on iOS. Keep the -// default value in sync with the default value in -// ios/chrome/credential_provider_extension/ui/feature_flags.mm. -BASE_DECLARE_FEATURE(kPasswordNotesWithBackup); - // Controls whether to enable bootstrapping Public-private keys in Nigori // key-bag. BASE_DECLARE_FEATURE(kSharingOfferKeyPairBootstrap);
diff --git a/components/sync/engine/model_type_worker.cc b/components/sync/engine/model_type_worker.cc index 8404c49..a193ffd82 100644 --- a/components/sync/engine/model_type_worker.cc +++ b/components/sync/engine/model_type_worker.cc
@@ -239,9 +239,6 @@ LogPasswordNotesState(PasswordNotesStateForUMA::kUnset); return true; } - if (!base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - return true; - } // It is guaranteed that if `encrypted()` is decryptable, then // `encrypted_notes_backup()` must be decryptable too. Failure to decrypt // `encrypted_notes_backup()` indicates a data corruption. @@ -1385,19 +1382,19 @@ password_data, encrypted_password.mutable_password()->mutable_encrypted()); LogEncryptionResult(type_, result); - if (base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)) { - // `encrypted_notes_backup` field needs to be populated regardless of - // whether or not there are any notes. - result = cryptographer_->Encrypt(password_data.notes(), - encrypted_password.mutable_password() - ->mutable_encrypted_notes_backup()); - DCHECK(result); - // When encrypting both blobs succeeds, both encrypted blobs must use the - // key name. - DCHECK_EQ( - encrypted_password.password().encrypted().key_name(), - encrypted_password.password().encrypted_notes_backup().key_name()); - } + + // `encrypted_notes_backup` field needs to be populated regardless of + // whether or not there are any notes. + result = cryptographer_->Encrypt(password_data.notes(), + encrypted_password.mutable_password() + ->mutable_encrypted_notes_backup()); + CHECK(result); + + // When encrypting both blobs succeeds, both encrypted blobs must use the + // key name. + CHECK_EQ(encrypted_password.password().encrypted().key_name(), + encrypted_password.password().encrypted_notes_backup().key_name()); + // Replace the entire specifics, among other things to ensure that any // client-only fields are cleared. entity_data->specifics = std::move(encrypted_password);
diff --git a/components/sync/engine/model_type_worker_unittest.cc b/components/sync/engine/model_type_worker_unittest.cc index 354da8c8..f227af99 100644 --- a/components/sync/engine/model_type_worker_unittest.cc +++ b/components/sync/engine/model_type_worker_unittest.cc
@@ -2662,19 +2662,7 @@ EXPECT_FALSE(worker()->HasLocalChanges()); } -class ModelTypeWorkerPasswordsTestWithNotes - : public ModelTypeWorkerPasswordsTest { - public: - ModelTypeWorkerPasswordsTestWithNotes() { - feature_list_.InitAndEnableFeature(syncer::kPasswordNotesWithBackup); - } - ~ModelTypeWorkerPasswordsTestWithNotes() override = default; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -TEST_F(ModelTypeWorkerPasswordsTestWithNotes, +TEST_F(ModelTypeWorkerPasswordsTest, ShouldIgnoreTheEncryptedNotesBackupWhenNotesInPasswordSpecificsData) { base::HistogramTester histogram_tester; const std::string kPasswordInSpecificsNote = "Note Value"; @@ -2723,7 +2711,7 @@ syncer::PasswordNotesStateForUMA::kSetInSpecificsData, 1); } -TEST_F(ModelTypeWorkerPasswordsTestWithNotes, +TEST_F(ModelTypeWorkerPasswordsTest, ShouldUseTheEncryptedNotesBackupWhenMissingInPasswordSpecificsData) { base::HistogramTester histogram_tester; const std::string kPasswordNoteBackup = "Note Backup"; @@ -2768,8 +2756,7 @@ syncer::PasswordNotesStateForUMA::kSetOnlyInBackup, 1); } -TEST_F(ModelTypeWorkerPasswordsTestWithNotes, - ShouldEmitUnsetWhenNoNotesInUpdate) { +TEST_F(ModelTypeWorkerPasswordsTest, ShouldEmitUnsetWhenNoNotesInUpdate) { base::HistogramTester histogram_tester; NormalInitialize(); @@ -2796,7 +2783,7 @@ 1); } -TEST_F(ModelTypeWorkerPasswordsTestWithNotes, ShouldEmitNotesBackupCorrupted) { +TEST_F(ModelTypeWorkerPasswordsTest, ShouldEmitNotesBackupCorrupted) { base::HistogramTester histogram_tester; const std::string kPasswordNoteBackup = "Note Backup"; NormalInitialize(); @@ -2837,8 +2824,7 @@ syncer::PasswordNotesStateForUMA::kSetOnlyInBackupButCorrupted, 1); } -TEST_F(ModelTypeWorkerPasswordsTestWithNotes, - ShouldPopulatePasswordNotesBackup) { +TEST_F(ModelTypeWorkerPasswordsTest, ShouldPopulatePasswordNotesBackup) { const std::string kPasswordInSpecificsNote = "Note Value"; NormalInitialize(); @@ -2871,7 +2857,7 @@ EXPECT_EQ(kPasswordInSpecificsNote, decrypted_notes.note(0).value()); } -TEST_F(ModelTypeWorkerPasswordsTestWithNotes, +TEST_F(ModelTypeWorkerPasswordsTest, ShouldPopulatePasswordNotesBackupWhenNoLocalNotes) { NormalInitialize();
diff --git a/components/sync/model/client_tag_based_model_type_processor.cc b/components/sync/model/client_tag_based_model_type_processor.cc index a1de6a6..25dc0969f 100644 --- a/components/sync/model/client_tag_based_model_type_processor.cc +++ b/components/sync/model/client_tag_based_model_type_processor.cc
@@ -18,7 +18,6 @@ #include "base/trace_event/memory_usage_estimator.h" #include "base/trace_event/trace_event.h" #include "components/sync/base/data_type_histogram.h" -#include "components/sync/base/features.h" #include "components/sync/base/model_type.h" #include "components/sync/base/time.h" #include "components/sync/engine/commit_queue.h" @@ -162,14 +161,14 @@ model_type_state.set_authenticated_account_id( activation_request_.authenticated_account_id.ToString()); // For passwords, the bridge re-downloads all passwords to obtain any - // potential notes on the sync server but have ignored by earlier version of - // the browser that didn't support notes. This should be done first when the - // browser is upgraded to a version that support passwords notes. Store in - // the model type store that the this redownload has happened already to - // ensure it happens only once. + // potential notes from the sync server that were ignored by earlier + // versions of the browser that didn't support notes. This should be done + // first when the browser is upgraded to a version that support passwords + // notes. Store in the model type store that this redownload has happened + // already to ensure it happens only once. if (type_ == PASSWORDS) { model_type_state.set_notes_enabled_before_initial_sync_for_passwords( - base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup)); + true); } if (CommitOnlyTypes().Has(type_)) {
diff --git a/components/sync/model/client_tag_based_model_type_processor_unittest.cc b/components/sync/model/client_tag_based_model_type_processor_unittest.cc index a4448488..9e949c28 100644 --- a/components/sync/model/client_tag_based_model_type_processor_unittest.cc +++ b/components/sync/model/client_tag_based_model_type_processor_unittest.cc
@@ -15,11 +15,9 @@ #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/threading/platform_thread.h" #include "components/sync/base/client_tag_hash.h" -#include "components/sync/base/features.h" #include "components/sync/base/model_type.h" #include "components/sync/base/sync_mode.h" #include "components/sync/engine/commit_and_get_updates_types.h" @@ -3322,36 +3320,24 @@ "Sync.ClearMetadataWhileStopped.DelayedClear", 0); } -// The param indicates whether the password notes feature is enabled. class PasswordsClientTagBasedModelTypeProcessorTest - : public testing::WithParamInterface<bool>, - public ClientTagBasedModelTypeProcessorTest { + : public ClientTagBasedModelTypeProcessorTest { public: PasswordsClientTagBasedModelTypeProcessorTest() { - feature_list_.InitWithFeatureState(syncer::kPasswordNotesWithBackup, - GetParam()); } protected: ModelType GetModelType() override { return PASSWORDS; } - - private: - base::test::ScopedFeatureList feature_list_; }; -TEST_P(PasswordsClientTagBasedModelTypeProcessorTest, +TEST_F(PasswordsClientTagBasedModelTypeProcessorTest, ShouldSetPasswordsRedownloadedForNotesFlag) { ModelReadyToSync(); OnSyncStarting(); worker()->UpdateFromServer(UpdateResponseDataList()); - EXPECT_EQ(base::FeatureList::IsEnabled(syncer::kPasswordNotesWithBackup), - db()->model_type_state() - .notes_enabled_before_initial_sync_for_passwords()); + EXPECT_TRUE(db()->model_type_state() + .notes_enabled_before_initial_sync_for_passwords()); } -INSTANTIATE_TEST_SUITE_P(All, - PasswordsClientTagBasedModelTypeProcessorTest, - testing::Bool()); - } // namespace syncer
diff --git a/components/test/data/autofill/merge/output/addressLinesMoreInfo.out b/components/test/data/autofill/merge/output/addressLinesMoreInfo.out index 4a178d9..94e3a08 100644 --- a/components/test/data/autofill/merge/output/addressLinesMoreInfo.out +++ b/components/test/data/autofill/merge/output/addressLinesMoreInfo.out
@@ -5,8 +5,7 @@ NAME_FULL: John Kilgore Doe EMAIL_ADDRESS: john.doe@example.com COMPANY_NAME: TestCo -ADDRESS_HOME_STREET_ADDRESS: 1600 Amphitheatre Parkway -(Bldg. 1950) +ADDRESS_HOME_STREET_ADDRESS: 1600 Amphitheatre Parkway (Bldg. 1950) ADDRESS_HOME_CITY: Mountain View ADDRESS_HOME_STATE: CA ADDRESS_HOME_ZIP: 94043
diff --git a/components/test/data/autofill/merge/output/case.out b/components/test/data/autofill/merge/output/case.out index a99e1d9c..5547143 100644 --- a/components/test/data/autofill/merge/output/case.out +++ b/components/test/data/autofill/merge/output/case.out
@@ -5,8 +5,8 @@ NAME_FULL: john kilgore doe EMAIL_ADDRESS: john.doe@example.com COMPANY_NAME: testCo -ADDRESS_HOME_STREET_ADDRESS: 1600 amphitheatre parkway -(bldg. 1950) +ADDRESS_HOME_STREET_ADDRESS: 1600 Amphitheatre Parkway +(Bldg. 1950) ADDRESS_HOME_CITY: mountain view ADDRESS_HOME_STATE: ca ADDRESS_HOME_ZIP: 94043
diff --git a/components/test/data/web_database/unit_tests_bundle_data.filelist b/components/test/data/web_database/unit_tests_bundle_data.filelist index 2075d607..95cbc5a 100644 --- a/components/test/data/web_database/unit_tests_bundle_data.filelist +++ b/components/test/data/web_database/unit_tests_bundle_data.filelist
@@ -27,6 +27,7 @@ //components/test/data/web_database/version_120.sql //components/test/data/web_database/version_121.sql //components/test/data/web_database/version_122.sql +//components/test/data/web_database/version_123.sql //components/test/data/web_database/version_82.sql //components/test/data/web_database/version_83.sql //components/test/data/web_database/version_84.sql
diff --git a/components/test/data/web_database/version_123.sql b/components/test/data/web_database/version_123.sql new file mode 100644 index 0000000..5805fd4 --- /dev/null +++ b/components/test/data/web_database/version_123.sql
@@ -0,0 +1,41 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','123'); +INSERT INTO meta VALUES('last_compatible_version','123'); +INSERT INTO meta VALUES('Builtin Keyword Version','145'); +INSERT INTO meta VALUES('Starter Pack Keyword Version','5'); +CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,encrypted_token BLOB); +CREATE TABLE autofill (name VARCHAR, value VARCHAR, value_lower VARCHAR, date_created INTEGER DEFAULT 0, date_last_used INTEGER DEFAULT 0, count INTEGER DEFAULT 1, PRIMARY KEY (name, value)); +CREATE TABLE credit_cards (guid VARCHAR PRIMARY KEY, name_on_card VARCHAR, expiration_month INTEGER, expiration_year INTEGER, card_number_encrypted BLOB, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR, nickname VARCHAR); +CREATE TABLE local_ibans (guid VARCHAR PRIMARY KEY, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, value_encrypted VARCHAR, nickname VARCHAR); +CREATE TABLE masked_credit_cards (id VARCHAR, name_on_card VARCHAR, network VARCHAR, last_four VARCHAR, exp_month INTEGER DEFAULT 0, exp_year INTEGER DEFAULT 0, bank_name VARCHAR, nickname VARCHAR, card_issuer INTEGER DEFAULT 0, instrument_id INTEGER DEFAULT 0, virtual_card_enrollment_state INTEGER DEFAULT 0, card_art_url VARCHAR, product_description VARCHAR, card_issuer_id VARCHAR, virtual_card_enrollment_type INTEGER DEFAULT 0, product_terms_url VARCHAR); +CREATE TABLE unmasked_credit_cards (id VARCHAR, card_number_encrypted VARCHAR, unmask_date INTEGER NOT NULL DEFAULT 0); +CREATE TABLE server_card_metadata (id VARCHAR NOT NULL, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, billing_address_id VARCHAR); +CREATE TABLE autofill_sync_metadata (model_type INTEGER NOT NULL, storage_key VARCHAR NOT NULL, value BLOB, PRIMARY KEY (model_type, storage_key)); +CREATE TABLE autofill_model_type_state (model_type INTEGER NOT NULL PRIMARY KEY, value BLOB); +CREATE TABLE payments_customer_data (customer_id VARCHAR); +CREATE TABLE server_card_cloud_token_data (id VARCHAR, suffix VARCHAR, exp_month INTEGER DEFAULT 0, exp_year INTEGER DEFAULT 0, card_art_url VARCHAR, instrument_token VARCHAR); +CREATE TABLE offer_data (offer_id UNSIGNED LONG, offer_reward_amount VARCHAR, expiry UNSIGNED LONG, offer_details_url VARCHAR, merchant_domain VARCHAR, promo_code VARCHAR, value_prop_text VARCHAR, see_details_text VARCHAR, usage_instructions_text VARCHAR); +CREATE TABLE offer_eligible_instrument (offer_id UNSIGNED LONG, instrument_id UNSIGNED LONG); +CREATE TABLE offer_merchant_domain (offer_id UNSIGNED LONG, merchant_domain VARCHAR); +CREATE TABLE contact_info (guid VARCHAR PRIMARY KEY, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, date_modified INTEGER NOT NULL DEFAULT 0, language_code VARCHAR, label VARCHAR, initial_creator_id INTEGER DEFAULT 0, last_modifier_id INTEGER DEFAULT 0); +CREATE TABLE contact_info_type_tokens (guid VARCHAR, type INTEGER, value VARCHAR, verification_status INTEGER DEFAULT 0, observations BLOB, PRIMARY KEY (guid, type)); +CREATE TABLE local_addresses (guid VARCHAR PRIMARY KEY, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, date_modified INTEGER NOT NULL DEFAULT 0, language_code VARCHAR, label VARCHAR, initial_creator_id INTEGER DEFAULT 0, last_modifier_id INTEGER DEFAULT 0); +CREATE TABLE local_addresses_type_tokens (guid VARCHAR, type INTEGER, value VARCHAR, verification_status INTEGER DEFAULT 0, observations BLOB, PRIMARY KEY (guid, type)); +CREATE TABLE virtual_card_usage_data (id VARCHAR PRIMARY KEY, instrument_id INTEGER DEFAULT 0, merchant_domain VARCHAR, last_four VARCHAR); +CREATE TABLE local_stored_cvc (guid VARCHAR PRIMARY KEY NOT NULL, value_encrypted VARCHAR NOT NULL, last_updated_timestamp INTEGER NOT NULL); +CREATE TABLE server_stored_cvc (instrument_id INTEGER PRIMARY KEY NOT NULL, value_encrypted VARCHAR NOT NULL, last_updated_timestamp INTEGER NOT NULL); +CREATE TABLE masked_ibans (instrument_id VARCHAR PRIMARY KEY NOT NULL, prefix VARCHAR NOT NULL, suffix VARCHAR NOT NULL, length INTEGER NOT NULL DEFAULT 0, nickname VARCHAR); +CREATE TABLE masked_ibans_metadata (instrument_id VARCHAR PRIMARY KEY NOT NULL, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0); +CREATE TABLE bank_accounts (instrument_id INTEGER PRIMARY KEY NOT NULL, bank_name VARCHAR, account_number_suffix VARCHAR, account_type INTEGER DEFAULT 0); +CREATE TABLE payment_instruments (instrument_id INTEGER NOT NULL, instrument_type INTEGER NOT NULL, display_icon_url VARCHAR, nickname VARCHAR, PRIMARY KEY (instrument_id, instrument_type)); +CREATE TABLE payment_instruments_metadata (instrument_id INTEGER NOT NULL, instrument_type INTEGER NOT NULL, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (instrument_id, instrument_type)); +CREATE TABLE payment_instrument_supported_rails (instrument_id INTEGER NOT NULL, instrument_type INTEGER NOT NULL, payment_rail INTEGER NOT NULL, PRIMARY KEY (instrument_id, instrument_type, payment_rail)); +CREATE TABLE keywords (id INTEGER PRIMARY KEY,short_name VARCHAR NOT NULL,keyword VARCHAR NOT NULL,favicon_url VARCHAR NOT NULL,url VARCHAR NOT NULL,safe_for_autoreplace INTEGER,originating_url VARCHAR,date_created INTEGER DEFAULT 0,usage_count INTEGER DEFAULT 0,input_encodings VARCHAR,suggest_url VARCHAR,prepopulate_id INTEGER DEFAULT 0,created_by_policy INTEGER DEFAULT 0,last_modified INTEGER DEFAULT 0,sync_guid VARCHAR,alternate_urls VARCHAR,image_url VARCHAR,search_url_post_params VARCHAR,suggest_url_post_params VARCHAR,image_url_post_params VARCHAR,new_tab_url VARCHAR,last_visited INTEGER DEFAULT 0, created_from_play_api INTEGER DEFAULT 0, is_active INTEGER DEFAULT 0, starter_pack_id INTEGER DEFAULT 0, enforced_by_policy INTEGER DEFAULT 0, featured_by_policy INTEGER DEFAULT 0); +CREATE INDEX autofill_name ON autofill(name); +CREATE INDEX autofill_name_value_lower ON autofill(name, value_lower); +CREATE TABLE benefit_merchant_domains(benefit_id VARCHAR NOT NULL,merchant_domain VARCHAR NOT NULL); +CREATE TABLE masked_credit_card_benefits(benefit_id VARCHAR PRIMARY KEY NOT NULL,instrument_id INTEGER NOT NULL DEFAULT 0,benefit_type INTEGER NOT NULL DEFAULT 0,benefit_category INTEGER NOT NULL DEFAULT 0,benefit_description VARCHAR NOT NULL,start_time INTEGER,end_time INTEGER); +COMMIT;
diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h index a70532c..da16bdc 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.h +++ b/components/viz/common/frame_sinks/begin_frame_source.h
@@ -14,7 +14,6 @@ #include "base/check.h" #include "base/containers/flat_set.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/time/time.h" #include "build/build_config.h" #include "components/viz/common/display/update_vsync_parameters_callback.h" @@ -177,9 +176,7 @@ // time is off. uint64_t next_sequence_number_ = BeginFrameArgs::kStartingFrameNumber; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION DynamicBeginFrameDeadlineOffsetSource* + raw_ptr<DynamicBeginFrameDeadlineOffsetSource, DanglingUntriaged> dynamic_begin_frame_deadline_offset_source_ = nullptr; };
diff --git a/components/viz/common/gpu/raster_context_provider.h b/components/viz/common/gpu/raster_context_provider.h index 26366681..91832b22 100644 --- a/components/viz/common/gpu/raster_context_provider.h +++ b/components/viz/common/gpu/raster_context_provider.h
@@ -11,7 +11,7 @@ #include <memory> #include "base/functional/callback.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "components/viz/common/gpu/context_cache_controller.h" @@ -60,9 +60,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION RasterContextProvider* const context_provider_; + const raw_ptr<RasterContextProvider> context_provider_; base::AutoLock context_lock_; std::unique_ptr<ContextCacheController::ScopedBusy> busy_; };
diff --git a/components/viz/common/resources/shared_image_format.cc b/components/viz/common/resources/shared_image_format.cc index f74a814..76d23a4 100644 --- a/components/viz/common/resources/shared_image_format.cc +++ b/components/viz/common/resources/shared_image_format.cc
@@ -71,6 +71,8 @@ return "NV12A_LEGACY"; } else if (format == LegacyMultiPlaneFormat::kP010) { return "P010_LEGACY"; + } else if (format == SinglePlaneFormat::kR_F16) { + return "R_F16"; } NOTREACHED_NORETURN(); } @@ -90,6 +92,7 @@ } else if (format == SinglePlaneFormat::kRGBA_4444 || format == SinglePlaneFormat::kRGB_565 || format == SinglePlaneFormat::kLUMINANCE_F16 || + format == SinglePlaneFormat::kR_F16 || format == SinglePlaneFormat::kR_16 || format == SinglePlaneFormat::kBGR_565 || format == SinglePlaneFormat::kRG_88) { @@ -456,6 +459,7 @@ case mojom::SingleplanarFormat::RGBA_4444: case mojom::SingleplanarFormat::RGB_565: case mojom::SingleplanarFormat::LUMINANCE_F16: + case mojom::SingleplanarFormat::R_F16: case mojom::SingleplanarFormat::R16_EXT: case mojom::SingleplanarFormat::BGR_565: case mojom::SingleplanarFormat::RG_88:
diff --git a/components/viz/common/resources/shared_image_format.h b/components/viz/common/resources/shared_image_format.h index b471b47..a37c3c8 100644 --- a/components/viz/common/resources/shared_image_format.h +++ b/components/viz/common/resources/shared_image_format.h
@@ -289,13 +289,15 @@ SharedImageFormat(mojom::SingleplanarFormat::RGBX_1010102); static constexpr SharedImageFormat kBGRA_1010102 = SharedImageFormat(mojom::SingleplanarFormat::BGRX_1010102); + static constexpr SharedImageFormat kR_F16 = + SharedImageFormat(mojom::SingleplanarFormat::R_F16); // All known singleplanar formats. - static constexpr SharedImageFormat kAll[18] = { - kRGBA_8888, kRGBA_4444, kBGRA_8888, kALPHA_8, kLUMINANCE_8, - kRGB_565, kBGR_565, kETC1, kR_8, kRG_88, - kLUMINANCE_F16, kRGBA_F16, kR_16, kRG_1616, kRGBX_8888, - kBGRX_8888, kRGBA_1010102, kBGRA_1010102}; + static constexpr SharedImageFormat kAll[19] = { + kRGBA_8888, kRGBA_4444, kBGRA_8888, kALPHA_8, kLUMINANCE_8, + kRGB_565, kBGR_565, kETC1, kR_8, kRG_88, + kLUMINANCE_F16, kRGBA_F16, kR_16, kRG_1616, kRGBX_8888, + kBGRX_8888, kRGBA_1010102, kBGRA_1010102, kR_F16}; }; // Constants for legacy single-plane representations of multiplanar formats.
diff --git a/components/viz/common/resources/shared_image_format_utils.cc b/components/viz/common/resources/shared_image_format_utils.cc index 543e659c..b50d1d5 100644 --- a/components/viz/common/resources/shared_image_format_utils.cc +++ b/components/viz/common/resources/shared_image_format_utils.cc
@@ -74,7 +74,8 @@ return kA16_unorm_SkColorType; } else if (format == SinglePlaneFormat::kRG_1616) { return kR16G16_unorm_SkColorType; - } else if (format == SinglePlaneFormat::kLUMINANCE_F16) { + } else if (format == SinglePlaneFormat::kLUMINANCE_F16 || + format == SinglePlaneFormat::kR_F16) { return kA16_float_SkColorType; } else if (format == SinglePlaneFormat::kRG_88) { return kR8G8_unorm_SkColorType; @@ -319,7 +320,8 @@ format == SinglePlaneFormat::kBGRX_8888) { return GL_RGB; } else if (format == SinglePlaneFormat::kR_8 || - format == SinglePlaneFormat::kR_16) { + format == SinglePlaneFormat::kR_16 || + format == SinglePlaneFormat::kR_F16) { return GL_RED_EXT; } else if (format == SinglePlaneFormat::kRG_88 || format == SinglePlaneFormat::kRG_1616) { @@ -349,6 +351,7 @@ format == SinglePlaneFormat::kRGB_565) { return GL_UNSIGNED_SHORT_5_6_5; } else if (format == SinglePlaneFormat::kLUMINANCE_F16 || + format == SinglePlaneFormat::kR_F16 || format == SinglePlaneFormat::kRGBA_F16) { return GL_HALF_FLOAT_OES; } else if (format == SinglePlaneFormat::kR_16 || @@ -389,6 +392,8 @@ return GL_RG8_EXT; } else if (format == SinglePlaneFormat::kLUMINANCE_F16) { return GL_LUMINANCE16F_EXT; + } else if (format == SinglePlaneFormat::kR_F16) { + return GL_R16F_EXT; } else if (format == SinglePlaneFormat::kR_16) { return GL_R16_EXT; } else if (format == SinglePlaneFormat::kRG_1616) {
diff --git a/components/viz/service/display/display_resource_provider_skia.h b/components/viz/service/display/display_resource_provider_skia.h index 95537cc..6023bcb 100644 --- a/components/viz/service/display/display_resource_provider_skia.h +++ b/components/viz/service/display/display_resource_provider_skia.h
@@ -9,7 +9,6 @@ #include <vector> #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "components/viz/service/display/display_resource_provider.h" #include "components/viz/service/display/external_use_client.h" #include "components/viz/service/viz_service_export.h" @@ -67,9 +66,8 @@ void UnlockResources(const gpu::SyncToken& sync_token); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION DisplayResourceProviderSkia* const resource_provider_; + const raw_ptr<DisplayResourceProviderSkia, DanglingUntriaged> + resource_provider_; std::vector<std::pair<ResourceId, ChildResource*>> resources_; };
diff --git a/components/webapps/browser/android/BUILD.gn b/components/webapps/browser/android/BUILD.gn index f060aec..b46f469 100644 --- a/components/webapps/browser/android/BUILD.gn +++ b/components/webapps/browser/android/BUILD.gn
@@ -36,6 +36,12 @@ "java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetView.java", "java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetViewBinder.java", "java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreProperties.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContent.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetMediator.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetView.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetViewBinder.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallProperties.java", ] deps = [ ":java_resources", @@ -114,6 +120,7 @@ "java/res/layout/pwa_restore_bottom_sheet_preview.xml", "java/res/layout/pwa_restore_list_item_app.xml", "java/res/layout/pwa_restore_list_item_label.xml", + "java/res/layout/pwa_universal_install_bottom_sheet_content.xml", "java/res/mipmap-hdpi/shortcut_icon_shadow.png", "java/res/mipmap-mdpi/shortcut_icon_shadow.png", "java/res/mipmap-xhdpi/shortcut_icon_shadow.png", @@ -186,6 +193,8 @@ "java/src/org/chromium/components/webapps/AddToHomescreenViewBinderTest.java", "java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetContentTest.java", "java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetCoordinatorTest.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContentTest.java", + "java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinatorTest.java", ] deps = [ ":java",
diff --git a/components/webapps/browser/android/android_webapps_strings.grd b/components/webapps/browser/android/android_webapps_strings.grd index 04519cc..4c36852 100644 --- a/components/webapps/browser/android/android_webapps_strings.grd +++ b/components/webapps/browser/android/android_webapps_strings.grd
@@ -207,6 +207,15 @@ Failed to install </message> + <!-- PWA Universal Install UI --> + <message name="IDS_PWA_UNI_INSTALL_TITLE" desc="The title for the Universal Install sheet."> + Add to home screen + </message> + + <message name="IDS_PWA_UNI_BOTTOM_SHEET_ACCESSIBILITY" desc="The content description for the bottom sheet install UI."> + Choose how to add the app to the home screen + </message> + <!-- PWA Restore Bottom Sheet UI --> <message name="IDS_PWA_RESTORE_BUTTON_PEEKING" desc="The button label when the PWA Restore BottomSheet UI is in peeking state."> Review web apps
diff --git a/components/webapps/browser/android/android_webapps_strings_grd/IDS_PWA_UNI_BOTTOM_SHEET_ACCESSIBILITY.png.sha1 b/components/webapps/browser/android/android_webapps_strings_grd/IDS_PWA_UNI_BOTTOM_SHEET_ACCESSIBILITY.png.sha1 new file mode 100644 index 0000000..d2b8dcc --- /dev/null +++ b/components/webapps/browser/android/android_webapps_strings_grd/IDS_PWA_UNI_BOTTOM_SHEET_ACCESSIBILITY.png.sha1
@@ -0,0 +1 @@ +2dd47e7b7de69af2d52e75e8fbca3c506e4d04b2 \ No newline at end of file
diff --git a/components/webapps/browser/android/android_webapps_strings_grd/IDS_PWA_UNI_INSTALL_TITLE.png.sha1 b/components/webapps/browser/android/android_webapps_strings_grd/IDS_PWA_UNI_INSTALL_TITLE.png.sha1 new file mode 100644 index 0000000..d2b8dcc --- /dev/null +++ b/components/webapps/browser/android/android_webapps_strings_grd/IDS_PWA_UNI_INSTALL_TITLE.png.sha1
@@ -0,0 +1 @@ +2dd47e7b7de69af2d52e75e8fbca3c506e4d04b2 \ No newline at end of file
diff --git a/components/webapps/browser/android/java/res/layout/pwa_universal_install_bottom_sheet_content.xml b/components/webapps/browser/android/java/res/layout/pwa_universal_install_bottom_sheet_content.xml new file mode 100644 index 0000000..f3a144bd --- /dev/null +++ b/components/webapps/browser/android/java/res/layout/pwa_universal_install_bottom_sheet_content.xml
@@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2024 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView + android:id="@+id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:focusable="true" + android:gravity="center" + android:layout_gravity="center" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:layout_marginTop="16dp" + android:ellipsize="end" + android:lineHeight="20sp" + android:maxLines="7" + android:textAppearance="@style/TextAppearance.Headline.Primary" /> +</LinearLayout>
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContent.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContent.java new file mode 100644 index 0000000..f0d8f3c914f --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContent.java
@@ -0,0 +1,86 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.view.View; + +import androidx.annotation.Nullable; + +import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; +import org.chromium.components.webapps.R; + +/** The class handling the bottom sheet install for the PWA Universal Install UI. */ +public class PwaUniversalInstallBottomSheetContent implements BottomSheetContent { + // The view for our bottom sheet. + private final PwaUniversalInstallBottomSheetView mView; + + // This content is shown as a result of a user action (selecting from the Chrome menu), so the + // priority should be high. + private @ContentPriority int mPriority = ContentPriority.HIGH; + + public PwaUniversalInstallBottomSheetContent(PwaUniversalInstallBottomSheetView view) { + mView = view; + } + + public void setPriority(@ContentPriority int priority) { + mPriority = priority; + } + + // BottomSheetContent: + + @Override + public View getContentView() { + return mView.getContentView(); + } + + @Override + @Nullable + public View getToolbarView() { + return null; + } + + @Override + public float getFullHeightRatio() { + return BottomSheetContent.HeightMode.WRAP_CONTENT; + } + + @Override + public int getVerticalScrollOffset() { + return 0; + } + + @Override + public void destroy() {} + + @Override + public int getPriority() { + return mPriority; + } + + @Override + public boolean swipeToDismissEnabled() { + return true; + } + + @Override + public int getSheetContentDescriptionStringId() { + return R.string.pwa_uni_bottom_sheet_accessibility; + } + + @Override + public int getSheetHalfHeightAccessibilityStringId() { + return R.string.pwa_uni_bottom_sheet_accessibility; + } + + @Override + public int getSheetFullHeightAccessibilityStringId() { + return R.string.pwa_uni_bottom_sheet_accessibility; + } + + @Override + public int getSheetClosedAccessibilityStringId() { + return R.string.pwa_uni_bottom_sheet_accessibility; + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContentTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContentTest.java new file mode 100644 index 0000000..dff26e1 --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetContentTest.java
@@ -0,0 +1,83 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.app.Activity; + +import androidx.test.filters.MediumTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.LooperMode; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.R; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; + +/** Unit tests for {@link PwaUniversalInstallBottomSheetContent}. */ +@RunWith(BaseRobolectricTestRunner.class) +@LooperMode(LooperMode.Mode.PAUSED) +public final class PwaUniversalInstallBottomSheetContentTest { + private Activity mActivity; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + @MediumTest + public void testBasics() { + // Create a mocked version of the PwaUniversalInstallBottomSheetView, for use with the + // BottomSheetContent. Note that the view is not initialized, and therefore it does not + // inflate its layout. That means attempts to access the underlying content view are not + // likely to work. + PwaUniversalInstallBottomSheetView mockedView = + Mockito.mock( + PwaUniversalInstallBottomSheetView.class, + Mockito.withSettings() + .useConstructor(mActivity) + .defaultAnswer(Mockito.RETURNS_MOCKS)); + PwaUniversalInstallBottomSheetContent pwaUniversalInstallBottomSheetContent = + new PwaUniversalInstallBottomSheetContent( + (PwaUniversalInstallBottomSheetView) mockedView); + + Assert.assertTrue(pwaUniversalInstallBottomSheetContent.getContentView() != null); + Assert.assertTrue(pwaUniversalInstallBottomSheetContent.getToolbarView() == null); + + Assert.assertEquals( + BottomSheetContent.ContentPriority.HIGH, + pwaUniversalInstallBottomSheetContent.getPriority()); + pwaUniversalInstallBottomSheetContent.setPriority(BottomSheetContent.ContentPriority.LOW); + Assert.assertEquals( + BottomSheetContent.ContentPriority.LOW, + pwaUniversalInstallBottomSheetContent.getPriority()); + + Assert.assertEquals( + BottomSheetContent.HeightMode.WRAP_CONTENT, + pwaUniversalInstallBottomSheetContent.getFullHeightRatio(), + 0.0001); + Assert.assertEquals(0, pwaUniversalInstallBottomSheetContent.getVerticalScrollOffset()); + Assert.assertTrue(pwaUniversalInstallBottomSheetContent.swipeToDismissEnabled()); + + int accessibilityId = R.string.pwa_uni_bottom_sheet_accessibility; + Assert.assertEquals( + accessibilityId, + pwaUniversalInstallBottomSheetContent.getSheetContentDescriptionStringId()); + Assert.assertEquals( + accessibilityId, + pwaUniversalInstallBottomSheetContent.getSheetHalfHeightAccessibilityStringId()); + Assert.assertEquals( + accessibilityId, + pwaUniversalInstallBottomSheetContent.getSheetFullHeightAccessibilityStringId()); + Assert.assertEquals( + accessibilityId, + pwaUniversalInstallBottomSheetContent.getSheetClosedAccessibilityStringId()); + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java new file mode 100644 index 0000000..aea254c --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java
@@ -0,0 +1,49 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.app.Activity; +import android.view.View; + +import androidx.annotation.MainThread; + +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +/** The Coordinator for managing the Pwa Universal Install bottom sheet experience. */ +public class PwaUniversalInstallBottomSheetCoordinator { + private final BottomSheetController mController; + private final PwaUniversalInstallBottomSheetView mView; + private final PwaUniversalInstallBottomSheetContent mContent; + private final PwaUniversalInstallBottomSheetMediator mMediator; + + /** Constructs the PwaUniversalInstallBottomSheetCoordinator. */ + @MainThread + public PwaUniversalInstallBottomSheetCoordinator( + Activity activity, BottomSheetController bottomSheetController) { + mController = bottomSheetController; + + mView = new PwaUniversalInstallBottomSheetView(activity); + mView.initialize(); + mContent = new PwaUniversalInstallBottomSheetContent(mView); + mMediator = new PwaUniversalInstallBottomSheetMediator(activity); + + PropertyModelChangeProcessor.create( + mMediator.getModel(), mView, PwaUniversalInstallBottomSheetViewBinder::bind); + } + + /** + * Attempts to show the bottom sheet on the screen. + * + * @return True if showing is successful. + */ + public boolean show() { + return mController.requestShowContent(mContent, true); + } + + public View getBottomSheetViewForTesting() { + return mView.getContentView(); + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinatorTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinatorTest.java new file mode 100644 index 0000000..bc253b4 --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinatorTest.java
@@ -0,0 +1,55 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.app.Activity; +import android.view.View; +import android.widget.TextView; + +import androidx.test.filters.MediumTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; +import org.robolectric.annotation.LooperMode; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.components.webapps.R; +import org.chromium.content_public.browser.test.util.TestThreadUtils; + +/** Instrumentation tests for PWA Universal Install bottom sheet. */ +@RunWith(BaseRobolectricTestRunner.class) +@LooperMode(LooperMode.Mode.PAUSED) +public class PwaUniversalInstallBottomSheetCoordinatorTest { + Activity mActivity; + + @Mock private BottomSheetController mBottomSheetControllerMock; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + @MediumTest + public void testShowing() { + final Activity activity = Robolectric.buildActivity(Activity.class).create().get(); + PwaUniversalInstallBottomSheetCoordinator coordinator = + new PwaUniversalInstallBottomSheetCoordinator(activity, mBottomSheetControllerMock); + + View bottomSheetView = coordinator.getBottomSheetViewForTesting(); + TestThreadUtils.runOnUiThreadBlocking( + () -> { + TextView title = bottomSheetView.findViewById(R.id.title); + String expected = "Add to home screen"; + Assert.assertEquals(expected, title.getText()); + }); + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetMediator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetMediator.java new file mode 100644 index 0000000..73bda79 --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetMediator.java
@@ -0,0 +1,36 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.app.Activity; + +import org.chromium.components.webapps.R; +import org.chromium.ui.modelutil.PropertyModel; + +/** The Mediator for the PWA Universal Install bottom sheet. */ +class PwaUniversalInstallBottomSheetMediator { + // The current activity. + private final Activity mActivity; + + // The underlying property model for the bottom sheeet. + private final PropertyModel mModel; + + PwaUniversalInstallBottomSheetMediator(Activity activity) { + mActivity = activity; + mModel = PwaUniversalInstallProperties.createModel(); + + setPeekingState(); + } + + private void setPeekingState() { + mModel.set( + PwaUniversalInstallProperties.TITLE, + mActivity.getString(R.string.pwa_uni_install_title)); + } + + PropertyModel getModel() { + return mModel; + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetView.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetView.java new file mode 100644 index 0000000..36e0adf --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetView.java
@@ -0,0 +1,40 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; + +import org.chromium.components.webapps.R; + +/** The view portion of the PWA Universal Install bottom sheet. */ +public class PwaUniversalInstallBottomSheetView { + // The current context. + private final Context mContext; + + // The details of the bottom sheet. + private View mContentView; + + public PwaUniversalInstallBottomSheetView(Context context) { + mContext = context; + } + + public void initialize() { + mContentView = + LayoutInflater.from(mContext) + .inflate( + R.layout.pwa_universal_install_bottom_sheet_content, + /* root= */ null); + } + + public View getContentView() { + return mContentView; + } + + int getPeekHeight() { + return mContentView.getHeight(); + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetViewBinder.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetViewBinder.java new file mode 100644 index 0000000..1f934f3 --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetViewBinder.java
@@ -0,0 +1,25 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import android.widget.TextView; + +import org.chromium.components.webapps.R; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * Binds a pwa-universal-install {@link PropertyModel} with a {@link + * PwaUniversalInstallBottomSheetView}. + */ +class PwaUniversalInstallBottomSheetViewBinder { + static void bind( + PropertyModel model, PwaUniversalInstallBottomSheetView view, PropertyKey propertyKey) { + if (propertyKey.equals(PwaUniversalInstallProperties.TITLE)) { + ((TextView) view.getContentView().findViewById(R.id.title)) + .setText(model.get(PwaUniversalInstallProperties.TITLE)); + } + } +}
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallProperties.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallProperties.java new file mode 100644 index 0000000..b2f864c --- /dev/null +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallProperties.java
@@ -0,0 +1,19 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.webapps.pwa_universal_install; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** Contains the properties that a pwa-universal-install {@link PropertyModel} can have. */ +public class PwaUniversalInstallProperties { + static final PropertyModel.WritableObjectPropertyKey<String> TITLE = + new PropertyModel.WritableObjectPropertyKey<>(); + static final PropertyKey[] ALL_KEYS = {TITLE}; + + static PropertyModel createModel() { + return new PropertyModel.Builder(ALL_KEYS).build(); + } +}
diff --git a/components/webapps/browser/banners/app_banner_settings_helper.h b/components/webapps/browser/banners/app_banner_settings_helper.h index 73b89df..0b752c03 100644 --- a/components/webapps/browser/banners/app_banner_settings_helper.h +++ b/components/webapps/browser/banners/app_banner_settings_helper.h
@@ -48,7 +48,8 @@ APP_MENU_OPTION_MIN = APP_MENU_OPTION_UNKNOWN, APP_MENU_OPTION_ADD_TO_HOMESCREEN = 1, APP_MENU_OPTION_INSTALL = 2, - APP_MENU_OPTION_MAX = APP_MENU_OPTION_INSTALL, + APP_MENU_OPTION_UNIVERSAL_INSTALL = 3, + APP_MENU_OPTION_MAX = APP_MENU_OPTION_UNIVERSAL_INSTALL, }; // The various types of banner events recorded as timestamps in the app banner
diff --git a/components/webdata/common/web_database.cc b/components/webdata/common/web_database.cc index a4223c44..e061f20 100644 --- a/components/webdata/common/web_database.cc +++ b/components/webdata/common/web_database.cc
@@ -16,7 +16,7 @@ // corresponding changes must happen in the unit tests, and new migration test // added. See `WebDatabaseMigrationTest::kCurrentTestedVersionNumber`. // static -const int WebDatabase::kCurrentVersionNumber = 123; +const int WebDatabase::kCurrentVersionNumber = 124; const int WebDatabase::kDeprecatedVersionNumber = 82; @@ -45,9 +45,10 @@ base::UmaHistogramEnumeration("WebDatabase.InitResult", result); } -// Version 122 changes the meaning semantics of column `created_by_policy` in -// the `keywords` table, and so it's incompatible with version 121. -const int kCompatibleVersionNumber = 122; +// Version 124 deletes 'payment_instruments', 'payment_instruments_meetadata', +// 'payment_instrument_supported_rails', 'bank_accounts' table and thus is no +// longer compatible with version 123. +const int kCompatibleVersionNumber = 124; // Change the version number and possibly the compatibility version of // |meta_table_|.
diff --git a/components/webdata/common/web_database_migration_unittest.cc b/components/webdata/common/web_database_migration_unittest.cc index 1fa49bf1..fdc102d2 100644 --- a/components/webdata/common/web_database_migration_unittest.cc +++ b/components/webdata/common/web_database_migration_unittest.cc
@@ -142,7 +142,7 @@ base::ScopedTempDir temp_dir_; }; -const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 123; +const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 124; void WebDatabaseMigrationTest::LoadDatabase( const base::FilePath::StringType& file) { @@ -1244,43 +1244,6 @@ } } -TEST_F(WebDatabaseMigrationTest, MigrationVersion119ToCurrent) { - ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_119.sql"))); - // Verify pre-conditions. - { - sql::Database connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); - - // Check version. - EXPECT_EQ(119, VersionFromConnection(&connection)); - - EXPECT_FALSE(connection.DoesTableExist("bank_accounts")); - EXPECT_FALSE(connection.DoesTableExist("payment_instruments")); - EXPECT_FALSE(connection.DoesTableExist("payment_instruments_metadata")); - EXPECT_FALSE( - connection.DoesTableExist("payment_instrument_supported_rails")); - } - - DoMigration(); - - // Verify post-conditions. - { - sql::Database connection; - ASSERT_TRUE(connection.Open(GetDatabasePath())); - ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); - - // Check version. - EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); - - EXPECT_TRUE(connection.DoesTableExist("bank_accounts")); - EXPECT_TRUE(connection.DoesTableExist("payment_instruments")); - EXPECT_TRUE(connection.DoesTableExist("payment_instruments_metadata")); - EXPECT_TRUE( - connection.DoesTableExist("payment_instrument_supported_rails")); - } -} - // Tests that the server_address* tables are dropped. TEST_F(WebDatabaseMigrationTest, MigrateVersion120ToCurrent) { ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_120.sql"))); @@ -1379,3 +1342,40 @@ "merchant_domain")); } } + +TEST_F(WebDatabaseMigrationTest, MigrateVersion123ToCurrent) { + ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_123.sql"))); + { + sql::Database connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + + // Check version. + EXPECT_EQ(123, VersionFromConnection(&connection)); + + EXPECT_TRUE(connection.DoesTableExist("payment_instruments")); + EXPECT_TRUE( + connection.DoesTableExist("payment_instrument_supported_rails")); + EXPECT_TRUE(connection.DoesTableExist("payment_instruments_metadata")); + EXPECT_TRUE(connection.DoesTableExist("bank_accounts")); + EXPECT_FALSE(connection.DoesTableExist("masked_bank_accounts")); + EXPECT_FALSE(connection.DoesTableExist("masked_bank_accounts_metadata")); + } + DoMigration(); + { + sql::Database connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + + // Check version. + EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); + + EXPECT_FALSE(connection.DoesTableExist("payment_instruments")); + EXPECT_FALSE( + connection.DoesTableExist("payment_instrument_supported_rails")); + EXPECT_FALSE(connection.DoesTableExist("payment_instruments_metadata")); + EXPECT_FALSE(connection.DoesTableExist("bank_accounts")); + EXPECT_TRUE(connection.DoesTableExist("masked_bank_accounts")); + EXPECT_TRUE(connection.DoesTableExist("masked_bank_accounts_metadata")); + } +}
diff --git a/components/zucchini/encoded_view.h b/components/zucchini/encoded_view.h index fdd01e5..fcc2502a 100644 --- a/components/zucchini/encoded_view.h +++ b/components/zucchini/encoded_view.h
@@ -11,7 +11,7 @@ #include <iterator> #include <vector> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" #include "components/zucchini/image_index.h" #include "components/zucchini/image_utils.h" @@ -125,9 +125,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const EncodedView* encoded_view_; + raw_ptr<const EncodedView> encoded_view_; difference_type pos_; };
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 050a65c..6519694 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -336,7 +336,7 @@ const BrowserAccessibility* BrowserAccessibility::AllChildrenRange::Iterator::operator*() { if (child_tree_root_) - return index_ == 0 ? child_tree_root_ : nullptr; + return index_ == 0 ? child_tree_root_.get() : nullptr; // TODO(nektar): Consider using // `AXNode::GetChildAtIndexCrossingTreeBoundary()`.
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index 52bde4b..3c3e9d9 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h
@@ -17,7 +17,6 @@ #include <vector> #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/strings/string_split.h" #include "build/build_config.h" #include "content/common/content_export.h" @@ -240,12 +239,8 @@ const BrowserAccessibility* operator*(); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const BrowserAccessibility* const parent_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const BrowserAccessibility* const child_tree_root_; + const raw_ptr<const BrowserAccessibility> parent_; + const raw_ptr<const BrowserAccessibility> child_tree_root_; unsigned int index_; };
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index cca825aa..aa8441c 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -501,7 +501,7 @@ // IsDescendantOf() also returns true in the case of equality. if (focus && focus != event_target && focus->IsDescendantOf(event_target)) { - FireGeneratedEvent(targeted_event.event_params.event, + FireGeneratedEvent(targeted_event.event_params->event, event_target->node()); } else { deferred_events.push_back(targeted_event); @@ -532,7 +532,8 @@ if (!event_target->CanFireEvents()) continue; - FireGeneratedEvent(targeted_event.event_params.event, event_target->node()); + FireGeneratedEvent(targeted_event.event_params->event, + event_target->node()); } event_generator().ClearEvents(); @@ -649,7 +650,11 @@ change->new_location.bounds, change->new_location.transform.get()); } - SendLocationChangeEvents(changes); + // Only send location change events when the page is not in back/forward + // cache. + if (CanFireEvents()) { + SendLocationChangeEvents(changes); + } if (!location_change_callback_for_testing_.is_null()) location_change_callback_for_testing_.Run(); }
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm index 5a67064..ce3623b 100644 --- a/content/browser/accessibility/browser_accessibility_manager_mac.mm +++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -118,8 +118,9 @@ bool BrowserAccessibilityManagerMac::IsInGeneratedEventBatch( ui::AXEventGenerator::Event event_type) const { for (const auto& event : event_generator()) { - if (event.event_params.event == event_type) + if (event.event_params->event == event_type) { return true; // Any side effects will have already been handled. + } } return false; }
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 0c056ad4..72a83d6 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -953,7 +953,7 @@ DCHECK(ignored_changed_nodes_.empty()); for (const auto& targeted_event : event_generator()) { - if (targeted_event.event_params.event == + if (targeted_event.event_params->event == ui::AXEventGenerator::Event::IGNORED_CHANGED) { BrowserAccessibility* event_target = GetFromID(targeted_event.node_id); if (!event_target)
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc index 02285ab0..b09518e36 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.cc +++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -260,9 +260,6 @@ void WebContentsAccessibilityAndroid::DisableRendererAccessibility( JNIEnv* env) { - // This method should only be called if the Auto-Disable feature is enabled. - DCHECK(base::FeatureList::IsEnabled(::features::kAutoDisableAccessibilityV2)); - // This method should only be called when |snapshot_root_manager_| is null, // which means this instance was constructed via a web contents and not an // AXTreeUpdate (e.g. for snapshots, frozen tabs, paint preview, etc). @@ -294,9 +291,6 @@ void WebContentsAccessibilityAndroid::ReEnableRendererAccessibility( JNIEnv* env, const JavaParamRef<jobject>& jweb_contents) { - // This method should only be called if the Auto-Disable feature is enabled. - DCHECK(base::FeatureList::IsEnabled(::features::kAutoDisableAccessibilityV2)); - // This method should only be called when |snapshot_root_manager_| is null, // which means this instance was constructed via a web contents and not an // AXTreeUpdate (e.g. for snapshots, frozen tabs, paint preview, etc).
diff --git a/content/browser/android/content_feature_map.cc b/content/browser/android/content_feature_map.cc index 2105bc1f..1200ca9d 100644 --- a/content/browser/android/content_feature_map.cc +++ b/content/browser/android/content_feature_map.cc
@@ -25,7 +25,6 @@ &features::kAccessibilityPageZoom, &features::kAccessibilityPageZoomEnhancements, &features::kAccessibilityPerformanceFiltering, - &features::kAutoDisableAccessibilityV2, &features::kFedCm, &features::kMouseAndTrackpadDropdownMenu, &features::kOptimizeImmHideCalls,
diff --git a/content/browser/back_forward_cache_internal_browsertest.cc b/content/browser/back_forward_cache_internal_browsertest.cc index c6c24e6..8e83f80 100644 --- a/content/browser/back_forward_cache_internal_browsertest.cc +++ b/content/browser/back_forward_cache_internal_browsertest.cc
@@ -3679,6 +3679,113 @@ } } +class BackForwardCacheBrowserTestWithFlagForAXLocationChange + : public BackForwardCacheBrowserTest, + public ::testing::WithParamInterface<bool> { + protected: + void SetUpCommandLine(base::CommandLine* command_line) override { + EnableFeatureAndSetParams(features::kEnableBackForwardCacheForScreenReader, + "", "true"); + if (ShouldEvictOnAXLocationChange()) { + DisableFeature(features::kDoNotEvictOnAXLocationChange); + } else { + EnableFeatureAndSetParams(features::kDoNotEvictOnAXLocationChange, "", + ""); + } + BackForwardCacheBrowserTest::SetUpCommandLine(command_line); + } + + bool ShouldEvictOnAXLocationChange() { return GetParam(); } +}; + +INSTANTIATE_TEST_SUITE_P(All, + BackForwardCacheBrowserTestWithFlagForAXLocationChange, + ::testing::Bool()); + +IN_PROC_BROWSER_TEST_P(BackForwardCacheBrowserTestWithFlagForAXLocationChange, + EvictOnAXLocationChangeOrNot) { + ASSERT_TRUE(embedded_test_server()->Start()); + GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html")); + GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); + + // 1) Navigate to A. + EXPECT_TRUE(NavigateToURL(shell()->web_contents(), url_a)); + RenderFrameHostImplWrapper rfh_a(current_frame_host()); + // Use Screen Reader. + EnableAccessibilityForWebContents(shell()->web_contents()); + + // Wait until we receive the kLoadComplete AX event. This means that the + // kLoadStart event has definitely already passed and any kLoadStart we see + // from this frame in the future is newly generated. + AccessibilityNotificationWaiter waiter_complete( + shell()->web_contents(), ui::kAXModeComplete, + ax::mojom::Event::kLoadComplete); + ASSERT_TRUE(waiter_complete.WaitForNotification()); + + // 2) Navigate to B. + EXPECT_TRUE(NavigateToURL(shell()->web_contents(), url_b)); + RenderFrameHostImplWrapper rfh_b(current_frame_host()); + ASSERT_TRUE(rfh_a.get()); + EXPECT_TRUE(rfh_a->IsInBackForwardCache()); + + // 3) Set the callback for location change. + BrowserAccessibilityManager* manager = + rfh_a->GetOrCreateBrowserAccessibilityManager(); + // This callback will count the number of times location change happens. + // Note that this callback runs even when the page is in back/forward cache. + int location_change_counter_for_testing = 0; + manager->SetLocationChangeCallbackForTesting(base::BindRepeating( + [](int* location_change_counter_for_testing) { + // Increment the location change count. + *location_change_counter_for_testing += 1; + }, + &location_change_counter_for_testing)); + + // Generate a location change event. + std::vector<blink::mojom::LocationChangesPtr> changes_1; + ui::AXRelativeBounds relative_bounds_1; + relative_bounds_1.bounds = + gfx::RectF(/*x=*/1, /*y=*/2, /*width=*/3, /*height=*/4); + changes_1.push_back(blink::mojom::LocationChanges::New(0, relative_bounds_1)); + rfh_a->HandleAXLocationChanges(rfh_a->GetAXTreeID(), std::move(changes_1), + /*reset_token=*/1); + + // Generate another location change event. + std::vector<blink::mojom::LocationChangesPtr> changes_2; + ui::AXRelativeBounds relative_bounds_2; + relative_bounds_2.bounds = + gfx::RectF(/*x=*/2, /*y=*/3, /*width=*/4, /*height=*/5); + changes_2.push_back(blink::mojom::LocationChanges::New(0, relative_bounds_2)); + rfh_a->HandleAXLocationChanges(rfh_a->GetAXTreeID(), std::move(changes_2), + /*reset_token=*/1); + + // 4) Navigate back. + ASSERT_TRUE(HistoryGoBack(web_contents())); + + if (ShouldEvictOnAXLocationChange()) { + const uint64_t reason = DisallowActivationReasonId::kAXLocationChange; + ExpectNotRestored({NotRestoredReason::kIgnoreEventAndEvict}, {}, {}, {}, + {reason}, FROM_HERE); + EXPECT_EQ(0, location_change_counter_for_testing); + } else { + AccessibilityNotificationWaiter waiter_start(shell()->web_contents(), + ui::kAXModeComplete, + ax::mojom::Event::kLoadStart); + // Ensure that |rfh_a| is successfully restored from bfcache and that we see + // LOAD_START event. + EXPECT_EQ(current_frame_host(), rfh_a.get()); + ExpectRestored(FROM_HERE); + + // Location change should have happened twice. + EXPECT_EQ(2, location_change_counter_for_testing); + + ASSERT_TRUE(waiter_start.WaitForNotification()); + auto* waiter_start_rfhi = static_cast<RenderFrameHostImpl*>( + waiter_start.event_browser_accessibility_manager()->delegate()); + EXPECT_EQ(waiter_start_rfhi, rfh_a.get()); + } +} + class BackgroundForegroundProcessLimitBackForwardCacheBrowserTest : public BackForwardCacheBrowserTest { protected:
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc index 2c73d24..adf2db2 100644 --- a/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc +++ b/content/browser/bluetooth/web_bluetooth_service_impl_browsertest.cc
@@ -8,7 +8,6 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "build/build_config.h" #include "content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h" @@ -252,9 +251,7 @@ private: std::string device_to_select_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION FakeBluetoothScanningPrompt* prompt_ = nullptr; + raw_ptr<FakeBluetoothScanningPrompt, DanglingUntriaged> prompt_ = nullptr; base::OnceClosure quit_on_scanning_prompt_; bool showed_bluetooth_scanning_prompt_ = false; };
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc index 9943d78..4e7481da 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -10122,6 +10122,95 @@ JSONSerializedKeys()); } + std::string GetSingleSellerResponse() { + std::string response; + // CBOR response computed using https://cbor.me/ + /* Response: + { + "adRenderURL":"https://c.test/ad.html", + "interestGroupName":"cars", + "interestGroupOwner":"https://a.test/", + "bid": 1.0, + "biddingGroups": { + "https://a.test/": [0] + }, + "winReportingURLs": { + "buyerReportingURLs": { + "reportingURL": "https://d.test/buyerReporting", + "interactionReportingURLs": { + "click": "https://e.test/buyerInteractionReporting" + } + }, + "topLevelSellerReportingURLs": { + "reportingURL": "https://d.test/sellerReporting", + "interactionReportingURLs": { + "click": "https://e.test/sellerInteractionReporting" + } + } + } + } + */ + // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | + // base64` + EXPECT_TRUE(base::Base64Decode( + "AgAAAM4fiwgAAAAAAAADhZBBCsIwEEU9hiC61k27F/" + "ciiELFA6TJoME0iZNpG5cepS68oztLS6EpRZfz+e/" + "xmTdPpfhsJjcmEtAC8JzsiyuRdes45hGBo5iJ6EqZyuqmkPqyRZNbV5muxdrWc2JLqROwB" + "ql" + "u1R73wjR/AIaZwt7p551FtJYQ8FOpCZBxkiZUV8CV5De/7Hjo8bsRyM/" + "I2D0UoE6g1O9Ri8EoFxL/V60Gq1rB2Kx7o6o7zVcPLAPBGToM4mOpAYf//" + "gI0JYFGugEAAA==", + &response)); + return response; + } + + std::string GetMultiSellerResponse() { + std::string response; + // CBOR response computed using https://cbor.me/ + /* Response: + { + "adRenderURL":"https://c.test/ad.html", + "interestGroupName":"cars", + "interestGroupOwner":"https://a.test/", + "biddingGroups": { + "https://a.test/": [0] + }, + "bid": 100, + "bidCurrency":"XAU", + "winReportingURLs": { + "buyerReportingURLs": { + "reportingURL": "https://d.test/buyerReporting", + "interactionReportingURLs": { + "click": "https://e.test/buyerInteractionReporting" + } + }, + "componentSellerReportingURLs": { + "reportingURL": "https://d.test/sellerReporting", + "interactionReportingURLs": { + "click": "https://e.test/sellerInteractionReporting" + } + } + }, + "topLevelSeller": "https://a.test/", + "adMetadata": "\"foo\"" + } + */ + // Converted to base64 with `cat | xxd -r -p | gzip | + // xxd -ps -c0 | sed 's/^/02000000dc/' | xxd -r -p | base64 -w0` + EXPECT_TRUE(base::Base64Decode( + "AgAAAPEfiwgAAAAAAAADhZCxTsMwEED5jA7QoRMszc6GGBBSC1JQJdar76BuHJ85X9p07K" + "eU" + "jb/EahSpDhUdfbr3/HQ/" + "ZmlxhGvAOSkgKNDkg3lSAZbkkWRRzjYr1RDvi8JMlaIWgNOV1q5K5GMjQt7szPvDok5vtP" + "7z" + "SbgJ8cA9BR21v/LKYUYbcm/" + "kHMlwIWytLymwaJKkb+O3LJsdST5zcvJsb3oHdo4caEfWKwkYtZyrD2ScNVV72/" + "N0wj+fgdprw3VgT167+v+qxoOqmBOXs+4GWZ3gXNfXUZV2jld/gZrQgETJxq9b//" + "fcv0dAW536AQAA", + &response)); + return response; + } + struct AdAuctionDataAndId { std::string request; std::optional<base::Uuid> request_id; @@ -10863,42 +10952,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "bid": 1.0, - "biddingGroups": { - "https://a.test/": [0] - }, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAM4fiwgAAAAAAAADhZBBCsIwEEU9hiC61k27F/" - "ciiELFA6TJoME0iZNpG5cepS68oztLS6EpRZfz+e/" - "xmTdPpfhsJjcmEtAC8JzsiyuRdes45hGBo5iJ6EqZyuqmkPqyRZNbV5muxdrWc2JLqROwBql" - "u1R73wjR/AIaZwt7p551FtJYQ8FOpCZBxkiZUV8CV5De/7Hjo8bsRyM/" - "I2D0UoE6g1O9Ri8EoFxL/V60Gq1rB2Kx7o6o7zVcPLAPBGToM4mOpAYf//" - "gI0JYFGugEAAA==", - &response)); + std::string response = GetSingleSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -11244,42 +11298,7 @@ R"(BF34AF8421A3A028B52C3C33AFB821332B3F330F2CC80800BE10ED8B4E000000)" R"('}, "enableDebugReporting": true})")); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "bid": 1.0, - "biddingGroups": { - "https://a.test/": [0] - }, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAM4fiwgAAAAAAAADhZBBCsIwEEU9hiC61k27F/" - "ciiELFA6TJoME0iZNpG5cepS68oztLS6EpRZfz+e/" - "xmTdPpfhsJjcmEtAC8JzsiyuRdes45hGBo5iJ6EqZyuqmkPqyRZNbV5muxdrWc2JLqROwBql" - "u1R73wjR/AIaZwt7p551FtJYQ8FOpCZBxkiZUV8CV5De/7Hjo8bsRyM/" - "I2D0UoE6g1O9Ri8EoFxL/V60Gq1rB2Kx7o6o7zVcPLAPBGToM4mOpAYf//" - "gI0JYFGugEAAA==", - &response)); + std::string response = GetSingleSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -11457,42 +11476,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - "topLevelSeller": "https://a.test/" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000cd/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAM0fiwgAAAAAAAADhZBNCsIwEEY9hiC61k279wIiFIWKB0iTwYamSZxMf1x6lLrwnJaW" - "QlOLLmf4vjePeWdMxKAF4DWOypTIun0Y8oDAUchEkFKu8kQKIfXtgKawrjFDivWp50KTsRGU" - "oC6gFOA0YCupY7AGqYW0Z9wLk+IB6O8UjsZ6PTBEz/" - "AL9VJqAmScpPHRDXAleVZvhz6M+seZUr3y5X9JbSZSzm/" - "8t9pNrHrAnNa9Q7WZ7uknloPgDB1663Olv7/9AfcS+HfSAQAA", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -11586,39 +11570,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAMcfiwgAAAAAAAADhZBBCsIwEEU9hiC61k279wIiFIWKB0iTwQbTJE6mbVx6lAre09JS" - "aErR5Xz+e3zmc2ciBS0Ar2lS5UTW7eOYRwSOYiainApVZFIIqW8HNKV1jRlarG+" - "9FraWOgVrkNpW63FvzMonYJgpHJ1+PVhEbwkBv5SaABknaUJ1A1xJfvfbgYcRf5yB/" - "IqMTaACdQGlfo/aTEa5kPi/ajdZ1QvmZj06VdvpvnpiBQjO0GEQn2sNOP33Fyx+ip+zAQAA", - &response)); + std::string response = GetSingleSellerResponse(); network_responder_->RegisterScriptResponse(kDecisionUrlPath, kDecisionScript); network_responder_->RegisterReportResponse("/buyerReporting", @@ -11708,42 +11660,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - "topLevelSeller": "https://a.test/" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000cd/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAM0fiwgAAAAAAAADhZBNCsIwEEY9hiC61k279wIiFIWKB0iTwYamSZxMf1x6lLrwnJaW" - "QlOLLmf4vjePeWdMxKAF4DWOypTIun0Y8oDAUchEkFKu8kQKIfXtgKawrjFDivWp50KTsRGU" - "oC6gFOA0YCupY7AGqYW0Z9wLk+IB6O8UjsZ6PTBEz/" - "AL9VJqAmScpPHRDXAleVZvhz6M+seZUr3y5X9JbSZSzm/" - "8t9pNrHrAnNa9Q7WZ7uknloPgDB1663Olv7/9AfcS+HfSAQAA", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -11850,46 +11767,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "bidCurrency":"XAU", - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - }, - "topLevelSeller": "https://a.test/", - "adMetadata": "\"foo\"" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000dc/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAOwfiwgAAAAAAAADhZCxbsIwEED7GUhVGZjahezdUIeqUmilVEhdD98VTBzbPV8gjHwK" - "bPwlFlEknCIYfbr3/" - "HRHNdc4wBXglAQQBGj069yoBCzIIvGsyNdLER9es0yNhYJkgOOlVKaM5FvNTFZt1c9kVsU3a" - "rt4Z1f7sHcdBS21e7DifE5rMt9kDHF/" - "wW+0Lcg7liiJ34YDz+stcTozfPFsnjoHto4UaAbaCjEo0S5V70kZrcrmuePpgv+" - "4AjWPafytqGEvKqTE/aqXXlUruJb1d1bFnfPRP6EiVMCBk/HXxv6/9gnuKQ6/+QEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -12018,43 +11896,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - "topLevelSeller": "https://a.test/" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000cd/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAANEfiwgAAAAAAAADhZBNCsIwEEY9RkF0rZt27wVEKAoVD5Amgw1NkziZ/" - "rj0KHXjNS0thaaKLmf4vjePefFUikDkTCSgBeAliauMyLpdFPGQwFHERJhRoYouKKS+" - "7tGU1rVmTLEh9VhoMjaGCtQZlAKcB2wtdQLWIHWQ7ox7YlreAf2dwsnYrEaGGBh+" - "oQmkJkDGSRof3QJXkufNZuzDpH/4UmqWvvwvqfVMyvmN/1bbmdUA+KZ161Fdpn/" - "6kRUgOEOH3vpU689vvwFDT7FZ2AEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -12225,43 +12067,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - "topLevelSeller": "https://a.test/" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000cd/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAANEfiwgAAAAAAAADhZBNCsIwEEY9RkF0rZt27wVEKAoVD5Amgw1NkziZ/" - "rj0KHXjNS0thaaKLmf4vjePefFUikDkTCSgBeAliauMyLpdFPGQwFHERJhRoYouKKS+" - "7tGU1rVmTLEh9VhoMjaGCtQZlAKcB2wtdQLWIHWQ7ox7YlreAf2dwsnYrEaGGBh+" - "oQmkJkDGSRof3QJXkufNZuzDpH/4UmqWvvwvqfVMyvmN/1bbmdUA+KZ161Fdpn/" - "6kRUgOEOH3vpU689vvwFDT7FZ2AEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -12433,43 +12239,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - "topLevelSeller": "https://a.test/" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000cd/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAANEfiwgAAAAAAAADhZBNCsIwEEY9RkF0rZt27wVEKAoVD5Amgw1NkziZ/" - "rj0KHXjNS0thaaKLmf4vjePefFUikDkTCSgBeAliauMyLpdFPGQwFHERJhRoYouKKS+" - "7tGU1rVmTLEh9VhoMjaGCtQZlAKcB2wtdQLWIHWQ7ox7YlreAf2dwsnYrEaGGBh+" - "oQmkJkDGSRof3QJXkufNZuzDpH/4UmqWvvwvqfVMyvmN/1bbmdUA+KZ161Fdpn/" - "6kRUgOEOH3vpU689vvwFDT7FZ2AEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -12617,43 +12387,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - } - "topLevelSeller": "https://a.test/" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000cd/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAANEfiwgAAAAAAAADhZBNCsIwEEY9RkF0rZt27wVEKAoVD5Amgw1NkziZ/" - "rj0KHXjNS0thaaKLmf4vjePefFUikDkTCSgBeAliauMyLpdFPGQwFHERJhRoYouKKS+" - "7tGU1rVmTLEh9VhoMjaGCtQZlAKcB2wtdQLWIHWQ7ox7YlreAf2dwsnYrEaGGBh+" - "oQmkJkDGSRof3QJXkufNZuzDpH/4UmqWvvwvqfVMyvmN/1bbmdUA+KZ161Fdpn/" - "6kRUgOEOH3vpU689vvwFDT7FZ2AEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/localWinner", /*response=*/""); @@ -13036,46 +12770,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "bidCurrency":"XAU", - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - }, - "topLevelSeller": "https://a.test/", - "adMetadata": "\"foo\"" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000dc/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAOwfiwgAAAAAAAADhZCxbsIwEED7GUhVGZjahezdUIeqUmilVEhdD98VTBzbPV8gjHwK" - "bPwlFlEknCIYfbr3/" - "HRHNdc4wBXglAQQBGj069yoBCzIIvGsyNdLER9es0yNhYJkgOOlVKaM5FvNTFZt1c9kVsU3a" - "rt4Z1f7sHcdBS21e7DifE5rMt9kDHF/" - "wW+0Lcg7liiJ34YDz+stcTozfPFsnjoHto4UaAbaCjEo0S5V70kZrcrmuePpgv+" - "4AjWPafytqGEvKqTE/aqXXlUruJb1d1bFnfPRP6EiVMCBk/HXxv6/9gnuKQ6/+QEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -13201,46 +12896,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "bidCurrency":"XAU", - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - }, - "topLevelSeller": "https://a.test/", - "adMetadata": "\"foo\"" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000dc/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAOwfiwgAAAAAAAADhZCxbsIwEED7GUhVGZjahezdUIeqUmilVEhdD98VTBzbPV8gjHwK" - "bPwlFlEknCIYfbr3/" - "HRHNdc4wBXglAQQBGj069yoBCzIIvGsyNdLER9es0yNhYJkgOOlVKaM5FvNTFZt1c9kVsU3a" - "rt4Z1f7sHcdBS21e7DifE5rMt9kDHF/" - "wW+0Lcg7liiJ34YDz+stcTozfPFsnjoHto4UaAbaCjEo0S5V70kZrcrmuePpgv+" - "4AjWPafytqGEvKqTE/aqXXlUruJb1d1bFnfPRP6EiVMCBk/HXxv6/9gnuKQ6/+QEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -13340,46 +12996,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "bidCurrency":"XAU", - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - }, - "topLevelSeller": "https://a.test/", - "adMetadata": "\"foo\"" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000dc/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAOwfiwgAAAAAAAADhZCxbsIwEED7GUhVGZjahezdUIeqUmilVEhdD98VTBzbPV8gjHwK" - "bPwlFlEknCIYfbr3/" - "HRHNdc4wBXglAQQBGj069yoBCzIIvGsyNdLER9es0yNhYJkgOOlVKaM5FvNTFZt1c9kVsU3a" - "rt4Z1f7sHcdBS21e7DifE5rMt9kDHF/" - "wW+0Lcg7liiJ34YDz+stcTozfPFsnjoHto4UaAbaCjEo0S5V70kZrcrmuePpgv+" - "4AjWPafytqGEvKqTE/aqXXlUruJb1d1bFnfPRP6EiVMCBk/HXxv6/9gnuKQ6/+QEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/""); @@ -13479,46 +13096,7 @@ AdAuctionRequestContext* request_context = page_data->GetContextForAdAuctionRequest(*auction_data->request_id); - std::string response; - // CBOR response computed using https://cbor.me/ - /* Response: - { - "adRenderURL":"https://c.test/ad.html", - "interestGroupName":"cars", - "interestGroupOwner":"https://a.test/", - "biddingGroups": { - "https://a.test/": [0] - }, - "bid": 100, - "bidCurrency":"XAU", - "winReportingURLs": { - "buyerReportingURLs": { - "reportingURL": "https://d.test/buyerReporting", - "interactionReportingURLs": { - "click": "https://e.test/buyerInteractionReporting" - } - }, - "topLevelSellerReportingURLs": { - "reportingURL": "https://d.test/sellerReporting", - "interactionReportingURLs": { - "click": "https://e.test/sellerInteractionReporting" - } - } - }, - "topLevelSeller": "https://a.test/", - "adMetadata": "\"foo\"" - } - */ - // Converted to base64 with `cat | sed 's/#.*//' | xxd -r -p | gzip | - // xxd -ps -c 0 | sed 's/^/02000000dc/' | xxd -r -p | base64` - ASSERT_TRUE(base::Base64Decode( - "AgAAAOwfiwgAAAAAAAADhZCxbsIwEED7GUhVGZjahezdUIeqUmilVEhdD98VTBzbPV8gjHwK" - "bPwlFlEknCIYfbr3/" - "HRHNdc4wBXglAQQBGj069yoBCzIIvGsyNdLER9es0yNhYJkgOOlVKaM5FvNTFZt1c9kVsU3a" - "rt4Z1f7sHcdBS21e7DifE5rMt9kDHF/" - "wW+0Lcg7liiJ34YDz+stcTozfPFsnjoHto4UaAbaCjEo0S5V70kZrcrmuePpgv+" - "4AjWPafytqGEvKqTE/aqXXlUruJb1d1bFnfPRP6EiVMCBk/HXxv6/9gnuKQ6/+QEAAA==", - &response)); + std::string response = GetMultiSellerResponse(); network_responder_->RegisterReportResponse("/buyerReporting", /*response=*/"");
diff --git a/content/browser/interest_group/bidding_and_auction_response.cc b/content/browser/interest_group/bidding_and_auction_response.cc index 485a382..52e0d91 100644 --- a/content/browser/interest_group/bidding_and_auction_response.cc +++ b/content/browser/interest_group/bidding_and_auction_response.cc
@@ -167,10 +167,17 @@ if (buyer_reporting) { output.buyer_reporting = ReportingURLs::TryParse(buyer_reporting); } - base::Value::Dict* seller_reporting = + base::Value::Dict* top_level_seller_reporting = win_reporting_urls->FindDict("topLevelSellerReportingURLs"); - if (seller_reporting) { - output.seller_reporting = ReportingURLs::TryParse(seller_reporting); + if (top_level_seller_reporting) { + output.top_level_seller_reporting = + ReportingURLs::TryParse(top_level_seller_reporting); + } + base::Value::Dict* component_seller_reporting = + win_reporting_urls->FindDict("componentSellerReportingURLs"); + if (component_seller_reporting) { + output.component_seller_reporting = + ReportingURLs::TryParse(component_seller_reporting); } } std::string* maybe_top_level_seller =
diff --git a/content/browser/interest_group/bidding_and_auction_response.h b/content/browser/interest_group/bidding_and_auction_response.h index e1a4629..a088a6d 100644 --- a/content/browser/interest_group/bidding_and_auction_response.h +++ b/content/browser/interest_group/bidding_and_auction_response.h
@@ -69,7 +69,10 @@ std::optional<std::string> ad_metadata; std::optional<std::string> error; - std::optional<ReportingURLs> buyer_reporting, seller_reporting; + // The Bidding and Auction server uses the top_level_seller_reporting field + // for single-level auctions. + std::optional<ReportingURLs> buyer_reporting, top_level_seller_reporting, + component_seller_reporting; }; } // namespace content
diff --git a/content/browser/interest_group/bidding_and_auction_response_unittest.cc b/content/browser/interest_group/bidding_and_auction_response_unittest.cc index 355201c..e4fc087 100644 --- a/content/browser/interest_group/bidding_and_auction_response_unittest.cc +++ b/content/browser/interest_group/bidding_and_auction_response_unittest.cc
@@ -88,9 +88,13 @@ (response.buyer_reporting.has_value() ? ToString(*response.buyer_reporting) : "nullopt") + - ", " + "seller_reporting: " + - (response.seller_reporting.has_value() - ? ToString(*response.seller_reporting) + ", " + "top_level_seller_reporting: " + + (response.top_level_seller_reporting.has_value() + ? ToString(*response.top_level_seller_reporting) + : "nullopt") + + ", " + "component_seller_reporting: " + + (response.component_seller_reporting.has_value() + ? ToString(*response.component_seller_reporting) : "nullopt") + ")"; } @@ -156,15 +160,29 @@ "buyer_reporting", &BiddingAndAuctionResponse::buyer_reporting, testing::Eq(std::nullopt))); } - if (other.get().seller_reporting) { + if (other.get().top_level_seller_reporting) { matchers.push_back(testing::Field( - "seller_reporting", &BiddingAndAuctionResponse::seller_reporting, - testing::Optional( - EqualsReportingURLS(std::ref(*other.get().seller_reporting))))); + "top_level_seller_reporting", + &BiddingAndAuctionResponse::top_level_seller_reporting, + testing::Optional(EqualsReportingURLS( + std::ref(*other.get().top_level_seller_reporting))))); } else { + matchers.push_back( + testing::Field("top_level_seller_reporting", + &BiddingAndAuctionResponse::top_level_seller_reporting, + testing::Eq(std::nullopt))); + } + if (other.get().component_seller_reporting) { matchers.push_back(testing::Field( - "seller_reporting", &BiddingAndAuctionResponse::seller_reporting, - testing::Eq(std::nullopt))); + "component_seller_reporting", + &BiddingAndAuctionResponse::component_seller_reporting, + testing::Optional(EqualsReportingURLS( + std::ref(*other.get().component_seller_reporting))))); + } else { + matchers.push_back( + testing::Field("component_seller_reporting", + &BiddingAndAuctionResponse::component_seller_reporting, + testing::Eq(std::nullopt))); } if (other.get().top_level_seller) { matchers.push_back(testing::Field( @@ -391,7 +409,7 @@ "reportingURL", "not a URL")))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); + response.top_level_seller_reporting.emplace(); // ignore the error. return response; }(), @@ -404,7 +422,7 @@ "reportingURL", kUntrustedURL)))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); + response.top_level_seller_reporting.emplace(); // ignore the error. return response; }(), @@ -417,8 +435,9 @@ "reportingURL", kReportingURL)))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); - response.seller_reporting->reporting_url = GURL(kReportingURL); + response.top_level_seller_reporting.emplace(); + response.top_level_seller_reporting->reporting_url = + GURL(kReportingURL); return response; }(), }, @@ -431,7 +450,7 @@ "interactionReportingURLs", "not a dict")))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); + response.top_level_seller_reporting.emplace(); // ignore the error. return response; }(), @@ -446,7 +465,7 @@ base::Value(base::Value::Dict().Set("click", 5)))))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); + response.top_level_seller_reporting.emplace(); // ignore the error. return response; }(), @@ -461,7 +480,7 @@ "click", kUntrustedURL)))))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); + response.top_level_seller_reporting.emplace(); // ignore the error. return response; }(), @@ -476,9 +495,116 @@ "click", kReportingURL)))))))), []() { BiddingAndAuctionResponse response = CreateExpectedValidResponse(); - response.seller_reporting.emplace(); - response.seller_reporting->beacon_urls.emplace("click", - GURL(kReportingURL)); + response.top_level_seller_reporting.emplace(); + response.top_level_seller_reporting->beacon_urls.emplace( + "click", GURL(kReportingURL)); + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", + base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", "not a dict")))), + CreateExpectedValidResponse(), // ignore the error + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "reportingURL", "not a URL")))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + // ignore the error. + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "reportingURL", kUntrustedURL)))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + // ignore the error. + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "reportingURL", kReportingURL)))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + response.component_seller_reporting->reporting_url = + GURL(kReportingURL); + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", + base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "interactionReportingURLs", "not a dict")))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + // ignore the error. + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", + base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "interactionReportingURLs", + base::Value(base::Value::Dict().Set("click", 5)))))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + // ignore the error. + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "interactionReportingURLs", + base::Value(base::Value::Dict().Set( + "click", kUntrustedURL)))))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + // ignore the error. + return response; + }(), + }, + { + base::Value(CreateValidResponseDict().Set( + "winReportingURLs", base::Value(base::Value::Dict().Set( + "componentSellerReportingURLs", + base::Value(base::Value::Dict().Set( + "interactionReportingURLs", + base::Value(base::Value::Dict().Set( + "click", kReportingURL)))))))), + []() { + BiddingAndAuctionResponse response = CreateExpectedValidResponse(); + response.component_seller_reporting.emplace(); + response.component_seller_reporting->beacon_urls.emplace( + "click", GURL(kReportingURL)); return response; }(), },
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc index fcc4921..b096b16 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.cc +++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -263,14 +263,30 @@ blink::FencedFrame::ReportingDestination seller_destination) { reporter_worklet_state_ = ReporterState::kAllWorkletsCompleted; - if (response.seller_reporting) { - const BiddingAndAuctionResponse::ReportingURLs& seller_reporting = - *response.seller_reporting; - // Ignore return value - there's nothing we can do at this point if the - // server did something wrong beyond logging the error. - AddReportResultResult( - auction_config_->seller, seller_reporting.reporting_url, - seller_reporting.beacon_urls, seller_destination, errors_); + if (seller_destination == blink::FencedFrame::ReportingDestination::kSeller) { + if (response.top_level_seller_reporting) { + const BiddingAndAuctionResponse::ReportingURLs& seller_reporting = + *response.top_level_seller_reporting; + // Ignore return value - there's nothing we can do at this point if the + // server did something wrong beyond logging the error. + AddReportResultResult( + auction_config_->seller, seller_reporting.reporting_url, + seller_reporting.beacon_urls, seller_destination, errors_); + } + // TODO(behamilton): Add support for server-orchestrated multi-level + // auctions. They will also have component_seller_reporint. + } else { + DCHECK_EQ(blink::FencedFrame::ReportingDestination::kComponentSeller, + seller_destination); + if (response.component_seller_reporting) { + const BiddingAndAuctionResponse::ReportingURLs& seller_reporting = + *response.component_seller_reporting; + // Ignore return value - there's nothing we can do at this point if the + // server did something wrong beyond logging the error. + AddReportResultResult( + auction_config_->seller, seller_reporting.reporting_url, + seller_reporting.beacon_urls, seller_destination, errors_); + } } if (response.buyer_reporting) { const BiddingAndAuctionResponse::ReportingURLs& buyer_reporting =
diff --git a/content/browser/media/capture/screen_capture_kit_fullscreen_module.h b/content/browser/media/capture/screen_capture_kit_fullscreen_module.h index def9d09..6f23eef2 100644 --- a/content/browser/media/capture/screen_capture_kit_fullscreen_module.h +++ b/content/browser/media/capture/screen_capture_kit_fullscreen_module.h
@@ -8,6 +8,7 @@ #include <CoreGraphics/CoreGraphics.h> #import <ScreenCaptureKit/ScreenCaptureKit.h> +#include "base/memory/raw_ref.h" #import "base/task/single_thread_task_runner.h" #include "base/timer/timer.h" #include "content/common/content_export.h" @@ -74,7 +75,7 @@ const scoped_refptr<base::SingleThreadTaskRunner> device_task_runner_; // Interface to the owner of the SCK stream. - ScreenCaptureKitResetStreamInterface& reset_stream_interface_; + const raw_ref<ScreenCaptureKitResetStreamInterface> reset_stream_interface_; // Identifier of the original window that is captured. const CGWindowID original_window_id_;
diff --git a/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm b/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm index 21c54877..d756023 100644 --- a/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm +++ b/content/browser/media/capture/screen_capture_kit_fullscreen_module.mm
@@ -214,7 +214,7 @@ if (window.windowID == fullscreen_window_id_) { if (!window.isOnScreen) { fullscreen_mode_active_ = false; - reset_stream_interface_.ResetStreamTo(editor_window); + reset_stream_interface_->ResetStreamTo(editor_window); } break; } @@ -229,7 +229,7 @@ // instead. fullscreen_mode_active_ = true; fullscreen_window_id_ = fullscreen_window.windowID; - reset_stream_interface_.ResetStreamTo(fullscreen_window); + reset_stream_interface_->ResetStreamTo(fullscreen_window); } } }
diff --git a/content/browser/network/cross_origin_opener_policy_reporter.h b/content/browser/network/cross_origin_opener_policy_reporter.h index a1525e80..a03321fb 100644 --- a/content/browser/network/cross_origin_opener_policy_reporter.h +++ b/content/browser/network/cross_origin_opener_policy_reporter.h
@@ -82,7 +82,7 @@ bool is_report_only); // See the class comment. - raw_ptr<StoragePartition> storage_partition_; + raw_ptr<StoragePartition, DanglingUntriaged> storage_partition_; base::UnguessableToken reporting_source_; GURL source_url_; GlobalRenderFrameHostId source_routing_id_;
diff --git a/content/browser/renderer_host/back_forward_cache_impl.h b/content/browser/renderer_host/back_forward_cache_impl.h index d7bd45cf..b618d29a 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.h +++ b/content/browser/renderer_host/back_forward_cache_impl.h
@@ -13,7 +13,6 @@ #include "base/feature_list.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" @@ -579,12 +578,8 @@ EvictionInfo(RenderFrameHostImpl& rfh, BackForwardCacheCanStoreDocumentResult* reasons) : rfh_to_be_evicted(&rfh), reasons(reasons) {} - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION RenderFrameHostImpl* const rfh_to_be_evicted; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION const BackForwardCacheCanStoreDocumentResult* reasons; + const raw_ptr<RenderFrameHostImpl> rfh_to_be_evicted; + raw_ptr<const BackForwardCacheCanStoreDocumentResult> reasons; }; NotRestoredReasonBuilder(RenderFrameHostImpl* root_rfh,
diff --git a/content/browser/renderer_host/cursor_manager.h b/content/browser/renderer_host/cursor_manager.h index 73861e59..941cccaf 100644 --- a/content/browser/renderer_host/cursor_manager.h +++ b/content/browser/renderer_host/cursor_manager.h
@@ -70,7 +70,7 @@ // The view currently underneath the cursor, which corresponds to the cursor // currently displayed. - raw_ptr<RenderWidgetHostViewBase> view_under_cursor_; + raw_ptr<RenderWidgetHostViewBase, DanglingUntriaged> view_under_cursor_; // The root view is the target for DisplayCursor calls whenever the active // cursor needs to change.
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc index 2c4b6357..cf46cd1b 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -332,8 +332,11 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(device.display_media_info); - // TODO(crbug.com/1466247): Implement - // GetMediaStreamDeviceObserver()->OnZoomLevelChange(label, device); + if (!base::FeatureList::IsEnabled(blink::features::kCapturedSurfaceControl)) { + return; + } + + GetMediaStreamDeviceObserver()->OnZoomLevelChange(label, device, zoom_level); } void MediaStreamDispatcherHost::OnWebContentsFocused() {
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc index dd8dc4a..43828daa 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -203,6 +203,9 @@ void OnDeviceCaptureHandleChange( const std::string& label, const blink::MediaStreamDevice& device) override {} + void OnZoomLevelChange(const std::string& label, + const blink::MediaStreamDevice& device, + int zoom_level) override {} void OnDeviceRequestStateChange( const std::string& label, const blink::MediaStreamDevice& device,
diff --git a/content/browser/renderer_host/media/media_stream_metrics.cc b/content/browser/renderer_host/media/media_stream_metrics.cc index ec08450..720ef12c 100644 --- a/content/browser/renderer_host/media/media_stream_metrics.cc +++ b/content/browser/renderer_host/media/media_stream_metrics.cc
@@ -33,7 +33,8 @@ kKillSwitchOn = 14, kSystemPermissionDenied = 15, kDeviceInUse = 16, - kMaxValue = kDeviceInUse + kRequestCancelled = 17, + kMaxValue = kRequestCancelled }; MediaStreamRequestResult2 MapResultToResult2( @@ -74,6 +75,8 @@ return MediaStreamRequestResult2::kSystemPermissionDenied; case MediaStreamRequestResult::DEVICE_IN_USE: return MediaStreamRequestResult2::kDeviceInUse; + case MediaStreamRequestResult::REQUEST_CANCELLED: + return MediaStreamRequestResult2::kRequestCancelled; case MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS: break; }
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.cc b/content/browser/renderer_host/page_lifecycle_state_manager.cc index 9b24c54..51a0016 100644 --- a/content/browser/renderer_host/page_lifecycle_state_manager.cc +++ b/content/browser/renderer_host/page_lifecycle_state_manager.cc
@@ -219,9 +219,38 @@ last_acknowledged_state_ = std::move(acknowledged_state); - if (last_acknowledged_state_->is_in_back_forward_cache) + if (last_acknowledged_state_->is_in_back_forward_cache) { did_receive_back_forward_cache_ack_ = true; + // TODO(crbug.com/1521212): currently after the navigation, the old + // RenderViewHost is marked as inactive. + // `RenderViewHostImpl::GetMainRenderFrameHost()` will return nullptr. This + // prevents us from getting the RenderFrameHost even if the main frame of + // this RenderViewHost is stored in BFCache. Now we are getting the + // RenderFrameHost from the BackForwardCacheImpl as a workaround, but + // eventually we might allow getting the RenderFrameHost from a + // RenderViewHost that's in BFCache. + for (auto* entry : + render_view_host_impl_->frame_tree() + ->controller() + .GetBackForwardCache() + .GetEntriesForRenderViewHostImpl(render_view_host_impl_)) { + if (entry->render_frame_host()->LoadedWithCacheControlNoStoreHeader()) { + // If the BFCached document was loaded with "Cache-control: no-store" + // header, we clear the fallback surface and force the browser to embed + // a completely new surface when this page is activated from BFCache. + // This avoids displaying sensitive information between it's restored + // and the `pageshow` handler completes. + RenderWidgetHostViewBase* rwhv = + render_view_host_impl_->GetWidget()->GetRenderWidgetHostViewBase(); + if (rwhv) { + rwhv->InvalidateLocalSurfaceIdAndAllocationGroup(); + rwhv->ClearFallbackSurfaceForCommitPending(); + } + } + } + } + // Call |MaybeEvictFromBackForwardCache| after setting // |last_acknowledged_state_|. // Features which can be cleaned by the page are taken into account only
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 4f2943f..c6884af 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -322,6 +322,10 @@ "EvictOnAXEvents", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kDoNotEvictOnAXLocationChange, + "DoNotEvictOnAXLocationChange", + base::FEATURE_DISABLED_BY_DEFAULT); + // TODO(https://crbug.com/1502760): This is a kill switch landed in M122. Please // remove after M124. BASE_FEATURE(kForceBrowserInitiatedPageClose, @@ -7222,7 +7226,15 @@ // accessibility events without evicting unless the kEvictOnAXEvents flag // is on. if (!base::FeatureList::IsEnabled(features::kEvictOnAXEvents)) - DCHECK_NE(reason, kAXEvent); + CHECK_NE(reason, kAXEvent); + // This function should not be called with kAXLocationChange when the + // page is in back/forward cache, because `HandleAXLocationChange()` will + // continue to process accessibility location changes unless + // kDoNotEvictOnAXLocationChange is off. + if (base::FeatureList::IsEnabled( + features::kDoNotEvictOnAXLocationChange)) { + CHECK_NE(reason, kAXLocationChange); + } BackForwardCacheCanStoreDocumentResult can_store_flat; can_store_flat.NoDueToDisallowActivation(reason); EvictFromBackForwardCacheWithFlattenedReasons(can_store_flat); @@ -9469,9 +9481,12 @@ return; } - if (IsInactiveAndDisallowActivation( - DisallowActivationReasonId::kAXLocationChange)) { - return; + if (!base::FeatureList::IsEnabled(features::kDoNotEvictOnAXLocationChange)) { + // If the flag is off, we should evict the back/forward cache entry. + if (IsInactiveAndDisallowActivation( + DisallowActivationReasonId::kAXLocationChange)) { + return; + } } BrowserAccessibilityManager* manager =
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index ae20ccc6..074b45d 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -243,6 +243,9 @@ // Feature to evict when accessibility events occur while in back/forward cache. CONTENT_EXPORT BASE_DECLARE_FEATURE(kEvictOnAXEvents); + +CONTENT_EXPORT BASE_DECLARE_FEATURE(kDoNotEvictOnAXLocationChange); + } // namespace features namespace content { @@ -3219,6 +3222,9 @@ BlockNameUpdateForBackForwardCache); FRIEND_TEST_ALL_PREFIXES(RenderFrameHostImplBrowserTest, BlockNameUpdateForPendingDelete); + FRIEND_TEST_ALL_PREFIXES( + BackForwardCacheBrowserTestWithFlagForAXLocationChange, + EvictOnAXLocationChangeOrNot); FRIEND_TEST_ALL_PREFIXES(BackForwardCacheBrowsingContextStateBrowserTest, SlowUnloadHandlerInIframe); FRIEND_TEST_ALL_PREFIXES(RenderFrameHostImplBrowserTest,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 70648c1e..908684c 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3525,6 +3525,7 @@ blink::switches::kDisablePreferCompositingToLCDText, blink::switches::kDisableRGBA4444Textures, blink::switches::kDisableThrottleNonVisibleCrossOriginIframes, + blink::switches::kEnableLeakDetectionHeapSnapshot, blink::switches::kEnableLowResTiling, blink::switches::kEnablePreferCompositingToLCDText, blink::switches::kEnableRGBA4444Textures, @@ -3560,39 +3561,39 @@ switches::kRunAllCompositorStagesBeforeDraw, #if BUILDFLAG(ENABLE_PPAPI) - switches::kEnablePepperTesting, + switches::kEnablePepperTesting, #endif - switches::kDisableWebRtcHWDecoding, - switches::kDisableWebRtcHWEncoding, - switches::kEnableWebRtcSrtpEncryptedHeaders, - switches::kEnforceWebRtcIPPermissionCheck, - switches::kWebRtcMaxCaptureFramerate, - switches::kEnableLowEndDeviceMode, - switches::kDisableLowEndDeviceMode, - switches::kDisallowNonExactResourceReuse, + switches::kDisableWebRtcHWDecoding, + switches::kDisableWebRtcHWEncoding, + switches::kEnableWebRtcSrtpEncryptedHeaders, + switches::kEnforceWebRtcIPPermissionCheck, + switches::kWebRtcMaxCaptureFramerate, + switches::kEnableLowEndDeviceMode, + switches::kDisableLowEndDeviceMode, + switches::kDisallowNonExactResourceReuse, #if BUILDFLAG(IS_ANDROID) - switches::kDisableMediaSessionAPI, - switches::kRendererWaitForJavaDebugger, + switches::kDisableMediaSessionAPI, + switches::kRendererWaitForJavaDebugger, #endif #if BUILDFLAG(IS_WIN) - switches::kDisableHighResTimer, - switches::kTrySupportedChannelLayouts, - switches::kRaiseTimerFrequency, + switches::kDisableHighResTimer, + switches::kTrySupportedChannelLayouts, + switches::kRaiseTimerFrequency, #endif #if BUILDFLAG(IS_OZONE) - switches::kOzonePlatform, + switches::kOzonePlatform, #endif #if defined(ENABLE_IPC_FUZZER) - switches::kIpcDumpDirectory, - switches::kIpcFuzzerTestcase, + switches::kIpcDumpDirectory, + switches::kIpcFuzzerTestcase, #endif #if BUILDFLAG(IS_CHROMEOS) - switches::kSchedulerBoostUrgent, + switches::kSchedulerBoostUrgent, #endif #if BUILDFLAG(IS_CHROMEOS_LACROS) - switches::kLacrosEnablePlatformHevc, - switches::kLacrosUseChromeosProtectedMedia, - switches::kLacrosUseChromeosProtectedAv1, + switches::kLacrosEnablePlatformHevc, + switches::kLacrosUseChromeosProtectedMedia, + switches::kLacrosUseChromeosProtectedAv1, #endif }; renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames);
diff --git a/content/browser/renderer_host/render_widget_host_view_ios.h b/content/browser/renderer_host/render_widget_host_view_ios.h index f97b1ed..d36b4e56 100644 --- a/content/browser/renderer_host/render_widget_host_view_ios.h +++ b/content/browser/renderer_host/render_widget_host_view_ios.h
@@ -74,9 +74,9 @@ void Hide() override; bool IsShowing() override; gfx::Rect GetViewBounds() override; - blink::mojom::PointerLockResult LockMouse(bool) override; - blink::mojom::PointerLockResult ChangeMouseLock(bool) override; - void UnlockMouse() override; + blink::mojom::PointerLockResult LockPointer(bool) override; + blink::mojom::PointerLockResult ChangePointerLock(bool) override; + void UnlockPointer() override; void EnsureSurfaceSynchronizedForWebTest() override; uint32_t GetCaptureSequenceNumber() const override; void TakeFallbackContentFrom(RenderWidgetHostView* view) override; @@ -234,11 +234,11 @@ // mouse position just as mouse lock was entered; the movement they report // indicates what the change in position of the mouse would be had it not been // locked. - bool mouse_locked_ = false; + bool pointer_locked_ = false; // Tracks whether unaccelerated mouse motion events are sent while the mouse // is locked. - bool mouse_lock_unadjusted_movement_ = false; + bool pointer_lock_unadjusted_movement_ = false; // Latest capture sequence number which is incremented when the caller // requests surfaces be synchronized via
diff --git a/content/browser/renderer_host/render_widget_host_view_ios.mm b/content/browser/renderer_host/render_widget_host_view_ios.mm index 862f57fe..c443a7f 100644 --- a/content/browser/renderer_host/render_widget_host_view_ios.mm +++ b/content/browser/renderer_host/render_widget_host_view_ios.mm
@@ -444,13 +444,14 @@ gfx::Rect RenderWidgetHostViewIOS::GetViewBounds() { return view_bounds_; } -blink::mojom::PointerLockResult RenderWidgetHostViewIOS::LockMouse(bool) { +blink::mojom::PointerLockResult RenderWidgetHostViewIOS::LockPointer(bool) { return {}; } -blink::mojom::PointerLockResult RenderWidgetHostViewIOS::ChangeMouseLock(bool) { +blink::mojom::PointerLockResult RenderWidgetHostViewIOS::ChangePointerLock( + bool) { return {}; } -void RenderWidgetHostViewIOS::UnlockMouse() {} +void RenderWidgetHostViewIOS::UnlockPointer() {} uint32_t RenderWidgetHostViewIOS::GetCaptureSequenceNumber() const { return latest_capture_sequence_number_; @@ -780,7 +781,7 @@ // if (HasFocus()) // SetTextInputActive(active); if (!active) { - UnlockMouse(); + UnlockPointer(); } }
diff --git a/content/browser/renderer_host/text_input_client_mac_unittest.mm b/content/browser/renderer_host/text_input_client_mac_unittest.mm index 7616ca3..8df2f4c5 100644 --- a/content/browser/renderer_host/text_input_client_mac_unittest.mm +++ b/content/browser/renderer_host/text_input_client_mac_unittest.mm
@@ -11,6 +11,7 @@ #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" #include "base/test/scoped_feature_list.h" @@ -130,14 +131,12 @@ class ScopedTestingThread { public: ScopedTestingThread(TextInputClientMacTest* test) : thread_(test->thread_) { - thread_.Start(); + thread_->Start(); } - ~ScopedTestingThread() { - thread_.Stop(); - } + ~ScopedTestingThread() { thread_->Stop(); } private: - base::Thread& thread_; + const raw_ref<base::Thread> thread_; }; } // namespace
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.h b/content/browser/scheduler/browser_ui_thread_scheduler.h index 8a436a62..ea58ab9 100644 --- a/content/browser/scheduler/browser_ui_thread_scheduler.h +++ b/content/browser/scheduler/browser_ui_thread_scheduler.h
@@ -7,7 +7,7 @@ #include <memory> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/task/sequence_manager/task_queue.h" #include "base/time/time.h" #include "content/browser/scheduler/browser_task_queues.h" @@ -41,9 +41,7 @@ void MoveFrom(UserInputActiveHandle* other); // Only this constructor actually creates a UserInputActiveHandle that will // inform scheduling decisions. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION BrowserUIThreadScheduler* scheduler_ = nullptr; + raw_ptr<BrowserUIThreadScheduler> scheduler_ = nullptr; }; enum ScrollState { kGestureScrollActive, kFlingActive, kNone };
diff --git a/content/browser/scheduler/responsiveness/jank_monitor_impl.h b/content/browser/scheduler/responsiveness/jank_monitor_impl.h index 4b0afb1..d25d4d3a 100644 --- a/content/browser/scheduler/responsiveness/jank_monitor_impl.h +++ b/content/browser/scheduler/responsiveness/jank_monitor_impl.h
@@ -88,8 +88,8 @@ ~TaskMetadata(); base::TimeTicks execution_start_time; - // Not a raw_ptr<...> for performance reasons: based on analysis of - // sampling profiler data (JankMonitorImpl::WillRunTaskOrEvent -> + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data (JankMonitorImpl::WillRunTaskOrEvent -> // JankMonitorImpl::ThreadExecutionState::WillRunTaskOrEvent -> emplaces // TaskMetadata in a vector). RAW_PTR_EXCLUSION const void* identifier;
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index fcfb35c..6f60cbd9 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -6308,12 +6308,14 @@ } class ServiceWorkerAutoPreloadBrowserTest - : public ServiceWorkerRaceNetworkRequestBrowserTest { + : public ServiceWorkerRaceNetworkRequestBrowserTest, + public testing::WithParamInterface<bool> { public: ServiceWorkerAutoPreloadBrowserTest() { - feature_list_.InitWithFeatures( - {features::kServiceWorkerAutoPreload}, - {features::kServiceWorkerBypassFetchHandler}); + feature_list_.InitWithFeaturesAndParameters( + {{features::kServiceWorkerAutoPreload, + {{"use_two_phase_write", GetParam() ? "true" : "false"}}}}, + {{features::kServiceWorkerBypassFetchHandler}}); RaceNetworkRequestWriteBufferManager::SetDataPipeCapacityBytesForTesting( 1024); } @@ -6324,7 +6326,11 @@ base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +INSTANTIATE_TEST_SUITE_P(ALL, + ServiceWorkerAutoPreloadBrowserTest, + testing::Bool()); + +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, NetworkRequestRepliedFirstButFetchHandlerResultIsUsed) { // Register the ServiceWorker and navigate to the in scope URL. SetupAndRegisterServiceWorker(); @@ -6357,7 +6363,7 @@ observer.GetNormalizedResponseHeader("X-Response-From")); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, PassThrough) { +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, PassThrough) { // Register the ServiceWorker and navigate to the in scope URL. SetupAndRegisterServiceWorker(); // Capture the response head. @@ -6381,7 +6387,7 @@ EXPECT_EQ(1, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, PassThrough_LargeData) { SetupAndRegisterServiceWorker(); const std::string relative_url = @@ -6406,7 +6412,7 @@ observer.GetNormalizedResponseHeader("X-Response-From")); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, NetworkRequest_Wins_FetchHandler_Fallback) { // Register the ServiceWorker and navigate to the in scope URL. SetupAndRegisterServiceWorker(); @@ -6428,7 +6434,7 @@ EXPECT_EQ(2, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, FetchHandler_Wins_Fallback) { // Register the ServiceWorker and navigate to the in scope URL. SetupAndRegisterServiceWorker(); @@ -6449,7 +6455,7 @@ EXPECT_EQ(2, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F( +IN_PROC_BROWSER_TEST_P( ServiceWorkerAutoPreloadBrowserTest, Subresource_NetworkRequestRepliedFirstButFetchHandlerResultIsUsed) { SetupAndRegisterServiceWorker(); @@ -6472,7 +6478,7 @@ EXPECT_EQ(1, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, Subresource_PassThrough) { SetupAndRegisterServiceWorker(); ReloadBlockUntilNavigationsComplete(shell(), 1); @@ -6493,7 +6499,7 @@ EXPECT_EQ(1, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, Subresource_PassThrough_LargeData) { SetupAndRegisterServiceWorker(); ReloadBlockUntilNavigationsComplete(shell(), 1); @@ -6513,7 +6519,7 @@ EXPECT_EQ(1, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, Subresource_NetworkRequest_Wins_FetchHandler_Fallback) { SetupAndRegisterServiceWorker(); ReloadBlockUntilNavigationsComplete(shell(), 1); @@ -6531,7 +6537,7 @@ EXPECT_EQ(1, GetRequestCount(relative_url)); } -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadBrowserTest, +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadBrowserTest, Subresource_FetchHandler_Wins_Fallback) { SetupAndRegisterServiceWorker(); ReloadBlockUntilNavigationsComplete(shell(), 1); @@ -6556,7 +6562,8 @@ feature_list_.InitWithFeaturesAndParameters( { {features::kServiceWorkerAutoPreload, - {{"blocked_hosts", blocked_host()}}}, + {{"blocked_hosts", blocked_host()}, + {"use_two_phase_write", GetParam() ? "true" : "false"}}}, }, {}); } @@ -6578,7 +6585,11 @@ base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F(ServiceWorkerAutoPreloadWithBlockedHostsBrowserTest, +INSTANTIATE_TEST_SUITE_P(ALL, + ServiceWorkerAutoPreloadWithBlockedHostsBrowserTest, + testing::Bool()); + +IN_PROC_BROWSER_TEST_P(ServiceWorkerAutoPreloadWithBlockedHostsBrowserTest, BlockedHosts) { // Register the ServiceWorker and navigate to the in scope URL. SetupAndRegisterServiceWorker(); @@ -6604,10 +6615,9 @@ public: ServiceWorkerAutoPreloadWithEnableSubresourcePreloadBrowserTest() { feature_list_.InitWithFeaturesAndParameters( - { - {features::kServiceWorkerAutoPreload, - {{"enable_subresource_preload", "false"}}}, - }, + {{features::kServiceWorkerAutoPreload, + {{"enable_subresource_preload", "false"}, + {"use_two_phase_write", GetParam() ? "true" : "false"}}}}, {}); RaceNetworkRequestWriteBufferManager::SetDataPipeCapacityBytesForTesting( 1024); @@ -6617,7 +6627,12 @@ base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F( +INSTANTIATE_TEST_SUITE_P( + ALL, + ServiceWorkerAutoPreloadWithEnableSubresourcePreloadBrowserTest, + testing::Bool()); + +IN_PROC_BROWSER_TEST_P( ServiceWorkerAutoPreloadWithEnableSubresourcePreloadBrowserTest, Disabled) { SetupAndRegisterServiceWorker(); @@ -6661,10 +6676,9 @@ public: ServiceWorkerAutoPreloadWithEnableOnlyWhenSWNotRunningBrowserTest() { feature_list_.InitWithFeaturesAndParameters( - { - {features::kServiceWorkerAutoPreload, - {{"enable_only_when_service_worker_not_running", "true"}}}, - }, + {{features::kServiceWorkerAutoPreload, + {{"enable_only_when_service_worker_not_running", "true"}, + {"use_two_phase_write", GetParam() ? "true" : "false"}}}}, {}); RaceNetworkRequestWriteBufferManager::SetDataPipeCapacityBytesForTesting( 1024); @@ -6674,7 +6688,12 @@ base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F( +INSTANTIATE_TEST_SUITE_P( + ALL, + ServiceWorkerAutoPreloadWithEnableOnlyWhenSWNotRunningBrowserTest, + testing::Bool()); + +IN_PROC_BROWSER_TEST_P( ServiceWorkerAutoPreloadWithEnableOnlyWhenSWNotRunningBrowserTest, NotRunning) { // Ensure the ServiceWorker is stopped. @@ -6701,7 +6720,7 @@ observer.GetNormalizedResponseHeader("X-Response-From")); } -IN_PROC_BROWSER_TEST_F( +IN_PROC_BROWSER_TEST_P( ServiceWorkerAutoPreloadWithEnableOnlyWhenSWNotRunningBrowserTest, Running) { // Ensure the ServiceWorker is running.
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc index 4956d30..ad7425b 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -527,6 +527,10 @@ switch (active_version->EffectiveFetchHandlerType()) { case ServiceWorkerVersion::FetchHandlerType::kNoHandler: { + // When we have non-fetch router rules, we cannot skip service worker. + if (active_version->HasRouterWithNonFetchEventSource()) { + break; + } RecordSkipReason(FetchHandlerSkipReason::kNoFetchHandler); TRACE_EVENT_WITH_FLOW1( "ServiceWorker", @@ -538,6 +542,10 @@ return; } case ServiceWorkerVersion::FetchHandlerType::kEmptyFetchHandler: { + // When we have non-fetch router rules, we cannot skip service worker. + if (active_version->HasRouterWithNonFetchEventSource()) { + break; + } RecordSkipReason(FetchHandlerSkipReason::kSkippedForEmptyFetchHandler); TRACE_EVENT_WITH_FLOW2( "ServiceWorker",
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 28769be..1f27a42 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -3068,6 +3068,13 @@ return false; } +bool ServiceWorkerVersion::HasRouterWithNonFetchEventSource() const { + if (!router_evaluator_) { + return false; + } + return router_evaluator_->has_non_fetch_event_source(); +} + void ServiceWorkerVersion::GetAssociatedInterface( const std::string& name, mojo::PendingAssociatedReceiver<blink::mojom::AssociatedInterface>
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index cb8cc98..0e59d046e 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -734,6 +734,10 @@ // enabled or having a valid trial token. bool IsStaticRouterEnabled(); + // Check if the static routing API is used for this worker and the registered + // routers have the sources other than 'fetch-event'. + bool HasRouterWithNonFetchEventSource() const; + // Timeout for a request to be handled. static constexpr base::TimeDelta kRequestTimeout = base::Minutes(5);
diff --git a/content/browser/tracing/cros_tracing_agent.cc b/content/browser/tracing/cros_tracing_agent.cc index 6d9526e..3623029a 100644 --- a/content/browser/tracing/cros_tracing_agent.cc +++ b/content/browser/tracing/cros_tracing_agent.cc
@@ -11,7 +11,6 @@ #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/ref_counted_memory.h" #include "base/no_destructor.h" #include "base/sequence_checker.h" @@ -92,9 +91,7 @@ } bool is_tracing_ = false; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION ash::DebugDaemonClient* debug_daemon_ = nullptr; + raw_ptr<ash::DebugDaemonClient> debug_daemon_ = nullptr; }; namespace {
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 5a5b3c0..029750b 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -193,8 +193,6 @@ #if BUILDFLAG(IS_ANDROID) {wf::EnableAccessibilityPageZoom, raw_ref(features::kAccessibilityPageZoom)}, - {wf::EnableAutoDisableAccessibilityV2, - raw_ref(features::kAutoDisableAccessibilityV2)}, #endif {wf::EnableAccessibilityUseAXPositionForDocumentMarkers, raw_ref(features::kUseAXPositionForDocumentMarkers)},
diff --git a/content/common/service_worker/race_network_request_url_loader_client.cc b/content/common/service_worker/race_network_request_url_loader_client.cc index ece49eb..1d7d2e0 100644 --- a/content/common/service_worker/race_network_request_url_loader_client.cc +++ b/content/common/service_worker/race_network_request_url_loader_client.cc
@@ -382,33 +382,35 @@ } void ServiceWorkerRaceNetworkRequestURLLoaderClient::WatchDataUpdate() { + auto callback_func = + base::GetFieldTrialParamByFeatureAsBool( + features::kServiceWorkerAutoPreload, "use_two_phase_write", true) + ? &ServiceWorkerRaceNetworkRequestURLLoaderClient:: + ReadAndTwoPhaseWrite + : &ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndWrite; + body_consumer_watcher_.Watch( body_.get(), MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, - base::BindRepeating( - &ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndWrite, - weak_factory_.GetWeakPtr())); + base::BindRepeating(callback_func, weak_factory_.GetWeakPtr())); body_consumer_watcher_.ArmOrNotify(); - write_buffer_manager_for_race_network_request_.Watch(base::BindRepeating( - &ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndWrite, - weak_factory_.GetWeakPtr())); - write_buffer_manager_for_fetch_handler_.Watch(base::BindRepeating( - &ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndWrite, - weak_factory_.GetWeakPtr())); + write_buffer_manager_for_race_network_request_.Watch( + base::BindRepeating(callback_func, weak_factory_.GetWeakPtr())); + write_buffer_manager_for_fetch_handler_.Watch( + base::BindRepeating(callback_func, weak_factory_.GetWeakPtr())); } -void ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndWrite( +void ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndTwoPhaseWrite( MojoResult result) { std::optional<base::span<const char>> read_buffer = StartReadData(result); if (!read_buffer.has_value()) { return; } - uint32_t num_bytes_to_consume = 0; + if (write_buffer_manager_for_race_network_request_.IsWatching() && write_buffer_manager_for_fetch_handler_.IsWatching()) { // If both data pipes are watched, write data to both pipes. Cancel writing // process if one of them is failed. - result = write_buffer_manager_for_race_network_request_.BeginWriteData(); RecordMojoResultForWrite(result); switch (result) { @@ -517,6 +519,100 @@ CompleteReadData(num_bytes_to_consume); } +void ServiceWorkerRaceNetworkRequestURLLoaderClient::ReadAndWrite( + MojoResult result) { + std::optional<base::span<const char>> read_buffer = StartReadData(result); + if (!read_buffer.has_value()) { + return; + } + + if (write_buffer_manager_for_race_network_request_.IsWatching() && + write_buffer_manager_for_fetch_handler_.IsWatching()) { + // If both data pipes are watched, write data to both pipes. + result = write_buffer_manager_for_race_network_request_.WriteData( + read_buffer.value()); + RecordMojoResultForWrite(result); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + body_->EndReadData(0); + // The data pipe consumer is aborted. + TransitionState(State::kAborted); + Abort(); + return; + case MOJO_RESULT_SHOULD_WAIT: + // The data pipe is not writable yet. We don't consume data from |body_| + // and write any data in this case. And retry it later. + body_->EndReadData(0); + write_buffer_manager_for_race_network_request_.ArmOrNotify(); + return; + } + result = + write_buffer_manager_for_fetch_handler_.WriteData(read_buffer.value()); + RecordMojoResultForWrite(result); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + body_->EndReadData(0); + TransitionState(State::kAborted); + Abort(); + return; + case MOJO_RESULT_SHOULD_WAIT: + // When the data pipe returns MOJO_RESULT_SHOULD_WAIT, the data pipe is + // not consumed yet but the buffer is full. Stop processing the data + // pipe for the fetch handler side, not to make the data transfer + // process for the race network request side being stuck. + body_->EndReadData(read_buffer.value().size()); + write_buffer_manager_for_fetch_handler_.CancelWatching(); + write_buffer_manager_for_race_network_request_.ArmOrNotify(); + return; + } + CHECK_EQ(write_buffer_manager_for_race_network_request_.num_bytes_written(), + write_buffer_manager_for_fetch_handler_.num_bytes_written()); + } else if (write_buffer_manager_for_race_network_request_.IsWatching()) { + // If the data pipe for RaceNetworkRequest is the only watcher, don't write + // data to the data pipe for the fetch handler. + result = write_buffer_manager_for_race_network_request_.WriteData( + read_buffer.value()); + RecordMojoResultForWrite(result); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + body_->EndReadData(0); + TransitionState(State::kAborted); + Abort(); + return; + case MOJO_RESULT_SHOULD_WAIT: + body_->EndReadData(0); + write_buffer_manager_for_race_network_request_.ArmOrNotify(); + return; + } + } else if (write_buffer_manager_for_fetch_handler_.IsWatching()) { + // If the data pipe for the fetch handler is the only watcher, don't write + // data to the data pipe for RaceNetworkRequest. + result = + write_buffer_manager_for_fetch_handler_.WriteData(read_buffer.value()); + RecordMojoResultForWrite(result); + switch (result) { + case MOJO_RESULT_OK: + break; + case MOJO_RESULT_FAILED_PRECONDITION: + body_->EndReadData(0); + TransitionState(State::kAborted); + Abort(); + return; + case MOJO_RESULT_SHOULD_WAIT: + body_->EndReadData(0); + write_buffer_manager_for_fetch_handler_.ArmOrNotify(); + return; + } + } + CompleteReadData(read_buffer.value().size()); +} + std::optional<base::span<const char>> ServiceWorkerRaceNetworkRequestURLLoaderClient::StartReadData( MojoResult initial_mojo_result) {
diff --git a/content/common/service_worker/race_network_request_url_loader_client.h b/content/common/service_worker/race_network_request_url_loader_client.h index 98a7c59..680fa680 100644 --- a/content/common/service_worker/race_network_request_url_loader_client.h +++ b/content/common/service_worker/race_network_request_url_loader_client.h
@@ -194,7 +194,17 @@ // process, and there could be the case if the response is not returned due to // the long fetch handler execution. and test case the mechanism to wait for // the fetch handler - void ReadAndWrite(MojoResult mojo_result); + void ReadAndTwoPhaseWrite(MojoResult result); + // Reads data from |body_|, and writes it into the data pipe producer handles + // for both the race network request and the fetch handler respectively. + // + // Unlike |ReadAndTwoPhaseWrite()|, this doesn't use two-phase operations to + // write data into data pipes. However, the result should be the same as + // |ReadAndTwoPhaseWrite()| because mojo's |WriteData()| is expected to write + // the same amount of data from the given data pipe consumer handle to read. + // also |ReadAndWrite()| has CHECK to guarantee that the actual written sizes + // to data pips are exactly same. + void ReadAndWrite(MojoResult result); // Begins a two-phase read from |body_|, the data pipe consumer. If succeed, // the read buffer is returned. If there are no data to read from the data // pipe, this internally calls |OnDataTransferComplete()| and return nothing.
diff --git a/content/common/service_worker/race_network_request_write_buffer_manager.cc b/content/common/service_worker/race_network_request_write_buffer_manager.cc index 76bc73a..3ec6afe 100644 --- a/content/common/service_worker/race_network_request_write_buffer_manager.cc +++ b/content/common/service_worker/race_network_request_write_buffer_manager.cc
@@ -96,6 +96,17 @@ void RaceNetworkRequestWriteBufferManager::ArmOrNotify() { watcher_.ArmOrNotify(); } + +MojoResult RaceNetworkRequestWriteBufferManager::WriteData( + base::span<const char> read_buffer) { + uint32_t num_bytes = read_buffer.size(); + MojoResult result = producer_->WriteData(read_buffer.data(), &num_bytes, + MOJO_WRITE_DATA_FLAG_NONE); + num_bytes_written_ += num_bytes; + + return result; +} + size_t RaceNetworkRequestWriteBufferManager::CopyAndCompleteWriteData( base::span<const char> read_buffer) { return CopyAndCompleteWriteDataWithSize(read_buffer, read_buffer.size());
diff --git a/content/common/service_worker/race_network_request_write_buffer_manager.h b/content/common/service_worker/race_network_request_write_buffer_manager.h index ad9ea13..5f6cf48f 100644 --- a/content/common/service_worker/race_network_request_write_buffer_manager.h +++ b/content/common/service_worker/race_network_request_write_buffer_manager.h
@@ -34,8 +34,10 @@ void CancelWatching(); MojoResult BeginWriteData(); MojoResult EndWriteData(uint32_t num_bytes_written); + MojoResult WriteData(base::span<const char> read_buffer); void ArmOrNotify(); size_t buffer_size() const { return buffer_.size(); } + size_t num_bytes_written() const { return num_bytes_written_; } size_t CopyAndCompleteWriteData(base::span<const char> read_buffer); size_t CopyAndCompleteWriteDataWithSize(base::span<const char> read_buffer, size_t max_num_bytes_to_consume); @@ -53,6 +55,7 @@ mojo::ScopedDataPipeConsumerHandle consumer_; base::span<char> buffer_; mojo::SimpleWatcher watcher_; + size_t num_bytes_written_ = 0; }; } // namespace content
diff --git a/content/common/service_worker/service_worker_router_evaluator.cc b/content/common/service_worker/service_worker_router_evaluator.cc index ec57dcd0..1474da3 100644 --- a/content/common/service_worker/service_worker_router_evaluator.cc +++ b/content/common/service_worker/service_worker_router_evaluator.cc
@@ -607,6 +607,10 @@ return; } need_running_status_ |= rule->need_running_status(); + for (const auto& s : r.sources) { + has_non_fetch_event_source_ |= + (s.type != blink::ServiceWorkerRouterSource::Type::kFetchEvent); + } compiled_rules_.emplace_back(std::move(rule)); } RecordSetupError(ServiceWorkerRouterEvaluatorErrorEnums::kNoError);
diff --git a/content/common/service_worker/service_worker_router_evaluator.h b/content/common/service_worker/service_worker_router_evaluator.h index 56b4477..e39eb5cb 100644 --- a/content/common/service_worker/service_worker_router_evaluator.h +++ b/content/common/service_worker/service_worker_router_evaluator.h
@@ -44,6 +44,9 @@ const blink::ServiceWorkerRouterRules& rules() const { return rules_; } bool need_running_status() const { return need_running_status_; } + bool has_non_fetch_event_source() const { + return has_non_fetch_event_source_; + } base::Value ToValue() const; std::string ToString() const; @@ -59,6 +62,7 @@ std::vector<std::unique_ptr<RouterRule>> compiled_rules_; bool is_valid_ = false; bool need_running_status_ = false; + bool has_non_fetch_event_source_ = false; }; } // namespace content
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java index 3dfb218..ad1b198 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java
@@ -135,7 +135,8 @@ TraceEvent.begin("AccessibilityHistogramRecorder.onDisabledCalled"); // To disable accessibility, it needs to have been previously initialized. assert mTimeOfNativeInitialization > 0 - : "Accessibility onDisabled was called, but accessibility has not been initialized."; + : "Accessibility onDisabled was called, but accessibility has not been" + + " initialized."; long now = SystemClock.elapsedRealtime(); // As we disable accessibility, we want to record how long it had been enabled. @@ -377,13 +378,8 @@ USAGE_ACCESSIBILITY_ALWAYS_ON_TIME, now - mTimeOfNativeInitialization); } + // Reset values. mTimeOfFirstShown = -1; - - // When the auto-disable feature is running, the accessibility engine will be disabled in - // the background, and native initialization time will be reset at that point. - if (ContentFeatureMap.isEnabled(ContentFeatureList.AUTO_DISABLE_ACCESSIBILITY_V2)) return; - - // Reset value. mTimeOfNativeInitialization = -1; } }
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index f247f62..748e878 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -101,8 +101,6 @@ import org.chromium.content.browser.input.ImeAdapterImpl; import org.chromium.content.browser.webcontents.WebContentsImpl; import org.chromium.content.browser.webcontents.WebContentsImpl.UserDataFactory; -import org.chromium.content_public.browser.ContentFeatureList; -import org.chromium.content_public.browser.ContentFeatureMap; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsAccessibility; import org.chromium.content_public.browser.WebContentsObserver; @@ -340,10 +338,6 @@ public void onDisabled() { assert mNativeObj != 0 : "Native code is not initialized, but disable was called."; - assert ContentFeatureMap.isEnabled( - ContentFeatureList.AUTO_DISABLE_ACCESSIBILITY_V2) - : "Disable was called, but Auto-disable accessibility is" - + " not enabled."; TraceEvent.begin( "WebContentsAccessibilityImpl.AutoDisableAccessibilityHandler.onDisabled"); mHistogramRecorder.onDisableCalled(mAutoDisableUsageCounter == 0); @@ -777,33 +771,30 @@ mEventDispatcher.updateRelevantEventTypes( AccessibilityState.relevantEventTypesForCurrentServices()); - // If the auto-disable feature is enabled, then we will disable renderer accessibility - // and tear down objects when no accessibility services are running. If we have - // disabled then re-enabled the renderer multiple times for this instance, then we - // will return early and keep accessibility enabled to prevent further churn. - if (ContentFeatureMap.isEnabled(ContentFeatureList.AUTO_DISABLE_ACCESSIBILITY_V2)) { - if (mAutoDisableUsageCounter >= AUTO_DISABLE_SINGLE_INSTANCE_TOGGLE_LIMIT - || !mIsAutoDisableAccessibilityCandidate) { - mAutoDisableAccessibilityHandler.cancelDisableTimer(); - return; - } + // When no accessibility services are running, disable renderer accessibility and tear + // down objects. If we have disabled then re-enabled the renderer accessibility multiple + // times for this instance, return early and keep enabled to prevent further churn. + if (mAutoDisableUsageCounter >= AUTO_DISABLE_SINGLE_INSTANCE_TOGGLE_LIMIT + || !mIsAutoDisableAccessibilityCandidate) { + mAutoDisableAccessibilityHandler.cancelDisableTimer(); + return; + } - // The C++ and Java instances are not fully connected until the root manager has - // been connected, which will happen asynchronously. Accessibility cannot be auto - // disabled and re-enabled when there is no root manager. See note in - // {@link web_contents_accessibility_android.h}. - if (!isRootManagerConnected()) return; + // The C++ and Java instances are not fully connected until the root manager has + // been connected, which will happen asynchronously. Accessibility cannot be auto + // disabled and re-enabled when there is no root manager. See note in + // {@link web_contents_accessibility_android.h}. + if (!isRootManagerConnected()) return; - // If accessibility was auto-disabled, then we do not want to restart a new timer. - if (mIsCurrentlyAutoDisabled) return; + // If accessibility was auto-disabled, then we do not want to restart a new timer. + if (mIsCurrentlyAutoDisabled) return; - if (!AccessibilityState.isAnyAccessibilityServiceEnabled()) { - mAutoDisableAccessibilityHandler.cancelDisableTimer(); - mAutoDisableAccessibilityHandler.startDisableTimer( - NO_ACCESSIBILITY_SERVICES_ENABLED_DELAY_MS); - } else { - mAutoDisableAccessibilityHandler.cancelDisableTimer(); - } + if (!AccessibilityState.isAnyAccessibilityServiceEnabled()) { + mAutoDisableAccessibilityHandler.cancelDisableTimer(); + mAutoDisableAccessibilityHandler.startDisableTimer( + NO_ACCESSIBILITY_SERVICES_ENABLED_DELAY_MS); + } else { + mAutoDisableAccessibilityHandler.cancelDisableTimer(); } } }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java index 470993a..b6749af5 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
@@ -25,8 +25,6 @@ public static final String ACCESSIBILITY_PERFORMANCE_FILTERING = "AccessibilityPerformanceFiltering"; - public static final String AUTO_DISABLE_ACCESSIBILITY_V2 = "AutoDisableAccessibilityV2"; - public static final String MOUSE_AND_TRACKPAD_DROPDOWN_MENU = "MouseAndTrackpadDropdownMenu"; public static final String OPTIMIZE_IMM_HIDE_CALLS = "OptimizeImmHideCalls";
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java index 752a035a..c998074 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java
@@ -87,6 +87,10 @@ waitForActiveShellToBeDoneLoading(); setupTestFramework(); setAccessibilityDelegate(); + + // To prevent flakes, do not disable accessibility mid tests. + mWcax.setIsAutoDisableAccessibilityCandidateForTesting(false); + sendReadyForTestSignal(); }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java index bbd7725d..bad116dc 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
@@ -167,8 +167,6 @@ // ContentFeatureList maps used for various tests. private static final Map<String, Boolean> AXMODES_ON = Map.of(ContentFeatureList.ACCESSIBILITY_PERFORMANCE_FILTERING, true); - private static final Map<String, Boolean> AUTO_DISABLE_V2_ON = - Map.of(ContentFeatureList.AUTO_DISABLE_ACCESSIBILITY_V2, true); private static final Map<String, Boolean> INCLUDE_LONG_CLICK_ENABLED = Map.of(ContentFeatureList.ACCESSIBILITY_INCLUDE_LONG_CLICK_ACTION, true); private static final Map<String, Boolean> INCLUDE_LONG_CLICK_DISABLED = @@ -199,6 +197,9 @@ mActivityTestRule.setupTestFramework(); mActivityTestRule.setAccessibilityDelegate(); + // To prevent flakes, do not disable accessibility mid tests. + mActivityTestRule.mWcax.setIsAutoDisableAccessibilityCandidateForTesting(false); + mTestData = AccessibilityContentShellTestData.getInstance(); mActivityTestRule.sendReadyForTestSignal(); } @@ -209,6 +210,9 @@ mActivityTestRule.setupTestFrameworkForFormControlsMode(); mActivityTestRule.setAccessibilityDelegate(); + // To prevent flakes, do not disable accessibility mid tests. + mActivityTestRule.mWcax.setIsAutoDisableAccessibilityCandidateForTesting(false); + mTestData = AccessibilityContentShellTestData.getInstance(); mActivityTestRule.sendReadyForTestSignal(); } @@ -219,6 +223,9 @@ mActivityTestRule.setupTestFrameworkForBasicMode(); mActivityTestRule.setAccessibilityDelegate(); + // To prevent flakes, do not disable accessibility mid tests. + mActivityTestRule.mWcax.setIsAutoDisableAccessibilityCandidateForTesting(false); + mTestData = AccessibilityContentShellTestData.getInstance(); mActivityTestRule.sendReadyForTestSignal(); } @@ -230,6 +237,9 @@ mActivityTestRule.setupTestFramework(); mActivityTestRule.setAccessibilityDelegate(); + // To prevent flakes, do not disable accessibility mid tests. + mActivityTestRule.mWcax.setIsAutoDisableAccessibilityCandidateForTesting(false); + mTestData = AccessibilityContentShellTestData.getInstance(); mActivityTestRule.sendReadyForTestSignal(); } @@ -637,7 +647,8 @@ setupTestWithHTML("<p>This is a test</p>"); waitForNodeMatching(sTextMatcher, "This is a test"); - FeatureList.setTestFeatures(AUTO_DISABLE_V2_ON); + // Explicitly enable auto-disable capabilities for this test. + mActivityTestRule.mWcax.setIsAutoDisableAccessibilityCandidateForTesting(true); // The test suite always initializes native, so first we will disable it manually. var histogramWatcher = @@ -818,8 +829,7 @@ setupTestWithHTML("<p>This is a test</p>"); waitForNodeMatching(sTextMatcher, "This is a test"); - // Enable feature, but set this instance as not a candidate. - FeatureList.setTestFeatures(AUTO_DISABLE_V2_ON); + // Set this instance as not a candidate. mActivityTestRule.mWcax.setIsAutoDisableAccessibilityCandidateForTesting(false); // Changing the accessibility state will refresh the native state.
diff --git a/content/public/app/content_main.h b/content/public/app/content_main.h index 44d9aa4..7f9b515 100644 --- a/content/public/app/content_main.h +++ b/content/public/app/content_main.h
@@ -51,9 +51,7 @@ raw_ptr<sandbox::SandboxInterfaceInfo> sandbox_info = nullptr; #elif !BUILDFLAG(IS_ANDROID) int argc = 0; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION const char** argv = nullptr; + raw_ptr<const char*> argv = nullptr; #endif // Used by BrowserTestBase. If set, BrowserMainLoop runs this task instead of
diff --git a/content/public/browser/web_ui_message_handler.h b/content/public/browser/web_ui_message_handler.h index 3594039..4d39708b 100644 --- a/content/public/browser/web_ui_message_handler.h +++ b/content/public/browser/web_ui_message_handler.h
@@ -9,7 +9,7 @@ #include "base/check.h" #include "base/gtest_prod_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #include "content/common/content_export.h" @@ -131,9 +131,7 @@ // True if the page is for JavaScript calls from this handler. bool javascript_allowed_ = false; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION WebUI* web_ui_ = nullptr; + raw_ptr<WebUI, DanglingUntriaged> web_ui_ = nullptr; }; } // namespace content
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 222d7ad4..1e3cc0c 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -1274,12 +1274,6 @@ // enables the associated UI. BASE_FEATURE(kSmartZoom, "SmartZoom", base::FEATURE_DISABLED_BY_DEFAULT); -// Automatically disables accessibility on Android when no assistive -// technologies are present -BASE_FEATURE(kAutoDisableAccessibilityV2, - "AutoDisableAccessibilityV2", - base::FEATURE_ENABLED_BY_DEFAULT); - // Enables the mojo based gin java bridge implementation. BASE_FEATURE(kGinJavaBridgeMojo, "GinJavaBridgeMojo",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index b7734d4..bc4b38d3 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -310,7 +310,6 @@ CONTENT_EXPORT extern const base::FeatureParam<bool> kAccessibilityPageZoomOSLevelAdjustment; CONTENT_EXPORT BASE_DECLARE_FEATURE(kAccessibilityPageZoomEnhancements); -CONTENT_EXPORT BASE_DECLARE_FEATURE(kAutoDisableAccessibilityV2); CONTENT_EXPORT BASE_DECLARE_FEATURE(kGinJavaBridgeMojo); CONTENT_EXPORT BASE_DECLARE_FEATURE(kReduceGpuPriorityOnBackground); CONTENT_EXPORT BASE_DECLARE_FEATURE(kMouseAndTrackpadDropdownMenu);
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index 5f45d1c..4ae64553 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h
@@ -561,9 +561,7 @@ RenderFrameHost* render_frame_host() const { return render_frame_host_; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION RenderFrameHost* render_frame_host_; + raw_ptr<RenderFrameHost> render_frame_host_; }; RenderFrameHost* ConvertToRenderFrameHost(RenderFrameHost* render_view_host); @@ -1713,8 +1711,8 @@ void ResumeIfPaused(); const GURL url_; - // This field is not a raw_ptr<> because of incompatibilities with tracing - // (TRACE_EVENT*), perfetto::TracedDictionary::Add and gmock/EXPECT_THAT. + // RAW_PTR_EXCLUSION: Incompatible with tracing (TRACE_EVENT*), + // perfetto::TracedDictionary::Add and gmock/EXPECT_THAT. RAW_PTR_EXCLUSION NavigationRequest* request_ = nullptr; bool navigation_paused_ = false; NavigationState current_state_ = NavigationState::INITIAL;
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index d94231a9..ff2a0cf 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -528,7 +528,7 @@ ## SkiaGraphite ## crbug.com/1513193 [ mac amd angle-metal graphite-enabled ] conformance/canvas/draw-webgl-to-canvas-test.html [ RetryOnFailure ] -crbug.com/1513193 [ amd angle-metal graphite-enabled mac release ] conformance/canvas/to-data-url-test.html [ RetryOnFailure ] +crbug.com/1513193 [ amd angle-metal graphite-enabled mac no-clang-coverage release ] conformance/canvas/to-data-url-test.html [ RetryOnFailure ] crbug.com/1491023 [ mac angle-metal graphite-enabled amd ] conformance/canvas/draw-static-webgl-to-multiple-canvas-test.html [ Failure ] ## Mac Intel ##
diff --git a/content/web_test/renderer/gamepad_controller.h b/content/web_test/renderer/gamepad_controller.h index e340fdb..8347a34 100644 --- a/content/web_test/renderer/gamepad_controller.h +++ b/content/web_test/renderer/gamepad_controller.h
@@ -23,7 +23,7 @@ namespace content { class RenderFrame; -class GamepadController : public base::SupportsWeakPtr<GamepadController> { +class GamepadController final { public: GamepadController();
diff --git a/device/fido/cable/v2_authenticator.cc b/device/fido/cable/v2_authenticator.cc index cda37e69..3bc226a 100644 --- a/device/fido/cable/v2_authenticator.cc +++ b/device/fido/cable/v2_authenticator.cc
@@ -8,6 +8,7 @@ #include "base/feature_list.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/strings/string_number_conversions.h" @@ -86,9 +87,8 @@ })"); struct MakeCredRequest { - // All fields below are not a raw_ptr<T> because cbor_extract.cc would - // cast the raw_ptr<T> to a void*, skipping an AddRef() call and causing a - // ref-counting mismatch. + // RAW_PTR_EXCLUSION: cbor_extract.cc would cast the raw_ptr<T> to a void*, + // skipping an AddRef() call and causing a ref-counting mismatch. RAW_PTR_EXCLUSION const std::vector<uint8_t>* client_data_hash; RAW_PTR_EXCLUSION const std::string* rp_id; RAW_PTR_EXCLUSION const std::string* rp_name; @@ -150,9 +150,8 @@ }; struct AttestationObject { - // All fields below are not a raw_ptr<T> because cbor_extract.cc would - // cast the raw_ptr<T> to a void*, skipping an AddRef() call and causing a - // ref-counting mismatch. + // RAW_PTR_EXCLUSION: cbor_extract.cc would cast the raw_ptr<T> to a void*, + // skipping an AddRef() call and causing a ref-counting mismatch. RAW_PTR_EXCLUSION const std::string* fmt; RAW_PTR_EXCLUSION const std::vector<uint8_t>* auth_data; RAW_PTR_EXCLUSION const cbor::Value* statement; @@ -174,9 +173,8 @@ }; struct GetAssertionRequest { - // All fields below are not a raw_ptr<T> because cbor_extract.cc would - // cast the raw_ptr<T> to a void*, skipping an AddRef() call and causing a - // ref-counting mismatch. + // RAW_PTR_EXCLUSION: cbor_extract.cc would cast the raw_ptr<T> to a void*, + // skipping an AddRef() call and causing a ref-counting mismatch. RAW_PTR_EXCLUSION const std::string* rp_id; RAW_PTR_EXCLUSION const std::vector<uint8_t>* client_data_hash; RAW_PTR_EXCLUSION const cbor::Value::ArrayValue* allowed_credentials;
diff --git a/docs/rust.md b/docs/rust.md index f6714f5..80b2ad7b 100644 --- a/docs/rust.md +++ b/docs/rust.md
@@ -47,11 +47,6 @@ itself is never built, it is only used to collect dependencies through the `[dependencies]` section. -These instructions require the presence of nightly `cargo` which is normally found -in `//third_party/rust-toolchain/bin`. But [on Mac Arm](https://crbug.com/1515913) -it is missing, and will need to be installed separately with -[`rustup install nightly`](https://rustup.rs/) and added to the `PATH` environment. - To use a third-party crate "bar" version 3 from first party code: 1. Change directory to the root `src/` dir of Chromium. 1. Add the crate to `//third_party/rust/chromium_crates_io/Cargo.toml`:
diff --git a/docs/website b/docs/website index b7bba5c..dd6ef26 160000 --- a/docs/website +++ b/docs/website
@@ -1 +1 @@ -Subproject commit b7bba5c5b9d9c674a978ddaef034cc7c185aab5f +Subproject commit dd6ef26042e3c7a265349d73ffe2b64e5c791f2b
diff --git a/gpu/command_buffer/common/shared_image_capabilities.h b/gpu/command_buffer/common/shared_image_capabilities.h index 70a8270..288adc9 100644 --- a/gpu/command_buffer/common/shared_image_capabilities.h +++ b/gpu/command_buffer/common/shared_image_capabilities.h
@@ -13,6 +13,7 @@ bool supports_scanout_shared_images = false; bool supports_luminance_shared_images = false; bool supports_r16_shared_images = false; + bool is_r16f_supported = false; bool disable_r8_shared_images = false; bool disable_webgpu_shared_images = false;
diff --git a/gpu/command_buffer/service/image_reader_gl_owner.h b/gpu/command_buffer/service/image_reader_gl_owner.h index 9991b46..f348923 100644 --- a/gpu/command_buffer/service/image_reader_gl_owner.h +++ b/gpu/command_buffer/service/image_reader_gl_owner.h
@@ -11,8 +11,6 @@ #include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" -#include "base/memory/raw_ref.h" #include "base/threading/thread_checker.h" #include "gpu/command_buffer/service/ref_counted_lock.h" #include "gpu/command_buffer/service/texture_owner.h" @@ -88,12 +86,8 @@ base::ScopedFD GetReadyFence() const; private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION ImageReaderGLOwner* texture_owner_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION AImage* image_; + raw_ptr<ImageReaderGLOwner> texture_owner_; + raw_ptr<AImage> image_; base::ScopedFD ready_fence_; };
diff --git a/gpu/command_buffer/service/program_cache.h b/gpu/command_buffer/service/program_cache.h index 7451d61..401b2672 100644 --- a/gpu/command_buffer/service/program_cache.h +++ b/gpu/command_buffer/service/program_cache.h
@@ -14,7 +14,7 @@ #include "base/hash/sha1.h" #include "base/memory/memory_pressure_listener.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/synchronization/lock.h" #include "gpu/command_buffer/common/gl2_types.h" #include "gpu/gpu_gles2_export.h" @@ -56,9 +56,7 @@ ~ScopedCacheUse(); private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union, #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION ProgramCache* cache_; + raw_ptr<ProgramCache> cache_; }; explicit ProgramCache(size_t max_cache_size_bytes);
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc index 7063dceb..98a73689 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
@@ -755,7 +755,6 @@ auto& vulkan_image = vk_texture.vulkan_image; gfx::Size plane_size = vulkan_image->size(); auto plane_format = GLTextureHolder::GetPlaneFormat(format(), plane_index); - DCHECK_EQ(gl_textures_.size(), plane_index); auto& gl_texture = gl_textures_.emplace_back(plane_format, plane_size, is_passthrough, nullptr);
diff --git a/gpu/command_buffer/service/shared_image/gl_common_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/gl_common_image_backing_factory.cc index d1112bf..48e196e 100644 --- a/gpu/command_buffer/service/shared_image/gl_common_image_backing_factory.cc +++ b/gpu/command_buffer/service/shared_image/gl_common_image_backing_factory.cc
@@ -48,6 +48,11 @@ // No fallback for R_16, RG_1616 format. return std::nullopt; } + if (plane_format == viz::SinglePlaneFormat::kR_F16 && + (!caps.is_atleast_gles3() || !caps.enable_texture_half_float_linear())) { + // Fallback to LUMINANCE_F16 for R_F16 format. + return viz::SinglePlaneFormat::kLUMINANCE_F16; + } return plane_format; }
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_holder.cc b/gpu/command_buffer/service/shared_image/gl_texture_holder.cc index 8c61000..ee93e933 100644 --- a/gpu/command_buffer/service/shared_image/gl_texture_holder.cc +++ b/gpu/command_buffer/service/shared_image/gl_texture_holder.cc
@@ -76,7 +76,7 @@ : viz::SinglePlaneFormat::kR_16; case viz::SharedImageFormat::ChannelFormat::k16F: CHECK_EQ(num_channels, 1); - return viz::SinglePlaneFormat::kLUMINANCE_F16; + return viz::SinglePlaneFormat::kR_F16; } NOTREACHED_NORETURN(); }
diff --git a/gpu/command_buffer/service/shared_image/shared_image_factory.cc b/gpu/command_buffer/service/shared_image/shared_image_factory.cc index b6337273..5ba154f 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_factory.cc
@@ -38,6 +38,7 @@ #include "ui/gl/gl_implementation.h" #include "ui/gl/gl_switches.h" #include "ui/gl/gl_utils.h" +#include "ui/gl/gl_version_info.h" #include "ui/gl/trace_util.h" #if BUILDFLAG(ENABLE_VULKAN) @@ -893,6 +894,20 @@ workarounds_.r8_egl_images_broken; shared_image_caps.disable_webgpu_shared_images = workarounds_.disable_webgpu_shared_images; + if (!shared_context_state_) { + shared_image_caps.is_r16f_supported = false; + } else if (is_skia_graphite || gr_context_type_ == GrContextType::kVulkan) { + // R16F is always supported with Dawn and Vulkan contexts. + shared_image_caps.is_r16f_supported = true; + } else if (gr_context_type_ == GrContextType::kGL) { + CHECK(shared_context_state_->gr_context()); + // With Skia GL, R16F is supported only with GLES 3.0 and above. + shared_image_caps.is_r16f_supported = + shared_context_state_->feature_info()->gl_version_info().IsAtLeastGLES( + 3, 0) && + shared_context_state_->gr_context()->colorTypeSupportedAsImage( + kA16_float_SkColorType); + } #if BUILDFLAG(IS_WIN) shared_image_caps.shared_image_d3d =
diff --git a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc index 05360c01..1e968d3 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc
@@ -15,6 +15,7 @@ #include "build/buildflag.h" #include "components/viz/common/resources/shared_image_format_utils.h" #include "gpu/command_buffer/service/feature_info.h" +#include "ui/gl/gl_version_info.h" namespace gpu { @@ -65,7 +66,8 @@ return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM; } else if (format == viz::SinglePlaneFormat::kETC1) { return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; - } else if (format == viz::SinglePlaneFormat::kLUMINANCE_F16) { + } else if (format == viz::SinglePlaneFormat::kLUMINANCE_F16 || + format == viz::SinglePlaneFormat::kR_F16) { return VK_FORMAT_R16_SFLOAT; } else if (format == viz::LegacyMultiPlaneFormat::kP010) { return VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16; @@ -257,7 +259,10 @@ ext_texture_rg_(feature_info->feature_flags().ext_texture_rg), ext_texture_norm16_(feature_info->feature_flags().ext_texture_norm16), disable_r8_shared_images_( - feature_info->workarounds().r8_egl_images_broken) {} + feature_info->workarounds().r8_egl_images_broken), + enable_texture_half_float_linear_( + feature_info->feature_flags().enable_texture_half_float_linear), + is_atleast_gles3_(feature_info->gl_version_info().IsAtLeastGLES(3, 0)) {} GLFormatDesc GLFormatCaps::ToGLFormatDescExternalSampler( viz::SharedImageFormat format) const { @@ -351,10 +356,10 @@ !ext_texture_norm16_) { return GL_ZERO; } - // Fallback to GL_LUMINANCE16F for R16F format. - if (gl_format == GL_R16F_EXT) { - // TODO(hitawala): Check for enable_texture_half_float_linear and no - // texture_rg extension support. + // Fallback to GL_LUMINANCE16F for R16F format based on extensions and ES3 + // support. + if (gl_format == GL_R16F_EXT && + (!is_atleast_gles3_ || !enable_texture_half_float_linear_)) { return GL_LUMINANCE16F_EXT; } // No fallback for RG16F format without texture_rg extension. @@ -436,10 +441,8 @@ case ChannelFormat::k16: return num_channels == 2 ? VK_FORMAT_R16G16_UNORM : VK_FORMAT_R16_UNORM; case ChannelFormat::k16F: - break; + return num_channels == 2 ? VK_FORMAT_R16G16_SFLOAT : VK_FORMAT_R16_SFLOAT; } - - return VK_FORMAT_UNDEFINED; } #endif @@ -458,7 +461,8 @@ return wgpu::TextureFormat::RG8Unorm; } else if (format == viz::SinglePlaneFormat::kR_16) { return wgpu::TextureFormat::R16Unorm; - } else if (format == viz::SinglePlaneFormat::kLUMINANCE_F16) { + } else if (format == viz::SinglePlaneFormat::kLUMINANCE_F16 || + format == viz::SinglePlaneFormat::kR_F16) { return wgpu::TextureFormat::R16Float; } else if (format == viz::SinglePlaneFormat::kRG_1616) { return wgpu::TextureFormat::RG16Unorm;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.h b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.h index 5aac5ca..03e86bc 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.h +++ b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.h
@@ -93,6 +93,10 @@ bool ext_texture_rg() const { return ext_texture_rg_; } bool ext_texture_norm16() const { return ext_texture_norm16_; } bool disable_r8_shared_images() const { return disable_r8_shared_images_; } + bool enable_texture_half_float_linear() const { + return enable_texture_half_float_linear_; + } + bool is_atleast_gles3() const { return is_atleast_gles3_; } private: // Return fallback gl format if the GL data, internal, tex storage format is @@ -104,6 +108,8 @@ bool ext_texture_rg_ = false; bool ext_texture_norm16_ = false; bool disable_r8_shared_images_ = false; + bool enable_texture_half_float_linear_ = false; + bool is_atleast_gles3_ = false; }; // Following functions return the appropriate Vulkan format for a
diff --git a/gpu/ipc/common/shared_image_capabilities.mojom b/gpu/ipc/common/shared_image_capabilities.mojom index ca04bded..d423234 100644 --- a/gpu/ipc/common/shared_image_capabilities.mojom +++ b/gpu/ipc/common/shared_image_capabilities.mojom
@@ -9,6 +9,7 @@ bool supports_scanout_shared_images; bool supports_luminance_shared_images; bool supports_r16_shared_images; + bool is_r16f_supported; bool disable_r8_shared_images; bool disable_webgpu_shared_images;
diff --git a/gpu/ipc/common/shared_image_capabilities_mojom_traits.cc b/gpu/ipc/common/shared_image_capabilities_mojom_traits.cc index 78197d30..5c1613d 100644 --- a/gpu/ipc/common/shared_image_capabilities_mojom_traits.cc +++ b/gpu/ipc/common/shared_image_capabilities_mojom_traits.cc
@@ -15,6 +15,7 @@ out->supports_luminance_shared_images = data.supports_luminance_shared_images(); out->supports_r16_shared_images = data.supports_r16_shared_images(); + out->is_r16f_supported = data.is_r16f_supported(); out->disable_r8_shared_images = data.disable_r8_shared_images(); out->disable_webgpu_shared_images = data.disable_webgpu_shared_images();
diff --git a/gpu/ipc/common/shared_image_capabilities_mojom_traits.h b/gpu/ipc/common/shared_image_capabilities_mojom_traits.h index d970785..ad847fc 100644 --- a/gpu/ipc/common/shared_image_capabilities_mojom_traits.h +++ b/gpu/ipc/common/shared_image_capabilities_mojom_traits.h
@@ -32,6 +32,10 @@ return input.supports_r16_shared_images; } + static bool is_r16f_supported(const gpu::SharedImageCapabilities& input) { + return input.is_r16f_supported; + } + static bool disable_r8_shared_images( const gpu::SharedImageCapabilities& input) { return input.disable_r8_shared_images;
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc index c7887bb..93db993 100644 --- a/gpu/ipc/service/gpu_init.cc +++ b/gpu/ipc/service/gpu_init.cc
@@ -12,7 +12,7 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_macros.h" #include "base/path_service.h" @@ -154,9 +154,7 @@ void SetGpuWatchdogPtr(GpuWatchdogThread* ptr) { watchdog_ptr_ = ptr; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION GpuWatchdogThread* watchdog_ptr_ = nullptr; + raw_ptr<GpuWatchdogThread, DanglingUntriaged> watchdog_ptr_ = nullptr; }; void PauseGpuWatchdog(GpuWatchdogThread* watchdog_thread) {
diff --git a/gpu/vulkan/vulkan_swap_chain.h b/gpu/vulkan/vulkan_swap_chain.h index e957476..0c166f5 100644 --- a/gpu/vulkan/vulkan_swap_chain.h +++ b/gpu/vulkan/vulkan_swap_chain.h
@@ -15,7 +15,6 @@ #include "base/containers/circular_deque.h" #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/scoped_refptr.h" #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" @@ -53,9 +52,7 @@ VkSemaphore end_semaphore() const { return end_semaphore_; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION VulkanSwapChain* swap_chain_ = nullptr; + raw_ptr<VulkanSwapChain> swap_chain_ = nullptr; bool success_ = false; VkImage image_ = VK_NULL_HANDLE; uint32_t image_index_ = 0;
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl index 5be8360..8d5ff8f 100644 --- a/infra/config/generated/testing/variants.pyl +++ b/infra/config/generated/testing/variants.pyl
@@ -17,7 +17,7 @@ 'identifier': 'BRYA_RELEASE_BETA', 'skylab': { 'cros_board': 'brya', - 'cros_img': 'brya-release/R120-15662.57.0', + 'cros_img': 'brya-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -25,7 +25,7 @@ 'identifier': 'BRYA_RELEASE_DEV', 'skylab': { 'cros_board': 'brya', - 'cros_img': 'brya-release/R121-15699.25.0', + 'cros_img': 'brya-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -41,7 +41,7 @@ 'identifier': 'BRYA_RELEASE_STABLE', 'skylab': { 'cros_board': 'brya', - 'cros_img': 'brya-release/R120-15662.64.0', + 'cros_img': 'brya-release/R120-15662.76.0', 'dut_pool': 'chrome', }, }, @@ -49,14 +49,14 @@ 'identifier': 'DEDEDE_RELEASE_BETA', 'skylab': { 'cros_board': 'dedede', - 'cros_img': 'dedede-release/R120-15662.57.0', + 'cros_img': 'dedede-release/R121-15699.40.0', }, }, 'CROS_DEDEDE_RELEASE_DEV': { 'identifier': 'DEDEDE_RELEASE_DEV', 'skylab': { 'cros_board': 'dedede', - 'cros_img': 'dedede-release/R121-15699.25.0', + 'cros_img': 'dedede-release/R122-15748.0.0', }, }, 'CROS_DEDEDE_RELEASE_LKGM': { @@ -70,14 +70,14 @@ 'identifier': 'DEDEDE_RELEASE_STABLE', 'skylab': { 'cros_board': 'dedede', - 'cros_img': 'dedede-release/R120-15662.64.0', + 'cros_img': 'dedede-release/R120-15662.76.0', }, }, 'CROS_FIZZ_RELEASE_BETA': { 'identifier': 'FIZZ_RELEASE_BETA', 'skylab': { 'cros_board': 'fizz', - 'cros_img': 'fizz-release/R120-15662.57.0', + 'cros_img': 'fizz-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -85,7 +85,7 @@ 'identifier': 'FIZZ_RELEASE_DEV', 'skylab': { 'cros_board': 'fizz', - 'cros_img': 'fizz-release/R121-15699.25.0', + 'cros_img': 'fizz-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -101,7 +101,7 @@ 'identifier': 'FIZZ_RELEASE_STABLE', 'skylab': { 'cros_board': 'fizz', - 'cros_img': 'fizz-release/R120-15662.64.0', + 'cros_img': 'fizz-release/R120-15662.76.0', 'dut_pool': 'chrome', }, }, @@ -109,7 +109,7 @@ 'identifier': 'GUYBRUSH_RELEASE_BETA', 'skylab': { 'cros_board': 'guybrush', - 'cros_img': 'guybrush-release/R120-15662.57.0', + 'cros_img': 'guybrush-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -117,7 +117,7 @@ 'identifier': 'GUYBRUSH_RELEASE_DEV', 'skylab': { 'cros_board': 'guybrush', - 'cros_img': 'guybrush-release/R121-15694.0.0', + 'cros_img': 'guybrush-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -133,7 +133,7 @@ 'identifier': 'GUYBRUSH_RELEASE_STABLE', 'skylab': { 'cros_board': 'guybrush', - 'cros_img': 'guybrush-release/R120-15662.64.0', + 'cros_img': 'guybrush-release/R120-15662.76.0', 'dut_pool': 'chrome', }, }, @@ -181,7 +181,7 @@ 'identifier': 'PUFF_RELEASE_BETA', 'skylab': { 'cros_board': 'puff', - 'cros_img': 'puff-release/R120-15662.57.0', + 'cros_img': 'puff-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -189,7 +189,7 @@ 'identifier': 'PUFF_RELEASE_DEV', 'skylab': { 'cros_board': 'puff', - 'cros_img': 'puff-release/R121-15699.25.0', + 'cros_img': 'puff-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -205,7 +205,7 @@ 'identifier': 'PUFF_RELEASE_STABLE', 'skylab': { 'cros_board': 'puff', - 'cros_img': 'puff-release/R120-15662.64.0', + 'cros_img': 'puff-release/R120-15662.76.0', 'dut_pool': 'chrome', }, },
diff --git a/infra/config/targets/cros-skylab-variants.json b/infra/config/targets/cros-skylab-variants.json index 27ef250..5b0da26d 100644 --- a/infra/config/targets/cros-skylab-variants.json +++ b/infra/config/targets/cros-skylab-variants.json
@@ -19,8 +19,8 @@ "CROS_BRYA_RELEASE_DEV": { "skylab": { "cros_board": "brya", - "cros_chrome_version": "121.0.6167.40", - "cros_img": "brya-release/R121-15699.25.0", + "cros_chrome_version": "122.0.6241.0", + "cros_img": "brya-release/R122-15748.0.0", "dut_pool": "chrome" }, "enabled": true, @@ -29,8 +29,8 @@ "CROS_BRYA_RELEASE_BETA": { "skylab": { "cros_board": "brya", - "cros_chrome_version": "120.0.6099.186", - "cros_img": "brya-release/R120-15662.57.0", + "cros_chrome_version": "121.0.6167.82", + "cros_img": "brya-release/R121-15699.40.0", "dut_pool": "chrome" }, "enabled": true, @@ -39,8 +39,8 @@ "CROS_BRYA_RELEASE_STABLE": { "skylab": { "cros_board": "brya", - "cros_chrome_version": "120.0.6099.203", - "cros_img": "brya-release/R120-15662.64.0", + "cros_chrome_version": "120.0.6099.235", + "cros_img": "brya-release/R120-15662.76.0", "dut_pool": "chrome" }, "enabled": true, @@ -57,8 +57,8 @@ "CROS_DEDEDE_RELEASE_DEV": { "skylab": { "cros_board": "dedede", - "cros_chrome_version": "121.0.6167.40", - "cros_img": "dedede-release/R121-15699.25.0" + "cros_chrome_version": "122.0.6241.0", + "cros_img": "dedede-release/R122-15748.0.0" }, "enabled": true, "identifier": "DEDEDE_RELEASE_DEV" @@ -66,8 +66,8 @@ "CROS_DEDEDE_RELEASE_BETA": { "skylab": { "cros_board": "dedede", - "cros_chrome_version": "120.0.6099.186", - "cros_img": "dedede-release/R120-15662.57.0" + "cros_chrome_version": "121.0.6167.82", + "cros_img": "dedede-release/R121-15699.40.0" }, "enabled": true, "identifier": "DEDEDE_RELEASE_BETA" @@ -75,8 +75,8 @@ "CROS_DEDEDE_RELEASE_STABLE": { "skylab": { "cros_board": "dedede", - "cros_chrome_version": "120.0.6099.203", - "cros_img": "dedede-release/R120-15662.64.0" + "cros_chrome_version": "120.0.6099.235", + "cros_img": "dedede-release/R120-15662.76.0" }, "enabled": true, "identifier": "DEDEDE_RELEASE_STABLE" @@ -93,8 +93,8 @@ "CROS_FIZZ_RELEASE_DEV": { "skylab": { "cros_board": "fizz", - "cros_chrome_version": "121.0.6167.40", - "cros_img": "fizz-release/R121-15699.25.0", + "cros_chrome_version": "122.0.6241.0", + "cros_img": "fizz-release/R122-15748.0.0", "dut_pool": "chrome" }, "enabled": true, @@ -103,8 +103,8 @@ "CROS_FIZZ_RELEASE_BETA": { "skylab": { "cros_board": "fizz", - "cros_chrome_version": "120.0.6099.186", - "cros_img": "fizz-release/R120-15662.57.0", + "cros_chrome_version": "121.0.6167.82", + "cros_img": "fizz-release/R121-15699.40.0", "dut_pool": "chrome" }, "enabled": true, @@ -113,8 +113,8 @@ "CROS_FIZZ_RELEASE_STABLE": { "skylab": { "cros_board": "fizz", - "cros_chrome_version": "120.0.6099.203", - "cros_img": "fizz-release/R120-15662.64.0", + "cros_chrome_version": "120.0.6099.235", + "cros_img": "fizz-release/R120-15662.76.0", "dut_pool": "chrome" }, "enabled": true, @@ -132,8 +132,8 @@ "CROS_GUYBRUSH_RELEASE_DEV": { "skylab": { "cros_board": "guybrush", - "cros_chrome_version": "121.0.6154.0", - "cros_img": "guybrush-release/R121-15694.0.0", + "cros_chrome_version": "122.0.6241.0", + "cros_img": "guybrush-release/R122-15748.0.0", "dut_pool": "chrome" }, "enabled": true, @@ -142,8 +142,8 @@ "CROS_GUYBRUSH_RELEASE_BETA": { "skylab": { "cros_board": "guybrush", - "cros_chrome_version": "120.0.6099.186", - "cros_img": "guybrush-release/R120-15662.57.0", + "cros_chrome_version": "121.0.6167.82", + "cros_img": "guybrush-release/R121-15699.40.0", "dut_pool": "chrome" }, "enabled": true, @@ -152,8 +152,8 @@ "CROS_GUYBRUSH_RELEASE_STABLE": { "skylab": { "cros_board": "guybrush", - "cros_chrome_version": "120.0.6099.203", - "cros_img": "guybrush-release/R120-15662.64.0", + "cros_chrome_version": "120.0.6099.235", + "cros_img": "guybrush-release/R120-15662.76.0", "dut_pool": "chrome" }, "enabled": true, @@ -171,8 +171,8 @@ "CROS_PUFF_RELEASE_DEV": { "skylab": { "cros_board": "puff", - "cros_chrome_version": "121.0.6167.40", - "cros_img": "puff-release/R121-15699.25.0", + "cros_chrome_version": "122.0.6241.0", + "cros_img": "puff-release/R122-15748.0.0", "dut_pool": "chrome" }, "enabled": true, @@ -181,8 +181,8 @@ "CROS_PUFF_RELEASE_BETA": { "skylab": { "cros_board": "puff", - "cros_chrome_version": "120.0.6099.186", - "cros_img": "puff-release/R120-15662.57.0", + "cros_chrome_version": "121.0.6167.82", + "cros_img": "puff-release/R121-15699.40.0", "dut_pool": "chrome" }, "enabled": true, @@ -191,8 +191,8 @@ "CROS_PUFF_RELEASE_STABLE": { "skylab": { "cros_board": "puff", - "cros_chrome_version": "120.0.6099.203", - "cros_img": "puff-release/R120-15662.64.0", + "cros_chrome_version": "120.0.6099.235", + "cros_img": "puff-release/R120-15662.76.0", "dut_pool": "chrome" }, "enabled": true,
diff --git a/internal b/internal index 99f8a11..cf0c945 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit 99f8a11b3c5a426de2878eca0a9b1fd23f2ae8e7 +Subproject commit cf0c9456e3dcd7fa1f4f51fa89aac1ee026ca47e
diff --git a/ios/build/chrome_build.gni b/ios/build/chrome_build.gni index 6598ef5e..e41454d 100644 --- a/ios/build/chrome_build.gni +++ b/ios/build/chrome_build.gni
@@ -81,6 +81,9 @@ # Use perf_tests_hook if true ios_is_perf_test = false + + # Enable memory debugging. + ios_enable_memory_debugging = !is_chrome_branded } if (target_environment == "catalyst") {
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index 7f52c62..9b88c1b 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -622,6 +622,9 @@ Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chromium data in your account<ph name="END_LINK">END_LINK</ph>. </message> + <message name="IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE" desc="Text for the Notifications UI Alert Prompt that redirects the user to the iOS notifications permission page"> + To receive notifications from Chromium, turn on notifications in your iOS Settings. + </message> <message name="IDS_IOS_OPTIONS_IMPORT_DATA_HEADER" desc="The header for the Import Data settings screen. [400em]"> <ph name="USER_EMAIL1">$1<ex>johndoe@gmail.com</ex></ph> was using Chromium and left bookmarks, passwords, and other settings on this device. </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE.png.sha1 new file mode 100644 index 0000000..3034590b --- /dev/null +++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE.png.sha1
@@ -0,0 +1 @@ +056e7260e6909e6682874c6366440f98be2a8a6f \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd index e6f2453..d6ecdb9 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -622,6 +622,9 @@ Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>clear the Chrome data in your account<ph name="END_LINK">END_LINK</ph>. </message> + <message name="IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE" desc="Text for the Notifications UI Alert Prompt that redirects the user to the iOS notifications permission page"> + To receive notifications from Chrome, turn on notifications in your iOS Settings. + </message> <message name="IDS_IOS_OPTIONS_IMPORT_DATA_HEADER" desc="The header for the Import Data settings screen. [400em]"> <ph name="USER_EMAIL1">$1<ex>johndoe@gmail.com</ex></ph> was using Chrome and left bookmarks, passwords, and other settings on this device. </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE.png.sha1 new file mode 100644 index 0000000..3034590b --- /dev/null +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE.png.sha1
@@ -0,0 +1 @@ +056e7260e6909e6682874c6366440f98be2a8a6f \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 8cf75be7..f3fc7e0b 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2415,6 +2415,21 @@ <message name="IDS_IOS_NOTIFICATIONS_TITLE" desc="Title for Notifications settings menu."> Notifications </message> + <message name="IDS_IOS_NOTIFICATIONS_ALERT_TITLE" desc="Title for the Notifications UI Alert Prompt that redirects the user to the iOS push notifications permission page"> + Turn on Notifications? + </message> + <message name="IDS_IOS_NOTIFICATIONS_ALERT_CANCEL" desc="The label for the alert's cancel button"> + No, Thanks + </message> + <message name="IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS" desc="The label for the alert's redirect to the iOS Settings."> + Go to Settings… + </message> + <message name="IDS_IOS_NOTIFICATIONS_CONFIRMATION_MESSAGE" desc="The snackbar message that confirms that notifications have been turned on."> + <ph name="FEATURE_NAME">$1<ex>Chromium Tips</ex></ph> notifications turned on + </message> + <message name="IDS_IOS_NOTIFICATIONS_MANAGE_SETTINGS" desc="The label for a button that takes the user to the app's Notifications Settings page."> + Manage + </message> <message name="IDS_IOS_NTP_FEED_SIGNIN_COMPACT_PROMO_BODY" desc="The text on the body of the new tab page Feed Signin Promo (compact version), explaining that users will content based on users interests if they enable sync. [iOS only]"> Sync to get content based on your interests. </message> @@ -3510,6 +3525,18 @@ <message name="IDS_IOS_PRIVACY_GUIDE_CANCEL_BUTTON" desc="Text for the 'Cancel' button on the Welcome step of the Privacy Guide."> Cancel </message> + <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC" desc="Label for the switch in the History Sync step of the Privacy Guide."> + History sync + </message> + <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_ACROSS_DEVICES" desc="Bullet point for the 'History sync' switch in the 'When on' section"> + You'll have your history on all your synced devices so you can continue what you were doing + </message> + <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH" desc="Bullet point for the 'History sync' switch in the 'When on' section"> + If Google is also your default search engine, you'll see better, contextually relevant suggestions + </message> + <message name="IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_ACCOUNT" desc="Bullet point for the 'History sync' switch in the 'Things to consider' section"> + The URLs you visit are saved to your Google Account + </message> <message name="IDS_IOS_PRIVACY_GUIDE_LETS_GO_BUTTON" desc="Text for the 'Let's go' button on the Welcome step of the Privacy Guide."> Let's go </message> @@ -5094,6 +5121,9 @@ <message name="IDS_IOS_TEXT_ZOOM_ZOOM_OUT" desc="Accessibility label for a button allowing the user to zoom out." meaning="User is asking page to zoom out"> Zoom Out </message> + <message name="IDS_IOS_TIPS_NOTIFICATIONS_CONTEXT_MENU_ITEM" desc="Title of context menu item for the Set Up List to enable notifications."> + Turn on Notifications for <ph name="FEATURE_NAME">$1<ex>Chromium Tips</ex></ph> + </message> <message name="IDS_IOS_TOGGLE_SETTING_MANAGED_ACCESSIBILITY_HINT" desc="Action hint for any managed switch in settings. This is spoken by VoiceOver. [iOS only]"> This setting is managed, double tap for more information </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_CANCEL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_CANCEL.png.sha1 new file mode 100644 index 0000000..3034590b --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_CANCEL.png.sha1
@@ -0,0 +1 @@ +056e7260e6909e6682874c6366440f98be2a8a6f \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS.png.sha1 new file mode 100644 index 0000000..3034590b --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS.png.sha1
@@ -0,0 +1 @@ +056e7260e6909e6682874c6366440f98be2a8a6f \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_TITLE.png.sha1 new file mode 100644 index 0000000..3034590b --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_ALERT_TITLE.png.sha1
@@ -0,0 +1 @@ +056e7260e6909e6682874c6366440f98be2a8a6f \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_CONFIRMATION_MESSAGE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_CONFIRMATION_MESSAGE.png.sha1 new file mode 100644 index 0000000..b9db75d --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_CONFIRMATION_MESSAGE.png.sha1
@@ -0,0 +1 @@ +fde4a637643be7d5a9c9d4ceb95eb24ea795592c \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_MANAGE_SETTINGS.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_MANAGE_SETTINGS.png.sha1 new file mode 100644 index 0000000..b9db75d --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_NOTIFICATIONS_MANAGE_SETTINGS.png.sha1
@@ -0,0 +1 @@ +fde4a637643be7d5a9c9d4ceb95eb24ea795592c \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC.png.sha1 new file mode 100644 index 0000000..4f868aa0 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC.png.sha1
@@ -0,0 +1 @@ +b3da75f38b9e2dfc45ab029325fe3fc31464422d \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_ACROSS_DEVICES.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_ACROSS_DEVICES.png.sha1 new file mode 100644 index 0000000..4f868aa0 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_ACROSS_DEVICES.png.sha1
@@ -0,0 +1 @@ +b3da75f38b9e2dfc45ab029325fe3fc31464422d \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_ACCOUNT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_ACCOUNT.png.sha1 new file mode 100644 index 0000000..4f868aa0 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_ACCOUNT.png.sha1
@@ -0,0 +1 @@ +b3da75f38b9e2dfc45ab029325fe3fc31464422d \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH.png.sha1 new file mode 100644 index 0000000..4f868aa0 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH.png.sha1
@@ -0,0 +1 @@ +b3da75f38b9e2dfc45ab029325fe3fc31464422d \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TIPS_NOTIFICATIONS_CONTEXT_MENU_ITEM.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TIPS_NOTIFICATIONS_CONTEXT_MENU_ITEM.png.sha1 new file mode 100644 index 0000000..1251d96 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TIPS_NOTIFICATIONS_CONTEXT_MENU_ITEM.png.sha1
@@ -0,0 +1 @@ +67b436b4ba492732ac4310c48a4437881fe62c93 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb index ff195154..4ee921b8 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb
@@ -102,6 +102,7 @@ <translation id="3955621079070267756">Адкрываць Chromium з любой праграмы</translation> <translation id="4005283307739974863">Запускае праверку бяспекі ў Chromium.</translation> <translation id="4043291146360695975">Паролі захоўваюцца ў Менеджары пароляў толькі на гэтай прыладзе.</translation> +<translation id="4076589763479456892">Калі вы забылі фразу-пароль або хочаце змяніць гэту наладу, <ph name="BEGIN_LINK" />выдаліце даныя Chromium з уліковага запісу<ph name="END_LINK" />.</translation> <translation id="4099085513035183040">Не падтрымліваецца ў Chromium Beta</translation> <translation id="4106512142782407609">Вы ўвайшлі як <ph name="EMAIL" />. @@ -153,6 +154,7 @@ <translation id="5534584691915394889">Гэта інфармацыя будзе выкарыстоўвацца, каб ствараць падзеі ў Apple Calendar з Chromium і Google Аб'ектыва.</translation> <translation id="5571094606370987472">Дазваляе адкрыць нядаўнія ўкладкі Chromium.</translation> <translation id="5623083843656850677">Блакіруйце доступ да ўкладак у рэжыме інкогніта, калі вы выходзіце з Chromium або пераходзіце ў іншую праграму.</translation> +<translation id="5671188105328420281">Парады адносна Chromium</translation> <translation id="5688047395118852662">На гэтай картцы паказаны прапановы, як карыстацца ўсімі магчымасцямі Chromium.</translation> <translation id="5700709190537129682">Браўзеру Chromium не ўдаецца праверыць паролі</translation> <translation id="5777187867430702742">Старонка Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb index 8a4727dd..8e1cca01 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
@@ -221,7 +221,7 @@ <translation id="7285031092584344905">Отримуйте доступ до паролів Chromium тощо в інших додатках.</translation> <translation id="7313655110045230863">Щоб зробити Chromium веб-переглядачем за умовчанням, відкрийте налаштування, натисніть "Веб-переглядач за умовчанням" і виберіть Chromium.</translation> <translation id="7337881442233988129">Chromium</translation> -<translation id="7357211569052832586">Вибрані дані видалено з Chromium і синхронізованих пристроїв. У вашому обліковому записі Google на сторінці history.google.com може зберігатись історія веб-перегляду (як-от пошукові запити й активність) з інших служб Google.</translation> +<translation id="7357211569052832586">Вибрані дані видалено з Chromium і синхронізованих пристроїв. У вашому обліковому записі Google на сторінці history.google.com може зберігатись історія веб-перегляду (як-от пошукові запити й активність) з інших сервісів Google.</translation> <translation id="7387082980875012885">Відкрити нову вкладку в Chromium</translation> <translation id="7395825497086981028">Ваш пароль буде збережено в Менеджері паролів для електронної адреси <ph name="EMAIL" />.</translation> <translation id="7400689562045506105">Користуйтеся Chromium будь-де</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb index 09e5214..a0a7afa4 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb
@@ -41,6 +41,7 @@ <translation id="1682483655351012182">Сінхранізацыя даных Chrome</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1790080846677398234">Дадае ўведзеныя URL-адрасы ў закладкі ў Chrome.</translation> +<translation id="1799920918471566157">Парады адносна Chrome</translation> <translation id="1830634592642484976">Гэты адрас зараз захаваны ў Chrome. Каб выкарыстоўваць яго ў іншых прадуктах Google, захавайце гэты адрас у сваім Уліковым запісе Google (<ph name="USER_EMAIL" />).</translation> <translation id="1843217788865538014">Chrome можа запускацца аўтаматычна, калі вы націскаеце на спасылкі ў паведамленнях, дакументах і іншых праграмах.</translation> <translation id="1910975740091000991">Chrome для iOS</translation> @@ -75,6 +76,7 @@ <translation id="2702250627063295552">Дадаць элемент у Спіс на прагляд у Chrome</translation> <translation id="2736805085127235148">Апавяшчэнні Chrome адключаны ў наладах прылады.</translation> <translation id="2767464022270041271">Няма захаваных пароляў. Менеджар пароляў Google можа правяраць толькі захаваныя паролі.</translation> +<translation id="2789947168960170215">Калі вы забылі фразу-пароль або хочаце змяніць гэту наладу, <ph name="BEGIN_LINK" />выдаліце даныя Chrome з уліковага запісу<ph name="END_LINK" />.</translation> <translation id="2868822340714096138">Выдаліць даныя пра работу ў браўзеры Chrome</translation> <translation id="2869959624320573933">Увайдзіце ў Chrome</translation> <translation id="2876628302275096482">Даведайцеся больш пра тое, <ph name="BEGIN_LINK" />як Chrome забяспечвае прыватнасць вашых даных<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 366b24b..d2e7449 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Əlfəcinlər, Oxu Siyahısı və ya parol menecerində bu elementlərə baxa və onları idarə edə bilərsiniz.</translation> <translation id="1870148520156231997">Parolu Göstərin</translation> <translation id="1872096359983322073">Fənər</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Bu elementi göstərir</translation> <translation id="1882901927376062252">{count,plural, =1{Əlfəcin Google Hesabında ({email}) yadda saxlandı}other{{count} əlfəcin Google Hesabında ({email}) yadda saxlandı}}</translation> <translation id="1883255238294161206">Siyahını yığcamlaşdırın</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Əsas ekrandan parollara keçin</translation> <translation id="1959441496380398824">Tarixə toxunub saxlayın.</translation> <translation id="1959679933317802873">Məzmun gözlənilir</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> <ph name="WEBSITE" /> üçün parol paylaşıb</translation> <translation id="1967461193809857427">{count,plural, =1{Android-də qaldığınız tabdan davam edilsin?}other{Android-də qaldığınız tablardan davam edilsin?}}</translation> <translation id="1972325230031091483">Cari veb səhifə ziyarətinizə əsasən məzmun proaktiv şəkildə yükləndiyinə görə daha sürətli gözdən keçirəcəksiniz</translation> <translation id="1973912524893600642">Datanı saxlayın</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Qiymət xəbərdarlıqları aktiv edilsin?</translation> <translation id="2139867232736819575">Kopyalanmış Mətni Axtarın</translation> <translation id="214201757571129614">Giriş…</translation> +<translation id="2147127444698817042">Yalnız iPhone-da əlçatandır</translation> <translation id="2148716181193084225">Bu gün</translation> <translation id="2149973817440762519">Əlfəcinə düzəliş edin</translation> <translation id="2175927920773552910">QR Kod</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Brauzinq datası silinir...</translation> <translation id="2251686759395008410">Menyu → Tarixçə</translation> <translation id="2252674110805316998">Veb-axtarış</translation> +<translation id="2252749852083403809"><ph name="USER_EMAIL" /> üçün Diskdə yadda saxlanır.</translation> <translation id="2256933947031277845">Təşkilatınız yalnız müəyyən hesablarla daxil olmağa icazə verir.</translation> <translation id="2258326562203545455">{count,plural, =1{Əlfəcini Google Hesabında ({email}) yadda saxlaya bilərsiniz.}other{Əlfəcinləri Google Hesabında ({email}) yadda saxlaya bilərsiniz.}}</translation> <translation id="225943865679747347">Xəta kodu: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Datanı silin</translation> <translation id="298306318844797842">Ödəniş metodu əlavə edin...</translation> <translation id="2989805286512600854">Yeni Paneldə açın</translation> +<translation id="300455800299409273">"Bu tab ilə davam edin" seçimini gizlədin</translation> <translation id="3010025794097054078">Verilənlərin pozulması, güvənsiz veb-sayt və s. təhlükələrdən qorunun.</translation> <translation id="3010171936431626919">İstifadə qaydası</translation> <translation id="3020183492814296499">Qısayollar</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Oflaynsınız. İnternet bağlantınızı yoxlayın və yenidən cəhd edin.</translation> <translation id="3832419617903252251">Parol yalnız bu cihazda saxlanıldı</translation> <translation id="3835964409414434850">Növbəti taba keçin</translation> +<translation id="383781833195845844">Bu tab ilə davam edin</translation> <translation id="3838691874161539578">Təhlükəsizliyi gücləndirmək və onlayn olarkən təhlükəsiz qalmaq üçün yadda saxlanmış parolları yoxlayın</translation> <translation id="385051799172605136">Geri</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> və digər <ph name="NUMBER_OF_ACCOUNTS" /> hesab üçün parollar silinəcək. Hesablarınız silinməyəcək.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">Siyahını genişləndirin</translation> <translation id="4971735654804503942">Təhlükəli veb saytlar, endirmələr və artırmalara qarşı daha sürətli, fəal qoruma. Sizə parol aşkarlanmaları barədə xəbərdarlıq edir. Baxış datasının Google'a göndərilməsini tələb edir.</translation> <translation id="4979397965658815378">Bütün cihazlarınızda əlfəcin, tarixçə, parol və digər ayarları əldə etmək üçün Google Hesabınız ilə daxil olun.</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> faylının yadda saxlanacağı yeri seçin</translation> <translation id="4996567535980789550">Gördüyünüz kontenti idarə etmək üçün sinxronlaşdırmanı aktiv edin</translation> <translation id="5005498671520578047">Parolu kopyalayın</translation> <translation id="5016420433031926653"><ph name="USER_EMAIL" /> ünvanına göndərin</translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">Versiya <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">Google Hesabında parolları istifadə etmək və yadda saxlamaq üçün kimliyinizi təsdiq edin.</translation> <translation id="5684761169742812828">Bu parol internetdə verilənlərin pozulması nəticəsində ifşa olunub. İndi dəyişməyə vaxt yoxdursa, Google bu xəbərdarlığı sonra xatırlamaq üçün saxlamağı tövsiyə edir.</translation> +<translation id="5694848685995373177"><ph name="USER_EMAIL" /> üçün Diskdə yadda saxlandı.</translation> <translation id="5701270923492462699">Kameraya giriş icazəsi verilib</translation> <translation id="5702108177581350218">İstifadəçi adı və parolun kopyasını paylaşdıqda ailə üzvü Google Parol Meneceri ilə onları daxil edə bilər.</translation> <translation id="5704908597376970822">Daxil olmaq mümkün deyil.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> oxunmamış məqalə.</translation> <translation id="7412027924265291969">Davam edin</translation> <translation id="741204030948306876">Bəli, razıyam</translation> +<translation id="7418640008860669073">Burada yadda saxlayın...</translation> <translation id="7425346204213733349">Əlfəcin, tarixçə, parol və digər ayarlarınızdakı dəyişikliklər artıq Google Hesabınıza sinxronizasiya olunmayacaq. Buna baxmayaraq, mövcud datanız Google hesabınızın yaddaşında qalacaq.</translation> <translation id="7431991332293347422">Axtarış tarixçəsinin Axtarış və sairəni necə fərdiləşdirdiyinə nəzarət edin</translation> <translation id="7435356471928173109">Administratorunuz tərəfindən deaktiv edilib</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">Əlfəcinlər gizlədilib</translation> <translation id="750228856503700085">Güncəlləmələr əlçatan deyil</translation> <translation id="750493650310597496">1 ədəd seçilib</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">Anonim tablarınızı kilidləmək üçün Touch ID, Face ID və ya Parol ayarlayın.</translation> <translation id="7514365320538308">Endirmə</translation> <translation id="7524055474074101597">Tətbiqlərdə parol və s. məlumatlara giriş.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">Yeni Panel</translation> <translation id="7557508262441527045">Çıxılıb</translation> <translation id="7561196759112975576">Həmişə</translation> +<translation id="7564917801238348224">YADDA SAXLAYIN...</translation> <translation id="7582857256643797524">Bu ayar cihazda aktivləşdirilib</translation> <translation id="7583004045319035904">Anonim tabları kiliddən çıxarmaq üçün <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> istifadə edin.</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> heç vaxt tərcümə etməyin</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">Şəhər / Kənd</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8428634594422941299">Anladım</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> faylını (<ph name="FILE_SIZE" />) yadda saxlayacağınız yeri seçin</translation> <translation id="8446884382197647889">Ətraflı Məlumat</translation> <translation id="8449347986464073209">Silin və çıxın</translation> <translation id="8459333855531264009">Təhlükəsiz deyil</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 41c1f54..4946ea1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Вы таксама можаце праглядаць гэтыя даныя і кіраваць імі ў закладках, спісе на прагляд і ў менеджары пароляў.</translation> <translation id="1870148520156231997">Паказаць пароль</translation> <translation id="1872096359983322073">Ліхтарык</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Паказвае гэты прадмет</translation> <translation id="1882901927376062252">{count,plural, =1{Закладка захавана ў вашым Уліковым запісе Google ({email})}one{{count} закладка захавана ў вашым Уліковым запісе Google ({email})}few{{count} закладкі захаваны ў вашым Уліковым запісе Google ({email})}many{{count} закладак захавана ў вашым Уліковым запісе Google ({email})}other{{count} закладкі захаваны ў вашым Уліковым запісе Google ({email})}}</translation> <translation id="1883255238294161206">Згарнуць спіс</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Доступ да пароляў з галоўнага экрана</translation> <translation id="1959441496380398824">Націсніце і ўтрымлівайце дату.</translation> <translation id="1959679933317802873">Чакаецца атрыманне змесціва</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> абагульвае з вамі пароль для сайта <ph name="WEBSITE" /></translation> <translation id="1967461193809857427">{count,plural, =1{Адкрыць укладку, якую вы праглядалі на Android?}one{Адкрыць укладкі, якія вы праглядалі на Android?}few{Адкрыць укладкі, якія вы праглядалі на Android?}many{Адкрыць укладкі, якія вы праглядалі на Android?}other{Адкрыць укладкі, якія вы праглядалі на Android?}}</translation> <translation id="1972325230031091483">Паскорыцца прагляд сайтаў, паколькі змесціва будзе загружацца без запыту на падставе даных з бягучай вэб-старонкі</translation> <translation id="1973912524893600642">Захаваць даныя</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Уключыць абвесткі аб зніжэнні цэн?</translation> <translation id="2139867232736819575">Пошук скапіраванага тэксту</translation> <translation id="214201757571129614">Увайсці…</translation> +<translation id="2147127444698817042">Даступна толькі на iPhone</translation> <translation id="2148716181193084225">Сёння</translation> <translation id="2149973817440762519">Рэдагаваць закладку</translation> <translation id="2175927920773552910">QR-код</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Ідзе ачыстка даных прагляду...</translation> <translation id="2251686759395008410">Меню → Гісторыя</translation> <translation id="2252674110805316998">Вэб-пошук</translation> +<translation id="2252749852083403809">Ідзе захаванне на Дыску карыстальніка <ph name="USER_EMAIL" />.</translation> <translation id="2256933947031277845">Палітыка вашай арганізацыі дазваляе ўваходзіць у сістэмы, выкарыстоўваючы толькі пэўныя ўліковыя запісы.</translation> <translation id="2258326562203545455">{count,plural, =1{Вы можаце захаваць закладку ва Уліковым запісе Google ({email}).}one{Вы можаце захаваць закладкі ва Уліковым запісе Google ({email}).}few{Вы можаце захаваць закладкі ва Уліковым запісе Google ({email}).}many{Вы можаце захаваць закладкі ва Уліковым запісе Google ({email}).}other{Вы можаце захаваць закладкі ва Уліковым запісе Google ({email}).}}</translation> <translation id="225943865679747347">Код памылкі: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Выдаліць даныя</translation> <translation id="298306318844797842">Дадаць спосаб аплаты...</translation> <translation id="2989805286512600854">Адкрыць у новай укладцы</translation> +<translation id="300455800299409273">Схаваць параметр "Працягнуць працу з гэтай укладкай"</translation> <translation id="3010025794097054078">Прадухіленне праблем, звязаных з уцечкай даных, наведваннем небяспечных вэб-сайтаў і г. д.</translation> <translation id="3010171936431626919">Паказаць</translation> <translation id="3020183492814296499">Спалучэнні клавіш</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Вы па-за сеткай. Праверце падключэнне да інтэрнэту і паўтарыце спробу.</translation> <translation id="3832419617903252251">Паролі захоўваюцца толькі на гэтай прыладзе</translation> <translation id="3835964409414434850">Перайсці на наступную ўкладку</translation> +<translation id="383781833195845844">Працягнуць працу з гэтай укладкай</translation> <translation id="3838691874161539578">Праверце захаваныя паролі, каб абараніць уліковы запіс і павысіць сваю бяспеку ў інтэрнэце</translation> <translation id="385051799172605136">Назад</translation> <translation id="3851938967634752633">Паролі для вэб-сайтаў <ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> і яшчэ <ph name="NUMBER_OF_ACCOUNTS" /> будуць выдалены. Вашы ўліковыя запісы захаваюцца.</translation> @@ -555,6 +561,7 @@ <translation id="3922310737605261887">Шукаць скапіраваны тэкст</translation> <translation id="3928666092801078803">Аб'яднаць мае даныя</translation> <translation id="3929457972718048006">Адрасы</translation> +<translation id="3948600256434252210">Каб праглядаць сайты ў рэжыме інкогніта, правядзіце пальцам па экране ўправа.</translation> <translation id="3955822496205734389">У вас ёсць ненадзейныя паролі.</translation> <translation id="3959736869653157332">Меню → Новая ўкладка ў рэжыме інкогніта</translation> <translation id="3962326069546168954">Захаваць</translation> @@ -659,6 +666,7 @@ <translation id="4539187448429948815">{count,plural, =1{{count} захаваная прапанова аўтазапаўнення паказана над клавіятурай.}one{{count} захаваная прапанова аўтазапаўнення паказана над клавіятурай.}few{{count} захаваныя прапановы аўтазапаўнення паказаны над клавіятурай.}many{{count} захаваных прапаноў аўтазапаўнення паказаны над клавіятурай.}other{{count} захаванай прапановы аўтазапаўнення паказаны над клавіятурай.}}</translation> <translation id="4540780316273593836">Нешта пайшло не так</translation> <translation id="4550040941166547650">Толькі на гэтай прыладзе.</translation> +<translation id="4564893319561643483">Схаваць модуль "<ph name="TITLE" />"</translation> <translation id="457292989631956153">{COUNT,plural, =1{Закрыць {COUNT} неактыўную ўкладку?}one{Закрыць {COUNT} неактыўную ўкладку?}few{Закрыць {COUNT} неактыўныя ўкладкі?}many{Закрыць {COUNT} неактыўных укладак?}other{Закрыць {COUNT} неактыўнай укладкі?}}</translation> <translation id="457386861538956877">Яшчэ...</translation> <translation id="4587589328781138893">Сайты</translation> @@ -751,6 +759,7 @@ <translation id="4958444002117714549">Разгарнуць спіс</translation> <translation id="4971735654804503942">Больш хуткая актыўная абарона ад небяспечных вэб-сайтаў, спамповак і пашырэнняў. Папярэджвае пра ўцечкі пароляў. Патрабуе адпраўкі даных прагляду сайтаў у Google.</translation> <translation id="4979397965658815378">Каб закладкі, паролі, гісторыя і іншыя налады былі даступнымі на ўсіх вашых прыладах, увайдзіце ва Уліковы запіс Google</translation> +<translation id="4989065233040279145">Выберыце, куды захаваць файл "<ph name="FILENAME" />"</translation> <translation id="4996567535980789550">Каб выбраць, якое змесціва павінна вам паказвацца, уключыце сінхранізацыю</translation> <translation id="5005498671520578047">Капіраваць пароль</translation> <translation id="5016420433031926653">Адправіць на адрас <ph name="USER_EMAIL" /></translation> @@ -876,6 +885,7 @@ <translation id="567881659373499783">Версія <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">Каб захоўваць і выкарыстоўваць паролі ва Уліковым запісе Google, пацвердзіце сваю асобу.</translation> <translation id="5684761169742812828">Ваш пароль быў раскрыты пры ўцечцы даных у інтэрнэце. Калі ў вас няма часу змяніць яго прама зараз, мы раім захаваць гэта папярэджанне, каб не забыць аб неабходнасці зрабіць гэта пазней.</translation> +<translation id="5694848685995373177">Захавана на Дыску карыстальніка <ph name="USER_EMAIL" />.</translation> <translation id="5701270923492462699">Доступ да камеры дазволены</translation> <translation id="5702108177581350218">Калі вы абагуліце копію свайго імені карыстальніка і пароля, удзельнікі вашай сямейнай групы змогуць выкарыстоўваць іх з дапамогай Менеджара пароляў Google.</translation> <translation id="5704908597376970822">Не ўдалося ўвайсці ў сістэму.</translation> @@ -1214,6 +1224,7 @@ <translation id="7409985198648820906">Непрачытаных артыкулаў: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Працягнуць</translation> <translation id="741204030948306876">Так, я згаджаюся</translation> +<translation id="7418640008860669073">Куды захаваць...</translation> <translation id="7425346204213733349">Змены ў закладках, гісторыі, паролях і іншых наладах больш не будуць сінхранізавацца з Уліковым запісам Google. Але існуючыя даныя застануцца ва Уліковым запісе Google.</translation> <translation id="7431991332293347422">Кіраванне тым, як ваша гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку і ў іншых мэтах</translation> <translation id="7435356471928173109">Выключаны адміністратарам</translation> @@ -1232,6 +1243,7 @@ <translation id="750149195207506638">Закладкі схаваны</translation> <translation id="750228856503700085">Абнаўленні недаступныя</translation> <translation id="750493650310597496">Выбрана: 0</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">Каб блакіраваць свае ўкладкі ў рэжыме інкогніта, наладзьце Touch ID, Face ID або код доступу.</translation> <translation id="7514365320538308">Спампаваць</translation> <translation id="7524055474074101597">Атрымлівайце доступ да пароляў і іншых даных для ўваходу ў праграмы.</translation> @@ -1245,6 +1257,7 @@ <translation id="7554791636758816595">Новая ўкладка</translation> <translation id="7557508262441527045">Выкананы выхад</translation> <translation id="7561196759112975576">Заўсёды</translation> +<translation id="7564917801238348224">ЗАХАВАЦЬ...</translation> <translation id="7582857256643797524">Гэта налада ўключана на вашай прыладзе</translation> <translation id="7583004045319035904">Выкарыстоўвайце <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> для разблакіроўкі ўкладак у рэжыме інкогніта</translation> <translation id="7600965453749440009">Ніколі не перакладаць з мовы: <ph name="LANGUAGE" /></translation> @@ -1259,6 +1272,7 @@ <translation id="7658239707568436148">Скасаваць</translation> <translation id="7666861622396822790">Гэтай функцыяй можна кіраваць у <ph name="BEGIN_LINK" />наладах змесціва<ph name="END_LINK" />.</translation> <translation id="7671141431838911305">УСТАЛЯВАЦЬ</translation> +<translation id="7673346542062368520">Каб праглядаць сайты ў рэжыме інкогніта, правядзіце пальцам па экране ўлева.</translation> <translation id="7679915578945954324">Адрасы сайтаў скапіраваны</translation> <translation id="7687508192620387263">Даступны файл календара</translation> <translation id="7701040980221191251">Няма</translation> @@ -1409,6 +1423,7 @@ <translation id="8428045167754449968">Горад або населены пункт</translation> <translation id="8428213095426709021">Налады</translation> <translation id="8428634594422941299">Зразумела</translation> +<translation id="8430694217306051839">Выберыце, куды захаваць файл "<ph name="FILENAME" />" (<ph name="FILE_SIZE" />)</translation> <translation id="8446884382197647889">Даведацца больш</translation> <translation id="8449347986464073209">Выдаліць і выйсці</translation> <translation id="8459333855531264009">Небяспечны сайт</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 191048ba..c07a1f6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Također možete pregledati te stavke i upravljati njima u oznakama, na Listi za čitanje ili upravitelju lozinki.</translation> <translation id="1870148520156231997">Otkrij lozinku</translation> <translation id="1872096359983322073">Svjetiljka</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Prikazuje ovu stavku</translation> <translation id="1882901927376062252">{count,plural, =1{Oznaka je sačuvana na Google računu {email}}one{{count} oznaka je sačuvana na Google računu {email}}few{{count} oznake su sačuvane na Google računu {email}}other{{count} oznaka je sačuvano na Google računu {email}}}</translation> <translation id="1883255238294161206">Suzi spisak</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Pristupajte lozinkama s početnog ekrana</translation> <translation id="1959441496380398824">Dodirnite i zadržite datum.</translation> <translation id="1959679933317802873">Čeka se sadržaj</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> je s vama podijelio/la lozinku za web lokaciju <ph name="WEBSITE" /></translation> <translation id="1967461193809857427">{count,plural, =1{Nastaviti s karticom koju ste napustili na Androidu?}one{Nastaviti s karticama koje ste napustili na Androidu?}few{Nastaviti s karticama koje ste napustili na Androidu?}other{Nastaviti s karticama koje ste napustili na Androidu?}}</translation> <translation id="1972325230031091483">Pregledat ćete brže jer se sadržaj učitava proaktivno na osnovu vaše posjete trenutnoj web stranici</translation> <translation id="1973912524893600642">Zadrži podatke</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Uključiti obavještenja o cijenama?</translation> <translation id="2139867232736819575">Pretraži kopirani tekst</translation> <translation id="214201757571129614">Prijava…</translation> +<translation id="2147127444698817042">Dostupno je samo na iPhoneu</translation> <translation id="2148716181193084225">Danas</translation> <translation id="2149973817440762519">Uredi oznaku</translation> <translation id="2175927920773552910">QR kôd</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Brisanje podataka pregledanja...</translation> <translation id="2251686759395008410">Meni → Historija</translation> <translation id="2252674110805316998">Pretraživanje interneta</translation> +<translation id="2252749852083403809">Pohranjivanje na Disk za <ph name="USER_EMAIL" />.</translation> <translation id="2256933947031277845">Vaša organizacija vam dozvoljava da se prijavite samo s određenim računima.</translation> <translation id="2258326562203545455">{count,plural, =1{Možete sačuvati oznaku na Google račun {email}.}one{Možete sačuvati oznake na Google račun {email}.}few{Možete sačuvati oznake na Google račun {email}.}other{Možete sačuvati oznake na Google račun {email}.}}</translation> <translation id="225943865679747347">Kȏd greške: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Obriši podatke</translation> <translation id="298306318844797842">Dodajte način plaćanja...</translation> <translation id="2989805286512600854">Otvori u novoj kartici</translation> +<translation id="300455800299409273">Sakrij "Nastavi s ovom karticom"</translation> <translation id="3010025794097054078">Zaštitite se od narušavanja podataka, nesigurnih web lokacija i još mnogo toga.</translation> <translation id="3010171936431626919">Pokaži mi kako</translation> <translation id="3020183492814296499">Prečice</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Offline ste. Provjerite internetsku vezu i pokušajte ponovo.</translation> <translation id="3832419617903252251">Lozinka je sačuvana samo na ovom uređaju</translation> <translation id="3835964409414434850">Odlazak na sljedeću karticu</translation> +<translation id="383781833195845844">Nastavi s ovom karticom</translation> <translation id="3838691874161539578">Provjerite sačuvane lozinke da ojačate sigurnost i budete sigurniji online</translation> <translation id="385051799172605136">Nazad</translation> <translation id="3851938967634752633">Lozinke za <ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> i još <ph name="NUMBER_OF_ACCOUNTS" /> račun/a će se izbrisati. Vaši računi se neće izbrisati.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">Proširi listu</translation> <translation id="4971735654804503942">Brža, proaktivna zaštita od opasnih web lokacija, preuzimanja i ekstenzija. Upozorava vas na narušavanje lozinki. Zahtijeva da se podaci o pregledanju šalju Googleu.</translation> <translation id="4979397965658815378">Prijavite se na svoj Google račun da dobijete oznake, lozinke, historiju i ostale postavke na svim svojim uređajima.</translation> +<translation id="4989065233040279145">Odaberite gdje želite sačuvati fajl <ph name="FILENAME" /></translation> <translation id="4996567535980789550">Uključite sinhronizaciju da upravljate sadržajem koji vidite</translation> <translation id="5005498671520578047">Kopiranje lozinke</translation> <translation id="5016420433031926653">Pošaljite primaocu <ph name="USER_EMAIL" /></translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">Verzija <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">Da koristite i sačuvate lozinke na Google računu, potvrdite identitet.</translation> <translation id="5684761169742812828">Lozinka je bila izložena u narušavanju podataka na internetu. Ako sada nemate vremena da je promijenite, Google vam preporučuje da sačuvate ovo upozorenje kao podsjetnik za kasnije.</translation> +<translation id="5694848685995373177">Sačuvano je na Disk za <ph name="USER_EMAIL" />.</translation> <translation id="5701270923492462699">Pristup kameri je dozvoljen</translation> <translation id="5702108177581350218">Kada podijelite kopiju svog korisničkog imena i lozinke, član vaše porodice ih može popuniti pomoću Google upravitelja lozinki.</translation> <translation id="5704908597376970822">Nije se moguće prijaviti.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906">Broj nepročitanih članaka: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Nastavi</translation> <translation id="741204030948306876">Da, želim</translation> +<translation id="7418640008860669073">Pohranjivanje na lokaciju…</translation> <translation id="7425346204213733349">Promjene vaših oznaka, historije, lozinki i drugih postavki neće se više sinhronizirati s vašim Google računom. Međutim, vaši postojeći podaci će ostati pohranjeni na vašem Google računu.</translation> <translation id="7431991332293347422">Kontrolirajte kako se koristi vaša historija pregledanja za personalizaciju Pretraživanja i još mnogo toga</translation> <translation id="7435356471928173109">Funkciju je isključio vaš administrator</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">Oznake su sakrivene</translation> <translation id="750228856503700085">Ažuriranja nisu dostupna</translation> <translation id="750493650310597496">Odabrano je 0 oznaka</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">Da zaključate anonimne kartice, postavite Touch ID, Face ID ili šifru.</translation> <translation id="7514365320538308">Preuzmi</translation> <translation id="7524055474074101597">Pristupajte lozinkama i još mnogo toga na svim aplikacijama.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">Nova kartica</translation> <translation id="7557508262441527045">Odjavljeni ste</translation> <translation id="7561196759112975576">Uvijek</translation> +<translation id="7564917801238348224">POHRANJIVANJE…</translation> <translation id="7582857256643797524">Ova postavka je omogućena na uređaju</translation> <translation id="7583004045319035904">Koristite <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> da otključate svoje anonimne kartice.</translation> <translation id="7600965453749440009">Nikad ne prevodi <ph name="LANGUAGE" /> jezik</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">Grad/mjesto</translation> <translation id="8428213095426709021">Postavke</translation> <translation id="8428634594422941299">Razumijem</translation> +<translation id="8430694217306051839">Odaberite gdje želite sačuvati fajl <ph name="FILENAME" /> (<ph name="FILE_SIZE" />)</translation> <translation id="8446884382197647889">Saznajte više</translation> <translation id="8449347986464073209">Izbriši i odjavi</translation> <translation id="8459333855531264009">Nije sigurno</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index ad99acd..e2b9ed5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Te stavke također možete gledati i upravljati njima u oznakama, popisu za čitanje ili upravitelju zaporki.</translation> <translation id="1870148520156231997">Otkrijte zaporku</translation> <translation id="1872096359983322073">Svjetlo</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Prikazuje ovu stavku</translation> <translation id="1882901927376062252">{count,plural, =1{Oznaka je spremljena na vaš Google račun, {email}}one{{count} je oznaka spremljena na vaš Google račun, {email}}few{{count} su oznake spremljene na vaš Google račun, {email}}other{{count} je oznaka spremljeno na vaš Google račun, {email}}}</translation> <translation id="1883255238294161206">Sažmi popis</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Pristup zaporkama s početnog zaslona</translation> <translation id="1959441496380398824">Dodirnite i zadržite datum.</translation> <translation id="1959679933317802873">Čekanje sadržaja</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> s vama dijeli zaporku za web-lokaciju <ph name="WEBSITE" /></translation> <translation id="1967461193809857427">{count,plural, =1{Želite li nastaviti na kartici na kojoj ste stali na Androidu?}one{Želite li nastaviti na karticama na kojima ste stali na Androidu?}few{Želite li nastaviti na karticama na kojima ste stali na Androidu?}other{Želite li nastaviti na karticama na kojima ste stali na Androidu?}}</translation> <translation id="1972325230031091483">Pregledavat ćete brže jer se sadržaj učitava proaktivno na temelju vašeg trenutačnog posjeta web-stranici</translation> <translation id="1973912524893600642">Zadrži podatke</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Uključiti upozorenja o cijeni?</translation> <translation id="2139867232736819575">Pretraživanje teksta koji ste kopirali</translation> <translation id="214201757571129614">Prijavite se…</translation> +<translation id="2147127444698817042">Dostupno samo na iPhoneu</translation> <translation id="2148716181193084225">Danas</translation> <translation id="2149973817440762519">Uredi oznaku</translation> <translation id="2175927920773552910">QR kôd</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Brisanje podataka o pregledavanju...</translation> <translation id="2251686759395008410">Izbornik → Povijest</translation> <translation id="2252674110805316998">Pretraživanje weba</translation> +<translation id="2252749852083403809">Spremanje na Disk za <ph name="USER_EMAIL" />.</translation> <translation id="2256933947031277845">Vaša organizacija dopušta da se prijavite samo putem određenih računa.</translation> <translation id="2258326562203545455">{count,plural, =1{Oznaku možete spremiti na svoj Google račun, {email}.}one{Oznake možete spremiti na svoj Google račun, {email}.}few{Oznake možete spremiti na svoj Google račun, {email}.}other{Oznake možete spremiti na svoj Google račun, {email}.}}</translation> <translation id="225943865679747347">Kôd pogreške: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Izbriši podatke</translation> <translation id="298306318844797842">Dodajte način plaćanja...</translation> <translation id="2989805286512600854">Otvori u novoj kartici</translation> +<translation id="300455800299409273">Sakrij opciju Nastavi s ovom karticom</translation> <translation id="3010025794097054078">Zaštitite se od neovlaštenog pristupa podacima, nesigurnih web-lokacija i drugih opasnosti.</translation> <translation id="3010171936431626919">Pokaži mi kako</translation> <translation id="3020183492814296499">Prečaci</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Niste povezani s internetom. Provjerite internetsku vezu i pokušajte ponovo.</translation> <translation id="3832419617903252251">Zaporka je spremljena samo na ovaj uređaj</translation> <translation id="3835964409414434850">Prelazak na sljedeću karticu</translation> +<translation id="383781833195845844">Nastavi s ovom karticom</translation> <translation id="3838691874161539578">Provjerite svoje spremljene zaporke da biste se bolje zaštitili i da biste bili sigurniji online</translation> <translation id="385051799172605136">Natrag</translation> <translation id="3851938967634752633">Izbrisat će se zaporke za <ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> i još <ph name="NUMBER_OF_ACCOUNTS" /> račun/računa. Vaši se računi neće izbrisati.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">Proširi popis</translation> <translation id="4971735654804503942">Brža, proaktivna zaštita od opasnih web-lokacija, preuzimanja i proširenja. Upozorava vas na povrede zaporki. Traži slanje podataka o pregledavanju Googleu.</translation> <translation id="4979397965658815378">Prijavite se Google računom da biste imali pristup svojim oznakama, zaporkama, povijesti i ostalim postavkama na svim svojim uređajima</translation> +<translation id="4989065233040279145">Odaberite mjesto spremanja datoteke <ph name="FILENAME" /></translation> <translation id="4996567535980789550">Uključite sinkronizaciju da biste upravljali sadržajem koji vam se prikazuje</translation> <translation id="5005498671520578047">Kopiranje zaporke</translation> <translation id="5016420433031926653">Šalju se na <ph name="USER_EMAIL" /></translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">Verzija <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">Da biste upotrebljavali i spremali zaporke na svojem Google računu, potvrdite svoj identitet.</translation> <translation id="5684761169742812828">Zaporka je izložena u neovlaštenom pristupu podacima na internetu. Ako trenutačno nemate vremena da biste je izmijenili, Google preporučuje da sačuvate ovo upozorenje kako biste se podsjetili kasnije.</translation> +<translation id="5694848685995373177">Spremljeno na Disk za <ph name="USER_EMAIL" />.</translation> <translation id="5701270923492462699">Dopušten je pristup kameri</translation> <translation id="5702108177581350218">Kad podijelite kopiju svojeg korisničkog imena i zaporke, član vaše obitelji može ih unijeti pomoću Google upravitelja zaporki.</translation> <translation id="5704908597376970822">Prijava nije uspjela.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906">Nepročitanih članaka: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Nastavi</translation> <translation id="741204030948306876">Da, u redu</translation> +<translation id="7418640008860669073">Spremi u...</translation> <translation id="7425346204213733349">Promjene oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši postojeći podaci ostat će pohranjeni na vašem Google računu.</translation> <translation id="7431991332293347422">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja i drugih značajki</translation> <translation id="7435356471928173109">Isključio vaš administrator</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">Oznake su skrivene</translation> <translation id="750228856503700085">Ažuriranja nisu dostupna</translation> <translation id="750493650310597496">Nije odabrana nijedna oznaka</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">Da biste zaključali anonimne kartice, postavite Touch ID, Face ID ili šifru.</translation> <translation id="7514365320538308">Preuzmi</translation> <translation id="7524055474074101597">Pristupajte svojim zaporkama i ostalim podacima u aplikacijama.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">Nova kartica</translation> <translation id="7557508262441527045">Odjavljeni ste</translation> <translation id="7561196759112975576">Uvijek</translation> +<translation id="7564917801238348224">SPREMANJE...</translation> <translation id="7582857256643797524">Ta je postavka omogućena na vašem uređaju</translation> <translation id="7583004045319035904">Koristite <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> za otključavanje anonimnih kartica.</translation> <translation id="7600965453749440009">Nikad ne prevodi <ph name="LANGUAGE" /></translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">Grad/mjesto</translation> <translation id="8428213095426709021">Postavke</translation> <translation id="8428634594422941299">Shvaćam</translation> +<translation id="8430694217306051839">Odaberite mjesto spremanja datoteke <ph name="FILENAME" /> (<ph name="FILE_SIZE" />)</translation> <translation id="8446884382197647889">Saznajte više</translation> <translation id="8449347986464073209">Izbriši i odjavi se</translation> <translation id="8459333855531264009">Nije sigurno</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index b36b4f7..3a6c0e9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಓದುವ ಪಟ್ಟಿ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ನೀವು ಈ ಐಟಂಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.</translation> <translation id="1870148520156231997">ಪಾಸ್ವರ್ಡ್ ತೋರಿಸಿ</translation> <translation id="1872096359983322073">ಟಾರ್ಚ್</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">ಈ ಐಟಂ ಅನ್ನು ತೋರಿಸುತ್ತದೆ</translation> <translation id="1882901927376062252">{count,plural, =1{ಬುಕ್ಮಾರ್ಕ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗಿದೆ, {email}}one{{count} ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗಿದೆ, {email}}other{{count} ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗಿದೆ, {email}}}</translation> <translation id="1883255238294161206">ಪಟ್ಟಿಯನ್ನು ಸಂಕುಚಿಸಿ</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">ಹೋಮ್ ಸ್ಕ್ರೀನ್ನಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳಿಗೆ ಹೋಗಿ</translation> <translation id="1959441496380398824">ದಿನಾಂಕವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ.</translation> <translation id="1959679933317802873">ವಿಷಯಕ್ಕಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> ಅವರು <ph name="WEBSITE" /> ಗೆ ಸಂಬಂಧಿಸಿದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮೊಂದಿಗೆ ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ</translation> <translation id="1967461193809857427">{count,plural, =1{ನೀವು Android ನಲ್ಲಿ ಬಿಟ್ಟಿರುವ ಟ್ಯಾಬ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಬೇಕೆ?}one{ನೀವು Android ನಲ್ಲಿ ಬಿಟ್ಟಿರುವ ಟ್ಯಾಬ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬೇಕೆ?}other{ನೀವು Android ನಲ್ಲಿ ಬಿಟ್ಟಿರುವ ಟ್ಯಾಬ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬೇಕೆ?}}</translation> <translation id="1972325230031091483">ನಿಮ್ಮ ಪ್ರಸ್ತುತ ವೆಬ್ಪುಟದ ಭೇಟಿಯ ಆಧಾರದ ಮೇಲೆ ವಿಷಯವನ್ನು ಪೂರ್ವಭಾವಿಯಾಗಿ ಲೋಡ್ ಮಾಡಿರುವುದರಿಂದ ನೀವು ವೇಗವಾಗಿ ಬ್ರೌಸ್ ಮಾಡುತ್ತೀರಿ</translation> <translation id="1973912524893600642">ಡೇಟಾವನ್ನು ಇರಿಸಿಕೊಳ್ಳಿ</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">ದರಗಳ ಕುರಿತಾದ ಎಚ್ಚರಿಕೆಗಳನ್ನು ಆನ್ ಮಾಡಬೇಕೆ?</translation> <translation id="2139867232736819575">ನೀವು ನಕಲಿಸಿದ ಪಠ್ಯವನ್ನು ಹುಡುಕಿ</translation> <translation id="214201757571129614">ಸೈನ್ ಇನ್…</translation> +<translation id="2147127444698817042">iPhone ನಲ್ಲಿ ಮಾತ್ರ ಲಭ್ಯವಿದೆ</translation> <translation id="2148716181193084225">ಇಂದು</translation> <translation id="2149973817440762519">ಬುಕ್ಮಾರ್ಕ್ ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="2175927920773552910">QR ಕೋಡ್</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="2251686759395008410">ಮೆನು → ಇತಿಹಾಸ</translation> <translation id="2252674110805316998">ವೆಬ್ ಹುಡುಕಾಟ</translation> +<translation id="2252749852083403809"><ph name="USER_EMAIL" /> ಗಾಗಿ Drive ನಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation> <translation id="2256933947031277845">ಕೆಲವು ಖಾತೆಗಳ ಮೂಲಕ ಮಾತ್ರ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಸಂಸ್ಥೆ ನಿಮಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ.</translation> <translation id="2258326562203545455">{count,plural, =1{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ ಅನ್ನು ನೀವು ಸೇವ್ ಮಾಡಬಹುದು, {email}.}one{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ನೀವು ಸೇವ್ ಮಾಡಬಹುದು, {email}.}other{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ನೀವು ಸೇವ್ ಮಾಡಬಹುದು, {email}.}}</translation> <translation id="225943865679747347">ದೋಷ ಕೋಡ್: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">ಡೇಟಾ ತೆರವುಗೊಳಿಸಿ</translation> <translation id="298306318844797842">ಪಾವತಿ ವಿಧಾನವನ್ನು ಸೇರಿಸಿ...</translation> <translation id="2989805286512600854">ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation> +<translation id="300455800299409273">"ಈ ಟ್ಯಾಬ್ನೊಂದಿಗೆ ಮುಂದುವರಿಯಿರಿ" ಅನ್ನು ಮರೆಮಾಡಿ.</translation> <translation id="3010025794097054078">ಡೇಟಾ ಉಲ್ಲಂಘನೆಗಳು, ಅಸುರಕ್ಷಿತ ವೆಬ್ಸೈಟ್ಗಳು ಹಾಗೂ ಇತ್ಯಾದಿಗಳಿಂದ ಸುರಕ್ಷಿತವಾಗಿರಿ.</translation> <translation id="3010171936431626919">ಹೇಗೆಂದು ನನಗೆ ತೋರಿಸಿ</translation> <translation id="3020183492814296499">ಶಾರ್ಟ್ಕಟ್ಗಳು</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">ನೀವು ಆಫ್ಲೈನ್ನಲ್ಲಿರುವಿರಿ. ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="3832419617903252251">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಸೇವ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="3835964409414434850">ಮುಂದಿನ ಟ್ಯಾಬ್ಗೆ ಹೋಗಿ</translation> +<translation id="383781833195845844">ಈ ಟ್ಯಾಬ್ನೊಂದಿಗೆ ಮುಂದುವರಿಯಿರಿ</translation> <translation id="3838691874161539578">ನಿಮ್ಮ ಸುರಕ್ಷತೆಯನ್ನು ಬಲಪಡಿಸಲು ನಿಮ್ಮ ಉಳಿಸಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಆನ್ಲೈನ್ನಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿರಿ</translation> <translation id="385051799172605136">ಹಿಂದೆ</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> ಹಾಗೂ ಇತರೆ <ph name="NUMBER_OF_ACCOUNTS" /> ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಖಾತೆಗಳನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">ಪಟ್ಟಿಯನ್ನು ವಿಸ್ತರಿಸಿ</translation> <translation id="4971735654804503942">ಅಪಾಯಕಾರಿ ವೆಬ್ಸೈಟ್ಗಳು, ಡೌನ್ಲೋಡ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳ ವಿರುದ್ಧ ವೇಗವಾದ, ಪೂರ್ವಭಾವಿ ಸುರಕ್ಷತೆ. ಪಾಸ್ವರ್ಡ್ ಉಲ್ಲಂಘನೆಗಳ ಕುರಿತು ನಿಮಗೆ ಎಚ್ಚರಿಕೆ ನೀಡುತ್ತದೆ. Google ಗೆ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಕಳುಹಿಸುವ ಅಗತ್ಯವಿರುತ್ತದೆ.</translation> <translation id="4979397965658815378">ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಪಡೆಯಲು ನಿಮ್ಮ Google ಖಾತೆ ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> ಅನ್ನು ಎಲ್ಲಿ ಸೇವ್ ಮಾಡಬೇಕೆಂದು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="4996567535980789550">ನೀವು ನೋಡುವ ವಿಷಯವನ್ನು ನಿರ್ವಹಿಸಲು ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> <translation id="5005498671520578047">ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಿ</translation> <translation id="5016420433031926653"><ph name="USER_EMAIL" /> ಗೆ ಕಳುಹಿಸಿ</translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">ಆವೃತ್ತಿ <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿನ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಲು ಮತ್ತು ಉಳಿಸಲು, ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ.</translation> <translation id="5684761169742812828">ಇಂಟರ್ನೆಟ್ನಲ್ಲಿನ ಡೇಟಾ ಉಲ್ಲಂಘನೆಯ ಮೂಲಕ ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಹಿರಂಗಪಡಿಸಲಾಗಿದೆ. ಈಗಲೇ ಅದನ್ನು ಬದಲಾಯಿಸಲು ನಿಮಗೆ ಸಮಯವಿಲ್ಲದಿದ್ದರೆ, ನಂತರದ ಸಮಯದಲ್ಲಿ ನಿಮಗೆ ರಿಮೈಂಡ್ ಮಾಡುವುದಕ್ಕೆ ಈ ಎಚ್ಚರಿಕೆಯನ್ನು ಇರಿಸಿಕೊಳ್ಳಲು Google ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation> +<translation id="5694848685995373177"><ph name="USER_EMAIL" /> ಗಾಗಿ Drive ನಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗಿದೆ.</translation> <translation id="5701270923492462699">ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="5702108177581350218">ನಿಮ್ಮ ಬಳಕೆದಾರರ ಹೆಸರು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ನ ಕಾಪಿ ಅನ್ನು ನೀವು ಹಂಚಿಕೊಂಡಾಗ, ನಿಮ್ಮ ಕುಟುಂಬದ ಸದಸ್ಯರು Google Password Manager ಅನ್ನು ಬಳಸಿಕೊಂಡು ಅವುಗಳನ್ನು ಭರ್ತಿ ಮಾಡಬಹುದು.</translation> <translation id="5704908597376970822">ಸೈನ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ಓದದಿರುವ ಲೇಖನಗಳು.</translation> <translation id="7412027924265291969">ಮುಂದುವರಿಸಿ</translation> <translation id="741204030948306876">ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation> +<translation id="7418640008860669073">ಸೇವ್ ಮಾಡಿ...</translation> <translation id="7425346204213733349">ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಮಾಡಲಾಗುವ ಬದಲಾವಣೆಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಿಂಕ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಆದಾಗ್ಯೂ, ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿಯೇ ಇರುತ್ತದೆ.</translation> <translation id="7431991332293347422">ಹುಡುಕಾಟ ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="7435356471928173109">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಆಫ್ ಮಾಡಿದ್ದಾರೆ</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ</translation> <translation id="750228856503700085">ಅಪ್ಡೇಟ್ಗಳು ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="750493650310597496">0 ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">ನಿಮ್ಮ ಅಜ್ಞಾತ ಟ್ಯಾಬ್ಗಳನ್ನು ಲಾಕ್ ಮಾಡಲು, Touch ID, Face ID ಅಥವಾ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ.</translation> <translation id="7514365320538308">ಡೌನ್ಲೋಡ್</translation> <translation id="7524055474074101597">ಆ್ಯಪ್ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">ಹೊಸ ಟ್ಯಾಬ್</translation> <translation id="7557508262441527045">ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation> <translation id="7561196759112975576">ಯಾವಾಗಲೂ</translation> +<translation id="7564917801238348224">ಸೇವ್ ಮಾಡಿ...</translation> <translation id="7582857256643797524">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="7583004045319035904">ನಿಮ್ಮ ಅಜ್ಞಾತ ಟ್ಯಾಬ್ಗಳನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ಬಳಸಿ.</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> ಅನ್ನು ಎಂದಿಗೂ ಅನುವಾದಿಸಬೇಡ</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">ನಗರ / ಪಟ್ಟಣ</translation> <translation id="8428213095426709021">ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="8428634594422941299">ಅರ್ಥವಾಯಿತು</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) ಅನ್ನು ಎಲ್ಲಿ ಸೇವ್ ಮಾಡಬೇಕೆಂದು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="8446884382197647889">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> <translation id="8449347986464073209">ಅಳಿಸಿ ಮತ್ತು ಸೈನ್ ಔಟ್ ಆಗಿ</translation> <translation id="8459333855531264009">ಸುರಕ್ಷಿತವಲ್ಲ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index 7d8a060..4f6402d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Ошондой эле бул нерселерди кыстармаларыңызда, Окуу тизмесинде же Сырсөздөрдү башкаргычта көрүп, тескей аласыз.</translation> <translation id="1870148520156231997">Сырсөздү көрсөтүү</translation> <translation id="1872096359983322073">Колчырак</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Бул нерсени көрсөтөт</translation> <translation id="1882901927376062252">{count,plural, =1{Кыстарма Google аккаунтуңузга ({email}) сакталды}other{{count} кыстарма Google аккаунтуңузга ({email}) сакталды}}</translation> <translation id="1883255238294161206">Тизмени жыйнап коюу</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Башкы экрандан сырсөздөргө өтүңүз</translation> <translation id="1959441496380398824">Күндү коё бербей басып туруңуз.</translation> <translation id="1959679933317802873">Мазмун күтүлүүдө</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> сиз менен <ph name="WEBSITE" /> үчүн сырсөздү бөлүштү</translation> <translation id="1967461193809857427">{count,plural, =1{Android'де көргөн өтмөктү ачасызбы?}other{Android'де көргөн өтмөктү ачасызбы?}}</translation> <translation id="1972325230031091483">Мазмун учурда ачылып турган веб-баракчанын негизинде жүктөлгөндүктөн, барактарды тезирээк карап чыгасыз</translation> <translation id="1973912524893600642">Дайындарды сактоо</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Баалардын өзгөрүшү тууралуу кабарлоону күйгүзөсүзбү?</translation> <translation id="2139867232736819575">Көчүрүп алган текстти издеңиз</translation> <translation id="214201757571129614">Кирүү…</translation> +<translation id="2147127444698817042">iPhone'до гана жеткиликтүү</translation> <translation id="2148716181193084225">Бүгүн</translation> <translation id="2149973817440762519">Кыстарманы түзөтүү</translation> <translation id="2175927920773552910">QR код</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Серептөө дайындары тазаланууда…</translation> <translation id="2251686759395008410">Меню → Таржымал</translation> <translation id="2252674110805316998">Интернетте издөө</translation> +<translation id="2252749852083403809">Drive'га <ph name="USER_EMAIL" /> аккаунтуна сакталууда.</translation> <translation id="2256933947031277845">Уюмуңуз белгилүү бир аккаунттар менен гана кирүүгө уруксат берет.</translation> <translation id="2258326562203545455">{count,plural, =1{Кыстармаңызды Google аккаунтуңузда ({email}) сактай аласыз.}other{Кыстармаларыңызды Google аккаунтуңузда ({email}) сактай аласыз.}}</translation> <translation id="225943865679747347">Ката коду: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Маалыматты өчүрүү</translation> <translation id="298306318844797842">Төлөм ыкмасын кошуу…</translation> <translation id="2989805286512600854">Жаңы өтмөктө ачуу</translation> +<translation id="300455800299409273">"Бул өтмөк менен улантуу" параметрин жашырыңыз</translation> <translation id="3010025794097054078">Маалыматтарды бекем сактап, кооптуу вебсайттардан жана башкалардан коргонуңуз.</translation> <translation id="3010171936431626919">Кантип?</translation> <translation id="3020183492814296499">Кыска жолдор</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Оффлайн режиминдесиз. Интернет байланышыңызды текшерип, кайталап көрүңүз.</translation> <translation id="3832419617903252251">Сырсөз ушул түзмөккө гана сакталды</translation> <translation id="3835964409414434850">Кийинки өтмөккө өтүү</translation> +<translation id="383781833195845844">Бул өтмөк менен улантуу</translation> <translation id="3838691874161539578">Аккаунтуңуздун коопсуздугун бекемдөө жана Интернеттеги коопсуздукту камсыздоо үчүн сакталган сырсөздөрүңүздү текшерип коюңуз</translation> <translation id="385051799172605136">Артка</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> жана дагы <ph name="NUMBER_OF_ACCOUNTS" /> вебсайттын сырсөздөрү жок кылынат. Аккаунттарыңыз өчүрүлбөйт.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">Тизмени жайып көрсөтүү</translation> <translation id="4971735654804503942">Кооптуу вебсайттардан, жүктөлүп алынган файлдардан жана кеңейтүүлөрдөн тез жана проактивдүү коргоо. Билинип калган сырсөздөр жөнүндө эскертет. Google'га жөнөтүү үчүн серептөө маалыматын талап кылат.</translation> <translation id="4979397965658815378">Бардык түзмөктөрүңүздөн кыстармалар, сырсөздөр, таржымал жана башка параметрлериңизди алуу үчүн аккаунтка кириңиз</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> файлы кайда сакталарын тандаңыз</translation> <translation id="4996567535980789550">Көрсөтүлгөн контентти тескөө үчүн шайкештирүүнү күйгүзүңүз</translation> <translation id="5005498671520578047">Сырсөздү көчүрүү</translation> <translation id="5016420433031926653">Кимге: <ph name="USER_EMAIL" /></translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">Версия <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">Google аккаунтуңузда сырсөздөрдү колдонуп жана сактоо үчүн бул өзүңүз экениңизди ырастаңыз.</translation> <translation id="5684761169742812828">Бул сырсөздү кимдир бирөө билип алды. Эгер аны азыр өзгөртүүгө убактыңыз болбосо, кийинчерээк эстөө үчүн Google бул эскертүүнү сактап коюуну сунуштайт.</translation> +<translation id="5694848685995373177">Drive'га <ph name="USER_EMAIL" /> аккаунтуна сакталды.</translation> <translation id="5701270923492462699">Камераны колдонууга уруксат берилди</translation> <translation id="5702108177581350218">Колдонуучу атыңыздын жана сырсөзүңүздүн көчүрмөсүн бөлүшкөндө, үй-бүлөлүк тобуңуздун мүчөсү аларды Google Сырсөздөрдү башкаргыч аркылуу толтура алат.</translation> <translation id="5704908597376970822">Аккаунтка кирген жоксуз.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> окула элек макала.</translation> <translation id="7412027924265291969">Улантуу</translation> <translation id="741204030948306876">Ооба, макулмун</translation> +<translation id="7418640008860669073">Сактоо...</translation> <translation id="7425346204213733349">Кыстармаларыңызга, таржымалыңызга, сырсөздөрүңүзгө жана башка параметрлерге киргизилген өзгөрүүлөр Google Аккаунтуңуз менен шайкештирилбейт. Ал эми учурдагы дайын-даректериңиз Google Аккаунтуңузде сакталып кала берет.</translation> <translation id="7431991332293347422">Издөөнү жана башка кызматтарды жекечелештирүү үчүн серептөө таржымалыңыз кандайча пайдаланыларын көзөмөлдөңүз</translation> <translation id="7435356471928173109">Администраторуңуз өчүрүп койду</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">Кыстармалар жашырылды</translation> <translation id="750228856503700085">Жаңыртуулар жеткиликсиз</translation> <translation id="750493650310597496">0 тандалды</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">Жашыруун өтмөктөрдү кулпулоо үчүн Touch ID, Face ID же өткөрүүчү кодду жөндөңүз.</translation> <translation id="7514365320538308">Жүктөп алуу</translation> <translation id="7524055474074101597">Сырсөздөрүңүзгө жана башка колдонмолорго кириңиз.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">Жаңы өтмөк</translation> <translation id="7557508262441527045">Аккаунтуңуздан чыктыңыз</translation> <translation id="7561196759112975576">Ар дайым</translation> +<translation id="7564917801238348224">САКТОО...</translation> <translation id="7582857256643797524">Бул параметр түзмөгүңүздө иштетилген</translation> <translation id="7583004045319035904">Жашыруун өтмөктөрүңүздүн кулпусун <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> менен ачыңыз.</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> эч качан которулбасын</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">Шаар/Шаарча</translation> <translation id="8428213095426709021">Параметрлер</translation> <translation id="8428634594422941299">Түшүнүктүү</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) файлы кайда сакталарын тандаңыз</translation> <translation id="8446884382197647889">Көбүрөөк билүү</translation> <translation id="8449347986464073209">Өчүрүү жана аккаунттан чыгуу</translation> <translation id="8459333855531264009">Коопсуз эмес</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 35456060..57548b98 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">ນອກຈາກນັ້ນ, ທ່ານຍັງສາມາດເບິ່ງ ແລະ ຈັດການລາຍການເຫຼົ່ານີ້ໃນບຸກມາກ, ລາຍຊື່ການອ່ານ ຫຼື ຕົວຈັດການລະຫັດຜ່ານຂອງທ່ານໄດ້.</translation> <translation id="1870148520156231997">ເປີດເຜີຍລະຫັດຜ່ານ</translation> <translation id="1872096359983322073">ໄຟສາຍ</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">ສະແດງລາຍການນີ້</translation> <translation id="1882901927376062252">{count,plural, =1{ບັນທຶກບຸກມາກໄວ້ໃນບັນຊີ Google ຂອງທ່ານ, {email} ແລ້ວ}other{ບັນທຶກບຸກມາກ {count} ລາຍການໄວ້ໃນບັນຊີ Google ຂອງທ່ານ, {email} ແລ້ວ}}</translation> <translation id="1883255238294161206">ຫຍໍ້ລາຍການລົງ</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">ເຂົ້າເຖິງລະຫັດຜ່ານຈາກໂຮມສະກຣີນ</translation> <translation id="1959441496380398824">ແຕະໃສ່ວັນທີໃດໜຶ່ງຄ້າງໄວ້.</translation> <translation id="1959679933317802873">ກຳລັງລໍຖ້າເນື້ອຫາ</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> ໄດ້ແບ່ງປັນລະຫັດຜ່ານກັບທ່ານສຳລັບ <ph name="WEBSITE" /></translation> <translation id="1967461193809857427">{count,plural, =1{ເລືອກເອົາແຖບທີ່ທ່ານປະໄວ້ຢູ່ Android ບໍ່?}other{ເລືອກເອົາແຖບທີ່ທ່ານປະໄວ້ຢູ່ Android ບໍ່?}}</translation> <translation id="1972325230031091483">ທ່ານຈະທ່ອງເວັບໄດ້ໄວຂຶ້ນເນື່ອງຈາກເນື້ອຫາມີການໂຫຼດໄວ້ກ່ອນໂດຍອ້າງອີງໃສ່ການເຂົ້າເບິ່ງໜ້າເວັບປັດຈຸບັນຂອງທ່ານ</translation> <translation id="1973912524893600642">ຮັກສາຂໍ້ມູນໄວ້</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">ເປີດການແຈ້ງເຕືອນລາຄາບໍ?</translation> <translation id="2139867232736819575">ຊອກຫາຂໍ້ຄວາມທີ່ທ່ານສຳເນົາ</translation> <translation id="214201757571129614">ເຂົ້າສູ່ລະບົບ…</translation> +<translation id="2147127444698817042">ມີໃຫ້ບໍລິການສະເພາະຢູ່ iPhone ເທົ່ານັ້ນ</translation> <translation id="2148716181193084225">ມື້ນີ້</translation> <translation id="2149973817440762519">ແກ້ໄຂບຸກມາກສ໌</translation> <translation id="2175927920773552910">ລະຫັດ QR</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">ກຳລັງລຶບລ້າງຂໍ້ມູນທ່ອງເວັບ...</translation> <translation id="2251686759395008410">ເມນູ → ປະຫວັດ</translation> <translation id="2252674110805316998">Web Search</translation> +<translation id="2252749852083403809">ກຳລັງບັນທຶກໃນ Drive ສຳລັບ <ph name="USER_EMAIL" />.</translation> <translation id="2256933947031277845">ອົງການຂອງທ່ານອະນຸຍາດໃຫ້ທ່ານເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີບາງຢ່າງເທົ່ານັ້ນ.</translation> <translation id="2258326562203545455">{count,plural, =1{ທ່ານສາມາດບັນທຶກບຸກມາກຂອງທ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານໄດ້, {email}.}other{ທ່ານສາມາດບັນທຶກບຸກມາກຂອງທ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານໄດ້, {email}.}}</translation> <translation id="225943865679747347">ລະຫັດຜິດພາດ: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">ລຶບລ້າງຂໍ້ມູນ</translation> <translation id="298306318844797842">ເພີ່ມວິທີການຈ່າຍເງິນ...</translation> <translation id="2989805286512600854">ເປີດຢູ່ໃນແຖບໃໝ່</translation> +<translation id="300455800299409273">ເຊື່ອງ "ສືບຕໍ່ໃຊ້ແຖບນີ້"</translation> <translation id="3010025794097054078">ປອດໄພຈາກການລະເມີດຂໍ້ມູນ, ເວັບໄຊທີ່ບໍ່ປອດໄພ ແລະ ອື່ນໆ.</translation> <translation id="3010171936431626919">ສະແດງວິທີໃຫ້ຂ້ອຍເບິ່ງ</translation> <translation id="3020183492814296499">ທາງລັດ</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">ທ່ານອອບລາຍຢູ່. ກະລຸນາກວດສອບການເຊື່ອມຕໍ່ອິນເຕີເນັດຂອງທ່ານແລ້ວລອງໃໝ່.</translation> <translation id="3832419617903252251">ບັນທຶກລະຫັດຜ່ານໄວ້ໃນອຸປະກອນນີ້ເທົ່ານັ້ນ</translation> <translation id="3835964409414434850">ໄປຫາແຖບຕໍ່ໄປ</translation> +<translation id="383781833195845844">ສືບຕໍ່ໃຊ້ແຖບນີ້</translation> <translation id="3838691874161539578">ກວດລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ຂອງທ່ານເພື່ອເພີ່ມທະວີຄວາມປອດໄພຂອງທ່ານ ແລະ ອອນລາຍຢ່າງປອດໄພຍິ່ງຂຶ້ນ</translation> <translation id="385051799172605136">ກັບຄືນ</translation> <translation id="3851938967634752633">ລະຫັດຜ່ານສຳລັບ <ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> ແລະ <ph name="NUMBER_OF_ACCOUNTS" /> ບັນຊີອື່ນໆຈະຖືກລຶບ. ບັນຊີຂອງທ່ານຈະບໍ່ຖືກລຶບ.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">ຂະຫຍາຍລາຍຊື່</translation> <translation id="4971735654804503942">ການປົກປ້ອງແບບເຊີງບຸກທີ່ໄວກວ່າຕໍ່ກັບເວັບໄຊ, ການດາວໂຫຼດ ແລະ ສ່ວນຂະຫຍາຍທີ່ເປັນອັນຕະລາຍ. ເຕືອນທ່ານກ່ຽວກັບການລະເມີດລະຫັດຜ່ານ. ຈຳເປັນຕ້ອງສົ່ງຂໍ້ມູນການທ່ອງເວັບໃຫ້ Google.</translation> <translation id="4979397965658815378">ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ Google ຂອງທ່ານເພື່ອໃຊ້ບຸກມາກ, ລະຫັດຜ່ານ, ປະຫວັດ ແລະ ການຕັ້ງຄ່າອື່ນຢູ່ໃນທຸກອຸປະກອນຂອງທ່ານ</translation> +<translation id="4989065233040279145">ເລືອກບ່ອນທີ່ຈະບັນທຶກ <ph name="FILENAME" /></translation> <translation id="4996567535980789550">ເປີດການຊິ້ງເພື່ອຈັດການເນື້ອຫາທີ່ທ່ານເຫັນ</translation> <translation id="5005498671520578047">ອັດສຳເນົາລະຫັດຜ່ານ</translation> <translation id="5016420433031926653">ສົ່ງໄປຫາ <ph name="USER_EMAIL" /></translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">ລຸ້ນ <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">ເພື່ອໃຊ້ ແລະ ບັນທຶກລະຫັດຜ່ານໃນບັນຊີ Google ຂອງທ່ານ, ກະລຸນາຢັ້ງຢືນວ່າແມ່ນທ່ານ.</translation> <translation id="5684761169742812828">ລະຫັດຜ່ານນີ້ຖືກເປີດເຜີຍໃນການລະເມີດຂໍ້ມູນຢູ່ອິນເຕີເນັດ. ຫາກທ່ານບໍ່ມີເວລາທີ່ຈະປ່ຽນມັນໃນຕອນນີ້, Google ແນະນໍາໃຫ້ຮັກສາຄໍາເຕືອນນີ້ເພື່ອເຕືອນຕົວເອງໃນພາຍຫຼັງ.</translation> +<translation id="5694848685995373177">ບັນທຶກໃນ Drive ສຳລັບ <ph name="USER_EMAIL" /> ແລ້ວ.</translation> <translation id="5701270923492462699">ອະນຸຍາດສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບແລ້ວ</translation> <translation id="5702108177581350218">ເມື່ອທ່ານແບ່ງປັນສຳເນົາຂອງຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານຂອງທ່ານ, ສະມາຊິກຄອບຄົວຂອງທ່ານສາມາດຕື່ມຂໍ້ມູນໂດຍໃຊ້ຕົວຈັດການລະຫັດຜ່ານ Google ໄດ້.</translation> <translation id="5704908597376970822">ບໍ່ສາມາດເຂົ້າສູ່ລະບົບໄດ້.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ບົດຄວາມທີ່ຍັງບໍ່ໄດ້ອ່ານ.</translation> <translation id="7412027924265291969">ສືບຕໍ່</translation> <translation id="741204030948306876">ແມ່ນ, ຂ້ອຍຂໍເຂົ້າຮ່ວມ</translation> +<translation id="7418640008860669073">ບັນທຶກໃນ...</translation> <translation id="7425346204213733349">ການປ່ຽນແປງຕໍ່ກັບບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ການຕັ້ງຄ່າອື່ນຂອງທ່ານຈະບໍ່ຖືກຊິ້ງກັບບັນຊີ Google ຂອງທ່ານອີກຕໍ່ໄປ. ແນວໃດກໍຕາມ, ຂໍ້ມູນທີ່ມີຢູ່ຂອງທ່ານຈະຍັງຄົງເກັບຮັກສາໄວ້ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="7431991332293347422">ຄວບຄຸມວ່າຈະໃຫ້ໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານແນວໃດເພື່ອປັບແຕ່ງການຊອກຫາ ແລະ ອື່ນໆອີກໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="7435356471928173109">ປິດໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">ບຸກມາກຖືກເຊື່ອງໄວ້</translation> <translation id="750228856503700085">ບໍ່ສາມາດອັບເດດໄດ້</translation> <translation id="750493650310597496">0 ເລືອກແລ້ວ</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">ເພື່ອລັອກ incognito tab ຂອງທ່ານ, ໃຫ້ຕັ້ງຄ່າ Touch ID, Face ID ຫຼື ລະຫັດກ່ອນ.</translation> <translation id="7514365320538308">ດາວໂຫລດ</translation> <translation id="7524055474074101597">ເຂົ້າເຖິງລະຫັດຜ່ານຂອງທ່ານ ແລະ ອື່ນໆທົ່ວແອັບ.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">ແຖບໃຫມ່</translation> <translation id="7557508262441527045">ອອກຈາກລະບົບແລ້ວ</translation> <translation id="7561196759112975576">ຢູ່ສະເໝີ</translation> +<translation id="7564917801238348224">ບັນທຶກ...</translation> <translation id="7582857256643797524">ການຕັ້ງຄ່ານີ້ຖືກເປີດໃຊ້ຢູ່ອຸປະກອນຂອງທ່ານ</translation> <translation id="7583004045319035904">ໃຊ້ <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ເພື່ອປົດລັອກແຖບບໍ່ເປີດເຜີຍຕົວຕົນຂອງທ່ານ.</translation> <translation id="7600965453749440009">ຢ່າແປ <ph name="LANGUAGE" /></translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">ເມືອງ</translation> <translation id="8428213095426709021">ການຕັ້ງຄ່າ</translation> <translation id="8428634594422941299">ເຂົ້າໃຈແລ້ວ</translation> +<translation id="8430694217306051839">ເລືອກບ່ອນທີ່ຈະບັນທຶກ <ph name="FILENAME" /> (<ph name="FILE_SIZE" />)</translation> <translation id="8446884382197647889">ຮຽນຮູ້ເພີ່ມເຕີມ</translation> <translation id="8449347986464073209">ລຶບ ແລະ ອອກຈາກລະບົບ</translation> <translation id="8459333855531264009">ບໍ່ປອດໄພ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index f6a8053..393adaf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">നിങ്ങളുടെ ബുക്ക്മാർക്കുകളിലോ വായിക്കാനുള്ളവയുടെ ലിസ്റ്റിലോ Password Manager-ലോ ഈ ഇനങ്ങൾ കാണാനും നിയന്ത്രിക്കാനുമാകും.</translation> <translation id="1870148520156231997">പാസ്വേഡ് വെളിപ്പെടുത്തുക</translation> <translation id="1872096359983322073">ടോർച്ച്</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">ഈ ഇനം കാണിക്കുന്നു</translation> <translation id="1882901927376062252">{count,plural, =1{{email} എന്ന നിങ്ങളുടെ Google Account-ൽ ബുക്ക്മാർക്ക് സംരക്ഷിച്ചു}other{{email} എന്ന നിങ്ങളുടെ Google Account-ൽ {count} ബുക്ക്മാർക്കുകൾ സംരക്ഷിച്ചു}}</translation> <translation id="1883255238294161206">ലിസ്റ്റ് ചുരുക്കുക</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">ഹോം സ്ക്രീനിൽ നിന്ന് പാസ്വേഡുകളിലേക്ക് പോകുക</translation> <translation id="1959441496380398824">ഒരു തീയതിയിൽ സ്പർശിച്ച് പിടിക്കുക.</translation> <translation id="1959679933317802873">ഉള്ളടക്കത്തിനായി കാത്തിരിക്കുന്നു</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> എന്നയാൾ <ph name="WEBSITE" /> എന്നതിന്റെ ഒരു പാസ്വേഡ് നിങ്ങളുമായി പങ്കിട്ടു.</translation> <translation id="1967461193809857427">{count,plural, =1{Android-ലെ ടാബ് നിർത്തിയിടത്ത് നിന്ന് വീണ്ടും ഉപയോഗിച്ച് തുടങ്ങണോ?}other{Android-ലെ ടാബുകൾ നിർത്തിയിടത്ത് നിന്ന് വീണ്ടും ഉപയോഗിച്ച് തുടങ്ങണോ?}}</translation> <translation id="1972325230031091483">നിങ്ങളുടെ നിലവിലെ വെബ്പേജ് സന്ദർശനം അടിസ്ഥാനമാക്കി സമയോചിതമായി ഉള്ളടക്കം ലോഡ് ചെയ്യുന്നതിനാൽ നിങ്ങൾക്ക് കൂടുതൽ വേഗത്തിൽ ബ്രൗസ് ചെയ്യാം</translation> <translation id="1973912524893600642">ഡാറ്റ നിലനിർത്തുക</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">നിരക്കുമാറ്റ അറിയിപ്പുകൾ ഓണാക്കണോ?</translation> <translation id="2139867232736819575">നിങ്ങൾ പകർത്തിയ ടെക്സ്റ്റ് തിരയുക</translation> <translation id="214201757571129614">സൈൻ ഇൻ ചെയ്യുക…</translation> +<translation id="2147127444698817042">ഐഫോണിൽ മാത്രമാണ് ലഭ്യമാകുക</translation> <translation id="2148716181193084225">ഇന്ന്</translation> <translation id="2149973817440762519">ബുക്മാര്ക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="2175927920773552910">QR കോഡ്</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കുന്നു...</translation> <translation id="2251686759395008410">മെനു → ചരിത്രം</translation> <translation id="2252674110805316998">വെബ് തിരയൽ</translation> +<translation id="2252749852083403809"><ph name="USER_EMAIL" /> എന്നതിനായി Drive-ൽ സംരക്ഷിക്കുന്നു.</translation> <translation id="2256933947031277845">ചില അക്കൗണ്ടുകൾ ഉപയോഗിച്ച് മാത്രമേ സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളുടെ സ്ഥാപനം അനുവദിക്കൂ.</translation> <translation id="2258326562203545455">{count,plural, =1{ബുക്ക്മാർക്ക്, {email} എന്ന നിങ്ങളുടെ Google Account-ൽ സംരക്ഷിക്കാം.}other{ബുക്ക്മാർക്കുകൾ, {email} എന്ന നിങ്ങളുടെ Google Account-ൽ സംരക്ഷിക്കാം.}}</translation> <translation id="225943865679747347">പിശക് കോഡ്: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">ഡാറ്റ മായ്ക്കുക</translation> <translation id="298306318844797842">പേയ്മെന്റ് രീതി ചേർക്കുക...</translation> <translation id="2989805286512600854">പുതിയ ടാബില് തുറക്കുക</translation> +<translation id="300455800299409273">"ഈ ടാബ് ഉപയോഗിച്ച് തുടരുക" മറയ്ക്കുക</translation> <translation id="3010025794097054078">ഡാറ്റാ ലംഘനങ്ങൾ, സുരക്ഷിതമല്ലാത്ത വെബ്സൈറ്റുകൾ എന്നിവയിൽ നിന്നും മറ്റും സുരക്ഷിതരായി നിലനിൽക്കുക.</translation> <translation id="3010171936431626919">എങ്ങനെയെന്ന് എന്നെ കാണിക്കുക</translation> <translation id="3020183492814296499">കുറുക്കുവഴികൾ</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">നിങ്ങൾ ഓഫ്ലൈനാണ്. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="3832419617903252251">ഈ ഉപകരണത്തിൽ മാത്രമേ പാസ്വേഡ് സംരക്ഷിച്ചിട്ടുള്ളൂ</translation> <translation id="3835964409414434850">അടുത്ത ടാബിലേക്ക് പോകുക</translation> +<translation id="383781833195845844">ഈ ടാബ് ഉപയോഗിച്ച് തുടരുക</translation> <translation id="3838691874161539578">നിങ്ങളുടെ സുരക്ഷ ശക്തിപ്പെടുത്താനും ഓൺലൈനിൽ സുരക്ഷിതമായി തുടരാനും സംരക്ഷിച്ച പാസ്വേഡുകൾ പരിശോധിക്കുക</translation> <translation id="385051799172605136">പിന്നോട്ട്</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> എന്നിവയുടെയും മറ്റ് <ph name="NUMBER_OF_ACCOUNTS" /> അക്കൗണ്ടുകളുടെയും പാസ്വേഡുകൾ ഇല്ലാതാക്കും. നിങ്ങളുടെ അക്കൗണ്ടുകൾ ഇല്ലാതാക്കില്ല.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">ലിസ്റ്റ് വിപുലീകരിക്കുക</translation> <translation id="4971735654804503942">അപകടകരമായ വെബ്സൈറ്റുകൾ, ഡൗൺലോഡുകള്, വിപുലീകരണങ്ങൾ എന്നിവയിൽ നിന്ന് വേഗത്തിലും മുൻകൂറായുമുള്ള സുരക്ഷ. പാസ്വേഡ് ലംഘനങ്ങളെക്കുറിച്ച് നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുന്നു. Google-ലേക്ക് ബ്രൗസിംഗ് ഡാറ്റ അയയ്ക്കേണ്ടതുണ്ട്.</translation> <translation id="4979397965658815378">എല്ലാ ഉപകരണങ്ങളിലും നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, പാസ്വേഡുകൾ, ചരിത്രം, മറ്റ് ക്രമീകരണം എന്നിവ ലഭിക്കാൻ Google Account ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> എവിടെ സംരക്ഷിക്കണമെന്ന് തിരഞ്ഞെടുക്കുക</translation> <translation id="4996567535980789550">നിങ്ങൾ കാണുന്ന ഉള്ളടക്കം മാനേജ് ചെയ്യാൻ, സമന്വയിപ്പിക്കുക ഓണാക്കുക</translation> <translation id="5005498671520578047">പാസ്വേഡ് പകർത്തുക</translation> <translation id="5016420433031926653"><ph name="USER_EMAIL" /> എന്ന വിലാസത്തിലേക്ക് അയയ്ക്കുക</translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">പതിപ്പ് <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">നിങ്ങളുടെ Google അക്കൗണ്ടിൽ പാസ്വേഡുകൾ സംരക്ഷിക്കാനും അവ ഉപയോഗിക്കാനും, ഇത് നിങ്ങൾ തന്നെയാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക.</translation> <translation id="5684761169742812828">ഇന്റർനെറ്റിലെ ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായി ഈ പാസ്വേഡ് വെളിപ്പെട്ടു. നിങ്ങൾക്ക് ഇപ്പോൾ ഇത് മാറ്റാൻ സമയമില്ലെങ്കിൽ, പിന്നീട് സ്വയം ഓർമ്മപ്പെടുത്തുന്നതിന് ഈ മുന്നറിയിപ്പ് നിലനിർത്താൻ Google നിർദ്ദേശിക്കുന്നു.</translation> +<translation id="5694848685995373177"><ph name="USER_EMAIL" /> എന്നതിനായി Drive-ൽ സംരക്ഷിച്ചു.</translation> <translation id="5701270923492462699">ക്യാമറ ആക്സസ് അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="5702108177581350218">നിങ്ങളുടെ ഉപയോക്തൃനാമത്തിന്റെയും പാസ്വേഡിന്റെയും പകർപ്പ് പങ്കിടുമ്പോൾ, നിങ്ങളുടെ കുടുംബാംഗത്തിന് Google Password Manager ഉപയോഗിച്ച് അവ പൂരിപ്പിക്കാനാകും.</translation> <translation id="5704908597376970822">സൈൻ ഇൻ ചെയ്യാനാകുന്നില്ല.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906">വായിക്കാത്ത <ph name="UNREAD_COUNT" /> ലേഖനങ്ങൾ.</translation> <translation id="7412027924265291969">തുടരുക</translation> <translation id="741204030948306876">ഞാൻ തയ്യാറാണ്</translation> +<translation id="7418640008860669073">ഇനിപ്പറയുന്നതിൽ സംരക്ഷിക്കുക...</translation> <translation id="7425346204213733349">ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയിലുള്ള മാറ്റങ്ങളെ ഇനി നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കില്ല. എന്നിരുന്നാലും, നിങ്ങളുടെ നിലവിലെ വിവരം Google അക്കൗണ്ടിൽ തുടർന്നും സൂക്ഷിക്കും.</translation> <translation id="7431991332293347422">തിരയലും മറ്റും വ്യക്തിപരമാക്കുന്നതിന് നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="7435356471928173109">നിങ്ങളുടെ അഡ്മിൻ ഓഫാക്കിയിരിക്കുന്നു</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">ബുക്ക്മാർക്കുകൾ മറച്ചിരിക്കുന്നു</translation> <translation id="750228856503700085">അപ്ഡേറ്റുകൾ ലഭ്യമല്ല</translation> <translation id="750493650310597496">0 തിരഞ്ഞെടുത്തു</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">നിങ്ങളുടെ അദൃശ്യ ടാബുകൾ ലോക്ക് ചെയ്യാൻ, ടച്ച് ഐഡിയോ മുഖ ഐഡിയോ പാസ്കോഡോ സജ്ജീകരിക്കുക.</translation> <translation id="7514365320538308">ഡൗൺലോഡ് ചെയ്യുക</translation> <translation id="7524055474074101597">ആപ്പുകളിലുടനീളം നിങ്ങളുടെ പാസ്വേഡുകളും മറ്റും ആക്സസ് ചെയ്യുക.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">പുതിയ ടാബ്</translation> <translation id="7557508262441527045">സൈൻ ഔട്ട് ചെയ്തു</translation> <translation id="7561196759112975576">എല്ലായ്പ്പോഴും</translation> +<translation id="7564917801238348224">സംരക്ഷിക്കുക...</translation> <translation id="7582857256643797524">നിങ്ങളുടെ ഉപകരണത്തിൽ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കി</translation> <translation id="7583004045319035904">നിങ്ങളുടെ അദൃശ്യ ടാബുകൾ അൺലോക്ക് ചെയ്യാൻ <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ഉപയോഗിക്കുക.</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> ഒരിക്കലും വിവര്ത്തനം ചെയ്യരുത്</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">നഗരം / പട്ടണം</translation> <translation id="8428213095426709021">ക്രമീകരണം</translation> <translation id="8428634594422941299">മനസ്സിലായി</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) എവിടെ സംരക്ഷിക്കണമെന്ന് തിരഞ്ഞെടുക്കുക</translation> <translation id="8446884382197647889">കൂടുതലറിയുക</translation> <translation id="8449347986464073209">ഇല്ലാതാക്കിയ ശേഷം സൈൻ ഔട്ട് ചെയ്യുക</translation> <translation id="8459333855531264009">സുരക്ഷിതമല്ല</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 40343cb..ca356cc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">तपाईं आफ्ना बुकमार्क, पछि पढ्न सेभ गरिएका वेबपेजको सूची वा पासवर्ड म्यानेजरमा गएर पनि यी सामग्री हेर्न तथा व्यवस्थापन गर्न सक्नुहुन्छ।</translation> <translation id="1870148520156231997">पासवर्ड देखाउनुहोस्</translation> <translation id="1872096359983322073">टर्च</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />।</translation> <translation id="1876851015978093044">यो सामग्री देखाइन्छ</translation> <translation id="1882901927376062252">{count,plural, =1{यो बुकमार्क तपाईंको Google खाता ({email}) मा सेभ गरिएको छ}other{{count} वटा बुकमार्क तपाईंको Google खाता ({email}) मा सेभ गरिएका छन्}}</translation> <translation id="1883255238294161206">संक्षिप्त सूची</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">होम स्क्रिनबाट "पासवर्ड" मा जानुहोस्</translation> <translation id="1959441496380398824">मितिमा टच एण्ड होल्ड गर्नुहोस्।</translation> <translation id="1959679933317802873">सामग्री लोड गरिँदै छ</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> ले तपाईंसँग <ph name="WEBSITE" /> को पासवर्ड सेयर गर्नुभएको छ</translation> <translation id="1967461193809857427">{count,plural, =1{तपाईं आफूले Android मा खोलेको पछिल्लो ट्याब हेर्न चाहनुहुन्छ?}other{तपाईं आफूले Android मा खोलेका पछिल्ला ट्याबहरू हेर्न चाहनुहुन्छ?}}</translation> <translation id="1972325230031091483">तपाईंले हालै खोलेको वेबपेजका आधारमा अग्रिम रूपमा सामग्री लोड गरिने भएकाले तपाईं अझ छिटो ब्राउज गर्न सक्नु हुने छ</translation> <translation id="1973912524893600642">डेटा राख्नुहोस्</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">भाडादरसम्बन्धी अलर्ट पठाउने सुविधा अन गर्ने हो?</translation> <translation id="2139867232736819575">तपाईंले प्रतिलिपि गरेको पाठको खोजी गर्नुहोस्</translation> <translation id="214201757571129614">साइन इन गर्नुहोस्…</translation> +<translation id="2147127444698817042">iPhone मा मात्र उपलब्ध छ</translation> <translation id="2148716181193084225">आज</translation> <translation id="2149973817440762519">बुकमार्क सम्पादन गर्नुहोस्</translation> <translation id="2175927920773552910">QR कोड</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">ब्राउजिङ डेटा खाली गर्दै...</translation> <translation id="2251686759395008410">मेनु → इतिहास</translation> <translation id="2252674110805316998">वेब खोजी</translation> +<translation id="2252749852083403809"><ph name="USER_EMAIL" /> को Drive मा सेभ गरिँदै छ।</translation> <translation id="2256933947031277845">तपाईंको सङ्गठनको नीतिअनुसार तपाईं निश्चित खातामार्फत मात्र साइन इन गर्न पाउनुहुन्छ।</translation> <translation id="2258326562203545455">{count,plural, =1{तपाईं आफ्नो बुकमार्क आफ्नो Google खाता ({email}) मा सेभ गर्न सक्नुहुन्छ।}other{तपाईं आफ्ना बुकमार्कहरू आफ्नो Google खाता ({email}) मा सेभ गर्न सक्नुहुन्छ।}}</translation> <translation id="225943865679747347">त्रुटि कोड: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">डेटा मेटाउनुहोस्</translation> <translation id="298306318844797842">भुक्तानी विधि थप्नुहोस्...</translation> <translation id="2989805286512600854">नयाँ ट्याबमा खोल्नुहोस्</translation> +<translation id="300455800299409273">"यो ट्याब प्रयोग गरेर जारी राख्नुहोस्" लुकाउनुहोस्</translation> <translation id="3010025794097054078">डेटा चोरीको घटना, असुरक्षित वेबसाइट र अन्य कुराबाट सुरक्षित रहनुहोस्।</translation> <translation id="3010171936431626919">यसो गर्ने तरिका देखाइयोस्</translation> <translation id="3020183492814296499">सर्टकटहरू</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">तपाईं अफलाइन हुनुहुन्छ। आफ्नो इन्टरनेट कनेक्सनको जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> <translation id="3832419617903252251">यो पासवर्ड यस डिभाइसमा मात्र सेभ गरिएको छ</translation> <translation id="3835964409414434850">अर्को ट्याबमा जानुहोस्</translation> +<translation id="383781833195845844">यो ट्याब प्रयोग गरेर जारी राख्नुहोस्</translation> <translation id="3838691874161539578">तपाईं आफ्नो खाता अझ सुरक्षित राख्नुका साथै इन्टरनेटमा अझ सुरक्षित रहन चाहनुहुन्छ भने आफूले सेभ गरेका पासवर्डहरू जाँच्नुहोस्</translation> <translation id="385051799172605136">पछाडि जानुहोस्</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> र अन्य <ph name="NUMBER_OF_ACCOUNTS" /> वटा खाताका पासवर्डहरू मेटिने छन्। तपाईंका खाताहरू मेटिने छैनन्।</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">सूची विस्तारित गर्नुहोस्</translation> <translation id="4971735654804503942">खतरनाक वेबसाइट, डाउनलोड र एक्स्टेन्सनहरूबाट अझ छिटो र सक्रिय सुरक्षा। तपाईंलाई पासवर्डहरूको चोरी हुन सक्ने सम्भावनाबारे चेतावनी दिन्छ। ब्राउजिङ डेटा Google लाई पठाउनु पर्ने हुन्छ।</translation> <translation id="4979397965658815378">आफ्ना सबै यन्त्रहरूमा आफ्ना पुस्तक चिन्ह, इतिहास, पासवर्ड र अन्य सेटिङहरू प्राप्त गर्न आफ्नो Google खाता मार्फत साइन इन गर्नुहोस्।</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> सेभ गर्ने ठाउँ छनौट गर्नुहोस्</translation> <translation id="4996567535980789550">तपाईं आफूलाई देखाइने सामग्री व्यवस्थापन गर्न चाहनुहुन्छ भने सिंक गर्ने सुविधा अन गर्नुहोस्</translation> <translation id="5005498671520578047">पासवर्ड प्रतिलिपि गर्नुहोस्</translation> <translation id="5016420433031926653"><ph name="USER_EMAIL" /> मा पठाइयोस्</translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">संस्करण <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">तपाईं आफ्नो Google खातामा सेभ गरिएका पासवर्डहरू प्रयोग गर्न र Google खातामा थप पासवर्डहरू सेभ गर्न चाहनुहुन्छ भने आफ्नो पहिचान पुष्टि गर्नुहोस्।</translation> <translation id="5684761169742812828">यो पासवर्ड इन्टरनेटमा भएको डेटा चोरीको घटनामा खुलासा गरिएको छ। तपाईंसँग अहिले नै यो पासवर्ड बदल्ने समय छैन भने तपाईं पछि यो पासवर्ड बदल्ने कुरा सम्झनुहोस् भन्नाका लागि Google ले तपाईंलाई यो चेतावनी सेभ गर्न सिफारिस गर्छ।</translation> +<translation id="5694848685995373177"><ph name="USER_EMAIL" /> को Drive मा सेभ गरियो।</translation> <translation id="5701270923492462699">क्यामेरा प्रयोग गर्ने अनुमति दिइएको छ</translation> <translation id="5702108177581350218">तपाईंले आफ्नो युजरनेम र पासवर्डको कपी सेयर गर्नुभयो भने तपाईंका परिवारका सदस्यहरू Google पासवर्ड म्यानेजर प्रयोग गरी ती जानकारी भर्न सक्छन्।</translation> <translation id="5704908597376970822">साइन इन गर्न सकिएन।</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> वटा नपढिएका लेखहरू।</translation> <translation id="7412027924265291969">जारी राख्नुहोस्</translation> <translation id="741204030948306876">हुन्छ, म सहमत छु</translation> +<translation id="7418640008860669073">यहाँ सेभ गर्नुहोस्...</translation> <translation id="7425346204213733349">तपाईँका पुस्तक चिन्ह, इतिहास, पासवर्ड र अन्य सेटिङहरूका परिवर्तनहरू अब उप्रान्त तपाईँको Google खातामा सिंक हुने छैनन्। तैपनि तपाईँको विद्यमान डेटा तपाईँको Google खातामा भण्डारण गरिएको अवस्थामा रहिरहनेछ।</translation> <translation id="7431991332293347422">खोज र थप कुराहरू वैयक्तीकृत गर्ने प्रयोजनका लागि तपाईंको ब्राउजिङ इतिहासको प्रयोग गरिने तरिका नियन्त्रण गर्नुहोस्</translation> <translation id="7435356471928173109">तपाईंका एड्मिनले अफ गर्नुभएको</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">बुकमार्कहरू लुकाइएका छन्</translation> <translation id="750228856503700085">अपडेट उपलब्ध छैनन्</translation> <translation id="750493650310597496">0 चयन गरियो</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />)।</translation> <translation id="7508728395076009983">आफ्ना इन्कोग्निटो ट्याबहरू लक गर्न Touch ID, Face ID वा पासकोड सेटअप गर्नुहोस्।</translation> <translation id="7514365320538308">डाउनलोड गर्नुहोस्</translation> <translation id="7524055474074101597">एपहरूमा भएका पासवर्ड र अन्य कुराहरू प्रयोग गर्नुहोस्।</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">नयाँ ट्याब</translation> <translation id="7557508262441527045">साइन आउट गरिएको छ</translation> <translation id="7561196759112975576">सधैं</translation> +<translation id="7564917801238348224">सेभ गर्नुहोस्...</translation> <translation id="7582857256643797524">यो सेटिङ तपाईंको डिभाइसमा अन गरिएको छ</translation> <translation id="7583004045319035904">आफ्ना इन्कोग्निटो ट्याबहरू अनलक गर्न <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> प्रयोग गर्नुहोस्।</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> कहिले पनि अनुवाद नगर्नुहोस्</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">गाउँ / टोल</translation> <translation id="8428213095426709021">सेटिङहरू</translation> <translation id="8428634594422941299">बुझेँ</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) सेभ गर्ने ठाउँ छनौट गर्नुहोस्</translation> <translation id="8446884382197647889">थप जान्नुहोस्</translation> <translation id="8449347986464073209">मेटाउनुहोस् र साइन आउट गर्नुहोस्</translation> <translation id="8459333855531264009">सुरक्षित छैन</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 0b7bcf9..2013a6c6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -306,7 +306,7 @@ <translation id="261739049332372104">ଆପଣଙ୍କ ପାଇଁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ବିଷୟବସ୍ତୁ ବିଷୟରେ ଅପଡେଟ ପାଇବା ପାଇଁ ଆପଣଙ୍କ iOS ସେଟିଂସରେ ବିଜ୍ଞପ୍ତି ଚାଲୁ କରନ୍ତୁ।</translation> <translation id="2625189173221582860">ପାସ୍ୱର୍ଡ କପି ହୋଇଛି</translation> <translation id="2626236249646841566">ଆପଣଙ୍କ ସଂଯୋଗ ଯାଞ୍ଚ କରି ପୁଣି ସାଇନ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> -<translation id="2637313651144986786">ସନ୍ଧାନ ଟାବ...</translation> +<translation id="2637313651144986786">ସର୍ଚ୍ଚ ଟାବ...</translation> <translation id="2647269890314209800">ବ୍ୟବହାର ହେଉଥିବା କୁକୀଗୁଡ଼ିକ</translation> <translation id="2648721026697078500">କେବେ ବି ମୁଭ କରନ୍ତୁ ନାହିଁ</translation> <translation id="2648803196158606475">"ପଢ଼ାଯାଇଥିବା"କୁ ଡିଲିଟ୍ କରନ୍ତୁ</translation> @@ -695,7 +695,7 @@ <translation id="470966556546083668">ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ ନାହିଁ</translation> <translation id="4711809265250406889">ଯେତେବେଳେ ଏହା ଚାଲୁ ସ୍ଥିତିରେ ଥାଏ</translation> <translation id="4729712004042194392">{count,plural, =1{{website_1}}=2{{website_1}, {website_2}}=3{{website_1}, {website_2} ଓ 1 ଅଧିକ}other{{website_1}, {website_2} ଓ {more_count} ଅଧିକ}}</translation> -<translation id="4737560986434232178">ବର୍ତ୍ତମାନର ଟାବରେ ସନ୍ଧାନ କରନ୍ତୁ</translation> +<translation id="4737560986434232178">ବର୍ତ୍ତମାନର ଟାବରେ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="473775607612524610">ଅପ୍ଡେଟ୍</translation> <translation id="4744428388659507035">ଆପଣଙ୍କର ସମସ୍ତ ଡିଭାଇସରେ ଆପଣଙ୍କ ବୁକମାର୍କ ପାଇବାକୁ ସେଟିଂସରେ "ବୁକମାର୍କଗୁଡ଼ିକ" ଚାଲୁ କରନ୍ତୁ।</translation> <translation id="4746926359847517643">ଆପଣ ସର୍ବଦା ସେଗୁଡ଼ିକୁ ଇତିହାସରେ ପୁଣି ପାଇପାରିବେ।</translation> @@ -735,7 +735,7 @@ <translation id="4881695831933465202">ଖୋଲନ୍ତୁ</translation> <translation id="4883824756452868502">ୟୁନିଟଗୁଡ଼ିକୁ ଚୟନ କରନ୍ତୁ</translation> <translation id="488785315393301722">ବିବରଣୀ ଦେଖାନ୍ତୁ</translation> -<translation id="4894963374040315706">ଏହା ଆପଣଙ୍କ ଭଏସ ବ୍ୟବହାର କରି ଆପଣଙ୍କୁ ସନ୍ଧାନ କରିବାକୁ ଦିଏ</translation> +<translation id="4894963374040315706">ଏହା ଆପଣଙ୍କ ଭଏସ ବ୍ୟବହାର କରି ଆପଣଙ୍କୁ ସର୍ଚ୍ଚ କରିବାକୁ ଦିଏ</translation> <translation id="4896467949657706481">ଟାବଗୁଡ଼ିକ ବନ୍ଦ ହୋଇଯାଇଛି; ଆପଣ ସାଇନ ଆଉଟ ହୋଇଯାଇଛନ୍ତି</translation> <translation id="489903206070130262">ଆପଣଙ୍କ ଶେଷ ଖୋଲା ଥିବା ଟାବ</translation> <translation id="4901778704868714008">ସେଭ୍ କରନ୍ତୁ...</translation> @@ -1307,7 +1307,7 @@ <translation id="7870750252270996949">କପି କରାଯାଇଥିବା Lens ଇମେଜ</translation> <translation id="7879275349003161544">ଡାଉନଲୋଡଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ</translation> <translation id="7883882164760409935">ଆପଣଙ୍କ ପାଖରେ ପୁଣି ବ୍ୟବହାର କରାଯାଇଥିବା ପାସୱାର୍ଡଗୁଡ଼ିକ ଅଛି।</translation> -<translation id="7884694604461143138">ସନ୍ଧାନ ଇତିହାସ (<ph name="COUNT" />ଟି ମିଳିଛି)</translation> +<translation id="7884694604461143138">ସର୍ଚ୍ଚ ଇତିହାସ (<ph name="COUNT" />ଟି ମିଳିଛି)</translation> <translation id="7887174313503389866">ମୁଖ୍ୟ ଗୋପନୀୟତା ଏବଂ ସୁରକ୍ଷା ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ। ଅଧିକ ବିକଳ୍ପ ପାଇଁ, ବ୍ୟକ୍ତିଗତ ସେଟିଂସକୁ ଯାଆନ୍ତୁ।</translation> <translation id="7887198238286927132">ଆପଣଙ୍କର ଗୋପନୀୟତାର ସୁରକ୍ଷା ପାଇଁ, ଏହି ଫିଲ୍ଡକୁ Chrome will ଅଟୋଫିଲ କରିବ ନାହିଁ।</translation> <translation id="7889910613639381518">Google Password Manager ୱିଜେଟ ମାଧ୍ୟମରେ ସହଜ ଏବଂ ସୁରକ୍ଷିତ ଆକ୍ସେସ।</translation> @@ -1558,7 +1558,7 @@ <translation id="9165320910061267720">ମୂଲ୍ୟ ହ୍ରାସ ଆଲର୍ଟର ବିଜ୍ଞପ୍ତି ପାଇବା ପାଇଁ, ଆପଣଙ୍କୁ ଆପଣଙ୍କ iOS ସେଟିଂସରେ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଚାଲୁ କରିବାକୁ ହେବ।</translation> <translation id="9165886811579296457">ଆପଣ ଠିକ କରିବା ପାଇଁ ସୁରକ୍ଷା ଯାଞ୍ଚ କୌଣସି ସୁରକ୍ଷା ସମସ୍ୟା ପାଇଲା ନାହିଁ।</translation> <translation id="9172603439892261948">ଆପଣଙ୍କ ବୁକମାର୍କ, ଇତିହାସ ଏବଂ ଆହୁରି ଅନେକ କିଛି ସିଙ୍କ କରନ୍ତୁ।</translation> -<translation id="9177438225260810839">ଖୋଲା ଥିବା ଟାବଗୁଡ଼ିକରେ ସନ୍ଧାନ କରନ୍ତୁ</translation> +<translation id="9177438225260810839">ଖୋଲା ଥିବା ଟାବଗୁଡ଼ିକରେ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="9187853111759024059">ସମସ୍ତ 99+ ନିଷ୍କ୍ରିୟ ଟାବକୁ ବନ୍ଦ କରିବେ?</translation> <translation id="9188680907066685419">ସମସ୍ତ ପରିଚାଳିତ ଆକାଉଣ୍ଟରୁ ସାଇନ୍ ଆଉଟ୍ କରନ୍ତୁ</translation> <translation id="9200875785104711666"><ph name="TIME" /> ଦିନ ପୂର୍ବେ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 39fc935c..3cf1c39 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">ਤੁਸੀਂ ਇਨ੍ਹਾਂ ਆਈਟਮਾਂ ਨੂੰ ਆਪਣੇ ਬੁੱਕਮਾਰਕਾਂ, ਪੜ੍ਹਨ-ਸੂਚੀ ਜਾਂ Password Manager ਵਿੱਚ ਵੀ ਦੇਖ ਸਕਦੇ ਹੋ ਅਤੇ ਉਨ੍ਹਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="1870148520156231997">ਪਾਸਵਰਡ ਦਿਖਾਓ</translation> <translation id="1872096359983322073">ਟਾਰਚ</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />।</translation> <translation id="1876851015978093044">ਇਸ ਆਈਟਮ ਨੂੰ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ</translation> <translation id="1882901927376062252">{count,plural, =1{ਤੁਹਾਡੇ Google ਖਾਤੇ, {email} ਵਿੱਚ ਬੁੱਕਮਾਰਕ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ}one{ਤੁਹਾਡੇ Google ਖਾਤੇ, {email} ਵਿੱਚ {count} ਬੁੱਕਮਾਰਕ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ}other{ਤੁਹਾਡੇ Google ਖਾਤੇ, {email} ਵਿੱਚ {count} ਬੁੱਕਮਾਰਕ ਰੱਖਿਅਤ ਕੀਤੇ ਗਏ}}</translation> <translation id="1883255238294161206">ਸੂਚੀ ਨੂੰ ਸਮੇਟੋ</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">ਹੋਮ ਸਕ੍ਰੀਨ ਤੋਂ ਪਾਸਵਰਡਾਂ 'ਤੇ ਜਾਓ</translation> <translation id="1959441496380398824">ਕਿਸੇ ਤਾਰੀਖ ਨੂੰ ਸਪਰਸ਼ ਕਰ ਕੇ ਰੱਖੋ।</translation> <translation id="1959679933317802873">ਸਮੱਗਰੀ ਲਈ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> ਨੇ ਤੁਹਾਡੇ ਨਾਲ <ph name="WEBSITE" /> ਦਾ ਪਾਸਵਰਡ ਸਾਂਝਾ ਕੀਤਾ ਹੈ</translation> <translation id="1967461193809857427">{count,plural, =1{ਕੀ Android ਤੋਂ ਟੈਬ ਨੂੰ ਉੱਥੋਂ ਖੋਲ੍ਹਣਾ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸੀ?}one{ਕੀ Android ਤੋਂ ਟੈਬ ਨੂੰ ਉੱਥੋਂ ਖੋਲ੍ਹਣਾ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸੀ?}other{ਕੀ Android ਤੋਂ ਟੈਬਾਂ ਨੂੰ ਉੱਥੋਂ ਖੋਲ੍ਹਣਾ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸਨ?}}</translation> <translation id="1972325230031091483">ਤੁਸੀਂ ਤੇਜ਼ੀ ਨਾਲ ਬ੍ਰਾਊਜ਼ ਕਰੋਗੇ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਗਏ ਮੌਜੂਦਾ ਵੈੱਬ-ਪੰਨੇ ਦੇ ਆਧਾਰ 'ਤੇ ਸਮੱਗਰੀ ਚੁਸਤੀ ਨਾਲ ਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਹੈ</translation> <translation id="1973912524893600642">ਡਾਟਾ ਰੱਖੋ</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">ਕੀ ਕੀਮਤ ਬਾਰੇ ਅਲਰਟਾਂ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> <translation id="2139867232736819575">ਤੁਹਾਡੀ ਕਾਪੀ ਕੀਤੀ ਲਿਖਤ ਖੋਜੋ</translation> <translation id="214201757571129614">ਸਾਈਨ-ਇਨ ਕਰੋ…</translation> +<translation id="2147127444698817042">ਸਿਰਫ਼ iPhone 'ਤੇ ਉਪਲਬਧ ਹੈ</translation> <translation id="2148716181193084225">ਅੱਜ</translation> <translation id="2149973817440762519">ਬੁੱਕਮਾਰਕ ਸੰਪਾਦਿਤ ਕਰੋ</translation> <translation id="2175927920773552910">QR ਕੋਡ</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਕਲੀਅਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…</translation> <translation id="2251686759395008410">ਮੀਨੂ → ਇਤਿਹਾਸ</translation> <translation id="2252674110805316998">ਵੈੱਬ ਖੋਜ</translation> +<translation id="2252749852083403809"><ph name="USER_EMAIL" /> ਦੀ Drive ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="2256933947031277845">ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਨੂੰ ਸਿਰਫ਼ ਕੁਝ ਖਾਤਿਆਂ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।</translation> <translation id="2258326562203545455">{count,plural, =1{ਤੁਸੀਂ ਆਪਣੇ ਬੁੱਕਮਾਰਕ ਨੂੰ ਆਪਣੇ Google ਖਾਤੇ, {email} ਵਿੱਚ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ।}one{ਤੁਸੀਂ ਆਪਣੇ ਬੁੱਕਮਾਰਕ ਨੂੰ ਆਪਣੇ Google ਖਾਤੇ, {email} ਵਿੱਚ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ।}other{ਤੁਸੀਂ ਆਪਣੇ ਬੁੱਕਮਾਰਕਾਂ ਨੂੰ ਆਪਣੇ Google ਖਾਤੇ, {email} ਵਿੱਚ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ।}}</translation> <translation id="225943865679747347">ਅਸ਼ੁੱਧ ਕੋਡ: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="298306318844797842">ਭੁਗਤਾਨ ਵਿਧੀ ਸ਼ਾਮਲ ਕਰੋ...</translation> <translation id="2989805286512600854">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> +<translation id="300455800299409273">"ਇਸ ਟੈਬ 'ਤੇ ਜਾਰੀ ਰੱਖੋ" ਨੂੰ ਲੁਕਾਓ</translation> <translation id="3010025794097054078">ਡਾਟਾ ਉਲੰਘਣਾਵਾਂ, ਅਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਤੋਂ ਸੁਰੱਖਿਅਤ ਰਹੋ।</translation> <translation id="3010171936431626919">ਮੈਨੂੰ ਤਰੀਕਾ ਦਿਖਾਓ</translation> <translation id="3020183492814296499">ਸ਼ਾਰਟਕੱਟ</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">ਤੁਸੀਂ ਆਫ਼ਲਾਈਨ ਹੋ। ਆਪਣੇ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="3832419617903252251">ਪਾਸਵਰਡ ਨੂੰ ਸਿਰਫ਼ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ</translation> <translation id="3835964409414434850">ਅਗਲੀ ਟੈਬ 'ਤੇ ਜਾਓ</translation> +<translation id="383781833195845844">ਇਸ ਟੈਬ 'ਤੇ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="3838691874161539578">ਆਪਣੀ ਸੁਰੱਖਿਆ ਨੂੰ ਮਜ਼ਬੂਤ ਬਣਾਉਣ ਅਤੇ ਆਨਲਾਈਨ ਵਧੇਰੇ ਸੁਰੱਖਿਅਤ ਰਹਿਣ ਲਈ ਆਪਣੇ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> <translation id="385051799172605136">ਪਿੱਛੇ</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" />, ਅਤੇ ਹੋਰ <ph name="NUMBER_OF_ACCOUNTS" /> ਦੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਤੁਹਾਡੇ ਖਾਤਿਆਂ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾਵੇਗਾ।</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">ਸੂਚੀ ਦਾ ਵਿਸਤਾਰ ਕਰੋ</translation> <translation id="4971735654804503942">ਖਤਰਨਾਕ ਵੈੱਬਸਾਈਟਾਂ, ਡਾਊਨਲੋਡਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ ਤੋਂ ਵਧੇਰੇ ਤੇਜ਼ ਅਤੇ ਚੁਸਤ ਸੁਰੱਖਿਆ। ਤੁਹਾਨੂੰ ਪਾਸਵਰਡ ਉਲੰਘਣਾਵਾਂ ਬਾਰੇ ਚਿਤਾਵਨੀ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ। ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ Google ਨੂੰ ਭੇਜਣ ਦੀ ਲੋੜ ਪੈਂਦੀ ਹੈ।</translation> <translation id="4979397965658815378">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਬੁੱਕਮਾਰਕਾਂ, ਪਾਸਵਰਡਾਂ, ਇਤਿਹਾਸ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਆਪਣੇ Google ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਕੋਈ ਥਾਂ ਚੁਣੋ</translation> <translation id="4996567535980789550">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀ ਜਾਣ ਵਾਲੀ ਸਮੱਗਰੀ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਸਿੰਕ ਚਾਲੂ ਕਰੋ</translation> <translation id="5005498671520578047">ਪਾਸਵਰਡ ਕਾਪੀ ਕਰੋ</translation> <translation id="5016420433031926653"><ph name="USER_EMAIL" /> ਨੂੰ ਭੇਜੋ</translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">ਵਰਜਨ <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਪਾਸਵਰਡਾਂ ਨੂੰ ਵਰਤਣ ਅਤੇ ਰੱਖਿਅਤ ਕਰਨ ਲਈ, ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।</translation> <translation id="5684761169742812828">ਇਸ ਪਾਸਵਰਡ ਦਾ ਇੰਟਰਨੈੱਟ 'ਤੇ ਕਿਸੇ ਡਾਟਾ ਉਲੰਘਣਾ ਵਿੱਚ ਖੁਲਾਸਾ ਹੋਇਆ ਸੀ। ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਇਸ ਸਮੇਂ ਇਸਨੂੰ ਬਦਲਣ ਦਾ ਸਮਾਂ ਨਹੀਂ ਹੈ, ਤਾਂ Google ਬਾਅਦ ਵਿੱਚ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਯਾਦ ਕਰਾਉਣ ਲਈ ਇਸ ਚਿਤਾਨਵੀ ਨੂੰ ਰੱਖਣ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਕਰਦਾ ਹੈ।</translation> +<translation id="5694848685995373177"><ph name="USER_EMAIL" /> ਦੀ Drive ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ।</translation> <translation id="5701270923492462699">ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੱਤੀ ਗਈ</translation> <translation id="5702108177581350218">ਆਪਣੇ ਵਰਤੋਂਕਾਰ ਨਾਮ ਅਤੇ ਪਾਸਵਰਡ ਦੀ ਕਾਪੀ ਨੂੰ ਸਾਂਝਾ ਕਰਨ 'ਤੇ, ਤੁਹਾਡੇ ਪਰਿਵਾਰਕ ਮੈਂਬਰ Google Password Manager ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਉਨ੍ਹਾਂ ਨੂੰ ਭਰ ਸਕਦੇ ਹਨ।</translation> <translation id="5704908597376970822">ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ਨਾ-ਪੜ੍ਹੇ ਲੇਖ।</translation> <translation id="7412027924265291969">ਜਾਰੀ ਰੱਖੋ</translation> <translation id="741204030948306876">ਹਾਂ, ਸਹਿਮਤ ਹਾਂ</translation> +<translation id="7418640008860669073">ਇਸ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ...</translation> <translation id="7425346204213733349">ਤੁਹਾਡੇ ਬੁੱਕਮਾਰਕਾਂ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡਾਂ, ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਕੀਤੀਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਹੁਣ ਤੁਹਾਡੇ Google ਖਾਤੇ ਨਾਲ ਸਿੰਕ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ। ਜਦਕਿ, ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਹੀ ਸਟੋਰ ਰਹੇਗਾ।</translation> <translation id="7431991332293347422">'ਖੋਜ' ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਵਰਤੇ ਜਾਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ</translation> <translation id="7435356471928173109">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">ਬੁੱਕਮਾਰਕ ਲੁਕੇ ਹੋਏ ਹਨ</translation> <translation id="750228856503700085">ਅੱਪਡੇਟਾਂ ਉਪਲਬਧ ਨਹੀਂ ਹਨ</translation> <translation id="750493650310597496">0 ਚੁਣਿਆ ਗਿਆ</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">ਆਪਣੀਆਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬਾਂ ਨੂੰ ਲਾਕ ਕਰਨ ਲਈ, ਸਪਰਸ਼ ਆਈਡੀ, ਚਿਹਰਾ ਆਈਡੀ ਜਾਂ ਪਾਸਕੋਡ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ।</translation> <translation id="7514365320538308">ਡਾਊਨਲੋਡ ਕਰੋ</translation> <translation id="7524055474074101597">ਸਾਰੀਆਂ ਐਪਾਂ ਵਿੱਚ ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ।</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">ਨਵੀਂ ਟੈਬ</translation> <translation id="7557508262441527045">ਸਾਈਨ-ਆਊਟ ਕੀਤਾ ਗਿਆ</translation> <translation id="7561196759112975576">ਹਮੇਸ਼ਾਂ</translation> +<translation id="7564917801238348224">ਰੱਖਿਅਤ ਕਰੋ...</translation> <translation id="7582857256643797524">ਇਹ ਸੈਟਿੰਗ ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਚਾਲੂ ਕੀਤੀ ਗਈ ਹੈ</translation> <translation id="7583004045319035904">ਆਪਣੀਆਂ ਇਨਕੋਗਨਿਟੋ ਟੈਬਾਂ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ਦੀ ਵਰਤੋਂ ਕਰੋ।</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> ਦਾ ਕਦੇ ਵੀ ਅਨੁਵਾਦ ਨਾ ਕਰੋ</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">ਸ਼ਹਿਰ / ਕਸਬਾ</translation> <translation id="8428213095426709021">ਸੈਟਿੰਗਾਂ</translation> <translation id="8428634594422941299">ਸਮਝ ਲਿਆ</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਕੋਈ ਥਾਂ ਚੁਣੋ</translation> <translation id="8446884382197647889">ਹੋਰ ਜਾਣੋ</translation> <translation id="8449347986464073209">ਮਿਟਾਓ ਅਤੇ ਸਾਈਨ-ਆਊਟ ਕਰੋ</translation> <translation id="8459333855531264009">ਸੁਰੱਖਿਅਤ ਨਹੀਂ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 931cd81f..ba03553 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -1549,7 +1549,7 @@ <translation id="9109699888944026290">{count,plural, =1{Новий пароль для цього сайту}one{Нові паролі для цього сайту}few{Нові паролі для цього сайту}many{Нові паролі для цього сайту}other{Нові паролі для цього сайту}}</translation> <translation id="9120217828624527905">Перекласти сторінку повністю</translation> <translation id="9124387962554796433">Google може використовувати вашу історію для персоналізації Пошуку й інших сервісів Google.</translation> -<translation id="9137526406337347448">Служби Google</translation> +<translation id="9137526406337347448">Сервіси Google</translation> <translation id="9144931028079269381">Сховати опцію "Список читання"</translation> <translation id="9148126808321036104">Увійти знову</translation> <translation id="9157836665414082580">Заблокувати діалогові вікна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 4e3be02d..9e2fa52f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">آپ ان آئٹمز کو اپنے بُک مارکس، پڑھنے کی فہرست، یا پاس ورڈ مینیجر میں بھی دیکھ اور ان کا نظم کر سکتے ہیں۔</translation> <translation id="1870148520156231997">پاس ورڈ ظاہر کریں</translation> <translation id="1872096359983322073">ٹارچ</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />۔</translation> <translation id="1876851015978093044">یہ آئٹم دکھائی دیتا ہے</translation> <translation id="1882901927376062252">{count,plural, =1{بُک مارک آپ کے Google اکاؤنٹ میں محفوظ کیا، {email}}other{{count} بُک مارکس آپ کے Google اکاؤنٹ میں محفوظ کیے گئے، {email}}}</translation> <translation id="1883255238294161206">فہرست سکیڑیں</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">ہوم اسکرین سے پاس ورڈز حاصل کریں</translation> <translation id="1959441496380398824">کسی تاریخ کو ٹچ کریں اور دبائے رکھیں۔</translation> <translation id="1959679933317802873">مواد کے منتظر</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> نے <ph name="WEBSITE" /> کے لیے آپ کے ساتھ پاس ورڈ کا اشتراک کیا ہے</translation> <translation id="1967461193809857427">{count,plural, =1{وہ ٹیب منتخب کریں جو آپ نے Android پر چھوڑا تھا؟}other{وہ ٹیبز منتخب کریں جنہیں آپ نے Android پر چھوڑا تھا؟}}</translation> <translation id="1972325230031091483">آپ تیزی سے براؤز کریں گے کیونکہ مواد آپ کے موجودہ ویب صفحہ کے ملاحظہ کی بنیاد پر فعال طور پر لوڈ ہوتا ہے</translation> <translation id="1973912524893600642">ڈیٹا باقی رکھیں</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">قیمت کے الرٹس کو آن کریں؟</translation> <translation id="2139867232736819575">وہ متن تلاش کریں جسے آپ نے کاپی کیا ہے</translation> <translation id="214201757571129614">سائن ان کریں…</translation> +<translation id="2147127444698817042">صرف iPhone پر دستیاب ہے</translation> <translation id="2148716181193084225">آج</translation> <translation id="2149973817440762519">بک مارک میں ترمیم کریں</translation> <translation id="2175927920773552910">QR کوڈ</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">براؤزنگ ڈیٹا صاف ہو رہا ہے...</translation> <translation id="2251686759395008410">مینیو ← سرگزشت</translation> <translation id="2252674110805316998">Web Search</translation> +<translation id="2252749852083403809"><ph name="USER_EMAIL" /> کے لیے Drive میں محفوظ کیا جا رہا ہے۔</translation> <translation id="2256933947031277845">آپ کی تنظیم آپ کو صرف مخصوص اکاؤنٹس کے ساتھ سائن ان کرنے کی اجازت دیتی ہے۔</translation> <translation id="2258326562203545455">{count,plural, =1{آپ اپنے بُک مارک کو اپنے Google اکاؤنٹ {email} میں محفوظ کر سکتے ہیں۔}other{آپ اپنے بُک مارکس کو اپنے Google اکاؤنٹ {email} میں محفوظ کر سکتے ہیں۔}}</translation> <translation id="225943865679747347">خرابی کا کوڈ: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">ڈیٹا صاف کریں</translation> <translation id="298306318844797842">ادائیگی کا طریقہ شامل کریں...</translation> <translation id="2989805286512600854">نئے ٹیب میں کھولیں</translation> +<translation id="300455800299409273">"اس ٹیب کے ساتھ جاری رکھیں" کو چھپائیں</translation> <translation id="3010025794097054078">ڈیٹا کی خلاف ورزیوں، غیر محفوظ ویب سائٹس اور بہت کچھ سے محفوظ رہیں۔</translation> <translation id="3010171936431626919">مجھے طریقہ دکھائیں</translation> <translation id="3020183492814296499">شارٹ کٹس</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">آپ آف لائن ہیں۔ اپنا انٹرنیٹ کنکشن چیک کریں اور دوبارہ کوشش کریں۔</translation> <translation id="3832419617903252251">پاس ورڈ صرف اس آلہ پر محفوظ ہے</translation> <translation id="3835964409414434850">اگلے ٹیب پر جائیں</translation> +<translation id="383781833195845844">اس ٹیب کے ساتھ جاری رکھیں</translation> <translation id="3838691874161539578">اپنی سیکیورٹی کو مضبوط بنانے اور آن لائن محفوظ رہنے کے لیے اپنے محفوظ کردہ پاس ورڈز چیک کریں</translation> <translation id="385051799172605136">پیچھے</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />، <ph name="SECOND_WEBSITE" /> اور <ph name="NUMBER_OF_ACCOUNTS" /> دیگر کے پاسورڈز حذف ہو جائيں گے۔ آپ کے اکاؤنٹس حذف نہیں ہوں گے۔</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">فہرست پھیلائیں</translation> <translation id="4971735654804503942">ویب سائٹس، ڈاؤن لوڈز اور ایکسٹینشنز سے تیز، فعال حفاظت۔ پاس ورڈز کی خلاف ورزیوں کے بارے میں آپ کو متنبہ کرتا ہے۔ براؤزنگ ڈیٹا کو Google کے پاس بھیجے جانے کی ضرورت ہوتی ہے۔</translation> <translation id="4979397965658815378">اپنے سبھی آلات پر اپنے بُک مارکس، پاس ورڈز، سرگزشت اور دیگر ترتیبات حاصل کرنے کیلئے اپنے Google اکاؤنٹ کے ساتھ سائن ان کریں</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> محفوظ کرنے کی جگہ کا انتخاب کریں</translation> <translation id="4996567535980789550">آپ جو مواد دیکھتے ہیں اس کا نظم کرنے کے لیے مطابقت پذیری کو آن کریں</translation> <translation id="5005498671520578047">پاس ورڈ کاپی کریں</translation> <translation id="5016420433031926653"><ph name="USER_EMAIL" /> پر بھیجیں</translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">ورژن <ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">اپنے Google اکاؤنٹ میں پاس ورڈز استعمال کرنے اور محفوظ کرنے کے لیے، تصدیق کریں کہ یہ آپ ہی ہیں۔</translation> <translation id="5684761169742812828">یہ پاس ورڈ انٹرنیٹ پر ڈیٹا کی خلاف ورزی میں افشاء ہو گیا۔ اگر آپ کے پاس ابھی اسے تبدیل کرنے کا وقت نہیں ہے تو Google تجویز کرتا ہے کہ بعد میں خود کو یاد دلانے کے لیے اس وارننگ کو برقرار رکھیں۔</translation> +<translation id="5694848685995373177"><ph name="USER_EMAIL" /> کے لیے Drive میں محفوظ کیا گیا۔</translation> <translation id="5701270923492462699">کیمرے تک رسائی کی اجازت ہے</translation> <translation id="5702108177581350218">جب آپ اپنے صارف نام اور پاس ورڈ کی ایک کاپی کا اشتراک کرتے ہیں تو آپ کا فیملی ممبر Google پاس ورڈ مینیجر کا استعمال کرتے ہوئے انہیں پُر کر سکتا ہے۔</translation> <translation id="5704908597376970822">سائن نہیں کیا جا سکتا۔</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> نہ پڑھے ہوئے مضامین۔</translation> <translation id="7412027924265291969">جاری رکھیں</translation> <translation id="741204030948306876">ہاں، میں شامل ہوں</translation> +<translation id="7418640008860669073">...میں محفوظ کریں</translation> <translation id="7425346204213733349">آپ کے بُک مارکس، سرگزشت، پاس ورڈز اور دیگر ترتیبات کی تبدیلیوں کی مزید آپ کے Google اکاؤنٹ کے ساتھ مطابقت پذیری نہیں کی جائے گی۔ البتہ آپ کا موجودہ ڈیٹا آپ کے Google اکاؤنٹ میں اسٹور رہے گا۔</translation> <translation id="7431991332293347422">تلاش کو ذاتی نوعیت کا بنانے کیلئے آپ کی براؤزنگ کی سرگزشت جس طریقے سے استعمال کی جاتی ہے اسے کنٹرول کریں اور مزید بہت کچھ</translation> <translation id="7435356471928173109">آپ کے منتظم کے ذریعے آف کر دیا گیا</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">بُک مارکس چھپے ہوئے ہیں</translation> <translation id="750228856503700085">اپ ڈیٹس دستیاب نہیں ہیں</translation> <translation id="750493650310597496">0 منتخب کیا گیا</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />)۔</translation> <translation id="7508728395076009983">اپنے پوشیدگی ٹیبز کو مقفل کرنے کے لئے ٹچ ID، چہرے کی ID یا پاس کوڈ سیٹ اپ کریں۔</translation> <translation id="7514365320538308">ڈاؤن لوڈ کریں</translation> <translation id="7524055474074101597">ایپس پر اپنے پاس ورڈز اور مزید بہت کچھ تک رسائی حاصل کریں۔</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">نیا ٹیب</translation> <translation id="7557508262441527045">سائن آؤٹ ہو گئے</translation> <translation id="7561196759112975576">ہمیشہ</translation> +<translation id="7564917801238348224">...محفوظ کریں</translation> <translation id="7582857256643797524">یہ ترتیب آپ کے آلے پر فعال ہے</translation> <translation id="7583004045319035904">اپنے پوشیدگی ٹیبز کو غیر مقفل کرنے کیلئے <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> کا استعمال کریں۔</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> کا کبھی بھی ترجمہ نہ کریں</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">شہر / قصبہ</translation> <translation id="8428213095426709021">ترتیبات</translation> <translation id="8428634594422941299">سمجھ آ گئی</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) محفوظ کرنے کی جگہ کا انتخاب کریں</translation> <translation id="8446884382197647889">مزید جانیں</translation> <translation id="8449347986464073209">حذف کریں اور سائن آؤٹ کریں</translation> <translation id="8459333855531264009">محفوظ نہیں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 637766a..881501e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Shuningdek, siz bukmarklar, saqlangan sahifalar va parollar menejeriga saqlangan maʼlumotlarni koʻrishingiz va boshqarishingiz mumkin.</translation> <translation id="1870148520156231997">Parolni ochish</translation> <translation id="1872096359983322073">Fonar</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Bu elementni koʻrsatadi</translation> <translation id="1882901927376062252">{count,plural, =1{Bukmark Google hisobingizga ({email}) saqlandi}other{{count} ta bukmark Google hisobingizga ({email}) saqlandi}}</translation> <translation id="1883255238294161206">Ro‘yxatni yig‘ish</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Asosiy ekrandan parollarga oʻting</translation> <translation id="1959441496380398824">Sanani bosib turing.</translation> <translation id="1959679933317802873">Kontent kutilmoqda</translation> +<translation id="1962348300797608157"><ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" /> sizga <ph name="WEBSITE" /> parolini ulashdi</translation> <translation id="1967461193809857427">{count,plural, =1{Androidda koʻrilgan varaq ochilsinmi?}other{Androidda koʻrilgan varaqlar ochilsinmi?}}</translation> <translation id="1972325230031091483">Sahifalar joriy tashrifi asosida oldindan yuklanadi va tezroq ochiladi</translation> <translation id="1973912524893600642">Maʼlumotlar joyida qolsin</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Narxga oid bildirishnomalar yoqilsinmi?</translation> <translation id="2139867232736819575">Nusxalangan matnni qidirish</translation> <translation id="214201757571129614">Kirish...</translation> +<translation id="2147127444698817042">Faqat iPhoneda ishlaydi</translation> <translation id="2148716181193084225">Bugun</translation> <translation id="2149973817440762519">Xatcho‘p tahriri</translation> <translation id="2175927920773552910">QR kod</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Brauzer tarixini tozalash...</translation> <translation id="2251686759395008410">Menyu → Tarix</translation> <translation id="2252674110805316998">Veb qidiruv</translation> +<translation id="2252749852083403809">Drive omboriga (<ph name="USER_EMAIL" />) saqlanmoqda.</translation> <translation id="2256933947031277845">Tashkilotingiz faqat ayrim hisoblardan kirishga ruxsat beradi.</translation> <translation id="2258326562203545455">{count,plural, =1{Bukmarkni Google hisobingizga ({email}) saqlashingiz mumkin.}other{Bukmarklarni Google hisobingizga ({email}) saqlashingiz mumkin.}}</translation> <translation id="225943865679747347">Xatolik kodi: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Axborotlarni tozalash</translation> <translation id="298306318844797842">Toʻlov usulini kiriting</translation> <translation id="2989805286512600854">Yangi varaqda ochish</translation> +<translation id="300455800299409273">"Shu varaqda davom etish" modulini yopish</translation> <translation id="3010025794097054078">Axborotlar sizib chiqishi va xavfsizlikka oid boshqa muammolardan himoyalaning</translation> <translation id="3010171936431626919">Bu qanday bajariladi</translation> <translation id="3020183492814296499">Yorliqlar</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Siz internetga ulanmagansiz. Internetni tekshiring va qayta urining.</translation> <translation id="3832419617903252251">Parol faqat shu qurilmada saqlanadi</translation> <translation id="3835964409414434850">Keyingi varaqni ochish</translation> +<translation id="383781833195845844">Shu varaqda davom etish</translation> <translation id="3838691874161539578">Saqlangan parollarni xavfsizlikni kuchaytirish va onlaynda xavfsiz qolish maqsadlarida tekshiring</translation> <translation id="385051799172605136">Orqaga</translation> <translation id="3851938967634752633"><ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" /> va <ph name="NUMBER_OF_ACCOUNTS" /> ta hisob parollari oʻchiriladi. Hisoblaringiz oʻchirilmaydi.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">Ro‘yxatni yoyish</translation> <translation id="4971735654804503942">Zararli sayt, yuklanma va kengaytmalarga qarshi tez va mustahkam himoya. Oshkor etilgan parollar haqida ogohlantiradi. Brauzer maʼlumotlari Google serverlariga yuborilishini talab qiladi.</translation> <translation id="4979397965658815378">Xatcho‘plar, tarix, parollar va boshqa sozlamalarni barcha qurilmalaringizda sinxronlash uchun Google hisobingizga kiring.</translation> +<translation id="4989065233040279145"><ph name="FILENAME" /> uchun saqlash joyini tanlang</translation> <translation id="4996567535980789550">Chiqadigan kontentni boshqarish uchun sinxronizatsiyani yoqing</translation> <translation id="5005498671520578047">Parolni nusxalash</translation> <translation id="5016420433031926653">Kimga: <ph name="USER_EMAIL" /></translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783"><ph name="PRODUCT_VERSION" />-versiya</translation> <translation id="5683499062697987550">Parollarni Google hisobiga saqlashda va ulardan foydalanish uchun shaxsingizni tasdiqlang.</translation> <translation id="5684761169742812828">Parol internet maʼlumotlari sizib chiqishida oshkor qilingan. Hozir uni almashtira olmasangiz, Google buni keyinroq qilishni unutmaslik uchun ogohlantirish qoldirishni tavsiya qiladi.</translation> +<translation id="5694848685995373177">Drive omboriga (<ph name="USER_EMAIL" />) saqlandi.</translation> <translation id="5701270923492462699">Kameradan foydalanishga ruxsat berildi</translation> <translation id="5702108177581350218">Foydalanuvchi nomi va parolingiz nusxasini ulashsangiz, oila aʼzolaringiz ularni Google Parollar menejeri yordamida toʻldirishlari mumkin.</translation> <translation id="5704908597376970822">Kirish amalga oshmadi.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ta maqola ochilmagan.</translation> <translation id="7412027924265291969">Davom etish</translation> <translation id="741204030948306876">Ha, roziman</translation> +<translation id="7418640008860669073">Saqlash joyi...</translation> <translation id="7425346204213733349">Endi xatcho‘plar, brauzer tarixi va boshqa sozlamalaringiz Google hisobingizga sinxronlanmaydi. Shunday bo‘lsa-da, mavjud ma’lumotlaringiz Google hisobingizda saqlanib qoladi.</translation> <translation id="7431991332293347422">Moslashtirilgan qidiruv, reklama va boshqa tashriflar tarixi parametrlarini tanlang</translation> <translation id="7435356471928173109">Administrator tomonidan faolsizlantirilgan</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">Bukmarklar berkitilgan</translation> <translation id="750228856503700085">Yangilanishlar mavjud emas</translation> <translation id="750493650310597496">Hech qanday xatcho‘p tanlanmadi</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">inkognito varaqlarni qulflash uchun Touch ID, Face ID yoki kirish kodini sozlang.</translation> <translation id="7514365320538308">Yuklab olish</translation> <translation id="7524055474074101597">Boshqa ilovalarda parollaringiz va boshqalarni oching.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">Yangi varaq</translation> <translation id="7557508262441527045">Hisobdan chiqqansiz</translation> <translation id="7561196759112975576">Har doim</translation> +<translation id="7564917801238348224">SAQLASH...</translation> <translation id="7582857256643797524">Bu sozlama qurilmada yoqilgan</translation> <translation id="7583004045319035904">Inkognito varaqlar qulfini <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> bilan oching.</translation> <translation id="7600965453749440009"><ph name="LANGUAGE" /> tili hech qachon tarjima qilinmasin</translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">Shahar / tuman</translation> <translation id="8428213095426709021">Sozlamalar</translation> <translation id="8428634594422941299">OK</translation> +<translation id="8430694217306051839"><ph name="FILENAME" /> (<ph name="FILE_SIZE" />) uchun saqlash joyini tanlang</translation> <translation id="8446884382197647889">Batafsil</translation> <translation id="8449347986464073209">Oʻchirish va hisobdan chiqish</translation> <translation id="8459333855531264009">Xavfsiz emas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 35f7815..965ad36 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -1454,7 +1454,7 @@ <translation id="8654802032646794042">取消</translation> <translation id="8663764600409216912">目前使用的密碼不容易讓人猜中</translation> <translation id="8668210798914567634">此網頁內容已儲存至你的閱讀清單。</translation> -<translation id="8674716540979958118">你有 # 組遭外洩的密碼。</translation> +<translation id="8674716540979958118">你使用的密碼已外洩。</translation> <translation id="8680787084697685621">帳戶登入詳細資料已過期。</translation> <translation id="868773710103052534">大功告成!</translation> <translation id="8692689525339542358">守護網頁瀏覽安全,有效防堵危險網站、下載內容和擴充功能。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index b2fab5d..bbb4a82a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -162,6 +162,7 @@ <translation id="1847795903283049083">Ungakwazi futhi ukubuka futhi uphathe lezi zinto kumabhukhimakhi akho, Uhlu Lokufunda, noma isiphathi sephasiwedi.</translation> <translation id="1870148520156231997">Bonisa iphasiwedi</translation> <translation id="1872096359983322073">Ithoshi</translation> +<translation id="1875733418125333939"><ph name="FILENAME" />.</translation> <translation id="1876851015978093044">Ibonisa le nto</translation> <translation id="1882901927376062252">{count,plural, =1{Ibhukhimakhi ilondolozwe ku-Google Account yakho, {email}}one{Amabhukhimakhi angu-{count} alondolozwe ku-Google Account yakho, {email}}other{Amabhukhimakhi angu-{count} alondolozwe ku-Google Account yakho, {email}}}</translation> <translation id="1883255238294161206">Goqa uhlu</translation> @@ -180,6 +181,7 @@ <translation id="1956138802718275401">Thola amaphasiwedi esikrinini sasekhaya</translation> <translation id="1959441496380398824">Thinta futhi ubambe usuku.</translation> <translation id="1959679933317802873">Ilinde okuqukethwe</translation> +<translation id="1962348300797608157">U-<ph name="BEGIN_BOLD" /><ph name="FULL_NAME" /><ph name="END_BOLD" />wabelane nawe ngephasiwedi ye-<ph name="WEBSITE" /></translation> <translation id="1967461193809857427">{count,plural, =1{Khetha ithebhu oyishiye ku-Android?}one{Khetha amathebhu owashiye ku-Android?}other{Khetha amathebhu owashiye ku-Android?}}</translation> <translation id="1972325230031091483">Uzobhrawuza ngokushesha ngoba okuqukethwe kulayishwa ngokuqhubekayo ngokusekelwe ekuvakasheni kwakho kwamanje kwekhasi lewebhu</translation> <translation id="1973912524893600642">Gcina idatha</translation> @@ -214,6 +216,7 @@ <translation id="2139502497535990641">Vula Izixwayiso Zezintengo?</translation> <translation id="2139867232736819575">Sesha umbhalo owukopishile</translation> <translation id="214201757571129614">Ukungena ngemvume…</translation> +<translation id="2147127444698817042">Itholakala kuphela ku-iPhone</translation> <translation id="2148716181193084225">Namhlanje</translation> <translation id="2149973817440762519">Hlela ibhukhimakhi</translation> <translation id="2175927920773552910">Ikhodi ye-QR</translation> @@ -226,6 +229,7 @@ <translation id="2239626343334228536">Isula idatha yokuphequlula...</translation> <translation id="2251686759395008410">Imenyu → Umlando</translation> <translation id="2252674110805316998">USesho lweWebhu</translation> +<translation id="2252749852083403809">Ilondoloza ku-Drive ka-<ph name="USER_EMAIL" />.</translation> <translation id="2256933947031277845">Inhlangano yakho ikuvumela ukube ungene ngemvume ngama-akhawunti athile kuphela.</translation> <translation id="2258326562203545455">{count,plural, =1{Ungalonodoloza ibhukhimakhi yakho ku-Google Account yakho, {email}.}one{Ungalondoloza amabhukhimakhi akho ku-Google Account yakho, {email}.}other{Ungalondoloza amabhukhimakhi akho ku-Google Account yakho, {email}.}}</translation> <translation id="225943865679747347">Iphutha lekhodi: <ph name="ERROR_CODE" /></translation> @@ -388,6 +392,7 @@ <translation id="2982481275546140226">Sula idatha</translation> <translation id="298306318844797842">Engeza indlela yokukhokha...</translation> <translation id="2989805286512600854">Vula kuthebhu entsha</translation> +<translation id="300455800299409273">Fihla okuthi "Qhubeka Nale Thebhu"</translation> <translation id="3010025794097054078">Hlala uphephile ekuphulweni kwesivumelwano sedatha, amawebhusayithi angaphephile nokunye.</translation> <translation id="3010171936431626919">Ngibonise Ukuthi Kanjani</translation> <translation id="3020183492814296499">Izinqamuleli</translation> @@ -535,6 +540,7 @@ <translation id="3819183753496523827">Awuxhunyiwe ku-inthanethi. Hlola ukuxhumeka kwakho kwe-inthanethi uphinde uzame futhi.</translation> <translation id="3832419617903252251">Iphasiwedi ilondolozwe kuphela kule divayisi</translation> <translation id="3835964409414434850">Hamba Kuthebhu Elandelayo</translation> +<translation id="383781833195845844">Qhubeka Nale Thebhu</translation> <translation id="3838691874161539578">Hlola amaphasiwedi akho alondoloziwe ukuze uqinise ukuphepha kwakho futhi uhlale uphephile ku-inthanethi</translation> <translation id="385051799172605136">Emuva</translation> <translation id="3851938967634752633">Amaphasiwedi e-<ph name="WEBSITE" />, <ph name="SECOND_WEBSITE" />, kanye namanye e-<ph name="NUMBER_OF_ACCOUNTS" /> azosulwa. Ama-akhawunti akho ngeke asulwe.</translation> @@ -753,6 +759,7 @@ <translation id="4958444002117714549">Nweba uhlu</translation> <translation id="4971735654804503942">Isivikelo esisheshayo, nesisebenzayo ngokumelene namawebhusayithi ayingozi, okulandwayo, kanye nezandiso. Kuyakuxwayisa ngokuphula isivumelwano samaphasiwedi. Kudinga ukuba idatha yopheqululo ithunyelwe ku-Google.</translation> <translation id="4979397965658815378">Ngena ngemvume nge-akhawunti yakho ye-Google ukuze uthole amabhukhimakhi, amaphasiwedi, umlando nezinye izilungiselelo kuwo wonke amadivayisi akho</translation> +<translation id="4989065233040279145">Khetha ukuthi ilondolozwe kuphi i-<ph name="FILENAME" /></translation> <translation id="4996567535980789550">Vula ukuvumelanisa ukuze uphathe okuqukethwe okubonayo</translation> <translation id="5005498671520578047">Kopisha iphasiwedi</translation> <translation id="5016420433031926653">Thumela ku-<ph name="USER_EMAIL" /></translation> @@ -878,6 +885,7 @@ <translation id="567881659373499783">Inguqulo engu-<ph name="PRODUCT_VERSION" /></translation> <translation id="5683499062697987550">Ukuze usebenzise futhi ulondoloze amaphasiwedi ku-Google Account yakho, qinisekisa ukuthi nguwe.</translation> <translation id="5684761169742812828">Le phasiwedi idalulwe ekwephuleni umthetho kwedatha ku-inthanethi. Uma ungenaso isikhathi sokuyishintsha njengamanje, i-Google incoma ukuthi ugcine lesi sexwayiso ukuze uzikhumbuze ngokuhamba kwesikhathi.</translation> +<translation id="5694848685995373177">Ilondolozwe ku-Drive ka-<ph name="USER_EMAIL" />.</translation> <translation id="5701270923492462699">Ukufinyelela Kwekhamera Kuvunyelwe</translation> <translation id="5702108177581350218">Uma wabelana ngekhophi yegama lakho lomsebenzisi nephasiwedi, ilungu lomndeni wakho lingakwazi ukuwagcwalisa lisebenzisa Umphathi Wephasiwedi Ye-Google.</translation> <translation id="5704908597376970822">Ayikwazi ukungena ngemvume.</translation> @@ -1216,6 +1224,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ama-athikili angafundiwe.</translation> <translation id="7412027924265291969">Qhubeka</translation> <translation id="741204030948306876">Yebo, ngingenile</translation> +<translation id="7418640008860669073">Londoloza kokuthi...</translation> <translation id="7425346204213733349">Izinguquko kumabhukhimakhi akho, umlando, amaphasiwedi, nezinye izilungiselelo ngeke kusavumelaniswa ku-akhawunti yakho ye-Google. Yize kunjalo, idatha yakho ekhona izohlala igcinwe ku-akhawunti yakho ye-Google.</translation> <translation id="7431991332293347422">Lawula ukuthi umlando wakho wokuphequlula usetshenziswa kanjani ukuze kwenziwe kube ngokwakho Usesho nokuningi</translation> <translation id="7435356471928173109">Ivalwe ngumlawuli wakho</translation> @@ -1234,6 +1243,7 @@ <translation id="750149195207506638">Amabhukhimakhi afihliwe</translation> <translation id="750228856503700085">Izibuyekezo azitholakali</translation> <translation id="750493650310597496">0 kukhethiwe</translation> +<translation id="7506817096924591340"><ph name="FILENAME" /> (<ph name="FILESIZE" />).</translation> <translation id="7508728395076009983">Ukuze ukhiye amathebhu akho e-Incognito, setha i-Touch ID, Face ID, noma Ikhodi yokudlula.</translation> <translation id="7514365320538308">Landa</translation> <translation id="7524055474074101597">Finyelela amaphasiwedi akho nokunye okwengeziwe kuma-app.</translation> @@ -1247,6 +1257,7 @@ <translation id="7554791636758816595">Ithebhu entsha</translation> <translation id="7557508262441527045">Uphume ngemvume</translation> <translation id="7561196759112975576">Njalo</translation> +<translation id="7564917801238348224">LONDOLOZA...</translation> <translation id="7582857256643797524">Le sethingi linikwe amandla kudivayisi yakho</translation> <translation id="7583004045319035904">Sebenzisa i-<ph name="BIOMETRIC_AUTHENITCATION_TYPE" /> ukuvula amathebhu wakho we-Incognito.</translation> <translation id="7600965453749440009">Ungalokothi uhumushe isi-<ph name="LANGUAGE" /></translation> @@ -1412,6 +1423,7 @@ <translation id="8428045167754449968">Idolobhakazi / Idolobha</translation> <translation id="8428213095426709021">Izilungiselelo</translation> <translation id="8428634594422941299">Ngiyezwa</translation> +<translation id="8430694217306051839">Khetha ukuthi ilondolozwe kuphi i-<ph name="FILENAME" /> (<ph name="FILE_SIZE" />)</translation> <translation id="8446884382197647889">Funda kabanzi</translation> <translation id="8449347986464073209">Susa Bese Uyaphuma</translation> <translation id="8459333855531264009">Akuphephile</translation>
diff --git a/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.h b/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.h index ca76f1b..82ba23b 100644 --- a/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.h +++ b/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_APP_LAUNCHER_MODEL_APP_LAUNCHER_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_APP_LAUNCHER_MODEL_APP_LAUNCHER_BROWSER_AGENT_H_ +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h" #import "ios/chrome/browser/app_launcher/model/app_launcher_tab_helper_delegate.h" #import "ios/chrome/browser/shared/model/browser/browser_user_data.h" @@ -57,7 +58,7 @@ // The Browser. Used to fetch the appropriate request queue for app // launcher dialogs. - Browser* browser_ = nullptr; + raw_ptr<Browser> browser_ = nullptr; // Callback called in `UIApplication openURL:...` completion. // Parameter is the success parameter returned by the openURL API.
diff --git a/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent_unittest.mm b/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent_unittest.mm index cfc7191..125646e 100644 --- a/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent_unittest.mm +++ b/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent_unittest.mm
@@ -8,6 +8,7 @@ #import <map> +#import "base/memory/raw_ptr.h" #import "base/test/metrics/histogram_tester.h" #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h" @@ -61,7 +62,7 @@ AppLauncherTabHelperDelegate* delegate() { return delegate_; } private: - AppLauncherTabHelperDelegate* delegate_; + raw_ptr<AppLauncherTabHelperDelegate> delegate_; }; // Test fixture for AppLauncherBrowserAgent.
diff --git a/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h b/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h index a6e129c..027b4072 100644 --- a/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h +++ b/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h
@@ -7,6 +7,7 @@ #import <optional> +#import "base/memory/raw_ptr.h" #import "ios/web/public/navigation/web_state_policy_decider.h" #import "ios/web/public/web_state_user_data.h" @@ -120,7 +121,7 @@ web::WebStatePolicyDecider::RequestInfo request_info) const; // The WebState that this object is attached to. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; // Used to check for repeated launches and provide policy for launching apps. AppLauncherAbuseDetector* abuse_detector_ = nil; @@ -129,7 +130,7 @@ bool incognito_ = false; // Used to launch apps and present UI. - AppLauncherTabHelperDelegate* delegate_ = nullptr; + raw_ptr<AppLauncherTabHelperDelegate> delegate_ = nullptr; // Used to know if the browser is currently presenting another VC. __weak id<AppLauncherTabHelperBrowserPresentationProvider>
diff --git a/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper_unittest.mm b/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper_unittest.mm index a0e2794f..78ec2d69 100644 --- a/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper_unittest.mm +++ b/ios/chrome/browser/app_launcher/model/app_launcher_tab_helper_unittest.mm
@@ -9,6 +9,7 @@ #import "base/command_line.h" #import "base/files/scoped_temp_dir.h" #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/memory/scoped_refptr.h" #import "base/test/scoped_feature_list.h" #import "base/test/task_environment.h" @@ -259,12 +260,12 @@ std::unique_ptr<TestChromeBrowserState> browser_state_; web::FakeWebState web_state_; bool incognito_ = false; - FakeNavigationManager* navigation_manager_ = nullptr; + raw_ptr<FakeNavigationManager> navigation_manager_ = nullptr; FakeAppLauncherAbuseDetector* abuse_detector_ = nil; FakeAppLauncherTabHelperDelegate delegate_; FakeAppLauncherTabHelperBrowserPresentationProvider* browser_presentation_provider_; - AppLauncherTabHelper* tab_helper_ = nullptr; + raw_ptr<AppLauncherTabHelper> tab_helper_ = nullptr; }; // Tests that a valid URL launches app. @@ -953,7 +954,7 @@ // Enterprise policy boilerplate configuration. std::unique_ptr<EnterprisePolicyTestHelper> enterprise_policy_helper_; - PolicyBlocklistService* policy_blocklist_service_; + raw_ptr<PolicyBlocklistService> policy_blocklist_service_; }; // Tests that URLs to blocked domains do not open native apps.
diff --git a/ios/chrome/browser/browser_state/model/chrome_browser_state_impl_io_data.h b/ios/chrome/browser/browser_state/model/chrome_browser_state_impl_io_data.h index f78750f..a173ef5 100644 --- a/ios/chrome/browser/browser_state/model/chrome_browser_state_impl_io_data.h +++ b/ios/chrome/browser/browser_state/model/chrome_browser_state_impl_io_data.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_BROWSER_STATE_MODEL_CHROME_BROWSER_STATE_IMPL_IO_DATA_H_ #include "base/functional/callback_forward.h" +#import "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "components/prefs/pref_store.h" #include "ios/chrome/browser/browser_state/model/chrome_browser_state_io_data.h" @@ -81,9 +82,9 @@ mutable scoped_refptr<IOSChromeURLRequestContextGetter> main_request_context_getter_; mutable IOSChromeURLRequestContextGetterMap app_request_context_getter_map_; - ChromeBrowserStateImplIOData* const io_data_; + const raw_ptr<ChromeBrowserStateImplIOData> io_data_; - ChromeBrowserState* const browser_state_; + const raw_ptr<ChromeBrowserState> browser_state_; mutable bool initialized_; };
diff --git a/ios/chrome/browser/browser_state/model/chrome_browser_state_io_data.h b/ios/chrome/browser/browser_state/model/chrome_browser_state_io_data.h index ce9cd73..7c23336 100644 --- a/ios/chrome/browser/browser_state/model/chrome_browser_state_io_data.h +++ b/ios/chrome/browser/browser_state/model/chrome_browser_state_io_data.h
@@ -11,6 +11,7 @@ #include <vector> #include "base/files/file_path.h" +#import "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" @@ -95,7 +96,7 @@ ~ProfileParams(); base::FilePath path; - IOSChromeIOThread* io_thread; + raw_ptr<IOSChromeIOThread> io_thread; scoped_refptr<content_settings::CookieSettings> cookie_settings; scoped_refptr<HostContentSettingsMap> host_content_settings_map; @@ -110,7 +111,7 @@ // The browser state this struct was populated from. It's passed as a void* // to ensure it's not accidentally used on the IO thread. - void* browser_state; + raw_ptr<void> browser_state; }; explicit ChromeBrowserStateIOData(ChromeBrowserStateType browser_state_type);
diff --git a/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_impl.h b/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_impl.h index 18d48588..e58082bb 100644 --- a/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_impl.h +++ b/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_impl.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_BROWSER_STATE_MODEL_OFF_THE_RECORD_CHROME_BROWSER_STATE_IMPL_H_ #define IOS_CHROME_BROWSER_BROWSER_STATE_MODEL_OFF_THE_RECORD_CHROME_BROWSER_STATE_IMPL_H_ +#import "base/memory/raw_ptr.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_io_data.h" @@ -59,7 +60,7 @@ ChromeBrowserState* original_chrome_browser_state, const base::FilePath& otr_path); - ChromeBrowserState* original_chrome_browser_state_; // weak + raw_ptr<ChromeBrowserState> original_chrome_browser_state_; // weak // Creation time of the off-the-record BrowserState. const base::Time start_time_;
diff --git a/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_io_data.h b/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_io_data.h index e81b50b..53191240 100644 --- a/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_io_data.h +++ b/ios/chrome/browser/browser_state/model/off_the_record_chrome_browser_state_io_data.h
@@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "ios/chrome/browser/browser_state/model/chrome_browser_state_io_data.h" #include "ios/chrome/browser/net/model/net_types.h" @@ -68,9 +69,9 @@ // ProfileIOData instance is deleted. mutable scoped_refptr<IOSChromeURLRequestContextGetter> main_request_context_getter_; - OffTheRecordChromeBrowserStateIOData* const io_data_; + const raw_ptr<OffTheRecordChromeBrowserStateIOData> io_data_; - ChromeBrowserState* const browser_state_; + const raw_ptr<ChromeBrowserState> browser_state_; mutable bool initialized_; };
diff --git a/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.h b/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.h index 6b864c3..9a194b2 100644 --- a/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.h +++ b/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.h
@@ -7,6 +7,7 @@ #include "base/containers/queue.h" #include "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/task/cancelable_task_tracker.h" @@ -110,7 +111,7 @@ SEQUENCE_CHECKER(sequence_checker_); // ChromeBrowserState we're to remove from. - ChromeBrowserState* browser_state_ = nullptr; + raw_ptr<ChromeBrowserState> browser_state_ = nullptr; // Used to delete data from HTTP cache. scoped_refptr<net::URLRequestContextGetter> context_getter_;
diff --git a/ios/chrome/browser/browsing_data/model/cache_counter.h b/ios/chrome/browser/browsing_data/model/cache_counter.h index bcf8c19..329010e 100644 --- a/ios/chrome/browser/browsing_data/model/cache_counter.h +++ b/ios/chrome/browser/browsing_data/model/cache_counter.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_BROWSING_DATA_MODEL_CACHE_COUNTER_H_ #define IOS_CHROME_BROWSER_BROWSING_DATA_MODEL_CACHE_COUNTER_H_ +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "components/browsing_data/core/counters/browsing_data_counter.h" @@ -28,7 +29,7 @@ // Invoked when cache size has been computed. void OnCacheSizeCalculated(int64_t cache_size); - ChromeBrowserState* browser_state_; + raw_ptr<ChromeBrowserState> browser_state_; base::WeakPtrFactory<CacheCounter> weak_ptr_factory_; };
diff --git a/ios/chrome/browser/browsing_data/model/cache_counter_unittest.cc b/ios/chrome/browser/browsing_data/model/cache_counter_unittest.cc index ff708bf..48aadbe5 100644 --- a/ios/chrome/browser/browsing_data/model/cache_counter_unittest.cc +++ b/ios/chrome/browser/browsing_data/model/cache_counter_unittest.cc
@@ -13,6 +13,7 @@ #include <memory> #include "base/functional/bind.h" +#include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/time/time.h" #include "build/build_config.h" @@ -237,7 +238,7 @@ scoped_refptr<net::URLRequestContextGetter> context_getter_; disk_cache::Backend* backend_; - disk_cache::Entry* entry_; + raw_ptr<disk_cache::Entry> entry_; bool finished_ = false; browsing_data::BrowsingDataCounter::ResultInt result_;
diff --git a/ios/chrome/browser/browsing_data/model/fake_browsing_data_remover_observer.h b/ios/chrome/browser/browsing_data/model/fake_browsing_data_remover_observer.h index 9093c42..d5d9819 100644 --- a/ios/chrome/browser/browsing_data/model/fake_browsing_data_remover_observer.h +++ b/ios/chrome/browser/browsing_data/model/fake_browsing_data_remover_observer.h
@@ -9,9 +9,11 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" + // Arguments passed to `-browsingDataRemover:didRemoveBrowsingDataWithMask:`. struct TestDidRemoveBrowsingDataWithMaskInfo { - BrowsingDataRemover* remover = nullptr; + raw_ptr<BrowsingDataRemover> remover = nullptr; BrowsingDataRemoveMask mask = BrowsingDataRemoveMask::REMOVE_NOTHING; };
diff --git a/ios/chrome/browser/complex_tasks/model/ios_task_tab_helper.h b/ios/chrome/browser/complex_tasks/model/ios_task_tab_helper.h index 0927450..0f49bb0 100644 --- a/ios/chrome/browser/complex_tasks/model/ios_task_tab_helper.h +++ b/ios/chrome/browser/complex_tasks/model/ios_task_tab_helper.h
@@ -7,6 +7,7 @@ #include <unordered_map> +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/complex_tasks/model/ios_content_record_task_id.h" #include "ios/web/public/web_state_observer.h" #import "ios/web/public/web_state_user_data.h" @@ -37,7 +38,7 @@ friend class web::WebStateUserData<IOSTaskTabHelper>; std::unordered_map<int, IOSContentRecordTaskId> ios_content_record_task_id_map_; - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; int prev_item_unique_id_ = -1; WEB_STATE_USER_DATA_KEY_DECL(); };
diff --git a/ios/chrome/browser/credential_provider/model/credential_provider_service.h b/ios/chrome/browser/credential_provider/model/credential_provider_service.h index 8c47954..f80eea5 100644 --- a/ios/chrome/browser/credential_provider/model/credential_provider_service.h +++ b/ios/chrome/browser/credential_provider/model/credential_provider_service.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_MODEL_CREDENTIAL_PROVIDER_SERVICE_H_ #define IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_MODEL_CREDENTIAL_PROVIDER_SERVICE_H_ -#include "base/memory/raw_ptr.h" +#import "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "components/keyed_service/core/keyed_service.h" #include "components/password_manager/core/browser/password_form.h"
diff --git a/ios/chrome/browser/download/model/ar_quick_look_tab_helper.h b/ios/chrome/browser/download/model/ar_quick_look_tab_helper.h index d13aa06..aa73121 100644 --- a/ios/chrome/browser/download/model/ar_quick_look_tab_helper.h +++ b/ios/chrome/browser/download/model/ar_quick_look_tab_helper.h
@@ -7,6 +7,7 @@ #include <memory> +#import "base/memory/raw_ptr.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" @@ -85,7 +86,7 @@ // not started. void ConfirmOrPreviewDownload(web::DownloadTask* download_task); - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; __weak id<ARQuickLookTabHelperDelegate> delegate_ = nil; // The current download task.
diff --git a/ios/chrome/browser/download/model/browser_download_service.h b/ios/chrome/browser/download/model/browser_download_service.h index 824afb7d..2ee5acda 100644 --- a/ios/chrome/browser/download/model/browser_download_service.h +++ b/ios/chrome/browser/download/model/browser_download_service.h
@@ -7,6 +7,7 @@ #include <memory> +#import "base/memory/raw_ptr.h" #include "components/keyed_service/core/keyed_service.h" #include "ios/web/public/download/download_controller_delegate.h" @@ -35,7 +36,7 @@ std::unique_ptr<web::DownloadTask>) override; void OnDownloadControllerDestroyed(web::DownloadController*) override; - web::DownloadController* download_controller_ = nullptr; + raw_ptr<web::DownloadController> download_controller_ = nullptr; }; #endif // IOS_CHROME_BROWSER_DOWNLOAD_MODEL_BROWSER_DOWNLOAD_SERVICE_H_
diff --git a/ios/chrome/browser/download/model/download_manager_tab_helper.h b/ios/chrome/browser/download/model/download_manager_tab_helper.h index 468dd1e..2813efd 100644 --- a/ios/chrome/browser/download/model/download_manager_tab_helper.h +++ b/ios/chrome/browser/download/model/download_manager_tab_helper.h
@@ -9,6 +9,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #include "ios/web/public/download/download_task_observer.h" #include "ios/web/public/web_state_observer.h" #import "ios/web/public/web_state_user_data.h" @@ -66,7 +67,7 @@ // Returns whether `task_` still needs to be saved to Drive. bool WillDownloadTaskBeSavedToDrive() const; - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; __weak id<DownloadManagerTabHelperDelegate> delegate_ = nil; std::unique_ptr<web::DownloadTask> task_; bool delegate_started_ = false;
diff --git a/ios/chrome/browser/download/model/pass_kit_tab_helper.h b/ios/chrome/browser/download/model/pass_kit_tab_helper.h index 05c93af..afef322 100644 --- a/ios/chrome/browser/download/model/pass_kit_tab_helper.h +++ b/ios/chrome/browser/download/model/pass_kit_tab_helper.h
@@ -11,6 +11,7 @@ #include <set> #include "base/containers/unique_ptr_adapters.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "ios/web/public/download/download_task_observer.h" #include "ios/web/public/web_state_user_data.h" @@ -89,7 +90,7 @@ DownloadPassKitResult uma_result, NSArray<NSData*>* all_data); - web::WebState* web_state_; + raw_ptr<web::WebState> web_state_; __weak id<WebContentCommands> handler_ = nil; // Set of unfinished download tasks. std::set<std::unique_ptr<web::DownloadTask>, base::UniquePtrComparator>
diff --git a/ios/chrome/browser/enterprise/model/idle/action.mm b/ios/chrome/browser/enterprise/model/idle/action.mm index 6407e45..0aed1f4d 100644 --- a/ios/chrome/browser/enterprise/model/idle/action.mm +++ b/ios/chrome/browser/enterprise/model/idle/action.mm
@@ -14,6 +14,7 @@ #import "base/containers/flat_set.h" #import "base/functional/bind.h" #import "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #import "base/ranges/algorithm.h" #import "base/scoped_observation.h" #import "components/browsing_data/core/browsing_data_utils.h" @@ -171,11 +172,11 @@ private: void ClearBrowsingData() { - incognito_scoped_observer_.Observe(incognito_browsing_data_remover_); + incognito_scoped_observer_.Observe(incognito_browsing_data_remover_.get()); incognito_browsing_data_remover_->Remove( browsing_data::TimePeriod::ALL_TIME, mask_, {}); - main_scoped_observer_.Observe(main_browsing_data_remover_); + main_scoped_observer_.Observe(main_browsing_data_remover_.get()); main_browsing_data_remover_->Remove(browsing_data::TimePeriod::ALL_TIME, mask_, {}); } @@ -222,8 +223,8 @@ main_scoped_observer_{this}; base::ScopedObservation<BrowsingDataRemover, BrowsingDataRemoverObserver> incognito_scoped_observer_{this}; - BrowsingDataRemover* main_browsing_data_remover_; - BrowsingDataRemover* incognito_browsing_data_remover_; + raw_ptr<BrowsingDataRemover> main_browsing_data_remover_; + raw_ptr<BrowsingDataRemover> incognito_browsing_data_remover_; Continuation continuation_; // Removal mask defined by the clear actions set in the IdleTimeoutActions // policy list.
diff --git a/ios/chrome/browser/enterprise/model/idle/action_unittest.mm b/ios/chrome/browser/enterprise/model/idle/action_unittest.mm index 05d0bd9..918e519 100644 --- a/ios/chrome/browser/enterprise/model/idle/action_unittest.mm +++ b/ios/chrome/browser/enterprise/model/idle/action_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/enterprise/model/idle/action.h" +#import "base/memory/raw_ptr.h" #import "base/test/gmock_callback_support.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/mock_callback.h" @@ -140,7 +141,7 @@ protected: web::WebTaskEnvironment task_environment_; - AuthenticationService* authentication_service_; + raw_ptr<AuthenticationService> authentication_service_; // ScopedTestingLocalState needed for the authentication service. IOSChromeScopedTestingLocalState scoped_testing_local_state_; std::unique_ptr<ActionFactory> action_factory_;
diff --git a/ios/chrome/browser/enterprise/model/idle/idle_service.h b/ios/chrome/browser/enterprise/model/idle/idle_service.h index 676108f..e3381870 100644 --- a/ios/chrome/browser/enterprise/model/idle/idle_service.h +++ b/ios/chrome/browser/enterprise/model/idle/idle_service.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_ENTERPRISE_MODEL_IDLE_IDLE_SERVICE_H_ #import "base/cancelable_callback.h" +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "base/time/time.h" #import "components/keyed_service/core/keyed_service.h" @@ -117,7 +118,7 @@ ActionSet last_action_set_; bool idle_timeout_dialog_pending_{false}; bool idle_timeout_snackbar_pending_{false}; - ChromeBrowserState* browser_state_; + raw_ptr<ChromeBrowserState> browser_state_; std::unique_ptr<ActionRunner> action_runner_; PrefChangeRegistrar pref_change_registrar_; base::CancelableOnceCallback<void()> cancelable_actions_callback_;
diff --git a/ios/chrome/browser/enterprise/model/idle/idle_service_unittest.mm b/ios/chrome/browser/enterprise/model/idle/idle_service_unittest.mm index e67d0ba..5584b81 100644 --- a/ios/chrome/browser/enterprise/model/idle/idle_service_unittest.mm +++ b/ios/chrome/browser/enterprise/model/idle/idle_service_unittest.mm
@@ -3,6 +3,8 @@ // found in the LICENSE file. #import "ios/chrome/browser/enterprise/model/idle/idle_service.h" + +#import "base/memory/raw_ptr.h" #import "base/test/gmock_callback_support.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/scoped_feature_list.h" @@ -121,12 +123,12 @@ web::WebTaskEnvironment::Options::DEFAULT, base::test::TaskEnvironment::TimeSource::MOCK_TIME}; MockObserver mock_observer_; - MockActionRunner* action_runner_; + raw_ptr<MockActionRunner> action_runner_; std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<IdleService> idle_service_; IOSChromeScopedTestingLocalState local_state_; - AuthenticationService* authentication_service_; + raw_ptr<AuthenticationService> authentication_service_; }; // Test that the observer methods are not called when the policy is not set, and
diff --git a/ios/chrome/browser/external_files/model/external_file_remover_impl.h b/ios/chrome/browser/external_files/model/external_file_remover_impl.h index 9343a6366..c0061a3f 100644 --- a/ios/chrome/browser/external_files/model/external_file_remover_impl.h +++ b/ios/chrome/browser/external_files/model/external_file_remover_impl.h
@@ -9,6 +9,7 @@ #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "components/sessions/core/tab_restore_service_observer.h" @@ -67,10 +68,10 @@ // Vector used to store delayed requests. std::vector<DelayedFileRemoveRequest> delayed_file_remove_requests_; // Pointer to the tab restore service. - sessions::TabRestoreService* tab_restore_service_ = nullptr; + raw_ptr<sessions::TabRestoreService> tab_restore_service_ = nullptr; // ChromeBrowserState used to get the referenced files. Must outlive this // object. - ChromeBrowserState* browser_state_ = nullptr; + raw_ptr<ChromeBrowserState> browser_state_ = nullptr; // Used to ensure that this class' methods are called on the correct sequence. SEQUENCE_CHECKER(sequence_checker_); // Used to ensure `Remove()` is not run when this object is destroyed.
diff --git a/ios/chrome/browser/favicon/model/favicon_browser_agent.h b/ios/chrome/browser/favicon/model/favicon_browser_agent.h index f6c66c7..56eb4db 100644 --- a/ios/chrome/browser/favicon/model/favicon_browser_agent.h +++ b/ios/chrome/browser/favicon/model/favicon_browser_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_FAVICON_MODEL_FAVICON_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_FAVICON_MODEL_FAVICON_BROWSER_AGENT_H_ -#include "base/memory/raw_ptr.h" +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "ios/chrome/browser/sessions/session_restoration_observer.h" #include "ios/chrome/browser/shared/model/browser/browser_user_data.h"
diff --git a/ios/chrome/browser/favicon/model/favicon_loader.h b/ios/chrome/browser/favicon/model/favicon_loader.h index b8fe2a2c..fa0e24de 100644 --- a/ios/chrome/browser/favicon/model/favicon_loader.h +++ b/ios/chrome/browser/favicon/model/favicon_loader.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "components/keyed_service/core/keyed_service.h" @@ -92,7 +93,7 @@ private: // The LargeIconService used to retrieve favicon. - favicon::LargeIconService* large_icon_service_; + raw_ptr<favicon::LargeIconService> large_icon_service_; // Tracks tasks sent to FaviconService. base::CancelableTaskTracker cancelable_task_tracker_;
diff --git a/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h b/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h index a746109..d40e360 100644 --- a/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h +++ b/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h
@@ -7,6 +7,7 @@ #import "ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/common/infobar_modal_overlay_request_callback_installer.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" class SaveAddressProfileInfobarModalInteractionHandler; @@ -50,8 +51,8 @@ void InstallCallbacksInternal(OverlayRequest* request) override; // The handler for received responses. - SaveAddressProfileInfobarModalInteractionHandler* interaction_handler_ = - nullptr; + raw_ptr<SaveAddressProfileInfobarModalInteractionHandler> + interaction_handler_ = nullptr; base::WeakPtrFactory< SaveAddressProfileInfobarModalOverlayRequestCallbackInstaller>
diff --git a/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer_unittest.mm b/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer_unittest.mm index e43faccc..3301ee55 100644 --- a/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer_unittest.mm +++ b/ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/autofill_address_profile/save_address_profile_infobar_modal_overlay_request_callback_installer.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/scoped_feature_list.h" #import "base/uuid.h" @@ -77,18 +78,18 @@ autofill::AutofillProfile profile_{ autofill::i18n_model_definition::kLegacyHierarchyCountryCode}; web::FakeWebState web_state_; - InfoBarIOS* infobar_ = nullptr; - OverlayRequest* request_ = nullptr; + raw_ptr<InfoBarIOS> infobar_ = nullptr; + raw_ptr<OverlayRequest> request_ = nullptr; MockSaveAddressProfileInfobarModalInteractionHandler mock_handler_; SaveAddressProfileInfobarModalOverlayRequestCallbackInstaller installer_; MockAutofillSaveUpdateAddressProfileDelegateIOSFactory delegate_factory_; - MockAutofillSaveUpdateAddressProfileDelegateIOS* delegate_; + raw_ptr<MockAutofillSaveUpdateAddressProfileDelegateIOS> delegate_; }; TEST_F(SaveAddressProfileInfobarModalOverlayRequestCallbackInstallerTest, SaveEditedProfile) { autofill::AutofillProfile profile = autofill::test::GetFullProfile(); - EXPECT_CALL(mock_handler_, SaveEditedProfile(infobar_, &profile)); + EXPECT_CALL(mock_handler_, SaveEditedProfile(infobar_.get(), &profile)); request_->GetCallbackManager()->DispatchResponse( OverlayResponse::CreateWithInfo<EditedProfileSaveAction>(&profile)); } @@ -96,14 +97,14 @@ TEST_F(SaveAddressProfileInfobarModalOverlayRequestCallbackInstallerTest, CancelAction) { BOOL fakeFromEditModal = NO; - EXPECT_CALL(mock_handler_, CancelModal(infobar_, fakeFromEditModal)); + EXPECT_CALL(mock_handler_, CancelModal(infobar_.get(), fakeFromEditModal)); request_->GetCallbackManager()->DispatchResponse( OverlayResponse::CreateWithInfo<CancelViewAction>(fakeFromEditModal)); } TEST_F(SaveAddressProfileInfobarModalOverlayRequestCallbackInstallerTest, NoThanksAction) { - EXPECT_CALL(mock_handler_, NoThanksWasPressed(infobar_)); + EXPECT_CALL(mock_handler_, NoThanksWasPressed(infobar_.get())); request_->GetCallbackManager()->DispatchResponse( OverlayResponse::CreateWithInfo<NoThanksViewAction>()); }
diff --git a/ios/chrome/browser/lens/model/lens_browser_agent.h b/ios/chrome/browser/lens/model/lens_browser_agent.h index ab128a1..172e856 100644 --- a/ios/chrome/browser/lens/model/lens_browser_agent.h +++ b/ios/chrome/browser/lens/model/lens_browser_agent.h
@@ -7,6 +7,7 @@ #import <optional> +#import "base/memory/raw_ptr.h" #import "base/scoped_multi_source_observation.h" #import "ios/chrome/browser/shared/model/browser/browser_observer.h" #import "ios/chrome/browser/shared/model/browser/browser_user_data.h" @@ -46,7 +47,7 @@ std::optional<LensEntrypoint> CurrentResultsEntrypoint() const; // The Browser that this agent is attached to. - Browser* browser_ = nullptr; + raw_ptr<Browser> browser_ = nullptr; BROWSER_USER_DATA_KEY_DECL(); };
diff --git a/ios/chrome/browser/lens/model/lens_tab_helper_unittest.mm b/ios/chrome/browser/lens/model/lens_tab_helper_unittest.mm index f03bd54..8e06acc 100644 --- a/ios/chrome/browser/lens/model/lens_tab_helper_unittest.mm +++ b/ios/chrome/browser/lens/model/lens_tab_helper_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/lens/model/lens_tab_helper.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/lens_commands.h" @@ -45,7 +46,7 @@ std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<web::WebState> web_state_; web::WebTaskEnvironment task_environment_; - LensTabHelper* helper_ = nullptr; + raw_ptr<LensTabHelper> helper_ = nullptr; id handler_; id dispatcher_; };
diff --git a/ios/chrome/browser/main/model/browser_util.h b/ios/chrome/browser/main/model/browser_util.h index 6dfa64bb..b263a4fc 100644 --- a/ios/chrome/browser/main/model/browser_util.h +++ b/ios/chrome/browser/main/model/browser_util.h
@@ -9,6 +9,7 @@ #import <set> +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" class Browser; @@ -18,7 +19,7 @@ // Stores information about a tab. struct BrowserAndIndex { - Browser* browser = nullptr; + raw_ptr<Browser> browser = nullptr; int tab_index = WebStateList::kInvalidIndex; };
diff --git a/ios/chrome/browser/main/model/browser_util_unittest.mm b/ios/chrome/browser/main/model/browser_util_unittest.mm index 8945206..d3397575 100644 --- a/ios/chrome/browser/main/model/browser_util_unittest.mm +++ b/ios/chrome/browser/main/model/browser_util_unittest.mm
@@ -6,6 +6,7 @@ #import <memory> +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/sessions/fake_tab_restore_service.h" #import "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" #import "ios/chrome/browser/shared/model/browser/browser_list.h" @@ -116,8 +117,8 @@ std::unique_ptr<Browser> other_browser_; std::unique_ptr<Browser> incognito_browser_; std::unique_ptr<Browser> other_incognito_browser_; - BrowserList* browser_list_; - sessions::TabRestoreService* tab_restore_service_; + raw_ptr<BrowserList> browser_list_; + raw_ptr<sessions::TabRestoreService> tab_restore_service_; }; // Tests that an incognito tab is moved from one incognito browser to another.
diff --git a/ios/chrome/browser/memory/model/BUILD.gn b/ios/chrome/browser/memory/model/BUILD.gn index 751e944..290d9839 100644 --- a/ios/chrome/browser/memory/model/BUILD.gn +++ b/ios/chrome/browser/memory/model/BUILD.gn
@@ -2,6 +2,14 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/buildflag_header.gni") +import("//ios/build/chrome_build.gni") + +buildflag_header("features") { + header = "features.h" + flags = [ "IOS_ENABLE_MEMORY_DEBUGGING=$ios_enable_memory_debugging" ] +} + source_set("model") { sources = [ "memory_debugger.h",
diff --git a/ios/chrome/browser/metrics/model/incognito_web_state_observer.h b/ios/chrome/browser/metrics/model/incognito_web_state_observer.h index 35724e1..c72c718 100644 --- a/ios/chrome/browser/metrics/model/incognito_web_state_observer.h +++ b/ios/chrome/browser/metrics/model/incognito_web_state_observer.h
@@ -7,6 +7,7 @@ #include <set> +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h" class AllWebStateListObservationRegistrar; @@ -39,7 +40,7 @@ void WebStateListDidChange(WebStateList* web_state_list, const WebStateListChange& change, const WebStateListStatus& status) override; - IncognitoWebStateObserver* incognito_tracker_; + raw_ptr<IncognitoWebStateObserver> incognito_tracker_; }; // Observation registrars for each browser state; each one owns an instance
diff --git a/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.h b/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.h index dc0caba..fe5eb41 100644 --- a/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.h +++ b/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client.h
@@ -12,6 +12,7 @@ #include <string> #include "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "base/threading/thread_checker.h" @@ -144,7 +145,7 @@ base::ThreadChecker thread_checker_; // Weak pointer to the MetricsStateManager. - metrics::MetricsStateManager* metrics_state_manager_; + raw_ptr<metrics::MetricsStateManager> metrics_state_manager_; // The synthetic trial registry shared by metrics_service_ and ukm_service_. std::unique_ptr<variations::SyntheticTrialRegistry> synthetic_trial_registry_; @@ -166,7 +167,7 @@ // The IOSChromeStabilityMetricsProvider instance that was registered with // MetricsService. Has the same lifetime as `metrics_service_`. - IOSChromeStabilityMetricsProvider* stability_metrics_provider_; + raw_ptr<IOSChromeStabilityMetricsProvider> stability_metrics_provider_; // Saved callback received from CollectFinalMetricsForLog(). base::OnceClosure collect_final_metrics_done_callback_;
diff --git a/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client_unittest.mm b/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client_unittest.mm index 3ebdbbd3..9c1637a 100644 --- a/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client_unittest.mm +++ b/ios/chrome/browser/metrics/model/ios_chrome_metrics_service_client_unittest.mm
@@ -7,6 +7,7 @@ #import <string> #import "base/files/file_path.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/persistent_histogram_allocator.h" #import "base/test/scoped_feature_list.h" #import "build/branding_buildflags.h" @@ -57,7 +58,7 @@ protected: web::WebTaskEnvironment task_environment_; IOSChromeScopedTestingChromeBrowserStateManager scoped_browser_state_manager_; - ChromeBrowserState* browser_state_; + raw_ptr<ChromeBrowserState> browser_state_; metrics::TestEnabledStateProvider enabled_state_provider_; TestingPrefServiceSimple prefs_; std::unique_ptr<metrics::MetricsStateManager> metrics_state_manager_;
diff --git a/ios/chrome/browser/metrics/model/ios_chrome_metrics_services_manager_client.h b/ios/chrome/browser/metrics/model/ios_chrome_metrics_services_manager_client.h index 182330ac..c37bbfb 100644 --- a/ios/chrome/browser/metrics/model/ios_chrome_metrics_services_manager_client.h +++ b/ios/chrome/browser/metrics/model/ios_chrome_metrics_services_manager_client.h
@@ -7,6 +7,7 @@ #include <memory> +#import "base/memory/raw_ptr.h" #include "base/threading/thread_checker.h" #include "components/metrics_services_manager/metrics_services_manager_client.h" @@ -64,7 +65,7 @@ base::ThreadChecker thread_checker_; // Weak pointer to the local state prefs store. - PrefService* local_state_; + raw_ptr<PrefService> local_state_; }; #endif // IOS_CHROME_BROWSER_METRICS_MODEL_IOS_CHROME_METRICS_SERVICES_MANAGER_CLIENT_H_
diff --git a/ios/chrome/browser/metrics/model/ios_feed_activity_metrics_provider.h b/ios/chrome/browser/metrics/model/ios_feed_activity_metrics_provider.h index 61484ac..89adbf4 100644 --- a/ios/chrome/browser/metrics/model/ios_feed_activity_metrics_provider.h +++ b/ios/chrome/browser/metrics/model/ios_feed_activity_metrics_provider.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MODEL_IOS_FEED_ACTIVITY_METRICS_PROVIDER_H_ #define IOS_CHROME_BROWSER_METRICS_MODEL_IOS_FEED_ACTIVITY_METRICS_PROVIDER_H_ +#import "base/memory/raw_ptr.h" #include "components/metrics/metrics_provider.h" class PrefService; @@ -24,7 +25,7 @@ metrics::ChromeUserMetricsExtension* uma_proto) override; private: - PrefService* pref_service_; + raw_ptr<PrefService> pref_service_; }; #endif // IOS_CHROME_BROWSER_METRICS_MODEL_IOS_FEED_ACTIVITY_METRICS_PROVIDER_H_
diff --git a/ios/chrome/browser/metrics/model/ios_feed_enabled_metrics_provider.h b/ios/chrome/browser/metrics/model/ios_feed_enabled_metrics_provider.h index 3874432..678d895d 100644 --- a/ios/chrome/browser/metrics/model/ios_feed_enabled_metrics_provider.h +++ b/ios/chrome/browser/metrics/model/ios_feed_enabled_metrics_provider.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MODEL_IOS_FEED_ENABLED_METRICS_PROVIDER_H_ #define IOS_CHROME_BROWSER_METRICS_MODEL_IOS_FEED_ENABLED_METRICS_PROVIDER_H_ +#import "base/memory/raw_ptr.h" #import "components/metrics/metrics_provider.h" class PrefService; @@ -25,7 +26,7 @@ metrics::ChromeUserMetricsExtension* uma_proto) override; private: - PrefService* pref_service_; + raw_ptr<PrefService> pref_service_; }; #endif // IOS_CHROME_BROWSER_METRICS_MODEL_IOS_FEED_ENABLED_METRICS_PROVIDER_H_
diff --git a/ios/chrome/browser/metrics/model/ios_push_notifications_metrics_provider.h b/ios/chrome/browser/metrics/model/ios_push_notifications_metrics_provider.h index ae6ee99..8148f18e 100644 --- a/ios/chrome/browser/metrics/model/ios_push_notifications_metrics_provider.h +++ b/ios/chrome/browser/metrics/model/ios_push_notifications_metrics_provider.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MODEL_IOS_PUSH_NOTIFICATIONS_METRICS_PROVIDER_H_ #define IOS_CHROME_BROWSER_METRICS_MODEL_IOS_PUSH_NOTIFICATIONS_METRICS_PROVIDER_H_ +#import "base/memory/raw_ptr.h" #include "components/metrics/metrics_provider.h" namespace signin { @@ -27,7 +28,7 @@ metrics::ChromeUserMetricsExtension* uma_proto) override; private: - signin::IdentityManager* identity_manager_; + raw_ptr<signin::IdentityManager> identity_manager_; }; #endif // IOS_CHROME_BROWSER_METRICS_MODEL_IOS_PUSH_NOTIFICATIONS_METRICS_PROVIDER_H_
diff --git a/ios/chrome/browser/metrics/model/mobile_session_shutdown_metrics_provider.h b/ios/chrome/browser/metrics/model/mobile_session_shutdown_metrics_provider.h index 01dd8ee2d..6f7f9f2 100644 --- a/ios/chrome/browser/metrics/model/mobile_session_shutdown_metrics_provider.h +++ b/ios/chrome/browser/metrics/model/mobile_session_shutdown_metrics_provider.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MODEL_MOBILE_SESSION_SHUTDOWN_METRICS_PROVIDER_H_ #define IOS_CHROME_BROWSER_METRICS_MODEL_MOBILE_SESSION_SHUTDOWN_METRICS_PROVIDER_H_ +#import "base/memory/raw_ptr.h" #include "components/metrics/metrics_provider.h" namespace metrics { @@ -68,7 +69,7 @@ virtual bool LastSessionEndedFrozen(); private: - metrics::MetricsService* metrics_service_; + raw_ptr<metrics::MetricsService> metrics_service_; }; #endif // IOS_CHROME_BROWSER_METRICS_MODEL_MOBILE_SESSION_SHUTDOWN_METRICS_PROVIDER_H_
diff --git a/ios/chrome/browser/metrics/model/pageload_foreground_duration_tab_helper.h b/ios/chrome/browser/metrics/model/pageload_foreground_duration_tab_helper.h index 6dae6c4c..884f5bcb 100644 --- a/ios/chrome/browser/metrics/model/pageload_foreground_duration_tab_helper.h +++ b/ios/chrome/browser/metrics/model/pageload_foreground_duration_tab_helper.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MODEL_PAGELOAD_FOREGROUND_DURATION_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_METRICS_MODEL_PAGELOAD_FOREGROUND_DURATION_TAB_HELPER_H_ +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "base/time/time.h" #import "ios/web/public/web_state.h" @@ -50,7 +51,7 @@ // Last time when recording started. base::TimeTicks last_time_shown_; // WebState reference. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; // Scoped observer that facilitates observing the WebState. base::ScopedObservation<web::WebState, WebStateObserver> scoped_observation_{ this};
diff --git a/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent.h b/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent.h index bff19322..156de21 100644 --- a/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent.h +++ b/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent.h
@@ -10,6 +10,7 @@ #import <vector> #import "base/containers/circular_deque.h" +#import "base/memory/raw_ptr.h" #import "base/scoped_observation.h" #import "base/time/time.h" #import "ios/chrome/browser/metrics/model/tab_usage_recorder_metrics.h" @@ -177,7 +178,7 @@ // Keep track of the current tab, but only if it has been evicted. // This is kept as a pointer value only - it should never be dereferenced. - web::WebState* evicted_web_state_ = nullptr; + raw_ptr<web::WebState> evicted_web_state_ = nullptr; // State of `evicted_web_state_` at the time it became the current tab. tab_usage_recorder::TabStateWhenSelected evicted_web_state_state_ = @@ -186,11 +187,11 @@ // Keep track of the tab last selected when this tab model was switched // away from to another mode (e.g. to incognito). // Kept as a pointer value only - it should never be dereferenced. - web::WebState* mode_switch_web_state_ = nullptr; + raw_ptr<web::WebState> mode_switch_web_state_ = nullptr; // Keep track of a tab that was created to be immediately selected. It should // not contribute to the "StatusWhenSwitchedBackToForeground" metric. - web::WebState* web_state_created_selected_ = nullptr; + raw_ptr<web::WebState> web_state_created_selected_ = nullptr; // Keep track of when the evicted tab starts to reload, so that the total // time it takes to reload can be recorded. @@ -201,11 +202,11 @@ evicted_web_states_; // The WebStateList containing all the monitored tabs. - WebStateList* web_state_list_; // weak + raw_ptr<WebStateList> web_state_list_; // weak // The PrerenderService used to check whether a tab is pre-rendering. May // be null during unit testing. - PrerenderService* prerender_service_; + raw_ptr<PrerenderService> prerender_service_; // Observation for SessionRestorationService events. base::ScopedObservation<SessionRestorationService, SessionRestorationObserver>
diff --git a/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent_unittest.mm b/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent_unittest.mm index 3ed51464..57ef119 100644 --- a/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent_unittest.mm +++ b/ios/chrome/browser/metrics/model/tab_usage_recorder_browser_agent_unittest.mm
@@ -9,6 +9,7 @@ #import <memory> #import <tuple> +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_samples.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/task_environment.h" @@ -96,7 +97,7 @@ std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<TestBrowser> browser_; base::HistogramTester histogram_tester_; - TabUsageRecorderBrowserAgent* tab_usage_recorder_; + raw_ptr<TabUsageRecorderBrowserAgent> tab_usage_recorder_; id application_; };
diff --git a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h index 080cc534..c3149250 100644 --- a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h +++ b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_METRICS_MODEL_WEB_STATE_LIST_METRICS_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_METRICS_MODEL_WEB_STATE_LIST_METRICS_BROWSER_AGENT_H_ +#import "base/memory/raw_ptr.h" #import "base/scoped_observation.h" #import "ios/chrome/browser/sessions/session_restoration_observer.h" #import "ios/chrome/browser/shared/model/browser/browser_observer.h" @@ -62,10 +63,10 @@ const WebStateListStatus& status) override; // The WebStateList containing all the monitored tabs. - WebStateList* web_state_list_ = nullptr; + raw_ptr<WebStateList> web_state_list_ = nullptr; // The object storing the metrics. - SessionMetrics* session_metrics_ = nullptr; + raw_ptr<SessionMetrics> session_metrics_ = nullptr; // Whether metric recording is paused (for session restoration). bool metric_collection_paused_ = false;
diff --git a/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.h b/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.h index 2dc234d..c2704328 100644 --- a/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.h +++ b/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_OVERSCROLL_ACTIONS_MODEL_OVERSCROLL_ACTIONS_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_OVERSCROLL_ACTIONS_MODEL_OVERSCROLL_ACTIONS_TAB_HELPER_H_ +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h" #include "ios/web/public/web_state.h" @@ -55,7 +56,7 @@ __weak id<OverscrollActionsControllerDelegate> delegate_ = nil; // The WebState that is observer by the tab helper. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; base::ScopedObservation<web::WebState, web::WebStateObserver> web_state_observation_{this};
diff --git a/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.mm b/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.mm index 5310428..54b9d6b 100644 --- a/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.mm +++ b/ios/chrome/browser/overscroll_actions/model/overscroll_actions_tab_helper.mm
@@ -48,7 +48,7 @@ OverscrollActionsTabHelper::OverscrollActionsTabHelper(web::WebState* web_state) : web_state_(web_state) { DCHECK(web_state_); - web_state_observation_.Observe(web_state_); + web_state_observation_.Observe(web_state_.get()); } OverscrollActionsController*
diff --git a/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager.h b/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager.h index 4851fae..3b4f1a7 100644 --- a/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager.h +++ b/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager.h
@@ -7,7 +7,7 @@ #include <optional> -#include "base/memory/raw_ptr.h" +#import "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h"
diff --git a/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_factory.mm b/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_factory.mm index 877580f..47df908e2 100644 --- a/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_factory.mm +++ b/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_factory.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_factory.h" +#import "base/memory/raw_ptr.h" #import "base/memory/ref_counted.h" #import "base/memory/weak_ptr.h" #import "base/no_destructor.h" @@ -48,7 +49,7 @@ } private: - ChromeBrowserState* browser_state_ = nullptr; + raw_ptr<ChromeBrowserState> browser_state_ = nullptr; base::WeakPtr<IOSChromePasswordCheckManager> instance_; }; } // namespace
diff --git a/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_unittest.mm b/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_unittest.mm index 8ff42ee1..efa1cff 100644 --- a/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_unittest.mm +++ b/ios/chrome/browser/passwords/model/ios_chrome_password_check_manager_unittest.mm
@@ -9,6 +9,7 @@ #import <vector> #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/memory/scoped_refptr.h" #import "base/strings/strcat.h" #import "base/strings/string_number_conversions.h" @@ -157,7 +158,7 @@ web::WebTaskEnvironment::Options::DEFAULT, base::test::TaskEnvironment::TimeSource::MOCK_TIME}; std::unique_ptr<ChromeBrowserState> browser_state_; - MockBulkLeakCheckService* bulk_leak_check_service_; + raw_ptr<MockBulkLeakCheckService> bulk_leak_check_service_; scoped_refptr<TestPasswordStore> store_; scoped_refptr<IOSChromePasswordCheckManager> manager_; };
diff --git a/ios/chrome/browser/passwords/model/ios_chrome_save_password_infobar_delegate_unittest.mm b/ios/chrome/browser/passwords/model/ios_chrome_save_password_infobar_delegate_unittest.mm index 53945a91..48de729 100644 --- a/ios/chrome/browser/passwords/model/ios_chrome_save_password_infobar_delegate_unittest.mm +++ b/ios/chrome/browser/passwords/model/ios_chrome_save_password_infobar_delegate_unittest.mm
@@ -6,6 +6,7 @@ #import <memory> +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/task_environment.h" @@ -108,7 +109,7 @@ // Infobar delegate to test. std::unique_ptr<IOSChromeSavePasswordInfoBarDelegate> delegate_; // Pointer to the infobar's form manager. - password_manager::MockPasswordFormManagerForUI* form_manager_ptr_; + raw_ptr<password_manager::MockPasswordFormManagerForUI> form_manager_ptr_; }; TEST_F(IOSChromeSavePasswordInfoBarDelegateTest, GetUserNameText) {
diff --git a/ios/chrome/browser/passwords/model/ios_password_store_utils.mm b/ios/chrome/browser/passwords/model/ios_password_store_utils.mm index 0b1421c48..024fd6c 100644 --- a/ios/chrome/browser/passwords/model/ios_password_store_utils.mm +++ b/ios/chrome/browser/passwords/model/ios_password_store_utils.mm
@@ -7,6 +7,7 @@ #import <AuthenticationServices/AuthenticationServices.h> #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/task/sequenced_task_runner.h" #import "components/keyed_service/core/service_access_type.h" @@ -106,7 +107,7 @@ } } - ChromeBrowserState* const browser_state_; + const raw_ptr<ChromeBrowserState> browser_state_; // StoreMetricReporterHelper is owned by the profile `metrics_reporter_` life // time is now bound to the profile. std::unique_ptr<password_manager::StoreMetricsReporter> metrics_reporter_;
diff --git a/ios/chrome/browser/passwords/model/password_controller.mm b/ios/chrome/browser/passwords/model/password_controller.mm index ed5298c..d15c5a7 100644 --- a/ios/chrome/browser/passwords/model/password_controller.mm +++ b/ios/chrome/browser/passwords/model/password_controller.mm
@@ -16,6 +16,7 @@ #import "base/apple/foundation_util.h" #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" @@ -148,7 +149,7 @@ // The WebState this instance is observing. Will be null after // -webStateDestroyed: has been called. - WebState* _webState; + raw_ptr<WebState> _webState; // Bridge to observe WebState from Objective-C. std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge;
diff --git a/ios/chrome/browser/passwords/model/password_controller_unittest.mm b/ios/chrome/browser/passwords/model/password_controller_unittest.mm index 345d4d0..727c9a4 100644 --- a/ios/chrome/browser/passwords/model/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/model/password_controller_unittest.mm
@@ -143,7 +143,7 @@ private: mutable FakeNetworkContext network_context_; raw_ptr<PrefService> const prefs_; - password_manager::PasswordStoreInterface* const store_; + const raw_ptr<password_manager::PasswordStoreInterface> store_; }; // Creates PasswordController with the given `pref_service`, `web_state` and a @@ -1315,7 +1315,7 @@ scoped_refptr<password_manager::MockPasswordStoreInterface> store_; MockPasswordManagerClient* weak_client_; web::FakeWebState web_state_; - web::FakeWebFramesManager* web_frames_manager_; + raw_ptr<web::FakeWebFramesManager> web_frames_manager_; }; TEST_F(PasswordControllerTestSimple, SaveOnNonHTMLLandingPage) {
diff --git a/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm b/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm index 95264e9..132552b 100644 --- a/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm +++ b/ios/chrome/browser/passwords/model/password_tab_helper_unittest.mm
@@ -6,6 +6,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/bind.h" #import "base/test/metrics/histogram_tester.h" @@ -70,7 +71,7 @@ web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<web::WebState> web_state_; - PasswordTabHelper* helper_ = nullptr; + raw_ptr<PasswordTabHelper> helper_ = nullptr; id dispatcher_; };
diff --git a/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper.h b/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper.h index c5b6610..5a5903fa 100644 --- a/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper.h +++ b/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper.h
@@ -4,6 +4,7 @@ #ifndef IOS_CHROME_BROWSER_PASSWORDS_MODEL_WELL_KNOWN_CHANGE_PASSWORD_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_PASSWORDS_MODEL_WELL_KNOWN_CHANGE_PASSWORD_TAB_HELPER_H_ +#import "base/memory/raw_ptr.h" #include "components/password_manager/core/browser/well_known_change_password/well_known_change_password_state.h" #include "components/password_manager/core/browser/well_known_change_password/well_known_change_password_util.h" #include "ios/web/public/navigation/web_state_policy_decider.h" @@ -74,7 +75,7 @@ // Records the given UKM metric. void RecordMetric(WellKnownChangePasswordResult result); - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; ProcessingState processing_state_ = kWaitingForFirstRequest; // Stores the request_url if the first navigation was to // .well-known/change-password. It is later used to redirect to the origin. @@ -84,7 +85,7 @@ web::WebStatePolicyDecider::PolicyDecisionCallback response_policy_callback_; password_manager::WellKnownChangePasswordState well_known_change_password_state_{this}; - password_manager::AffiliationService* affiliation_service_ = nullptr; + raw_ptr<password_manager::AffiliationService> affiliation_service_ = nullptr; WEB_STATE_USER_DATA_KEY_DECL(); };
diff --git a/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper_unittest.mm b/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper_unittest.mm index ba28fa71..521bf96 100644 --- a/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper_unittest.mm +++ b/ios/chrome/browser/passwords/model/well_known_change_password_tab_helper_unittest.mm
@@ -5,6 +5,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #import "base/test/bind.h" #import "base/test/scoped_feature_list.h" #import "components/password_manager/core/browser/affiliation/mock_affiliation_service.h" @@ -164,7 +165,8 @@ base::test::ScopedFeatureList feature_list_; network::TestURLLoaderFactory test_url_loader_factory_; web::FakeWebStateDelegate delegate_; - password_manager::MockAffiliationService* affiliation_service_ = nullptr; + raw_ptr<password_manager::MockAffiliationService> affiliation_service_ = + nullptr; }; GURL WellKnownChangePasswordTabHelperTest::GetNavigatedUrl() const {
diff --git a/ios/chrome/browser/permissions/model/permissions_infobar_delegate.h b/ios/chrome/browser/permissions/model/permissions_infobar_delegate.h index e5b8e2d..e9342e6 100644 --- a/ios/chrome/browser/permissions/model/permissions_infobar_delegate.h +++ b/ios/chrome/browser/permissions/model/permissions_infobar_delegate.h
@@ -6,6 +6,8 @@ #define IOS_CHROME_BROWSER_PERMISSIONS_MODEL_PERMISSIONS_INFOBAR_DELEGATE_H_ #import <Foundation/Foundation.h> + +#import "base/memory/raw_ptr.h" #include "components/infobars/core/confirm_infobar_delegate.h" namespace web { @@ -37,7 +39,7 @@ private: NSArray<NSNumber*>* recently_accessible_permissions_; - web::WebState* web_state_; + raw_ptr<web::WebState> web_state_; }; #endif // IOS_CHROME_BROWSER_PERMISSIONS_MODEL_PERMISSIONS_INFOBAR_DELEGATE_H_
diff --git a/ios/chrome/browser/permissions/model/permissions_tab_helper.h b/ios/chrome/browser/permissions/model/permissions_tab_helper.h index 97f4d7c..6780d49 100644 --- a/ios/chrome/browser/permissions/model/permissions_tab_helper.h +++ b/ios/chrome/browser/permissions/model/permissions_tab_helper.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #import "base/scoped_observation.h" #import "base/timer/timer.h" #import "components/infobars/core/confirm_infobar_delegate.h" @@ -61,10 +62,10 @@ void UpdateIsInfoBarAccepted(); // The WebState that this object is attached to. - web::WebState* web_state_; + raw_ptr<web::WebState> web_state_; // The currently displayed infobar. - infobars::InfoBar* infobar_ = nullptr; + raw_ptr<infobars::InfoBar> infobar_ = nullptr; // Permissions that have changed its state from NotAccessible to Allowed // within a given timeout period. @@ -83,10 +84,10 @@ infobar_manager_scoped_observation_{this}; // Banner queue for the TabHelper's WebState; - OverlayRequestQueue* banner_queue_ = nullptr; + raw_ptr<OverlayRequestQueue> banner_queue_ = nullptr; // Request inserter for the TabHelper's WebState; - InfobarOverlayRequestInserter* inserter_ = nullptr; + raw_ptr<InfobarOverlayRequestInserter> inserter_ = nullptr; WEB_STATE_USER_DATA_KEY_DECL(); };
diff --git a/ios/chrome/browser/prerender/model/fake_prerender_service.h b/ios/chrome/browser/prerender/model/fake_prerender_service.h index 65e501dd..a8c22951 100644 --- a/ios/chrome/browser/prerender/model/fake_prerender_service.h +++ b/ios/chrome/browser/prerender/model/fake_prerender_service.h
@@ -7,6 +7,8 @@ #import "ios/chrome/browser/prerender/model/prerender_service.h" +#import "base/memory/raw_ptr.h" + // Fake implementation of PrerenderService. Treats a prerender as in-progress // after a call to StartPrerender(), but MaybeLoadPrerenderedURL() always // returns false. @@ -37,7 +39,7 @@ bool HasPrerenderForUrl(const GURL& url) override; bool IsWebStatePrerendered(web::WebState* web_state) override; - web::WebState* prerender_web_state_ = nullptr; + raw_ptr<web::WebState> prerender_web_state_ = nullptr; // The URL for the in-progress preload. GURL preload_url_;
diff --git a/ios/chrome/browser/reading_list/model/favicon_web_state_dispatcher_impl.h b/ios/chrome/browser/reading_list/model/favicon_web_state_dispatcher_impl.h index 5a5cadd0..62d09e9 100644 --- a/ios/chrome/browser/reading_list/model/favicon_web_state_dispatcher_impl.h +++ b/ios/chrome/browser/reading_list/model/favicon_web_state_dispatcher_impl.h
@@ -8,6 +8,7 @@ #include <memory> #include <vector> +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "components/reading_list/ios/favicon_web_state_dispatcher.h" @@ -32,7 +33,7 @@ void ReleaseAll() override; private: - web::BrowserState* browser_state_; + raw_ptr<web::BrowserState> browser_state_; // Map of the WebStates currently alive. std::vector<std::unique_ptr<web::WebState>> web_states_; // Time during which the WebState will be kept alive after being returned.
diff --git a/ios/chrome/browser/reading_list/model/offline_page_tab_helper.h b/ios/chrome/browser/reading_list/model/offline_page_tab_helper.h index 78bad3e..6a678fcf 100644 --- a/ios/chrome/browser/reading_list/model/offline_page_tab_helper.h +++ b/ios/chrome/browser/reading_list/model/offline_page_tab_helper.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#import "base/memory/raw_ptr.h" #include "components/reading_list/core/reading_list_model_observer.h" #include "ios/web/public/web_state_observer.h" #import "ios/web/public/web_state_user_data.h" @@ -113,8 +114,8 @@ // Injects some JS to replace the current page with `url` and reload the page. void ReplaceLocationUrlAndReload(const GURL& url); - web::WebState* web_state_ = nullptr; - ReadingListModel* reading_list_model_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; + raw_ptr<ReadingListModel> reading_list_model_ = nullptr; // The initial URL of the navigation. This URL will not follow the // redirections so it may be different from GetLastCommittedURL.
diff --git a/ios/chrome/browser/reading_list/model/reading_list_browser_agent.h b/ios/chrome/browser/reading_list/model/reading_list_browser_agent.h index 1f92369..9cd633aa 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_browser_agent.h +++ b/ios/chrome/browser/reading_list/model/reading_list_browser_agent.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_READING_LIST_MODEL_READING_LIST_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_READING_LIST_MODEL_READING_LIST_BROWSER_AGENT_H_ +#import "base/memory/raw_ptr.h" #import "base/scoped_multi_source_observation.h" #import "base/scoped_observation.h" #import "ios/chrome/browser/shared/model/browser/browser_user_data.h" @@ -58,7 +59,7 @@ MDCSnackbarMessageAction* CreateViewAction(); // The browser associated with this agent. - Browser* browser_; + raw_ptr<Browser> browser_; // Create weak pointers to ensure that the callback bound to the object is // canceled when the object is destroyed.
diff --git a/ios/chrome/browser/reading_list/model/reading_list_browser_agent_unittest.mm b/ios/chrome/browser/reading_list/model/reading_list_browser_agent_unittest.mm index f7d3e95..3412032c 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_browser_agent_unittest.mm +++ b/ios/chrome/browser/reading_list/model/reading_list_browser_agent_unittest.mm
@@ -6,6 +6,7 @@ #import <MaterialComponents/MaterialSnackbar.h> +#import "base/memory/raw_ptr.h" #import "base/test/metrics/histogram_tester.h" #import "components/prefs/testing_pref_service.h" #import "components/reading_list/core/reading_list_model_impl.h" @@ -70,7 +71,7 @@ std::unique_ptr<TestBrowser> browser_; base::HistogramTester histogram_tester_; web::WebTaskEnvironment task_environment_; - ReadingListBrowserAgent* reading_list_browser_agent_; + raw_ptr<ReadingListBrowserAgent> reading_list_browser_agent_; id mock_snackbar_commands_handler_; std::unique_ptr<TestingPrefServiceSimple> local_state_; };
diff --git a/ios/chrome/browser/reading_list/model/reading_list_distiller_page.h b/ios/chrome/browser/reading_list/model/reading_list_distiller_page.h index d221762..aee5a0f4 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_distiller_page.h +++ b/ios/chrome/browser/reading_list/model/reading_list_distiller_page.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "components/dom_distiller/ios/distiller_page_ios.h" #include "url/gurl.h" @@ -111,8 +112,8 @@ GURL original_url_; bool distilling_main_page_; - FaviconWebStateDispatcher* web_state_dispatcher_; - ReadingListDistillerPageDelegate* delegate_; + raw_ptr<FaviconWebStateDispatcher> web_state_dispatcher_; + raw_ptr<ReadingListDistillerPageDelegate> delegate_; int delayed_task_id_; base::WeakPtrFactory<ReadingListDistillerPage> weak_ptr_factory_; };
diff --git a/ios/chrome/browser/reading_list/model/reading_list_distiller_page_factory.h b/ios/chrome/browser/reading_list/model/reading_list_distiller_page_factory.h index 8341a36..0551ebf9 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_distiller_page_factory.h +++ b/ios/chrome/browser/reading_list/model/reading_list_distiller_page_factory.h
@@ -7,6 +7,7 @@ #include <memory> +#import "base/memory/raw_ptr.h" #include "url/gurl.h" namespace web { @@ -44,7 +45,7 @@ void ReleaseAllRetainedWebState(); private: - web::BrowserState* browser_state_; + raw_ptr<web::BrowserState> browser_state_; std::unique_ptr<FaviconWebStateDispatcher> web_state_dispatcher_; };
diff --git a/ios/chrome/browser/reading_list/model/reading_list_download_service.h b/ios/chrome/browser/reading_list/model/reading_list_download_service.h index 74e16be..78d78d8 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_download_service.h +++ b/ios/chrome/browser/reading_list/model/reading_list_download_service.h
@@ -7,6 +7,7 @@ #include <string> +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "components/keyed_service/core/keyed_service.h" #include "components/reading_list/core/reading_list_model_observer.h" @@ -105,7 +106,7 @@ // network::NetworkConnectionTracker::NetworkConnectionObserver: void OnConnectionChanged(network::mojom::ConnectionType type) override; - ReadingListModel* reading_list_model_; + raw_ptr<ReadingListModel> reading_list_model_; base::FilePath chrome_profile_path_; std::unique_ptr<URLDownloader> url_downloader_; std::vector<GURL> url_to_download_cellular_;
diff --git a/ios/chrome/browser/reading_list/model/reading_list_download_service.mm b/ios/chrome/browser/reading_list/model/reading_list_download_service.mm index e3ff2cd35..60acb37 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_download_service.mm +++ b/ios/chrome/browser/reading_list/model/reading_list_download_service.mm
@@ -94,7 +94,7 @@ ReadingListDownloadService::~ReadingListDownloadService() = default; void ReadingListDownloadService::Initialize() { - model_observation_.Observe(reading_list_model_); + model_observation_.Observe(reading_list_model_.get()); } base::FilePath ReadingListDownloadService::OfflineRoot() const {
diff --git a/ios/chrome/browser/reading_list/model/reading_list_remover_helper.h b/ios/chrome/browser/reading_list/model/reading_list_remover_helper.h index 0ac716b..414f34e 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_remover_helper.h +++ b/ios/chrome/browser/reading_list/model/reading_list_remover_helper.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_READING_LIST_MODEL_READING_LIST_REMOVER_HELPER_H_ #include "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "base/sequence_checker.h" #include "components/reading_list/core/reading_list_model.h" @@ -43,8 +44,8 @@ void ReadlingListItemsRemoved(bool success); Callback completion_; - ReadingListModel* reading_list_model_ = nullptr; - ReadingListDownloadService* reading_list_download_service_ = nullptr; + raw_ptr<ReadingListModel> reading_list_model_ = nullptr; + raw_ptr<ReadingListDownloadService> reading_list_download_service_ = nullptr; base::ScopedObservation<ReadingListModel, ReadingListModelObserver> scoped_observation_{this};
diff --git a/ios/chrome/browser/reading_list/model/reading_list_remover_helper.mm b/ios/chrome/browser/reading_list/model/reading_list_remover_helper.mm index e05cdbdd..47afd119 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_remover_helper.mm +++ b/ios/chrome/browser/reading_list/model/reading_list_remover_helper.mm
@@ -31,7 +31,7 @@ const ReadingListModel* reading_list_model) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_EQ(reading_list_model_, reading_list_model); - DCHECK(scoped_observation_.IsObservingSource(reading_list_model_)); + DCHECK(scoped_observation_.IsObservingSource(reading_list_model_.get())); scoped_observation_.Reset(); bool model_cleared = reading_list_model_->DeleteAllEntries(); @@ -44,7 +44,7 @@ const ReadingListModel* reading_list_model) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_EQ(reading_list_model_, reading_list_model); - DCHECK(scoped_observation_.IsObservingSource(reading_list_model_)); + DCHECK(scoped_observation_.IsObservingSource(reading_list_model_.get())); scoped_observation_.Reset(); ReadlingListItemsRemoved(false); } @@ -61,7 +61,7 @@ // ReadingListModel::AddObserver calls ReadingListModelLoaded if model is // already loaded, so there is no need to check. - scoped_observation_.Observe(reading_list_model_); + scoped_observation_.Observe(reading_list_model_.get()); } void ReadingListRemoverHelper::ReadlingListItemsRemoved(bool success) {
diff --git a/ios/chrome/browser/reading_list/model/reading_list_web_state_observer.h b/ios/chrome/browser/reading_list/model/reading_list_web_state_observer.h index 6098ac7..c39cd4d 100644 --- a/ios/chrome/browser/reading_list/model/reading_list_web_state_observer.h +++ b/ios/chrome/browser/reading_list/model/reading_list_web_state_observer.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_READING_LIST_MODEL_READING_LIST_WEB_STATE_OBSERVER_H_ #define IOS_CHROME_BROWSER_READING_LIST_MODEL_READING_LIST_WEB_STATE_OBSERVER_H_ +#import "base/memory/raw_ptr.h" #include "base/timer/timer.h" #include "components/reading_list/core/reading_list_model_observer.h" #include "ios/web/public/web_state_observer.h" @@ -79,9 +80,9 @@ // The WebState this instance is observing. Will be null after // WebStateDestroyed has been called. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; - ReadingListModel* reading_list_model_; + raw_ptr<ReadingListModel> reading_list_model_; std::unique_ptr<base::RepeatingTimer> timer_; GURL pending_url_; int try_number_;
diff --git a/ios/chrome/browser/reading_list/model/url_downloader.h b/ios/chrome/browser/reading_list/model/url_downloader.h index 55c9f296..802654b 100644 --- a/ios/chrome/browser/reading_list/model/url_downloader.h +++ b/ios/chrome/browser/reading_list/model/url_downloader.h
@@ -10,6 +10,7 @@ #include "base/containers/circular_deque.h" #include "base/files/file_path.h" #include "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #include "base/task/cancelable_task_tracker.h" #include "ios/chrome/browser/dom_distiller/model/distiller_viewer.h" #include "ios/chrome/browser/reading_list/model/reading_list_distiller_page.h" @@ -178,9 +179,10 @@ // needed. SuccessState SavePDFFile(const base::FilePath& temporary_path); - reading_list::ReadingListDistillerPageFactory* distiller_page_factory_; - dom_distiller::DistillerFactory* distiller_factory_; - PrefService* pref_service_; + raw_ptr<reading_list::ReadingListDistillerPageFactory> + distiller_page_factory_; + raw_ptr<dom_distiller::DistillerFactory> distiller_factory_; + raw_ptr<PrefService> pref_service_; const DownloadCompletion download_completion_; const SuccessCompletion delete_completion_;
diff --git a/ios/chrome/browser/search_engines/model/extension_search_engine_data_updater.h b/ios/chrome/browser/search_engines/model/extension_search_engine_data_updater.h index 2cc0dea5..973af83 100644 --- a/ios/chrome/browser/search_engines/model/extension_search_engine_data_updater.h +++ b/ios/chrome/browser/search_engines/model/extension_search_engine_data_updater.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_EXTENSION_SEARCH_ENGINE_DATA_UPDATER_H_ #define IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_EXTENSION_SEARCH_ENGINE_DATA_UPDATER_H_ +#import "base/memory/raw_ptr.h" #include "components/search_engines/template_url_service_observer.h" class TemplateURLService; @@ -20,6 +21,6 @@ // TemplateURLServiceObserver void OnTemplateURLServiceChanged() override; - TemplateURLService* templateURLService_; // weak + raw_ptr<TemplateURLService> templateURLService_; // weak }; #endif // IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_EXTENSION_SEARCH_ENGINE_DATA_UPDATER_H_
diff --git a/ios/chrome/browser/search_engines/model/search_engine_java_script_feature.h b/ios/chrome/browser/search_engines/model/search_engine_java_script_feature.h index cb1dd40..e8f33786 100644 --- a/ios/chrome/browser/search_engines/model/search_engine_java_script_feature.h +++ b/ios/chrome/browser/search_engines/model/search_engine_java_script_feature.h
@@ -7,6 +7,7 @@ #include <optional> +#import "base/memory/raw_ptr.h" #include "base/no_destructor.h" #include "ios/web/public/js_messaging/java_script_feature.h" #include "url/gurl.h" @@ -50,7 +51,7 @@ void ScriptMessageReceived(web::WebState* web_state, const web::ScriptMessage& message) override; - SearchEngineJavaScriptFeatureDelegate* delegate_; + raw_ptr<SearchEngineJavaScriptFeatureDelegate> delegate_; }; #endif // IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_SEARCH_ENGINE_JAVA_SCRIPT_FEATURE_H_
diff --git a/ios/chrome/browser/search_engines/model/search_engine_js_unittest.mm b/ios/chrome/browser/search_engines/model/search_engine_js_unittest.mm index 44dea6d..c77cbcd 100644 --- a/ios/chrome/browser/search_engines/model/search_engine_js_unittest.mm +++ b/ios/chrome/browser/search_engines/model/search_engine_js_unittest.mm
@@ -3,6 +3,7 @@ // found in the LICENSE file. #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/test/ios/wait_util.h" #import "base/time/time.h" #import "ios/chrome/browser/search_engines/model/search_engine_java_script_feature.h" @@ -68,13 +69,13 @@ // Stores paramaeters passed to `SetSearchableUrl`. struct ReceivedSearchableUrl { - web::WebState* web_state; + raw_ptr<web::WebState> web_state; GURL searchable_url; }; // Stores paramaeters passed to `AddTemplateURLByOSDD`. struct ReceivedTemplateUrlByOsdd { - web::WebState* web_state; + raw_ptr<web::WebState> web_state; GURL template_page_url; GURL osdd_url; };
diff --git a/ios/chrome/browser/search_engines/model/search_engine_observer_bridge.h b/ios/chrome/browser/search_engines/model/search_engine_observer_bridge.h index 9614428..4270806 100644 --- a/ios/chrome/browser/search_engines/model/search_engine_observer_bridge.h +++ b/ios/chrome/browser/search_engines/model/search_engine_observer_bridge.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #include "components/search_engines/template_url_service.h" #include "components/search_engines/template_url_service_observer.h" @@ -30,7 +31,7 @@ private: __weak id<SearchEngineObserving> owner_; - TemplateURLService* templateURLService_; // weak + raw_ptr<TemplateURLService> templateURLService_; // weak }; #endif // IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_SEARCH_ENGINE_OBSERVER_BRIDGE_H_
diff --git a/ios/chrome/browser/search_engines/model/search_engine_tab_helper.h b/ios/chrome/browser/search_engines/model/search_engine_tab_helper.h index 6dfc7e4..6db4beef 100644 --- a/ios/chrome/browser/search_engines/model/search_engine_tab_helper.h +++ b/ios/chrome/browser/search_engines/model/search_engine_tab_helper.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_SEARCH_ENGINE_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_SEARCH_ENGINE_TAB_HELPER_H_ +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "components/favicon/ios/web_favicon_driver.h" #include "ios/web/public/web_state_observer.h" @@ -74,7 +75,7 @@ favicon_driver_observation_{this}; // WebState this tab helper is attached to. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; // The searchable URL generated from <form> submission. This ivar is an empty // GURL by default. If a web page has a searchable <form>, a searchable URL is
diff --git a/ios/chrome/browser/search_engines/model/template_url_service_client_impl.cc b/ios/chrome/browser/search_engines/model/template_url_service_client_impl.cc index 505676e8..1be8df46 100644 --- a/ios/chrome/browser/search_engines/model/template_url_service_client_impl.cc +++ b/ios/chrome/browser/search_engines/model/template_url_service_client_impl.cc
@@ -21,7 +21,7 @@ // backend can handle automatically adding the search terms as the user // navigates. if (history_service_) - history_service_observation_.Observe(history_service_); + history_service_observation_.Observe(history_service_.get()); } TemplateURLServiceClientImpl::~TemplateURLServiceClientImpl() {}
diff --git a/ios/chrome/browser/search_engines/model/template_url_service_client_impl.h b/ios/chrome/browser/search_engines/model/template_url_service_client_impl.h index ea9fe45..0f434ee 100644 --- a/ios/chrome/browser/search_engines/model/template_url_service_client_impl.h +++ b/ios/chrome/browser/search_engines/model/template_url_service_client_impl.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_TEMPLATE_URL_SERVICE_CLIENT_IMPL_H_ #define IOS_CHROME_BROWSER_SEARCH_ENGINES_MODEL_TEMPLATE_URL_SERVICE_CLIENT_IMPL_H_ +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_service_observer.h" @@ -43,8 +44,8 @@ const history::URLRow& url_row, const history::VisitRow& new_visit) override; - TemplateURLService* owner_; - history::HistoryService* history_service_; + raw_ptr<TemplateURLService> owner_; + raw_ptr<history::HistoryService> history_service_; base::ScopedObservation<history::HistoryService, history::HistoryServiceObserver> history_service_observation_{this};
diff --git a/ios/chrome/browser/share_extension/model/share_extension_item_receiver.mm b/ios/chrome/browser/share_extension/model/share_extension_item_receiver.mm index 44a0f3f..0dc9b9a94 100644 --- a/ios/chrome/browser/share_extension/model/share_extension_item_receiver.mm +++ b/ios/chrome/browser/share_extension/model/share_extension_item_receiver.mm
@@ -9,6 +9,7 @@ #import "base/apple/foundation_util.h" #import "base/functional/bind.h" #import "base/ios/block_types.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_macros.h" #import "base/metrics/user_metrics_action.h" #import "base/strings/sys_string_conversions.h" @@ -63,8 +64,8 @@ @interface ShareExtensionItemReceiver () <NSFilePresenter> { BOOL _isObservingReadingListFolder; BOOL _readingListFolderCreated; - ReadingListModel* _readingListModel; - bookmarks::BookmarkModel* _bookmarkModel; + raw_ptr<ReadingListModel> _readingListModel; + raw_ptr<bookmarks::BookmarkModel> _bookmarkModel; scoped_refptr<base::SequencedTaskRunner> _taskRunner; }
diff --git a/ios/chrome/browser/share_extension/model/share_extension_service.h b/ios/chrome/browser/share_extension/model/share_extension_service.h index 6efedae..6a3e7ff 100644 --- a/ios/chrome/browser/share_extension/model/share_extension_service.h +++ b/ios/chrome/browser/share_extension/model/share_extension_service.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SHARE_EXTENSION_MODEL_SHARE_EXTENSION_SERVICE_H_ #define IOS_CHROME_BROWSER_SHARE_EXTENSION_MODEL_SHARE_EXTENSION_SERVICE_H_ +#import "base/memory/raw_ptr.h" #include "components/bookmarks/browser/base_bookmark_model_observer.h" #include "components/keyed_service/core/keyed_service.h" #include "components/reading_list/core/reading_list_model_observer.h" @@ -48,9 +49,9 @@ // initialize the ShareExtensionItemReceiver if they are all loaded. void AnyModelLoaded(); - ReadingListModel* reading_list_model_; + raw_ptr<ReadingListModel> reading_list_model_; bool reading_list_model_loaded_; - bookmarks::BookmarkModel* bookmark_model_; + raw_ptr<bookmarks::BookmarkModel> bookmark_model_; bool bookmark_model_loaded_; __strong ShareExtensionItemReceiver* receiver_; };
diff --git a/ios/chrome/browser/shared/public/features/BUILD.gn b/ios/chrome/browser/shared/public/features/BUILD.gn index 666e76c..e598a972 100644 --- a/ios/chrome/browser/shared/public/features/BUILD.gn +++ b/ios/chrome/browser/shared/public/features/BUILD.gn
@@ -31,6 +31,7 @@ "//components/variations", "//ios/chrome/browser/browsing_data/model:feature_flags", "//ios/chrome/browser/flags:system_flags", + "//ios/chrome/browser/memory/model:features", "//ios/chrome/browser/safety_check/model:constants", "//ios/chrome/browser/shared/public/features", ]
diff --git a/ios/chrome/browser/shared/public/features/system_flags.mm b/ios/chrome/browser/shared/public/features/system_flags.mm index f27e712..17d820f3 100644 --- a/ios/chrome/browser/shared/public/features/system_flags.mm +++ b/ios/chrome/browser/shared/public/features/system_flags.mm
@@ -13,12 +13,12 @@ #import "base/feature_list.h" #import "base/metrics/field_trial.h" #import "base/strings/sys_string_conversions.h" -#import "build/branding_buildflags.h" #import "components/autofill/core/common/autofill_switches.h" #import "components/password_manager/core/common/password_manager_features.h" #import "components/variations/variations_associated_data.h" #import "ios/chrome/browser/browsing_data/model/browsing_data_features.h" #import "ios/chrome/browser/flags/chrome_switches.h" +#import "ios/chrome/browser/memory/model/features.h" #import "ios/chrome/browser/safety_check/model/ios_chrome_safety_check_manager_constants.h" #import "ios/chrome/browser/shared/public/features/features.h" @@ -116,14 +116,12 @@ } bool IsMemoryDebuggingEnabled() { -// Always return true for Chromium builds, but check the user default for -// official builds because memory debugging should never be enabled on stable. -#if BUILDFLAG(CHROMIUM_BRANDING) +#if BUILDFLAG(IOS_ENABLE_MEMORY_DEBUGGING) return true; #else return [[NSUserDefaults standardUserDefaults] boolForKey:@"EnableMemoryDebugging"]; -#endif // BUILDFLAG(CHROMIUM_BRANDING) +#endif } bool IsOmniboxDebuggingEnabled() {
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.h b/ios/chrome/browser/shared/ui/symbols/symbol_names.h index b0f216090..0123b9b 100644 --- a/ios/chrome/browser/shared/ui/symbols/symbol_names.h +++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
@@ -203,6 +203,7 @@ extern NSString* const kNewTabGroupActionSymbol; extern NSString* const kRemoveTabFromGroupActionSymbol; extern NSString* const kMoveTabToGroupActionSymbol; +extern NSString* const kClockSymbol; // Names of the default symbol being non-monochrome by default. When using them, // you probably want to set their color to monochrome.
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm index fe523eb..491f471b3 100644 --- a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm +++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
@@ -197,6 +197,7 @@ NSString* const kNewTabGroupActionSymbol = @"plus.square.on.square"; NSString* const kRemoveTabFromGroupActionSymbol = @"minus.square"; NSString* const kMoveTabToGroupActionSymbol = @"arrow.up.right.square"; +NSString* const kClockSymbol = @"clock"; // Names of the default symbol being non-monochrome by default. When using them, // you probably want to set their color to monochrome.
diff --git a/ios/chrome/browser/sharing/model/share_file_download_tab_helper.h b/ios/chrome/browser/sharing/model/share_file_download_tab_helper.h index 7aa1c4a..240bd7e 100644 --- a/ios/chrome/browser/sharing/model/share_file_download_tab_helper.h +++ b/ios/chrome/browser/sharing/model/share_file_download_tab_helper.h
@@ -7,6 +7,7 @@ #include <string> +#import "base/memory/raw_ptr.h" #include "ios/web/public/web_state_observer.h" #import "ios/web/public/web_state_user_data.h" @@ -109,7 +110,7 @@ // The WebState this instance is observing. Will be null after // WebStateDestroyed has been called. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; // Headers of the last response received for the current navigation. scoped_refptr<net::HttpResponseHeaders> response_headers_;
diff --git a/ios/chrome/browser/signin/model/account_capabilities_fetcher_ios_unittest.mm b/ios/chrome/browser/signin/model/account_capabilities_fetcher_ios_unittest.mm index f518c21..6651b646 100644 --- a/ios/chrome/browser/signin/model/account_capabilities_fetcher_ios_unittest.mm +++ b/ios/chrome/browser/signin/model/account_capabilities_fetcher_ios_unittest.mm
@@ -7,6 +7,7 @@ #import <optional> #import "base/functional/callback.h" +#import "base/memory/raw_ptr.h" #import "base/run_loop.h" #import "base/strings/sys_string_conversions.h" #import "base/test/task_environment.h" @@ -96,7 +97,7 @@ base::test::TaskEnvironment task_environment_; signin::IdentityTestEnvironment identity_test_environment_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; - ChromeAccountManagerService* account_manager_service_; + raw_ptr<ChromeAccountManagerService> account_manager_service_; }; // Check that a capability set to True is received as True.
diff --git a/ios/chrome/browser/signin/model/account_consistency_browser_agent.h b/ios/chrome/browser/signin/model/account_consistency_browser_agent.h index d0797eb3..f7816987 100644 --- a/ios/chrome/browser/signin/model/account_consistency_browser_agent.h +++ b/ios/chrome/browser/signin/model/account_consistency_browser_agent.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SIGNIN_MODEL_ACCOUNT_CONSISTENCY_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_SIGNIN_MODEL_ACCOUNT_CONSISTENCY_BROWSER_AGENT_H_ +#import "base/memory/raw_ptr.h" #import "components/signin/ios/browser/manage_accounts_delegate.h" #import "ios/chrome/browser/shared/model/browser/browser_observer.h" #import "ios/chrome/browser/shared/model/browser/browser_user_data.h" @@ -60,7 +61,7 @@ UIViewController* base_view_controller_; id<ApplicationCommands> application_handler_; id<ApplicationSettingsCommands> settings_handler_; - Browser* browser_; + raw_ptr<Browser> browser_; // Bridge object to act as the delegate. ManageAccountsDelegateBridge* bridge_;
diff --git a/ios/chrome/browser/signin/model/account_consistency_browser_agent_unittest.mm b/ios/chrome/browser/signin/model/account_consistency_browser_agent_unittest.mm index 3fae7b15..1c1bf9d 100644 --- a/ios/chrome/browser/signin/model/account_consistency_browser_agent_unittest.mm +++ b/ios/chrome/browser/signin/model/account_consistency_browser_agent_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/signin/model/account_consistency_browser_agent.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/lens/model/lens_browser_agent.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" @@ -61,7 +62,7 @@ web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; std::unique_ptr<Browser> browser_; - AccountConsistencyBrowserAgent* agent_; + raw_ptr<AccountConsistencyBrowserAgent> agent_; id<ApplicationCommands> application_commands_mock_; id<ApplicationSettingsCommands> settings_commands_mock_; UIViewController* base_view_controller_mock_;
diff --git a/ios/chrome/browser/signin/model/authentication_service.h b/ios/chrome/browser/signin/model/authentication_service.h index 40a8500f..966f97ea 100644 --- a/ios/chrome/browser/signin/model/authentication_service.h +++ b/ios/chrome/browser/signin/model/authentication_service.h
@@ -9,6 +9,7 @@ #include <vector> #import "base/ios/block_types.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "components/keyed_service/core/keyed_service.h" @@ -226,11 +227,11 @@ std::unique_ptr<AuthenticationServiceDelegate> delegate_; // Pointer to the KeyedServices used by AuthenticationService. - PrefService* pref_service_ = nullptr; - SyncSetupService* sync_setup_service_ = nullptr; - ChromeAccountManagerService* account_manager_service_ = nullptr; - signin::IdentityManager* identity_manager_ = nullptr; - syncer::SyncService* sync_service_ = nullptr; + raw_ptr<PrefService> pref_service_ = nullptr; + raw_ptr<SyncSetupService> sync_setup_service_ = nullptr; + raw_ptr<ChromeAccountManagerService> account_manager_service_ = nullptr; + raw_ptr<signin::IdentityManager> identity_manager_ = nullptr; + raw_ptr<syncer::SyncService> sync_service_ = nullptr; base::ObserverList<AuthenticationServiceObserver, true> observer_list_; // Whether Initialized has been called. bool initialized_ = false;
diff --git a/ios/chrome/browser/signin/model/authentication_service.mm b/ios/chrome/browser/signin/model/authentication_service.mm index 78e50eb..bd6ce23 100644 --- a/ios/chrome/browser/signin/model/authentication_service.mm +++ b/ios/chrome/browser/signin/model/authentication_service.mm
@@ -106,7 +106,7 @@ signin::Tribool device_restore_session = IsFirstSessionAfterDeviceRestore(); initialized_ = true; - identity_manager_observation_.Observe(identity_manager_); + identity_manager_observation_.Observe(identity_manager_.get()); HandleForgottenIdentity(nil, /*should_prompt=*/true, device_restore_session == signin::Tribool::kTrue); @@ -117,7 +117,7 @@ crash_keys::SetCurrentlySignedIn( HasPrimaryIdentity(signin::ConsentLevel::kSignin)); - account_manager_service_observation_.Observe(account_manager_service_); + account_manager_service_observation_.Observe(account_manager_service_.get()); // Register for prefs::kSigninAllowed. pref_change_registrar_.Init(pref_service_);
diff --git a/ios/chrome/browser/signin/model/authentication_service_observer_bridge_unittest.mm b/ios/chrome/browser/signin/model/authentication_service_observer_bridge_unittest.mm index f13f1a4..ac848a8 100644 --- a/ios/chrome/browser/signin/model/authentication_service_observer_bridge_unittest.mm +++ b/ios/chrome/browser/signin/model/authentication_service_observer_bridge_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/signin/model/authentication_service_observer_bridge.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/signin/model/authentication_service_factory.h" #import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h" @@ -35,7 +36,7 @@ web::WebTaskEnvironment task_environment_; IOSChromeScopedTestingLocalState scoped_testing_local_state_; std::unique_ptr<TestChromeBrowserState> browser_state_; - AuthenticationService* auth_service_ = nullptr; + raw_ptr<AuthenticationService> auth_service_ = nullptr; }; // Tests that `OnServiceStatusChanged` is forwarded from the service.
diff --git a/ios/chrome/browser/signin/model/authentication_service_unittest.mm b/ios/chrome/browser/signin/model/authentication_service_unittest.mm index 609160d1..091ac1f 100644 --- a/ios/chrome/browser/signin/model/authentication_service_unittest.mm +++ b/ios/chrome/browser/signin/model/authentication_service_unittest.mm
@@ -6,6 +6,7 @@ #import "base/functional/bind.h" #import "base/functional/callback_helpers.h" +#import "base/memory/raw_ptr.h" #import "base/run_loop.h" #import "base/strings/sys_string_conversions.h" #import "base/test/bind.h" @@ -242,7 +243,7 @@ } IOSChromeScopedTestingLocalState local_state_; - ChromeAccountManagerService* account_manager_; + raw_ptr<ChromeAccountManagerService> account_manager_; web::WebTaskEnvironment task_environment_{ web::WebTaskEnvironment::Options::DEFAULT, base::test::TaskEnvironment::TimeSource::MOCK_TIME};
diff --git a/ios/chrome/browser/signin/model/chrome_account_manager_service.h b/ios/chrome/browser/signin/model/chrome_account_manager_service.h index 5ebc3997..a9c07f16 100644 --- a/ios/chrome/browser/signin/model/chrome_account_manager_service.h +++ b/ios/chrome/browser/signin/model/chrome_account_manager_service.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "base/memory/raw_ptr.h" #include "base/observer_list.h" #include "base/scoped_observation.h" #include "base/strings/string_piece.h" @@ -126,7 +127,7 @@ IdentityAvatarSize avatar_size); // Used to retrieve restricted patterns. - PrefService* pref_service_ = nullptr; + raw_ptr<PrefService> pref_service_ = nullptr; // Used to filter ChromeIdentities. PatternAccountRestriction restriction_; // Used to listen pref change.
diff --git a/ios/chrome/browser/signin/model/chrome_account_manager_service.mm b/ios/chrome/browser/signin/model/chrome_account_manager_service.mm index 0d7af13..eaea4e02b 100644 --- a/ios/chrome/browser/signin/model/chrome_account_manager_service.mm +++ b/ios/chrome/browser/signin/model/chrome_account_manager_service.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h" #import "base/check.h" +#import "base/memory/raw_ref.h" #import "base/strings/sys_string_conversions.h" #import "components/prefs/pref_service.h" #import "components/signin/public/base/signin_pref_names.h" @@ -26,12 +27,12 @@ : restriction_(restriction) {} bool ShouldFilter(id<SystemIdentity> identity) const { - return restriction_.IsAccountRestricted( + return restriction_->IsAccountRestricted( base::SysNSStringToUTF8(identity.userEmail)); } private: - const PatternAccountRestriction& restriction_; + const raw_ref<const PatternAccountRestriction> restriction_; }; // Filter class skipping unrestricted account. @@ -41,12 +42,12 @@ : restriction_(restriction) {} bool ShouldFilter(id<SystemIdentity> identity) const { - return !restriction_.IsAccountRestricted( + return !restriction_->IsAccountRestricted( base::SysNSStringToUTF8(identity.userEmail)); } private: - const PatternAccountRestriction& restriction_; + const raw_ref<const PatternAccountRestriction> restriction_; }; // Filter class skipping identities that do not have the given Gaia ID.
diff --git a/ios/chrome/browser/signin/model/chrome_account_manager_service_unittest.mm b/ios/chrome/browser/signin/model/chrome_account_manager_service_unittest.mm index 9bbde29..7ffd155 100644 --- a/ios/chrome/browser/signin/model/chrome_account_manager_service_unittest.mm +++ b/ios/chrome/browser/signin/model/chrome_account_manager_service_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h" +#import "base/memory/raw_ptr.h" #import "components/signin/public/base/signin_pref_names.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" @@ -68,7 +69,7 @@ IOSChromeScopedTestingLocalState local_state_; base::test::TaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; - ChromeAccountManagerService* account_manager_; + raw_ptr<ChromeAccountManagerService> account_manager_; }; // Tests to get identities when the restricted pattern is not set.
diff --git a/ios/chrome/browser/signin/model/device_accounts_provider_impl.h b/ios/chrome/browser/signin/model/device_accounts_provider_impl.h index 42a2071..eddfb4c0 100644 --- a/ios/chrome/browser/signin/model/device_accounts_provider_impl.h +++ b/ios/chrome/browser/signin/model/device_accounts_provider_impl.h
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#import "base/memory/raw_ptr.h" #include "components/signin/public/identity_manager/ios/device_accounts_provider.h" class ChromeAccountManagerService; @@ -33,7 +34,7 @@ std::vector<AccountInfo> GetAllAccounts() const override; private: - ChromeAccountManagerService* account_manager_service_ = nullptr; + raw_ptr<ChromeAccountManagerService> account_manager_service_ = nullptr; }; #endif // IOS_CHROME_BROWSER_SIGNIN_MODEL_DEVICE_ACCOUNTS_PROVIDER_IMPL_H_
diff --git a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios.h b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios.h index f429ad97..fe2fff3 100644 --- a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios.h +++ b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#import "base/memory/raw_ptr.h" #include "google_apis/gaia/gaia_auth_fetcher.h" #include "ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_bridge.h" #include "net/base/net_errors.h" @@ -62,7 +63,7 @@ net::Error net_error, int response_code) override; - web::BrowserState* browser_state_; + raw_ptr<web::BrowserState> browser_state_; std::unique_ptr<GaiaAuthFetcherIOSBridge> bridge_; };
diff --git a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_bridge.h b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_bridge.h index 7852ba0..cc668c6c 100644 --- a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_bridge.h +++ b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_bridge.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#import "base/memory/raw_ptr.h" #include "google_apis/gaia/gaia_auth_fetcher.h" #include "net/base/net_errors.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -70,7 +71,7 @@ GaiaAuthFetcherIOSBridgeDelegate* delegate() { return delegate_; } private: - GaiaAuthFetcherIOSBridgeDelegate* delegate_; + raw_ptr<GaiaAuthFetcherIOSBridgeDelegate> delegate_; }; #endif // IOS_CHROME_BROWSER_SIGNIN_MODEL_GAIA_AUTH_FETCHER_IOS_BRIDGE_H_
diff --git a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge.h b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge.h index a2807bd..0a87a95 100644 --- a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge.h +++ b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge.h
@@ -10,6 +10,7 @@ #include <string> #include <vector> +#import "base/memory/raw_ptr.h" #include "ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_bridge.h" #include "net/cookies/canonical_cookie.h" @@ -106,7 +107,7 @@ id<NSURLSessionTaskDelegate> url_session_delegate); // Browser state associated with the bridge. - web::BrowserState* browser_state_; + raw_ptr<web::BrowserState> browser_state_; // Request currently processed by the bridge. Request request_;
diff --git a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge_unittests.mm b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge_unittests.mm index c2cb64c6..a8af569 100644 --- a/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge_unittests.mm +++ b/ios/chrome/browser/signin/model/gaia_auth_fetcher_ios_ns_url_session_bridge_unittests.mm
@@ -9,6 +9,7 @@ #import "base/functional/bind.h" #import "base/functional/callback_helpers.h" #import "base/ios/ios_util.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/bind.h" #import "base/test/ios/wait_util.h" @@ -115,7 +116,7 @@ id<NSURLSessionTaskDelegate> url_session_delegate) override; protected: - GaiaAuthFetcherIOSNSURLSessionBridgeTest* test_; + raw_ptr<GaiaAuthFetcherIOSNSURLSessionBridgeTest> test_; }; } // namespace
diff --git a/ios/chrome/browser/signin/model/ios_chrome_signin_client.h b/ios/chrome/browser/signin/model/ios_chrome_signin_client.h index 4a72eb5..67ac9526 100644 --- a/ios/chrome/browser/signin/model/ios_chrome_signin_client.h +++ b/ios/chrome/browser/signin/model/ios_chrome_signin_client.h
@@ -7,6 +7,7 @@ #include <memory> +#import "base/memory/raw_ptr.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/signin/public/base/signin_client.h" @@ -61,7 +62,7 @@ // Helper to delay callbacks until connection becomes online again. std::unique_ptr<WaitForNetworkCallbackHelperIOS> network_callback_helper_; // The browser state associated with this service. - ChromeBrowserState* browser_state_; + raw_ptr<ChromeBrowserState> browser_state_; // Used to check if sign in cookies are allowed. scoped_refptr<content_settings::CookieSettings> cookie_settings_; // Used to add and remove content settings observers.
diff --git a/ios/chrome/browser/signin/model/signin_browser_state_info_updater.h b/ios/chrome/browser/signin/model/signin_browser_state_info_updater.h index 23dd261..517232a 100644 --- a/ios/chrome/browser/signin/model/signin_browser_state_info_updater.h +++ b/ios/chrome/browser/signin/model/signin_browser_state_info_updater.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_SIGNIN_MODEL_SIGNIN_BROWSER_STATE_INFO_UPDATER_H_ #include "base/files/file_path.h" +#import "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "build/build_config.h" #include "components/keyed_service/core/keyed_service.h" @@ -42,8 +43,8 @@ void OnPrimaryAccountChanged( const signin::PrimaryAccountChangeEvent& event) override; - signin::IdentityManager* identity_manager_ = nullptr; - SigninErrorController* signin_error_controller_ = nullptr; + raw_ptr<signin::IdentityManager> identity_manager_ = nullptr; + raw_ptr<SigninErrorController> signin_error_controller_ = nullptr; const base::FilePath browser_state_path_; base::ScopedObservation<signin::IdentityManager, signin::IdentityManager::Observer>
diff --git a/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm b/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm index 57e7d25..3e451fe 100644 --- a/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm +++ b/ios/chrome/browser/signin/model/signin_browser_state_info_updater.mm
@@ -23,7 +23,7 @@ if (!GetApplicationContext()->GetChromeBrowserStateManager()) return; - identity_manager_observation_.Observe(identity_manager_); + identity_manager_observation_.Observe(identity_manager_.get()); signin_error_controller_observation_.Observe(signin_error_controller);
diff --git a/ios/chrome/browser/sync/model/device_info_sync_service_factory.mm b/ios/chrome/browser/sync/model/device_info_sync_service_factory.mm index ddbea8e..8d04245 100644 --- a/ios/chrome/browser/sync/model/device_info_sync_service_factory.mm +++ b/ios/chrome/browser/sync/model/device_info_sync_service_factory.mm
@@ -7,6 +7,7 @@ #import <utility> #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/memory/singleton.h" #import "base/time/default_clock.h" #import "components/keyed_service/core/service_access_type.h" @@ -88,8 +89,8 @@ bool IsUmaEnabledOnCrOSDevice() const override { return false; } private: - PrefService* const prefs_; - syncer::SyncInvalidationsService* const sync_invalidations_service_; + const raw_ptr<PrefService> prefs_; + const raw_ptr<syncer::SyncInvalidationsService> sync_invalidations_service_; }; } // namespace
diff --git a/ios/chrome/browser/sync/model/ios_chrome_sync_client.h b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h index 0626047c0..3d81590 100644 --- a/ios/chrome/browser/sync/model/ios_chrome_sync_client.h +++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/files/file_path.h" +#import "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "components/browser_sync/browser_sync_client.h" @@ -72,7 +73,7 @@ void TriggerLocalDataMigration(syncer::ModelTypeSet types) override; private: - ChromeBrowserState* const browser_state_; + const raw_ptr<ChromeBrowserState> browser_state_; // The sync api component factory in use by this client. std::unique_ptr<browser_sync::SyncApiComponentFactoryImpl> component_factory_;
diff --git a/ios/chrome/browser/sync/model/sync_error_browser_agent.h b/ios/chrome/browser/sync/model/sync_error_browser_agent.h index 26607ac..51a5e7c 100644 --- a/ios/chrome/browser/sync/model/sync_error_browser_agent.h +++ b/ios/chrome/browser/sync/model/sync_error_browser_agent.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_ERROR_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_SYNC_MODEL_SYNC_ERROR_BROWSER_AGENT_H_ +#import "base/memory/raw_ptr.h" #import "base/scoped_multi_source_observation.h" #import "ios/chrome/browser/shared/model/browser/browser_observer.h" #import "ios/chrome/browser/shared/model/browser/browser_user_data.h" @@ -58,7 +59,7 @@ // Returns the state of the Browser ChromeBrowserState* GetBrowserState(); - Browser* browser_ = nullptr; + raw_ptr<Browser> browser_ = nullptr; // To observe unrealized WebStates. base::ScopedMultiSourceObservation<web::WebState, web::WebStateObserver>
diff --git a/ios/chrome/browser/sync/model/sync_setup_service.h b/ios/chrome/browser/sync/model/sync_setup_service.h index 8f9851db..27d0a80d 100644 --- a/ios/chrome/browser/sync/model/sync_setup_service.h +++ b/ios/chrome/browser/sync/model/sync_setup_service.h
@@ -7,6 +7,7 @@ #include <memory> +#import "base/memory/raw_ptr.h" #include "components/keyed_service/core/keyed_service.h" #include "components/sync/base/model_type.h" #include "components/sync/base/user_selectable_type.h" @@ -51,7 +52,7 @@ bool HasUncommittedChanges(); private: - syncer::SyncService* const sync_service_; + const raw_ptr<syncer::SyncService> sync_service_; // Prevents Sync from running until configuration is complete. std::unique_ptr<syncer::SyncSetupInProgressHandle> sync_blocker_;
diff --git a/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h b/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h index 56bbabe..6e506ab 100644 --- a/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h +++ b/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h
@@ -28,7 +28,7 @@ ~Params(); // The opener web state of the inserted tab. - web::WebState* parent = nullptr; + raw_ptr<web::WebState> parent = nullptr; // Whether the page is opened by DOM. bool opened_by_dom = false;
diff --git a/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent_unittest.mm b/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent_unittest.mm index 0270b38..2cffef9 100644 --- a/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent_unittest.mm +++ b/ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/tab_insertion/model/tab_insertion_browser_agent.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/sessions/session_restoration_service.h" #import "ios/chrome/browser/sessions/session_restoration_service_factory.h" #import "ios/chrome/browser/shared/model/browser/browser.h" @@ -63,7 +64,7 @@ web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<TestBrowser> browser_; - TabInsertionBrowserAgent* agent_; + raw_ptr<TabInsertionBrowserAgent> agent_; }; TEST_F(TabInsertionBrowserAgentTest, InsertUrlSingle) {
diff --git a/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h index 4f2c220..57b63ecc 100644 --- a/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h +++ b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_CLIENT_H_ #define IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_CLIENT_H_ -#include "base/memory/raw_ptr.h" +#import "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "components/trusted_vault/trusted_vault_client.h"
diff --git a/ios/chrome/browser/ui/authentication/account_capabilities_latency_tracker.h b/ios/chrome/browser/ui/authentication/account_capabilities_latency_tracker.h index bbfb23ec..d74c601a 100644 --- a/ios/chrome/browser/ui/authentication/account_capabilities_latency_tracker.h +++ b/ios/chrome/browser/ui/authentication/account_capabilities_latency_tracker.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_ACCOUNT_CAPABILITIES_LATENCY_TRACKER_H_ #define IOS_CHROME_BROWSER_UI_AUTHENTICATION_ACCOUNT_CAPABILITIES_LATENCY_TRACKER_H_ +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/timer/elapsed_timer.h" #import "components/signin/public/identity_manager/identity_manager.h" @@ -36,7 +37,7 @@ private: bool HasCapability() const; - IdentityManager* identity_manager_; + raw_ptr<IdentityManager> identity_manager_; base::ElapsedTimer timer_; bool capabilities_already_fetched_{false}; };
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow.mm b/ios/chrome/browser/ui/authentication/authentication_flow.mm index ae7c703..c0863a23 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow.mm
@@ -7,6 +7,7 @@ #import "base/check_op.h" #import "base/feature_list.cc" #import "base/ios/block_types.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" @@ -121,7 +122,7 @@ // YES if user is opted into bookmark and reading list account storage. BOOL _shouldShowSigninSnackbar; - Browser* _browser; + raw_ptr<Browser> _browser; id<SystemIdentity> _identityToSignIn; signin_metrics::AccessPoint _accessPoint; NSString* _identityToSignInHostedDomain;
diff --git a/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_coordinator.mm b/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_coordinator.mm index c409435d..13781cae 100644 --- a/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_coordinator.mm
@@ -49,20 +49,15 @@ initWithpromptType:self.promptType]; self.viewController.presentationController.delegate = self; self.viewController.actionHandler = self; - - if (@available(iOS 15, *)) { - self.viewController.modalPresentationStyle = UIModalPresentationPageSheet; - UISheetPresentationController* presentationController = - self.viewController.sheetPresentationController; - presentationController.prefersEdgeAttachedInCompactHeight = YES; - presentationController.detents = @[ - UISheetPresentationControllerDetent.mediumDetent, - UISheetPresentationControllerDetent.largeDetent - ]; - presentationController.preferredCornerRadius = kHalfSheetCornerRadius; - } else { - self.viewController.modalPresentationStyle = UIModalPresentationFormSheet; - } + self.viewController.modalPresentationStyle = UIModalPresentationPageSheet; + UISheetPresentationController* presentationController = + self.viewController.sheetPresentationController; + presentationController.prefersEdgeAttachedInCompactHeight = YES; + presentationController.detents = @[ + UISheetPresentationControllerDetent.mediumDetent, + UISheetPresentationControllerDetent.largeDetent + ]; + presentationController.preferredCornerRadius = kHalfSheetCornerRadius; [self.baseViewController presentViewController:self.viewController animated:YES
diff --git a/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_view_controller.mm b/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_view_controller.mm index 52aaf0a..0aa147c 100644 --- a/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/enterprise/enterprise_prompt/enterprise_prompt_view_controller.mm
@@ -54,13 +54,11 @@ break; } - if (@available(iOS 15, *)) { - self.titleTextStyle = UIFontTextStyleTitle2; - // Icon already contains some spacing for the shadow. - self.customSpacingBeforeImageIfNoNavigationBar = 24; - self.customSpacingAfterImage = 1; - self.topAlignedLayout = YES; - } + self.titleTextStyle = UIFontTextStyleTitle2; + // Icon already contains some spacing for the shadow. + self.customSpacingBeforeImageIfNoNavigationBar = 24; + self.customSpacingAfterImage = 1; + self.topAlignedLayout = YES; [super loadView]; }
diff --git a/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h b/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h index 0948c731..d8adf241 100644 --- a/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h +++ b/ios/chrome/browser/ui/authentication/re_signin_infobar_delegate.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#import "base/memory/raw_ptr.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/infobars/core/infobar.h" #include "ui/gfx/image/image.h" @@ -65,7 +66,7 @@ void InfoBarDismissed() override; private: - ChromeBrowserState* browser_state_; + raw_ptr<ChromeBrowserState> browser_state_; gfx::Image icon_; id<SigninPresenter> presenter_; };
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm index 68ed771b..6b865ab 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm
@@ -6,6 +6,7 @@ #import <UIKit/UIKit.h> +#import "base/memory/raw_ptr.h" #import "base/test/task_environment.h" #import "components/prefs/pref_registry_simple.h" #import "components/prefs/testing_pref_service.h" @@ -107,7 +108,7 @@ AdvancedSettingsSigninMediator* mediator_ = nil; - AuthenticationService* authentication_service_ = nullptr; + raw_ptr<AuthenticationService> authentication_service_ = nullptr; }; // Tests that a user's authentication does not change when sign-in is
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm index 3363dbc..ed0836c 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h" #import "ios/chrome/browser/signin/model/chrome_account_manager_service_observer_bridge.h" #import "ios/chrome/browser/signin/model/system_identity.h" @@ -12,7 +13,7 @@ @interface ConsistencyAccountChooserMediator () < ChromeAccountManagerServiceObserver> { - ChromeAccountManagerService* _accountManagerService; + raw_ptr<ChromeAccountManagerService> _accountManagerService; std::unique_ptr<ChromeAccountManagerServiceObserverBridge> _accountManagerServiceObserver; }
diff --git a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm index 651342a..ad4b50f 100644 --- a/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
@@ -8,6 +8,7 @@ #import "base/check.h" #import "base/feature_list.h" +#import "base/memory/raw_ptr.h" #import "components/signin/public/base/signin_metrics.h" #import "components/strings/grit/components_strings.h" #import "components/sync/base/features.h" @@ -159,7 +160,7 @@ std::unique_ptr<ChromeAccountManagerServiceObserverBridge> _accountManagerServiceObserver; signin_metrics::AccessPoint _accessPoint; - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; } @property(nonatomic, strong) UIImage* avatar;
diff --git a/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_mediator.mm b/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_mediator.mm index 0cc1122..fedaa58 100644 --- a/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_mediator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/authentication/signin/instant_signin/instant_signin_mediator.h" +#import "base/memory/raw_ptr.h" #import "components/sync/base/features.h" #import "components/sync/service/sync_service.h" #import "components/sync/service/sync_user_settings.h" @@ -17,7 +18,7 @@ using signin_metrics::PromoAction; @implementation InstantSigninMediator { - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; AuthenticationFlow* _authenticationFlow; AccessPoint _accessPoint; // YES if the sign-in is interrupted.
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm b/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm index 54ff4ef..5c86f01 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_utils_unittest.mm
@@ -9,6 +9,7 @@ #import <memory> #import "base/functional/callback_helpers.h" +#import "base/memory/raw_ptr.h" #import "base/test/scoped_feature_list.h" #import "base/version.h" #import "components/pref_registry/pref_registry_syncable.h" @@ -93,7 +94,7 @@ web::WebTaskEnvironment task_environment_; IOSChromeScopedTestingLocalState scoped_testing_local_state_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; - ChromeAccountManagerService* account_manager_service_; + raw_ptr<ChromeAccountManagerService> account_manager_service_; }; // Should show the sign-in upgrade for the first time, after FRE.
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm index cf2ead7..465e1cf 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
@@ -8,6 +8,7 @@ #import "base/feature_list.h" #import "base/functional/callback_helpers.h" +#import "base/memory/raw_ptr.h" #import "base/run_loop.h" #import "base/strings/sys_string_conversions.h" #import "components/consent_auditor/fake_consent_auditor.h" @@ -281,7 +282,7 @@ AuthenticationFlow* authentication_flow_ = nullptr; std::unique_ptr<Browser> browser_; std::unique_ptr<TestChromeBrowserState> browser_state_; - consent_auditor::FakeConsentAuditor* fake_consent_auditor_ = nullptr; + raw_ptr<consent_auditor::FakeConsentAuditor> fake_consent_auditor_ = nullptr; const std::vector<int> consent_string_ids_; UserSigninMediator* mediator_ = nil; @@ -289,8 +290,8 @@ id<UserSigninMediatorDelegate> mediator_delegate_mock_ = nil; AuthenticationFlowPerformer* performer_mock_ = nil; UIViewController* presenting_view_controller_mock_ = nil; - SyncSetupServiceMock* sync_setup_service_mock_ = nullptr; - syncer::MockSyncService* sync_service_mock_ = nullptr; + raw_ptr<SyncSetupServiceMock> sync_setup_service_mock_ = nullptr; + raw_ptr<syncer::MockSyncService> sync_service_mock_ = nullptr; ProceduralBlock interrupted_completion_block_ = nil; };
diff --git a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm index a1544c5..dad3052 100644 --- a/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin_promo_view_mediator.mm
@@ -7,6 +7,7 @@ #import <memory> #import "base/feature_list.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/metrics/histogram_macros.h" #import "base/metrics/user_metrics.h" @@ -608,7 +609,7 @@ std::unique_ptr<ChromeAccountManagerServiceObserverBridge> _accountManagerServiceObserver; // Sync service. - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; // Observer for changes to the sync state. std::unique_ptr<SyncObserverBridge> _syncObserverBridge; }
diff --git a/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm b/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm index 095afe2..9b8f5153 100644 --- a/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> #import "base/apple/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/mock_callback.h" @@ -116,7 +117,7 @@ id<SystemIdentity> identity_ = nil; id<SystemIdentity> managed_identity_ = nil; - syncer::MockSyncService* sync_service_mock_ = nullptr; + raw_ptr<syncer::MockSyncService> sync_service_mock_ = nullptr; }; // Tests that a signed-in user with Sync enabled will have an action sheet with
diff --git a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm index 1528ae0..2440ddc 100644 --- a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm +++ b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_mediator.h" #import "base/check_op.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/consent_auditor/consent_auditor.h" #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" @@ -25,25 +26,25 @@ @end @implementation TangibleSyncMediator { - AuthenticationService* _authenticationService; - ChromeAccountManagerService* _accountManagerService; + raw_ptr<AuthenticationService> _authenticationService; + raw_ptr<ChromeAccountManagerService> _accountManagerService; std::unique_ptr<ChromeAccountManagerServiceObserverBridge> _accountManagerServiceObserver; // Auditor for user consent. - consent_auditor::ConsentAuditor* _consentAuditor; + raw_ptr<consent_auditor::ConsentAuditor> _consentAuditor; // Manager for user's Google identities. - signin::IdentityManager* _identityManager; + raw_ptr<signin::IdentityManager> _identityManager; // Observer for `IdentityManager`. std::unique_ptr<signin::IdentityManagerObserverBridge> _identityManagerObserver; // Manager for the authentication flow. AuthenticationFlow* _authenticationFlow; // Sync service. - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; // Service that allows for configuring sync. - SyncSetupService* _syncSetupService; + raw_ptr<SyncSetupService> _syncSetupService; // Manager for user consent. - unified_consent::UnifiedConsentService* _unifiedConsentService; + raw_ptr<unified_consent::UnifiedConsentService> _unifiedConsentService; // Sync opt-in access point. signin_metrics::AccessPoint _accessPoint; // Records the latency of capabilities fetch for this view.
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm index ba8fc24..ab1df2b 100644 --- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
@@ -7,6 +7,7 @@ #import "base/apple/foundation_util.h" #import "base/ios/block_types.h" #import "base/ios/ios_util.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/personal_data_manager.h" @@ -129,10 +130,10 @@ @implementation FormInputAccessoryMediator { // The WebStateList this instance is observing in order to update the // active WebState. - WebStateList* _webStateList; + raw_ptr<WebStateList> _webStateList; // Personal data manager to be observed. - autofill::PersonalDataManager* _personalDataManager; + raw_ptr<autofill::PersonalDataManager> _personalDataManager; // C++ to ObjC bridge for PersonalDataManagerObserver. std::unique_ptr<autofill::PersonalDataManagerObserverBridge>
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/address_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/address_coordinator.mm index 781d4d1..4958d87 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/address_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/address_coordinator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/autofill/manual_fill/address_coordinator.h" +#import "base/memory/raw_ptr.h" #import "base/memory/ref_counted.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/data_model/autofill_profile.h" @@ -24,7 +25,7 @@ @interface AddressCoordinator () <AddressListDelegate, PersonalDataManagerObserver> { // Personal data manager to be observed. - autofill::PersonalDataManager* _personalDataManager; + raw_ptr<autofill::PersonalDataManager> _personalDataManager; // C++ to ObjC bridge for PersonalDataManagerObserver. std::unique_ptr<autofill::PersonalDataManagerObserverBridge>
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.mm index 7dd212d..de8e581 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.h" +#import "base/memory/raw_ptr.h" #import "base/memory/ref_counted.h" #import "components/autofill/core/browser/data_model/credit_card.h" #import "components/autofill/core/browser/personal_data_manager.h" @@ -26,7 +27,7 @@ @interface CardCoordinator () <CardListDelegate, PersonalDataManagerObserver> { // Personal data manager to be observed. - autofill::PersonalDataManager* _personalDataManager; + raw_ptr<autofill::PersonalDataManager> _personalDataManager; // C++ to ObjC bridge for PersonalDataManagerObserver. std::unique_ptr<autofill::PersonalDataManagerObserverBridge>
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_mediator.h b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_mediator.h index ff74b90..14b5cf6 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_mediator.h +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_mediator.h
@@ -9,7 +9,7 @@ #include <memory> #include <vector> -#include "base/memory/raw_ptr.h" +#import "base/memory/raw_ptr.h" namespace autofill { class AutofillProfile;
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator_unittest.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator_unittest.mm index ceb5285..5d284639 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator_unittest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/test/bind.h" #import "components/autofill/core/common/autofill_test_utils.h" #import "components/keyed_service/core/service_access_type.h" @@ -118,7 +119,7 @@ std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<SavedPasswordsPresenter> presenter_; id consumer_; - password_manager::FakeAffiliationService* affiliation_service_; + raw_ptr<password_manager::FakeAffiliationService> affiliation_service_; ManualFillPasswordMediator* mediator_; };
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm b/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm index e5dead6..8123aa5 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm
@@ -7,6 +7,7 @@ #import <MaterialComponents/MaterialSnackbar.h> #import "base/i18n/message_formatter.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" @@ -43,13 +44,13 @@ base::WeakPtr<bookmarks::BookmarkModel> _accountBookmarkModel; // Prefs model for this mediator. - PrefService* _prefs; + raw_ptr<PrefService> _prefs; // Authentication service for this mediator. base::WeakPtr<AuthenticationService> _authenticationService; // Sync service for this mediator. - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; } + (void)registerBrowserStatePrefs:(user_prefs::PrefRegistrySyncable*)registry {
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm index aa9e13c..f755b6f 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm
@@ -7,6 +7,7 @@ #import <MaterialComponents/MaterialSnackbar.h> #import "base/i18n/message_formatter.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "base/test/metrics/histogram_tester.h" @@ -165,8 +166,8 @@ } BookmarkMediator* mediator_; - ChromeAccountManagerService* account_manager_service_; - AuthenticationService* authentication_service_; + raw_ptr<ChromeAccountManagerService> account_manager_service_; + raw_ptr<AuthenticationService> authentication_service_; syncer::TestSyncService sync_service_; base::test::ScopedFeatureList scope_; base::HistogramTester histogram_tester_;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h index 0a8abf6c..283c574 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h
@@ -12,6 +12,7 @@ #include <string> #include <vector> +#import "base/memory/raw_ptr.h" #include "base/time/time.h" #include "base/uuid.h" #include "components/bookmarks/common/storage_type.h" @@ -45,7 +46,7 @@ // Node id for the BookmarkNode. const base::Uuid uuid; // Bookmark model from the BookmarkNode. - bookmarks::BookmarkModel* bookmark_model; + raw_ptr<bookmarks::BookmarkModel> bookmark_model; }; typedef std::vector<const bookmarks::BookmarkNode*> NodeVector; @@ -114,25 +115,25 @@ // bookmark storage. bool IsAccountBookmarkStorageOptedIn(syncer::SyncService* sync_service); -// Creates the bookmark if `node` is NULL. Otherwise updates `node`. +// Updates `node`. // `folder` is the intended parent of `node`. // Returns a boolean signifying whether any change was performed. // Note: This function might invalidate `node` if `folder` and `node` belong to // different `BookmarkModel` instances. -bool CreateOrUpdateBookmark(const bookmarks::BookmarkNode* node, - NSString* title, - const GURL& url, - const bookmarks::BookmarkNode* folder, - bookmarks::BookmarkModel* local_or_syncable_model, - bookmarks::BookmarkModel* account_model); +bool UpdateBookmark(const bookmarks::BookmarkNode* node, + NSString* title, + const GURL& url, + const bookmarks::BookmarkNode* folder, + bookmarks::BookmarkModel* local_or_syncable_model, + bookmarks::BookmarkModel* account_model); -// Similar to `CreateOrUpdateBookmark`, but returns a snackbar that allows to +// Similar to `UpdateBookmark`, but returns a snackbar that allows to // undo the performed action. Returns nil if there's nothing to undo. // Note: This function might invalidate `node` if `folder` and `node` belong to // different `BookmarkModel` instances. // TODO(crbug.com/1099901): Refactor to include position and replace two // functions below. -MDCSnackbarMessage* CreateOrUpdateBookmarkWithUndoToast( +MDCSnackbarMessage* UpdateBookmarkWithUndoToast( const bookmarks::BookmarkNode* node, NSString* title, const GURL& url,
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm index 0e171e824c..489f1249 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm
@@ -18,6 +18,7 @@ #import "base/containers/flat_map.h" #import "base/hash/hash.h" #import "base/i18n/string_compare.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" #import "base/notreached.h" @@ -231,16 +232,16 @@ return message; } -bool CreateOrUpdateBookmark(const BookmarkNode* node, - NSString* title, - const GURL& url, - const BookmarkNode* folder, - bookmarks::BookmarkModel* local_or_syncable_model, - bookmarks::BookmarkModel* account_model) { - DCHECK(!node || node->is_url()); +bool UpdateBookmark(const BookmarkNode* node, + NSString* title, + const GURL& url, + const BookmarkNode* folder, + bookmarks::BookmarkModel* local_or_syncable_model, + bookmarks::BookmarkModel* account_model) { + DCHECK(node); DCHECK(folder); std::u16string titleString = base::SysNSStringToUTF16(title); - if (node && node->GetTitle() == titleString && node->url() == url && + if (node->GetTitle() == titleString && node->url() == url && node->parent() == folder) { // Nothing to do. return false; @@ -248,37 +249,29 @@ bookmarks::BookmarkModel* folder_model = GetBookmarkModelForNode(folder, local_or_syncable_model, account_model); - if (!node) { // Create a new bookmark. - RecordModuleFreshnessSignal(ContentSuggestionsModuleType::kShortcuts); - base::RecordAction(base::UserMetricsAction("BookmarkAdded")); - node = folder_model->AddNewURL(folder, folder->children().size(), - titleString, url); - } else { // Update the existing bookmark. - bookmarks::BookmarkModel* node_model = - GetBookmarkModelForNode(node, local_or_syncable_model, account_model); - node_model->SetTitle(node, titleString, - bookmarks::metrics::BookmarkEditSource::kUser); - node_model->SetURL(node, url, + bookmarks::BookmarkModel* node_model = + GetBookmarkModelForNode(node, local_or_syncable_model, account_model); + node_model->SetTitle(node, titleString, bookmarks::metrics::BookmarkEditSource::kUser); + node_model->SetURL(node, url, bookmarks::metrics::BookmarkEditSource::kUser); - DCHECK(!folder->HasAncestor(node)); - if (node->parent() != folder) { - if (node_model == folder_model) { - // In-model move. - node_model->Move(node, folder, folder->children().size()); - } else { - // Cross-model move. - node_model->MoveToOtherModelWithNewNodeIdsAndUuids(node, folder_model, - folder); - // Warning: calling `MoveToOtherModelWithNewNodeIdsAndUuids` invalidates - // `node`, so it shouldn't be used after this line. - } + DCHECK(!folder->HasAncestor(node)); + if (node->parent() != folder) { + if (node_model == folder_model) { + // In-model move. + node_model->Move(node, folder, folder->children().size()); + } else { + // Cross-model move. + node_model->MoveToOtherModelWithNewNodeIdsAndUuids(node, folder_model, + folder); + // Warning: calling `MoveToOtherModelWithNewNodeIdsAndUuids` invalidates + // `node`, so it shouldn't be used after this line. } } return true; } -MDCSnackbarMessage* CreateOrUpdateBookmarkWithUndoToast( +MDCSnackbarMessage* UpdateBookmarkWithUndoToast( const BookmarkNode* node, NSString* title, const GURL& url, @@ -286,6 +279,7 @@ bookmarks::BookmarkModel* local_or_syncable_model, bookmarks::BookmarkModel* account_model, ChromeBrowserState* browser_state) { + CHECK(node); // Secondly, create an Undo group for all undoable actions. UndoManagerWrapper* wrapper = [[UndoManagerWrapper alloc] initWithBrowserState:browser_state]; @@ -293,15 +287,7 @@ // Create or update the bookmark. [wrapper startGroupingActions]; - // The code below might invalidate `node` so grab params for - // `CreateUndoToastWithWrapper` early. - NSString* text = - l10n_util::GetNSString((node) ? IDS_IOS_BOOKMARK_NEW_BOOKMARK_UPDATED - : IDS_IOS_BOOKMARK_NEW_BOOKMARK_CREATED); - const char* user_action = (node) - ? "MobileBookmarkManagerUpdatedBookmarkUndone" - : "MobileBookmarkManagerAddedBookmarkUndone"; - bool did_change_anything = CreateOrUpdateBookmark( + bool did_change_anything = UpdateBookmark( node, title, url, folder, local_or_syncable_model, account_model); [wrapper stopGroupingActions]; @@ -310,7 +296,9 @@ if (!did_change_anything) { return nil; } - return CreateUndoToastWithWrapper(wrapper, text, user_action); + return CreateUndoToastWithWrapper( + wrapper, l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_BOOKMARK_UPDATED), + "MobileBookmarkManagerUpdatedBookmarkUndone"); } MDCSnackbarMessage* CreateBookmarkAtPositionWithUndoToast( @@ -586,7 +574,7 @@ } private: - icu::Collator* collator_; + raw_ptr<icu::Collator> collator_; }; bool FolderHasAncestorInBookmarkNodes(const BookmarkNode* folder,
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm index db74bd4..a2ccfaf 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm
@@ -77,8 +77,8 @@ const BookmarkNode* node = AddBookmark(mobile_node, title); GURL url_copy = node->GetTitledUrlNodeUrl(); - // This call is a no-op, , so `CreateOrUpdateBookmark` should return `false`. - EXPECT_FALSE(bookmark_utils_ios::CreateOrUpdateBookmark( + // This call is a no-op, , so `UpdateBookmark` should return `false`. + EXPECT_FALSE(bookmark_utils_ios::UpdateBookmark( node, base::SysUTF16ToNSString(title), url_copy, mobile_node, local_or_syncable_bookmark_model_, account_bookmark_model_)); EXPECT_EQ(node->GetTitle(), title); @@ -92,7 +92,7 @@ NSString* new_title = @"b"; GURL new_url("http://example.com"); - EXPECT_TRUE(bookmark_utils_ios::CreateOrUpdateBookmark( + EXPECT_TRUE(bookmark_utils_ios::UpdateBookmark( node, new_title, new_url, folder, local_or_syncable_bookmark_model_, account_bookmark_model_)); @@ -103,7 +103,7 @@ EXPECT_EQ(node->GetTitledUrlNodeUrl(), new_url); } -// TODO(crbug.com/1446407): Add tests that call `CreateOrUpdateBookmark` with +// TODO(crbug.com/1446407): Add tests that call `UpdateBookmark` with // the account storage. TEST_F(BookmarkIOSUtilsUnitTest, CreateOrUpdateBetweenModels) { @@ -115,7 +115,7 @@ NSString* new_title = @"b"; GURL new_url("http://example.com"); - EXPECT_TRUE(bookmark_utils_ios::CreateOrUpdateBookmark( + EXPECT_TRUE(bookmark_utils_ios::UpdateBookmark( node, new_title, new_url, account_mobile_node, local_or_syncable_bookmark_model_, account_bookmark_model_));
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm index 1e70fe6..d4765de 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_coordinator.mm
@@ -6,6 +6,7 @@ #import <MaterialComponents/MaterialSnackbar.h> +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" #import "base/strings/sys_string_conversions.h" @@ -34,7 +35,7 @@ BookmarksEditorMediatorDelegate, BookmarksFolderChooserCoordinatorDelegate> { // BookmarkNode to edit. - const bookmarks::BookmarkNode* _node; + raw_ptr<const bookmarks::BookmarkNode> _node; // The editor view controller owned and presented by this coordinator. // It is wrapped in a TableViewNavigationController.
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm index 1916f7e6..6993fde 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_mediator.h" #import "base/auto_reset.h" #import "base/check.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/bookmarks/browser/bookmark_model.h" #import "components/bookmarks/browser/bookmark_node.h" @@ -25,12 +26,12 @@ @interface BookmarksEditorMediator () <BookmarkModelBridgeObserver, SyncObserverModelBridge> { - PrefService* _prefs; + raw_ptr<PrefService> _prefs; // Observer for the bookmark model of `self.bookmark`. std::unique_ptr<BookmarkModelBridge> _bookmarkModelBridgeObserver; std::unique_ptr<SyncObserverBridge> _syncObserverModelBridge; - ChromeBrowserState* _browserState; + raw_ptr<ChromeBrowserState> _browserState; // Whether the user manually changed the folder. In which case it must be // saved as last used folder on "save". BOOL _manuallyChangedTheFolder; @@ -44,7 +45,7 @@ @implementation BookmarksEditorMediator { base::WeakPtr<bookmarks::BookmarkModel> _localOrSyncableBookmarkModel; base::WeakPtr<bookmarks::BookmarkModel> _accountBookmarkModel; - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; } - (instancetype) @@ -232,11 +233,10 @@ } [self.snackbarCommandsHandler - showSnackbarMessage: - bookmark_utils_ios::CreateOrUpdateBookmarkWithUndoToast( - [self bookmark], name, url, [self folder], - _localOrSyncableBookmarkModel.get(), _accountBookmarkModel.get(), - _browserState)]; + showSnackbarMessage:bookmark_utils_ios::UpdateBookmarkWithUndoToast( + [self bookmark], name, url, [self folder], + _localOrSyncableBookmarkModel.get(), + _accountBookmarkModel.get(), _browserState)]; if (_manuallyChangedTheFolder) { bookmarks::StorageType type = bookmark_utils_ios::GetBookmarkModelType( _folder, _localOrSyncableBookmarkModel.get(),
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm index a0b8f0f..10f6349 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm
@@ -9,6 +9,7 @@ #import "base/apple/foundation_util.h" #import "base/check.h" #import "base/check_op.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" #import "components/bookmarks/browser/bookmark_model.h" @@ -53,7 +54,7 @@ // This is only used for clients of this coordinator to update the UI. This // does not reflect the folder users chose by clicking. For that information // use `bookmarksFolderChooserCoordinatorDidConfirm:withSelectedFolder:`. - const bookmarks::BookmarkNode* _selectedFolder; + raw_ptr<const bookmarks::BookmarkNode> _selectedFolder; } @synthesize baseNavigationController = _baseNavigationController;
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm index b3d55e9..753cd1de4 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_mediator.h" #import "base/containers/contains.h" +#import "base/memory/raw_ptr.h" #import "components/bookmarks/browser/bookmark_model.h" #import "components/bookmarks/common/bookmark_features.h" #import "components/sync/base/features.h" @@ -41,7 +42,7 @@ // Observer for signin status changes. std::unique_ptr<AuthenticationServiceObserverBridge> _authServiceBridge; // Sync service. - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; // Observer for sync service status changes. std::unique_ptr<SyncObserverBridge> _syncObserverBridge; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl.mm index fa8d343..7cb4eba 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl.h" +#import "base/memory/raw_ptr.h" #import "components/bookmarks/browser/bookmark_model.h" #import "ios/chrome/browser/bookmarks/model/bookmark_model_bridge_observer.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" @@ -17,7 +18,7 @@ @implementation BookmarksFolderChooserSubDataSourceImpl { // Bookmarks model object. - BookmarkModel* _bookmarkModel; + raw_ptr<BookmarkModel> _bookmarkModel; // Observer for `_bookmarkModel` changes. std::unique_ptr<BookmarkModelBridge> _bookmarkModelBridge; __weak id<BookmarksFolderChooserParentDataSource> _parentDataSource;
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl_unittest.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl_unittest.mm index 3e35440..66dc2a81 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_sub_data_source_impl_unittest.mm
@@ -8,6 +8,7 @@ #import <OCMock/OCMock.h> #import "base/containers/contains.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/scoped_feature_list.h" #import "components/bookmarks/browser/bookmark_model.h" @@ -152,7 +153,7 @@ IOSChromeScopedTestingLocalState local_state_; web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; - BookmarkModel* model_; + raw_ptr<BookmarkModel> model_; BookmarksFolderChooserSubDataSourceImpl* sub_data_source_; id mock_consumer_; FakeBookmarksFolderChooserParentDataSource* fake_parent_data_source_;
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm index 1967fd5..cac7cc74 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm
@@ -7,6 +7,7 @@ #import "base/apple/foundation_util.h" #import "base/check.h" #import "base/check_op.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" #import "components/bookmarks/browser/bookmark_node.h" @@ -36,10 +37,10 @@ // Coordinator to show the folder chooser UI. BookmarksFolderChooserCoordinator* _folderChooserCoordinator; // Parent folder to `_folderNode`. Should never be `nullptr`. - const bookmarks::BookmarkNode* _parentFolderNode; + raw_ptr<const bookmarks::BookmarkNode> _parentFolderNode; // If `_folderNode` is `nullptr`, the user is adding a new folder. Otherwise // the user is editing an existing folder. - const bookmarks::BookmarkNode* _folderNode; + raw_ptr<const bookmarks::BookmarkNode> _folderNode; } @end
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm index 892266b..7077370d 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm
@@ -10,6 +10,7 @@ #import "base/auto_reset.h" #import "base/check_op.h" #import "base/i18n/rtl.h" +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" @@ -75,16 +76,16 @@ std::unique_ptr<BookmarkModelBridge> _accountModelBridge; // Observer for signin status changes. std::unique_ptr<AuthenticationServiceObserverBridge> _authServiceBridge; - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; std::unique_ptr<SyncObserverBridge> _syncObserverModelBridge; // The browser for this view controller. base::WeakPtr<Browser> _browser; - ChromeBrowserState* _browserState; + raw_ptr<ChromeBrowserState> _browserState; // Parent folder to `_folder`. Should never be `nullptr`. - const BookmarkNode* _parentFolder; + raw_ptr<const BookmarkNode> _parentFolder; // If `_folderNode` is `nullptr`, the user is adding a new folder. Otherwise // the user is editing an existing folder. - const BookmarkNode* _folder; + raw_ptr<const BookmarkNode> _folder; BOOL _edited; BOOL _editingExistingFolder;
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm index b1bbe0b..de2e69b 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm
@@ -8,6 +8,7 @@ #import "base/containers/contains.h" #import "base/i18n/message_formatter.h" #import "base/ios/ios_util.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" @@ -225,7 +226,7 @@ std::unique_ptr<BookmarkModelBridge> _accountBookmarkModelBridge; // The bookmark node that was choosen by an entity outside of the Bookmarks UI // and is selected when the view is loaded. - const bookmarks::BookmarkNode* _externalBookmark; + raw_ptr<const bookmarks::BookmarkNode> _externalBookmark; // Whether the view controller was requested to shutdown. BOOL _isShutDown; }
diff --git a/ios/chrome/browser/ui/bookmarks/home/synced_bookmarks_bridge.h b/ios/chrome/browser/ui/bookmarks/home/synced_bookmarks_bridge.h index e50b41e..80b53ce 100644 --- a/ios/chrome/browser/ui/bookmarks/home/synced_bookmarks_bridge.h +++ b/ios/chrome/browser/ui/bookmarks/home/synced_bookmarks_bridge.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/sync/model/sync_observer_bridge.h" class ChromeBrowserState; @@ -33,8 +34,8 @@ bool IsPerformingInitialSync(); private: - signin::IdentityManager* identity_manager_; - ChromeBrowserState* browser_state_; + raw_ptr<signin::IdentityManager> identity_manager_; + raw_ptr<ChromeBrowserState> browser_state_; }; } // namespace sync_bookmarks
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn index d401c01f..3d4c3ea 100644 --- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn +++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -91,6 +91,7 @@ "//ios/chrome/browser/passwords/model:password_checkup_utils", "//ios/chrome/browser/policy/model:policy_util", "//ios/chrome/browser/promos_manager:factory", + "//ios/chrome/browser/push_notification/model:push_notification_client", "//ios/chrome/browser/reading_list/model", "//ios/chrome/browser/safety_check/model", "//ios/chrome/browser/safety_check/model:constants", @@ -135,6 +136,7 @@ "//ios/chrome/browser/ui/ntp:feature_flags", "//ios/chrome/browser/ui/ntp/metrics:home_metrics", "//ios/chrome/browser/ui/overscroll_actions", + "//ios/chrome/browser/ui/push_notification:opt_in_alert_coordinator", "//ios/chrome/browser/ui/push_notification:presenters", "//ios/chrome/browser/ui/reading_list", "//ios/chrome/browser/ui/settings/safety_check:constants",
diff --git a/ios/chrome/browser/ui/content_suggestions/DEPS b/ios/chrome/browser/ui/content_suggestions/DEPS index c0ed0fc6..a892a52b 100644 --- a/ios/chrome/browser/ui/content_suggestions/DEPS +++ b/ios/chrome/browser/ui/content_suggestions/DEPS
@@ -14,5 +14,5 @@ "+ios/chrome/browser/ui/start_surface", "+ios/chrome/browser/ui/whats_new/whats_new_util.h", "+ios/chrome/browser/ui/toolbar/public", - "+ios/chrome/browser/ui/push_notification/notifications_confirmation_presenter.h" + "+ios/chrome/browser/ui/push_notification" ]
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h index 48e5fb1..68d9275 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h
@@ -100,4 +100,7 @@ ContentSuggestionsModuleType SetUpListModuleTypeForSetUpListType( SetUpListItemType type); +// Returns true if the module type is one of the SetUpList types. +bool IsSetUpListModuleType(ContentSuggestionsModuleType type); + #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.mm index 3bbf9e0..4a6e975d 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.mm
@@ -60,3 +60,25 @@ NOTREACHED_NORETURN(); } } + +bool IsSetUpListModuleType(ContentSuggestionsModuleType type) { + switch (type) { + case ContentSuggestionsModuleType::kTabResumption: + case ContentSuggestionsModuleType::kSafetyCheck: + case ContentSuggestionsModuleType::kSafetyCheckMultiRow: + case ContentSuggestionsModuleType::kSafetyCheckMultiRowOverflow: + case ContentSuggestionsModuleType::kParcelTracking: + case ContentSuggestionsModuleType::kParcelTrackingSeeMore: + case ContentSuggestionsModuleType::kMostVisited: + case ContentSuggestionsModuleType::kShortcuts: + case ContentSuggestionsModuleType::kPlaceholder: + return false; + case ContentSuggestionsModuleType::kSetUpListSync: + case ContentSuggestionsModuleType::kSetUpListDefaultBrowser: + case ContentSuggestionsModuleType::kSetUpListAutofill: + case ContentSuggestionsModuleType::kSetUpListContentNotification: + case ContentSuggestionsModuleType::kCompactedSetUpList: + case ContentSuggestionsModuleType::kSetUpListAllSet: + return true; + } +}
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index 8234462..c355cf8f 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -34,6 +34,7 @@ #import "ios/chrome/browser/passwords/model/password_checkup_utils.h" #import "ios/chrome/browser/policy/model/policy_util.h" #import "ios/chrome/browser/promos_manager/promos_manager_factory.h" +#import "ios/chrome/browser/push_notification/model/push_notification_client_id.h" #import "ios/chrome/browser/reading_list/model/reading_list_model_factory.h" #import "ios/chrome/browser/safety_check/model/ios_chrome_safety_check_manager.h" #import "ios/chrome/browser/safety_check/model/ios_chrome_safety_check_manager_factory.h" @@ -67,6 +68,7 @@ #import "ios/chrome/browser/sync/model/sync_service_factory.h" #import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" +#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_delegate.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_image_data_source.h" @@ -96,6 +98,7 @@ #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_metrics_delegate.h" #import "ios/chrome/browser/ui/push_notification/notifications_confirmation_presenter.h" +#import "ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.h" #import "ios/chrome/browser/ui/start_surface/start_surface_features.h" #import "ios/chrome/browser/ui/start_surface/start_surface_recent_tab_browser_agent.h" #import "ios/chrome/browser/ui/start_surface/start_surface_util.h" @@ -103,6 +106,7 @@ #import "ios/chrome/grit/ios_branded_strings.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/web/public/web_state.h" +#import "ui/base/l10n/l10n_util.h" #import "ui/base/l10n/l10n_util_mac.h" #import "url/gurl.h" @@ -111,6 +115,7 @@ MagicStackHalfSheetTableViewControllerDelegate, MagicStackParcelListHalfSheetTableViewControllerDelegate, NotificationsConfirmationPresenter, + NotificationsOptInAlertCoordinatorDelegate, SetUpListContentNotificationPromoCoordinatorDelegate, SetUpListDefaultBrowserPromoCoordinatorDelegate, SetUpListViewDelegate> @@ -160,6 +165,9 @@ // The coordinator used to present a modal alert for the parcel tracking // module. AlertCoordinator* _parcelTrackingAlertCoordinator; + + // The coordinator used to present an alert to enable Tips notifications. + NotificationsOptInAlertCoordinator* _notificationsOptInAlertCoordinator; } - (void)start { @@ -305,6 +313,8 @@ _magicStackHalfSheetTableViewController = nil; [self dismissParcelListHalfSheet]; [self dismissParcelTrackingAlertCoordinator]; + [_notificationsOptInAlertCoordinator stop]; + _notificationsOptInAlertCoordinator = nil; _started = NO; } @@ -369,6 +379,27 @@ } } +- (void)enableNotifications:(ContentSuggestionsModuleType)type { + // This is only supported for Set Up List modules. + CHECK(IsSetUpListModuleType(type)); + + // Ask user for permission to opt-in notifications. + [_notificationsOptInAlertCoordinator stop]; + _notificationsOptInAlertCoordinator = + [[NotificationsOptInAlertCoordinator alloc] + initWithBaseViewController:self.viewController + browser:self.browser]; + _notificationsOptInAlertCoordinator.clientId = + PushNotificationClientId::kTips; + _notificationsOptInAlertCoordinator.confirmationMessage = + l10n_util::GetNSStringF( + IDS_IOS_NOTIFICATIONS_CONFIRMATION_MESSAGE, + l10n_util::GetStringUTF16( + content_suggestions::SetUpListTitleStringID())); + _notificationsOptInAlertCoordinator.delegate = self; + [_notificationsOptInAlertCoordinator start]; +} + - (void)didTapMagicStackEditButton { _magicStackHalfSheetTableViewController = [[MagicStackHalfSheetTableViewController alloc] init]; @@ -711,6 +742,13 @@ [_contentNotificationCoordinator start]; } +#pragma mark - NotificationsOptInAlertCoordinatorDelegate + +- (void)notificationsOptInAlertResult:(NotificationsOptInAlertResult)result { + [_notificationsOptInAlertCoordinator stop]; + _notificationsOptInAlertCoordinator = nil; +} + #pragma mark - SetUpListDefaultBrowserPromoCoordinatorDelegate - (void)setUpListDefaultBrowserPromoDidFinish:(BOOL)success {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm index d3bd0dc5..0584693 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -1015,6 +1015,10 @@ [self.audience neverShowModuleType:type]; } +- (void)enableNotifications:(ContentSuggestionsModuleType)type { + [self.audience enableNotifications:type]; +} + // Returns the module's subtitle, if any, given the Magic Stack module `type`. - (NSString*)subtitleStringForModule:(ContentSuggestionsModuleType)type { if (type == ContentSuggestionsModuleType::kSafetyCheck ||
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h index 635a1d6..22cacbd 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller_audience.h
@@ -33,6 +33,10 @@ // anymore. - (void)neverShowModuleType:(ContentSuggestionsModuleType)type; +// Indicates that the user has tapped the context menu item to enable +// notifications for a module. +- (void)enableNotifications:(ContentSuggestionsModuleType)type; + // Notifies the audience that the Magic Stack edit button was tapped. - (void)didTapMagicStackEditButton;
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container.mm b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container.mm index 8d8392e..947b2f4 100644 --- a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container.mm +++ b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container.mm
@@ -413,20 +413,11 @@ configurationForMenuAtLocation:(CGPoint)location { CHECK([self allowsLongPress]); __weak MagicStackModuleContainer* weakSelf = self; - UIContextMenuActionProvider actionProvider = ^( - NSArray<UIMenuElement*>* suggestedActions) { - UIAction* hideAction = [UIAction - actionWithTitle:[self contextMenuHideDescription] - image:DefaultSymbolWithPointSize(kHideActionSymbol, 18) - identifier:nil - handler:^(UIAction* action) { - MagicStackModuleContainer* strongSelf = weakSelf; - [strongSelf->_delegate neverShowModuleType:strongSelf->_type]; - }]; - hideAction.attributes = UIMenuElementAttributesDestructive; - return [UIMenu menuWithTitle:[self contextMenuTitle] - children:@[ hideAction ]]; - }; + UIContextMenuActionProvider actionProvider = + ^(NSArray<UIMenuElement*>* suggestedActions) { + return [UIMenu menuWithTitle:[weakSelf contextMenuTitle] + children:[weakSelf contextMenuActions]]; + }; return [UIContextMenuConfiguration configurationWithIdentifier:nil previewProvider:nil @@ -435,6 +426,46 @@ #pragma mark - Helpers +// Returns the list of actions for the long-press / context menu. +- (NSArray<UIAction*>*)contextMenuActions { + NSMutableArray<UIAction*>* actions = [[NSMutableArray alloc] init]; + + if (IsSetUpListModuleType(self.type) && IsIOSTipsNotificationsEnabled()) { + [actions addObject:[self turnOnTipsNotificationsAction]]; + } + [actions addObject:[self hideAction]]; + return actions; +} + +// Returns the menu action to hide this module type. +- (UIAction*)hideAction { + __weak __typeof(self) weakSelf = self; + UIAction* hideAction = [UIAction + actionWithTitle:[self contextMenuHideDescription] + image:DefaultSymbolWithPointSize(kHideActionSymbol, 18) + identifier:nil + handler:^(UIAction* action) { + [weakSelf.delegate neverShowModuleType:weakSelf.type]; + }]; + hideAction.attributes = UIMenuElementAttributesDestructive; + return hideAction; +} + +// Returns the menu action to opt-in to Tips Notifications. +- (UIAction*)turnOnTipsNotificationsAction { + __weak __typeof(self) weakSelf = self; + NSString* title = l10n_util::GetNSStringF( + IDS_IOS_TIPS_NOTIFICATIONS_CONTEXT_MENU_ITEM, + l10n_util::GetStringUTF16(content_suggestions::SetUpListTitleStringID())); + return + [UIAction actionWithTitle:title + image:DefaultSymbolWithPointSize(kBellSymbol, 18) + identifier:nil + handler:^(UIAction* action) { + [weakSelf.delegate enableNotifications:weakSelf.type]; + }]; +} + - (void)seeMoreButtonWasTapped:(UIButton*)button { [_delegate seeMoreWasTappedForModuleType:_type]; }
diff --git a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container_delegate.h b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container_delegate.h index 399dd11..d63780b1 100644 --- a/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container_delegate.h +++ b/ios/chrome/browser/ui/content_suggestions/magic_stack/magic_stack_module_container_delegate.h
@@ -24,6 +24,10 @@ // anymore. - (void)neverShowModuleType:(ContentSuggestionsModuleType)type; +// Indicates that the user has tapped the context menu item to enable +// notifications. +- (void)enableNotifications:(ContentSuggestionsModuleType)type; + // Returns the subtitle string for the module `type`. - (NSString*)subtitleStringForModule:(ContentSuggestionsModuleType)type;
diff --git a/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm b/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm index 0db6ed7..1203ae2 100644 --- a/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
@@ -9,6 +9,7 @@ #import <memory> #import "base/logging.h" +#import "base/memory/raw_ptr.h" #import "base/test/ios/wait_util.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/task_environment.h" @@ -72,7 +73,7 @@ UIViewController* base_view_controller_; PassKitCoordinator* coordinator_; // Weak pointer to the test web state; browser_'s web state list owns it. - web::WebState* web_state_; + raw_ptr<web::WebState> web_state_; FakeWebContentHandler* handler_; ScopedKeyWindow scoped_key_window_; std::unique_ptr<web::NavigationManager> test_navigation_manager_;
diff --git a/ios/chrome/browser/ui/first_run/uma/uma_coordinator.mm b/ios/chrome/browser/ui/first_run/uma/uma_coordinator.mm index 8a4aa42..0e237d3 100644 --- a/ios/chrome/browser/ui/first_run/uma/uma_coordinator.mm +++ b/ios/chrome/browser/ui/first_run/uma/uma_coordinator.mm
@@ -42,15 +42,13 @@ initWithRootViewController:self.viewController]; navigationController.modalPresentationStyle = UIModalPresentationFormSheet; navigationController.presentationController.delegate = self; - if (@available(iOS 15, *)) { - UISheetPresentationController* presentationController = - navigationController.sheetPresentationController; - presentationController.prefersEdgeAttachedInCompactHeight = YES; - presentationController.detents = @[ - UISheetPresentationControllerDetent.mediumDetent, - UISheetPresentationControllerDetent.largeDetent - ]; - } + UISheetPresentationController* presentationController = + navigationController.sheetPresentationController; + presentationController.prefersEdgeAttachedInCompactHeight = YES; + presentationController.detents = @[ + UISheetPresentationControllerDetent.mediumDetent, + UISheetPresentationControllerDetent.largeDetent + ]; [self.baseViewController presentViewController:navigationController animated:YES completion:nil];
diff --git a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm index 16504f9..f79bd6f 100644 --- a/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/feed_top_section/feed_top_section_coordinator.mm
@@ -210,19 +210,21 @@ #pragma mark - NotificationsConfirmationPresenter - (void)presentNotificationsConfirmationMessage { - id<SnackbarCommands> snackbarHandler = HandlerForProtocol( - self.browser->GetCommandDispatcher(), SnackbarCommands); - __weak __typeof(self) weakSelf = self; - [snackbarHandler - showSnackbarWithMessage:l10n_util::GetNSString( - IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_TITLE) - buttonText: - l10n_util::GetNSString( - IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_ACTION_MANAGE) - messageAction:^{ - [weakSelf showNotificationSettings]; - } - completionAction:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + id<SnackbarCommands> snackbarHandler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), SnackbarCommands); + __weak __typeof(self) weakSelf = self; + [snackbarHandler + showSnackbarWithMessage:l10n_util::GetNSString( + IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_TITLE) + buttonText: + l10n_util::GetNSString( + IDS_IOS_CONTENT_NOTIFICATION_SNACKBAR_ACTION_MANAGE) + messageAction:^{ + [weakSelf showNotificationSettings]; + } + completionAction:nil]; + }); } #pragma mark - Private
diff --git a/ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_content_view.mm b/ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_content_view.mm index 3f36525..6caa8dc 100644 --- a/ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_content_view.mm +++ b/ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_content_view.mm
@@ -5,8 +5,10 @@ #import "ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_content_view.h" #import "base/check.h" +#import "base/metrics/histogram_functions.h" #import "ios/chrome/browser/shared/ui/elements/extended_touch_target_button.h" #import "ios/chrome/browser/shared/ui/elements/fade_truncating_label.h" +#import "ios/chrome/browser/shared/ui/util/attributed_string_util.h" #import "ios/chrome/browser/ui/omnibox/popup/omnibox_icon_view.h" #import "ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_delegate.h" #import "ios/chrome/browser/ui/omnibox/popup/row/omnibox_popup_row_util.h" @@ -37,6 +39,9 @@ const CGFloat kTextIconSpace = 14.0f; /// Top color opacity of the `_selectedBackgroundView`. const CGFloat kTopGradientColorOpacity = 0.85; +/// Name of the histogram recording the number of lines in search suggestions. +const char kOmniboxSearchSuggestionNumberOfLines[] = + "IOS.Omnibox.SearchSuggestionNumberOfLines"; } // namespace @@ -289,6 +294,11 @@ // Primary Label. _primaryLabel.attributedText = configuration.primaryText; _primaryLabel.numberOfLines = configuration.primaryTextNumberOfLines; + if (configuration.primaryTextNumberOfLines > 1) { + // Currently only search suggestions are allowed to be multiline. + CHECK(!configuration.secondaryTextDisplayAsURL); + [self logNumberOfLinesInSearchSuggestion:configuration.primaryText]; + } // Secondary Label. _secondaryLabelFading.hidden = YES; @@ -359,4 +369,14 @@ didTapTrailingButtonAtIndexPath:self.configuration.indexPath]; } +/// Log the number of lines of a seach suggestion. +- (void)logNumberOfLinesInSearchSuggestion: + (NSAttributedString*)attributedString { + CGFloat width = CGRectGetWidth(_textStackView.frame); + NSInteger numberOfLines = + NumberOfLinesOfAttributedString(attributedString, width); + base::UmaHistogramExactLinear(kOmniboxSearchSuggestionNumberOfLines, + static_cast<int>(numberOfLines), 10); +} + @end
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/tab_pickup/tab_pickup_infobar_banner_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/infobar_banner/tab_pickup/tab_pickup_infobar_banner_overlay_mediator_unittest.mm index 754036f0..3fee534 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/tab_pickup/tab_pickup_infobar_banner_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/tab_pickup/tab_pickup_infobar_banner_overlay_mediator_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/overlays/infobar_banner/tab_pickup/tab_pickup_infobar_banner_overlay_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "base/test/scoped_feature_list.h" @@ -92,7 +93,7 @@ std::unique_ptr<Browser> browser_; std::unique_ptr<InfoBarIOS> infobar_; std::unique_ptr<OverlayRequest> request_; - TabPickupInfobarDelegate* delegate_ = nil; + raw_ptr<TabPickupInfobarDelegate> delegate_ = nil; FakeInfobarBannerConsumer* consumer_ = nil; TabPickupBannerOverlayMediator* mediator_ = nil; };
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm index 21e20669c..d04c78c 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm
@@ -6,6 +6,7 @@ #import "base/feature_list.h" #import "base/functional/bind.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/autofill_client.h" #import "components/autofill/core/browser/autofill_save_update_address_profile_delegate_ios.h" @@ -70,7 +71,7 @@ } protected: - autofill::AutofillSaveUpdateAddressProfileDelegateIOS* delegate_; + raw_ptr<autofill::AutofillSaveUpdateAddressProfileDelegateIOS> delegate_; std::unique_ptr<InfoBarIOS> infobar_; MockOverlayRequestCallbackReceiver callback_receiver_; FakeOverlayRequestCallbackInstaller callback_installer_;
diff --git a/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm b/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm index b6e2a02..c10815b 100644 --- a/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm +++ b/ios/chrome/browser/ui/partial_translate/partial_translate_mediator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/partial_translate/partial_translate_mediator.h" #import "base/apple/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "base/metrics/histogram_functions.h" #import "components/prefs/pref_member.h" @@ -105,7 +106,7 @@ // The fullscreen controller to offset sourceRect depending on fullscreen // status. - FullscreenController* _fullscreenController; + raw_ptr<FullscreenController> _fullscreenController; } - (instancetype)initWithWebStateList:(WebStateList*)webStateList
diff --git a/ios/chrome/browser/ui/partial_translate/partial_translate_mediator_unittest.mm b/ios/chrome/browser/ui/partial_translate/partial_translate_mediator_unittest.mm index ecd0f5bf..5957af6 100644 --- a/ios/chrome/browser/ui/partial_translate/partial_translate_mediator_unittest.mm +++ b/ios/chrome/browser/ui/partial_translate/partial_translate_mediator_unittest.mm
@@ -7,6 +7,7 @@ #import "ios/chrome/browser/ui/partial_translate/partial_translate_mediator.h" #import "base/ios/ios_util.h" +#import "base/memory/raw_ptr.h" #import "base/test/ios/wait_util.h" #import "base/test/metrics/histogram_tester.h" #import "base/test/scoped_feature_list.h" @@ -213,7 +214,7 @@ std::unique_ptr<TestChromeBrowserState> browser_state_; FakeWebStateListDelegate web_state_list_delegate_; WebStateList web_state_list_; - web::WebState* web_state_; + raw_ptr<web::WebState> web_state_; UIViewController* base_view_controller_; FakeAlertController* fake_alert_controller_; id mock_browser_coordinator_commands_handler_;
diff --git a/ios/chrome/browser/ui/push_notification/BUILD.gn b/ios/chrome/browser/ui/push_notification/BUILD.gn index d0ed0ae..aa45ae89 100644 --- a/ios/chrome/browser/ui/push_notification/BUILD.gn +++ b/ios/chrome/browser/ui/push_notification/BUILD.gn
@@ -8,3 +8,55 @@ "notifications_confirmation_presenter.h", ] } + +source_set("opt_in_alert_coordinator") { + sources = [ + "notifications_opt_in_alert_coordinator.h", + "notifications_opt_in_alert_coordinator.mm", + ] + deps = [ + "//ios/chrome/app/strings", + "//ios/chrome/browser/push_notification/model:push_notification_client", + "//ios/chrome/browser/push_notification/model:push_notification_service", + "//ios/chrome/browser/shared/coordinator/alert", + "//ios/chrome/browser/shared/coordinator/chrome_coordinator", + "//ios/chrome/browser/shared/model/application_context", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/public/commands", + "//ui/base", + ] +} + +source_set("test_support") { + testonly = true + sources = [ + "scoped_notification_auth_swizzler.h", + "scoped_notification_auth_swizzler.mm", + ] + deps = [ + "//base", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + ] +} + +source_set("eg2_tests") { + configs += [ "//build/config/ios:xctest_config" ] + testonly = true + sources = [ "push_notification_egtest.mm" ] + deps = [ + ":test_support", + "//base", + "//base/test:test_support", + "//ios/chrome/app/strings", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/shared/public/features", + "//ios/chrome/browser/ui/content_suggestions:constants", + "//ios/chrome/browser/ui/content_suggestions:eg_test_support+eg2", + "//ios/chrome/browser/ui/content_suggestions/set_up_list:constants", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ui/base", + "//ui/strings", + ] +}
diff --git a/ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.h b/ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.h new file mode 100644 index 0000000..50d245a --- /dev/null +++ b/ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.h
@@ -0,0 +1,47 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_PUSH_NOTIFICATION_NOTIFICATIONS_OPT_IN_ALERT_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_PUSH_NOTIFICATION_NOTIFICATIONS_OPT_IN_ALERT_COORDINATOR_H_ + +#import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" + +enum class PushNotificationClientId; + +// The result of asking for permission to receive notifications. +enum class NotificationsOptInAlertResult { + kPermissionGranted, + kPermissionDenied, + kOpenedSettings, + kCanceled, + kError, +}; + +// A protocol used to communicate the result back to the owning coordinator. +@protocol NotificationsOptInAlertCoordinatorDelegate +// Called with the final result of the opt-in request. +- (void)notificationsOptInAlertResult:(NotificationsOptInAlertResult)result; +@end + +// Coordinates the presentation of an alert to ask the user for permission to +// receive notifications. If permission has already been denied, an alert will +// be presented to ask the user if they want to change the app's notification +// permission in iOS settings. +@interface NotificationsOptInAlertCoordinator : ChromeCoordinator + +// The delegate which should receive the result of the opt-in request. +@property(nonatomic, weak) id<NotificationsOptInAlertCoordinatorDelegate> + delegate; + +// The client id of the push notification client that the user is +// opting-in for. +@property(nonatomic, assign) PushNotificationClientId clientId; + +// The confirmation message to show in a Snackbar when notifications have been +// enabled. +@property(nonatomic, copy) NSString* confirmationMessage; + +@end + +#endif // IOS_CHROME_BROWSER_UI_PUSH_NOTIFICATION_NOTIFICATIONS_OPT_IN_ALERT_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.mm b/ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.mm new file mode 100644 index 0000000..58090951 --- /dev/null +++ b/ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.mm
@@ -0,0 +1,170 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/push_notification/notifications_opt_in_alert_coordinator.h" + +#import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/push_notification/model/push_notification_client_id.h" +#import "ios/chrome/browser/push_notification/model/push_notification_service.h" +#import "ios/chrome/browser/push_notification/model/push_notification_util.h" +#import "ios/chrome/browser/shared/coordinator/alert/alert_coordinator.h" +#import "ios/chrome/browser/shared/model/application_context/application_context.h" +#import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/chrome/browser/shared/model/browser_state/browser_state_info_cache.h" +#import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state_manager.h" +#import "ios/chrome/browser/shared/public/commands/application_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" +#import "ios/chrome/browser/shared/public/commands/snackbar_commands.h" +#import "ios/chrome/grit/ios_branded_strings.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util_mac.h" + +@implementation NotificationsOptInAlertCoordinator { + SEQUENCE_CHECKER(sequence_checker_); + // The coordinator used to present the alert used when permission has + // previously been denied. + AlertCoordinator* _alertCoordinator; +} + +- (void)start { + [self requestPushNotificationPermission]; +} + +- (void)stop { + [_alertCoordinator stop]; + _alertCoordinator = nil; +} + +#pragma mark - Private methods + +// Asks iOS to request permission from the user to receive notifications. If +// the request has already happened and permission was not granted, an alert +// will be presented to ask the user if they want to enable the permission in +// the iOS settings app. +- (void)requestPushNotificationPermission { + __weak __typeof(self) weakSelf = self; + scoped_refptr<base::TaskRunner> taskRunner = + base::SequencedTaskRunner::GetCurrentDefault(); + [PushNotificationUtil requestPushNotificationPermission:^( + BOOL granted, BOOL promptShown, NSError* error) { + taskRunner->PostTask(FROM_HERE, base::BindOnce(^{ + [weakSelf onRequestPermissionResult:granted + promptShown:promptShown + error:error]; + })); + }]; +} + +// Handles the response from requesting notification authorization. +- (void)onRequestPermissionResult:(BOOL)granted + promptShown:(BOOL)promptShown + error:(NSError*)error { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (error) { + [self setResult:NotificationsOptInAlertResult::kError]; + } else if (!granted) { + if (!promptShown) { + [self presentNotificationPermissionAlert]; + } else { + [self setResult:NotificationsOptInAlertResult::kPermissionDenied]; + } + } else { + // Permission has been granted! + [self enableNotifications]; + [self showConfirmationSnackbar]; + [self setResult:NotificationsOptInAlertResult::kPermissionGranted]; + } +} + +// Presents an alert view to ask the user to enable notifications via iOS +// settings. +- (void)presentNotificationPermissionAlert { + NSString* alertTitle = + l10n_util::GetNSString(IDS_IOS_NOTIFICATIONS_ALERT_TITLE); + NSString* alertMessage = + l10n_util::GetNSString(IDS_IOS_NOTIFICATIONS_ALERT_MESSAGE); + NSString* cancelTitle = + l10n_util::GetNSString(IDS_IOS_NOTIFICATIONS_ALERT_CANCEL); + NSString* settingsTitle = + l10n_util::GetNSString(IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS); + + [_alertCoordinator stop]; + _alertCoordinator = [[AlertCoordinator alloc] + initWithBaseViewController:self.baseViewController + browser:self.browser + title:alertTitle + message:alertMessage]; + __weak __typeof(self) weakSelf = self; + [_alertCoordinator addItemWithTitle:cancelTitle + action:^{ + [weakSelf didCancelAlert]; + } + style:UIAlertActionStyleCancel]; + [_alertCoordinator addItemWithTitle:settingsTitle + action:^{ + [weakSelf openSettings]; + } + style:UIAlertActionStyleDefault]; + [_alertCoordinator start]; +} + +// Enables notifications in prefs for the client with `clientID`. +- (void)enableNotifications { + base::FilePath path = self.browser->GetBrowserState()->GetStatePath(); + BrowserStateInfoCache* infoCache = GetApplicationContext() + ->GetChromeBrowserStateManager() + ->GetBrowserStateInfoCache(); + size_t browserStateIndex = infoCache->GetIndexOfBrowserStateWithPath(path); + NSString* gaiaID = base::SysUTF8ToNSString( + infoCache->GetGAIAIdOfBrowserStateAtIndex(browserStateIndex)); + GetApplicationContext()->GetPushNotificationService()->SetPreference( + gaiaID, self.clientId, true); +} + +// Shows a snackbar message indicating that notifications are enabled. +- (void)showConfirmationSnackbar { + NSString* buttonText = + l10n_util::GetNSString(IDS_IOS_NOTIFICATIONS_MANAGE_SETTINGS); + // Show snackbar confirmation. + id<SnackbarCommands> snackbarHandler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), SnackbarCommands); + __weak id<ApplicationSettingsCommands> weakSettingsHandler = + HandlerForProtocol(self.browser->GetCommandDispatcher(), + ApplicationSettingsCommands); + [snackbarHandler showSnackbarWithMessage:self.confirmationMessage + buttonText:buttonText + messageAction:^{ + [weakSettingsHandler showNotificationsSettings]; + } + completionAction:nil]; +} + +// Opens the iOS settings app to the app's Notification permissions. +- (void)openSettings { + // TODO(crbug.com/1519157): Log metrics. + NSURL* url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; + if (@available(iOS 15.4, *)) { + url = [NSURL URLWithString:UIApplicationOpenNotificationSettingsURLString]; + } + + [[UIApplication sharedApplication] openURL:url + options:{} + completionHandler:nil]; + [self setResult:NotificationsOptInAlertResult::kOpenedSettings]; +} + +// Called when the user taps the alert's "cancel" action. +- (void)didCancelAlert { + // TODO(crbug.com/1519157): Log metrics. + [self setResult:NotificationsOptInAlertResult::kCanceled]; +} + +// Tells the delegate the result of the UI flow. +- (void)setResult:(NotificationsOptInAlertResult)result { + // TODO(crbug.com/1519157): Log metrics. + [self.delegate notificationsOptInAlertResult:result]; +} + +@end
diff --git a/ios/chrome/browser/ui/push_notification/push_notification_egtest.mm b/ios/chrome/browser/ui/push_notification/push_notification_egtest.mm new file mode 100644 index 0000000..b56d87b --- /dev/null +++ b/ios/chrome/browser/ui/push_notification/push_notification_egtest.mm
@@ -0,0 +1,136 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <UserNotifications/UserNotifications.h> +#import <XCTest/XCTest.h> + +#import "base/strings/sys_string_conversions.h" +#import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/shared/model/prefs/pref_names.h" +#import "ios/chrome/browser/shared/public/features/features.h" +#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h" +#import "ios/chrome/browser/ui/content_suggestions/new_tab_page_app_interface.h" +#import "ios/chrome/browser/ui/content_suggestions/set_up_list/constants.h" +#import "ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ios/chrome/test/earl_grey/chrome_actions.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" +#import "ios/chrome/test/earl_grey/chrome_matchers.h" +#import "ios/chrome/test/earl_grey/chrome_test_case.h" +#import "ios/testing/earl_grey/app_launch_manager.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#import "ui/base/l10n/l10n_util.h" +#import "ui/strings/grit/ui_strings.h" + +namespace { + +// Long presses the view with the given `accessibility_id`. +void LongPressView(NSString* accessibility_id) { + id<GREYMatcher> matcher = grey_accessibilityID(accessibility_id); + [[EarlGrey selectElementWithMatcher:matcher] assertWithMatcher:grey_notNil()]; + [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_longPress()]; +} + +// Wait for a view that contains a partial match to the given `text`, then tap +// it. +void WaitForThenTapText(NSString* text) { + id item = chrome_test_util::ContainsPartialText(text); + [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:item]; + [[EarlGrey selectElementWithMatcher:item] performAction:grey_tap()]; +} + +// Taps a view containing a partial match to the given `text`. +void TapText(NSString* text) { + id item = grey_allOf(chrome_test_util::ContainsPartialText(text), + grey_sufficientlyVisible(), nil); + [[EarlGrey selectElementWithMatcher:item] performAction:grey_tap()]; +} + +// Taps the context menu item with the given label. +void TapMenuItem(int labelId) { + id item = chrome_test_util::ContextMenuItemWithAccessibilityLabelId(labelId); + [[EarlGrey selectElementWithMatcher:item] performAction:grey_tap()]; +} + +} // namespace + +@interface PushNotificationTestCase : ChromeTestCase +@end + +@implementation PushNotificationTestCase + +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + config.features_enabled.push_back(kIOSTipsNotifications); + config.features_enabled.push_back(kMagicStack); + return config; +} + ++ (void)setUpForTestCase { + [super setUpForTestCase]; + + [ChromeEarlGreyAppInterface writeFirstRunSentinel]; + [ChromeEarlGreyAppInterface clearDefaultBrowserPromoData]; + [ChromeEarlGrey resetDataForLocalStatePref: + prefs::kIosCredentialProviderPromoLastActionTaken]; + [NewTabPageAppInterface resetSetUpListPrefs]; +} + +// Tests that the settings page is dismissed by swiping down from the top. +- (void)testSetUpListMenuEnableNotifications { + // Swizzle to grant notification auth when requested. + ScopedNotificationAuthSwizzler auth(YES); + + // Long press the SetUpList module. + LongPressView(set_up_list::kDefaultBrowserItemID); + + // Tap the menu item to enable notifications. + TapText(@"Turn on Notifications"); + + // Tap the confirmation snackbar. + WaitForThenTapText(@"notifications turned on"); +} + +- (void)testSetUpListMenuEnableNotificationsAfterDeniedCancel { + // Swizzle in the "denied' auth status for notifications. + ScopedNotificationAuthSwizzler auth(UNAuthorizationStatusDenied, NO); + + // Long press the SetUpList module. + LongPressView(set_up_list::kDefaultBrowserItemID); + + // Tap the menu item to enable notifications. + TapText(@"Turn on Notifications"); + + // Tap cancel action. + TapMenuItem(IDS_IOS_NOTIFICATIONS_ALERT_CANCEL); +} + +- (void)testSetUpListMenuEnableNotificationsAfterDeniedGoToSettings { + // Swizzle in the "denied' auth status for notifications. + ScopedNotificationAuthSwizzler auth(UNAuthorizationStatusDenied, NO); + + // Long press the SetUpList module. + LongPressView(set_up_list::kDefaultBrowserItemID); + + // Tap the menu item to enable notifications. + TapText(@"Turn on Notifications"); + + // Tap Go To Settings action. + TapMenuItem(IDS_IOS_NOTIFICATIONS_ALERT_GO_TO_SETTINGS); + + // Verify that settings has opened, then close it. + XCUIApplication* settingsApp = [[XCUIApplication alloc] + initWithBundleIdentifier:@"com.apple.Preferences"]; + GREYAssertTrue([settingsApp waitForState:XCUIApplicationStateRunningForeground + timeout:5], + @"The iOS Settings app should have opened."); + [settingsApp terminate]; + + // Reactivate the app. + [[[XCUIApplication alloc] init] activate]; +} + +@end
diff --git a/ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.h b/ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.h new file mode 100644 index 0000000..c00ce7c --- /dev/null +++ b/ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.h
@@ -0,0 +1,34 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_PUSH_NOTIFICATION_SCOPED_NOTIFICATION_AUTH_SWIZZLER_H_ +#define IOS_CHROME_BROWSER_UI_PUSH_NOTIFICATION_SCOPED_NOTIFICATION_AUTH_SWIZZLER_H_ + +#import <memory> + +class EarlGreyScopedBlockSwizzler; + +// Class that allows swizzling the UNNotificationCenter's authorization status +// and authorization request response. +class ScopedNotificationAuthSwizzler { + public: + // Swizzles the auth status to return `initial_status`. If the app requests + // authorization, the status will change to "authorized" if `grant` is YES or + // to "denied" if `grant` is NO. + ScopedNotificationAuthSwizzler(UNAuthorizationStatus initial_status, + BOOL grant); + + // Swizzles an initial value of "Not Determined", and allows / disallows + // granting authorization when requested. + ScopedNotificationAuthSwizzler(BOOL grant); + + ~ScopedNotificationAuthSwizzler(); + + protected: + UNAuthorizationStatus status_; + std::unique_ptr<EarlGreyScopedBlockSwizzler> status_swizzler_; + std::unique_ptr<EarlGreyScopedBlockSwizzler> request_swizzler_; +}; + +#endif // IOS_CHROME_BROWSER_UI_PUSH_NOTIFICATION_SCOPED_NOTIFICATION_AUTH_SWIZZLER_H_
diff --git a/ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.mm b/ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.mm new file mode 100644 index 0000000..3c7dd0b6 --- /dev/null +++ b/ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.mm
@@ -0,0 +1,40 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <UserNotifications/UserNotifications.h> + +#import "ios/chrome/browser/ui/push_notification/scoped_notification_auth_swizzler.h" + +#import "ios/chrome/test/earl_grey/earl_grey_scoped_block_swizzler.h" + +ScopedNotificationAuthSwizzler::ScopedNotificationAuthSwizzler( + UNAuthorizationStatus initial_status, + BOOL grant) { + status_ = initial_status; + + // Swizzle the authorization status. + auto status_block = ^{ + return status_; + }; + status_swizzler_ = std::make_unique<EarlGreyScopedBlockSwizzler>( + @"UNNotificationSettings", @"authorizationStatus", status_block); + + // Swizzle the authorization request. + auto request_block = + ^(id center, UNAuthorizationOptions options, + void (^completionHandler)(BOOL granted, NSError* error)) { + status_ = grant ? UNAuthorizationStatusAuthorized + : UNAuthorizationStatusDenied; + completionHandler(grant, nil); + }; + request_swizzler_ = std::make_unique<EarlGreyScopedBlockSwizzler>( + @"UNUserNotificationCenter", + @"requestAuthorizationWithOptions:completionHandler:", request_block); +} + +ScopedNotificationAuthSwizzler::ScopedNotificationAuthSwizzler(BOOL grant) + : ScopedNotificationAuthSwizzler(UNAuthorizationStatusNotDetermined, + grant) {} + +ScopedNotificationAuthSwizzler::~ScopedNotificationAuthSwizzler() {}
diff --git a/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h b/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h index 0a8d927f..34ce77a 100644 --- a/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h +++ b/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h
@@ -5,6 +5,8 @@ #ifndef IOS_CHROME_BROWSER_UI_READING_LIST_IOS_ADD_TO_READING_LIST_INFOBAR_DELEGATE_H_ #define IOS_CHROME_BROWSER_UI_READING_LIST_IOS_ADD_TO_READING_LIST_INFOBAR_DELEGATE_H_ +#import "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "components/infobars/core/confirm_infobar_delegate.h" namespace web { @@ -55,7 +57,7 @@ // The URL of the page to be saved to Reading List. GURL url_; // The title of the page to be saved to Reading List. - const std::u16string& title_; + const raw_ref<const std::u16string> title_; // The estimated time to read of the page. int estimated_read_time_; // The score of the page measuring distilibility, a proxy for whether the @@ -64,9 +66,9 @@ // The score of the page measuring length of the page. double length_score_; // Reference to save `url_` to Reading List. - ReadingListModel* model_ = nullptr; + raw_ptr<ReadingListModel> model_ = nullptr; // WebState pointer that is showing `url_`. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; }; #endif // IOS_CHROME_BROWSER_UI_READING_LIST_IOS_ADD_TO_READING_LIST_INFOBAR_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.mm b/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.mm index eba2b8b..60e2064 100644 --- a/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.mm +++ b/ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.mm
@@ -80,7 +80,7 @@ } bool IOSAddToReadingListInfobarDelegate::Accept() { - model_->AddOrReplaceEntry(url_, base::UTF16ToUTF8(title_), + model_->AddOrReplaceEntry(url_, base::UTF16ToUTF8(title_.get()), reading_list::ADDED_VIA_CURRENT_APP, base::Minutes(estimated_read_time_)); ukm::SourceId sourceID = ukm::GetSourceIdForWebStateDocument(web_state_);
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm index 9c77ffc..77667c4 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/reading_list/reading_list_coordinator.h" #import "base/ios/ios_util.h" +#import "base/memory/raw_ptr.h" #import "base/memory/scoped_refptr.h" #import "base/metrics/histogram_macros.h" #import "base/metrics/user_metrics.h" @@ -113,13 +114,13 @@ // Handler for sign-in commands. id<ApplicationCommands> _applicationCommandsHandler; // Authentication Service to retrieve the user's signed-in state. - AuthenticationService* _authService; + raw_ptr<AuthenticationService> _authService; // Service to retrieve preference values. - PrefService* _prefService; + raw_ptr<PrefService> _prefService; // Manager for user's Google identities. - signin::IdentityManager* _identityManager; + raw_ptr<signin::IdentityManager> _identityManager; // Sync service. - syncer::SyncService* _syncService; + raw_ptr<syncer::SyncService> _syncService; // Coordinator of manage sync settings. ManageSyncSettingsCoordinator* _manageSyncSettingsCoordinator; }
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm index 1597e6ad..6387bb9 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm
@@ -6,6 +6,7 @@ #import <memory> +#import "base/memory/raw_ptr.h" #import "components/reading_list/core/reading_list_model.h" #import "components/reading_list/core/reading_list_model_observer.h" #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h" @@ -20,7 +21,7 @@ __weak id<ReadingListMenuNotificationDelegate> _delegate; // Keep a reference to detach before deallocing. - ReadingListModel* _readingListModel; // weak + raw_ptr<ReadingListModel> _readingListModel; // weak } // Detach the observer on the reading list.
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator_unittest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator_unittest.mm index 72b990e..1293e1e 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/scoped_feature_list.h" #import "components/autofill/core/browser/autofill_test_utils.h" @@ -49,7 +50,7 @@ web::WebTaskEnvironment task_environment_; IOSChromeScopedTestingLocalState local_state_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; - autofill::PersonalDataManager* personal_data_manager_; + raw_ptr<autofill::PersonalDataManager> personal_data_manager_; AutofillAddCreditCardMediator* add_credit_card_mediator_; id add_credit_card_mediator_delegate_mock_; };
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_edit_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_edit_table_view_controller.mm index 44cbff57..e5e92c8 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_edit_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_edit_table_view_controller.mm
@@ -7,6 +7,7 @@ #import "base/apple/foundation_util.h" #import "base/format_macros.h" #import "base/ios/block_types.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/autofill_data_util.h" #import "components/autofill/core/browser/data_model/credit_card.h" @@ -58,7 +59,7 @@ @end @implementation AutofillCreditCardEditTableViewController { - autofill::PersonalDataManager* _personalDataManager; // weak + raw_ptr<autofill::PersonalDataManager> _personalDataManager; // weak autofill::CreditCard _creditCard; }
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm index 5cf6d86..ecea560b 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
@@ -7,6 +7,7 @@ #import "base/apple/foundation_util.h" #import "base/check.h" #import "base/feature_list.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/metrics/payments/mandatory_reauth_metrics.h" @@ -80,9 +81,9 @@ PersonalDataManagerObserver, PopoverLabelViewControllerDelegate, SuccessfulReauthTimeAccessor> { - autofill::PersonalDataManager* _personalDataManager; + raw_ptr<autofill::PersonalDataManager> _personalDataManager; - Browser* _browser; + raw_ptr<Browser> _browser; std::unique_ptr<autofill::PersonalDataManagerObserverBridge> _observer; // Whether Settings have been dismissed.
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm index c38aa73b..b65d9f1 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
@@ -7,6 +7,7 @@ #import "base/apple/foundation_util.h" #import "base/check.h" #import "base/i18n/message_formatter.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" #import "base/strings/sys_string_conversions.h" @@ -76,9 +77,9 @@ AutofillProfileEditCoordinatorDelegate, PersonalDataManagerObserver, PopoverLabelViewControllerDelegate> { - autofill::PersonalDataManager* _personalDataManager; + raw_ptr<autofill::PersonalDataManager> _personalDataManager; - Browser* _browser; + raw_ptr<Browser> _browser; std::unique_ptr<autofill::PersonalDataManagerObserverBridge> _observer; // Deleting profiles updates PersonalDataManager resulting in an observer
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm index c5b714e..b0e4818 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_egtest.mm
@@ -341,6 +341,10 @@ // Cancel button is tapped. kReplaceSyncPromosWithSignInPromos is enabled. - (void) testUnsyncedDataDialogShowsInCaseOfUnsyncedReadingListEntry_SyncToSigninEnabled { + // TODO(crbug.com/1521690): Test fails on iPhone device and simulator. + if (![ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_DISABLED(@"Fails on iPhone."); + } FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGrey addFakeIdentity:fakeIdentity];
diff --git a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm index ce33734..890427d 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues/password_issues_coordinator.mm
@@ -74,7 +74,7 @@ PasswordDetailsCoordinator* _passwordDetails; // Password check manager to power mediator. - IOSChromePasswordCheckManager* _manager; + raw_ptr<IOSChromePasswordCheckManager> _manager; // Type of insecure credentials issues to display. password_manager::WarningType _warningType;
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm index b80f967..cb86d31a 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -6,6 +6,7 @@ #import "ios/chrome/browser/ui/settings/password/passwords_mediator+Testing.h" #import "base/apple/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "base/strings/string_piece.h" #import "base/strings/string_util.h" #import "base/strings/utf_string_conversions.h" @@ -186,7 +187,7 @@ scoped_refptr<IOSChromePasswordCheckManager> password_check_; FakePasswordsConsumer* consumer_; PasswordsMediator* mediator_; - feature_engagement::test::MockTracker* mock_tracker_; + raw_ptr<feature_engagement::test::MockTracker> mock_tracker_; }; // Consumer should be notified when passwords are changed.
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/privacy_guide/BUILD.gn index e714fed..9874118 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_guide/BUILD.gn +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/BUILD.gn
@@ -41,6 +41,8 @@ "privacy_guide_url_usage_view_controller.mm", "privacy_guide_url_usage_view_controller_delegate.h", "privacy_guide_url_usage_view_controller_presentation_delegate.h", + "privacy_guide_utils.h", + "privacy_guide_utils.mm", "privacy_guide_welcome_view_controller.h", "privacy_guide_welcome_view_controller.mm", ]
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.h b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.h index 7138dae..f942788 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.h +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.h
@@ -14,10 +14,13 @@ kPrivacyGuideHistorySyncStep, }; -// The accessibility identifier of the Privacy Guide History Sync step view. +// The accessibility identifier for the Privacy Guide History Sync switch. +extern NSString* const kPrivacyGuideHistorySyncSwitchID; + +// The accessibility identifier for the Privacy Guide History Sync step view. extern NSString* const kPrivacyGuideHistorySyncViewID; -// The accessibility identifier of the Privacy Guide wide navigation bar. +// The accessibility identifier for the Privacy Guide wide navigation bar. extern NSString* const kPrivacyGuideNavigationBarViewID; // The accessibility identifier for the URL usage switch.
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.mm b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.mm index 65c40d4..1f4268b6 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.mm
@@ -6,6 +6,8 @@ #import <Foundation/Foundation.h> +NSString* const kPrivacyGuideHistorySyncSwitchID = + @"kPrivacyGuideHistorySyncSwitchID"; NSString* const kPrivacyGuideHistorySyncViewID = @"kPrivacyGuideHistorySyncViewID"; NSString* const kPrivacyGuideNavigationBarViewID =
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_history_sync_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_history_sync_view_controller.mm index 314ae5f..d6b3fc8f 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_history_sync_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_history_sync_view_controller.mm
@@ -4,7 +4,16 @@ #import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_history_sync_view_controller.h" +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/shared/ui/elements/self_sizing_table_view.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_switch_cell.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" +#import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" +#import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_cell.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.h" +#import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h" @@ -13,9 +22,28 @@ NSString* const kHistorySyncBannerName = @"history_sync_illustration"; +enum SectionIdentifier { + kSectionIdentifierSwitch, + kSectionIdentifierWhenOn, + kSectionIdentifierThingsToConsider, +}; + +enum ItemIdentifier { + kItemIdentifierAcrossDevices, + kItemIdentifierGoogleAccount, + kItemIdentifierGoogleSearch, + kItemIdentifierSwitch, +}; + } // namespace -@implementation PrivacyGuideHistorySyncViewController +@interface PrivacyGuideHistorySyncViewController () <UITableViewDelegate> +@end + +@implementation PrivacyGuideHistorySyncViewController { + SelfSizingTableView* _tableView; + UITableViewDiffableDataSource<NSNumber*, NSNumber*>* _dataSource; +} #pragma mark - UIViewController @@ -31,6 +59,123 @@ self.subtitleBottomMargin = 0; [super viewDidLoad]; + + [self setupTableView]; + [self loadModel]; +} + +#pragma mark - UITableViewDelegate + +- (CGFloat)tableView:(UITableView*)tableView + heightForHeaderInSection:(NSInteger)section { + return section == kSectionIdentifierSwitch ? 0 + : UITableViewAutomaticDimension; +} + +- (UIView*)tableView:(UITableView*)tableView + viewForHeaderInSection:(NSInteger)section { + SectionIdentifier sectionIdentifier = static_cast<SectionIdentifier>( + [_dataSource sectionIdentifierForIndex:section].integerValue); + switch (sectionIdentifier) { + case kSectionIdentifierSwitch: + return nil; + case kSectionIdentifierWhenOn: { + return PrivacyGuideHeaderView(_tableView, + IDS_IOS_PRIVACY_GUIDE_WHEN_ON_HEADER); + } + case kSectionIdentifierThingsToConsider: { + return PrivacyGuideHeaderView( + _tableView, IDS_IOS_PRIVACY_GUIDE_THINGS_TO_CONSIDER_HEADER); + } + } +} + +#pragma mark - Private + +// Initializes a SelfSizingTableView, adds it to the view hierarchy and +// specifies its constraints. +- (void)setupTableView { + _tableView = PrivacyGuideTableView(); + _tableView.delegate = self; + + [self.specificContentView addSubview:_tableView]; + [NSLayoutConstraint activateConstraints:@[ + [_tableView.topAnchor + constraintEqualToAnchor:self.specificContentView.topAnchor], + [_tableView.leadingAnchor + constraintEqualToAnchor:self.specificContentView.leadingAnchor], + [_tableView.trailingAnchor + constraintEqualToAnchor:self.specificContentView.trailingAnchor], + [_tableView.bottomAnchor + constraintLessThanOrEqualToAnchor:self.specificContentView + .bottomAnchor], + ]]; +} + +// Initializes the data source and populates the initial snapshot. +- (void)loadModel { + __weak __typeof(self) weakSelf = self; + _dataSource = [[UITableViewDiffableDataSource alloc] + initWithTableView:_tableView + cellProvider:^UITableViewCell*(UITableView* tableView, + NSIndexPath* indexPath, + NSNumber* itemIdentifier) { + return + [weakSelf cellForTableView:tableView + indexPath:indexPath + itemIdentifier:static_cast<ItemIdentifier>( + itemIdentifier.integerValue)]; + }]; + + RegisterTableViewCell<TableViewSwitchCell>(_tableView); + RegisterTableViewCell<SettingsImageDetailTextCell>(_tableView); + RegisterTableViewHeaderFooter<TableViewTextHeaderFooterView>(_tableView); + + NSDiffableDataSourceSnapshot* snapshot = + [[NSDiffableDataSourceSnapshot alloc] init]; + + [snapshot appendSectionsWithIdentifiers:@[ @(kSectionIdentifierSwitch) ]]; + [snapshot appendItemsWithIdentifiers:@[ @(kItemIdentifierSwitch) ]]; + + [snapshot appendSectionsWithIdentifiers:@[ @(kSectionIdentifierWhenOn) ]]; + [snapshot appendItemsWithIdentifiers:@[ + @(kItemIdentifierAcrossDevices), @(kItemIdentifierGoogleSearch) + ]]; + + [snapshot + appendSectionsWithIdentifiers:@[ @(kSectionIdentifierThingsToConsider) ]]; + [snapshot appendItemsWithIdentifiers:@[ @(kItemIdentifierGoogleAccount) ]]; + + [_dataSource applySnapshot:snapshot animatingDifferences:NO]; +} + +// Returns the appropriate cell for the table view. +- (UITableViewCell*)cellForTableView:(UITableView*)tableView + indexPath:(NSIndexPath*)indexPath + itemIdentifier:(ItemIdentifier)itemIdentifier { + switch (itemIdentifier) { + case kItemIdentifierSwitch: { + TableViewSwitchCell* cell = + PrivacyGuideSwitchCell(_tableView, IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC, + YES, YES, kPrivacyGuideHistorySyncSwitchID); + return cell; + } + case kItemIdentifierAcrossDevices: { + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_ACROSS_DEVICES, + kClockSymbol); + } + case kItemIdentifierGoogleSearch: { + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_SEARCH, + kMagnifyingglassSymbol); + } + case kItemIdentifierGoogleAccount: { + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_HISTORY_SYNC_GOOGLE_ACCOUNT, + kLinkActionSymbol); + } + } } @end
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_url_usage_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_url_usage_view_controller.mm index bbaeae15..2e6cad25 100644 --- a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_url_usage_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_url_usage_view_controller.mm
@@ -16,15 +16,13 @@ #import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_constants.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_url_usage_view_controller_delegate.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_url_usage_view_controller_presentation_delegate.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h" namespace { NSString* const kURLUsageBannerName = @"url_usage_illustration"; -const CGFloat kSwitchCellCornerRadius = 12; -const CGFloat kSymbolSize = 20; enum SectionIdentifier { kSectionIdentifierSwitch, @@ -93,22 +91,12 @@ case kSectionIdentifierSwitch: return nil; case kSectionIdentifierWhenOn: { - TableViewTextHeaderFooterView* header = - DequeueTableViewHeaderFooter<TableViewTextHeaderFooterView>( - tableView); - header.textLabel.text = - l10n_util::GetNSString(IDS_IOS_PRIVACY_GUIDE_WHEN_ON_HEADER); - [header setSubtitle:nil]; - return header; + return PrivacyGuideHeaderView(_tableView, + IDS_IOS_PRIVACY_GUIDE_WHEN_ON_HEADER); } case kSectionIdentifierThingsToConsider: { - TableViewTextHeaderFooterView* header = - DequeueTableViewHeaderFooter<TableViewTextHeaderFooterView>( - tableView); - header.textLabel.text = l10n_util::GetNSString( - IDS_IOS_PRIVACY_GUIDE_THINGS_TO_CONSIDER_HEADER); - [header setSubtitle:nil]; - return header; + return PrivacyGuideHeaderView( + _tableView, IDS_IOS_PRIVACY_GUIDE_THINGS_TO_CONSIDER_HEADER); } } } @@ -129,17 +117,8 @@ // Initializes a SelfSizingTableView, adds it to the view hierarchy and // specifies its constraints. - (void)setupTableView { - _tableView = - [[SelfSizingTableView alloc] initWithFrame:CGRectZero - style:ChromeTableViewStyle()]; + _tableView = PrivacyGuideTableView(); _tableView.delegate = self; - _tableView.translatesAutoresizingMaskIntoConstraints = NO; - _tableView.alwaysBounceVertical = NO; - _tableView.backgroundColor = [UIColor clearColor]; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - _tableView.separatorInset = UIEdgeInsetsZero; - [_tableView setLayoutMargins:UIEdgeInsetsZero]; - _tableView.sectionHeaderTopPadding = 0; [self.specificContentView addSubview:_tableView]; [NSLayoutConstraint activateConstraints:@[ @@ -200,68 +179,38 @@ itemIdentifier:(ItemIdentifier)itemIdentifier { switch (itemIdentifier) { case kItemIdentifierSwitch: { - TableViewSwitchCell* cell = - DequeueTableViewCell<TableViewSwitchCell>(tableView); - NSString* title = l10n_util::GetNSString( - IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_TEXT); - [cell configureCellWithTitle:title - subtitle:nil - switchEnabled:YES - on:_URLUsageEnabled]; - [cell setUseCustomSeparator:NO]; - cell.textLabel.font = - [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; - cell.textLabel.numberOfLines = 0; - cell.textLabel.adjustsFontForContentSizeCategory = YES; - cell.backgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor]; - cell.layer.cornerRadius = kSwitchCellCornerRadius; - cell.accessibilityIdentifier = kPrivacyGuideURLUsageSwitchID; + TableViewSwitchCell* cell = PrivacyGuideSwitchCell( + _tableView, + IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_TEXT, YES, + _URLUsageEnabled, kPrivacyGuideURLUsageSwitchID); [cell.switchView addTarget:self action:@selector(URLUsageSwitchChanged:) forControlEvents:UIControlEventValueChanged]; return cell; } case kItemIdentifierBrowseFaster: { - return [self privacyGuideExplanationCell: - IDS_IOS_PRIVACY_GUIDE_URL_USAGE_BROWSER_FASTER - symbolName:kBoltSymbol]; + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_URL_USAGE_BROWSER_FASTER, + kBoltSymbol); } case kItemIdentifierImprovedSuggestions: { - return [self privacyGuideExplanationCell: - IDS_IOS_PRIVACY_GUIDE_URL_USAGE_IMPROVED_SUGGESTIONS - symbolName:kLightBulbSymbol]; + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_URL_USAGE_IMPROVED_SUGGESTIONS, + kLightBulbSymbol); } case kItemIdentifierPredictSites: { - return [self privacyGuideExplanationCell: - IDS_IOS_PRIVACY_GUIDE_URL_USAGE_PREDICT_SITES - symbolName:kLinkActionSymbol]; + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_URL_USAGE_PREDICT_SITES, + kLinkActionSymbol); } case kItemIdentifierUsageReport: { - return [self privacyGuideExplanationCell: - IDS_IOS_PRIVACY_GUIDE_URL_USAGE_USAGE_REPORT - symbolName:kShareSymbol]; + return PrivacyGuideExplanationCell( + _tableView, IDS_IOS_PRIVACY_GUIDE_URL_USAGE_USAGE_REPORT, + kShareSymbol); } } } -// Formats a Privacy Guide explanation cell and sets the corresponding text and -// symbol. -- (SettingsImageDetailTextCell*)privacyGuideExplanationCell:(int)textID - symbolName: - (NSString*)symbolName { - // TODO(crbug.com/1519511): Remove the default insets in the - // SettingsImageDetailTextCell. - SettingsImageDetailTextCell* cell = - DequeueTableViewCell<SettingsImageDetailTextCell>(_tableView); - cell.image = DefaultSymbolWithPointSize(symbolName, kSymbolSize); - cell.detailTextLabel.text = l10n_util::GetNSString(textID); - cell.detailTextLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; - [cell setImageViewTintColor:[UIColor colorNamed:kTextSecondaryColor]]; - [cell alignImageWithFirstLineOfText:YES]; - [cell setUseCustomSeparator:NO]; - return cell; -} - // Called when the switch is tapped. - (void)URLUsageSwitchChanged:(UISwitch*)sender { [self.modelDelegate didEnableURLUsage:sender.isOn];
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.h b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.h new file mode 100644 index 0000000..7a252e49 --- /dev/null +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.h
@@ -0,0 +1,39 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_PRIVACY_GUIDE_PRIVACY_GUIDE_UTILS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_PRIVACY_GUIDE_PRIVACY_GUIDE_UTILS_H_ + +#import <UIKit/UIKit.h> + +@class SettingsImageDetailTextCell; +@class SelfSizingTableView; +@class TableViewSwitchCell; +@class TableViewTextHeaderFooterView; + +// Dequeues a SettingsImageDetailTextCell from the table view and configures it +// appropriately for the Privacy Guide. +SettingsImageDetailTextCell* PrivacyGuideExplanationCell( + UITableView* table_view, + int text_id, + NSString* symbol_name); + +// Dequeues a TableViewSwitchCell from the table view and configures it +// appropriately for the Privacy Guide. +TableViewSwitchCell* PrivacyGuideSwitchCell(UITableView* table_view, + int text_id, + BOOL switch_enabled, + BOOL switch_on, + NSString* switch_id); + +// Dequeues a TableViewTextHeaderFooterView from the table view and configures +// it appropriately for the Privacy Guide. +TableViewTextHeaderFooterView* PrivacyGuideHeaderView(UITableView* table_view, + int text_id); + +// Creates a SelfSizingTableView and configures is appropriately for the Privacy +// Guide. +SelfSizingTableView* PrivacyGuideTableView(); + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_PRIVACY_GUIDE_PRIVACY_GUIDE_UTILS_H_
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.mm b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.mm new file mode 100644 index 0000000..bded5d11 --- /dev/null +++ b/ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.mm
@@ -0,0 +1,92 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/settings/privacy/privacy_guide/privacy_guide_utils.h" + +#import <UIKit/UIKit.h> + +#import "ios/chrome/browser/shared/ui/elements/self_sizing_table_view.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_switch_cell.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" +#import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" +#import "ios/chrome/browser/ui/settings/cells/settings_image_detail_text_cell.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ui/base/l10n/l10n_util_mac.h" + +namespace { + +const CGFloat kSymbolSize = 20; +const CGFloat kSwitchCellCornerRadius = 12; + +} // namespace + +SettingsImageDetailTextCell* PrivacyGuideExplanationCell( + UITableView* table_view, + int text_id, + NSString* symbol_name) { + // TODO(crbug.com/1519511): Remove the default insets in the + // SettingsImageDetailTextCell. + SettingsImageDetailTextCell* cell = + DequeueTableViewCell<SettingsImageDetailTextCell>(table_view); + + cell.image = DefaultSymbolWithPointSize(symbol_name, kSymbolSize); + cell.detailTextLabel.text = l10n_util::GetNSString(text_id); + cell.detailTextLabel.textColor = [UIColor colorNamed:kTextSecondaryColor]; + [cell setImageViewTintColor:[UIColor colorNamed:kTextSecondaryColor]]; + [cell alignImageWithFirstLineOfText:YES]; + [cell setUseCustomSeparator:NO]; + + return cell; +} + +TableViewSwitchCell* PrivacyGuideSwitchCell(UITableView* table_view, + int text_id, + BOOL switch_enabled, + BOOL switch_on, + NSString* accessibility_id) { + TableViewSwitchCell* cell = + DequeueTableViewCell<TableViewSwitchCell>(table_view); + + NSString* title = l10n_util::GetNSString(text_id); + [cell configureCellWithTitle:title + subtitle:nil + switchEnabled:switch_enabled + on:switch_on]; + [cell setUseCustomSeparator:NO]; + cell.textLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + cell.textLabel.numberOfLines = 0; + cell.textLabel.adjustsFontForContentSizeCategory = YES; + cell.backgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor]; + cell.layer.cornerRadius = kSwitchCellCornerRadius; + cell.accessibilityIdentifier = accessibility_id; + + return cell; +} + +TableViewTextHeaderFooterView* PrivacyGuideHeaderView(UITableView* table_view, + int text_id) { + TableViewTextHeaderFooterView* header = + DequeueTableViewHeaderFooter<TableViewTextHeaderFooterView>(table_view); + header.textLabel.text = l10n_util::GetNSString(text_id); + [header setSubtitle:nil]; + return header; +} + +SelfSizingTableView* PrivacyGuideTableView() { + SelfSizingTableView* tableView = + [[SelfSizingTableView alloc] initWithFrame:CGRectZero + style:ChromeTableViewStyle()]; + + tableView.translatesAutoresizingMaskIntoConstraints = NO; + tableView.alwaysBounceVertical = NO; + tableView.backgroundColor = [UIColor clearColor]; + tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + tableView.separatorInset = UIEdgeInsetsZero; + [tableView setLayoutMargins:UIEdgeInsetsZero]; + tableView.sectionHeaderTopPadding = 0; + + return tableView; +}
diff --git a/ios/chrome/browser/ui/settings/supervised_user_settings_app_interface.mm b/ios/chrome/browser/ui/settings/supervised_user_settings_app_interface.mm index 7757a94..9c304da 100644 --- a/ios/chrome/browser/ui/settings/supervised_user_settings_app_interface.mm +++ b/ios/chrome/browser/ui/settings/supervised_user_settings_app_interface.mm
@@ -8,6 +8,7 @@ #import "base/memory/singleton.h" #import "components/prefs/pref_service.h" #import "components/signin/public/identity_manager/identity_manager.h" +#import "components/supervised_user/core/browser/kids_chrome_management_url_checker_client.h" #import "components/supervised_user/core/browser/permission_request_creator.h" #import "components/supervised_user/core/browser/permission_request_creator_mock.h" #import "components/supervised_user/core/browser/proto/kidschromemanagement_messages.pb.h" @@ -225,8 +226,12 @@ supervised_user::SupervisedUserService* supervised_user_service = SupervisedUserServiceFactory::GetForBrowserState(browser_state); - supervised_user_service->GetURLFilter()->InitAsyncURLChecker( - identity_manager, shared_url_loader_factory); + + std::unique_ptr<safe_search_api::URLCheckerClient> url_checker_client = + std::make_unique<supervised_user::KidsChromeManagementURLCheckerClient>( + identity_manager, shared_url_loader_factory, /*country=*/""); + supervised_user_service->GetURLFilter()->SetURLCheckerClientForTesting( + std::move(url_checker_client)); } + (void)setUpTestUrlLoaderFactoryHelper {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h index e5bda375..68350f1 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_mediator_test.h
@@ -9,6 +9,7 @@ #import <vector> +#import "base/memory/raw_ptr.h" #import "base/test/metrics/user_action_tester.h" #import "base/test/scoped_feature_list.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" @@ -60,9 +61,9 @@ web::WebStateID original_selected_identifier_; __strong SceneState* scene_state_; std::unique_ptr<Browser> browser_; - BrowserList* browser_list_; + raw_ptr<BrowserList> browser_list_; base::UserActionTester user_action_tester_; - AuthenticationService* auth_service_; + raw_ptr<AuthenticationService> auth_service_; FakeTabGridToolbarsMediator* fake_toolbars_mediator_; };
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm index 5e6ba03d..a7b8cb1e 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_utils.h" +#import "base/memory/raw_ptr.h" #import "base/numerics/safe_conversions.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" @@ -42,7 +43,7 @@ web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<TestBrowser> browser_; - WebStateList* web_state_list_; + raw_ptr<WebStateList> web_state_list_; }; TEST_F(GridUtilsTest, CreateValidItemsList) {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm index 005faa2..c1406ff 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator_unittest.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/regular/regular_grid_mediator.h" #import "base/containers/contains.h" +#import "base/memory/raw_ptr.h" #import "components/policy/core/common/policy_pref_names.h" #import "components/sessions/core/tab_restore_service.h" #import "components/sync_preferences/testing_pref_service_syncable.h" @@ -50,7 +51,7 @@ protected: RegularGridMediator* mediator_ = nullptr; - sessions::TabRestoreService* tab_restore_service_ = nullptr; + raw_ptr<sessions::TabRestoreService> tab_restore_service_ = nullptr; }; #pragma mark - Command tests
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/tab_groups/tab_group_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/tab_groups/tab_group_mediator.mm index 7ce0f95b..93d5dc7 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/tab_groups/tab_group_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/tab_groups/tab_group_mediator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/tab_groups/tab_group_mediator.h" #import "base/check.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_collection_consumer.h" @@ -16,7 +17,7 @@ @implementation TabGroupMediator { // Web state list which contains groups. - WebStateList* _webStateList; + raw_ptr<WebStateList> _webStateList; // Tab group consumer. __weak id<TabGroupConsumer> _consumer; // Grid consumer.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_mediator.mm index 8a97cf86..e046e216 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_mediator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_button_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/notreached.h" #import "base/scoped_observation.h" #import "components/prefs/ios/pref_observer_bridge.h" @@ -26,12 +27,12 @@ // The UI consumer to which updates are made. __weak id<InactiveTabsInfoConsumer> _consumer; // The list of inactive tabs. - WebStateList* _webStateList; + raw_ptr<WebStateList> _webStateList; // Observers of _webStateList. std::unique_ptr<WebStateListObserverBridge> _webStateListObserverBridge; std::unique_ptr<ScopedWebStateListObservation> _scopedWebStateListObservation; // Preference service from the application context. - PrefService* _prefService; + raw_ptr<PrefService> _prefService; // Pref observer to track changes to prefs. std::unique_ptr<PrefObserverBridge> _prefObserverBridge; // Registrar for pref changes notifications.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_mediator.mm index cba0a9d..f325de9 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_mediator.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/notreached.h" #import "base/scoped_multi_source_observation.h" #import "base/scoped_observation.h" @@ -84,7 +85,7 @@ SnapshotStorageObserver, WebStateListObserving> { // The list of inactive tabs. - WebStateList* _webStateList; + raw_ptr<WebStateList> _webStateList; // The snapshot storage of _webStateList. __weak SnapshotStorage* _snapshotStorage; // The observers of _webStateList. @@ -94,7 +95,7 @@ std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; std::unique_ptr<ScopedWebStateObservation> _scopedWebStateObservation; // Preference service from the application context. - PrefService* _prefService; + raw_ptr<PrefService> _prefService; // Pref observer to track changes to prefs. std::unique_ptr<PrefObserverBridge> _prefObserverBridge; // Registrar for pref changes notifications.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm index 396bfd4..06d6a37 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/tests/pinned_tabs_mediator_unittest.mm
@@ -6,6 +6,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/pinned_tabs/pinned_tabs_mediator.h" +#import "base/memory/raw_ptr.h" #import "base/test/scoped_feature_list.h" #import "base/test/task_environment.h" #import "ios/chrome/browser/drag_and_drop/model/drag_item_util.h" @@ -91,7 +92,7 @@ private: base::test::TaskEnvironment task_environment_; base::test::ScopedFeatureList feature_list_; - BrowserList* browser_list_; + raw_ptr<BrowserList> browser_list_; std::unique_ptr<TestChromeBrowserState> browser_state_; };
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm index f1c9b8e..8a45f81 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -6,6 +6,7 @@ #import "base/apple/bundle_locations.h" #import "base/apple/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_functions.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" @@ -152,11 +153,11 @@ TabPresentationDelegate> { // Use an explicit ivar instead of synthesizing as the setter isn't using the // ivar. - Browser* _incognitoBrowser; + raw_ptr<Browser> _incognitoBrowser; // Browser that contain tabs, from the regular browser, that have not been // open since a certain amount of time. - Browser* _inactiveBrowser; + raw_ptr<Browser> _inactiveBrowser; // The coordinator that shows the bookmarking UI after the user taps the Add // to Bookmarks button. @@ -310,7 +311,7 @@ // Ensure browser which is actually used by the incognito coordinator is // returned, as it may have been updated. return _incognitoGridCoordinator ? _incognitoGridCoordinator.browser - : _incognitoBrowser; + : _incognitoBrowser.get(); } - (void)setIncognitoBrowser:(Browser*)incognitoBrowser {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm index c7646a8b..3877b7409 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator_unittest.mm
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> #import "base/apple/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" #import "base/test/metrics/histogram_tester.h" @@ -197,7 +198,7 @@ std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; // Model for bookmarks. - bookmarks::BookmarkModel* bookmark_model_; + raw_ptr<bookmarks::BookmarkModel> bookmark_model_; // Browser for the coordinator. std::unique_ptr<Browser> browser_;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm index 773d4011..54a2ee8 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.h" #import "base/feature_list.h" +#import "base/memory/raw_ptr.h" #import "base/metrics/histogram_macros.h" #import "components/feature_engagement/public/event_constants.h" #import "components/feature_engagement/public/tracker.h" @@ -28,9 +29,9 @@ // Current selected grid. id<TabGridPageMutator> _currentPageMutator; // Preference service from the application context. - PrefService* _prefService; + raw_ptr<PrefService> _prefService; // Feature engagement tracker. - feature_engagement::Tracker* _engagementTracker; + raw_ptr<feature_engagement::Tracker> _engagementTracker; // Pref observer to track changes to prefs. std::unique_ptr<PrefObserverBridge> _prefObserverBridge; // Registrar for pref changes notifications.
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/test/tab_strip_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/test/tab_strip_mediator_unittest.mm index c4de665b..c16e5ad 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/test/tab_strip_mediator_unittest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/test/tab_strip_mediator_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_strip/coordinator/tab_strip_mediator.h" +#import "base/memory/raw_ptr.h" #import "components/favicon/core/favicon_service.h" #import "components/favicon/core/favicon_url.h" #import "components/favicon/ios/web_favicon_driver.h" @@ -109,7 +110,7 @@ web::WebTaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<TestBrowser> browser_; - WebStateList* web_state_list_; + raw_ptr<WebStateList> web_state_list_; TabStripMediator* mediator_; FakeTabStripConsumer* consumer_; };
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.h index 9129dd55..eb21102 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.h
@@ -45,6 +45,9 @@ // Sets the favicon for the page. Passing nil sets the default image. - (void)setFaviconImage:(UIImage*)image; +// Sets the height of the separators. +- (void)setSeparatorsHeight:(CGFloat)height; + @end #endif // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_STRIP_UI_TAB_STRIP_CELL_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.mm b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.mm index bcc923f..a418c0b 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_cell.mm
@@ -32,7 +32,7 @@ const CGFloat kSeparatorCornerRadius = 1; const CGFloat kSeparatorHeight = 18; const CGFloat kSeparatorHorizontalInset = 2; -const CGFloat kSeparatorGradientWidth = 8; +const CGFloat kSeparatorGradientWidth = 4; // Content view constants. const CGFloat kFaviconLeadingMargin = 10; @@ -85,12 +85,17 @@ // Gradient view's constraints. NSLayoutConstraint* _titleGradientViewLeadingConstraint; NSLayoutConstraint* _titleGradientViewTrailingConstraint; + + // Separator height constraints. + NSArray<NSLayoutConstraint*>* _separatorHeightConstraints; + CGFloat _separatorHeight; } - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { self.layer.masksToBounds = NO; _decorationLayersUpdated = NO; + _separatorHeight = 0; UIView* contentView = self.contentView; contentView.layer.masksToBounds = YES; @@ -240,6 +245,22 @@ [self updateCollapsedState]; } +- (void)setSeparatorsHeight:(CGFloat)height { + if (_separatorHeight == height) { + return; + } + _separatorHeight = height; + + if (_separatorHeightConstraints) { + [NSLayoutConstraint deactivateConstraints:_separatorHeightConstraints]; + } + _separatorHeightConstraints = @[ + [_leadingSeparatorView.heightAnchor constraintEqualToConstant:height], + [_trailingSeparatorView.heightAnchor constraintEqualToConstant:height], + ]; + [NSLayoutConstraint activateConstraints:_separatorHeightConstraints]; +} + #pragma mark - UICollectionViewCell - (void)applyLayoutAttributes: @@ -472,8 +493,6 @@ constant:-kSeparatorHorizontalInset], [_leadingSeparatorView.widthAnchor constraintEqualToConstant:kSeparatorWidth], - [_leadingSeparatorView.heightAnchor - constraintEqualToConstant:kSeparatorHeight], [_leadingSeparatorView.centerYAnchor constraintEqualToAnchor:contentView.centerYAnchor], ]]; @@ -485,12 +504,12 @@ constant:kSeparatorHorizontalInset], [_trailingSeparatorView.widthAnchor constraintEqualToConstant:kSeparatorWidth], - [_trailingSeparatorView.heightAnchor - constraintEqualToConstant:kSeparatorHeight], [_trailingSeparatorView.centerYAnchor constraintEqualToAnchor:contentView.centerYAnchor], ]]; + [self setSeparatorsHeight:kSeparatorHeight]; + /// `_leadingSeparatorGradientView` constraints. [NSLayoutConstraint activateConstraints:@[ [_leadingSeparatorGradientView.leadingAnchor
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift index 0a5ab93..d815c283 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_constants.swift
@@ -37,4 +37,13 @@ static let symbolPointSize: CGFloat = 16 } + /// Animated separator constants. + struct AnimatedSeparator { + static let regularSeparatorHeight: CGFloat = 18 + static let minSeparatorHeight: CGFloat = 12 + // The Cell separator is animated below this threshold. + static let collapseHorizontalInsetThreshold: CGFloat = 8 + static let collapseHorizontalInset: CGFloat = 6 + } + }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift index 998de9d..fa14171 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift +++ b/ios/chrome/browser/ui/tab_switcher/tab_strip/ui/tab_strip_layout.swift
@@ -129,101 +129,127 @@ let collectionView = collectionView else { return nil } - let contentOffset = collectionView.contentOffset - var frame = layoutAttributes.frame - let collectionViewSizeWidth = collectionView.bounds.size.width - - // The selected cell should remain on top of other cells within collection - // view's bounds. - if indexPath == selectedIndexPath || indexPathsOfInsertingItems.contains(indexPath) { - if let cell = collectionView.cellForItem(at: indexPath) as? TabStripCell { - // Update cell separators. - cell.leadingSeparatorHidden = true - cell.trailingSeparatorHidden = true - cell.leadingSeparatorGradientViewHidden = true - cell.trailingSeparatorGradientViewHidden = true - } - - var origin = layoutAttributes.frame.origin - - // Update the cell's origin horizontally to prevent it from being - // partially hidden off-screen. - let maxOriginX = collectionViewSizeWidth - frame.size.width - sectionInset.right - // Check the left side. - origin.x = max(origin.x, contentOffset.x + sectionInset.left) - // Check the right side. - origin.x = min(origin.x, contentOffset.x + maxOriginX) - - layoutAttributes.frame = CGRect(origin: origin, size: frame.size) - return layoutAttributes + /// Early return the updated `selectedAttributes` if the cell is selected. + if let selectedAttributes = self.layoutAttributesForSelectedCell( + layoutAttributes: layoutAttributes) + { + return selectedAttributes } guard let cell = collectionView.cellForItem(at: indexPath) as? TabStripCell else { return layoutAttributes } - let leftBounds: CGFloat = contentOffset.x + sectionInset.left - let rightBounds: CGFloat = collectionViewSizeWidth + contentOffset.x - sectionInset.right - let isRTL: Bool = collectionView.effectiveUserInterfaceLayoutDirection == .rightToLeft - let isScrollable: Bool = collectionView.contentSize.width > collectionView.frame.width + let contentOffset = collectionView.contentOffset + var frame = layoutAttributes.frame + let collectionViewWidth = collectionView.bounds.size.width - // If the cell is out of bounds, hide it and early return. - if leftBounds > frame.maxX || rightBounds < frame.minX { - layoutAttributes.isHidden = true - return layoutAttributes - } + let leftBounds: CGFloat = contentOffset.x + sectionInset.left + let rightBounds: CGFloat = collectionViewWidth + contentOffset.x - sectionInset.right + let isScrollable: Bool = collectionView.contentSize.width > collectionView.frame.width + let isRTL: Bool = collectionView.effectiveUserInterfaceLayoutDirection == .rightToLeft /// Hide the `trailingSeparator`if the next cell is selected. let isNextCellSelected = (indexPath.item + 1) == selectedIndexPath?.item cell.trailingSeparatorHidden = isNextCellSelected + /// Hide the `leadingSeparator` if the previous cell is selected or the /// collection view is not scrollable. let isPreviousCellSelected = (indexPath.item - 1) == selectedIndexPath?.item cell.leadingSeparatorHidden = isPreviousCellSelected || !isScrollable - // Recalculate the cell width and origin when it intersects with the left - // collection view's bounds. The cell should collapse within the collection - // view's bounds until its width reaches 0. - if frame.minX < leftBounds { - frame.origin.x = max(leftBounds, frame.origin.x) - let offsetLeft: CGFloat = abs(frame.origin.x - layoutAttributes.frame.origin.x) - frame.size.width = min(frame.width - offsetLeft, frame.width) - } + /// Recalculate the cell width and origin when it intersects with the left + /// collection view's bounds. The cell should collapse within the collection + /// view's bounds until its width reaches 0. Its `separatorHeight` is also + /// reduced when the cell reached an edege. + var separatorHeight = TabStripConstants.AnimatedSeparator.regularSeparatorHeight + if isScrollable && (frame.minX < leftBounds || frame.maxX > rightBounds) { + // Show leading and trailing gradient. + cell.leadingSeparatorGradientViewHidden = false + cell.trailingSeparatorGradientViewHidden = false - // Recalculate the cell width when it intersects with the left collection - // view's bounds. The cell should collapse within the collection view's - // bounds until its width reaches 0. - if frame.minX < rightBounds { - frame.size.width = min(rightBounds - frame.origin.x, frame.size.width) - } + let collapseThreshold = TabStripConstants.AnimatedSeparator.collapseHorizontalInsetThreshold + let collapseHorizontalInset = TabStripConstants.AnimatedSeparator.collapseHorizontalInset - /// Show the approriaite `separatorGradientView` before the cell intersects - /// with the collection view's bounds. - if isScrollable { - if (frame.minX - TabStripConstants.TabItem.leadingSeparatorMinInset) <= leftBounds { - if !isRTL { - cell.trailingSeparatorGradientViewHidden = false - } else { - cell.leadingSeparatorGradientViewHidden = false - /// Hide the `trailingSeparatorGradientView` before it intersects with - /// the `leadingSeparatorGradientView`. - cell.trailingSeparatorGradientViewHidden = - (frame.maxX - TabStripConstants.TabItem.leadingSeparatorMinInset) <= leftBounds + // If intersects with the left bounds. + if frame.minX < leftBounds { + + // Update the frame origin and width. + frame.origin.x = max(leftBounds, frame.origin.x) + let offsetLeft: CGFloat = abs(frame.origin.x - layoutAttributes.frame.origin.x) + frame.size.width = min(frame.size.width - offsetLeft, frame.size.width) + + /// Start animating the cell out of the collection view if the new + /// width `frame.size.width` is less than or equal to + /// `collapseThreshold`. + if frame.size.width <= collapseThreshold { + + // Update the size of the separator. + separatorHeight = calculateSeparatorsHeight(for: frame.size.width) + + // Move the cell to the left until it reaches its final position. + frame.origin.x = max( + frame.origin.x - collapseThreshold + frame.size.width, + leftBounds - collapseHorizontalInset) + + // Update its alpha value. + layoutAttributes.alpha = calculateAlphaValue(for: abs(frame.size.width)) + + // Set its width to 0 and update its separators. + frame.size.width = 0 + if !isRTL { + cell.trailingSeparatorHidden = true + } else { + cell.leadingSeparatorHidden = true + } + cell.leadingSeparatorGradientViewHidden = true + cell.trailingSeparatorGradientViewHidden = true } } - if rightBounds <= (frame.maxX + TabStripConstants.TabItem.leadingSeparatorMinInset) { - if !isRTL { - cell.leadingSeparatorGradientViewHidden = false - /// Hide the `trailingSeparatorGradientView` before it intersects with - /// the `leadingSeparatorGradientView`. - cell.trailingSeparatorGradientViewHidden = - (frame.minX + TabStripConstants.TabItem.leadingSeparatorMinInset) >= rightBounds - } else { - cell.trailingSeparatorGradientViewHidden = false + + // If intersects with the right bounds. + else if frame.maxX > rightBounds { + + // Update the frame origin and width. + frame.origin.x = min(rightBounds, frame.origin.x) + frame.size.width = min(rightBounds - frame.origin.x, frame.size.width) + + /// Start animating the cell out of the collection view if the new + /// width `frame.size.width` is less than or equal to + /// `collapseThreshold`. + if frame.size.width <= collapseThreshold { + + // Update the size of the separator. + separatorHeight = calculateSeparatorsHeight(for: frame.size.width) + + // Move the cell to the right until it reaches its final position. + frame.origin.x = min( + frame.origin.x + collapseThreshold - frame.size.width, + rightBounds + collapseHorizontalInset) + + // Update its alpha value. + let offset = layoutAttributes.frame.minX - frame.minX + collapseHorizontalInset + layoutAttributes.alpha = calculateAlphaValue(for: offset) + + // Update its width. + frame.size.width = max( + min(rightBounds + collapseHorizontalInset - frame.origin.x, frame.size.width), 0) + + // Update its separators. + if !isRTL { + cell.leadingSeparatorHidden = true + } else { + cell.trailingSeparatorHidden = true + } + cell.leadingSeparatorGradientViewHidden = true + cell.trailingSeparatorGradientViewHidden = true } } } + // Update separators height once the computation is done. + cell.setSeparatorsHeight(separatorHeight) + layoutAttributes.frame = frame return layoutAttributes } @@ -253,6 +279,78 @@ // MARK: - Private + /// Updates and returns the given `layoutAttributes` if the cell is selected. + /// Inserted items are considered as selected. + private func layoutAttributesForSelectedCell(layoutAttributes: UICollectionViewLayoutAttributes) + -> UICollectionViewLayoutAttributes? + { + guard let collectionView = collectionView + else { return nil } + // The selected cell should remain on top of other cells within collection + // view's bounds. + let indexPath = layoutAttributes.indexPath + guard + indexPath == selectedIndexPath || indexPathsOfInsertingItems.contains(indexPath) + else { + return nil + } + + if let cell = collectionView.cellForItem(at: indexPath) as? TabStripCell { + // Update cell separators. + cell.leadingSeparatorHidden = true + cell.trailingSeparatorHidden = true + cell.leadingSeparatorGradientViewHidden = true + cell.trailingSeparatorGradientViewHidden = true + } + + let collectionViewWidth = collectionView.bounds.size.width + let horizontalOffset = collectionView.contentOffset.x + let frame = layoutAttributes.frame + var origin = layoutAttributes.frame.origin + + // Update the cell's origin horizontally to prevent it from being + // partially hidden off-screen. + + // Check the left side. + let minOringin = horizontalOffset + sectionInset.left + origin.x = max(origin.x, minOringin) + // Check the right side. + let maxOrigin = + horizontalOffset + collectionViewWidth - frame.size.width - sectionInset.right + origin.x = min(origin.x, maxOrigin) + + layoutAttributes.frame = CGRect(origin: origin, size: frame.size) + return layoutAttributes + } + + /// This function calculates the separator height value for a given + /// `frameWidth`. The returned value will always be within the range of + /// `regularSeparatorHeight` and `minSeparatorHeight`. + private func calculateSeparatorsHeight(for frameWidth: CGFloat) -> CGFloat { + let regularHeight = TabStripConstants.AnimatedSeparator.regularSeparatorHeight + let separatorHeight = min( + regularHeight, + regularHeight + frameWidth + - TabStripConstants.AnimatedSeparator.collapseHorizontalInsetThreshold) + return max(TabStripConstants.AnimatedSeparator.minSeparatorHeight, separatorHeight) + } + + /// Calculates the alpha value for the given `offset`. + private func calculateAlphaValue(for offset: CGFloat) -> CGFloat { + var alpha: CGFloat = 1 + + /// If the sum of `offset` and `collapseHorizontalInset` exceeds + /// the `tabCellSize.width`, that means the cell will almost disappear from + /// the collection view. Its alpha value should be reduced. + let distance = + offset + TabStripConstants.AnimatedSeparator.collapseHorizontalInset - tabCellSize.width + if distance > 0 { + alpha = 1 / distance + } + + return alpha + } + // Calculates the dynamic size of a tab according to the number of tabs and // groups. private func calculateTabCellSize() {
diff --git a/ios/chrome/browser/upgrade/model/upgrade_center.mm b/ios/chrome/browser/upgrade/model/upgrade_center.mm index 94cb81c5..3855772 100644 --- a/ios/chrome/browser/upgrade/model/upgrade_center.mm +++ b/ios/chrome/browser/upgrade/model/upgrade_center.mm
@@ -10,6 +10,7 @@ #import "base/apple/bundle_locations.h" #import "base/apple/foundation_util.h" +#import "base/memory/raw_ptr.h" #import "base/scoped_observation.h" #import "base/strings/sys_string_conversions.h" #import "base/time/time.h" @@ -162,7 +163,7 @@ scoped_observation_.Reset(); } - UpgradeInfoBarDelegate* infobar_delegate_; + raw_ptr<UpgradeInfoBarDelegate> infobar_delegate_; __weak UpgradeCenter* dismiss_delegate_; __strong NSString* tab_id_; base::ScopedObservation<infobars::InfoBarManager,
diff --git a/ios/chrome/browser/upgrade/model/upgrade_center_unittest.mm b/ios/chrome/browser/upgrade/model/upgrade_center_unittest.mm index 8a6b51a..992818b4 100644 --- a/ios/chrome/browser/upgrade/model/upgrade_center_unittest.mm +++ b/ios/chrome/browser/upgrade/model/upgrade_center_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/upgrade/model/upgrade_center.h" +#import "base/memory/raw_ptr.h" #import "ios/chrome/browser/upgrade/model/upgrade_recommended_details.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "testing/platform_test.h" @@ -31,7 +32,7 @@ @end @implementation FakeUpgradeCenterClient { - UpgradeCenterTest* _test; + raw_ptr<UpgradeCenterTest> _test; } - (instancetype)initWithTest:(UpgradeCenterTest*)test {
diff --git a/ios/chrome/browser/view_source/model/view_source_browser_agent.h b/ios/chrome/browser/view_source/model/view_source_browser_agent.h index 8cd9159..a0f8c7d 100644 --- a/ios/chrome/browser/view_source/model/view_source_browser_agent.h +++ b/ios/chrome/browser/view_source/model/view_source_browser_agent.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "base/values.h" #import "ios/chrome/browser/shared/model/browser/browser_user_data.h" @@ -48,7 +49,7 @@ void OnHandleViewSourceForActiveWebStateResult(const base::Value* value); // The browser this agent is associated with. - Browser* browser_; + raw_ptr<Browser> browser_; base::WeakPtrFactory<ViewSourceBrowserAgent> weak_ptr_factory_{this}; };
diff --git a/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h b/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h index 9d02018e..e72156f4 100644 --- a/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h +++ b/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h
@@ -9,6 +9,7 @@ #import <optional> +#import "base/memory/raw_ptr.h" #import "base/memory/weak_ptr.h" #import "base/sequence_checker.h" #import "base/values.h" @@ -117,7 +118,7 @@ id<UnitConversionCommands> unit_conversion_handler_ = nil; - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; std::unique_ptr<base::Value::Dict> metadata_;
diff --git a/ios/chrome/browser/web_selection/model/web_selection_tab_helper.h b/ios/chrome/browser/web_selection/model/web_selection_tab_helper.h index 535cdd62..8cb9649 100644 --- a/ios/chrome/browser/web_selection/model/web_selection_tab_helper.h +++ b/ios/chrome/browser/web_selection/model/web_selection_tab_helper.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_WEB_SELECTION_MODEL_WEB_SELECTION_TAB_HELPER_H_ #define IOS_CHROME_BROWSER_WEB_SELECTION_MODEL_WEB_SELECTION_TAB_HELPER_H_ +#import "base/memory/raw_ptr.h" #import "base/timer/timer.h" #import "ios/chrome/browser/web_selection/model/web_selection_java_script_feature_observer.h" #import "ios/web/public/web_state_observer.h" @@ -60,7 +61,7 @@ // The WebState this instance is observing. Will be null after // WebStateDestroyed has been called. - web::WebState* web_state_ = nullptr; + raw_ptr<web::WebState> web_state_ = nullptr; // The callback to call when the selection is finally retrieved. base::OnceCallback<void(WebSelectionResponse*)> final_callback_;
diff --git a/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.h b/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.h index 9bd8bd3..f78d7ea4 100644 --- a/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.h +++ b/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_WEB_STATE_LIST_MODEL_WEB_STATE_DEPENDENCY_INSTALLATION_OBSERVER_H_ #define IOS_CHROME_BROWSER_WEB_STATE_LIST_MODEL_WEB_STATE_DEPENDENCY_INSTALLATION_OBSERVER_H_ +#import "base/memory/raw_ptr.h" #import "base/scoped_multi_source_observation.h" #import "base/scoped_observation.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" @@ -63,10 +64,10 @@ // The WebStateList being observed for addition, replacement, and detachment // of WebStates - WebStateList* web_state_list_; + raw_ptr<WebStateList> web_state_list_; // The class which installs/uninstalls dependencies in response to changes to // the WebStateList - DependencyInstaller* dependency_installer_; + raw_ptr<DependencyInstaller> dependency_installer_; // Automatically detaches `this` from the WebStateList when destroyed base::ScopedObservation<WebStateList, WebStateListObserver> web_state_list_observation_{this};
diff --git a/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.mm b/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.mm index d18126d..29293db5 100644 --- a/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.mm +++ b/ios/chrome/browser/web_state_list/model/web_state_dependency_installation_observer.mm
@@ -14,7 +14,7 @@ DCHECK(web_state_list_); DCHECK(dependency_installer_); - web_state_list_observation_.Observe(web_state_list_); + web_state_list_observation_.Observe(web_state_list_.get()); for (int i = 0; i < web_state_list_->count(); i++) { OnWebStateAdded(web_state_list_->GetWebStateAt(i)); }
diff --git a/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h b/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h index 820d69f3..28b018f 100644 --- a/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h +++ b/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h
@@ -5,7 +5,8 @@ #ifndef IOS_CHROME_BROWSER_WEB_STATE_LIST_MODEL_WEB_USAGE_ENABLER_WEB_USAGE_ENABLER_BROWSER_AGENT_H_ #define IOS_CHROME_BROWSER_WEB_STATE_LIST_MODEL_WEB_USAGE_ENABLER_WEB_USAGE_ENABLER_BROWSER_AGENT_H_ -#include "base/observer_list.h" +#import "base/memory/raw_ptr.h" +#import "base/observer_list.h" #import "base/scoped_multi_source_observation.h" #import "base/scoped_observation.h" #import "ios/chrome/browser/shared/model/browser/browser_observer.h" @@ -72,7 +73,7 @@ void WebStateDestroyed(web::WebState* web_state) override; // The browser whose WebStates' web usage is being managed. - Browser* browser_ = nullptr; + raw_ptr<Browser> browser_ = nullptr; // Whether web usage is enabled for the WebState in `web_state_list_`. bool web_usage_enabled_ = false;
diff --git a/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.mm b/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.mm index 5919b99..13f52dd 100644 --- a/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.mm +++ b/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.mm
@@ -11,7 +11,7 @@ WebUsageEnablerBrowserAgent::WebUsageEnablerBrowserAgent(Browser* browser) : browser_(browser) { - browser_observation_.Observe(browser_); + browser_observation_.Observe(browser_.get()); WebStateList* web_state_list = browser_->GetWebStateList(); web_state_list_observation_.Observe(browser->GetWebStateList());
diff --git a/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent_unittest.mm b/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent_unittest.mm index faf3c6e..92e1825 100644 --- a/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent_unittest.mm +++ b/ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/web_state_list/model/web_usage_enabler/web_usage_enabler_browser_agent.h" +#import "base/memory/raw_ptr.h" #import "base/test/task_environment.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" @@ -39,8 +40,8 @@ base::test::TaskEnvironment task_environment_; std::unique_ptr<TestChromeBrowserState> browser_state_; std::unique_ptr<TestBrowser> browser_; - WebStateList* web_state_list_; - WebUsageEnablerBrowserAgent* enabler_; + raw_ptr<WebStateList> web_state_list_; + raw_ptr<WebUsageEnablerBrowserAgent> enabler_; std::unique_ptr<web::FakeWebState> CreateWebState(const char* url) { auto test_web_state = std::make_unique<web::FakeWebState>();
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn index 0bbb58a..6119f03 100644 --- a/ios/chrome/test/earl_grey2/BUILD.gn +++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -107,6 +107,7 @@ "//ios/chrome/browser/ui/default_promo:eg2_tests", "//ios/chrome/browser/ui/incognito_reauth:eg2_tests", "//ios/chrome/browser/ui/integration_tests:eg2_tests", + "//ios/chrome/browser/ui/push_notification:eg2_tests", "//ios/chrome/browser/variations/model:eg2_tests", ] data_deps = [ ":ios_chrome_eg2tests" ]
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm index 30b368e..1c16a0a 100644 --- a/ios/net/cookies/cookie_store_ios.mm +++ b/ios/net/cookies/cookie_store_ios.mm
@@ -28,7 +28,7 @@ #import "ios/net/cookies/ns_http_system_cookie_store.h" #import "ios/net/cookies/system_cookie_util.h" #import "ios/net/ios_net_buildflags.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/cookies/cookie_constants.h" #import "net/cookies/cookie_util.h" #import "net/cookies/parsed_cookie.h"
diff --git a/ios/net/cookies/cookie_store_ios_unittest.mm b/ios/net/cookies/cookie_store_ios_unittest.mm index 9167cf56..f8b4c39 100644 --- a/ios/net/cookies/cookie_store_ios_unittest.mm +++ b/ios/net/cookies/cookie_store_ios_unittest.mm
@@ -19,7 +19,7 @@ #include "ios/net/cookies/cookie_store_ios_client.h" #import "ios/net/cookies/cookie_store_ios_test_util.h" #import "ios/net/cookies/ns_http_system_cookie_store.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_store_change_unittest.h" #include "net/cookies/cookie_store_unittest.h"
diff --git a/ios/net/cookies/ns_http_system_cookie_store.mm b/ios/net/cookies/ns_http_system_cookie_store.mm index 9ec3ad5..058ea0f 100644 --- a/ios/net/cookies/ns_http_system_cookie_store.mm +++ b/ios/net/cookies/ns_http_system_cookie_store.mm
@@ -9,7 +9,7 @@ #import "ios/net/cookies/cookie_creation_time_manager.h" #import "ios/net/cookies/cookie_store_ios_client.h" #import "ios/net/cookies/system_cookie_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "url/gurl.h" namespace net {
diff --git a/ios/net/cookies/system_cookie_store_unittest_template.h b/ios/net/cookies/system_cookie_store_unittest_template.h index e03130ee..e70fb50 100644 --- a/ios/net/cookies/system_cookie_store_unittest_template.h +++ b/ios/net/cookies/system_cookie_store_unittest_template.h
@@ -15,7 +15,7 @@ #include "base/run_loop.h" #import "base/test/ios/wait_util.h" #include "ios/net/cookies/cookie_store_ios_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" #include "url/gurl.h"
diff --git a/ios/net/crn_http_protocol_handler.mm b/ios/net/crn_http_protocol_handler.mm index cb677d0..f274a78 100644 --- a/ios/net/crn_http_protocol_handler.mm +++ b/ios/net/crn_http_protocol_handler.mm
@@ -28,11 +28,11 @@ #import "ios/net/http_protocol_logging.h" #include "ios/net/nsurlrequest_util.h" #import "ios/net/protocol_handler_util.h" +#import "net/base/apple/url_conversions.h" #include "net/base/auth.h" #include "net/base/elements_upload_data_stream.h" #include "net/base/io_buffer.h" #include "net/base/load_flags.h" -#import "net/base/mac/url_conversions.h" #include "net/base/net_errors.h" #include "net/base/upload_bytes_element_reader.h" #include "net/http/http_request_headers.h"
diff --git a/ios/net/protocol_handler_util.mm b/ios/net/protocol_handler_util.mm index 6f630f8..fe7b11bc 100644 --- a/ios/net/protocol_handler_util.mm +++ b/ios/net/protocol_handler_util.mm
@@ -11,7 +11,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/time/time.h" #include "ios/net/crn_http_url_response.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/base/net_errors.h" #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h"
diff --git a/ios/net/protocol_handler_util_unittest.mm b/ios/net/protocol_handler_util_unittest.mm index e5b06e3..f61a6c7 100644 --- a/ios/net/protocol_handler_util_unittest.mm +++ b/ios/net/protocol_handler_util_unittest.mm
@@ -11,8 +11,8 @@ #include "base/run_loop.h" #include "base/strings/sys_string_conversions.h" #include "base/test/task_environment.h" +#import "net/base/apple/url_conversions.h" #include "net/base/elements_upload_data_stream.h" -#import "net/base/mac/url_conversions.h" #include "net/base/upload_bytes_element_reader.h" #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h"
diff --git a/ios/web/annotations/annotations_inttest.mm b/ios/web/annotations/annotations_inttest.mm index 3d9ad05..19555f7 100644 --- a/ios/web/annotations/annotations_inttest.mm +++ b/ios/web/annotations/annotations_inttest.mm
@@ -6,6 +6,7 @@ #import <WebKit/WebKit.h> #import "base/memory/ptr_util.h" +#import "base/memory/raw_ptr.h" #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" @@ -282,7 +283,7 @@ TestAnnotationTextObserver* observer() { return &observer_; } base::test::ScopedFeatureList feature_; - JavaScriptContentWorld* content_world_; + raw_ptr<JavaScriptContentWorld> content_world_; TestAnnotationTextObserver observer_; AnnotationsTestJavaScriptFeature js_test_feature_; };
diff --git a/ios/web/annotations/annotations_text_manager_impl.h b/ios/web/annotations/annotations_text_manager_impl.h index 8a84ebea..38d63158 100644 --- a/ios/web/annotations/annotations_text_manager_impl.h +++ b/ios/web/annotations/annotations_text_manager_impl.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "base/memory/raw_ptr.h" #import "base/observer_list.h" #import "base/values.h" #import "ios/web/public/annotations/annotations_text_manager.h" @@ -65,7 +66,7 @@ // A list of observers. Weak references. base::ObserverList<AnnotationsTextObserver, true> observers_; - WebState* web_state_ = nullptr; + raw_ptr<WebState> web_state_ = nullptr; // Id passed on to some callbacks and checked on followup calls to make // sure it matches with current manager's state. int seq_id_;
diff --git a/ios/web/browser_state_web_view_partition_inttest.mm b/ios/web/browser_state_web_view_partition_inttest.mm index 3be7a651..7cfe31b 100644 --- a/ios/web/browser_state_web_view_partition_inttest.mm +++ b/ios/web/browser_state_web_view_partition_inttest.mm
@@ -13,7 +13,7 @@ #import "ios/web/public/browser_state.h" #import "ios/web/public/test/js_test_util.h" #import "ios/web/test/web_int_test.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/test/embedded_test_server/default_handlers.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h"
diff --git a/ios/web/crw_navigation_item_storage.mm b/ios/web/crw_navigation_item_storage.mm index e6ad7931..736be29 100644 --- a/ios/web/crw_navigation_item_storage.mm +++ b/ios/web/crw_navigation_item_storage.mm
@@ -12,7 +12,7 @@ #import "ios/web/public/session/proto/navigation.pb.h" #import "ios/web/public/session/proto/proto_util.h" #import "ios/web/public/web_client.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" namespace web {
diff --git a/ios/web/download/BUILD.gn b/ios/web/download/BUILD.gn index c285a2d1..e728889e 100644 --- a/ios/web/download/BUILD.gn +++ b/ios/web/download/BUILD.gn
@@ -36,6 +36,8 @@ "download_task_impl.mm", "download_task_observer.mm", "download_task_observer_bridge.mm", + "web_state_content_download_task.h", + "web_state_content_download_task.mm", ] frameworks = [ "UIKit.framework" ] @@ -79,12 +81,14 @@ ] sources = [ + "crw_web_view_download_unittest.mm", "data_url_download_task_unittest.mm", "download_controller_impl_unittest.mm", "download_native_task_impl_unittest.mm", "download_session_cookie_storage_unittest.mm", "download_session_task_impl_unittest.mm", "download_task_impl_unittest.mm", + "web_state_content_download_task_unittest.mm", ] }
diff --git a/ios/web/download/crw_web_view_download.mm b/ios/web/download/crw_web_view_download.mm index b0010292..59b661c 100644 --- a/ios/web/download/crw_web_view_download.mm +++ b/ios/web/download/crw_web_view_download.mm
@@ -6,7 +6,12 @@ #import <WebKit/WebKit.h> +#import "base/files/file_path.h" +#import "base/files/file_util.h" +#import "base/functional/callback_helpers.h" #import "base/ios/block_types.h" +#import "base/strings/sys_string_conversions.h" +#import "base/task/thread_pool.h" @interface CRWWebViewDownload () <WKDownloadDelegate> @@ -18,7 +23,9 @@ @end -@implementation CRWWebViewDownload +@implementation CRWWebViewDownload { + BOOL _isLocalDownload; +} - (instancetype)initWithPath:(NSString*)destination request:(NSURLRequest*)request @@ -35,6 +42,10 @@ } - (void)startDownload { + if ([self.request.URL isFileURL]) { + [self startLocalDownload]; + return; + } [self.webView startDownloadUsingRequest:self.request completionHandler:^(WKDownload* download) { download.delegate = self; @@ -43,6 +54,12 @@ } - (void)cancelDownload:(ProceduralBlock)completion { + if (_isLocalDownload) { + if (completion) { + completion(); + } + return; + } [self.download cancel:^(NSData* resumeData) { if (completion) { completion(); @@ -71,4 +88,30 @@ [self.delegate downloadDidFailWithError:error]; } +#pragma mark - Private + +// Start a `local download` which is really a copy from the request URL to the +// destination path. +- (void)startLocalDownload { + _isLocalDownload = YES; + __weak __typeof(self) weakSelf = self; + base::FilePath sourcePath(base::SysNSStringToUTF8(self.request.URL.path)); + base::FilePath destPath(base::SysNSStringToUTF8(self.destinationPath)); + + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, + {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&base::CopyFile, sourcePath, destPath), + base::BindOnce(^(bool result) { + if (result) { + [weakSelf.delegate downloadDidFinish]; + } else { + NSError* error = [NSError errorWithDomain:NSCocoaErrorDomain + code:NSFileReadUnknownError + userInfo:nil]; + [weakSelf.delegate downloadDidFailWithError:error]; + } + })); +} + @end
diff --git a/ios/web/download/crw_web_view_download_unittest.mm b/ios/web/download/crw_web_view_download_unittest.mm new file mode 100644 index 0000000..2982562 --- /dev/null +++ b/ios/web/download/crw_web_view_download_unittest.mm
@@ -0,0 +1,89 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <WebKit/WebKit.h> + +#import "ios/web/download/crw_web_view_download.h" + +#import "base/files/scoped_temp_dir.h" +#import "base/strings/sys_string_conversions.h" +#import "base/test/ios/wait_util.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/gtest_mac.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "url/gurl.h" + +// Test fixture for testing CRWWebViewDownloadTest class. +class CRWWebViewDownloadTest : public PlatformTest { + protected: + web::WebTaskEnvironment task_environment_; +}; + +TEST_F(CRWWebViewDownloadTest, TestDownloadHTTPFile) { + NSURLRequest* request = [[NSURLRequest alloc] + initWithURL:[NSURL URLWithString:@"https://example.test"]]; + id web_view = OCMStrictClassMock([WKWebView class]); + id wk_download = OCMStrictClassMock([WKDownload class]); + id delegate = OCMStrictProtocolMock(@protocol(CRWWebViewDownloadDelegate)); + CRWWebViewDownload* download = + [[CRWWebViewDownload alloc] initWithPath:@"/path/foo/bar" + request:request + webview:web_view + delegate:delegate]; + + __block bool start_called = false; + [[web_view expect] + startDownloadUsingRequest:request + completionHandler:[OCMArg checkWithBlock:^(void (^completion)( + WKDownload* download)) { + completion(wk_download); + start_called = true; + return YES; + }]]; + [[wk_download expect] setDelegate:[OCMArg any]]; + [download startDownload]; + ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, ^bool() { + return start_called; + })); +} + +TEST_F(CRWWebViewDownloadTest, TestDownloadLocalFile) { + id web_view = OCMStrictClassMock([WKWebView class]); + id delegate = OCMStrictProtocolMock(@protocol(CRWWebViewDownloadDelegate)); + + base::ScopedTempDir scoped_temp_dir; + ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir()); + + const base::FilePath root = scoped_temp_dir.GetPath(); + + const base::FilePath from = root.Append("from"); + const base::FilePath dest = root.Append("to"); + + // Create a file in a sub-directory. + NSData* data = [@"data" dataUsingEncoding:NSUTF8StringEncoding]; + + EXPECT_TRUE([data writeToFile:base::SysUTF8ToNSString(from.value()) + atomically:YES]); + NSURLRequest* request = [[NSURLRequest alloc] + initWithURL:[NSURL + fileURLWithPath:base::SysUTF8ToNSString(from.value())]]; + + CRWWebViewDownload* download = [[CRWWebViewDownload alloc] + initWithPath:base::SysUTF8ToNSString(dest.value()) + request:request + webview:web_view + delegate:delegate]; + __block bool finish_called = false; + [[[delegate expect] andDo:^(NSInvocation* invocation) { + finish_called = true; + }] downloadDidFinish]; + [download startDownload]; + task_environment_.RunUntilIdle(); + ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForUIElementTimeout, ^bool() { + return finish_called; + })); +}
diff --git a/ios/web/download/download_controller_impl.h b/ios/web/download/download_controller_impl.h index 2838c3ed..d280bfed 100644 --- a/ios/web/download/download_controller_impl.h +++ b/ios/web/download/download_controller_impl.h
@@ -9,6 +9,7 @@ #include <set> +#import "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/sequence_checker.h" #include "base/supports_user_data.h" @@ -55,6 +56,10 @@ const std::string& mime_type, DownloadNativeTaskBridge* download) override; + void CreateWebStateDownloadTask(WebState* web_state, + NSString* identifier, + int64_t total_bytes) override; + void SetDelegate(DownloadControllerDelegate* delegate) override; DownloadControllerDelegate* GetDelegate() const override; @@ -68,7 +73,7 @@ // Set of tasks which are currently alive. scoped_refptr<base::SequencedTaskRunner> task_runner_; std::set<DownloadTask*> alive_tasks_; - DownloadControllerDelegate* delegate_ = nullptr; + raw_ptr<DownloadControllerDelegate> delegate_ = nullptr; SEQUENCE_CHECKER(sequence_checker_); };
diff --git a/ios/web/download/download_controller_impl.mm b/ios/web/download/download_controller_impl.mm index d4eae3a..fdce56f1 100644 --- a/ios/web/download/download_controller_impl.mm +++ b/ios/web/download/download_controller_impl.mm
@@ -13,9 +13,11 @@ #import "ios/web/download/download_native_task_impl.h" #import "ios/web/download/download_session_cookie_storage.h" #import "ios/web/download/download_session_task_impl.h" +#import "ios/web/download/web_state_content_download_task.h" #import "ios/web/public/browser_state.h" #import "ios/web/public/download/download_controller_delegate.h" -#import "net/base/mac/url_conversions.h" +#import "ios/web/public/web_state.h" +#import "net/base/apple/url_conversions.h" #import "net/http/http_request_headers.h" namespace { @@ -76,6 +78,18 @@ } } +void DownloadControllerImpl::CreateWebStateDownloadTask(WebState* web_state, + NSString* identifier, + int64_t total_bytes) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!delegate_) { + return; + } + OnDownloadCreated(std::make_unique<WebStateContentDownloadTask>( + web_state, web_state->GetLastCommittedURL(), @"", "", total_bytes, + web_state->GetContentsMimeType(), identifier, task_runner_)); +} + void DownloadControllerImpl::CreateNativeDownloadTask( WebState* web_state, NSString* identifier,
diff --git a/ios/web/download/download_session_cookie_storage.mm b/ios/web/download/download_session_cookie_storage.mm index b2e78c6..911f5dee 100644 --- a/ios/web/download/download_session_cookie_storage.mm +++ b/ios/web/download/download_session_cookie_storage.mm
@@ -6,7 +6,7 @@ #import "base/notreached.h" #import "ios/net/cookies/system_cookie_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/cookies/canonical_cookie.h" #import "net/cookies/cookie_constants.h"
diff --git a/ios/web/download/download_session_task_impl.mm b/ios/web/download/download_session_task_impl.mm index 0cf5d66..6dd44f4 100644 --- a/ios/web/download/download_session_task_impl.mm +++ b/ios/web/download/download_session_task_impl.mm
@@ -6,6 +6,7 @@ #import "base/apple/foundation_util.h" #import "base/check.h" +#import "base/memory/raw_ptr.h" #import "base/sequence_checker.h" #import "base/strings/sys_string_conversions.h" #import "base/task/bind_post_task.h" @@ -20,7 +21,7 @@ #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/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/cookies/cookie_store.h" #import "net/url_request/url_request_context.h" #import "net/url_request/url_request_context_getter.h" @@ -373,7 +374,7 @@ // 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; + raw_ptr<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
diff --git a/ios/web/download/download_task_impl.h b/ios/web/download/download_task_impl.h index 9ab7854..f2326e1 100644 --- a/ios/web/download/download_task_impl.h +++ b/ios/web/download/download_task_impl.h
@@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/functional/callback_forward.h" +#import "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" @@ -120,7 +121,7 @@ NSString* identifier_ = nil; bool has_performed_background_download_ = false; DownloadResult download_result_; - WebState* web_state_ = nullptr; + raw_ptr<WebState> web_state_ = nullptr; base::FilePath path_; bool owns_file_ = false;
diff --git a/ios/web/download/web_state_content_download_task.h b/ios/web/download/web_state_content_download_task.h new file mode 100644 index 0000000..652635f --- /dev/null +++ b/ios/web/download/web_state_content_download_task.h
@@ -0,0 +1,64 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_DOWNLOAD_WEB_STATE_CONTENT_DOWNLOAD_TASK_H_ +#define IOS_WEB_DOWNLOAD_WEB_STATE_CONTENT_DOWNLOAD_TASK_H_ + +#include "base/task/sequenced_task_runner.h" +#include "ios/web/download/download_task_impl.h" +#import "ios/web/public/download/crw_web_view_download.h" + +@class WebStateDownloadDelegateBridge; + +namespace web { + +// Implementation of DownloadTaskImpl that download the content of the web +// state. +class WebStateContentDownloadTask final : public DownloadTaskImpl { + public: + // Constructs a new WebStateContentDownloadTask objects. `web_state` and + // `identifier` must be valid. + WebStateContentDownloadTask( + 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); + + WebStateContentDownloadTask(const WebStateContentDownloadTask&) = delete; + WebStateContentDownloadTask& operator=(const WebStateContentDownloadTask&) = + delete; + + ~WebStateContentDownloadTask() final; + + // DownloadTaskImpl overrides: + void StartInternal(const base::FilePath& path) final; + + // Cancel the downloads. + // Local downloads (it the webState is showing a file:// URL) cannot be + // cancelled. + void CancelInternal() final; + + private: + // Called when the download finishes. + void DownloadDidFinish(NSError* error); + + // Called when the WebState created the download object. + void DownloadWasCreated(id<CRWWebViewDownload> download); + + // The download object returned by the web_state used to cancel the download. + id<CRWWebViewDownload> download_; + + // Bridge to the CRWWebViewDownloadDelegate. + WebStateDownloadDelegateBridge* download_delegate_; + + base::WeakPtrFactory<WebStateContentDownloadTask> weak_factory_{this}; +}; + +} // namespace web + +#endif // IOS_WEB_DOWNLOAD_WEB_STATE_CONTENT_DOWNLOAD_TASK_H_
diff --git a/ios/web/download/web_state_content_download_task.mm b/ios/web/download/web_state_content_download_task.mm new file mode 100644 index 0000000..8f77295 --- /dev/null +++ b/ios/web/download/web_state_content_download_task.mm
@@ -0,0 +1,102 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web/download/web_state_content_download_task.h" + +#import "base/functional/bind.h" +#import "base/functional/callback.h" +#import "base/functional/callback_helpers.h" +#import "base/strings/sys_string_conversions.h" +#import "ios/web/public/web_state.h" +#import "net/base/net_errors.h" + +typedef void (^ProceduralBlockWithError)(NSError*); + +@interface WebStateDownloadDelegateBridge + : NSObject <CRWWebViewDownloadDelegate> +@end + +@implementation WebStateDownloadDelegateBridge { + base::OnceCallback<void(NSError*)> _callback; +} + +- (instancetype)initWithCallback:(base::OnceCallback<void(NSError*)>)callback { + self = [super init]; + if (self) { + _callback = std::move(callback); + } + return self; +} +- (void)downloadDidFinish { + std::move(_callback).Run(nil); +} + +- (void)downloadDidFailWithError:(NSError*)error { + std::move(_callback).Run(error); +} + +@end + +namespace web { +WebStateContentDownloadTask::WebStateContentDownloadTask( + 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) + : DownloadTaskImpl(web_state, + original_url, + http_method, + content_disposition, + total_bytes, + mime_type, + identifier, + task_runner) {} + +WebStateContentDownloadTask::~WebStateContentDownloadTask() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CancelInternal(); +} + +void WebStateContentDownloadTask::StartInternal(const base::FilePath& path) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + auto callback = + base::BindOnce(&WebStateContentDownloadTask::DownloadDidFinish, + weak_factory_.GetWeakPtr()); + download_delegate_ = [[WebStateDownloadDelegateBridge alloc] + initWithCallback:std::move(callback)]; + web_state_->DownloadCurrentPage( + base::SysUTF8ToNSString(path.value()), download_delegate_, + base::CallbackToBlock( + base::BindOnce(&WebStateContentDownloadTask::DownloadWasCreated, + weak_factory_.GetWeakPtr()))); +} + +void WebStateContentDownloadTask::CancelInternal() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + weak_factory_.InvalidateWeakPtrs(); + // Client will receive status update through DownloadTask status update. + [download_ cancelDownload:^{ + }]; +} + +#pragma mark - Private + +void WebStateContentDownloadTask::DownloadWasCreated( + id<CRWWebViewDownload> download) { + download_ = download; +} + +void WebStateContentDownloadTask::DownloadDidFinish(NSError* error) { + if (!error) { + OnDownloadFinished(DownloadResult(net::OK)); + } else { + OnDownloadFinished(DownloadResult(net::ERR_FAILED)); + } +} + +} // namespace web
diff --git a/ios/web/download/web_state_content_download_task_unittest.mm b/ios/web/download/web_state_content_download_task_unittest.mm new file mode 100644 index 0000000..e714dadd --- /dev/null +++ b/ios/web/download/web_state_content_download_task_unittest.mm
@@ -0,0 +1,58 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/web/download/web_state_content_download_task.h" + +#import "base/task/thread_pool.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" +#import "testing/platform_test.h" + +namespace { +const char kValidUrl[] = "https://foo.test"; +NSString* const kMethodGet = @"GET"; +const char kContentDisposition[] = "attachment; filename=file.test"; +const char kMimeType[] = "application/pdf"; +} // namespace + +// Test fixture for testing WebStateContentDownloadTask class. +class WebStateContentDownloadTaskTest : public PlatformTest { + protected: + web::WebTaskEnvironment task_environment_; + web::FakeWebState web_state_; +}; + +// Test successful download. +TEST_F(WebStateContentDownloadTaskTest, TestDownloadContentSuccess) { + web::WebStateContentDownloadTask task( + &web_state_, GURL(kValidUrl), kMethodGet, kContentDisposition, + /*total_bytes=*/-1, kMimeType, [[NSUUID UUID] UUIDString], + base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::USER_BLOCKING})); + + task.Start(base::FilePath("/tmp/test")); + task_environment_.RunUntilIdle(); + EXPECT_EQ(web::DownloadTask::State::kInProgress, task.GetState()); + web_state_.OnDownloadFinished(nil); + EXPECT_EQ(web::DownloadTask::State::kComplete, task.GetState()); +} + +// Test Failing download. +TEST_F(WebStateContentDownloadTaskTest, TestDownloadContentSuccessFail) { + web::WebStateContentDownloadTask task( + &web_state_, GURL(kValidUrl), kMethodGet, kContentDisposition, + /*total_bytes=*/-1, kMimeType, [[NSUUID UUID] UUIDString], + base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::USER_BLOCKING})); + + task.Start(base::FilePath("/tmp/test")); + task_environment_.RunUntilIdle(); + EXPECT_EQ(web::DownloadTask::State::kInProgress, task.GetState()); + web_state_.OnDownloadFinished([NSError errorWithDomain:@"test" + code:1 + userInfo:nil]); + EXPECT_EQ(web::DownloadTask::State::kFailed, task.GetState()); +}
diff --git a/ios/web/js_features/context_menu/context_menu_js_unittest.mm b/ios/web/js_features/context_menu/context_menu_js_unittest.mm index 9b49994..acc8abe 100644 --- a/ios/web/js_features/context_menu/context_menu_js_unittest.mm +++ b/ios/web/js_features/context_menu/context_menu_js_unittest.mm
@@ -19,7 +19,7 @@ #import "ios/web/public/test/javascript_test.h" #import "ios/web/public/test/js_test_util.h" #import "ios/web/test/fakes/crw_fake_script_message_handler.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #import "url/gurl.h"
diff --git a/ios/web/js_features/context_menu/context_menu_params_utils_unittest.mm b/ios/web/js_features/context_menu/context_menu_params_utils_unittest.mm index 5f4b8ea8..b9070c7 100644 --- a/ios/web/js_features/context_menu/context_menu_params_utils_unittest.mm +++ b/ios/web/js_features/context_menu/context_menu_params_utils_unittest.mm
@@ -10,7 +10,7 @@ #import "ios/web/common/referrer_util.h" #import "ios/web/js_features/context_menu/context_menu_constants.h" #import "ios/web/public/ui/context_menu_params.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h"
diff --git a/ios/web/js_features/window_error/window_error_java_script_feature.mm b/ios/web/js_features/window_error/window_error_java_script_feature.mm index afee1ba..b93a4462 100644 --- a/ios/web/js_features/window_error/window_error_java_script_feature.mm +++ b/ios/web/js_features/window_error/window_error_java_script_feature.mm
@@ -7,7 +7,7 @@ #import "base/strings/sys_string_conversions.h" #import "ios/web/public/js_messaging/java_script_feature_util.h" #import "ios/web/public/js_messaging/script_message.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" namespace { const char kScriptName[] = "error";
diff --git a/ios/web/js_messaging/java_script_content_world.mm b/ios/web/js_messaging/java_script_content_world.mm index 4e14505..f4bf1e0 100644 --- a/ios/web/js_messaging/java_script_content_world.mm +++ b/ios/web/js_messaging/java_script_content_world.mm
@@ -20,7 +20,7 @@ #import "ios/web/web_state/ui/crw_web_controller.h" #import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" #import "ios/web/web_state/web_state_impl.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" namespace web {
diff --git a/ios/web/navigation/crw_error_page_helper_unittest.mm b/ios/web/navigation/crw_error_page_helper_unittest.mm index 1635f04..b0ab238c3 100644 --- a/ios/web/navigation/crw_error_page_helper_unittest.mm +++ b/ios/web/navigation/crw_error_page_helper_unittest.mm
@@ -6,7 +6,7 @@ #import "base/apple/bundle_locations.h" #import "base/strings/sys_string_conversions.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h"
diff --git a/ios/web/navigation/crw_js_navigation_handler.mm b/ios/web/navigation/crw_js_navigation_handler.mm index c49c936..151780a 100644 --- a/ios/web/navigation/crw_js_navigation_handler.mm +++ b/ios/web/navigation/crw_js_navigation_handler.mm
@@ -13,7 +13,7 @@ #import "ios/web/navigation/navigation_manager_impl.h" #import "ios/web/web_state/user_interaction_state.h" #import "ios/web/web_state/web_state_impl.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" namespace {
diff --git a/ios/web/navigation/crw_session_storage_unittest.mm b/ios/web/navigation/crw_session_storage_unittest.mm index 119d9366..5763b44 100644 --- a/ios/web/navigation/crw_session_storage_unittest.mm +++ b/ios/web/navigation/crw_session_storage_unittest.mm
@@ -20,7 +20,7 @@ #import "ios/web/public/session/proto/proto_util.h" #import "ios/web/public/session/proto/storage.pb.h" #import "ios/web/public/web_state_id.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h"
diff --git a/ios/web/navigation/crw_web_view_navigation_observer.mm b/ios/web/navigation/crw_web_view_navigation_observer.mm index d85f31a..f9005c40 100644 --- a/ios/web/navigation/crw_web_view_navigation_observer.mm +++ b/ios/web/navigation/crw_web_view_navigation_observer.mm
@@ -21,7 +21,7 @@ #import "ios/web/public/web_client.h" #import "ios/web/web_state/web_state_impl.h" #import "ios/web/web_view/wk_web_view_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "url/gurl.h" using web::NavigationManagerImpl;
diff --git a/ios/web/navigation/crw_wk_navigation_handler.mm b/ios/web/navigation/crw_wk_navigation_handler.mm index c4cf6708..620b6ef 100644 --- a/ios/web/navigation/crw_wk_navigation_handler.mm +++ b/ios/web/navigation/crw_wk_navigation_handler.mm
@@ -46,7 +46,7 @@ #import "ios/web/web_view/error_translation_util.h" #import "ios/web/web_view/wk_security_origin_util.h" #import "ios/web/web_view/wk_web_view_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/base/net_errors.h" #import "net/cert/x509_util_apple.h" #import "net/http/http_content_disposition.h"
diff --git a/ios/web/navigation/crw_wk_navigation_handler_inttest.mm b/ios/web/navigation/crw_wk_navigation_handler_inttest.mm index 8aa184b..1c24589 100644 --- a/ios/web/navigation/crw_wk_navigation_handler_inttest.mm +++ b/ios/web/navigation/crw_wk_navigation_handler_inttest.mm
@@ -17,7 +17,7 @@ #import "ios/web/security/wk_web_view_security_util.h" #import "ios/web/test/web_int_test.h" #import "ios/web/web_view/error_translation_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/test/embedded_test_server/default_handlers.h" #import "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm index e5c7bea7..b68d8a9 100644 --- a/ios/web/navigation/navigation_manager_impl.mm +++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -33,7 +33,7 @@ #import "ios/web/public/web_client.h" #import "ios/web/public/web_state.h" #import "ios/web/web_state/ui/crw_web_view_navigation_proxy.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "ui/base/page_transition_types.h" namespace {
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm index 92d3cf40..77b53fe5 100644 --- a/ios/web/navigation/navigation_manager_impl_unittest.mm +++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -35,7 +35,7 @@ #import "ios/web/test/test_url_constants.h" #import "ios/web/web_state/ui/crw_web_view_navigation_proxy.h" #import "ios/web/web_state/web_state_impl.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gmock/include/gmock/gmock.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h"
diff --git a/ios/web/navigation/wk_navigation_util_unittest.mm b/ios/web/navigation/wk_navigation_util_unittest.mm index b74e8e8..0ba92e1 100644 --- a/ios/web/navigation/wk_navigation_util_unittest.mm +++ b/ios/web/navigation/wk_navigation_util_unittest.mm
@@ -17,7 +17,7 @@ #import "ios/web/navigation/navigation_item_impl.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/test/test_url_constants.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/platform_test.h" #import "url/scheme_host_port.h"
diff --git a/ios/web/net/cookies/wk_http_system_cookie_store.mm b/ios/web/net/cookies/wk_http_system_cookie_store.mm index e26fd570..b72eefd 100644 --- a/ios/web/net/cookies/wk_http_system_cookie_store.mm +++ b/ios/web/net/cookies/wk_http_system_cookie_store.mm
@@ -11,7 +11,7 @@ #import "ios/web/public/thread/web_task_traits.h" #import "ios/web/public/thread/web_thread.h" #import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/cookies/canonical_cookie.h" #import "net/cookies/cookie_constants.h" #import "url/gurl.h"
diff --git a/ios/web/public/download/crw_web_view_download.h b/ios/web/public/download/crw_web_view_download.h index 63195d2..a59dda6d 100644 --- a/ios/web/public/download/crw_web_view_download.h +++ b/ios/web/public/download/crw_web_view_download.h
@@ -12,6 +12,7 @@ @protocol CRWWebViewDownload <NSObject> // Cancels the download with a completion block. +// Local downloads (from file:// URL) cannot be cancelled. - (void)cancelDownload:(ProceduralBlock)completion; @end
diff --git a/ios/web/public/download/download_controller.h b/ios/web/public/download/download_controller.h index 6cd3c73..8756d25 100644 --- a/ios/web/public/download/download_controller.h +++ b/ios/web/public/download/download_controller.h
@@ -117,6 +117,13 @@ const std::string& mime_type, DownloadNativeTaskBridge* download) = 0; + // Creates a new download task to download the document that is currently + // displayed by the `web_state`. This is mainly intended to download documents + // (like PDFs). + virtual void CreateWebStateDownloadTask(WebState* web_state, + NSString* identifier, + int64_t total_bytes) = 0; + // Sets DownloadControllerDelegate. Clients must set the delegate to null in // DownloadControllerDelegate::OnDownloadControllerDestroyed(). virtual void SetDelegate(DownloadControllerDelegate* delegate) = 0;
diff --git a/ios/web/public/test/earl_grey/web_view_matchers.mm b/ios/web/public/test/earl_grey/web_view_matchers.mm index 37cb7cb4..a21d2af 100644 --- a/ios/web/public/test/earl_grey/web_view_matchers.mm +++ b/ios/web/public/test/earl_grey/web_view_matchers.mm
@@ -13,7 +13,7 @@ #import "ios/testing/earl_grey/earl_grey_app.h" #import "ios/web/public/test/web_view_interaction_test_util.h" #import "ios/web/public/web_state.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" // TODO(crbug.com/757982): Remove this class, after LoadImage() is removed. // A helper delegate class that allows downloading responses with invalid
diff --git a/ios/web/public/test/fakes/fake_download_controller_delegate.h b/ios/web/public/test/fakes/fake_download_controller_delegate.h index 79ed07b8..3d7c0f2b 100644 --- a/ios/web/public/test/fakes/fake_download_controller_delegate.h +++ b/ios/web/public/test/fakes/fake_download_controller_delegate.h
@@ -43,6 +43,7 @@ std::unique_ptr<DownloadTask>) override; void OnDownloadControllerDestroyed(DownloadController*) override; + raw_ptr<DownloadControllerDelegate> old_delegate_ = nullptr; raw_ptr<DownloadController> controller_ = nullptr; AliveDownloadTaskList alive_download_tasks_; };
diff --git a/ios/web/public/test/fakes/fake_download_controller_delegate.mm b/ios/web/public/test/fakes/fake_download_controller_delegate.mm index 6c49b2c2..fe83ccd 100644 --- a/ios/web/public/test/fakes/fake_download_controller_delegate.mm +++ b/ios/web/public/test/fakes/fake_download_controller_delegate.mm
@@ -15,11 +15,12 @@ DownloadController* controller) : controller_(controller) { DCHECK(controller_); + old_delegate_ = controller_->GetDelegate(); controller_->SetDelegate(this); } FakeDownloadControllerDelegate::~FakeDownloadControllerDelegate() { - controller_->SetDelegate(nullptr); + controller_->SetDelegate(old_delegate_); controller_ = nullptr; }
diff --git a/ios/web/public/test/fakes/fake_web_state.h b/ios/web/public/test/fakes/fake_web_state.h index b90e3f55..56bd372 100644 --- a/ios/web/public/test/fakes/fake_web_state.h +++ b/ios/web/public/test/fakes/fake_web_state.h
@@ -25,6 +25,7 @@ #include "url/gurl.h" class SessionCertificatePolicyCache; +@protocol CRWWebViewDownload; namespace web { @@ -151,6 +152,7 @@ void SetCanTakeSnapshot(bool can_take_snapshot); void SetFindInteraction(id<CRWFindInteraction> find_interaction) API_AVAILABLE(ios(16)); + void SetWebViewDownload(id<CRWWebViewDownload> web_view_download); // Getters for test data. // Uses `policy_deciders` to determine whether the navigation corresponding to @@ -178,6 +180,7 @@ void OnRenderProcessGone(); void OnBackForwardStateChanged(); void OnVisibleSecurityStateChanged(); + void OnDownloadFinished(NSError* error); private: raw_ptr<BrowserState> browser_state_ = nullptr; @@ -210,6 +213,8 @@ PermissionState camera_permission_state_ = PermissionStateNotAccessible; PermissionState microphone_permission_state_ = PermissionStateNotAccessible; id<CRWFindInteraction> find_interaction_ API_AVAILABLE(ios(16)); + id<CRWWebViewDownload> web_view_download_; + id<CRWWebViewDownloadDelegate> download_delegate_; // A list of observers notified when page state changes. Weak references. base::ObserverList<WebStateObserver, true> observers_;
diff --git a/ios/web/public/test/fakes/fake_web_state.mm b/ios/web/public/test/fakes/fake_web_state.mm index a8e7e7f..638b649 100644 --- a/ios/web/public/test/fakes/fake_web_state.mm +++ b/ios/web/public/test/fakes/fake_web_state.mm
@@ -13,6 +13,7 @@ #import "components/sessions/core/session_id.h" #import "ios/web/common/crw_content_view.h" #import "ios/web/js_messaging/web_frames_manager_impl.h" +#import "ios/web/public/download/crw_web_view_download.h" #import "ios/web/public/js_messaging/web_frame.h" #import "ios/web/public/navigation/web_state_policy_decider.h" #import "ios/web/public/session/crw_navigation_item_storage.h" @@ -388,6 +389,14 @@ } } +void FakeWebState::OnDownloadFinished(NSError* error) { + if (error) { + [download_delegate_ downloadDidFailWithError:error]; + } else { + [download_delegate_ downloadDidFinish]; + } +} + void FakeWebState::ShouldAllowRequest( NSURLRequest* request, WebStatePolicyDecider::RequestInfo request_info, @@ -465,6 +474,11 @@ find_interaction_ = find_interaction; } +void FakeWebState::SetWebViewDownload( + id<CRWWebViewDownload> web_view_download) { + web_view_download_ = web_view_download; +} + CRWWebViewProxyType FakeWebState::GetWebViewProxy() const { return web_view_proxy_; } @@ -558,7 +572,10 @@ void FakeWebState::DownloadCurrentPage( NSString* destination_file, id<CRWWebViewDownloadDelegate> delegate, - void (^handler)(id<CRWWebViewDownload>)) {} + void (^handler)(id<CRWWebViewDownload>)) { + download_delegate_ = delegate; + handler(web_view_download_); +} bool FakeWebState::IsFindInteractionSupported() { return true;
diff --git a/ios/web/public/test/http_server/http_server.mm b/ios/web/public/test/http_server/http_server.mm index 9f4ed11..3ac070730d 100644 --- a/ios/web/public/test/http_server/http_server.mm +++ b/ios/web/public/test/http_server/http_server.mm
@@ -14,7 +14,7 @@ #import "base/strings/string_number_conversions.h" #import "base/strings/sys_string_conversions.h" #import "ios/net/url_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/test/embedded_test_server/embedded_test_server.h" #import "net/test/embedded_test_server/http_request.h" #import "net/test/embedded_test_server/http_response.h"
diff --git a/ios/web/public/test/http_server_inttest.mm b/ios/web/public/test/http_server_inttest.mm index 36496d16..a69800e3 100644 --- a/ios/web/public/test/http_server_inttest.mm +++ b/ios/web/public/test/http_server_inttest.mm
@@ -15,7 +15,7 @@ #import "ios/web/public/test/http_server/http_server.h" #import "ios/web/public/test/http_server/string_response_provider.h" #import "ios/web/test/web_int_test.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/http/http_response_headers.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h"
diff --git a/ios/web/public/test/web_view_content_test_util.mm b/ios/web/public/test/web_view_content_test_util.mm index 53d8497..241a6823 100644 --- a/ios/web/public/test/web_view_content_test_util.mm +++ b/ios/web/public/test/web_view_content_test_util.mm
@@ -17,7 +17,7 @@ #import "ios/web/public/js_messaging/web_frames_manager.h" #import "ios/web/public/test/web_view_interaction_test_util.h" #import "ios/web/public/web_state.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "url/gurl.h" using base::test::ios::kWaitForDownloadTimeout;
diff --git a/ios/web/shell/view_controller.mm b/ios/web/shell/view_controller.mm index 51aef54..b2be403 100644 --- a/ios/web/shell/view_controller.mm +++ b/ios/web/shell/view_controller.mm
@@ -21,7 +21,7 @@ #import "ios/web/public/web_state_observer_bridge.h" #import "ios/web/shell/shell_browser_state.h" #import "ios/web/shell/shell_web_client.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "ui/base/page_transition_types.h" NSString* const kWebShellBackButtonAccessibilityLabel = @"Back";
diff --git a/ios/web/web_state/error_page_inttest.mm b/ios/web/web_state/error_page_inttest.mm index b34f6a7d..e244d15 100644 --- a/ios/web/web_state/error_page_inttest.mm +++ b/ios/web/web_state/error_page_inttest.mm
@@ -29,7 +29,7 @@ #import "ios/web/public/web_client.h" #import "ios/web/public/web_state.h" #import "ios/web/test/test_url_constants.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/base/net_errors.h" #import "net/test/embedded_test_server/default_handlers.h" #import "net/test/embedded_test_server/request_handler_util.h"
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h index bd329f1..eac5d6a 100644 --- a/ios/web/web_state/ui/crw_web_controller.h +++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -217,14 +217,14 @@ // Gets a mapping of all permissions and their states. Only works on iOS 15+. - (NSDictionary<NSNumber*, NSNumber*>*)statesForAllPermissions; -// Downloads the file from the `request` at `destination` path. +// Downloads the current page as a file at `destination` path. // `completion_handler` is used to retrieve the created CRWWebViewDownload, so // the caller can manage the launched download. -- (void)downloadCurrentPageWithRequest:(NSURLRequest*)request - destinationPath:(NSString*)destination - delegate:(id<CRWWebViewDownloadDelegate>)delegate - handler: - (void (^)(id<CRWWebViewDownload>))handler; +- (void)downloadCurrentPageToDestinationPath:(NSString*)destination + delegate: + (id<CRWWebViewDownloadDelegate>)delegate + handler:(void (^)(id<CRWWebViewDownload>)) + handler; // Returns whether the Find interaction is supported and can be enabled. - (BOOL)findInteractionSupported;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 38b9a195..282c491 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -62,7 +62,7 @@ #import "ios/web/web_state/web_view_internal_creation_util.h" #import "ios/web/web_view/content_type_util.h" #import "ios/web/web_view/wk_web_view_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "services/metrics/public/cpp/ukm_builders.h" #import "url/gurl.h" @@ -912,11 +912,18 @@ currentURL:self.currentURL]; } -- (void)downloadCurrentPageWithRequest:(NSURLRequest*)request - destinationPath:(NSString*)destination - delegate:(id<CRWWebViewDownloadDelegate>)delegate - handler: - (void (^)(id<CRWWebViewDownload>))handler { +- (void)downloadCurrentPageToDestinationPath:(NSString*)destination + delegate: + (id<CRWWebViewDownloadDelegate>)delegate + handler:(void (^)(id<CRWWebViewDownload>)) + handler { + const NavigationManagerImpl* navigationManager = self.navigationManagerImpl; + GURL url = navigationManager->GetLastCommittedItem() + ? navigationManager->GetLastCommittedItem()->GetURL() + : [self currentURL]; + + NSURLRequest* request = [NSURLRequest requestWithURL:net::NSURLWithGURL(url)]; + CRWWebViewDownload* download = [[CRWWebViewDownload alloc] initWithPath:destination request:request
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 978e6e2..09db6ce 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -51,7 +51,7 @@ #import "ios/web/web_state/ui/crw_web_controller.h" #import "ios/web/web_state/ui/crw_web_controller_container_view.h" #import "ios/web/web_state/web_state_impl.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/cert/x509_util_apple.h" #import "net/ssl/ssl_info.h" #import "net/test/cert_test_util.h"
diff --git a/ios/web/web_state/ui/crw_web_request_controller.mm b/ios/web/web_state/ui/crw_web_request_controller.mm index f5e2c99..4d1811a 100644 --- a/ios/web/web_state/ui/crw_web_request_controller.mm +++ b/ios/web/web_state/ui/crw_web_request_controller.mm
@@ -27,7 +27,7 @@ #import "ios/web/public/web_state.h" #import "ios/web/web_state/user_interaction_state.h" #import "ios/web/web_state/web_state_impl.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/base/url_util.h" using web::wk_navigation_util::ExtractTargetURL;
diff --git a/ios/web/web_state/ui/crw_wk_ui_handler.mm b/ios/web/web_state/ui/crw_wk_ui_handler.mm index 6c4b19c..70542f2 100644 --- a/ios/web/web_state/ui/crw_wk_ui_handler.mm +++ b/ios/web/web_state/ui/crw_wk_ui_handler.mm
@@ -21,7 +21,7 @@ #import "ios/web/web_state/web_state_impl.h" #import "ios/web/web_view/wk_security_origin_util.h" #import "ios/web/webui/mojo_facade.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "url/gurl.h" #import "url/origin.h"
diff --git a/ios/web/web_state/web_state_context_menu_bridge_unittest.mm b/ios/web/web_state/web_state_context_menu_bridge_unittest.mm index 6b45c24..686b4d21 100644 --- a/ios/web/web_state/web_state_context_menu_bridge_unittest.mm +++ b/ios/web/web_state/web_state_context_menu_bridge_unittest.mm
@@ -7,7 +7,7 @@ #import "ios/web/public/test/scoped_testing_web_client.h" #import "ios/web/public/ui/context_menu_params.h" #import "ios/web/test/web_test_with_web_controller.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm index 42de7907..291194c 100644 --- a/ios/web/web_state/web_state_impl.mm +++ b/ios/web/web_state/web_state_impl.mm
@@ -25,7 +25,7 @@ #import "ios/web/web_state/ui/crw_web_controller.h" #import "ios/web/web_state/web_state_impl_realized_web_state.h" #import "ios/web/web_state/web_state_impl_serialized_data.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "url/gurl.h" namespace web { @@ -813,12 +813,9 @@ id<CRWWebViewDownloadDelegate> delegate, void (^handler)(id<CRWWebViewDownload>)) { CRWWebController* web_controller = GetWebController(); - NSURLRequest* request = - [NSURLRequest requestWithURL:net::NSURLWithGURL(GetLastCommittedURL())]; - [web_controller downloadCurrentPageWithRequest:request - destinationPath:destination_file - delegate:delegate - handler:handler]; + [web_controller downloadCurrentPageToDestinationPath:destination_file + delegate:delegate + handler:handler]; } bool WebStateImpl::IsFindInteractionSupported() {
diff --git a/ios/web/web_state/web_state_observer_inttest.mm b/ios/web/web_state/web_state_observer_inttest.mm index 5689bf4..dee4d4c 100644 --- a/ios/web/web_state/web_state_observer_inttest.mm +++ b/ios/web/web_state/web_state_observer_inttest.mm
@@ -44,7 +44,7 @@ #import "ios/web/web_state/ui/crw_web_controller.h" #import "ios/web/web_state/web_state_impl.h" #import "ios/web/web_state/web_state_policy_decider_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/base/net_errors.h" #import "net/http/http_response_headers.h" #import "net/test/embedded_test_server/default_handlers.h"
diff --git a/ios/web/web_view/error_translation_util.mm b/ios/web/web_view/error_translation_util.mm index 11a7d4a5..cf056b24 100644 --- a/ios/web/web_view/error_translation_util.mm +++ b/ios/web/web_view/error_translation_util.mm
@@ -10,7 +10,7 @@ #import "base/ios/ns_error_util.h" #import "ios/net/protocol_handler_util.h" #import "ios/web/public/web_client.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/base/net_errors.h" #import "url/gurl.h"
diff --git a/ios/web/web_view/error_translation_util_unittest.mm b/ios/web/web_view/error_translation_util_unittest.mm index bee1f08..703a2336 100644 --- a/ios/web/web_view/error_translation_util_unittest.mm +++ b/ios/web/web_view/error_translation_util_unittest.mm
@@ -9,7 +9,7 @@ #import "base/apple/bridging.h" #import "ios/net/protocol_handler_util.h" #import "ios/web/test/test_url_constants.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/base/net_errors.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h"
diff --git a/ios/web/webui/crw_web_ui_scheme_handler.mm b/ios/web/webui/crw_web_ui_scheme_handler.mm index 167eb96..7697ab82 100644 --- a/ios/web/webui/crw_web_ui_scheme_handler.mm +++ b/ios/web/webui/crw_web_ui_scheme_handler.mm
@@ -10,7 +10,7 @@ #import "base/ranges/algorithm.h" #import "ios/web/webui/url_fetcher_block_adapter.h" #import "ios/web/webui/web_ui_ios_controller_factory_registry.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "url/gurl.h" namespace {
diff --git a/ios/web/webui/crw_web_ui_scheme_handler_unittest.mm b/ios/web/webui/crw_web_ui_scheme_handler_unittest.mm index da568c5..a67cf03 100644 --- a/ios/web/webui/crw_web_ui_scheme_handler_unittest.mm +++ b/ios/web/webui/crw_web_ui_scheme_handler_unittest.mm
@@ -11,7 +11,7 @@ #import "ios/web/public/webui/web_ui_ios_controller.h" #import "ios/web/public/webui/web_ui_ios_controller_factory.h" #import "ios/web/test/test_url_constants.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #import "services/network/test/test_url_loader_factory.h" #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller.mm b/ios/web_view/internal/autofill/cwv_autofill_controller.mm index a7cb8be..a512704 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
@@ -49,7 +49,7 @@ #import "ios/web_view/internal/signin/web_view_identity_manager_factory.h" #import "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/public/cwv_autofill_controller_delegate.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" using autofill::FieldRendererId; using autofill::FormData;
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm index 96a20e8..8f460f49 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm
@@ -44,7 +44,7 @@ #import "ios/web_view/internal/passwords/web_view_password_manager_client.h" #include "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/public/cwv_autofill_controller_delegate.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/web_view/internal/autofill/cwv_credit_card_saver.mm b/ios/web_view/internal/autofill/cwv_credit_card_saver.mm index f896092f..9d6b8e7 100644 --- a/ios/web_view/internal/autofill/cwv_credit_card_saver.mm +++ b/ios/web_view/internal/autofill/cwv_credit_card_saver.mm
@@ -12,7 +12,7 @@ #include "ios/web/public/thread/web_task_traits.h" #include "ios/web/public/thread/web_thread.h" #import "ios/web_view/internal/autofill/cwv_credit_card_internal.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "ui/gfx/range/range.h" NS_ASSUME_NONNULL_BEGIN
diff --git a/ios/web_view/internal/cwv_back_forward_list.mm b/ios/web_view/internal/cwv_back_forward_list.mm index 2d14bc4f..d2da4b2 100644 --- a/ios/web_view/internal/cwv_back_forward_list.mm +++ b/ios/web_view/internal/cwv_back_forward_list.mm
@@ -7,7 +7,7 @@ #import "base/strings/sys_string_conversions.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" @implementation CWVBackForwardListItemArray { BOOL _isBackList;
diff --git a/ios/web_view/internal/cwv_back_forward_list_item.mm b/ios/web_view/internal/cwv_back_forward_list_item.mm index 9c65f8c..aaefc46 100644 --- a/ios/web_view/internal/cwv_back_forward_list_item.mm +++ b/ios/web_view/internal/cwv_back_forward_list_item.mm
@@ -7,7 +7,7 @@ #import "base/apple/foundation_util.h" #import "base/strings/sys_string_conversions.h" #import "ios/web/public/navigation/navigation_item.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" @implementation CWVBackForwardListItem
diff --git a/ios/web_view/internal/cwv_download_task.mm b/ios/web_view/internal/cwv_download_task.mm index fb69649e..a1c3105f 100644 --- a/ios/web_view/internal/cwv_download_task.mm +++ b/ios/web_view/internal/cwv_download_task.mm
@@ -14,7 +14,7 @@ #include "ios/web/public/download/download_task_observer.h" #import "ios/web/public/download/download_task_observer_bridge.h" #include "ios/web_view/internal/cwv_web_view_internal.h" -#include "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/base/net_errors.h" int64_t const CWVDownloadSizeUnknown = -1;
diff --git a/ios/web_view/internal/cwv_favicon.mm b/ios/web_view/internal/cwv_favicon.mm index 369d487..06dc384 100644 --- a/ios/web_view/internal/cwv_favicon.mm +++ b/ios/web_view/internal/cwv_favicon.mm
@@ -6,7 +6,7 @@ #import <UIKit/UIKit.h> -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "ui/gfx/geometry/size.h" #include "url/gurl.h"
diff --git a/ios/web_view/internal/cwv_favicon_unittest.mm b/ios/web_view/internal/cwv_favicon_unittest.mm index 5af091d3..8b0264c 100644 --- a/ios/web_view/internal/cwv_favicon_unittest.mm +++ b/ios/web_view/internal/cwv_favicon_unittest.mm
@@ -8,7 +8,7 @@ #include <vector> #include "ios/web/public/favicon/favicon_url.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #include "testing/platform_test.h"
diff --git a/ios/web_view/internal/cwv_lookalike_url_handler.mm b/ios/web_view/internal/cwv_lookalike_url_handler.mm index 9a92007..939de29 100644 --- a/ios/web_view/internal/cwv_lookalike_url_handler.mm +++ b/ios/web_view/internal/cwv_lookalike_url_handler.mm
@@ -6,7 +6,7 @@ #include "ios/components/security_interstitials/lookalikes/lookalike_url_tab_allow_list.h" #import "ios/web/public/navigation/navigation_manager.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" @implementation CWVLookalikeURLHandler { web::WebState* _webState;
diff --git a/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm b/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm index 9459095..35155572 100644 --- a/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm +++ b/ios/web_view/internal/cwv_lookalike_url_handler_unittest.mm
@@ -12,7 +12,7 @@ #import "ios/components/security_interstitials/lookalikes/lookalike_url_tab_allow_list.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h" #import "ios/web/public/test/fakes/fake_web_state.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest_mac.h" #include "testing/platform_test.h"
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm index 4deacf13..620194a 100644 --- a/ios/web_view/internal/cwv_web_view.mm +++ b/ios/web_view/internal/cwv_web_view.mm
@@ -73,7 +73,7 @@ #import "ios/web_view/public/cwv_preview_element_info.h" #import "ios/web_view/public/cwv_ui_delegate.h" #import "ios/web_view/public/cwv_web_view_configuration.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "ui/base/page_transition_types.h" #include "url/gurl.h"
diff --git a/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler.mm b/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler.mm index d7ab0a7..8079b98 100644 --- a/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler.mm +++ b/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler.mm
@@ -12,7 +12,7 @@ #import "ios/components/security_interstitials/safe_browsing/unsafe_resource_util.h" #import "ios/web/public/navigation/navigation_manager.h" #import "ios/web/public/web_state.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" CWVUnsafeURLThreatType CWVUnsafeURLThreatTypeFromSBThreatType( safe_browsing::SBThreatType threatType) {
diff --git a/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler_unittest.mm b/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler_unittest.mm index 35ca149..4efd308 100644 --- a/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler_unittest.mm +++ b/ios/web_view/internal/safe_browsing/cwv_unsafe_url_handler_unittest.mm
@@ -11,7 +11,7 @@ #import "components/security_interstitials/core/unsafe_resource.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h" #import "ios/web/public/test/fakes/fake_web_state.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "services/network/public/mojom/fetch_api.mojom.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h"
diff --git a/ios/web_view/internal/web_view_java_script_dialog_presenter.mm b/ios/web_view/internal/web_view_java_script_dialog_presenter.mm index 3d42d5e..0b6960f 100644 --- a/ios/web_view/internal/web_view_java_script_dialog_presenter.mm +++ b/ios/web_view/internal/web_view_java_script_dialog_presenter.mm
@@ -6,7 +6,7 @@ #import "base/functional/callback_helpers.h" #import "ios/web_view/public/cwv_ui_delegate.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" namespace ios_web_view {
diff --git a/ios/web_view/internal/web_view_web_client.mm b/ios/web_view/internal/web_view_web_client.mm index 136c3231..4b0d511 100644 --- a/ios/web_view/internal/web_view_web_client.mm +++ b/ios/web_view/internal/web_view_web_client.mm
@@ -44,7 +44,7 @@ #import "ios/web_view/internal/web_view_web_main_parts.h" #import "ios/web_view/public/cwv_navigation_delegate.h" #import "ios/web_view/public/cwv_web_view.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/cert/cert_status_flags.h" #import "ui/base/l10n/l10n_util.h" #import "ui/base/resource/resource_bundle.h"
diff --git a/ios/web_view/test/navigation_delegate_inttest.mm b/ios/web_view/test/navigation_delegate_inttest.mm index c0c2b51..cb4a369 100644 --- a/ios/web_view/test/navigation_delegate_inttest.mm +++ b/ios/web_view/test/navigation_delegate_inttest.mm
@@ -7,7 +7,7 @@ #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest_mac.h" #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/web_view/test/ui_delegate_inttest.mm b/ios/web_view/test/ui_delegate_inttest.mm index ac5b09a..4f3eff5 100644 --- a/ios/web_view/test/ui_delegate_inttest.mm +++ b/ios/web_view/test/ui_delegate_inttest.mm
@@ -8,7 +8,7 @@ #import "base/test/ios/wait_util.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest_mac.h" #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/web_view/test/web_view_autofill_inttest.mm b/ios/web_view/test/web_view_autofill_inttest.mm index 5638fde..60f729a7 100644 --- a/ios/web_view/test/web_view_autofill_inttest.mm +++ b/ios/web_view/test/web_view_autofill_inttest.mm
@@ -11,7 +11,7 @@ #import "ios/web_view/public/cwv_navigation_delegate.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest_mac.h" #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/web_view/test/web_view_back_forward_list_inttest.mm b/ios/web_view/test/web_view_back_forward_list_inttest.mm index fe163b2..1a7f9514e 100644 --- a/ios/web_view/test/web_view_back_forward_list_inttest.mm +++ b/ios/web_view/test/web_view_back_forward_list_inttest.mm
@@ -9,7 +9,7 @@ #import "ios/web_view/test/observer.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest_mac.h" #include "url/gurl.h"
diff --git a/ios/web_view/test/web_view_from_wk_web_view_configuration_inttest.mm b/ios/web_view/test/web_view_from_wk_web_view_configuration_inttest.mm index 403941a..b0f2949 100644 --- a/ios/web_view/test/web_view_from_wk_web_view_configuration_inttest.mm +++ b/ios/web_view/test/web_view_from_wk_web_view_configuration_inttest.mm
@@ -10,7 +10,7 @@ #import "ios/web_view/test/observer.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest_mac.h" #include "url/gurl.h"
diff --git a/ios/web_view/test/web_view_inttest.mm b/ios/web_view/test/web_view_inttest.mm index c1a1083..6d5d1b3 100644 --- a/ios/web_view/test/web_view_inttest.mm +++ b/ios/web_view/test/web_view_inttest.mm
@@ -9,7 +9,7 @@ #import "base/test/ios/wait_util.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h"
diff --git a/ios/web_view/test/web_view_kvo_inttest.mm b/ios/web_view/test/web_view_kvo_inttest.mm index 285775ea..d89240b47 100644 --- a/ios/web_view/test/web_view_kvo_inttest.mm +++ b/ios/web_view/test/web_view_kvo_inttest.mm
@@ -12,7 +12,7 @@ #import "ios/web_view/test/observer.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest_mac.h" #include "url/gurl.h"
diff --git a/ios/web_view/test/web_view_script_message_handler_inttest.mm b/ios/web_view/test/web_view_script_message_handler_inttest.mm index 50e1673..0a87611f5 100644 --- a/ios/web_view/test/web_view_script_message_handler_inttest.mm +++ b/ios/web_view/test/web_view_script_message_handler_inttest.mm
@@ -7,7 +7,7 @@ #import "base/test/ios/wait_util.h" #import "ios/web_view/test/web_view_inttest_base.h" #import "ios/web_view/test/web_view_test_util.h" -#import "net/base/mac/url_conversions.h" +#import "net/base/apple/url_conversions.h" #import "net/test/embedded_test_server/embedded_test_server.h" #import "testing/gtest_mac.h"
diff --git a/ios_internal b/ios_internal index a14976d..51fd534 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit a14976d2e2ff641ed611c67ce8f61a1f86fefa55 +Subproject commit 51fd534742fad032462e1b917df03b94ef0a953f
diff --git a/media/capture/video/linux/v4l2_capture_delegate.cc b/media/capture/video/linux/v4l2_capture_delegate.cc index 729e6df3..973d24c 100644 --- a/media/capture/video/linux/v4l2_capture_delegate.cc +++ b/media/capture/video/linux/v4l2_capture_delegate.cc
@@ -187,9 +187,8 @@ const raw_ptr<V4L2CaptureDevice> v4l2_; - // This field is not a raw_ptr<> because it always points to a mmap'd - // region of memory outside of the PA heap. Thus, there would be overhead - // involved with using a raw_ptr<> but no safety gains. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION uint8_t* start_ = nullptr; size_t length_; size_t payload_size_;
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 023a87c..634f5799 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -681,6 +681,7 @@ done->Run(); } +#if !BUILDFLAG(IS_ANDROID) // Valid gl texture internal format that can try to use direct uploading path. bool ValidFormatForDirectUploading( viz::RasterContextProvider* raster_context_provider, @@ -705,6 +706,7 @@ return false; } } +#endif std::tuple<SkYUVAInfo::PlaneConfig, SkYUVAInfo::Subsampling> VideoPixelFormatAsSkYUVAInfoValues(VideoPixelFormat format) { @@ -727,26 +729,14 @@ } } +#if !BUILDFLAG(IS_ANDROID) // Controls whether the one-copy path when copying a VideoFrame to a GL texture -// is enabled or disabled. This codepath is disabled on Android by default -// pending the full transition of the codebase to the passthrough decoder and -// the transition of this function away from using legacy mailboxes to do 1-copy -// upload (see crbug.com/1494365 for details). On Android, this Feature serves -// as a reverse-killswitch while we roll out the complete disabling of this -// codepath. -// TODO(crbug.com/1494365): Remove the usage of this feature for Android once -// explicit disabling has safely rolled out and make -// UploadOfVideoFrameToGLTexture() unconditionally disabled on Android. -// On all other platforms, the one-copy path being enabled is the default +// is enabled or disabled. The one-copy path being enabled is the default // production state, with this Feature being used to be able to disable this // path for performance testing. BASE_FEATURE(kOneCopyUploadOfVideoFrameToGLTexture, "OneCopyUploadOfVideoFrameToGLTexture", -#if BUILDFLAG(IS_ANDROID) - base::FEATURE_DISABLED_BY_DEFAULT); -#else base::FEATURE_ENABLED_BY_DEFAULT); -#endif // Controls whether the one-copy path when copying a pure software VideoFrame // (i.e., a VideoFrame with no textures) to a GL texture is enabled or disabled. @@ -773,6 +763,7 @@ BASE_FEATURE(kOneCopyLegacyMPVideoFrameUploadViaSI, "OneCopyLegacyMPVideoFrameUploadViaSI", base::FEATURE_ENABLED_BY_DEFAULT); +#endif // !BUILDFLAG(IS_ANDROID) } // anonymous namespace @@ -1521,6 +1512,10 @@ // alpha been requested. And dst texture mipLevel must be 0. // TODO(crbug.com/1155003): Figure out whether premultiply options here are // accurate. + // NOTE: The direct upload path is not supported on Android (see comment on + // UploadVideoFrameToGLTexture()). + // TODO(crbug.com/1494365): Enable on Android. +#if !BUILDFLAG(IS_ANDROID) if ((media::IsOpaque(video_frame->format()) || premultiply_alpha) && level == 0 && (video_frame->NumTextures() > 1 || @@ -1535,6 +1530,7 @@ } } } +#endif // !BUILDFLAG(IS_ANDROID) if (!UpdateLastImage(video_frame, raster_context_provider, true /* allow_wrap_texture */)) { @@ -1601,6 +1597,7 @@ return true; } +#if !BUILDFLAG(IS_ANDROID) bool PaintCanvasVideoRenderer::UploadVideoFrameToGLTexture( viz::RasterContextProvider* raster_context_provider, gpu::gles2::GLES2Interface* destination_gl, @@ -1769,6 +1766,7 @@ return true; } +#endif // !BUILDFLAG(IS_ANDROID) bool PaintCanvasVideoRenderer::CopyVideoFrameYUVDataToGLTexture( viz::RasterContextProvider* raster_context_provider, @@ -1811,6 +1809,10 @@ // alpha been requested. And dst texture mipLevel must be 0. // TODO(crbug.com/1155003): Figure out whether premultiply options here are // accurate. + // NOTE: The direct upload path is not supported on Android (see comment on + // UploadVideoFrameToGLTexture()). + // TODO(crbug.com/1494365): Enable on Android. +#if !BUILDFLAG(IS_ANDROID) if ((media::IsOpaque(video_frame->format()) || premultiply_alpha) && level == 0) { if (base::FeatureList::IsEnabled(kOneCopyUploadOfVideoFrameToGLTexture)) { @@ -1822,6 +1824,7 @@ } } } +#endif // !BUILDFLAG(IS_ANDROID) auto* sii = raster_context_provider->SharedImageInterface(); gpu::raster::RasterInterface* source_ri =
diff --git a/media/renderers/paint_canvas_video_renderer.h b/media/renderers/paint_canvas_video_renderer.h index f68d537..89742054 100644 --- a/media/renderers/paint_canvas_video_renderer.h +++ b/media/renderers/paint_canvas_video_renderer.h
@@ -262,6 +262,9 @@ viz::RasterContextProvider* raster_context_provider, const gpu::MailboxHolder& dest_holder); +#if !BUILDFLAG(IS_ANDROID) + // NOTE: This functionality is currently disabled on Android (see + // crbug.com/1494365 for details). bool UploadVideoFrameToGLTexture( viz::RasterContextProvider* raster_context_provider, gpu::gles2::GLES2Interface* destination_gl, @@ -273,6 +276,7 @@ unsigned int format, unsigned int type, bool flip_y); +#endif // !BUILDFLAG(IS_ANDROID) bool CacheBackingWrapsTexture() const;
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index 40b0cec..a4b59ba 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -593,11 +593,17 @@ use_gpu_memory_buffer_resources && sii->GetCapabilities().supports_scanout_shared_images && CanCreateGpuMemoryBufferForSinglePlaneSharedImageFormat(format); - // These SharedImages will have the contents of VideoFrames written into - // them via the GLES2 interface and then will be sent over to the display - // compositor as TransferableResources. - uint32_t shared_image_usage = gpu::SHARED_IMAGE_USAGE_GLES2_WRITE | - gpu::SHARED_IMAGE_USAGE_DISPLAY_READ; + // These SharedImages will be sent over to the display compositor as + // TransferableResources. + uint32_t shared_image_usage = gpu::SHARED_IMAGE_USAGE_DISPLAY_READ; + if (CanUseRasterInterface()) { + // RasterInterface which in turn uses RasterDecoder writes the contents of + // video frames into SharedImages. + shared_image_usage |= gpu::SHARED_IMAGE_USAGE_RASTER_WRITE; + } else { + // GLES2 interface writes the contents of video frames into SharedImages. + shared_image_usage |= gpu::SHARED_IMAGE_USAGE_GLES2_WRITE; + } if (overlay_candidate_) { shared_image_usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT; texture_target_ = gpu::GetBufferTextureTarget( @@ -1146,6 +1152,9 @@ if (caps.texture_norm16 && shared_image_caps.supports_r16_shared_images) { return viz::SinglePlaneFormat::kR_16; } + if (shared_image_caps.is_r16f_supported) { + return viz::SinglePlaneFormat::kR_F16; + } if (caps.texture_half_float_linear && shared_image_caps.supports_luminance_shared_images) { return viz::SinglePlaneFormat::kLUMINANCE_F16; @@ -1364,6 +1373,7 @@ // if the need a bit downshift or if the strides need to be reconciled. const bool needs_conversion = plane_si_format == viz::SinglePlaneFormat::kLUMINANCE_F16 || + plane_si_format == viz::SinglePlaneFormat::kR_F16 || needs_bit_downshifting; constexpr size_t kDefaultUnpackRowLength = 0; @@ -1405,7 +1415,8 @@ } } - if (plane_si_format == viz::SinglePlaneFormat::kLUMINANCE_F16) { + if (plane_si_format == viz::SinglePlaneFormat::kLUMINANCE_F16 || + plane_si_format == viz::SinglePlaneFormat::kR_F16) { for (int row = 0; row < resource_size_pixels.height(); ++row) { uint16_t* dst = reinterpret_cast<uint16_t*>( &upload_pixels_[upload_image_stride * row]); @@ -1601,13 +1612,15 @@ const auto yuv_si_format = output_si_format; DCHECK(yuv_si_format.is_single_plane()); DCHECK(yuv_si_format == viz::SinglePlaneFormat::kLUMINANCE_F16 || + yuv_si_format == viz::SinglePlaneFormat::kR_F16 || yuv_si_format == viz::SinglePlaneFormat::kR_16 || yuv_si_format == viz::SinglePlaneFormat::kLUMINANCE_8 || yuv_si_format == viz::SinglePlaneFormat::kR_8) << yuv_si_format.ToString(); std::unique_ptr<HalfFloatMaker> half_float_maker; - if (yuv_si_format == viz::SinglePlaneFormat::kLUMINANCE_F16) { + if (yuv_si_format == viz::SinglePlaneFormat::kLUMINANCE_F16 || + yuv_si_format == viz::SinglePlaneFormat::kR_F16) { half_float_maker = HalfFloatMaker::NewHalfFloatMaker(bits_per_channel); external_resources.offset = half_float_maker->Offset(); external_resources.multiplier = half_float_maker->Multiplier();
diff --git a/mojo/core/channel_linux.cc b/mojo/core/channel_linux.cc index dc05ba9..8babe9cd 100644 --- a/mojo/core/channel_linux.cc +++ b/mojo/core/channel_linux.cc
@@ -601,9 +601,8 @@ SharedBuffer(uint8_t* ptr, size_t len) : base_ptr_(ptr), len_(len) {} - // This field is not a raw_ptr<> because it always points to a mmap'd - // region of memory outside of the PA heap. Thus, there would be overhead - // involved with using a raw_ptr<> but no safety gains. + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always mmap'ed), so + // there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION uint8_t* base_ptr_ = nullptr; size_t len_ = 0; };
diff --git a/mojo/core/ipcz_driver/ring_buffer.h b/mojo/core/ipcz_driver/ring_buffer.h index bc3981f..95c81eb 100644 --- a/mojo/core/ipcz_driver/ring_buffer.h +++ b/mojo/core/ipcz_driver/ring_buffer.h
@@ -11,7 +11,7 @@ #include "base/check.h" #include "base/containers/span.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "mojo/core/ipcz_driver/shared_buffer.h" #include "mojo/core/ipcz_driver/shared_buffer_mapping.h" @@ -51,9 +51,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION RingBuffer* buffer_; + raw_ptr<RingBuffer> buffer_; const Bytes bytes_; }; @@ -83,9 +81,7 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION RingBuffer* buffer_; + raw_ptr<RingBuffer> buffer_; const Bytes bytes_; };
diff --git a/mojo/public/cpp/bindings/array_data_view.h b/mojo/public/cpp/bindings/array_data_view.h index 8abba55..7573152 100644 --- a/mojo/public/cpp/bindings/array_data_view.h +++ b/mojo/public/cpp/bindings/array_data_view.h
@@ -37,11 +37,11 @@ const T* data() const { return data_->storage(); } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; }; @@ -59,11 +59,11 @@ bool operator[](size_t index) const { return data_->at(index); } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; }; @@ -91,11 +91,11 @@ } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; }; @@ -123,11 +123,11 @@ } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; }; @@ -150,11 +150,11 @@ } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; }; @@ -182,11 +182,11 @@ } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; }; @@ -211,11 +211,11 @@ } protected: - // `data_` is not a raw_ptr<...> for performance reasons (based on analysis of - // sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Data_* data_; - // `message_` is not a raw_ptr<...> for performance reasons (based on analysis - // of sampling profiler data). + // RAW_PTR_EXCLUSION: Performance reasons: based on analysis of sampling + // profiler data. RAW_PTR_EXCLUSION Message* message_; };
diff --git a/mojo/public/cpp/bindings/array_traits_stl.h b/mojo/public/cpp/bindings/array_traits_stl.h index 224d90be..cbe7711 100644 --- a/mojo/public/cpp/bindings/array_traits_stl.h +++ b/mojo/public/cpp/bindings/array_traits_stl.h
@@ -86,7 +86,7 @@ template <typename K, typename V> struct MapValuesArrayView { explicit MapValuesArrayView(const std::map<K, V>& map) : map(map) {} - // `map` is not a raw_ref<...> as that leads to a binary size increase. + // RAW_PTR_EXCLUSION: Binary size increase. RAW_PTR_EXCLUSION const std::map<K, V>& map; };
diff --git a/mojo/public/cpp/bindings/lib/array_serialization.h b/mojo/public/cpp/bindings/lib/array_serialization.h index fdcfd22..a04824a9 100644 --- a/mojo/public/cpp/bindings/lib/array_serialization.h +++ b/mojo/public/cpp/bindings/lib/array_serialization.h
@@ -56,7 +56,7 @@ const MaybeConstUserType& input() const { return input_; } private: - // `input_` is not a raw_ref<...> as that leads to a binary size increase. + // RAW_PTR_EXCLUSION: Binary size increase. RAW_PTR_EXCLUSION MaybeConstUserType& input_; IteratorType iter_; }; @@ -78,7 +78,7 @@ const MaybeConstUserType& input() const { return input_; } private: - // `input_` is not a raw_ref<...> as it leads to a binary size increase. + // RAW_PTR_EXCLUSION: Binary size increase. RAW_PTR_EXCLUSION MaybeConstUserType& input_; size_t iter_; };
diff --git a/mojo/public/cpp/bindings/lib/map_serialization.h b/mojo/public/cpp/bindings/lib/map_serialization.h index 8bbbf02..ee2b050c 100644 --- a/mojo/public/cpp/bindings/lib/map_serialization.h +++ b/mojo/public/cpp/bindings/lib/map_serialization.h
@@ -37,7 +37,7 @@ void* GetDataIfExists() { return nullptr; } protected: - // `input_` is not a raw_ref<...> as that leads to a binary size increase. + // RAW_PTR_EXCLUSION: Binary size increase. RAW_PTR_EXCLUSION MaybeConstUserType& input_; MaybeConstIterator iter_; };
diff --git a/mojo/public/cpp/bindings/lib/message_fragment.h b/mojo/public/cpp/bindings/lib/message_fragment.h index 21e59e4..14613da 100644 --- a/mojo/public/cpp/bindings/lib/message_fragment.h +++ b/mojo/public/cpp/bindings/lib/message_fragment.h
@@ -87,8 +87,7 @@ } private: - // Exclude from `raw_ref` rewriter - increases Android binary size by - // ~350K. + // RAW_PTR_EXCLUSION: Binary size increase (~350K on Android). RAW_PTR_EXCLUSION Message& message_; size_t index_ = kInvalidFragmentIndex; }; @@ -161,8 +160,7 @@ } private: - // Exclude from `raw_ref` rewriter - increases Android binary size by - // ~350K. + // RAW_PTR_EXCLUSION: Binary size increase (~350K on Android). RAW_PTR_EXCLUSION Message& message_; size_t index_ = kInvalidFragmentIndex; };
diff --git a/mojo/public/cpp/bindings/lib/validation_context.h b/mojo/public/cpp/bindings/lib/validation_context.h index bb70ebd..f102f605 100644 --- a/mojo/public/cpp/bindings/lib/validation_context.h +++ b/mojo/public/cpp/bindings/lib/validation_context.h
@@ -161,7 +161,7 @@ return end > begin && begin >= data_begin_ && end <= data_end_; } - // Not a raw_ptr<...> for performance reasons: on-stack pointer + based on + // RAW_PTR_EXCLUSION: Performance reasons: on-stack pointer + based on // analysis of sampling profiler data (MultiplexRouter::ProcessIncomingMessage // -> PipeControlMessageHandler::Accept -> PipeControlMessageHandler::Validate // -> constructs ValidationContext).
diff --git a/mojo/public/cpp/bindings/receiver_set.cc b/mojo/public/cpp/bindings/receiver_set.cc index a0454e9..ac30aa9 100644 --- a/mojo/public/cpp/bindings/receiver_set.cc +++ b/mojo/public/cpp/bindings/receiver_set.cc
@@ -41,7 +41,7 @@ nested_filter_->DidDispatchOrReject(message, accepted); } - // `entry_` is not a raw_ref<...> as that leads to a binary size increase. + // RAW_PTR_EXCLUSION: Binary size increase. RAW_PTR_EXCLUSION Entry& entry_; std::unique_ptr<MessageFilter> nested_filter_; };
diff --git a/mojo/public/cpp/bindings/receiver_set.h b/mojo/public/cpp/bindings/receiver_set.h index 94a4e90..9349b17 100644 --- a/mojo/public/cpp/bindings/receiver_set.h +++ b/mojo/public/cpp/bindings/receiver_set.h
@@ -17,6 +17,7 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/memory/ptr_util.h" +#include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/task/sequenced_task_runner.h" #include "mojo/public/cpp/bindings/connection_error_callback.h" @@ -95,7 +96,7 @@ void OnDisconnect(uint32_t custom_reason_code, const std::string& description); - // `state_` is not a raw_ref<...> as that leads to a binary size increase. + // RAW_PTR_EXCLUSION: Binary size increase. RAW_PTR_EXCLUSION ReceiverSetState& state_; const ReceiverId id_; const std::unique_ptr<ReceiverState> receiver_; @@ -148,9 +149,7 @@ RepeatingConnectionErrorWithReasonCallback disconnect_with_reason_handler_; ReceiverId next_receiver_id_ = 0; EntryMap entries_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION void* current_context_ = nullptr; + raw_ptr<void, DanglingUntriaged> current_context_ = nullptr; ReceiverId current_receiver_; base::WeakPtrFactory<ReceiverSetState> weak_ptr_factory_{this}; };
diff --git a/mojo/public/cpp/bindings/string_data_view.h b/mojo/public/cpp/bindings/string_data_view.h index dac6b63..aad2d3f8 100644 --- a/mojo/public/cpp/bindings/string_data_view.h +++ b/mojo/public/cpp/bindings/string_data_view.h
@@ -26,8 +26,8 @@ size_t size() const { return data_->size(); } private: - // `data_` is not a raw_ptr<> for performance reasons: based on this sampling - // profiler result on Mac. go/brp-mac-prof-diff-20230403 + // RAW_PTR_EXCLUSION: Performance reasons: based on this sampling profiler + // result on Mac. go/brp-mac-prof-diff-20230403 RAW_PTR_EXCLUSION internal::String_Data* data_ = nullptr; };
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc index bba6cab6..a74721b 100644 --- a/net/http/http_auth_cache.cc +++ b/net/http/http_auth_cache.cc
@@ -8,7 +8,7 @@ #include <map> #include "base/logging.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ref.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "url/gurl.h" @@ -62,11 +62,9 @@ struct IsEnclosedBy { explicit IsEnclosedBy(const std::string& path) : path(path) { } bool operator() (const std::string& x) const { - return IsEnclosingPath(path, x); + return IsEnclosingPath(*path, x); } - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const std::string& path; + const raw_ref<const std::string> path; }; } // namespace
diff --git a/net/proxy_resolution/proxy_resolver_apple.cc b/net/proxy_resolution/proxy_resolver_apple.cc index db8cc70..9b2225f 100644 --- a/net/proxy_resolution/proxy_resolver_apple.cc +++ b/net/proxy_resolution/proxy_resolver_apple.cc
@@ -13,6 +13,7 @@ #include "base/apple/scoped_cftyperef.h" #include "base/check.h" #include "base/lazy_instance.h" +#include "base/memory/raw_ref.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" #include "base/synchronization/lock.h" @@ -105,7 +106,7 @@ private: // Lock to use to synchronize the run loop sources. - base::Lock& lock_; + const raw_ref<base::Lock> lock_; // Indicates whether the current observer holds the lock. It is used to // avoid double locking and releasing. bool lock_acquired_ = false; @@ -155,7 +156,7 @@ switch (activity) { case kCFRunLoopBeforeSources: if (!lock_acquired_) { - lock_.Acquire(); + lock_->Acquire(); lock_acquired_ = true; } break; @@ -163,7 +164,7 @@ case kCFRunLoopExit: if (lock_acquired_) { lock_acquired_ = false; - lock_.Release(); + lock_->Release(); } break; }
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index 58eae16..253ca31 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -20,7 +20,6 @@ #include "base/functional/callback.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "build/build_config.h" @@ -450,9 +449,7 @@ void Reset() override; StaticSocketDataHelper helper_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION SocketDataPrinter* printer_ = nullptr; + raw_ptr<SocketDataPrinter> printer_ = nullptr; bool paused_ = false; };
diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h index f9f66e3..6b4f3a5 100644 --- a/net/url_request/url_request_context.h +++ b/net/url_request/url_request_context.h
@@ -307,7 +307,7 @@ void set_transport_security_persister( std::unique_ptr<TransportSecurityPersister> transport_security_persister); - raw_ptr<NetLog> net_log_ = nullptr; + raw_ptr<NetLog, DanglingUntriaged> net_log_ = nullptr; std::unique_ptr<HostResolver> host_resolver_; std::unique_ptr<CertVerifier> cert_verifier_;
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc index 66e61a6..85e1047 100644 --- a/remoting/protocol/connection_unittest.cc +++ b/remoting/protocol/connection_unittest.cc
@@ -8,7 +8,6 @@ #include "base/functional/bind.h" #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/numerics/math_constants.h" #include "base/run_loop.h" #include "base/test/task_environment.h" @@ -110,9 +109,7 @@ void FailNthFrame(int n) { capture_request_index_to_fail_ = n; } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION Callback* callback_ = nullptr; + raw_ptr<Callback> callback_ = nullptr; int frame_index_ = 0; int capture_request_index_to_fail_ = -1;
diff --git a/sandbox/linux/seccomp-bpf/trap.cc b/sandbox/linux/seccomp-bpf/trap.cc index 7f262aa..d466e62 100644 --- a/sandbox/linux/seccomp-bpf/trap.cc +++ b/sandbox/linux/seccomp-bpf/trap.cc
@@ -30,8 +30,7 @@ namespace { struct arch_sigsys { - // This is not raw_ptr because it is a pointer to a code address given to us - // by the kernel. + // RAW_PTR_EXCLUSION: Points to a code address given to us by the kernel. RAW_PTR_EXCLUSION void* ip; int nr; unsigned int arch;
diff --git a/sandbox/linux/seccomp-bpf/trap.h b/sandbox/linux/seccomp-bpf/trap.h index 60a1ead..90e83e9 100644 --- a/sandbox/linux/seccomp-bpf/trap.h +++ b/sandbox/linux/seccomp-bpf/trap.h
@@ -10,7 +10,6 @@ #include <map> -#include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "sandbox/linux/bpf_dsl/trap_registry.h" #include "sandbox/linux/system_headers/linux_signal.h" @@ -72,8 +71,8 @@ // Array of handlers indexed by ids. // - // This is not a raw_ptr as it is an owning pointer anyway, and needs - // to be safe for signal handlers. + // RAW_PTR_EXCLUSION: An owning pointer, and needs to be safe for signal + // handlers. RAW_PTR_EXCLUSION TrapRegistry::Handler* trap_array_ = nullptr; size_t trap_array_size_ = 0; // Currently used size of array size_t trap_array_capacity_ = 0; // Currently allocated capacity of array
diff --git a/sandbox/linux/syscall_broker/broker_simple_message.h b/sandbox/linux/syscall_broker/broker_simple_message.h index 4b6ee5b..f25669f6 100644 --- a/sandbox/linux/syscall_broker/broker_simple_message.h +++ b/sandbox/linux/syscall_broker/broker_simple_message.h
@@ -118,11 +118,10 @@ // The statically allocated buffer of size |kMaxMessageLength|. uint8_t message_[kMaxMessageLength]; - // Excluded for Async safety. Note that since these pointers are into - // the `message_` buffer above, they are valid whenever `this` is valid. - // Next location in the `message_` buffer to read from. + // Next location in the `message_` buffer to read from/write to. + // RAW_PTR_EXCLUSION: Point into the `message_` buffer above, so they are + // valid whenever `this` is valid. RAW_PTR_EXCLUSION uint8_t* read_next_ = message_; - // Next location in the `message_` buffer to write from. RAW_PTR_EXCLUSION uint8_t* write_next_ = message_; };
diff --git a/sandbox/win/src/eat_resolver.h b/sandbox/win/src/eat_resolver.h index 924354e..1071aee1 100644 --- a/sandbox/win/src/eat_resolver.h +++ b/sandbox/win/src/eat_resolver.h
@@ -43,7 +43,7 @@ private: // The entry to patch. - // The field is accessed too early during the process startup to support + // RAW_PTR_EXCLUSION: Accessed too early during the process startup to support // raw_ptr<T>. RAW_PTR_EXCLUSION DWORD* eat_entry_; };
diff --git a/sandbox/win/src/interception_agent.h b/sandbox/win/src/interception_agent.h index 07c3f82c..63eae25 100644 --- a/sandbox/win/src/interception_agent.h +++ b/sandbox/win/src/interception_agent.h
@@ -79,7 +79,7 @@ ResolverThunk* GetResolver(InterceptionType type); // Shared memory containing the list of functions to intercept. - // The field is accessed too early during the process startup to support + // RAW_PTR_EXCLUSION: Accessed too early during the process startup to support // raw_ptr<T>. RAW_PTR_EXCLUSION SharedMemory* interceptions_;
diff --git a/sandbox/win/src/resolver.h b/sandbox/win/src/resolver.h index 5dd5bbc..d1e352c 100644 --- a/sandbox/win/src/resolver.h +++ b/sandbox/win/src/resolver.h
@@ -99,11 +99,11 @@ const void* original_function, const void* interceptor); // Holds the resolved interception target. - // The field is accessed too early during the process startup to support - // raw_ptr<T>. + // RAW_PTR_EXCLUSION: #addr-of; Also, accessed too early during the process + // startup to support raw_ptr<T>. RAW_PTR_EXCLUSION void* target_; // Holds the resolved interception interceptor. - // The field is accessed too early during the process startup to support + // RAW_PTR_EXCLUSION: Accessed too early during the process startup to support // raw_ptr<T>. RAW_PTR_EXCLUSION const void* interceptor_; };
diff --git a/services/audio/output_controller.h b/services/audio/output_controller.h index cc05e1a..c017250 100644 --- a/services/audio/output_controller.h +++ b/services/audio/output_controller.h
@@ -240,10 +240,8 @@ private: void WedgeCheck(); - // Using a raw pointer is safe since the OutputController object will - // outlive the ErrorStatisticsTracker object. - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union + // RAW_PTR_EXCLUSION: OutputController object will outlive the + // ErrorStatisticsTracker object. RAW_PTR_EXCLUSION OutputController* const controller_; const base::TimeTicks start_time_; @@ -294,9 +292,7 @@ // being called. void ProcessDeviceChange(); - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION media::AudioManager* const audio_manager_; + const raw_ptr<media::AudioManager> audio_manager_; const media::AudioParameters params_; // Callback to create a device output stream; if not specified - @@ -306,10 +302,7 @@ // This object (OC) is owned by an OutputStream (OS) object which is an // EventHandler. |handler_| is set at construction by the OS (using this). - // It is safe to use a raw pointer here since the OS will always outlive - // the OC object. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union + // RAW_PTR_EXCLUSION: OS will always outlive the OC object. RAW_PTR_EXCLUSION EventHandler* const handler_; // The task runner for the audio manager. All control methods should be called @@ -324,9 +317,7 @@ // default output device. const std::string output_device_id_; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION media::AudioOutputStream* stream_; + raw_ptr<media::AudioOutputStream, DanglingUntriaged> stream_; // When true, local audio output should be muted; either by having audio // diverted to |diverting_to_stream_|, or a fake AudioOutputStream. @@ -343,9 +334,7 @@ State state_; // SyncReader is used only in low latency mode for synchronous reading. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION SyncReader* const sync_reader_; + const raw_ptr<SyncReader> sync_reader_; // Scans audio samples from OnMoreData() as input to compute power levels. media::AudioPowerMonitor power_monitor_;
diff --git a/services/audio/test/fake_loopback_group_member.h b/services/audio/test/fake_loopback_group_member.h index 4d5e1e08..b677d5da 100644 --- a/services/audio/test/fake_loopback_group_member.h +++ b/services/audio/test/fake_loopback_group_member.h
@@ -8,7 +8,7 @@ #include <memory> #include <vector> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "base/unguessable_token.h" #include "media/base/audio_parameters.h" @@ -68,9 +68,7 @@ int64_t at_frame_ = 0; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION Snooper* snooper_ = nullptr; + raw_ptr<Snooper> snooper_ = nullptr; }; } // namespace audio
diff --git a/services/device/usb/usb_descriptors.h b/services/device/usb/usb_descriptors.h index 347884f..1ca2ac5 100644 --- a/services/device/usb/usb_descriptors.h +++ b/services/device/usb/usb_descriptors.h
@@ -13,7 +13,7 @@ #include <vector> #include "base/functional/callback_forward.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "services/device/public/mojom/usb_device.mojom.h" @@ -28,12 +28,8 @@ bool IsValid() const; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const mojom::UsbInterfaceInfo* interface = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const mojom::UsbAlternateInterfaceInfo* alternate = nullptr; + raw_ptr<const mojom::UsbInterfaceInfo> interface = nullptr; + raw_ptr<const mojom::UsbAlternateInterfaceInfo> alternate = nullptr; }; struct UsbDeviceDescriptor {
diff --git a/services/device/usb/usb_device_handle_impl.cc b/services/device/usb/usb_device_handle_impl.cc index fcdf881..c556bd1 100644 --- a/services/device/usb/usb_device_handle_impl.cc +++ b/services/device/usb/usb_device_handle_impl.cc
@@ -1016,7 +1016,7 @@ for (const auto& endpoint : interface_info.alternate->endpoints) { endpoint_map_[ConvertEndpointNumberToAddress(*endpoint)] = { - interface_info.interface, endpoint.get()}; + interface_info.interface.get(), endpoint.get()}; } } }
diff --git a/services/device/usb/usb_device_handle_mac.cc b/services/device/usb/usb_device_handle_mac.cc index ac777fe..9c30e80 100644 --- a/services/device/usb/usb_device_handle_mac.cc +++ b/services/device/usb/usb_device_handle_mac.cc
@@ -853,7 +853,7 @@ uint8_t pipe_reference = 1; for (const auto& endpoint : interface_info.alternate->endpoints) { endpoint_map_[ConvertEndpointNumberToAddress(*endpoint)] = { - interface_info.interface, endpoint.get(), pipe_reference}; + interface_info.interface.get(), endpoint.get(), pipe_reference}; pipe_reference++; } }
diff --git a/services/device/usb/usb_device_handle_usbfs.cc b/services/device/usb/usb_device_handle_usbfs.cc index 3657aa49..ec4a06a 100644 --- a/services/device/usb/usb_device_handle_usbfs.cc +++ b/services/device/usb/usb_device_handle_usbfs.cc
@@ -946,7 +946,7 @@ EndpointInfo& info = endpoints_[ConvertEndpointNumberToAddress(*endpoint)]; info.type = endpoint->type; - info.interface = interface.interface; + info.interface = interface.interface.get(); } } }
diff --git a/services/network/public/cpp/content_security_policy/content_security_policy.cc b/services/network/public/cpp/content_security_policy/content_security_policy.cc index c8a1783..c4db175 100644 --- a/services/network/public/cpp/content_security_policy/content_security_policy.cc +++ b/services/network/public/cpp/content_security_policy/content_security_policy.cc
@@ -450,12 +450,17 @@ if (host.empty()) return false; - for (const std::string_view& piece : base::SplitStringPiece( - host, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL)) { - if (piece.empty() || !base::ranges::all_of(piece, [](auto c) { + std::vector<base::StringPiece> host_pieces = base::SplitStringPiece( + host, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + for (int i = 0; const std::string_view& piece : host_pieces) { + // Only a trailing dot is allowed. + if ((piece.empty() && i + 1 < std::ssize(host_pieces)) || + !base::ranges::all_of(piece, [](auto c) { return base::IsAsciiAlpha(c) || base::IsAsciiDigit(c) || c == '-'; - })) + })) { return false; + } + ++i; } csp_source->host = std::string(host);
diff --git a/services/network/public/cpp/content_security_policy/content_security_policy_unittest.cc b/services/network/public/cpp/content_security_policy/content_security_policy_unittest.cc index fd094235..a3d270e 100644 --- a/services/network/public/cpp/content_security_policy/content_security_policy_unittest.cc +++ b/services/network/public/cpp/content_security_policy/content_security_policy_unittest.cc
@@ -196,10 +196,13 @@ // Dot separation. {"a", {{{"", "a"}}}}, {"a.b.c", {{{"", "a.b.c"}}}}, - {"a.b."}, {".b.c"}, {"a..c"}, + // Trailing dots + {"a.", {{{"", "a."}}}}, + {"a.b.", {{{"", "a.b."}}}}, + // Valid/Invalid characters. {"az09-", {{{"", "az09-"}}}}, {"+"},
diff --git a/services/network/public/cpp/ip_address_space_util.cc b/services/network/public/cpp/ip_address_space_util.cc index 29792be5..81c0f09 100644 --- a/services/network/public/cpp/ip_address_space_util.cc +++ b/services/network/public/cpp/ip_address_space_util.cc
@@ -328,8 +328,8 @@ const GURL& ResponseUrl( const GURL& request_url, absl::optional<CalculateClientAddressSpaceParams> params) { - if (params.has_value() && !params->url_list_via_service_worker.empty()) { - return params.value().url_list_via_service_worker.back(); + if (params.has_value() && !params->url_list_via_service_worker->empty()) { + return params.value().url_list_via_service_worker->back(); } return request_url; } @@ -361,15 +361,15 @@ // First, check whether the response forces itself into a public address space // as per https://wicg.github.io/cors-rfc1918/#csp. - DCHECK(params->parsed_headers) << "CalculateIPAddressSpace() called for URL " - << url << " with null parsed_headers."; + DCHECK(*params->parsed_headers) << "CalculateIPAddressSpace() called for URL " + << url << " with null parsed_headers."; if (ShouldTreatAsPublicAddress( - params->parsed_headers->content_security_policy)) { + (*params->parsed_headers)->content_security_policy)) { return mojom::IPAddressSpace::kPublic; } // Otherwise, calculate the address space via the provided IP address. - return IPEndPointToIPAddressSpace(params->remote_endpoint); + return IPEndPointToIPAddressSpace(*params->remote_endpoint); } mojom::IPAddressSpace CalculateResourceAddressSpace(
diff --git a/services/network/public/cpp/ip_address_space_util.h b/services/network/public/cpp/ip_address_space_util.h index eb991b0..141cc8c 100644 --- a/services/network/public/cpp/ip_address_space_util.h +++ b/services/network/public/cpp/ip_address_space_util.h
@@ -9,7 +9,7 @@ #include <vector> #include "base/component_export.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ref.h" #include "services/network/public/mojom/ip_address_space.mojom-forward.h" #include "services/network/public/mojom/parsed_headers.mojom-forward.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -87,15 +87,9 @@ const net::IPEndPoint& remote_endpoint); ~CalculateClientAddressSpaceParams(); - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const std::vector<GURL>& url_list_via_service_worker; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const mojom::ParsedHeadersPtr& parsed_headers; - // This field is not a raw_ref<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const net::IPEndPoint& remote_endpoint; + const raw_ref<const std::vector<GURL>> url_list_via_service_worker; + const raw_ref<const mojom::ParsedHeadersPtr> parsed_headers; + const raw_ref<const net::IPEndPoint> remote_endpoint; }; // Given a request URL and `params`, this function calculates the
diff --git a/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom b/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom index bddf59fe..bea796f 100644 --- a/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom +++ b/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom
@@ -25,6 +25,7 @@ BGRX_8888, RGBX_1010102, BGRX_1010102, + R_F16, // Legacy multiplanar formats (used before Multiplanar SharedImage was // introduced).
diff --git a/storage/browser/file_system/obfuscated_file_util_memory_delegate.cc b/storage/browser/file_system/obfuscated_file_util_memory_delegate.cc index cb7da7c..dc22c7ce 100644 --- a/storage/browser/file_system/obfuscated_file_util_memory_delegate.cc +++ b/storage/browser/file_system/obfuscated_file_util_memory_delegate.cc
@@ -9,7 +9,7 @@ #include "base/allocator/partition_allocator/src/partition_alloc/partition_alloc_constants.h" #include "base/files/file_util.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/numerics/checked_math.h" #include "base/numerics/safe_conversions.h" #include "base/ranges/algorithm.h" @@ -76,14 +76,10 @@ struct ObfuscatedFileUtilMemoryDelegate::DecomposedPath { // Entry in the directory structure that the input |path| referes to, // nullptr if the entry does not exist. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION Entry* entry = nullptr; + raw_ptr<Entry, DanglingUntriaged> entry = nullptr; // Parent of the |path| in the directory structure, nullptr if not exists. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION Entry* parent = nullptr; + raw_ptr<Entry, DanglingUntriaged> parent = nullptr; // Normalized components of the path after the |root_|. E.g., if the root // is 'foo/' and the path is 'foo/./bar/baz', it will be ['bar', 'baz'].
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 569e586..cd8adfa 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -2016,7 +2016,7 @@ { "autotest_name": "chromium", "cros_board": "brya", - "cros_img": "brya-release/R120-15662.57.0", + "cros_img": "brya-release/R121-15699.40.0", "dut_pool": "chrome", "name": "chromeos_integration_tests BRYA_RELEASE_BETA", "test": "chromeos_integration_tests", @@ -2026,7 +2026,7 @@ { "autotest_name": "chromium", "cros_board": "brya", - "cros_img": "brya-release/R121-15699.25.0", + "cros_img": "brya-release/R122-15748.0.0", "dut_pool": "chrome", "name": "chromeos_integration_tests BRYA_RELEASE_DEV", "test": "chromeos_integration_tests", @@ -2046,7 +2046,7 @@ { "autotest_name": "chromium", "cros_board": "brya", - "cros_img": "brya-release/R120-15662.64.0", + "cros_img": "brya-release/R120-15662.76.0", "dut_pool": "chrome", "name": "chromeos_integration_tests BRYA_RELEASE_STABLE", "test": "chromeos_integration_tests", @@ -2056,7 +2056,7 @@ { "autotest_name": "chromium", "cros_board": "dedede", - "cros_img": "dedede-release/R120-15662.57.0", + "cros_img": "dedede-release/R121-15699.40.0", "name": "chromeos_integration_tests DEDEDE_RELEASE_BETA", "test": "chromeos_integration_tests", "test_id_prefix": "ninja://chrome/test:chromeos_integration_tests/", @@ -2065,7 +2065,7 @@ { "autotest_name": "chromium", "cros_board": "dedede", - "cros_img": "dedede-release/R121-15699.25.0", + "cros_img": "dedede-release/R122-15748.0.0", "name": "chromeos_integration_tests DEDEDE_RELEASE_DEV", "test": "chromeos_integration_tests", "test_id_prefix": "ninja://chrome/test:chromeos_integration_tests/", @@ -2083,7 +2083,7 @@ { "autotest_name": "chromium", "cros_board": "dedede", - "cros_img": "dedede-release/R120-15662.64.0", + "cros_img": "dedede-release/R120-15662.76.0", "name": "chromeos_integration_tests DEDEDE_RELEASE_STABLE", "test": "chromeos_integration_tests", "test_id_prefix": "ninja://chrome/test:chromeos_integration_tests/", @@ -2092,7 +2092,7 @@ { "autotest_name": "chromium", "cros_board": "fizz", - "cros_img": "fizz-release/R120-15662.57.0", + "cros_img": "fizz-release/R121-15699.40.0", "dut_pool": "chrome", "name": "chromeos_integration_tests FIZZ_RELEASE_BETA", "test": "chromeos_integration_tests", @@ -2102,7 +2102,7 @@ { "autotest_name": "chromium", "cros_board": "fizz", - "cros_img": "fizz-release/R121-15699.25.0", + "cros_img": "fizz-release/R122-15748.0.0", "dut_pool": "chrome", "name": "chromeos_integration_tests FIZZ_RELEASE_DEV", "test": "chromeos_integration_tests", @@ -2122,7 +2122,7 @@ { "autotest_name": "chromium", "cros_board": "fizz", - "cros_img": "fizz-release/R120-15662.64.0", + "cros_img": "fizz-release/R120-15662.76.0", "dut_pool": "chrome", "name": "chromeos_integration_tests FIZZ_RELEASE_STABLE", "test": "chromeos_integration_tests", @@ -2132,7 +2132,7 @@ { "autotest_name": "chromium", "cros_board": "guybrush", - "cros_img": "guybrush-release/R120-15662.57.0", + "cros_img": "guybrush-release/R121-15699.40.0", "dut_pool": "chrome", "name": "chromeos_integration_tests GUYBRUSH_RELEASE_BETA", "test": "chromeos_integration_tests", @@ -2142,7 +2142,7 @@ { "autotest_name": "chromium", "cros_board": "guybrush", - "cros_img": "guybrush-release/R121-15694.0.0", + "cros_img": "guybrush-release/R122-15748.0.0", "dut_pool": "chrome", "name": "chromeos_integration_tests GUYBRUSH_RELEASE_DEV", "test": "chromeos_integration_tests", @@ -2162,7 +2162,7 @@ { "autotest_name": "chromium", "cros_board": "guybrush", - "cros_img": "guybrush-release/R120-15662.64.0", + "cros_img": "guybrush-release/R120-15662.76.0", "dut_pool": "chrome", "name": "chromeos_integration_tests GUYBRUSH_RELEASE_STABLE", "test": "chromeos_integration_tests", @@ -2172,7 +2172,7 @@ { "autotest_name": "chromium", "cros_board": "puff", - "cros_img": "puff-release/R120-15662.57.0", + "cros_img": "puff-release/R121-15699.40.0", "dut_pool": "chrome", "name": "chromeos_integration_tests PUFF_RELEASE_BETA", "test": "chromeos_integration_tests", @@ -2182,7 +2182,7 @@ { "autotest_name": "chromium", "cros_board": "puff", - "cros_img": "puff-release/R121-15699.25.0", + "cros_img": "puff-release/R122-15748.0.0", "dut_pool": "chrome", "name": "chromeos_integration_tests PUFF_RELEASE_DEV", "test": "chromeos_integration_tests", @@ -2202,7 +2202,7 @@ { "autotest_name": "chromium", "cros_board": "puff", - "cros_img": "puff-release/R120-15662.64.0", + "cros_img": "puff-release/R120-15662.76.0", "dut_pool": "chrome", "name": "chromeos_integration_tests PUFF_RELEASE_STABLE", "test": "chromeos_integration_tests", @@ -2212,7 +2212,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "brya", - "cros_img": "brya-release/R120-15662.57.0", + "cros_img": "brya-release/R121-15699.40.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests BRYA_RELEASE_BETA", "resultdb": { @@ -2230,7 +2230,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "brya", - "cros_img": "brya-release/R121-15699.25.0", + "cros_img": "brya-release/R122-15748.0.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests BRYA_RELEASE_DEV", "resultdb": { @@ -2266,7 +2266,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "brya", - "cros_img": "brya-release/R120-15662.64.0", + "cros_img": "brya-release/R120-15662.76.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests BRYA_RELEASE_STABLE", "resultdb": { @@ -2284,7 +2284,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "dedede", - "cros_img": "dedede-release/R120-15662.57.0", + "cros_img": "dedede-release/R121-15699.40.0", "name": "lacros_all_tast_tests DEDEDE_RELEASE_BETA", "resultdb": { "enable": true, @@ -2301,7 +2301,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "dedede", - "cros_img": "dedede-release/R121-15699.25.0", + "cros_img": "dedede-release/R122-15748.0.0", "name": "lacros_all_tast_tests DEDEDE_RELEASE_DEV", "resultdb": { "enable": true, @@ -2335,7 +2335,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "dedede", - "cros_img": "dedede-release/R120-15662.64.0", + "cros_img": "dedede-release/R120-15662.76.0", "name": "lacros_all_tast_tests DEDEDE_RELEASE_STABLE", "resultdb": { "enable": true, @@ -2352,7 +2352,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "fizz", - "cros_img": "fizz-release/R120-15662.57.0", + "cros_img": "fizz-release/R121-15699.40.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests FIZZ_RELEASE_BETA", "resultdb": { @@ -2370,7 +2370,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "fizz", - "cros_img": "fizz-release/R121-15699.25.0", + "cros_img": "fizz-release/R122-15748.0.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests FIZZ_RELEASE_DEV", "resultdb": { @@ -2406,7 +2406,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "fizz", - "cros_img": "fizz-release/R120-15662.64.0", + "cros_img": "fizz-release/R120-15662.76.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests FIZZ_RELEASE_STABLE", "resultdb": { @@ -2424,7 +2424,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "guybrush", - "cros_img": "guybrush-release/R120-15662.57.0", + "cros_img": "guybrush-release/R121-15699.40.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests GUYBRUSH_RELEASE_BETA", "resultdb": { @@ -2442,7 +2442,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "guybrush", - "cros_img": "guybrush-release/R121-15694.0.0", + "cros_img": "guybrush-release/R122-15748.0.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests GUYBRUSH_RELEASE_DEV", "resultdb": { @@ -2478,7 +2478,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "guybrush", - "cros_img": "guybrush-release/R120-15662.64.0", + "cros_img": "guybrush-release/R120-15662.76.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests GUYBRUSH_RELEASE_STABLE", "resultdb": { @@ -2496,7 +2496,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "puff", - "cros_img": "puff-release/R120-15662.57.0", + "cros_img": "puff-release/R121-15699.40.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests PUFF_RELEASE_BETA", "resultdb": { @@ -2514,7 +2514,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "puff", - "cros_img": "puff-release/R121-15699.25.0", + "cros_img": "puff-release/R122-15748.0.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests PUFF_RELEASE_DEV", "resultdb": { @@ -2550,7 +2550,7 @@ { "autotest_name": "tast.lacros-from-gcs", "cros_board": "puff", - "cros_img": "puff-release/R120-15662.64.0", + "cros_img": "puff-release/R120-15662.76.0", "dut_pool": "chrome", "name": "lacros_all_tast_tests PUFF_RELEASE_STABLE", "resultdb": {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 5be8360..8d5ff8f 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -17,7 +17,7 @@ 'identifier': 'BRYA_RELEASE_BETA', 'skylab': { 'cros_board': 'brya', - 'cros_img': 'brya-release/R120-15662.57.0', + 'cros_img': 'brya-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -25,7 +25,7 @@ 'identifier': 'BRYA_RELEASE_DEV', 'skylab': { 'cros_board': 'brya', - 'cros_img': 'brya-release/R121-15699.25.0', + 'cros_img': 'brya-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -41,7 +41,7 @@ 'identifier': 'BRYA_RELEASE_STABLE', 'skylab': { 'cros_board': 'brya', - 'cros_img': 'brya-release/R120-15662.64.0', + 'cros_img': 'brya-release/R120-15662.76.0', 'dut_pool': 'chrome', }, }, @@ -49,14 +49,14 @@ 'identifier': 'DEDEDE_RELEASE_BETA', 'skylab': { 'cros_board': 'dedede', - 'cros_img': 'dedede-release/R120-15662.57.0', + 'cros_img': 'dedede-release/R121-15699.40.0', }, }, 'CROS_DEDEDE_RELEASE_DEV': { 'identifier': 'DEDEDE_RELEASE_DEV', 'skylab': { 'cros_board': 'dedede', - 'cros_img': 'dedede-release/R121-15699.25.0', + 'cros_img': 'dedede-release/R122-15748.0.0', }, }, 'CROS_DEDEDE_RELEASE_LKGM': { @@ -70,14 +70,14 @@ 'identifier': 'DEDEDE_RELEASE_STABLE', 'skylab': { 'cros_board': 'dedede', - 'cros_img': 'dedede-release/R120-15662.64.0', + 'cros_img': 'dedede-release/R120-15662.76.0', }, }, 'CROS_FIZZ_RELEASE_BETA': { 'identifier': 'FIZZ_RELEASE_BETA', 'skylab': { 'cros_board': 'fizz', - 'cros_img': 'fizz-release/R120-15662.57.0', + 'cros_img': 'fizz-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -85,7 +85,7 @@ 'identifier': 'FIZZ_RELEASE_DEV', 'skylab': { 'cros_board': 'fizz', - 'cros_img': 'fizz-release/R121-15699.25.0', + 'cros_img': 'fizz-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -101,7 +101,7 @@ 'identifier': 'FIZZ_RELEASE_STABLE', 'skylab': { 'cros_board': 'fizz', - 'cros_img': 'fizz-release/R120-15662.64.0', + 'cros_img': 'fizz-release/R120-15662.76.0', 'dut_pool': 'chrome', }, }, @@ -109,7 +109,7 @@ 'identifier': 'GUYBRUSH_RELEASE_BETA', 'skylab': { 'cros_board': 'guybrush', - 'cros_img': 'guybrush-release/R120-15662.57.0', + 'cros_img': 'guybrush-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -117,7 +117,7 @@ 'identifier': 'GUYBRUSH_RELEASE_DEV', 'skylab': { 'cros_board': 'guybrush', - 'cros_img': 'guybrush-release/R121-15694.0.0', + 'cros_img': 'guybrush-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -133,7 +133,7 @@ 'identifier': 'GUYBRUSH_RELEASE_STABLE', 'skylab': { 'cros_board': 'guybrush', - 'cros_img': 'guybrush-release/R120-15662.64.0', + 'cros_img': 'guybrush-release/R120-15662.76.0', 'dut_pool': 'chrome', }, }, @@ -181,7 +181,7 @@ 'identifier': 'PUFF_RELEASE_BETA', 'skylab': { 'cros_board': 'puff', - 'cros_img': 'puff-release/R120-15662.57.0', + 'cros_img': 'puff-release/R121-15699.40.0', 'dut_pool': 'chrome', }, }, @@ -189,7 +189,7 @@ 'identifier': 'PUFF_RELEASE_DEV', 'skylab': { 'cros_board': 'puff', - 'cros_img': 'puff-release/R121-15699.25.0', + 'cros_img': 'puff-release/R122-15748.0.0', 'dut_pool': 'chrome', }, }, @@ -205,7 +205,7 @@ 'identifier': 'PUFF_RELEASE_STABLE', 'skylab': { 'cros_board': 'puff', - 'cros_img': 'puff-release/R120-15662.64.0', + 'cros_img': 'puff-release/R120-15662.76.0', 'dut_pool': 'chrome', }, },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index e0169df6..91758ae 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1251,30 +1251,6 @@ ] } ], - "AutofillConvergeToExtremeLengthStreetAddress": [ - { - "platforms": [ - "android", - "chromeos", - "chromeos_lacros", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Converge_To_Shorter", - "params": { - "converge_to_longer": "false" - }, - "enable_features": [ - "AutofillConvergeToExtremeLengthStreetAddress" - ] - } - ] - } - ], "AutofillDefaultToCityAndNumber": [ { "platforms": [ @@ -4663,7 +4639,6 @@ "AttributionDebugReportingCookieDeprecationTesting", "CookieDeprecationFacilitatedTesting", "FledgeFacilitatedTestingSignalsHeaders", - "PrivateAggregationDebugReportingCookieDeprecationTesting", "SkipTpcdMitigationsForAds", "TPCDAdHeuristicSubframeRequestTagging" ] @@ -10667,25 +10642,6 @@ ] } ], - "LightweightUAFDetector": [ - { - "platforms": [ - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "LightweightUafDetector" - ], - "disable_features": [ - "GwpAsanMalloc", - "GwpAsanPartitionAlloc" - ] - } - ] - } - ], "LinkPreview": [ { "platforms": [ @@ -11391,28 +11347,6 @@ ] } ], - "MojoChannelAssociatedSendUsesRunOrPostTask": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "chromeos_lacros", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "MojoChannelAssociatedSendUsesRunOrPostTask" - ] - } - ] - } - ], "MojoInlineMessagePayloads": [ { "platforms": [ @@ -13492,6 +13426,21 @@ ] } ], + "PassExplicitSyncPassphraseToGmsCore": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PassExplicitSyncPassphraseToGmsCore" + ] + } + ] + } + ], "PassHistogramSharedMemoryOnLaunch": [ { "platforms": [ @@ -14683,6 +14632,26 @@ ] } ], + "PrivateAggregationFacilitatedTestingCookieDeprecation": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "windows", + "mac", + "linux", + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PrivateAggregationDebugReportingCookieDeprecationTesting" + ] + } + ] + } + ], "PrivateStateTokens": [ { "platforms": [ @@ -15096,6 +15065,28 @@ ] } ], + "RTCAlignReceivedEncodedVideoTransforms": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "RTCAlignReceivedEncodedVideoTransforms" + ] + } + ] + } + ], "RawDrawAndDrDc": [ { "platforms": [
diff --git a/third_party/.gitignore b/third_party/.gitignore index 563c82b8..d9542847 100644 --- a/third_party/.gitignore +++ b/third_party/.gitignore
@@ -35,7 +35,6 @@ /apache-windows-arm64/ /arcore-android-sdk/src/ /arcore-android-sdk/test-apks/arcore/*.apk -/asan /bison /bouncycastle/lib/ /byte_buddy/android_sdk_build_tools_25_0_2 @@ -157,11 +156,9 @@ /tfhub_models/*.tar.gz /tfhub_models/models/ /tint/src -/tsan/ /turbine/*.jar /usb_ids /v8-i18n -/valgrind /webdriver/python/selenium /webgl /webpagereplay
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index 6b11523..8e81baf 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -326,7 +326,6 @@ ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z - ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Kabsl@@YA?AVint128@0@V10@0@Z ??Kabsl@@YA?AVuint128@0@V10@0@Z ??Labsl@@YA?AVint128@0@V10@0@Z @@ -1226,7 +1225,6 @@ ?max@?$RandenPool@G@random_internal@absl@@SAGXZ ?max@?$RandenPool@I@random_internal@absl@@SAIXZ ?max@?$RandenPool@_K@random_internal@absl@@SA_KXZ - ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z ?min@?$RandenPool@E@random_internal@absl@@SAEXZ ?min@?$RandenPool@G@random_internal@absl@@SAGXZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index 1d7ebc9..0e37579d 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -341,7 +341,6 @@ ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z - ??Hdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Kabsl@@YA?AVint128@0@V10@0@Z ??Kabsl@@YA?AVuint128@0@V10@0@Z ??Labsl@@YA?AVint128@0@V10@0@Z @@ -1279,7 +1278,6 @@ ?max@?$RandenPool@G@random_internal@absl@@SAGXZ ?max@?$RandenPool@I@random_internal@absl@@SAIXZ ?max@?$RandenPool@_K@random_internal@absl@@SA_KXZ - ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ ?memcasecmp@strings_internal@absl@@YAHPEBD0_K@Z ?min@?$RandenPool@E@random_internal@absl@@SAEXZ ?min@?$RandenPool@G@random_internal@absl@@SAGXZ
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def index f64c4a3..453d0d7 100644 --- a/third_party/abseil-cpp/symbols_x86_rel.def +++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -1229,7 +1229,6 @@ ?max@?$RandenPool@G@random_internal@absl@@SAGXZ ?max@?$RandenPool@I@random_internal@absl@@SAIXZ ?max@?$RandenPool@_K@random_internal@absl@@SA_KXZ - ?max@?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@detail@cctz@time_internal@absl@@SA?AV12345@XZ ?memcasecmp@strings_internal@absl@@YAHPBD0I@Z ?min@?$RandenPool@E@random_internal@absl@@SAEXZ ?min@?$RandenPool@G@random_internal@absl@@SAGXZ
diff --git a/third_party/angle b/third_party/angle index 8e267846..c7ed7da 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit 8e2678463dae9729e3c80e76c00b0eb26d7823a0 +Subproject commit c7ed7da64071842113a833665598dc0d4e8fbcdf
diff --git a/third_party/bidimapper/README.chromium b/third_party/bidimapper/README.chromium index d67086f4..509295b 100644 --- a/third_party/bidimapper/README.chromium +++ b/third_party/bidimapper/README.chromium
@@ -1,10 +1,10 @@ Name: Implementation of WebDriver BiDi standard Short Name: chromium-bidi -URL: https://github.com/GoogleChromeLabs/chromium-bidi/archive/29c7b0b6ce6fb1bcfc3053c92bd24c7c7d580fa4.zip +URL: https://github.com/GoogleChromeLabs/chromium-bidi/archive/e491123c826d0a84d70b98dea88c7759f574edbc.zip Version: N/A -Date: 2024-01-17 -Revision: 29c7b0b6ce6fb1bcfc3053c92bd24c7c7d580fa4 -SHA-512: bac0846a943a461a2bb8bb15dd0cfd721a087460e425bcd2e403ee9086525c250eabc5a818c140a16cac5aaefd407b57d15f59223bcc83155879dd9c4b78d754 +Date: 2024-01-25 +Revision: e491123c826d0a84d70b98dea88c7759f574edbc +SHA-512: 1b8625cec5b1e4b1bf8e378589c1bac14b0d00f8d873366b4244e103305007f5ad446b07a33fae6137b0cd30955b5ebaadf5289288e400972b7089def26421d6 License: Apache 2.0 License File: LICENSE Shipped: yes
diff --git a/third_party/bidimapper/mapper.js b/third_party/bidimapper/mapper.js index 177a63af..e44d847d 100644 --- a/third_party/bidimapper/mapper.js +++ b/third_party/bidimapper/mapper.js
@@ -1,4 +1,4 @@ -var mapperTab=function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e){if(e.__esModule)return e;var t=e.default;if("function"==typeof t){var a=function e(){return this instanceof e?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};a.prototype=t.prototype}else a={};return Object.defineProperty(a,"__esModule",{value:!0}),Object.keys(e).forEach((function(t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(a,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})})),a}var a={},r={},n={},s={};var o=Object.freeze({__proto__:null,default:function(e){return{all:e=e||new Map,on:function(t,a){var r=e.get(t);r?r.push(a):e.set(t,[a])},off:function(t,a){var r=e.get(t);r&&(a?r.splice(r.indexOf(a)>>>0,1):e.set(t,[]))},emit:function(t,a){var r=e.get(t);r&&r.slice().map((function(e){e(a)})),(r=e.get("*"))&&r.slice().map((function(e){e(t,a)}))}}}}),i=t(o),c=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(s,"__esModule",{value:!0}),s.EventEmitter=void 0;const d=c(i);s.EventEmitter=class{#e=(0,d.default)();on(e,t){return this.#e.on(e,t),this}once(e,t){const a=r=>{t(r),this.off(e,a)};return this.on(e,a)}off(e,t){return this.#e.off(e,t),this}emit(e,t){this.#e.emit(e,t)}removeAllListeners(e){return e?this.#e.all.delete(e):this.#e.all.clear(),this}};var u,l={};Object.defineProperty(l,"__esModule",{value:!0}),l.LogType=void 0,function(e){e.bidi="bidi",e.cdp="cdp",e.debug="debug",e.debugError="debug:error",e.debugInfo="debug:info"}(u||(l.LogType=u={}));var h={};Object.defineProperty(h,"__esModule",{value:!0}),h.ProcessingQueue=void 0;const p=l;class m{static LOGGER_PREFIX=`${p.LogType.debug}:queue`;#t;#a;#r=[];#n=!1;constructor(e,t){this.#a=e,this.#t=t}add(e,t){this.#r.push([e,t]),this.#s()}async#s(){if(!this.#n){for(this.#n=!0;this.#r.length>0;){const e=this.#r.shift();if(!e)continue;const[t,a]=e;this.#t?.(m.LOGGER_PREFIX,"Processing event:",a),await t.then((e=>{if("error"!==e.kind)return this.#a(e.value);this.#t?.(p.LogType.debugError,"Event threw before sending:",e.error.message,e.error.stack)})).catch((e=>{this.#t?.(p.LogType.debugError,"Event was not processed:",e?.message)}))}this.#n=!1}}}h.ProcessingQueue=m;var f={},g={},y={};Object.defineProperty(y,"__esModule",{value:!0});var S,v,w,C,b,x={};Object.defineProperty(x,"__esModule",{value:!0}),x.EVENT_NAMES=x.Network=x.BrowsingContext=x.Log=x.Script=x.BiDiModule=void 0,function(e){e.Browser="browser",e.BrowsingContext="browsingContext",e.Cdp="cdp",e.Input="input",e.Log="log",e.Network="network",e.Script="script",e.Session="session"}(S||(x.BiDiModule=S={})),function(e){var t;(t=e.EventNames||(e.EventNames={})).Message="script.message",t.RealmCreated="script.realmCreated",t.RealmDestroyed="script.realmDestroyed"}(v||(x.Script=v={})),function(e){(e.EventNames||(e.EventNames={})).LogEntryAdded="log.entryAdded"}(w||(x.Log=w={})),function(e){var t;(t=e.EventNames||(e.EventNames={})).ContextCreated="browsingContext.contextCreated",t.ContextDestroyed="browsingContext.contextDestroyed",t.DomContentLoaded="browsingContext.domContentLoaded",t.DownloadWillBegin="browsingContext.downloadWillBegin",t.FragmentNavigated="browsingContext.fragmentNavigated",t.Load="browsingContext.load",t.NavigationAborted="browsingContext.navigationAborted",t.NavigationFailed="browsingContext.navigationFailed",t.NavigationStarted="browsingContext.navigationStarted",t.UserPromptClosed="browsingContext.userPromptClosed",t.UserPromptOpened="browsingContext.userPromptOpened"}(C||(x.BrowsingContext=C={})),function(e){var t;(t=e.EventNames||(e.EventNames={})).AuthRequired="network.authRequired",t.BeforeRequestSent="network.beforeRequestSent",t.FetchError="network.fetchError",t.ResponseCompleted="network.responseCompleted",t.ResponseStarted="network.responseStarted"}(b||(x.Network=b={})),x.EVENT_NAMES=new Set([...Object.values(S),...Object.values(C.EventNames),...Object.values(w.EventNames),...Object.values(b.EventNames),...Object.values(v.EventNames)]);var P={};Object.defineProperty(P,"__esModule",{value:!0});var I={};Object.defineProperty(I,"__esModule",{value:!0}),I.UnderspecifiedStoragePartitionException=I.UnableToSetFileInputException=I.UnableToSetCookieException=I.NoSuchStoragePartitionException=I.UnsupportedOperationException=I.UnableToCloseBrowserException=I.UnableToCaptureScreenException=I.UnknownErrorException=I.UnknownCommandException=I.SessionNotCreatedException=I.NoSuchScriptException=I.NoSuchRequestException=I.NoSuchNodeException=I.NoSuchInterceptException=I.NoSuchHistoryEntryException=I.NoSuchHandleException=I.NoSuchFrameException=I.NoSuchElementException=I.NoSuchAlertException=I.MoveTargetOutOfBoundsException=I.InvalidSessionIdException=I.InvalidArgumentException=I.Exception=void 0;class k{error;message;stacktrace;constructor(e,t,a){this.error=e,this.message=t,this.stacktrace=a}toErrorResponse(e){return{type:"error",id:e,error:this.error,message:this.message,stacktrace:this.stacktrace}}}I.Exception=k;I.InvalidArgumentException=class extends k{constructor(e,t){super("invalid argument",e,t)}};I.InvalidSessionIdException=class extends k{constructor(e,t){super("invalid session id",e,t)}};I.MoveTargetOutOfBoundsException=class extends k{constructor(e,t){super("move target out of bounds",e,t)}};I.NoSuchAlertException=class extends k{constructor(e,t){super("no such alert",e,t)}};I.NoSuchElementException=class extends k{constructor(e,t){super("no such element",e,t)}};I.NoSuchFrameException=class extends k{constructor(e,t){super("no such frame",e,t)}};I.NoSuchHandleException=class extends k{constructor(e,t){super("no such handle",e,t)}};I.NoSuchHistoryEntryException=class extends k{constructor(e,t){super("no such history entry",e,t)}};I.NoSuchInterceptException=class extends k{constructor(e,t){super("no such intercept",e,t)}};I.NoSuchNodeException=class extends k{constructor(e,t){super("no such node",e,t)}};I.NoSuchRequestException=class extends k{constructor(e,t){super("no such request",e,t)}};I.NoSuchScriptException=class extends k{constructor(e,t){super("no such script",e,t)}};I.SessionNotCreatedException=class extends k{constructor(e,t){super("session not created",e,t)}};I.UnknownCommandException=class extends k{constructor(e,t){super("unknown command",e,t)}};I.UnknownErrorException=class extends k{constructor(e,t=(new Error).stack){super("unknown error",e,t)}};I.UnableToCaptureScreenException=class extends k{constructor(e,t){super("unable to capture screen",e,t)}};I.UnableToCloseBrowserException=class extends k{constructor(e,t){super("unable to close browser",e,t)}};I.UnsupportedOperationException=class extends k{constructor(e,t){super("unsupported operation",e,t)}};I.NoSuchStoragePartitionException=class extends k{constructor(e,t){super("no such storage partition",e,t)}};I.UnableToSetCookieException=class extends k{constructor(e,t){super("unable to set cookie",e,t)}};I.UnableToSetFileInputException=class extends k{constructor(e,t){super("unable to set file input",e,t)}};I.UnderspecifiedStoragePartitionException=class extends k{constructor(e,t){super("underspecified storage partition",e,t)}};var R={};Object.defineProperty(R,"__esModule",{value:!0}),function(t){var a=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,n)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),r=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&a(t,e,n);return r(t,e),t},s=e&&e.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.ChromiumBidi=t.Cdp=void 0,t.Cdp=n(y),t.ChromiumBidi=n(x),s(P,t),s(I,t),s(R,t)}(g);var E={};Object.defineProperty(E,"__esModule",{value:!0}),E.BidiNoOpParser=void 0;E.BidiNoOpParser=class{parseActivateParams(e){return e}parseCaptureScreenshotParams(e){return e}parseCloseParams(e){return e}parseCreateParams(e){return e}parseGetTreeParams(e){return e}parseHandleUserPromptParams(e){return e}parseNavigateParams(e){return e}parsePrintParams(e){return e}parseReloadParams(e){return e}parseSetViewportParams(e){return e}parseTraverseHistoryParams(e){return e}parseGetSessionParams(e){return e}parseSendCommandParams(e){return e}parseAddPreloadScriptParams(e){return e}parseCallFunctionParams(e){return e}parseDisownParams(e){return e}parseEvaluateParams(e){return e}parseGetRealmsParams(e){return e}parseRemovePreloadScriptParams(e){return e}parsePerformActionsParams(e){return e}parseReleaseActionsParams(e){return e}parseSetFilesParams(e){return e}parseAddInterceptParams(e){return e}parseContinueRequestParams(e){return e}parseContinueResponseParams(e){return e}parseContinueWithAuthParams(e){return e}parseFailRequestParams(e){return e}parseProvideResponseParams(e){return e}parseRemoveInterceptParams(e){return e}parseSetPermissionsParams(e){return e}parseSubscribeParams(e){return e}parseDeleteCookiesParams(e){return e}parseGetCookiesParams(e){return e}parseSetCookieParams(e){return e}};var _={};Object.defineProperty(_,"__esModule",{value:!0}),_.BrowserProcessor=void 0;_.BrowserProcessor=class{#o;constructor(e){this.#o=e}close(){return setTimeout((()=>this.#o.sendCommand("Browser.close")),0),{}}};var T={};Object.defineProperty(T,"__esModule",{value:!0}),T.CdpProcessor=void 0;T.CdpProcessor=class{#i;#c;#o;constructor(e,t,a){this.#i=e,this.#c=t,this.#o=a}getSession(e){const t=e.context,a=this.#i.getContext(t).cdpTarget.cdpSessionId;return void 0===a?{}:{session:a}}async sendCommand(e){const t=e.session?this.#c.getCdpClient(e.session):this.#o;return{result:await t.sendCommand(e.method,e.params),session:e.session}}};var N={},j={},O={};Object.defineProperty(O,"__esModule",{value:!0}),O.uuidv4=void 0,O.uuidv4=function(){if("crypto"in globalThis&&"randomUUID"in globalThis.crypto)return globalThis.crypto.randomUUID();const e=new Uint8Array(16);"crypto"in globalThis&&"getRandomValues"in globalThis.crypto?globalThis.crypto.getRandomValues(e):require("crypto").webcrypto.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=e=>e.reduce(((e,t)=>e+t.toString(16).padStart(2,"0")),"");return[t(e.subarray(0,4)),t(e.subarray(4,6)),t(e.subarray(6,8)),t(e.subarray(8,10)),t(e.subarray(10,16))].join("-")};var M={};Object.defineProperty(M,"__esModule",{value:!0}),M.ChannelProxy=void 0;const A=g,D=l,B=O;class z{#d;#u=(0,B.uuidv4)();#t;constructor(e,t){this.#d=e,this.#t=t}async init(e,t){const a=await z.#l(e),r=await z.#h(e,a);return this.#p(e,a,t),r}async startListenerFromWindow(e,t){try{const a=await this.#m(e);this.#p(e,a,t)}catch(e){this.#t?.(D.LogType.debugError,e)}}static#f(){return`(${String((()=>{const e=[];let t=null;return{async getMessage(){const a=e.length>0?Promise.resolve():new Promise((e=>{t=e}));return await a,e.shift()},sendMessage(a){e.push(a),null!==t&&(t(),t=null)}}}))})()`}static async#l(e){const t=await e.cdpClient.sendCommand("Runtime.evaluate",{expression:this.#f(),contextId:e.executionContextId,serializationOptions:{serialization:"idOnly"}});if(t.exceptionDetails||void 0===t.result.objectId)throw new Error("Cannot create channel");return t.result.objectId}static async#h(e,t){return(await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e.sendMessage)),arguments:[{objectId:t}],executionContextId:e.executionContextId,serializationOptions:{serialization:"idOnly"}})).result.objectId}async#p(e,t,a){for(;;)try{const r=await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((async e=>await e.getMessage())),arguments:[{objectId:t}],awaitPromise:!0,executionContextId:e.executionContextId,serializationOptions:{serialization:"deep",maxDepth:this.#d.serializationOptions?.maxObjectDepth??void 0}});if(r.exceptionDetails)throw r.exceptionDetails;a.registerEvent({type:"event",method:A.ChromiumBidi.Script.EventNames.Message,params:{channel:this.#d.channel,data:e.cdpToBidiValue(r,this.#d.ownership??"none"),source:{realm:e.realmId,context:e.browsingContextId}}},e.browsingContextId)}catch(e){this.#t?.(D.LogType.debugError,e);break}}async#m(e){const t=await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>{const t=window;if(void 0===t[e])return new Promise((a=>t[e]=a));const a=t[e];return delete t[e],a})),arguments:[{value:this.#u}],executionContextId:e.executionContextId,awaitPromise:!0,serializationOptions:{serialization:"idOnly"}});if(void 0!==t.exceptionDetails||void 0===t.result.objectId)throw new Error(`ChannelHandle not found in window["${this.#u}"]`);return t.result.objectId}getEvalInWindowStr(){const e=String(((e,t)=>{const a=window;return void 0===a[e]?a[e]=t:(a[e](t),delete a[e]),t.sendMessage})),t=z.#f();return`(${e})('${this.#u}',${t})`}}M.ChannelProxy=z;var L={};Object.defineProperty(L,"__esModule",{value:!0}),L.SharedIdParser=void 0;const Z="_element_";class U{static getSharedId(e,t,a,r){return r?`f.${e}.d.${t}.e.${a}`:this.#g(e,t,a)}static parseSharedId(e){const t=U.#y(e);if(null!==t)return{...t,frameId:void 0};const a=e.match(/f\.(.*)\.d\.(.*)\.e\.([0-9]*)/);if(!a)return null;const r=a[1],n=a[2],s=a[3];if(void 0===r||void 0===n||void 0===s)return null;const o=parseInt(s??"");return isNaN(o)?null:{frameId:r,documentId:n,backendNodeId:o}}static#g(e,t,a){return`${t}${Z}${a}`}static#y(e){const t=e.match(new RegExp(`(.*)${Z}(.*)`));if(!t)return null;const a=t[1],r=t[2];if(void 0===a||void 0===r)return null;const n=parseInt(r??"");return isNaN(n)?null:{documentId:a,backendNodeId:n}}}L.SharedIdParser=U,Object.defineProperty(j,"__esModule",{value:!0}),j.Realm=void 0;const F=g,q=l,V=O,$=M,K=L;class W{#S;#i;#v;#w;#C;#b;#x;#P;#I;#k;sandbox;#t;constructor(e,t,a,r,n,s,o,i,c,d,u,l){this.#x=u,this.#v=a,this.#w=r,this.#C=n,this.sandbox=i,this.#b=s,this.#P=o,this.#I=c,this.#S=e,this.#i=t,this.#k=d,this.#t=l,this.#S.addRealm(this),this.#k.registerEvent({type:"event",method:F.ChromiumBidi.Script.EventNames.RealmCreated,params:this.realmInfo},this.browsingContextId)}cdpToBidiValue(e,t){const a=this.#R(e.result.deepSerializedValue,new Map);if(e.result.objectId){const r=e.result.objectId;"root"===t?(a.handle=r,this.#S.knownHandlesToRealmMap.set(r,this.realmId)):this.#E(r).catch((e=>this.#t?.(q.LogType.debugError,e)))}if("object"===e.result.type)switch(e.result.subtype){case"generator":case"iterator":a.type=e.result.subtype,delete a.value}return a}#R(e,t){if(Object.hasOwn(e,"weakLocalObjectReference")){const a=e.weakLocalObjectReference;t.has(a)||t.set(a,(0,V.uuidv4)()),e.internalId=t.get(a),delete e.weakLocalObjectReference}if("platformobject"===e.type)return{type:"object"};const a=e.value;if(void 0===a)return e;if("node"===e.type){if(Object.hasOwn(a,"backendNodeId")){let t=this.navigableId;Object.hasOwn(a,"loaderId")&&(t=a.loaderId,delete a.loaderId),e.sharedId=K.SharedIdParser.getSharedId(this.#_(t),t,a.backendNodeId,this.#x),delete a.backendNodeId}if(Object.hasOwn(a,"children"))for(const e in a.children)a.children[e]=this.#R(a.children[e],t);Object.hasOwn(a,"shadowRoot")&&null!==a.shadowRoot&&(a.shadowRoot=this.#R(a.shadowRoot,t)),""===a.namespaceURI&&(a.namespaceURI=null)}if(["array","set","htmlcollection","nodelist"].includes(e.type))for(const e in a)a[e]=this.#R(a[e],t);if(["object","map"].includes(e.type))for(const e in a)a[e]=[this.#R(a[e][0],t),this.#R(a[e][1],t)];return e}#_(e){const t=this.#i.getAllContexts().find((t=>t.navigableId===e));return t?.id??"UNKNOWN"}get realmId(){return this.#v}get navigableId(){return(this.browsingContextId&&this.#i.findContext(this.browsingContextId)?.navigableId)??"UNKNOWN"}get browsingContextId(){return this.#w}get executionContextId(){return this.#C}get origin(){return this.#b}get type(){return this.#P}get cdpClient(){return this.#I}get realmInfo(){return"window"===this.type?{realm:this.realmId,origin:this.origin,type:this.type,context:this.browsingContextId,...void 0===this.sandbox?{}:{sandbox:this.sandbox}}:{owners:[],realm:this.realmId,origin:this.origin,type:this.type}}async evaluate(e,t,a,r,n=!1){await this.#i.getContext(this.browsingContextId).targetUnblockedOrThrow();const s=await this.cdpClient.sendCommand("Runtime.evaluate",{contextId:this.executionContextId,expression:e,awaitPromise:t,serializationOptions:W.#T("deep",r),userGesture:n});return s.exceptionDetails?await this.#N(s.exceptionDetails,0,a):{realm:this.realmId,result:this.cdpToBidiValue(s,a),type:"success"}}async serializeCdpObject(e,t){const a=W.#j(e),r=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e)),awaitPromise:!1,arguments:[a],serializationOptions:{serialization:"deep"},executionContextId:this.executionContextId});return this.cdpToBidiValue(r,t)}static#j(e){return void 0!==e.objectId?{objectId:e.objectId}:void 0!==e.unserializableValue?{unserializableValue:e.unserializableValue}:{value:e.value}}async stringifyObject(e){const{result:t}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>String(e))),awaitPromise:!1,arguments:[e],returnByValue:!0,executionContextId:this.executionContextId});return t.value}async#O(e){const t=[];for(const[a,r]of e){let e;e="string"==typeof a?{value:a}:await this.deserializeToCdpArg(a);const n=await this.deserializeToCdpArg(r);t.push(e),t.push(n)}return t}async#M(e){return await Promise.all(e.map((e=>this.deserializeToCdpArg(e))))}async#A(e,t,a){const r=e.stackTrace?.callFrames.map((e=>({url:e.url,functionName:e.functionName,lineNumber:e.lineNumber-t,columnNumber:e.columnNumber})))??[],n=e.exception;return{exception:await this.serializeCdpObject(n,a),columnNumber:e.columnNumber,lineNumber:e.lineNumber-t,stackTrace:{callFrames:r},text:await this.stringifyObject(n)||e.text}}async callFunction(e,t,a,r,n,s,o=!1){await this.#i.getContext(this.browsingContextId).targetUnblockedOrThrow();const i=`(...args) => {\n function callFunction(f, args) {\n const deserializedThis = args.shift();\n const deserializedArgs = args;\n return f.apply(deserializedThis, deserializedArgs);\n }\n return callFunction((\n ${e}\n ), args);\n }`,c=[await this.deserializeToCdpArg(t),...await Promise.all(a.map((async e=>await this.deserializeToCdpArg(e))))];let d;try{d=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:i,awaitPromise:r,arguments:c,serializationOptions:W.#T("deep",s),executionContextId:this.executionContextId,userGesture:o})}catch(e){if(-32e3===e.code&&["Could not find object with given id","Argument should belong to the same JavaScript world as target object","Invalid remote object id"].includes(e.message))throw new F.NoSuchHandleException("Handle was not found.");throw e}return d.exceptionDetails?await this.#N(d.exceptionDetails,1,n):{type:"success",result:this.cdpToBidiValue(d,n),realm:this.realmId}}async deserializeToCdpArg(e){if("sharedId"in e&&e.sharedId){const t=K.SharedIdParser.parseSharedId(e.sharedId);if(null===t)throw new F.NoSuchNodeException(`SharedId "${e.sharedId}" was not found.`);const{documentId:a,backendNodeId:r}=t;if(this.navigableId!==a)throw new F.NoSuchNodeException(`SharedId "${e.sharedId}" belongs to different document. Current document is ${this.navigableId}.`);try{const{object:e}=await this.cdpClient.sendCommand("DOM.resolveNode",{backendNodeId:r,executionContextId:this.executionContextId});return{objectId:e.objectId}}catch(t){if(-32e3===t.code&&"No node with given id found"===t.message)throw new F.NoSuchNodeException(`SharedId "${e.sharedId}" was not found.`);throw new F.UnknownErrorException(t.message,t.stack)}}else{if("handle"in e&&e.handle)return{objectId:e.handle};if("handle"in e||"sharedId"in e)throw new F.NoSuchHandleException("Handle was not found.")}switch(e.type){case"undefined":return{unserializableValue:"undefined"};case"null":return{unserializableValue:"null"};case"string":return{value:e.value};case"number":return"NaN"===e.value?{unserializableValue:"NaN"}:"-0"===e.value?{unserializableValue:"-0"}:"Infinity"===e.value?{unserializableValue:"Infinity"}:"-Infinity"===e.value?{unserializableValue:"-Infinity"}:{value:e.value};case"boolean":return{value:Boolean(e.value)};case"bigint":return{unserializableValue:`BigInt(${JSON.stringify(e.value)})`};case"date":return{unserializableValue:`new Date(Date.parse(${JSON.stringify(e.value)}))`};case"regexp":return{unserializableValue:`new RegExp(${JSON.stringify(e.value.pattern)}, ${JSON.stringify(e.value.flags)})`};case"map":{const t=await this.#O(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t=new Map;for(let a=0;a<e.length;a+=2)t.set(e[a],e[a+1]);return t})),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"object":{const t=await this.#O(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t={};for(let a=0;a<e.length;a+=2){t[e[a]]=e[a+1]}return t})),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"array":{const t=await this.#M(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>e)),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"set":{const t=await this.#M(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>new Set(e))),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"channel":{const t=new $.ChannelProxy(e.value,this.#t);return{objectId:await t.init(this,this.#k)}}}throw new Error(`Value ${JSON.stringify(e)} is not deserializable.`)}async#N(e,t,a){return{exceptionDetails:await this.#A(e,t,a),realm:this.realmId,type:"exception"}}static#T(e,t){return{serialization:e,additionalParameters:W.#D(t),...W.#B(t)}}static#D(e){const t={};return void 0!==e.maxDomDepth&&(t.maxNodeDepth=null===e.maxDomDepth?1e3:e.maxDomDepth),void 0!==e.includeShadowTree&&(t.includeShadowTree=e.includeShadowTree),t}static#B(e){return void 0===e.maxObjectDepth||null===e.maxObjectDepth?{}:{maxDepth:e.maxObjectDepth}}async#E(e){try{await this.cdpClient.sendCommand("Runtime.releaseObject",{objectId:e})}catch(e){if(-32e3!==e.code||"Invalid remote object id"!==e.message)throw e}}async disown(e){this.#S.knownHandlesToRealmMap.get(e)===this.realmId&&(await this.#E(e),this.#S.knownHandlesToRealmMap.delete(e))}dispose(){this.#k.registerEvent({type:"event",method:F.ChromiumBidi.Script.EventNames.RealmDestroyed,params:{realm:this.realmId}},this.browsingContextId)}}j.Realm=W;var H={},J={};Object.defineProperty(J,"__esModule",{value:!0}),J.assert=void 0,J.assert=function(e,t){if(!e)throw new Error(t??"Internal assertion failed.")};var G={};Object.defineProperty(G,"__esModule",{value:!0}),G.Deferred=void 0;class X{#z=!1;#L;#Z;#U;get isFinished(){return this.#z}constructor(){this.#L=new Promise(((e,t)=>{this.#Z=e,this.#U=t})),this.#L.catch((e=>{}))}then(e,t){return this.#L.then(e,t)}catch(e){return this.#L.catch(e)}resolve(e){this.#z||(this.#z=!0,this.#Z(e))}reject(e){this.#z||(this.#z=!0,this.#U(e))}finally(e){return this.#L.finally(e)}[Symbol.toStringTag]="Promise"}G.Deferred=X;var Y={};Object.defineProperty(Y,"__esModule",{value:!0}),Y.inchesFromCm=void 0,Y.inchesFromCm=function(e){return e/2.54},Object.defineProperty(H,"__esModule",{value:!0}),H.serializeOrigin=H.BrowsingContextImpl=void 0;const Q=g,ee=J,te=G,ae=l,re=Y,ne=j;class se{static LOGGER_PREFIX=`${ae.LogType.debug}:browsingContext`;#u;#F;#q=new Set;#i;#V={Page:{navigatedWithinDocument:new te.Deferred,lifecycleEvent:{DOMContentLoaded:new te.Deferred,load:new te.Deferred},frameStartedLoading:new te.Deferred}};#$="about:blank";#k;#S;#K;#W;#H;#x;#t;constructor(e,t,a,r,n,s,o,i){this.#W=e,this.#S=t,this.#u=a,this.#F=r,this.#k=n,this.#i=s,this.#x=o,this.#t=i}static create(e,t,a,r,n,s,o,i){const c=new se(e,t,a,r,n,s,o,i);return c.#J(),s.addContext(c),c.isTopLevelContext()||c.parent.addChild(c.id),n.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.ContextCreated,params:c.serializeToBidiValue()},c.id),c}static getTimestamp(){return(new Date).getTime()}get navigableId(){return this.#K}dispose(){this.#G(),this.#S.deleteRealms({browsingContextId:this.id}),this.isTopLevelContext()||this.parent.#q.delete(this.id),this.#X(),this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.ContextDestroyed,params:this.serializeToBidiValue()},this.id),this.#i.deleteContextById(this.id)}get id(){return this.#u}get parentId(){return this.#F}get parent(){return null===this.parentId?null:this.#i.getContext(this.parentId)}get directChildren(){return[...this.#q].map((e=>this.#i.getContext(e)))}get allChildren(){const e=this.directChildren;return e.concat(...e.map((e=>e.allChildren)))}isTopLevelContext(){return null===this.#F}get top(){let e=this,t=e.parent;for(;t;)e=t,t=e.parent;return e}addChild(e){this.#q.add(e)}#G(){this.directChildren.map((e=>e.dispose()))}get#Y(){return(0,ee.assert)(this.#H,`No default realm for browsing context ${this.#u}`),this.#H}get cdpTarget(){return this.#W}updateCdpTarget(e){this.#W=e,this.#J()}get url(){return this.#$}async lifecycleLoaded(){await this.#V.Page.lifecycleEvent.load}async targetUnblockedOrThrow(){const e=await this.#W.targetUnblocked;if("error"===e.kind)throw e.error}async getOrCreateSandbox(e){if(void 0===e||""===e)return this.#Y;let t=this.#S.findRealms({browsingContextId:this.id,sandbox:e});return 0===t.length&&(await this.#W.cdpClient.sendCommand("Page.createIsolatedWorld",{frameId:this.id,worldName:e}),t=this.#S.findRealms({browsingContextId:this.id,sandbox:e}),(0,ee.assert)(0!==t.length)),t[0]}serializeToBidiValue(e=0,t=!0){return{context:this.#u,url:this.url,children:e>0?this.directChildren.map((t=>t.serializeToBidiValue(e-1,!1))):null,...t?{parent:this.#F}:{}}}onTargetInfoChanged(e){this.#$=e.targetInfo.url}#J(){this.#W.cdpClient.on("Page.frameNavigated",(e=>{this.id===e.frame.id&&(this.#$=e.frame.url+(e.frame.urlFragment??""),this.#G())})),this.#W.cdpClient.on("Page.navigatedWithinDocument",(e=>{if(this.id!==e.frameId)return;const t=se.getTimestamp();this.#$=e.url,this.#V.Page.navigatedWithinDocument.resolve(e),this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.FragmentNavigated,params:{context:this.id,navigation:null,timestamp:t,url:this.#$}},this.id)})),this.#W.cdpClient.on("Page.frameStartedLoading",(e=>{this.id===e.frameId&&this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.NavigationStarted,params:{context:this.id,navigation:null,timestamp:se.getTimestamp(),url:""}},this.id)})),this.#W.cdpClient.on("Page.lifecycleEvent",(e=>{if(this.id!==e.frameId)return;if("init"===e.name)return void this.#Q(e.loaderId);if("commit"===e.name)return void(this.#K=e.loaderId);if(e.loaderId!==this.#K)return;const t=se.getTimestamp();switch(e.name){case"DOMContentLoaded":this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.DomContentLoaded,params:{context:this.id,navigation:this.#K??null,timestamp:t,url:this.#$}},this.id),this.#V.Page.lifecycleEvent.DOMContentLoaded.resolve(e);break;case"load":this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.Load,params:{context:this.id,navigation:this.#K??null,timestamp:t,url:this.#$}},this.id),this.#V.Page.lifecycleEvent.load.resolve(e)}})),this.#W.cdpClient.on("Runtime.executionContextCreated",(e=>{const{auxData:t,name:a,uniqueId:r,id:n}=e.context;if(!t||t.frameId!==this.id)return;let s,o;switch(t.type){case"isolated":o=a,s=this.#Y.origin;break;case"default":s=oe(e.context.origin);break;default:return}const i=new ne.Realm(this.#S,this.#i,r,this.id,n,s,"window",o,this.#W.cdpClient,this.#k,this.#x,this.#t);t.isDefault&&(this.#H=i,Promise.all(this.#W.getChannels().map((e=>e.startListenerFromWindow(i,this.#k)))))})),this.#W.cdpClient.on("Runtime.executionContextDestroyed",(e=>{this.#S.deleteRealms({cdpSessionId:this.#W.cdpSessionId,executionContextId:e.executionContextId})})),this.#W.cdpClient.on("Runtime.executionContextsCleared",(()=>{this.#S.deleteRealms({cdpSessionId:this.#W.cdpSessionId})})),this.#W.cdpClient.on("Page.javascriptDialogClosed",(e=>{const t=e.result;this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.UserPromptClosed,params:{context:this.id,accepted:t,userText:t&&e.userInput?e.userInput:void 0}},this.id)})),this.#W.cdpClient.on("Page.javascriptDialogOpening",(e=>{this.#k.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.UserPromptOpened,params:{context:this.id,type:e.type,message:e.message,defaultValue:e.defaultPrompt||void 0}},this.id)}))}#Q(e){void 0!==e&&this.#K!==e?(this.#ee(),this.#K=e):this.#V.Page.navigatedWithinDocument.isFinished?this.#V.Page.navigatedWithinDocument=new te.Deferred:this.#t?.(se.LOGGER_PREFIX,"Document changed (navigatedWithinDocument)")}#ee(){this.#V.Page.lifecycleEvent.DOMContentLoaded.isFinished?this.#V.Page.lifecycleEvent.DOMContentLoaded=new te.Deferred:this.#t?.(se.LOGGER_PREFIX,"Document changed (DOMContentLoaded)"),this.#V.Page.lifecycleEvent.load.isFinished?this.#V.Page.lifecycleEvent.load=new te.Deferred:this.#t?.(se.LOGGER_PREFIX,"Document changed (load)")}#X(){this.#V.Page.lifecycleEvent.DOMContentLoaded.isFinished||this.#V.Page.lifecycleEvent.DOMContentLoaded.reject(new Q.UnknownErrorException("navigation canceled")),this.#V.Page.lifecycleEvent.load.isFinished||this.#V.Page.lifecycleEvent.load.reject(new Q.UnknownErrorException("navigation canceled"))}async navigate(e,t){try{new URL(e)}catch{throw new Q.InvalidArgumentException(`Invalid URL: ${e}`)}await this.targetUnblockedOrThrow();const a=await this.#W.cdpClient.sendCommand("Page.navigate",{url:e,frameId:this.id});if(a.errorText)throw new Q.UnknownErrorException(a.errorText);switch(this.#Q(a.loaderId),t){case"none":break;case"interactive":void 0===a.loaderId?await this.#V.Page.navigatedWithinDocument:await this.#V.Page.lifecycleEvent.DOMContentLoaded;break;case"complete":void 0===a.loaderId?await this.#V.Page.navigatedWithinDocument:await this.lifecycleLoaded()}return{navigation:a.loaderId??null,url:"none"===t?e:this.#$}}async reload(e,t){switch(await this.targetUnblockedOrThrow(),await this.#W.cdpClient.sendCommand("Page.reload",{ignoreCache:e}),this.#ee(),t){case"none":break;case"interactive":await this.#V.Page.lifecycleEvent.DOMContentLoaded;break;case"complete":await this.lifecycleLoaded()}return{navigation:"none"===t?null:this.navigableId??null,url:this.url}}async setViewport(e,t){if(null===e&&null===t)await this.#W.cdpClient.sendCommand("Emulation.clearDeviceMetricsOverride");else try{await this.#W.cdpClient.sendCommand("Emulation.setDeviceMetricsOverride",{width:e?e.width:0,height:e?e.height:0,deviceScaleFactor:t||0,mobile:!1,dontSetVisibleSize:!0})}catch(e){if(e.message.startsWith("Width and height values must be positive"))throw new Q.UnsupportedOperationException("Provided viewport dimensions are not supported");throw e}}async handleUserPrompt(e){await this.#W.cdpClient.sendCommand("Page.handleJavaScriptDialog",{accept:e.accept??!0,promptText:e.userText})}async activate(){await this.#W.cdpClient.sendCommand("Page.bringToFront")}async captureScreenshot(e){if(!this.isTopLevelContext())throw new Q.UnsupportedOperationException(`Non-top-level 'context' (${e.context}) is currently not supported`);const t=function(e){const{quality:t,type:a}=e.format??{type:"image/png"};switch(a){case"image/png":return{format:"png"};case"image/jpeg":return{format:"jpeg",...void 0===t?{}:{quality:Math.round(100*t)}};case"image/webp":return{format:"webp",...void 0===t?{}:{quality:Math.round(100*t)}}}throw new Q.InvalidArgumentException(`Image format '${a}' is not a supported format`)}(e);await this.#W.cdpClient.sendCommand("Page.bringToFront");let a,r=!1;switch(e.origin??="viewport",e.origin){case"document":a=String((()=>{const e=document.documentElement;return{x:0,y:0,width:e.scrollWidth,height:e.scrollHeight}})),r=!0;break;case"viewport":a=String((()=>{const e=window.visualViewport;return{x:e.pageLeft,y:e.pageTop,width:e.width,height:e.height}}))}const n=await this.getOrCreateSandbox(void 0),s=await n.callFunction(a,{type:"undefined"},[],!1,"none",{},!1);(0,ee.assert)("success"===s.type);const o=ie(s.result);(0,ee.assert)(o);const i=e.clip?function(e,t){e=ce(e),t=ce(t);const a=Math.max(e.x,t.x),r=Math.max(e.y,t.y);return{x:a,y:r,width:Math.max(Math.min(e.x+e.width,t.x+t.width)-a,0),height:Math.max(Math.min(e.y+e.height,t.y+t.height)-r,0)}}(await this.#te(e.clip),o):o;if(0===i.width||0===i.height)throw new Q.UnableToCaptureScreenException(`Unable to capture screenshot with zero dimensions: width=${i.width}, height=${i.height}`);return await this.#W.cdpClient.sendCommand("Page.captureScreenshot",{clip:{...i,scale:1},...t,captureBeyondViewport:r})}async print(e){const t={};if(void 0!==e.background&&(t.printBackground=e.background),void 0!==e.margin?.bottom&&(t.marginBottom=(0,re.inchesFromCm)(e.margin.bottom)),void 0!==e.margin?.left&&(t.marginLeft=(0,re.inchesFromCm)(e.margin.left)),void 0!==e.margin?.right&&(t.marginRight=(0,re.inchesFromCm)(e.margin.right)),void 0!==e.margin?.top&&(t.marginTop=(0,re.inchesFromCm)(e.margin.top)),void 0!==e.orientation&&(t.landscape="landscape"===e.orientation),void 0!==e.page?.height&&(t.paperHeight=(0,re.inchesFromCm)(e.page.height)),void 0!==e.page?.width&&(t.paperWidth=(0,re.inchesFromCm)(e.page.width)),void 0!==e.pageRanges){for(const t of e.pageRanges){if("number"==typeof t)continue;const e=t.split("-");if(e.length<1||e.length>2)throw new Q.InvalidArgumentException(`Invalid page range: ${t} is not a valid integer range.`);if(1===e.length){de(e[0]??"");continue}let a,r;const[n="",s=""]=e;if(a=""===n?1:de(n),r=""===s?Number.MAX_SAFE_INTEGER:de(s),a>r)throw new Q.InvalidArgumentException(`Invalid page range: ${n} > ${s}`)}t.pageRanges=e.pageRanges.join(",")}void 0!==e.scale&&(t.scale=e.scale),void 0!==e.shrinkToFit&&(t.preferCSSPageSize=!e.shrinkToFit);try{return{data:(await this.#W.cdpClient.sendCommand("Page.printToPDF",t)).data}}catch(e){if("invalid print parameters: content area is empty"===e.message)throw new Q.UnsupportedOperationException(e.message);throw e}}async#te(e){switch(e.type){case"box":return{x:e.x,y:e.y,width:e.width,height:e.height};case"element":{const t=await this.getOrCreateSandbox(void 0),a=await t.callFunction(String((e=>e instanceof Element)),{type:"undefined"},[e.element],!1,"none",{});if("exception"===a.type)throw new Q.NoSuchElementException(`Element '${e.element.sharedId}' was not found`);if((0,ee.assert)("boolean"===a.result.type),!a.result.value)throw new Q.NoSuchElementException(`Node '${e.element.sharedId}' is not an Element`);{const a=await t.callFunction(String((e=>{const t=e.getBoundingClientRect();return{x:t.x,y:t.y,height:t.height,width:t.width}})),{type:"undefined"},[e.element],!1,"none",{});(0,ee.assert)("success"===a.type);const r=ie(a.result);if(!r)throw new Q.UnableToCaptureScreenException(`Could not get bounding box for Element '${e.element.sharedId}'`);return r}}}}async close(){await this.#W.cdpClient.sendCommand("Page.close")}async traverseHistory(e){if(0===e)return;const t=await this.#W.cdpClient.sendCommand("Page.getNavigationHistory"),a=t.entries[t.currentIndex+e];if(!a)throw new Q.NoSuchHistoryEntryException(`No history entry at delta ${e}`);await this.#W.cdpClient.sendCommand("Page.navigateToHistoryEntry",{entryId:a.id})}}function oe(e){return["://",""].includes(e)&&(e="null"),e}function ie(e){if("object"!==e.type||void 0===e.value)return;const t=e.value.find((([e])=>"x"===e))?.[1],a=e.value.find((([e])=>"y"===e))?.[1],r=e.value.find((([e])=>"height"===e))?.[1],n=e.value.find((([e])=>"width"===e))?.[1];return"number"===t?.type&&"number"===a?.type&&"number"===r?.type&&"number"===n?.type?{x:t.value,y:a.value,width:n.value,height:r.value}:void 0}function ce(e){return{...e.width<0?{x:e.x+e.width,width:-e.width}:{x:e.x,width:e.width},...e.height<0?{y:e.y+e.height,height:-e.height}:{y:e.y,height:e.height}}}function de(e){if(e=e.trim(),!/^[0-9]+$/.test(e))throw new Q.InvalidArgumentException(`Invalid integer: ${e}`);return parseInt(e)}H.BrowsingContextImpl=se,H.serializeOrigin=oe;var ue={},le={},he={};Object.defineProperty(he,"__esModule",{value:!0}),he.getRemoteValuesText=he.logMessageFormatter=void 0;const pe=J,me=["%s","%d","%i","%f","%o","%O","%c"];function fe(e){return me.some((t=>e.includes(t)))}function ge(e){let t="";const a=e[0].value.toString(),r=e.slice(1,void 0),n=a.split(new RegExp(me.map((e=>`(${e})`)).join("|"),"g"));for(const a of n)if(void 0!==a&&""!==a)if(fe(a)){const n=r.shift();(0,pe.assert)(n,`Less value is provided: "${ve(e,!1)}"`),"%s"===a?t+=Se(n):"%d"===a||"%i"===a?"bigint"===n.type||"number"===n.type||"string"===n.type?t+=parseInt(n.value.toString(),10):t+="NaN":"%f"===a?"bigint"===n.type||"number"===n.type||"string"===n.type?t+=parseFloat(n.value.toString()):t+="NaN":t+=ye(n)}else t+=a;if(r.length>0)throw new Error(`More value is provided: "${ve(e,!1)}"`);return t}function ye(e){if("array"!==e.type&&"bigint"!==e.type&&"date"!==e.type&&"number"!==e.type&&"object"!==e.type&&"string"!==e.type)return Se(e);if("bigint"===e.type)return`${e.value.toString()}n`;if("number"===e.type)return e.value.toString();if(["date","string"].includes(e.type))return JSON.stringify(e.value);if("object"===e.type)return`{${e.value.map((e=>`${JSON.stringify(e[0])}:${ye(e[1])}`)).join(",")}}`;if("array"===e.type)return`[${e.value?.map((e=>ye(e))).join(",")??""}]`;throw Error(`Invalid value type: ${e}`)}function Se(e){if(!Object.hasOwn(e,"value"))return e.type;switch(e.type){case"string":case"number":case"boolean":case"bigint":return String(e.value);case"regexp":return`/${e.value.pattern}/${e.value.flags??""}`;case"date":return new Date(e.value).toString();case"object":return`Object(${e.value?.length??""})`;case"array":return`Array(${e.value?.length??""})`;case"map":return`Map(${e.value?.length})`;case"set":return`Set(${e.value?.length})`;default:return e.type}}function ve(e,t){const a=e[0];return a?"string"===a.type&&fe(a.value.toString())&&t?ge(e):e.map((e=>Se(e))).join(" "):""}he.logMessageFormatter=ge,he.getRemoteValuesText=ve,Object.defineProperty(le,"__esModule",{value:!0}),le.LogManager=void 0;const we=g,Ce=he;function be(e){const t=e?.callFrames.map((e=>({columnNumber:e.columnNumber,functionName:e.functionName,lineNumber:e.lineNumber,url:e.url})));return t?{callFrames:t}:void 0}class xe{#k;#S;#W;constructor(e,t,a){this.#W=e,this.#S=t,this.#k=a}static create(e,t,a){const r=new xe(e,t,a);return r.#ae(),r}#ae(){this.#W.cdpClient.on("Runtime.consoleAPICalled",(e=>{const t=this.#S.findRealm({cdpSessionId:this.#W.cdpSessionId,executionContextId:e.executionContextId}),a=void 0===t?Promise.resolve(e.args):Promise.all(e.args.map((e=>t.serializeCdpObject(e,"none"))));this.#k.registerPromiseEvent(a.then((a=>{return{kind:"success",value:{type:"event",method:we.ChromiumBidi.Log.EventNames.LogEntryAdded,params:{level:(r=e.type,["error","assert"].includes(r)?"error":["debug","trace"].includes(r)?"debug":["warn","warning"].includes(r)?"warn":"info"),source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:(0,Ce.getRemoteValuesText)(a,!0),timestamp:Math.round(e.timestamp),stackTrace:be(e.stackTrace),type:"console",method:"warning"===e.type?"warn":e.type,args:a}}};var r})),t?.browsingContextId??"UNKNOWN",we.ChromiumBidi.Log.EventNames.LogEntryAdded)})),this.#W.cdpClient.on("Runtime.exceptionThrown",(e=>{const t=this.#S.findRealm({cdpSessionId:this.#W.cdpSessionId,executionContextId:e.exceptionDetails.executionContextId});this.#k.registerPromiseEvent(xe.#re(e,t).then((a=>({kind:"success",value:{type:"event",method:we.ChromiumBidi.Log.EventNames.LogEntryAdded,params:{level:"error",source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:a,timestamp:Math.round(e.timestamp),stackTrace:be(e.exceptionDetails.stackTrace),type:"javascript"}}}))),t?.browsingContextId??"UNKNOWN",we.ChromiumBidi.Log.EventNames.LogEntryAdded)}))}static async#re(e,t){return e.exceptionDetails.exception?void 0===t?JSON.stringify(e.exceptionDetails.exception):await t.stringifyObject(e.exceptionDetails.exception):e.exceptionDetails.text}}le.LogManager=xe;var Pe={},Ie={},ke={};Object.defineProperty(ke,"__esModule",{value:!0}),ke.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction=ke.cdpFetchHeadersFromBidiNetworkHeaders=ke.bidiNetworkHeadersFromCdpFetchHeaders=ke.cdpNetworkHeadersFromBidiNetworkHeaders=ke.bidiNetworkHeadersFromCdpNetworkHeaders=ke.computeHeadersSize=void 0,ke.computeHeadersSize=function(e){const t=e.reduce(((e,t)=>`${e}${t.name}: ${t.value.value}\r\n`),"");return(new TextEncoder).encode(t).length},ke.bidiNetworkHeadersFromCdpNetworkHeaders=function(e){return e?Object.entries(e).map((([e,t])=>({name:e,value:{type:"string",value:t}}))):[]},ke.cdpNetworkHeadersFromBidiNetworkHeaders=function(e){if(void 0!==e)return e.reduce(((e,t)=>(e[t.name]=t.value.value,e)),{})},ke.bidiNetworkHeadersFromCdpFetchHeaders=function(e){return e?e.map((({name:e,value:t})=>({name:e,value:{type:"string",value:t}}))):[]},ke.cdpFetchHeadersFromBidiNetworkHeaders=function(e){if(void 0!==e)return e.map((({name:e,value:t})=>({name:e,value:t.value})))},ke.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction=function(e){switch(e){case"default":return"Default";case"cancel":return"CancelAuth";case"provideCredentials":return"ProvideCredentials"}},Object.defineProperty(Ie,"__esModule",{value:!0}),Ie.NetworkRequest=void 0;const Re=g,Ee=J,_e=G,Te=ke;class Ne{static#ne="UNKNOWN";#se;#oe=void 0;#ie=!1;#ce;#k;#de;#ue={};#le={};#he=new _e.Deferred;#pe=new _e.Deferred;#me=new _e.Deferred;#W;constructor(e,t,a,r,n=0){this.#se=e,this.#k=t,this.#de=a,this.#W=r,this.#ce=n}get requestId(){return this.#se}get url(){return this.#le.info?.url??this.#ue.info?.request.url}get redirectCount(){return this.#ce}get cdpTarget(){return this.#W}isRedirecting(){return Boolean(this.#ue.info)}handleRedirect(e){this.#fe(),this.#ge(),this.#le.hasExtraInfo=e.redirectHasExtraInfo,this.#le.info=e.redirectResponse,this.#ye(!0)}#ye(e=!1){const t=e||Boolean(this.#ue.extraInfo)||this.#ie||Boolean(this.#le.info&&!this.#le.hasExtraInfo)||"beforeRequestSent"===this.#oe;this.#ue.info&&t&&this.#he.resolve({kind:"success",value:void 0});const a=Boolean(this.#le.extraInfo)||this.#ie||Boolean(this.#le.info&&!this.#le.hasExtraInfo)||"responseStarted"===this.#oe;this.#le.info&&a&&(this.#pe.resolve({kind:"success",value:void 0}),this.#me.resolve({kind:"success",value:void 0}))}onRequestWillBeSentEvent(e){this.#ue.info=e,this.#Se(),this.#ye()}onRequestWillBeSentExtraInfoEvent(e){this.#ue.extraInfo=e,this.#ye()}onResponseReceivedExtraInfoEvent(e){this.#le.extraInfo=e,this.#ye()}onResponseReceivedEvent(e){this.#le.hasExtraInfo=e.hasExtraInfo,this.#le.info=e.response,this.#fe(),this.#ge(),this.#ye()}onServedFromCache(){this.#ie=!0,this.#ye()}onLoadingFailedEvent(e){this.#he.resolve({kind:"success",value:void 0}),this.#pe.resolve({kind:"error",error:new Error("Network event loading failed")}),this.#me.resolve({kind:"error",error:new Error("Network event loading failed")}),this.#k.registerEvent({type:"event",method:Re.ChromiumBidi.Network.EventNames.FetchError,params:{...this.#ve(),errorText:e.errorText}},this.#we)}onRequestPaused(e){if(this.#Ce())return void this.continueRequest(e.requestId).catch((()=>{}));let t;t=void 0===e.responseErrorReason&&void 0===e.responseStatusCode?"beforeRequestSent":401===e.responseStatusCode&&"Unauthorized"===e.responseStatusText?"authRequired":"responseStarted";const a=(0,Te.bidiNetworkHeadersFromCdpFetchHeaders)(e.responseHeaders);this.#de.addBlockedRequest(this.requestId,{request:e.requestId,phase:t,response:{url:e.request.url,protocol:"",status:e.responseStatusCode??0,statusText:e.responseStatusText??"",fromCache:!1,headers:a,mimeType:"",bytesReceived:0,headersSize:(0,Te.computeHeadersSize)(a),bodySize:0,content:{size:0},authChallenge:void 0}}),this.#oe=t,this.#ye()}async failRequest(e,t){await this.#W.cdpClient.sendCommand("Fetch.failRequest",{requestId:e,errorReason:t}),this.#oe=void 0}async continueRequest(e,t,a,r){await this.#W.cdpClient.sendCommand("Fetch.continueRequest",{requestId:e,url:t,method:a,headers:r}),this.#oe=void 0}async continueResponse(e,t,a,r){await this.#W.cdpClient.sendCommand("Fetch.continueResponse",{requestId:e,responseCode:t,responsePhrase:a,responseHeaders:r}),this.#oe=void 0}async continueWithAuth(e,t,a,r){await this.#W.cdpClient.sendCommand("Fetch.continueWithAuth",{requestId:e,authChallengeResponse:{response:t,username:a,password:r}}),this.#oe=void 0}async provideResponse(e,t,a,r,n){await this.#W.cdpClient.sendCommand("Fetch.fulfillRequest",{requestId:e,responseCode:t,responsePhrase:a,responseHeaders:r,...n?{body:btoa(n)}:{}}),this.#oe=void 0}dispose(){const e={kind:"error",error:new Error("Network processor detached")};this.#he.resolve(e),this.#pe.resolve(e),this.#me.resolve(e)}get#we(){return this.#ue.info?.frameId??null}get statusCode(){return this.#le.info?.status??this.#le.extraInfo?.statusCode??-1}#ve(e){const t=void 0!==e&&e===this.#oe,a=this.#de.getNetworkIntercepts(this.#se,e);return{isBlocked:t,context:this.#we,navigation:this.#be(),redirectCount:this.#ce,request:this.#xe(),timestamp:Math.round(1e3*(this.#ue.info?.wallTime??0)),intercepts:t?a:void 0}}#be(){return this.#ue.info&&this.#ue.info.loaderId&&this.#ue.info.loaderId===this.#ue.info.requestId?this.#ue.info.loaderId:null}#xe(){const e=this.#ue.extraInfo?Ne.#Pe(this.#ue.extraInfo.associatedCookies):[],t=(0,Te.bidiNetworkHeadersFromCdpNetworkHeaders)(this.#ue.info?.request.headers);return{request:this.#ue.info?.requestId??Ne.#ne,url:this.#ue.info?.request.url??Ne.#ne,method:this.#ue.info?.request.method??Ne.#ne,headers:t,cookies:e,headersSize:(0,Te.computeHeadersSize)(t),bodySize:0,timings:this.#Ie()}}#Ie(){return{timeOrigin:0,requestTime:0,redirectStart:0,redirectEnd:0,fetchStart:0,dnsStart:0,dnsEnd:0,connectStart:0,connectEnd:0,tlsStart:0,requestStart:0,responseStart:0,responseEnd:0}}#Se(){this.#Ce()||this.#k.registerPromiseEvent(this.#he.then((e=>{if("success"===e.kind)try{return{kind:"success",value:Object.assign(this.#ke(),{type:"event"})}}catch(e){return{kind:"error",error:e instanceof Error?e:new Error("Unknown")}}return e})),this.#we,Re.ChromiumBidi.Network.EventNames.BeforeRequestSent)}#ke(){return(0,Ee.assert)(this.#ue.info,"RequestWillBeSentEvent is not set"),{method:Re.ChromiumBidi.Network.EventNames.BeforeRequestSent,params:{...this.#ve("beforeRequestSent"),initiator:{type:Ne.#Re(this.#ue.info.initiator.type)}}}}#fe(){this.#Ce()||this.#k.registerPromiseEvent(this.#pe.then((e=>{if("success"===e.kind)try{return{kind:"success",value:Object.assign(this.#Ee(),{type:"event"})}}catch(e){return{kind:"error",error:e instanceof Error?e:new Error("Unknown")}}return e})),this.#we,Re.ChromiumBidi.Network.EventNames.ResponseStarted)}#Ee(){(0,Ee.assert)(this.#ue.info,"RequestWillBeSentEvent is not set"),(0,Ee.assert)(this.#le.info,"ResponseReceivedEvent is not set"),this.#le.info.fromDiskCache&&(this.#le.extraInfo=void 0);const e=(0,Te.bidiNetworkHeadersFromCdpNetworkHeaders)(this.#le.info.headers);return{method:Re.ChromiumBidi.Network.EventNames.ResponseStarted,params:{...this.#ve(),response:{url:this.#le.info.url??Ne.#ne,protocol:this.#le.info.protocol??"",status:this.statusCode,statusText:this.#le.info.statusText,fromCache:this.#le.info.fromDiskCache||this.#le.info.fromPrefetchCache||this.#ie,headers:e,mimeType:this.#le.info.mimeType,bytesReceived:this.#le.info.encodedDataLength,headersSize:(0,Te.computeHeadersSize)(e),bodySize:0,content:{size:0}}}}}#ge(){this.#Ce()||this.#k.registerPromiseEvent(this.#me.then((e=>{if("success"===e.kind)try{return{kind:"success",value:Object.assign(this.#_e(),{type:"event"})}}catch(e){return{kind:"error",error:e instanceof Error?e:new Error("Unknown")}}return e})),this.#we,Re.ChromiumBidi.Network.EventNames.ResponseCompleted)}#_e(){(0,Ee.assert)(this.#ue.info,"RequestWillBeSentEvent is not set"),(0,Ee.assert)(this.#le.info,"ResponseReceivedEvent is not set"),this.#le.info.fromDiskCache&&(this.#le.extraInfo=void 0);const e=(0,Te.bidiNetworkHeadersFromCdpNetworkHeaders)(this.#le.info.headers);return{method:Re.ChromiumBidi.Network.EventNames.ResponseCompleted,params:{...this.#ve(),response:{url:this.#le.info.url??Ne.#ne,protocol:this.#le.info.protocol??"",status:this.statusCode,statusText:this.#le.info.statusText,fromCache:this.#le.info.fromDiskCache||this.#le.info.fromPrefetchCache||this.#ie,headers:e,mimeType:this.#le.info.mimeType,bytesReceived:this.#le.info.encodedDataLength,headersSize:(0,Te.computeHeadersSize)(e),bodySize:0,content:{size:0}}}}}#Ce(){return this.#ue.info?.request.url.endsWith("/favicon.ico")??!1}static#Re(e){switch(e){case"parser":case"script":case"preflight":return e;default:return"other"}}static#Pe(e){return e.filter((({blockedReasons:e})=>!Array.isArray(e)||0===e.length)).map((({cookie:e})=>({name:e.name,value:{type:"string",value:e.value},domain:e.domain,path:e.path,expires:e.expires,size:e.size,httpOnly:e.httpOnly,secure:e.secure,sameSite:Ne.#Te(e.sameSite)})))}static#Te(e){switch(e){case"Strict":return"strict";case"Lax":return"lax";default:return"none"}}}Ie.NetworkRequest=Ne,Object.defineProperty(Pe,"__esModule",{value:!0}),Pe.NetworkManager=void 0;const je=Ie;class Oe{#W;#k;#de;constructor(e,t,a){this.#W=e,this.#k=t,this.#de=a}get cdpTarget(){return this.#W}#Ne(e,t){let a=this.#de.getRequest(e);return a||(a=new je.NetworkRequest(e,this.#k,this.#de,this.#W,t),this.#de.addRequest(a),a)}static create(e,t,a){const r=new Oe(e,t,a);return e.browserCdpClient.on("Target.detachedFromTarget",(t=>{e.cdpClient.sessionId===t.sessionId&&r.#de.disposeRequestMap()})),e.cdpClient.on("Network.requestWillBeSent",(e=>{const t=r.#de.getRequest(e.requestId);t&&t.isRedirecting()?(t.handleRedirect(e),r.#de.deleteRequest(e.requestId),r.#Ne(e.requestId,t.redirectCount+1).onRequestWillBeSentEvent(e)):t?t.onRequestWillBeSentEvent(e):r.#Ne(e.requestId).onRequestWillBeSentEvent(e)})),e.cdpClient.on("Network.requestWillBeSentExtraInfo",(e=>{r.#Ne(e.requestId).onRequestWillBeSentExtraInfoEvent(e)})),e.cdpClient.on("Network.responseReceived",(e=>{r.#Ne(e.requestId).onResponseReceivedEvent(e)})),e.cdpClient.on("Network.responseReceivedExtraInfo",(e=>{r.#Ne(e.requestId).onResponseReceivedExtraInfoEvent(e)})),e.cdpClient.on("Network.requestServedFromCache",(e=>{r.#Ne(e.requestId).onServedFromCache()})),e.cdpClient.on("Network.loadingFailed",(e=>{r.#Ne(e.requestId).onLoadingFailedEvent(e)})),e.cdpClient.on("Fetch.requestPaused",(e=>{e.networkId&&r.#Ne(e.networkId).onRequestPaused(e)})),r}}Pe.NetworkManager=Oe,Object.defineProperty(ue,"__esModule",{value:!0}),ue.CdpTarget=void 0;const Me=G,Ae=le,De=Pe;class Be{#je;#I;#o;#Oe;#k;#Me;#de;#Ae=new Me.Deferred;#De;static create(e,t,a,r,n,s,o,i,c){const d=new Be(e,t,a,r,s,o,i,c);return Ae.LogManager.create(d,n,s),De.NetworkManager.create(d,s,i),d.#Be(),d.#ze(),d}constructor(e,t,a,r,n,s,o,i){this.#je=e,this.#I=t,this.#Oe=r,this.#k=n,this.#Me=s,this.#de=o,this.#o=a,this.#De=i}get targetUnblocked(){return this.#Ae}get targetId(){return this.#je}get cdpClient(){return this.#I}get browserCdpClient(){return this.#o}get cdpSessionId(){return this.#Oe}async fetchEnable(){await this.#I.sendCommand("Fetch.enable",this.#de.getFetchEnableParams())}async fetchDisable(){await this.#I.sendCommand("Fetch.disable")}async#ze(){try{await Promise.all([this.#I.sendCommand("Runtime.enable"),this.#I.sendCommand("Page.enable"),this.#I.sendCommand("Page.setLifecycleEventsEnabled",{enabled:!0}),this.#I.sendCommand("Security.setIgnoreCertificateErrors",{ignore:this.#De}),this.#I.sendCommand("Network.enable"),this.fetchEnable(),this.#I.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),this.#Le(),this.#I.sendCommand("Runtime.runIfWaitingForDebugger")])}catch(e){if(!this.#I.isCloseError(e))return void this.#Ae.resolve({kind:"error",error:e})}this.#Ae.resolve({kind:"success",value:void 0})}#Be(){this.#I.on("*",((e,t)=>{"string"==typeof e&&this.#k.registerEvent({type:"event",method:`cdp.${e}`,params:{event:e,params:t,session:this.#Oe}},null)}))}getChannels(){return this.#Me.find().flatMap((e=>e.channels))}async#Le(){for(const e of this.#Me.find({global:!0}))await e.initInTarget(this,!0)}}ue.CdpTarget=Be,Object.defineProperty(N,"__esModule",{value:!0}),N.BrowsingContextProcessor=void 0;const ze=g,Le=l,Ze=j,Ue=H,Fe=ue;N.BrowsingContextProcessor=class{#o;#c;#Ze;#k;#i;#de;#De;#x;#Me;#S;#t;constructor(e,t,a,r,n,s,o,i,c,d,u){this.#De=c,this.#c=e,this.#o=t,this.#Ze=a,this.#k=r,this.#i=n,this.#Me=i,this.#de=o,this.#S=s,this.#x=d,this.#t=u,this.#Be(t)}getTree(e){return{contexts:(void 0===e.root?this.#i.getTopLevelContexts():[this.#i.getContext(e.root)]).map((t=>t.serializeToBidiValue(e.maxDepth??Number.MAX_VALUE)))}}async create(e){let t,a;if(void 0!==e.referenceContext&&(t=this.#i.getContext(e.referenceContext),!t.isTopLevelContext()))throw new ze.InvalidArgumentException("referenceContext should be a top-level context");switch(e.type){case"tab":a=await this.#o.sendCommand("Target.createTarget",{url:"about:blank",newWindow:!1});break;case"window":a=await this.#o.sendCommand("Target.createTarget",{url:"about:blank",newWindow:!0})}const r=a.targetId,n=this.#i.getContext(r);return await n.lifecycleLoaded(),{context:n.id}}navigate(e){return this.#i.getContext(e.context).navigate(e.url,e.wait??"none")}reload(e){return this.#i.getContext(e.context).reload(e.ignoreCache??!1,e.wait??"none")}async activate(e){const t=this.#i.getContext(e.context);if(!t.isTopLevelContext())throw new ze.InvalidArgumentException("Activation is only supported on the top-level context");return await t.activate(),{}}async captureScreenshot(e){const t=this.#i.getContext(e.context);return await t.captureScreenshot(e)}async print(e){const t=this.#i.getContext(e.context);return await t.print(e)}async setViewport(e){const t=this.#i.getContext(e.context);if(!t.isTopLevelContext())throw new ze.InvalidArgumentException("Emulating viewport is only supported on the top-level context");return await t.setViewport(e.viewport,e.devicePixelRatio),{}}async traverseHistory(e){const t=this.#i.getContext(e.context);if(!t)throw new ze.InvalidArgumentException(`No browsing context with id ${e.context}`);return await t.traverseHistory(e.delta),{}}async handleUserPrompt(e){const t=this.#i.getContext(e.context);return await t.handleUserPrompt(e),{}}async close(e){const t=this.#i.getContext(e.context);if(!t.isTopLevelContext())throw new ze.InvalidArgumentException(`Non top-level browsing context ${t.id} cannot be closed.`);try{const a=new Promise((t=>{const a=r=>{r.targetId===e.context&&(this.#o.off("Target.detachedFromTarget",a),t())};this.#o.on("Target.detachedFromTarget",a)}));e.promptUnload?await t.close():await this.#o.sendCommand("Target.closeTarget",{targetId:e.context}),await a}catch(e){if(-32e3!==e.code||"Not attached to an active page"!==e.message)throw e}return{}}#Be(e){e.on("Target.attachedToTarget",(t=>{this.#Ue(t,e)})),e.on("Target.detachedFromTarget",(e=>{this.#Fe(e)})),e.on("Target.targetInfoChanged",(e=>{this.#qe(e)})),e.on("Page.frameAttached",(e=>{this.#Ve(e)})),e.on("Page.frameDetached",(e=>{this.#$e(e)}))}#Ve(e){const t=this.#i.findContext(e.parentFrameId);void 0!==t&&Ue.BrowsingContextImpl.create(t.cdpTarget,this.#S,e.frameId,e.parentFrameId,this.#k,this.#i,this.#x,this.#t)}#$e(e){"swap"!==e.reason&&this.#i.findContext(e.frameId)?.dispose()}#Ue(e,t){const{sessionId:a,targetInfo:r}=e,n=this.#c.getCdpClient(a);switch(this.#t?.(Le.LogType.debugInfo,"AttachedToTarget event received:",e),r.type){case"page":case"iframe":{if(r.targetId===this.#Ze)break;this.#Be(n);const e=Fe.CdpTarget.create(r.targetId,n,this.#o,a,this.#S,this.#k,this.#Me,this.#de,this.#De),t=this.#i.findContext(r.targetId);return void(t?t.updateCdpTarget(e):Ue.BrowsingContextImpl.create(e,this.#S,r.targetId,null,this.#k,this.#i,this.#x,this.#t))}case"worker":{this.#Be(n);const e=Fe.CdpTarget.create(r.targetId,n,this.#o,a,this.#S,this.#k,this.#Me,this.#de,this.#De),s=t.sessionId&&this.#i.findContextBySession(t.sessionId);if(!s)break;return void this.#Ke(e,s.id)}}n.sendCommand("Runtime.runIfWaitingForDebugger").then((()=>t.sendCommand("Target.detachFromTarget",e))).catch((e=>this.#t?.(Le.LogType.debugError,e)))}#We=new Map;#Ke(e,t){e.cdpClient.on("Runtime.executionContextCreated",(a=>{const{uniqueId:r,id:n,origin:s}=a.context,o=new Ze.Realm(this.#S,this.#i,r,t,n,(0,Ue.serializeOrigin)(s),"dedicated-worker",void 0,e.cdpClient,this.#k,this.#x,this.#t);this.#We.set(e.cdpSessionId,o)}))}#Fe(e){const t=this.#i.findContextBySession(e.sessionId);if(t)return t.dispose(),void this.#Me.find({targetId:t.id}).map((e=>e.dispose(t.id)));const a=this.#We.get(e.sessionId);a&&this.#S.deleteRealms({cdpSessionId:a.cdpClient.sessionId})}#qe(e){const t=this.#i.findContext(e.targetInfo.targetId);t&&t.onTargetInfoChanged(e)}};var qe={},Ve={},$e={};Object.defineProperty($e,"__esModule",{value:!0}),$e.WheelSource=$e.PointerSource=$e.KeySource=$e.NoneSource=void 0;$e.NoneSource=class{type="none"};$e.KeySource=class{type="key";pressed=new Set;#He=0;get modifiers(){return this.#He}get alt(){return 1==(1&this.#He)}set alt(e){this.#Je(e,1)}get ctrl(){return 2==(2&this.#He)}set ctrl(e){this.#Je(e,2)}get meta(){return 4==(4&this.#He)}set meta(e){this.#Je(e,4)}get shift(){return 8==(8&this.#He)}set shift(e){this.#Je(e,8)}#Je(e,t){e?this.#He|=t:this.#He&=~t}};$e.PointerSource=class{type="pointer";subtype;pointerId;pressed=new Set;x=0;y=0;constructor(e,t){this.pointerId=e,this.subtype=t}get buttons(){let e=0;for(const t of this.pressed)switch(t){case 0:e|=1;break;case 1:e|=4;break;case 2:e|=2;break;case 3:e|=8;break;case 4:e|=16}return e}static ClickContext=class e{static#Ge=500;static#Xe=2;count=0;#Ye;#Qe;#et;constructor(e,t,a){this.#Ye=e,this.#Qe=t,this.#et=a}compare(t){return t.#et-this.#et>e.#Ge||Math.abs(t.#Ye-this.#Ye)>e.#Xe||Math.abs(t.#Qe-this.#Qe)>e.#Xe}};#tt=new Map;setClickCount(e,t){let a=this.#tt.get(e);return a&&!a.compare(t)||(a=t),++a.count,this.#tt.set(e,a),a.count}getClickCount(e){return this.#tt.get(e)?.count??0}};$e.WheelSource=class{type="wheel"};var Ke={};Object.defineProperty(Ke,"__esModule",{value:!0}),Ke.getKeyLocation=Ke.getKeyCode=Ke.getNormalizedKey=void 0,Ke.getNormalizedKey=function(e){switch(e){case"\ue000":return"Unidentified";case"\ue001":return"Cancel";case"\ue002":return"Help";case"\ue003":return"Backspace";case"\ue004":return"Tab";case"\ue005":return"Clear";case"\ue006":return"Return";case"\ue007":return"Enter";case"\ue008":case"\ue050":return"Shift";case"\ue009":case"\ue051":return"Control";case"\ue00a":case"\ue052":return"Alt";case"\ue00b":return"Pause";case"\ue00c":return"Escape";case"\ue00d":return" ";case"\ue00e":case"\ue054":return"PageUp";case"\ue00f":case"\ue055":return"PageDown";case"\ue010":case"\ue056":return"End";case"\ue011":case"\ue057":return"Home";case"\ue012":case"\ue058":return"ArrowLeft";case"\ue013":case"\ue059":return"ArrowUp";case"\ue014":case"\ue05a":return"ArrowRight";case"\ue015":case"\ue05b":return"ArrowDown";case"\ue016":case"\ue05c":return"Insert";case"\ue017":case"\ue05d":return"Delete";case"\ue018":return";";case"\ue019":return"=";case"\ue01a":return"0";case"\ue01b":return"1";case"\ue01c":return"2";case"\ue01d":return"3";case"\ue01e":return"4";case"\ue01f":return"5";case"\ue020":return"6";case"\ue021":return"7";case"\ue022":return"8";case"\ue023":return"9";case"\ue024":return"*";case"\ue025":return"+";case"\ue026":return",";case"\ue027":return"-";case"\ue028":return".";case"\ue029":return"/";case"\ue031":return"F1";case"\ue032":return"F2";case"\ue033":return"F3";case"\ue034":return"F4";case"\ue035":return"F5";case"\ue036":return"F6";case"\ue037":return"F7";case"\ue038":return"F8";case"\ue039":return"F9";case"\ue03a":return"F10";case"\ue03b":return"F11";case"\ue03c":return"F12";case"\ue03d":case"\ue053":return"Meta";case"\ue040":return"ZenkakuHankaku";default:return e}},Ke.getKeyCode=function(e){switch(e){case"`":case"~":return"Backquote";case"\\":case"|":return"Backslash";case"\ue003":return"Backspace";case"[":case"{":return"BracketLeft";case"]":case"}":return"BracketRight";case",":case"<":return"Comma";case"0":case")":return"Digit0";case"1":case"!":return"Digit1";case"2":case"@":return"Digit2";case"3":case"#":return"Digit3";case"4":case"$":return"Digit4";case"5":case"%":return"Digit5";case"6":case"^":return"Digit6";case"7":case"&":return"Digit7";case"8":case"*":return"Digit8";case"9":case"(":return"Digit9";case"=":case"+":return"Equal";case"a":case"A":return"KeyA";case"b":case"B":return"KeyB";case"c":case"C":return"KeyC";case"d":case"D":return"KeyD";case"e":case"E":return"KeyE";case"f":case"F":return"KeyF";case"g":case"G":return"KeyG";case"h":case"H":return"KeyH";case"i":case"I":return"KeyI";case"j":case"J":return"KeyJ";case"k":case"K":return"KeyK";case"l":case"L":return"KeyL";case"m":case"M":return"KeyM";case"n":case"N":return"KeyN";case"o":case"O":return"KeyO";case"p":case"P":return"KeyP";case"q":case"Q":return"KeyQ";case"r":case"R":return"KeyR";case"s":case"S":return"KeyS";case"t":case"T":return"KeyT";case"u":case"U":return"KeyU";case"v":case"V":return"KeyV";case"w":case"W":return"KeyW";case"x":case"X":return"KeyX";case"y":case"Y":return"KeyY";case"z":case"Z":return"KeyZ";case"-":case"_":return"Minus";case".":return"Period";case"'":case'"':return"Quote";case";":case":":return"Semicolon";case"/":case"?":return"Slash";case"\ue00a":return"AltLeft";case"\ue052":return"AltRight";case"\ue009":return"ControlLeft";case"\ue051":return"ControlRight";case"\ue006":return"Enter";case"\ue03d":return"MetaLeft";case"\ue053":return"MetaRight";case"\ue008":return"ShiftLeft";case"\ue050":return"ShiftRight";case" ":case"\ue00d":return"Space";case"\ue004":return"Tab";case"\ue017":return"Delete";case"\ue010":return"End";case"\ue002":return"Help";case"\ue011":return"Home";case"\ue016":return"Insert";case"\ue00f":return"PageDown";case"\ue00e":return"PageUp";case"\ue015":return"ArrowDown";case"\ue012":return"ArrowLeft";case"\ue014":return"ArrowRight";case"\ue013":return"ArrowUp";case"\ue00c":return"Escape";case"\ue031":return"F1";case"\ue032":return"F2";case"\ue033":return"F3";case"\ue034":return"F4";case"\ue035":return"F5";case"\ue036":return"F6";case"\ue037":return"F7";case"\ue038":return"F8";case"\ue039":return"F9";case"\ue03a":return"F10";case"\ue03b":return"F11";case"\ue03c":return"F12";case"\ue01a":case"\ue05c":return"Numpad0";case"\ue01b":case"\ue056":return"Numpad1";case"\ue01c":case"\ue05b":return"Numpad2";case"\ue01d":case"\ue055":return"Numpad3";case"\ue01e":case"\ue058":return"Numpad4";case"\ue01f":return"Numpad5";case"\ue020":case"\ue05a":return"Numpad6";case"\ue021":case"\ue057":return"Numpad7";case"\ue022":case"\ue059":return"Numpad8";case"\ue023":case"\ue054":return"Numpad9";case"\ue025":return"NumpadAdd";case"\ue026":return"NumpadComma";case"\ue028":case"\ue05d":return"NumpadDecimal";case"\ue029":return"NumpadDivide";case"\ue007":return"NumpadEnter";case"\ue024":return"NumpadMultiply";case"\ue027":return"NumpadSubtract";default:return}},Ke.getKeyLocation=function(e){switch(e){case"\ue007":case"\ue008":case"\ue009":case"\ue00a":case"\ue03d":return 1;case"\ue01a":case"\ue01b":case"\ue01c":case"\ue01d":case"\ue01e":case"\ue01f":case"\ue020":case"\ue021":case"\ue022":case"\ue023":case"\ue024":case"\ue025":case"\ue026":case"\ue027":case"\ue028":case"\ue029":case"\ue054":case"\ue055":case"\ue056":case"\ue057":case"\ue058":case"\ue059":case"\ue05a":case"\ue05b":case"\ue05c":case"\ue05d":return 3;case"\ue050":case"\ue051":case"\ue052":case"\ue053":return 2;default:return 0}};var We={};Object.defineProperty(We,"__esModule",{value:!0}),We.KeyToKeyCode=void 0,We.KeyToKeyCode={0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,Abort:3,Help:6,Backspace:8,Tab:9,Numpad5:12,NumpadEnter:13,Enter:13,"\\r":13,"\\n":13,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,Pause:19,CapsLock:20,Escape:27,Convert:28,NonConvert:29,Space:32,Numpad9:33,PageUp:33,Numpad3:34,PageDown:34,End:35,Numpad1:35,Home:36,Numpad7:36,ArrowLeft:37,Numpad4:37,Numpad8:38,ArrowUp:38,ArrowRight:39,Numpad6:39,Numpad2:40,ArrowDown:40,Select:41,Open:43,PrintScreen:44,Insert:45,Numpad0:45,Delete:46,NumpadDecimal:46,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,MetaLeft:91,MetaRight:92,ContextMenu:93,NumpadMultiply:106,NumpadAdd:107,NumpadSubtract:109,NumpadDivide:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,NumLock:144,ScrollLock:145,AudioVolumeMute:173,AudioVolumeDown:174,AudioVolumeUp:175,MediaTrackNext:176,MediaTrackPrevious:177,MediaStop:178,MediaPlayPause:179,Semicolon:186,Equal:187,NumpadEqual:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,AltGraph:225,Props:247,Cancel:3,Clear:12,Shift:16,Control:17,Alt:18,Accept:30,ModeChange:31," ":32,Print:42,Execute:43,"\\u0000":46,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,Meta:91,"*":106,"+":107,"-":109,"/":111,";":186,"=":187,",":188,".":190,"`":192,"[":219,"\\\\":220,"]":221,"'":222,Attn:246,CrSel:247,ExSel:248,EraseEof:249,Play:250,ZoomOut:251,")":48,"!":49,"@":50,"#":51,$:52,"%":53,"^":54,"&":55,"(":57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,":":186,"<":188,_:189,">":190,"?":191,"~":192,"{":219,"|":220,"}":221,'"':222,Camera:44,EndCall:95,VolumeDown:182,VolumeUp:183},Object.defineProperty(Ve,"__esModule",{value:!0}),Ve.ActionDispatcher=void 0;const He=g,Je=J,Ge=$e,Xe=Ke,Ye=We,Qe=(e=>{const t=e.getClientRects()[0],a=Math.max(0,Math.min(t.x,t.x+t.width)),r=Math.min(window.innerWidth,Math.max(t.x,t.x+t.width)),n=Math.max(0,Math.min(t.y,t.y+t.height));return[a+(r-a>>1),n+(Math.min(window.innerHeight,Math.max(t.y,t.y+t.height))-n>>1)]}).toString(),et=(()=>navigator.platform.toLowerCase().includes("mac")).toString();Ve.ActionDispatcher=class{static isMacOS=async e=>{const t=await(await e.getOrCreateSandbox(void 0)).callFunction(et,{type:"undefined"},[],!1,"none",{});return(0,Je.assert)("exception"!==t.type),(0,Je.assert)("boolean"===t.result.type),t.result.value};#at=0;#rt=0;#nt;#we;#st;constructor(e,t,a){this.#nt=e,this.#we=t,this.#st=a}async dispatchActions(e){await this.#nt.queue.run((async()=>{for(const t of e)await this.dispatchTickActions(t)}))}async dispatchTickActions(e){this.#at=performance.now(),this.#rt=0;for(const{action:t}of e)"duration"in t&&void 0!==t.duration&&(this.#rt=Math.max(this.#rt,t.duration));const t=[new Promise((e=>setTimeout(e,this.#rt)))];for(const a of e)t.push(this.#ot(a));await Promise.all(t)}async#ot({id:e,action:t}){const a=this.#nt.get(e),r=this.#nt.getGlobalKeyState();switch(t.type){case"keyDown":await this.#it(a,t),this.#nt.cancelList.push({id:e,action:{...t,type:"keyUp"}});break;case"keyUp":await this.#ct(a,t);break;case"pause":break;case"pointerDown":await this.#dt(a,r,t),this.#nt.cancelList.push({id:e,action:{...t,type:"pointerUp"}});break;case"pointerMove":await this.#ut(a,r,t);break;case"pointerUp":await this.#lt(a,r,t);break;case"scroll":await this.#ht(a,r,t)}}#dt(e,t,a){const{button:r}=a;if(e.pressed.has(r))return;e.pressed.add(r);const{x:n,y:s,subtype:o}=e,{width:i,height:c,pressure:d,twist:u,tangentialPressure:l}=a,{tiltX:h,tiltY:p}=nt(a),{modifiers:m}=t;switch(o){case"mouse":case"pen":return this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mousePressed",x:n,y:s,modifiers:m,button:rt(r),buttons:e.buttons,clickCount:e.setClickCount(r,new Ge.PointerSource.ClickContext(n,s,performance.now())),pointerType:o,tangentialPressure:l,tiltX:h,tiltY:p,twist:u,force:d});case"touch":return this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[{x:n,y:s,...st(i??1,c??1),tangentialPressure:l,tiltX:h,tiltY:p,twist:u,force:d,id:e.pointerId}],modifiers:m})}}#lt(e,t,a){const{button:r}=a;if(!e.pressed.has(r))return;e.pressed.delete(r);const{x:n,y:s,subtype:o}=e,{modifiers:i}=t;switch(o){case"mouse":case"pen":return this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseReleased",x:n,y:s,modifiers:i,button:rt(r),buttons:e.buttons,clickCount:e.getClickCount(r),pointerType:o});case"touch":return this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[{x:n,y:s,id:e.pointerId}],modifiers:i})}}async#ut(e,t,a){const{x:r,y:n,subtype:s}=e,{width:o,height:i,pressure:c,twist:d,tangentialPressure:u,x:l,y:h,origin:p="viewport",duration:m=this.#rt}=a,{tiltX:f,tiltY:g}=nt(a),{targetX:y,targetY:S}=await this.#pt(p,l,h,r,n);if(y<0||S<0)throw new He.MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${y}, y: ${S})`);let v;do{const a=m>0?(performance.now()-this.#at)/m:1;let l,h;if(v=a>=1,v?(l=y,h=S):(l=Math.round(a*(y-r)+r),h=Math.round(a*(S-n)+n)),e.x!==l||e.y!==h){const{modifiers:a}=t;switch(s){case"mouse":await this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseMoved",x:l,y:h,modifiers:a,clickCount:0,button:rt(e.pressed.values().next().value??5),buttons:e.buttons,pointerType:s,tangentialPressure:u,tiltX:f,tiltY:g,twist:d,force:c});break;case"pen":0!==e.pressed.size&&await this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseMoved",x:l,y:h,modifiers:a,clickCount:0,button:rt(e.pressed.values().next().value??5),buttons:e.buttons,pointerType:s,tangentialPressure:u,tiltX:f,tiltY:g,twist:d,force:c});break;case"touch":0!==e.pressed.size&&await this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchTouchEvent",{type:"touchMove",touchPoints:[{x:l,y:h,...st(o??1,i??1),tangentialPressure:u,tiltX:f,tiltY:g,twist:d,force:c,id:e.pointerId}],modifiers:a})}e.x=l,e.y=h}}while(!v)}async#pt(e,t,a,r,n){let s,o;switch(e){case"viewport":s=t,o=a;break;case"pointer":s=r+t,o=n+a;break;default:{const{x:r,y:n}=await async function(e,t){const a=await e.getOrCreateSandbox(void 0),r=await a.callFunction(Qe,{type:"undefined"},[t],!1,"none",{});if("exception"===r.type)throw new He.NoSuchElementException(`Origin element ${t.sharedId} was not found`);(0,Je.assert)("array"===r.result.type),(0,Je.assert)("number"===r.result.value?.[0]?.type),(0,Je.assert)("number"===r.result.value?.[1]?.type);const{result:{value:[{value:n},{value:s}]}}=r;return{x:n,y:s}}(this.#we,e.element);s=r+t,o=n+a;break}}return{targetX:s,targetY:o}}async#ht(e,t,a){const{deltaX:r,deltaY:n,x:s,y:o,origin:i="viewport",duration:c=this.#rt}=a;if("pointer"===i)throw new He.InvalidArgumentException('"pointer" origin is invalid for scrolling.');const{targetX:d,targetY:u}=await this.#pt(i,s,o,0,0);if(d<0||u<0)throw new He.MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${d}, y: ${u})`);let l,h=0,p=0;do{const e=c>0?(performance.now()-this.#at)/c:1;let a,s;if(l=e>=1,l?(a=r-h,s=n-p):(a=Math.round(e*r-h),s=Math.round(e*n-p)),0!==a||0!==s){const{modifiers:e}=t;await this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseWheel",deltaX:a,deltaY:s,x:d,y:u,modifiers:e}),h+=a,p+=s}}while(!l)}async#it(e,t){if([...t.value].length>1)throw new He.InvalidArgumentException(`Invalid key value: ${t.value}`);const a=t.value,r=(0,Xe.getNormalizedKey)(a),n=e.pressed.has(r),s=(0,Xe.getKeyCode)(a),o=(0,Xe.getKeyLocation)(a);switch(r){case"Alt":e.alt=!0;break;case"Shift":e.shift=!0;break;case"Control":e.ctrl=!0;break;case"Meta":e.meta=!0}e.pressed.add(r);const{modifiers:i}=e,c=tt(r,e),d=at(s??"",e)??c;let u;if(this.#st&&e.meta)switch(s){case"KeyA":u="SelectAll";break;case"KeyC":u="Copy";break;case"KeyV":u=e.shift?"PasteAndMatchStyle":"Paste";break;case"KeyX":u="Cut";break;case"KeyZ":u=e.shift?"Redo":"Undo"}const l=[this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchKeyEvent",{type:d?"keyDown":"rawKeyDown",windowsVirtualKeyCode:Ye.KeyToKeyCode[r],key:r,code:s,text:d,unmodifiedText:c,autoRepeat:n,isSystemKey:e.alt||void 0,location:o<3?o:void 0,isKeypad:3===o,modifiers:i,commands:u?[u]:void 0})];"Escape"===r&&(e.alt||(!this.#st||e.ctrl||e.meta)&&this.#st||l.push(this.#we.cdpTarget.cdpClient.sendCommand("Input.cancelDragging"))),await Promise.all(l)}#ct(e,t){if([...t.value].length>1)throw new He.InvalidArgumentException(`Invalid key value: ${t.value}`);const a=t.value,r=(0,Xe.getNormalizedKey)(a);if(!e.pressed.has(r))return;const n=(0,Xe.getKeyCode)(a),s=(0,Xe.getKeyLocation)(a);switch(r){case"Alt":e.alt=!1;break;case"Shift":e.shift=!1;break;case"Control":e.ctrl=!1;break;case"Meta":e.meta=!1}e.pressed.delete(r);const{modifiers:o}=e,i=tt(r,e),c=at(n??"",e)??i;return this.#we.cdpTarget.cdpClient.sendCommand("Input.dispatchKeyEvent",{type:"keyUp",windowsVirtualKeyCode:Ye.KeyToKeyCode[r],key:r,code:n,text:c,unmodifiedText:i,location:s<3?s:void 0,isSystemKey:e.alt||void 0,isKeypad:3===s,modifiers:o})}};const tt=(e,t)=>"Enter"===e?"\r":1===[...e].length?t.shift?e.toLocaleUpperCase("en-US"):e:void 0,at=(e,t)=>{if(t.ctrl){switch(e){case"Digit2":if(t.shift)return"\0";break;case"KeyA":return"\x01";case"KeyB":return"\x02";case"KeyC":return"\x03";case"KeyD":return"\x04";case"KeyE":return"\x05";case"KeyF":return"\x06";case"KeyG":return"\x07";case"KeyH":return"\b";case"KeyI":return"\t";case"KeyJ":return"\n";case"KeyK":return"\v";case"KeyL":return"\f";case"KeyM":return"\r";case"KeyN":return"\x0e";case"KeyO":return"\x0f";case"KeyP":return"\x10";case"KeyQ":return"\x11";case"KeyR":return"\x12";case"KeyS":return"\x13";case"KeyT":return"\x14";case"KeyU":return"\x15";case"KeyV":return"\x16";case"KeyW":return"\x17";case"KeyX":return"\x18";case"KeyY":return"\x19";case"KeyZ":return"\x1a";case"BracketLeft":return"\x1b";case"Backslash":return"\x1c";case"BracketRight":return"\x1d";case"Digit6":if(t.shift)return"\x1e";break;case"Minus":return"\x1f"}return""}if(t.alt)return""};function rt(e){switch(e){case 0:return"left";case 1:return"middle";case 2:return"right";case 3:return"back";case 4:return"forward";default:return"none"}}function nt(e){const t=e.altitudeAngle??0,a=e.azimuthAngle??0;let r=0,n=0;if(0===t&&(0!==a&&a!==2*Math.PI||(r=Math.PI/2),a===Math.PI/2&&(n=Math.PI/2),a===Math.PI&&(r=-Math.PI/2),a===3*Math.PI/2&&(n=-Math.PI/2),a>0&&a<Math.PI/2&&(r=Math.PI/2,n=Math.PI/2),a>Math.PI/2&&a<Math.PI&&(r=-Math.PI/2,n=Math.PI/2),a>Math.PI&&a<3*Math.PI/2&&(r=-Math.PI/2,n=-Math.PI/2),a>3*Math.PI/2&&a<2*Math.PI&&(r=Math.PI/2,n=-Math.PI/2)),0!==t){const e=Math.tan(t);r=Math.atan(Math.cos(a)/e),n=Math.atan(Math.sin(a)/e)}const s=180/Math.PI;return{tiltX:Math.round(r*s),tiltY:Math.round(n*s)}}function st(e,t){return{radiusX:e?e/2:.5,radiusY:t?t/2:.5}}var ot={},it={},ct={};Object.defineProperty(ct,"__esModule",{value:!0}),ct.Mutex=void 0;ct.Mutex=class{#mt=!1;#ft=[];acquire(){const e={resolved:!1};return this.#mt?new Promise((t=>{this.#ft.push((()=>t(this.#gt.bind(this,e))))})):(this.#mt=!0,Promise.resolve(this.#gt.bind(this,e)))}#gt(e){if(e.resolved)throw new Error("Cannot release more than once.");e.resolved=!0;const t=this.#ft.shift();t?t():this.#mt=!1}async run(e){const t=await this.acquire();try{return await e()}finally{t()}}},Object.defineProperty(it,"__esModule",{value:!0}),it.InputState=void 0;const dt=g,ut=ct,lt=$e;it.InputState=class{cancelList=[];#yt=new Map;#St=new ut.Mutex;getOrCreate(e,t,a){let r=this.#yt.get(e);if(!r){switch(t){case"none":r=new lt.NoneSource;break;case"key":r=new lt.KeySource;break;case"pointer":{let e="mouse"===a?0:2;const t=new Set;for(const[,e]of this.#yt)"pointer"===e.type&&t.add(e.pointerId);for(;t.has(e);)++e;r=new lt.PointerSource(e,a);break}case"wheel":r=new lt.WheelSource;break;default:throw new dt.InvalidArgumentException(`Expected "none", "key", "pointer", or "wheel". Found unknown source type ${t}.`)}return this.#yt.set(e,r),r}if(r.type!==t)throw new dt.InvalidArgumentException(`Input source type of ${e} is ${r.type}, but received ${t}.`);return r}get(e){const t=this.#yt.get(e);if(!t)throw new dt.UnknownErrorException("Internal error.");return t}getGlobalKeyState(){const e=new lt.KeySource;for(const[,t]of this.#yt)if("key"===t.type){for(const a of t.pressed)e.pressed.add(a);e.alt||=t.alt,e.ctrl||=t.ctrl,e.meta||=t.meta,e.shift||=t.shift}return e}get queue(){return this.#St}},Object.defineProperty(ot,"__esModule",{value:!0}),ot.InputStateManager=void 0;const ht=J,pt=it;class mt extends WeakMap{get(e){return(0,ht.assert)(e.isTopLevelContext()),this.has(e)||this.set(e,new pt.InputState),super.get(e)}}ot.InputStateManager=mt,Object.defineProperty(qe,"__esModule",{value:!0}),qe.InputProcessor=void 0;const ft=g,gt=J,yt=Ve,St=ot;qe.InputProcessor=class{#i;#S;#vt=new St.InputStateManager;constructor(e,t){this.#i=e,this.#S=t}async performActions(e){const t=this.#i.getContext(e.context),a=this.#vt.get(t.top),r=this.#wt(e,a),n=new yt.ActionDispatcher(a,t,await yt.ActionDispatcher.isMacOS(t).catch((()=>!1)));return await n.dispatchActions(r),{}}async releaseActions(e){const t=this.#i.getContext(e.context),a=t.top,r=this.#vt.get(a),n=new yt.ActionDispatcher(r,t,await yt.ActionDispatcher.isMacOS(t).catch((()=>!1)));return await n.dispatchTickActions(r.cancelList.reverse()),this.#vt.delete(a),{}}async setFiles(e){const t=this.#S.findRealm({browsingContextId:e.context});if(void 0===t)throw new ft.NoSuchFrameException(`Could not find browsingContext ${e.context}`);let a;try{const r=await t.callFunction(String((function(){return this instanceof HTMLInputElement&&"file"===this.type&&!this.disabled})),e.element,[],!1,"none",{},!1);(0,gt.assert)("success"===r.type),(0,gt.assert)("boolean"===r.result.type),a=r.result.value}catch{throw new ft.NoSuchElementException(`Could not find element ${e.element.sharedId}`)}if(!a)throw new ft.UnableToSetFileInputException(`Element ${e.element.sharedId} is not a mutable file input.`);const r=[];for(let a=0;a<e.files.length;++a){const a=await t.callFunction(String((function(e){return this.files?this.files.item(e):null})),e.element,[{type:"number",value:0}],!1,"root",{},!1);if((0,gt.assert)("success"===a.type),"object"!==a.result.type)break;const{handle:n}=a.result;(0,gt.assert)(void 0!==n);const{path:s}=await t.cdpClient.sendCommand("DOM.getFileInfo",{objectId:n});r.push(s),t.disown(n).catch(void 0)}r.sort();const n=[...e.files].sort();if(r.length!==e.files.length||n.some(((e,t)=>r[t]!==e))){const{objectId:a}=await t.deserializeToCdpArg(e.element);(0,gt.assert)(void 0!==a),await t.cdpClient.sendCommand("DOM.setFileInputFiles",{files:e.files,objectId:a})}else await t.callFunction(String((function(){this.dispatchEvent(new Event("cancel",{bubbles:!0}))})),e.element,[],!1,"none",{},!1);return{}}#wt(e,t){const a=[];for(const r of e.actions){switch(r.type){case"pointer":{r.parameters??={pointerType:"mouse"},r.parameters.pointerType??="mouse";const e=t.getOrCreate(r.id,"pointer",r.parameters.pointerType);if(e.subtype!==r.parameters.pointerType)throw new ft.InvalidArgumentException(`Expected input source ${r.id} to be ${e.subtype}; got ${r.parameters.pointerType}.`);break}default:t.getOrCreate(r.id,r.type)}const e=r.actions.map((e=>({id:r.id,action:e})));for(let t=0;t<e.length;t++)a.length===t&&a.push([]),a[t].push(e[t])}return a}};var vt={},wt={},Ct={},bt=Object.defineProperty,xt=Object.getOwnPropertyDescriptor,Pt=Object.getOwnPropertyNames,It=Object.prototype.hasOwnProperty,kt={};((e,t)=>{for(var a in t)bt(e,a,{get:t[a],enumerable:!0})})(kt,{URLPattern:()=>ha});var Rt,Et=(Rt=kt,((e,t,a,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of Pt(t))!It.call(e,n)&&n!==a&&bt(e,n,{get:()=>t[n],enumerable:!(r=xt(t,n))||r.enumerable});return e})(bt({},"__esModule",{value:!0}),Rt)),_t=class{type=3;name="";prefix="";value="";suffix="";modifier=3;constructor(e,t,a,r,n,s){this.type=e,this.name=t,this.prefix=a,this.value=r,this.suffix=n,this.modifier=s}hasCustomName(){return""!==this.name&&"number"!=typeof this.name}},Tt=/[$_\p{ID_Start}]/u,Nt=/[$_\u200C\u200D\p{ID_Continue}]/u,jt=".*";function Ot(e,t){return(t?/^[\x00-\xFF]*$/:/^[\x00-\x7F]*$/).test(e)}function Mt(e,t=!1){let a=[],r=0;for(;r<e.length;){let n=e[r],s=function(n){if(!t)throw new TypeError(n);a.push({type:"INVALID_CHAR",index:r,value:e[r++]})};if("*"!==n)if("+"!==n&&"?"!==n)if("\\"!==n)if("{"!==n)if("}"!==n)if(":"!==n)if("("!==n)a.push({type:"CHAR",index:r,value:e[r++]});else{let t=1,n="",o=r+1,i=!1;if("?"===e[o]){s(`Pattern cannot start with "?" at ${o}`);continue}for(;o<e.length;){if(!Ot(e[o],!1)){s(`Invalid character '${e[o]}' at ${o}.`),i=!0;break}if("\\"!==e[o]){if(")"===e[o]){if(t--,0===t){o++;break}}else if("("===e[o]&&(t++,"?"!==e[o+1])){s(`Capturing groups are not allowed at ${o}`),i=!0;break}n+=e[o++]}else n+=e[o++]+e[o++]}if(i)continue;if(t){s(`Unbalanced pattern at ${r}`);continue}if(!n){s(`Missing pattern at ${r}`);continue}a.push({type:"REGEX",index:r,value:n}),r=o}else{let t="",n=r+1;for(;n<e.length;){let a=e.substr(n,1);if(!(n===r+1&&Tt.test(a)||n!==r+1&&Nt.test(a)))break;t+=e[n++]}if(!t){s(`Missing parameter name at ${r}`);continue}a.push({type:"NAME",index:r,value:t}),r=n}else a.push({type:"CLOSE",index:r,value:e[r++]});else a.push({type:"OPEN",index:r,value:e[r++]});else a.push({type:"ESCAPED_CHAR",index:r++,value:e[r++]});else a.push({type:"OTHER_MODIFIER",index:r,value:e[r++]});else a.push({type:"ASTERISK",index:r,value:e[r++]})}return a.push({type:"END",index:r,value:""}),a}function At(e,t={}){let a=Mt(e);t.delimiter??="/#?",t.prefixes??="./";let r=`[^${Dt(t.delimiter)}]+?`,n=[],s=0,o=0,i=new Set,c=e=>{if(o<a.length&&a[o].type===e)return a[o++].value},d=()=>c("OTHER_MODIFIER")??c("ASTERISK"),u=e=>{let t=c(e);if(void 0!==t)return t;let{type:r,index:n}=a[o];throw new TypeError(`Unexpected ${r} at ${n}, expected ${e}`)},l=()=>{let e,t="";for(;e=c("CHAR")??c("ESCAPED_CHAR");)t+=e;return t},h=t.encodePart||(e=>e),p="",m=e=>{p+=e},f=()=>{p.length&&(n.push(new _t(3,"","",h(p),"",3)),p="")},g=(e,t,a,o,c)=>{let d,u=3;switch(c){case"?":u=1;break;case"*":u=0;break;case"+":u=2}if(!t&&!a&&3===u)return void m(e);if(f(),!t&&!a){if(!e)return;return void n.push(new _t(3,"","",h(e),"",u))}d=a?"*"===a?jt:a:r;let l,p=2;if(d===r?(p=1,d=""):d===jt&&(p=0,d=""),t?l=t:a&&(l=s++),i.has(l))throw new TypeError(`Duplicate name '${l}'.`);i.add(l),n.push(new _t(p,l,h(e),d,h(o),u))};for(;o<a.length;){let e=c("CHAR"),a=c("NAME"),r=c("REGEX");if(!a&&!r&&(r=c("ASTERISK")),a||r){let n=e??"";-1===t.prefixes.indexOf(n)&&(m(n),n=""),f(),g(n,a,r,"",d());continue}let n=e??c("ESCAPED_CHAR");if(n)m(n);else if(c("OPEN")){let e=l(),t=c("NAME"),a=c("REGEX");!t&&!a&&(a=c("ASTERISK"));let r=l();u("CLOSE"),g(e,t,a,r,d())}else f(),u("END")}return n}function Dt(e){return e.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}function Bt(e){return e&&e.ignoreCase?"ui":"u"}function zt(e){switch(e){case 0:return"*";case 1:return"?";case 2:return"+";case 3:return""}}function Lt(e,t,a={}){a.delimiter??="/#?",a.prefixes??="./",a.sensitive??=!1,a.strict??=!1,a.end??=!0,a.start??=!0,a.endsWith="";let r=a.start?"^":"";for(let n of e){if(3===n.type){3===n.modifier?r+=Dt(n.value):r+=`(?:${Dt(n.value)})${zt(n.modifier)}`;continue}t&&t.push(n.name);let e=`[^${Dt(a.delimiter)}]+?`,s=n.value;(1===n.type?s=e:0===n.type&&(s=jt),n.prefix.length||n.suffix.length)?3!==n.modifier&&1!==n.modifier?(r+=`(?:${Dt(n.prefix)}`,r+=`((?:${s})(?:`,r+=Dt(n.suffix),r+=Dt(n.prefix),r+=`(?:${s}))*)${Dt(n.suffix)})`,0===n.modifier&&(r+="?")):(r+=`(?:${Dt(n.prefix)}(${s})${Dt(n.suffix)})`,r+=zt(n.modifier)):3===n.modifier||1===n.modifier?r+=`(${s})${zt(n.modifier)}`:r+=`((?:${s})${zt(n.modifier)})`}let n=`[${Dt(a.endsWith)}]|$`,s=`[${Dt(a.delimiter)}]`;if(a.end)return a.strict||(r+=`${s}?`),a.endsWith.length?r+=`(?=${n})`:r+="$",new RegExp(r,Bt(a));a.strict||(r+=`(?:${s}(?=${n}))?`);let o=!1;if(e.length){let t=e[e.length-1];3===t.type&&3===t.modifier&&(o=a.delimiter.indexOf(t)>-1)}return o||(r+=`(?=${s}|${n})`),new RegExp(r,Bt(a))}var Zt={delimiter:"",prefixes:"",sensitive:!0,strict:!0},Ut={delimiter:".",prefixes:"",sensitive:!0,strict:!0},Ft={delimiter:"/",prefixes:"/",sensitive:!0,strict:!0};function qt(e,t){return e.startsWith(t)?e.substring(t.length,e.length):e}function Vt(e){return!(!e||e.length<2)&&("["===e[0]||("\\"===e[0]||"{"===e[0])&&"["===e[1])}var $t=["ftp","file","http","https","ws","wss"];function Kt(e){if(!e)return!0;for(let t of $t)if(e.test(t))return!0;return!1}function Wt(e){switch(e){case"ws":case"http":return"80";case"wws":case"https":return"443";case"ftp":return"21";default:return""}}function Ht(e){if(""===e)return e;if(/^[-+.A-Za-z0-9]*$/.test(e))return e.toLowerCase();throw new TypeError(`Invalid protocol '${e}'.`)}function Jt(e){if(""===e)return e;let t=new URL("https://example.com");return t.username=e,t.username}function Gt(e){if(""===e)return e;let t=new URL("https://example.com");return t.password=e,t.password}function Xt(e){if(""===e)return e;if(/[\t\n\r #%/:<>?@[\]^\\|]/g.test(e))throw new TypeError(`Invalid hostname '${e}'`);let t=new URL("https://example.com");return t.hostname=e,t.hostname}function Yt(e){if(""===e)return e;if(/[^0-9a-fA-F[\]:]/g.test(e))throw new TypeError(`Invalid IPv6 hostname '${e}'`);return e.toLowerCase()}function Qt(e){if(""===e||/^[0-9]*$/.test(e)&&parseInt(e)<=65535)return e;throw new TypeError(`Invalid port '${e}'.`)}function ea(e){if(""===e)return e;let t=new URL("https://example.com");return t.pathname="/"!==e[0]?"/-"+e:e,"/"!==e[0]?t.pathname.substring(2,t.pathname.length):t.pathname}function ta(e){return""===e?e:new URL(`data:${e}`).pathname}function aa(e){if(""===e)return e;let t=new URL("https://example.com");return t.search=e,t.search.substring(1,t.search.length)}function ra(e){if(""===e)return e;let t=new URL("https://example.com");return t.hash=e,t.hash.substring(1,t.hash.length)}var na=class{#Ct;#bt=[];#xt={};#Pt=0;#It=1;#kt=0;#Rt=0;#Et=0;#_t=0;#Tt=!1;constructor(e){this.#Ct=e}get result(){return this.#xt}parse(){for(this.#bt=Mt(this.#Ct,!0);this.#Pt<this.#bt.length;this.#Pt+=this.#It){if(this.#It=1,"END"===this.#bt[this.#Pt].type){if(0===this.#Rt){this.#Nt(),this.#jt()?this.#Ot(9,1):this.#Mt()?(this.#Ot(8,1),this.#xt.hash=""):(this.#Ot(7,0),this.#xt.search="",this.#xt.hash="");continue}if(2===this.#Rt){this.#At(5);continue}this.#Ot(10,0);break}if(this.#Et>0){if(!this.#Dt())continue;this.#Et-=1}if(this.#Bt())this.#Et+=1;else switch(this.#Rt){case 0:this.#zt()&&(this.#xt.username="",this.#xt.password="",this.#xt.hostname="",this.#xt.port="",this.#xt.pathname="",this.#xt.search="",this.#xt.hash="",this.#At(1));break;case 1:if(this.#zt()){this.#Lt();let e=7,t=1;this.#Tt&&(this.#xt.pathname="/"),this.#Zt()?(e=2,t=3):this.#Tt&&(e=2),this.#Ot(e,t)}break;case 2:this.#Ye()?this.#At(3):(this.#Ut()||this.#Mt()||this.#jt())&&this.#At(5);break;case 3:this.#Ft()?this.#Ot(4,1):this.#Ye()&&this.#Ot(5,1);break;case 4:this.#Ye()&&this.#Ot(5,1);break;case 5:this.#qt()?this.#_t+=1:this.#Vt()&&(this.#_t-=1),this.#Qe()&&!this.#_t?this.#Ot(6,1):this.#Ut()?this.#Ot(7,0):this.#Mt()?this.#Ot(8,1):this.#jt()&&this.#Ot(9,1);break;case 6:this.#Ut()?this.#Ot(7,0):this.#Mt()?this.#Ot(8,1):this.#jt()&&this.#Ot(9,1);break;case 7:this.#Mt()?this.#Ot(8,1):this.#jt()&&this.#Ot(9,1);break;case 8:this.#jt()&&this.#Ot(9,1)}}}#Ot(e,t){switch(this.#Rt){case 0:case 2:break;case 1:this.#xt.protocol=this.#$t();break;case 3:this.#xt.username=this.#$t();break;case 4:this.#xt.password=this.#$t();break;case 5:this.#xt.hostname=this.#$t();break;case 6:this.#xt.port=this.#$t();break;case 7:this.#xt.pathname=this.#$t();break;case 8:this.#xt.search=this.#$t();break;case 9:this.#xt.hash=this.#$t()}this.#Kt(e,t)}#Kt(e,t){this.#Rt=e,this.#kt=this.#Pt+t,this.#Pt+=t,this.#It=0}#Nt(){this.#Pt=this.#kt,this.#It=0}#At(e){this.#Nt(),this.#Rt=e}#Wt(e){return e<0&&(e=this.#bt.length-e),e<this.#bt.length?this.#bt[e]:this.#bt[this.#bt.length-1]}#Ht(e,t){let a=this.#Wt(e);return a.value===t&&("CHAR"===a.type||"ESCAPED_CHAR"===a.type||"INVALID_CHAR"===a.type)}#zt(){return this.#Ht(this.#Pt,":")}#Zt(){return this.#Ht(this.#Pt+1,"/")&&this.#Ht(this.#Pt+2,"/")}#Ye(){return this.#Ht(this.#Pt,"@")}#Ft(){return this.#Ht(this.#Pt,":")}#Qe(){return this.#Ht(this.#Pt,":")}#Ut(){return this.#Ht(this.#Pt,"/")}#Mt(){if(this.#Ht(this.#Pt,"?"))return!0;if("?"!==this.#bt[this.#Pt].value)return!1;let e=this.#Wt(this.#Pt-1);return"NAME"!==e.type&&"REGEX"!==e.type&&"CLOSE"!==e.type&&"ASTERISK"!==e.type}#jt(){return this.#Ht(this.#Pt,"#")}#Bt(){return"OPEN"==this.#bt[this.#Pt].type}#Dt(){return"CLOSE"==this.#bt[this.#Pt].type}#qt(){return this.#Ht(this.#Pt,"[")}#Vt(){return this.#Ht(this.#Pt,"]")}#$t(){let e=this.#bt[this.#Pt],t=this.#Wt(this.#kt).index;return this.#Ct.substring(t,e.index)}#Lt(){let e={};Object.assign(e,Zt),e.encodePart=Ht;let t=function(e,t,a){return Lt(At(e,a),t,a)}(this.#$t(),void 0,e);this.#Tt=Kt(t)}},sa=["protocol","username","password","hostname","port","pathname","search","hash"],oa="*";function ia(e,t){if("string"!=typeof e)throw new TypeError("parameter 1 is not of type 'string'.");let a=new URL(e,t);return{protocol:a.protocol.substring(0,a.protocol.length-1),username:a.username,password:a.password,hostname:a.hostname,port:a.port,pathname:a.pathname,search:""!==a.search?a.search.substring(1,a.search.length):void 0,hash:""!==a.hash?a.hash.substring(1,a.hash.length):void 0}}function ca(e,t){return t?ua(e):e}function da(e,t,a){let r;if("string"==typeof t.baseURL)try{r=new URL(t.baseURL),e.protocol=ca(r.protocol.substring(0,r.protocol.length-1),a),e.username=ca(r.username,a),e.password=ca(r.password,a),e.hostname=ca(r.hostname,a),e.port=ca(r.port,a),e.pathname=ca(r.pathname,a),e.search=ca(r.search.substring(1,r.search.length),a),e.hash=ca(r.hash.substring(1,r.hash.length),a)}catch{throw new TypeError(`invalid baseURL '${t.baseURL}'.`)}if("string"==typeof t.protocol&&(e.protocol=function(e,t){return e=function(e,t){return e.endsWith(t)?e.substr(0,e.length-t.length):e}(e,":"),t||""===e?e:Ht(e)}(t.protocol,a)),"string"==typeof t.username&&(e.username=function(e,t){if(t||""===e)return e;let a=new URL("https://example.com");return a.username=e,a.username}(t.username,a)),"string"==typeof t.password&&(e.password=function(e,t){if(t||""===e)return e;let a=new URL("https://example.com");return a.password=e,a.password}(t.password,a)),"string"==typeof t.hostname&&(e.hostname=function(e,t){return t||""===e?e:Vt(e)?Yt(e):Xt(e)}(t.hostname,a)),"string"==typeof t.port&&(e.port=function(e,t,a){return Wt(t)===e&&(e=""),a||""===e?e:Qt(e)}(t.port,e.protocol,a)),"string"==typeof t.pathname){if(e.pathname=t.pathname,r&&!function(e,t){return!(!e.length||"/"!==e[0]&&(!t||e.length<2||"\\"!=e[0]&&"{"!=e[0]||"/"!=e[1]))}(e.pathname,a)){let t=r.pathname.lastIndexOf("/");t>=0&&(e.pathname=ca(r.pathname.substring(0,t+1),a)+e.pathname)}e.pathname=function(e,t,a){if(a||""===e)return e;if(t&&!$t.includes(t))return new URL(`${t}:${e}`).pathname;let r="/"==e[0];return e=new URL(r?e:"/-"+e,"https://example.com").pathname,r||(e=e.substring(2,e.length)),e}(e.pathname,e.protocol,a)}return"string"==typeof t.search&&(e.search=function(e,t){if(e=qt(e,"?"),t||""===e)return e;let a=new URL("https://example.com");return a.search=e,a.search?a.search.substring(1,a.search.length):""}(t.search,a)),"string"==typeof t.hash&&(e.hash=function(e,t){if(e=qt(e,"#"),t||""===e)return e;let a=new URL("https://example.com");return a.hash=e,a.hash?a.hash.substring(1,a.hash.length):""}(t.hash,a)),e}function ua(e){return e.replace(/([+*?:{}()\\])/g,"\\$1")}function la(e,t){t.delimiter??="/#?",t.prefixes??="./",t.sensitive??=!1,t.strict??=!1,t.end??=!0,t.start??=!0,t.endsWith="";let a=`[^${function(e){return e.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}(t.delimiter)}]+?`,r=/[$_\u200C\u200D\p{ID_Continue}]/u,n="";for(let s=0;s<e.length;++s){let o=e[s];if(3===o.type){if(3===o.modifier){n+=ua(o.value);continue}n+=`{${ua(o.value)}}${zt(o.modifier)}`;continue}let i=o.hasCustomName(),c=!!o.suffix.length||!!o.prefix.length&&(1!==o.prefix.length||!t.prefixes.includes(o.prefix)),d=s>0?e[s-1]:null,u=s<e.length-1?e[s+1]:null;if(!c&&i&&1===o.type&&3===o.modifier&&u&&!u.prefix.length&&!u.suffix.length)if(3===u.type){let e=u.value.length>0?u.value[0]:"";c=r.test(e)}else c=!u.hasCustomName();if(!c&&!o.prefix.length&&d&&3===d.type){let e=d.value[d.value.length-1];c=t.prefixes.includes(e)}c&&(n+="{"),n+=ua(o.prefix),i&&(n+=`:${o.name}`),2===o.type?n+=`(${o.value})`:1===o.type?i||(n+=`(${a})`):0===o.type&&(i||d&&3!==d.type&&3===d.modifier&&!c&&""===o.prefix?n+="(.*)":n+="*"),1===o.type&&i&&o.suffix.length&&r.test(o.suffix[0])&&(n+="\\"),n+=ua(o.suffix),c&&(n+="}"),3!==o.modifier&&(n+=zt(o.modifier))}return n}var ha=class{#Ct;#bt={};#xt={};#Pt={};#It={};constructor(e={},t,a){try{let r;if("string"==typeof t?r=t:a=t,"string"==typeof e){let t=new na(e);if(t.parse(),e=t.result,void 0===r&&"string"!=typeof e.protocol)throw new TypeError("A base URL must be provided for a relative constructor string.");e.baseURL=r}else{if(!e||"object"!=typeof e)throw new TypeError("parameter 1 is not of type 'string' and cannot convert to dictionary.");if(r)throw new TypeError("parameter 1 is not of type 'string'.")}typeof a>"u"&&(a={ignoreCase:!1});let n,s={ignoreCase:!0===a.ignoreCase},o={pathname:oa,protocol:oa,username:oa,password:oa,hostname:oa,port:oa,search:oa,hash:oa};for(n of(this.#Ct=da(o,e,!0),Wt(this.#Ct.protocol)===this.#Ct.port&&(this.#Ct.port=""),sa)){if(!(n in this.#Ct))continue;let e={},t=this.#Ct[n];switch(this.#xt[n]=[],n){case"protocol":Object.assign(e,Zt),e.encodePart=Ht;break;case"username":Object.assign(e,Zt),e.encodePart=Jt;break;case"password":Object.assign(e,Zt),e.encodePart=Gt;break;case"hostname":Object.assign(e,Ut),Vt(t)?e.encodePart=Yt:e.encodePart=Xt;break;case"port":Object.assign(e,Zt),e.encodePart=Qt;break;case"pathname":Kt(this.#bt.protocol)?(Object.assign(e,Ft,s),e.encodePart=ea):(Object.assign(e,Zt,s),e.encodePart=ta);break;case"search":Object.assign(e,Zt,s),e.encodePart=aa;break;case"hash":Object.assign(e,Zt,s),e.encodePart=ra}try{this.#It[n]=At(t,e),this.#bt[n]=Lt(this.#It[n],this.#xt[n],e),this.#Pt[n]=la(this.#It[n],e)}catch{throw new TypeError(`invalid ${n} pattern '${this.#Ct[n]}'.`)}}}catch(e){throw new TypeError(`Failed to construct 'URLPattern': ${e.message}`)}}test(e={},t){let a,r={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if("string"!=typeof e&&t)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof e>"u")return!1;try{r=da(r,"object"==typeof e?e:ia(e,t),!1)}catch{return!1}for(a of sa)if(!this.#bt[a].exec(r[a]))return!1;return!0}exec(e={},t){let a={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if("string"!=typeof e&&t)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof e>"u")return;try{a=da(a,"object"==typeof e?e:ia(e,t),!1)}catch{return null}let r,n={};for(r of(n.inputs=t?[e,t]:[e],sa)){let e=this.#bt[r].exec(a[r]);if(!e)return null;let t={};for(let[a,n]of this.#xt[r].entries())if("string"==typeof n||"number"==typeof n){let r=e[a+1];t[n]=r}n[r]={input:a[r]??"",groups:t}}return n}static compareComponent(e,t,a){let r=(e,t)=>{for(let a of["type","modifier","prefix","value","suffix"]){if(e[a]<t[a])return-1;if(e[a]!==t[a])return 1}return 0},n=new _t(3,"","","","",3),s=new _t(0,"","","","",3),o=(e,t)=>{let a=0;for(;a<Math.min(e.length,t.length);++a){let n=r(e[a],t[a]);if(n)return n}return e.length===t.length?0:r(e[a]??n,t[a]??n)};return t.#Pt[e]||a.#Pt[e]?t.#Pt[e]&&!a.#Pt[e]?o(t.#It[e],[s]):!t.#Pt[e]&&a.#Pt[e]?o([s],a.#It[e]):o(t.#It[e],a.#It[e]):0}get protocol(){return this.#Pt.protocol}get username(){return this.#Pt.username}get password(){return this.#Pt.password}get hostname(){return this.#Pt.hostname}get port(){return this.#Pt.port}get pathname(){return this.#Pt.pathname}get search(){return this.#Pt.search}get hash(){return this.#Pt.hash}};const{URLPattern:pa}=Et;var ma={URLPattern:pa};globalThis.URLPattern||(globalThis.URLPattern=pa),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.URLPattern=void 0;const t=ma;Object.defineProperty(e,"URLPattern",{enumerable:!0,get:function(){return t.URLPattern}}),"URLPattern"in globalThis&&(t.URLPattern=globalThis.URLPattern)}(Ct),Object.defineProperty(wt,"__esModule",{value:!0}),wt.NetworkStorage=void 0;const fa=g,ga=Ct,ya=O;class Sa{#Jt=new Map;#Gt=new Map;#Xt=new Map;disposeRequestMap(){for(const e of this.#Jt.values())e.dispose();this.#Jt.clear()}addIntercept(e){for(const[t,{urlPatterns:a,phases:r}]of this.#Gt.entries())if(JSON.stringify(e.urlPatterns)===JSON.stringify(a)&&JSON.stringify(e.phases)===JSON.stringify(r))return t;const t=(0,ya.uuidv4)();return this.#Gt.set(t,e),t}removeIntercept(e){if(!this.#Gt.has(e))throw new fa.NoSuchInterceptException(`Intercept '${e}' does not exist.`);this.#Gt.delete(e)}hasIntercepts(){return this.#Gt.size>0}getFetchEnableParams(){const e=[];for(const t of this.#Gt.values())for(const a of t.phases){const r=Sa.requestStageFromPhase(a);if(0!==t.urlPatterns.length)for(const a of t.urlPatterns){const t=Sa.cdpFromSpecUrlPattern(a);e.push({urlPattern:t,requestStage:r})}else e.push({urlPattern:"*",requestStage:r})}return{patterns:e,handleAuthRequests:[...this.#Gt.values()].some((e=>e.phases.includes("authRequired")))}}getRequest(e){return this.#Jt.get(e)}addRequest(e){this.#Jt.set(e.requestId,e)}deleteRequest(e){const t=this.#Jt.get(e);t&&(t.dispose(),this.#Jt.delete(e))}hasNetworkRequests(){return this.#Jt.size>0}hasBlockedRequests(){return this.#Xt.size>0}static cdpFromSpecUrlPattern(e){switch(e.type){case"string":return e.pattern;case"pattern":return Sa.buildUrlPatternString(e)}}static buildUrlPatternString({protocol:e,hostname:t,port:a,pathname:r,search:n}){if(!(e||t||a||r||n))return"*";let s="";return e&&(s+=e,e.endsWith(":")||(s+=":"),Sa.isSpecialScheme(e)&&(s+="//")),t&&(s+=t),a&&(s+=`:${a}`),r&&(r.startsWith("/")||(s+="/"),s+=r),n&&(n.startsWith("?")||(s+="?"),s+=n),s}static requestStageFromPhase(e){switch(e){case"beforeRequestSent":return"Request";case"responseStarted":case"authRequired":return"Response"}}static isSpecialScheme(e){return["ftp","file","http","https","ws","wss"].includes(e.replace(/:$/,""))}addBlockedRequest(e,t){this.#Xt.set(e,t)}removeBlockedRequest(e){this.#Xt.delete(e)}getBlockedRequest(e){return this.#Xt.get(e)}getNetworkIntercepts(e,t){const a=this.#Jt.get(e);if(!a)return[];const r=[];for(const[e,{phases:n,urlPatterns:s}]of this.#Gt.entries())t&&n.includes(t)&&(0===s.length||s.some((e=>Sa.matchUrlPattern(e,a.url))))&&r.push(e);return r}static matchUrlPattern(e,t){switch(e.type){case"string":return e.pattern===t;case"pattern":return null!==new ga.URLPattern({protocol:e.protocol,hostname:e.hostname,port:e.port,pathname:e.pathname,search:e.search}).exec(t)}}}wt.NetworkStorage=Sa,Object.defineProperty(vt,"__esModule",{value:!0}),vt.NetworkProcessor=void 0;const va=g,wa=J,Ca=wt,ba=ke;class xa{#i;#de;constructor(e,t){this.#i=e,this.#de=t}async addIntercept(e){if(0===e.phases.length)throw new va.InvalidArgumentException("At least one phase must be specified.");e.phases.includes("authRequired")&&!e.phases.includes("beforeRequestSent")&&e.phases.unshift("beforeRequestSent");const t=e.urlPatterns??[],a=xa.parseUrlPatterns(t),r=this.#de.addIntercept({urlPatterns:a,phases:e.phases});return await this.#Yt(),{intercept:r}}async continueRequest(e){const t=e.request,{request:a,phase:r}=this.#Qt(t);if("beforeRequestSent"!==r)throw new va.InvalidArgumentException(`Blocked request for network id '${t}' is not in 'BeforeRequestSent' phase`);void 0!==e.url&&xa.parseUrlString(e.url);const{url:n,method:s,headers:o}=e,i=(0,ba.cdpFetchHeadersFromBidiNetworkHeaders)(o),c=this.#ea(t);return await c.continueRequest(a,n,s,i),this.#de.removeBlockedRequest(t),{}}async continueResponse(e){const t=e.request,{request:a,phase:r}=this.#Qt(t);if("beforeRequestSent"===r)throw new va.InvalidArgumentException(`Blocked request for network id '${t}' is in 'BeforeRequestSent' phase`);const{statusCode:n,reasonPhrase:s,headers:o}=e,i=(0,ba.cdpFetchHeadersFromBidiNetworkHeaders)(o),c=this.#ea(t);return await c.continueResponse(a,n,s,i),this.#de.removeBlockedRequest(t),{}}async continueWithAuth(e){const t=e.request,{request:a,phase:r}=this.#Qt(t);if("authRequired"!==r)throw new va.InvalidArgumentException(`Blocked request for network id '${t}' is not in 'AuthRequired' phase`);const n=this.#ea(t);let s,o;if("provideCredentials"===e.action){const{credentials:t}=e;s=t.username,o=t.password,(0,wa.assert)("password"===t.type,`Credentials type ${t.type} must be 'password'`)}const i=(0,ba.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction)(e.action);return await n.continueWithAuth(a,i,s,o),{}}async failRequest({request:e}){const{request:t,phase:a}=this.#Qt(e);if("authRequired"===a)throw new va.InvalidArgumentException(`Blocked request for network id '${e}' is in 'AuthRequired' phase`);const r=this.#ea(e);return await r.failRequest(t,"Failed"),this.#de.removeBlockedRequest(e),{}}async provideResponse(e){const{statusCode:t,reasonPhrase:a,headers:r,body:n,request:s}=e,{request:o}=this.#Qt(s),i=(0,ba.cdpFetchHeadersFromBidiNetworkHeaders)(r),c=this.#ea(s);return await c.provideResponse(o,t??c.statusCode,a,i,n?.value),this.#de.removeBlockedRequest(s),{}}async removeIntercept(e){return this.#de.removeIntercept(e.intercept),await this.#Yt(),{}}async#ta(){await Promise.all(this.#i.getAllContexts().map((async e=>{await e.cdpTarget.fetchEnable()})))}async#aa(){await Promise.all(this.#i.getAllContexts().map((async e=>{await e.cdpTarget.fetchDisable()})))}async#Yt(){this.#de.hasIntercepts()||this.#de.hasBlockedRequests()||this.#de.hasNetworkRequests()?await this.#ta():await this.#aa()}#Qt(e){const t=this.#de.getBlockedRequest(e);if(!t)throw new va.NoSuchRequestException(`No blocked request found for network id '${e}'`);return t}#ea(e){const t=this.#de.getRequest(e);if(!t)throw new va.NoSuchRequestException(`Network request with ID ${e} doesn't exist`);return t}static parseUrlString(e){try{return new URL(e)}catch(t){throw new va.InvalidArgumentException(`Invalid URL '${e}': ${t}`)}}static parseUrlPatterns(e){return e.map((e=>{switch(e.type){case"string":return xa.parseUrlString(e.pattern),e;case"pattern":if(void 0===e.protocol&&void 0===e.hostname&&void 0===e.port&&void 0===e.pathname&&void 0===e.search)return e;if(""===e.protocol)throw new va.InvalidArgumentException("URL pattern must specify a protocol");if(""===e.hostname)throw new va.InvalidArgumentException("URL pattern must specify a hostname");if((e.hostname?.length??0)>0){if(e.protocol?.match(/^file/i))throw new va.InvalidArgumentException("URL pattern protocol cannot be 'file'");if(e.hostname?.includes(":"))throw new va.InvalidArgumentException("URL pattern hostname must not contain a colon")}if(""===e.port)throw new va.InvalidArgumentException("URL pattern must specify a port");try{new URL(Ca.NetworkStorage.buildUrlPatternString(e))}catch(e){throw new va.InvalidArgumentException(`${e}`)}return e}}))}}vt.NetworkProcessor=xa;var Pa={};Object.defineProperty(Pa,"__esModule",{value:!0}),Pa.PermissionsProcessor=void 0;const Ia=g;Pa.PermissionsProcessor=class{#o;constructor(e){this.#o=e}async setPermissions(e){try{await this.#o.sendCommand("Browser.setPermission",{origin:e.origin,permission:{name:e.descriptor.name},setting:e.state})}catch(e){if("Permission can't be granted to opaque origins."===e.message)return{};throw new Ia.InvalidArgumentException(e.message)}return{}}};var ka={};Object.defineProperty(ka,"__esModule",{value:!0}),ka.PreloadScriptStorage=void 0;ka.PreloadScriptStorage=class{#ra=new Set;find(e){return e?[...this.#ra].filter((t=>(void 0===e.id||e.id===t.id)&&(!(void 0!==e.targetId&&!t.targetIds.has(e.targetId))&&(void 0===e.global||!(e.global&&void 0!==t.contexts||!e.global&&void 0===t.contexts))))):[...this.#ra]}add(e){this.#ra.add(e)}remove(e){for(const t of this.find(e))this.#ra.delete(t)}};var Ra={},Ea={};Object.defineProperty(Ea,"__esModule",{value:!0}),Ea.PreloadScript=void 0;const _a=O,Ta=M;Ea.PreloadScript=class{#u=(0,_a.uuidv4)();#na=[];#sa;#oa=new Set;#ia;#ca;#da;get id(){return this.#u}get targetIds(){return this.#oa}constructor(e,t){this.#ia=e.arguments?.map((e=>new Ta.ChannelProxy(e.value,t)))??[],this.#sa=e.functionDeclaration,this.#ca=e.sandbox,this.#da=e.contexts}get channels(){return this.#ia}get contexts(){return this.#da}#ua(){const e=`[${this.channels.map((e=>e.getEvalInWindowStr())).join(", ")}]`;return`(()=>{(${this.#sa})(...${e})})()`}async initInTargets(e,t){await Promise.all(Array.from(e).map((e=>this.initInTarget(e,t))))}async initInTarget(e,t){const a=await e.cdpClient.sendCommand("Page.addScriptToEvaluateOnNewDocument",{source:this.#ua(),worldName:this.#ca,runImmediately:t});this.#na.push({target:e,preloadScriptId:a.identifier}),this.#oa.add(e.targetId)}async remove(){for(const e of this.#na){const t=e.target,a=e.preloadScriptId;await t.cdpClient.sendCommand("Page.removeScriptToEvaluateOnNewDocument",{identifier:a})}}dispose(e){this.#na=this.#na.filter((t=>t.target?.targetId!==e)),this.#oa.delete(e)}},Object.defineProperty(Ra,"__esModule",{value:!0}),Ra.ScriptProcessor=void 0;const Na=g,ja=Ea;Ra.ScriptProcessor=class{#i;#S;#Me;#t;constructor(e,t,a,r){this.#i=e,this.#S=t,this.#Me=a,this.#t=r}async addPreloadScript(e){const t=new Set;if(e.contexts){if(0===e.contexts.length)throw new Na.InvalidArgumentException("Contexts list is empty.");for(const a of e.contexts){const e=this.#i.getContext(a);if(!e.isTopLevelContext())throw new Na.InvalidArgumentException(`Non top-level context '${a}' given.`);t.add(e)}}const a=new ja.PreloadScript(e,this.#t);this.#Me.add(a);const r=0===t.size?new Set(this.#i.getTopLevelContexts().map((e=>e.cdpTarget))):new Set([...t.values()].map((e=>e.cdpTarget)));return await a.initInTargets(r,!1),{script:a.id}}async removePreloadScript(e){const t=e.script,a=this.#Me.find({id:t});if(0===a.length)throw new Na.NoSuchScriptException(`No preload script with BiDi ID '${t}'`);return await Promise.all(a.map((e=>e.remove()))),this.#Me.remove({id:t}),{}}async callFunction(e){const t=await this.#la(e.target);return await t.callFunction(e.functionDeclaration,e.this??{type:"undefined"},e.arguments??[],e.awaitPromise,e.resultOwnership??"none",e.serializationOptions??{},e.userActivation??!1)}async evaluate(e){const t=await this.#la(e.target);return await t.evaluate(e.expression,e.awaitPromise,e.resultOwnership??"none",e.serializationOptions??{},e.userActivation??!1)}async disown(e){const t=await this.#la(e.target);return await Promise.all(e.handles.map((async e=>await t.disown(e)))),{}}getRealms(e){void 0!==e.context&&this.#i.getContext(e.context);return{realms:this.#S.findRealms({browsingContextId:e.context,type:e.type}).map((e=>e.realmInfo))}}async#la(e){if("realm"in e)return this.#S.getRealm({realmId:e.realm});const t=this.#i.getContext(e.context);return await t.getOrCreateSandbox(e.sandbox)}};var Oa={};Object.defineProperty(Oa,"__esModule",{value:!0}),Oa.SessionProcessor=void 0;Oa.SessionProcessor=class{#k;constructor(e){this.#k=e}status(){return{ready:!1,message:"already connected"}}subscribe(e,t=null){return this.#k.subscribe(e.events,e.contexts??[null],t),{}}unsubscribe(e,t=null){return this.#k.unsubscribe(e.events,e.contexts??[null],t),{}}};var Ma={};Object.defineProperty(Ma,"__esModule",{value:!0}),Ma.StorageProcessor=void 0;const Aa=g,Da=J,Ba=l,za=vt;class La{#o;#i;#t;constructor(e,t,a){this.#i=t,this.#o=e,this.#t=a}async getCookies(e){const t=this.#ha(e.partition);return{cookies:(await this.#o.sendCommand("Storage.getCookies",{})).cookies.filter((e=>void 0===e.partitionKey||e.partitionKey===t.sourceOrigin)).map((e=>this.#pa(e))).filter((t=>this.#ma(t,e.filter))),partitionKey:t}}async setCookie(e){const t=this.#ha(e.partition),a=this.#fa(e,t);try{await this.#o.sendCommand("Storage.setCookies",{cookies:[a]})}catch(e){throw this.#t?.(Ba.LogType.debugError,e),new Aa.UnableToSetCookieException(e.toString())}return{partitionKey:t}}#ga(e){const t=e.context,a=this.#i.getContext(t),r=za.NetworkProcessor.parseUrlString(a?.url??"");return{sourceOrigin:"null"===r.origin?r.origin:`${r.protocol}//${r.hostname}`}}#ya(e){let t;if(void 0!==e.sourceOrigin&&(t=e.sourceOrigin),void 0===t)throw new Aa.UnderspecifiedStoragePartitionException('"sourceOrigin" should be set');const a=new Map;for(const[t,r]of Object.entries(e))void 0===t||void 0===r||["type","sourceOrigin"].includes(t)||a.set(t,r);return a.size>0&&this.#t?.(Ba.LogType.debugInfo,`Unsupported partition keys: ${JSON.stringify(Object.fromEntries(a))}`),{sourceOrigin:t}}#ha(e){if(void 0===e)throw new Aa.UnderspecifiedStoragePartitionException("partition should be set");return"context"===e.type?this.#ga(e):((0,Da.assert)("storageKey"===e.type,"Unknown partition type"),this.#ya(e))}#fa(e,t){if("string"!==e.cookie.value.type)throw new Aa.UnsupportedOperationException("Only string cookie values are supported");const a=e.cookie.value.value;return{name:e.cookie.name,value:a,domain:e.cookie.domain,path:e.cookie.path??"/",secure:e.cookie.secure??!1,httpOnly:e.cookie.httpOnly??!1,partitionKey:t.sourceOrigin,...void 0!==e.cookie.expiry&&{expires:e.cookie.expiry},...void 0!==e.cookie.sameSite&&{sameSite:La.#Sa(e.cookie.sameSite)}}}#pa(e){return{name:e.name,value:{type:"string",value:e.value},domain:e.domain,path:e.path,size:e.size,httpOnly:e.httpOnly,secure:e.secure,sameSite:void 0===e.sameSite?"none":La.#va(e.sameSite),...e.expires>=0?{expiry:e.expires}:void 0}}static#va(e){switch(e){case"Strict":return"strict";case"None":return"none";default:return"lax"}}static#Sa(e){switch(e){case"strict":return"Strict";case"lax":return"Lax";case"none":return"None"}throw new Aa.InvalidArgumentException(`Unknown 'sameSite' value ${e}`)}#ma(e,t){return void 0===t||!(void 0!==t.domain&&t.domain!==e.domain||void 0!==t.name&&t.name!==e.name||void 0!==t.value&&(t.value.type!==e.value.type||t.value.value!==e.value.value)||void 0!==t.path&&t.path!==e.path||void 0!==t.size&&t.size!==e.size||void 0!==t.httpOnly&&t.httpOnly!==e.httpOnly||void 0!==t.secure&&t.secure!==e.secure||void 0!==t.sameSite&&t.sameSite!==e.sameSite||void 0!==t.expiry&&t.expiry!==e.expiry)}}Ma.StorageProcessor=La;var Za={};Object.defineProperty(Za,"__esModule",{value:!0}),Za.OutgoingMessage=void 0;class Ua{#wa;#Ca;constructor(e,t=null){this.#wa=e,this.#Ca=t}static createFromPromise(e,t){return e.then((e=>"success"===e.kind?{kind:"success",value:new Ua(e.value,t)}:e))}static createResolved(e,t){return Promise.resolve({kind:"success",value:new Ua(e,t)})}get message(){return this.#wa}get channel(){return this.#Ca}}Za.OutgoingMessage=Ua,Object.defineProperty(f,"__esModule",{value:!0}),f.CommandProcessor=void 0;const Fa=g,qa=s,Va=l,$a=E,Ka=_,Wa=T,Ha=N,Ja=qe,Ga=vt,Xa=wt,Ya=Pa,Qa=ka,er=Ra,tr=Oa,ar=Ma,rr=Za;class nr extends qa.EventEmitter{#ba;#xa;#Pa;#Ia;#ka;#Ra;#Ea;#_a;#Ta;#Na;#t;constructor(e,t,a,r,n,s,o,i,c=new $a.BidiNoOpParser,d){super(),this.#Na=c,this.#t=d;const u=new Xa.NetworkStorage,l=new Qa.PreloadScriptStorage;this.#ba=new Ka.BrowserProcessor(t),this.#xa=new Ha.BrowsingContextProcessor(e,t,r,a,n,s,u,l,o,i,d),this.#Pa=new Wa.CdpProcessor(n,e,t),this.#Ia=new Ja.InputProcessor(n,s),this.#ka=new Ga.NetworkProcessor(n,u),this.#Ra=new Ya.PermissionsProcessor(t),this.#Ea=new er.ScriptProcessor(n,s,l,d),this.#_a=new tr.SessionProcessor(a),this.#Ta=new ar.StorageProcessor(t,n,d)}async#ja(e){switch(e.method){case"session.end":case"session.new":break;case"browser.close":return this.#ba.close();case"browsingContext.activate":return await this.#xa.activate(this.#Na.parseActivateParams(e.params));case"browsingContext.captureScreenshot":return await this.#xa.captureScreenshot(this.#Na.parseCaptureScreenshotParams(e.params));case"browsingContext.close":return await this.#xa.close(this.#Na.parseCloseParams(e.params));case"browsingContext.create":return await this.#xa.create(this.#Na.parseCreateParams(e.params));case"browsingContext.getTree":return this.#xa.getTree(this.#Na.parseGetTreeParams(e.params));case"browsingContext.handleUserPrompt":return await this.#xa.handleUserPrompt(this.#Na.parseHandleUserPromptParams(e.params));case"browsingContext.locateNodes":throw new Fa.UnsupportedOperationException(`Command '${e.method}' not yet implemented.`);case"browsingContext.navigate":return await this.#xa.navigate(this.#Na.parseNavigateParams(e.params));case"browsingContext.print":return await this.#xa.print(this.#Na.parsePrintParams(e.params));case"browsingContext.reload":return await this.#xa.reload(this.#Na.parseReloadParams(e.params));case"browsingContext.setViewport":return await this.#xa.setViewport(this.#Na.parseSetViewportParams(e.params));case"browsingContext.traverseHistory":return await this.#xa.traverseHistory(this.#Na.parseTraverseHistoryParams(e.params));case"cdp.getSession":return this.#Pa.getSession(this.#Na.parseGetSessionParams(e.params));case"cdp.sendCommand":return await this.#Pa.sendCommand(this.#Na.parseSendCommandParams(e.params));case"input.performActions":return await this.#Ia.performActions(this.#Na.parsePerformActionsParams(e.params));case"input.releaseActions":return await this.#Ia.releaseActions(this.#Na.parseReleaseActionsParams(e.params));case"input.setFiles":return await this.#Ia.setFiles(this.#Na.parseSetFilesParams(e.params));case"network.addIntercept":return await this.#ka.addIntercept(this.#Na.parseAddInterceptParams(e.params));case"network.continueRequest":return await this.#ka.continueRequest(this.#Na.parseContinueRequestParams(e.params));case"network.continueResponse":return await this.#ka.continueResponse(this.#Na.parseContinueResponseParams(e.params));case"network.continueWithAuth":return await this.#ka.continueWithAuth(this.#Na.parseContinueWithAuthParams(e.params));case"network.failRequest":return await this.#ka.failRequest(this.#Na.parseFailRequestParams(e.params));case"network.provideResponse":return await this.#ka.provideResponse(this.#Na.parseProvideResponseParams(e.params));case"network.removeIntercept":return await this.#ka.removeIntercept(this.#Na.parseRemoveInterceptParams(e.params));case"permissions.setPermission":return await this.#Ra.setPermissions(this.#Na.parseSetPermissionsParams(e.params));case"script.addPreloadScript":return await this.#Ea.addPreloadScript(this.#Na.parseAddPreloadScriptParams(e.params));case"script.callFunction":return await this.#Ea.callFunction(this.#Na.parseCallFunctionParams(e.params));case"script.disown":return await this.#Ea.disown(this.#Na.parseDisownParams(e.params));case"script.evaluate":return await this.#Ea.evaluate(this.#Na.parseEvaluateParams(e.params));case"script.getRealms":return this.#Ea.getRealms(this.#Na.parseGetRealmsParams(e.params));case"script.removePreloadScript":return await this.#Ea.removePreloadScript(this.#Na.parseRemovePreloadScriptParams(e.params));case"session.status":return this.#_a.status();case"session.subscribe":return this.#_a.subscribe(this.#Na.parseSubscribeParams(e.params),e.channel);case"session.unsubscribe":return this.#_a.unsubscribe(this.#Na.parseSubscribeParams(e.params),e.channel);case"storage.deleteCookies":throw new Fa.UnsupportedOperationException(`${e.method} is not supported yet`);case"storage.getCookies":return await this.#Ta.getCookies(this.#Na.parseGetCookiesParams(e.params));case"storage.setCookie":return await this.#Ta.setCookie(this.#Na.parseSetCookieParams(e.params))}throw new Fa.UnknownCommandException(`Unknown command '${e.method}'.`)}async processCommand(e){try{const t=await this.#ja(e),a={type:"success",id:e.id,result:t};this.emit("response",{message:rr.OutgoingMessage.createResolved(a,e.channel),event:e.method})}catch(t){if(t instanceof Fa.Exception)this.emit("response",{message:rr.OutgoingMessage.createResolved(t.toErrorResponse(e.id),e.channel),event:e.method});else{const a=t;this.#t?.(Va.LogType.bidi,a),this.emit("response",{message:rr.OutgoingMessage.createResolved(new Fa.UnknownErrorException(a.message,a.stack).toErrorResponse(e.id),e.channel),event:e.method})}}}}f.CommandProcessor=nr;var sr={};Object.defineProperty(sr,"__esModule",{value:!0}),sr.BrowsingContextStorage=void 0;const or=g;sr.BrowsingContextStorage=class{#da=new Map;getTopLevelContexts(){return this.getAllContexts().filter((e=>e.isTopLevelContext()))}getAllContexts(){return Array.from(this.#da.values())}deleteContextById(e){this.#da.delete(e)}deleteContext(e){this.#da.delete(e.id)}addContext(e){this.#da.set(e.id,e)}hasContext(e){return this.#da.has(e)}findContext(e){return this.#da.get(e)}findTopLevelContextId(e){if(null===e)return null;const t=this.findContext(e),a=t?.parentId??null;return null===a?e:this.findTopLevelContextId(a)}findContextBySession(e){for(const t of this.#da.values())if(t.cdpTarget.cdpSessionId===e)return t}getContext(e){const t=this.findContext(e);if(void 0===t)throw new or.NoSuchFrameException(`Context ${e} not found`);return t}};var ir={};Object.defineProperty(ir,"__esModule",{value:!0}),ir.RealmStorage=void 0;const cr=g;ir.RealmStorage=class{#Oa=new Map;#Ma=new Map;get knownHandlesToRealmMap(){return this.#Oa}addRealm(e){this.#Ma.set(e.realmId,e)}findRealms(e){return Array.from(this.#Ma.values()).filter((t=>(void 0===e.realmId||e.realmId===t.realmId)&&((void 0===e.browsingContextId||e.browsingContextId===t.browsingContextId)&&((void 0===e.navigableId||e.navigableId===t.navigableId)&&((void 0===e.executionContextId||e.executionContextId===t.executionContextId)&&((void 0===e.origin||e.origin===t.origin)&&((void 0===e.type||e.type===t.type)&&((void 0===e.sandbox||e.sandbox===t.sandbox)&&(void 0===e.cdpSessionId||e.cdpSessionId===t.cdpClient.sessionId)))))))))}findRealm(e){const t=this.findRealms(e);if(1===t.length)return t[0]}getRealm(e){const t=this.findRealm(e);if(void 0===t)throw new cr.NoSuchFrameException(`Realm ${JSON.stringify(e)} not found`);return t}deleteRealms(e){this.findRealms(e).map((e=>{e.dispose(),this.#Ma.delete(e.realmId),Array.from(this.knownHandlesToRealmMap.entries()).filter((([,t])=>t===e.realmId)).map((([e])=>this.knownHandlesToRealmMap.delete(e)))}))}};var dr={},ur={};Object.defineProperty(ur,"__esModule",{value:!0}),ur.Buffer=void 0;ur.Buffer=class{#Aa;#Da=[];#Ba;constructor(e,t){this.#Aa=e,this.#Ba=t}get(){return this.#Da}add(e){for(this.#Da.push(e);this.#Da.length>this.#Aa;){const e=this.#Da.shift();void 0!==e&&this.#Ba?.(e)}}};var lr={};Object.defineProperty(lr,"__esModule",{value:!0}),lr.DefaultMap=void 0;class hr extends Map{#za;constructor(e,t){super(t),this.#za=e}get(e){return this.has(e)||this.set(e,this.#za(e)),super.get(e)}}lr.DefaultMap=hr;var pr={};Object.defineProperty(pr,"__esModule",{value:!0}),pr.IdWrapper=void 0;class mr{static#La=0;#u;constructor(){this.#u=++mr.#La}get id(){return this.#u}}pr.IdWrapper=mr;var fr={};Object.defineProperty(fr,"__esModule",{value:!0}),fr.assertSupportedEvent=fr.isCdpEvent=void 0;const gr=g;function yr(e){return e.split(".").at(0)?.startsWith(gr.ChromiumBidi.BiDiModule.Cdp)??!1}fr.isCdpEvent=yr,fr.assertSupportedEvent=function(e){if(!gr.ChromiumBidi.EVENT_NAMES.has(e)&&!yr(e))throw new gr.InvalidArgumentException(`Unknown event: ${e}`)};var Sr={};Object.defineProperty(Sr,"__esModule",{value:!0}),Sr.SubscriptionManager=Sr.unrollEvents=Sr.cartesianProduct=void 0;const vr=g,wr=fr;function Cr(...e){return e.reduce(((e,t)=>e.flatMap((e=>t.map((t=>[e,t].flat()))))))}function br(e){const t=new Set;function a(e){for(const a of e)t.add(a)}for(const r of e)switch(r){case vr.ChromiumBidi.BiDiModule.BrowsingContext:a(Object.values(vr.ChromiumBidi.BrowsingContext.EventNames));break;case vr.ChromiumBidi.BiDiModule.Log:a(Object.values(vr.ChromiumBidi.Log.EventNames));break;case vr.ChromiumBidi.BiDiModule.Network:a(Object.values(vr.ChromiumBidi.Network.EventNames));break;case vr.ChromiumBidi.BiDiModule.Script:a(Object.values(vr.ChromiumBidi.Script.EventNames));break;default:t.add(r)}return[...t.values()]}Sr.cartesianProduct=Cr,Sr.unrollEvents=br;Sr.SubscriptionManager=class{#Za=0;#Ua=new Map;#i;constructor(e){this.#i=e}getChannelsSubscribedToEvent(e,t){return Array.from(this.#Ua.keys()).map((a=>({priority:this.#Fa(e,t,a),channel:a}))).filter((({priority:e})=>null!==e)).sort(((e,t)=>e.priority-t.priority)).map((({channel:e})=>e))}#Fa(e,t,a){const r=this.#Ua.get(a);if(void 0===r)return null;const n=this.#i.findTopLevelContextId(t),s=[...new Set([null,n])].map((t=>{const a=r.get(t)?.get(e);if((0,wr.isCdpEvent)(e)){const e=r.get(t)?.get(vr.ChromiumBidi.BiDiModule.Cdp);return a&&e?Math.min(a,e):a??e}return a})).filter((e=>void 0!==e));return 0===s.length?null:Math.min(...s)}subscribe(e,t,a){switch(t=this.#i.findTopLevelContextId(t),e){case vr.ChromiumBidi.BiDiModule.BrowsingContext:return void Object.values(vr.ChromiumBidi.BrowsingContext.EventNames).map((e=>this.subscribe(e,t,a)));case vr.ChromiumBidi.BiDiModule.Log:return void Object.values(vr.ChromiumBidi.Log.EventNames).map((e=>this.subscribe(e,t,a)));case vr.ChromiumBidi.BiDiModule.Network:return void Object.values(vr.ChromiumBidi.Network.EventNames).map((e=>this.subscribe(e,t,a)));case vr.ChromiumBidi.BiDiModule.Script:return void Object.values(vr.ChromiumBidi.Script.EventNames).map((e=>this.subscribe(e,t,a)))}this.#Ua.has(a)||this.#Ua.set(a,new Map);const r=this.#Ua.get(a);r.has(t)||r.set(t,new Map);const n=r.get(t);n.has(e)||n.set(e,this.#Za++)}unsubscribeAll(e,t,a){for(const e of t)null!==e&&this.#i.getContext(e);Cr(br(e),t).map((([e,t])=>this.#qa(e,t,a))).forEach((e=>e()))}unsubscribe(e,t,a){this.unsubscribeAll([e],[t],a)}#qa(e,t,a){if(t=this.#i.findTopLevelContextId(t),!this.#Ua.has(a))throw new vr.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const r=this.#Ua.get(a);if(!r.has(t))throw new vr.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const n=r.get(t);if(!n.has(e))throw new vr.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);return()=>{n.delete(e),0===n.size&&r.delete(e),0===r.size&&this.#Ua.delete(a)}}},Object.defineProperty(dr,"__esModule",{value:!0}),dr.EventManager=void 0;const xr=g,Pr=ur,Ir=lr,kr=s,Rr=pr,Er=Za,_r=fr,Tr=Sr;class Nr{#Va=new Rr.IdWrapper;#$a;#Ka;constructor(e,t){this.#Ka=e,this.#$a=t}get id(){return this.#Va.id}get contextId(){return this.#$a}get event(){return this.#Ka}}const jr=new Map([[xr.ChromiumBidi.Log.EventNames.LogEntryAdded,100]]);class Or extends kr.EventEmitter{#Wa=new Ir.DefaultMap((()=>new Set));#Ha=new Map;#Ja=new Map;#Ga;#i;constructor(e){super(),this.#i=e,this.#Ga=new Tr.SubscriptionManager(e)}static#Xa(e,t,a){return JSON.stringify({eventName:e,browsingContext:t,channel:a})}registerEvent(e,t){this.registerPromiseEvent(Promise.resolve({kind:"success",value:e}),t,e.method)}registerPromiseEvent(e,t,a){const r=new Nr(e,t),n=this.#Ga.getChannelsSubscribedToEvent(a,t);this.#Ya(r,a);for(const t of n)this.emit("event",{message:Er.OutgoingMessage.createFromPromise(e,t),event:a}),this.#Qa(r,t,a)}subscribe(e,t,a){for(const t of e)(0,_r.assertSupportedEvent)(t);for(const e of t)null!==e&&this.#i.getContext(e);for(const r of e)for(const e of t){this.#Ga.subscribe(r,e,a);for(const t of this.#er(r,e,a))this.emit("event",{message:Er.OutgoingMessage.createFromPromise(t.event,a),event:r}),this.#Qa(t,a,r)}}unsubscribe(e,t,a){for(const t of e)(0,_r.assertSupportedEvent)(t);this.#Ga.unsubscribeAll(e,t,a)}#Ya(e,t){if(!jr.has(t))return;const a=Or.#Xa(t,e.contextId);this.#Ha.has(a)||this.#Ha.set(a,new Pr.Buffer(jr.get(t))),this.#Ha.get(a).add(e),this.#Wa.get(t).add(e.contextId)}#Qa(e,t,a){if(!jr.has(a))return;const r=Or.#Xa(a,e.contextId,t);this.#Ja.set(r,Math.max(this.#Ja.get(r)??0,e.id))}#er(e,t,a){const r=Or.#Xa(e,t),n=Or.#Xa(e,t,a),s=this.#Ja.get(n)??-1/0,o=this.#Ha.get(r)?.get().filter((e=>e.id>s))??[];return null===t&&Array.from(this.#Wa.get(e).keys()).filter((e=>null!==e&&this.#i.hasContext(e))).map((t=>this.#er(e,t,a))).forEach((e=>o.push(...e))),o.sort(((e,t)=>e.id-t.id))}}dr.EventManager=Or,Object.defineProperty(n,"__esModule",{value:!0}),n.BidiServer=void 0;const Mr=s,Ar=l,Dr=h,Br=f,zr=sr,Lr=ir,Zr=dr;class Ur extends Mr.EventEmitter{#tr;#ar;#rr;#k;#i=new zr.BrowsingContextStorage;#t;#nr=e=>{this.#rr.processCommand(e).catch((e=>{this.#t?.(Ar.LogType.debugError,e)}))};#sr=async e=>{const t=e.message;null!==e.channel&&(t.channel=e.channel),await this.#ar.sendMessage(t)};constructor(e,t,a,r,n,s,o){super(),this.#t=o,this.#tr=new Dr.ProcessingQueue(this.#sr,this.#t),this.#ar=e,this.#ar.setOnMessage(this.#nr),this.#k=new Zr.EventManager(this.#i),this.#rr=new Br.CommandProcessor(t,a,this.#k,r,this.#i,new Lr.RealmStorage,n?.acceptInsecureCerts??!1,n?.sharedIdWithFrame??!1,s,this.#t),this.#k.on("event",(({message:e,event:t})=>{this.emitOutgoingMessage(e,t)})),this.#rr.on("response",(({message:e,event:t})=>{this.emitOutgoingMessage(e,t)}))}static async createAndStart(e,t,a,r,n,s,o){const i=new Ur(e,t,a,r,n,s,o);return await a.sendCommand("Target.setDiscoverTargets",{discover:!0}),await a.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),await i.#or(),i}emitOutgoingMessage(e,t){this.#tr.add(e,t)}close(){this.#ar.close()}async#or(){await Promise.all(this.#i.getTopLevelContexts().map((e=>e.lifecycleLoaded())))}}n.BidiServer=Ur,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.OutgoingMessage=e.EventEmitter=e.BidiServer=void 0;var t=n;Object.defineProperty(e,"BidiServer",{enumerable:!0,get:function(){return t.BidiServer}});var a=s;Object.defineProperty(e,"EventEmitter",{enumerable:!0,get:function(){return a.EventEmitter}});var r=Za;Object.defineProperty(e,"OutgoingMessage",{enumerable:!0,get:function(){return r.OutgoingMessage}})}(r);var Fr={},qr={};Object.defineProperty(qr,"__esModule",{value:!0}),qr.MapperCdpClient=qr.CloseError=void 0;const Vr=s;class $r extends Error{}qr.CloseError=$r;class Kr extends Vr.EventEmitter{#c;#ir;constructor(e,t){super(),this.#c=e,this.#ir=t}get sessionId(){return this.#ir}sendCommand(e,...t){return this.#c.sendCommand(e,t[0],this.#ir)}isCloseError(e){return e instanceof $r}}qr.MapperCdpClient=Kr,Object.defineProperty(Fr,"__esModule",{value:!0}),Fr.MapperCdpConnection=void 0;const Wr=l,Hr=qr;class Jr{static LOGGER_PREFIX_RECV=`${Wr.LogType.cdp}:RECV \u25c2`;static LOGGER_PREFIX_SEND=`${Wr.LogType.cdp}:SEND \u25b8`;#cr;#ar;#dr=new Map;#ur=new Map;#t;#lr=0;constructor(e,t){this.#ar=e,this.#t=t,this.#ar.setOnMessage(this.#hr),this.#cr=this.#pr(void 0)}close(){this.#ar.close();for(const[,{reject:e,error:t}]of this.#ur)e(t);this.#ur.clear(),this.#dr.clear()}async createBrowserSession(){const{sessionId:e}=await this.#cr.sendCommand("Target.attachToBrowserTarget");return this.#pr(e)}getCdpClient(e){const t=this.#dr.get(e);if(!t)throw new Error(`Unknown CDP session ID: ${e}`);return t}sendCommand(e,t,a){return new Promise(((r,n)=>{const s=this.#lr++;this.#ur.set(s,{resolve:r,reject:n,error:new Hr.CloseError(`${e} ${JSON.stringify(t)} ${a??""} call rejected because the connection has been closed.`)});const o={id:s,method:e,params:t};a&&(o.sessionId=a),this.#ar.sendMessage(JSON.stringify(o))?.catch((e=>{this.#t?.(Wr.LogType.debugError,e),this.#ar.close()})),this.#t?.(Jr.LOGGER_PREFIX_SEND,o)}))}#hr=e=>{const t=JSON.parse(e);if(this.#t?.(Jr.LOGGER_PREFIX_RECV,t),"Target.attachedToTarget"===t.method){const{sessionId:e}=t.params;this.#pr(e)}if(void 0!==t.id){const e=this.#ur.get(t.id);this.#ur.delete(t.id),e&&(t.result?e.resolve(t.result):t.error&&e.reject(t.error))}else if(t.method){const e=this.#dr.get(t.sessionId??void 0);if(e?.emit(t.method,t.params||{}),"Target.detachedFromTarget"===t.method){const{sessionId:e}=t.params,a=this.#dr.get(e);a&&(this.#dr.delete(e),a.removeAllListeners())}}};#pr(e){const t=new Hr.MapperCdpClient(this,e);return this.#dr.set(e,t),t}}Fr.MapperCdpConnection=Jr;var Gr={},Xr={},Yr={},Qr={},en={},tn={},an={};!function(e){var t;Object.defineProperty(e,"__esModule",{value:!0}),e.getParsedType=e.ZodParsedType=e.objectUtil=e.util=void 0,function(e){e.assertEqual=e=>e,e.assertIs=function(e){},e.assertNever=function(e){throw new Error},e.arrayToEnum=e=>{const t={};for(const a of e)t[a]=a;return t},e.getValidEnumValues=t=>{const a=e.objectKeys(t).filter((e=>"number"!=typeof t[t[e]])),r={};for(const e of a)r[e]=t[e];return e.objectValues(r)},e.objectValues=t=>e.objectKeys(t).map((function(e){return t[e]})),e.objectKeys="function"==typeof Object.keys?e=>Object.keys(e):e=>{const t=[];for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.push(a);return t},e.find=(e,t)=>{for(const a of e)if(t(a))return a},e.isInteger="function"==typeof Number.isInteger?e=>Number.isInteger(e):e=>"number"==typeof e&&isFinite(e)&&Math.floor(e)===e,e.joinValues=function(e,t=" | "){return e.map((e=>"string"==typeof e?`'${e}'`:e)).join(t)},e.jsonStringifyReplacer=(e,t)=>"bigint"==typeof t?t.toString():t}(t=e.util||(e.util={})),(e.objectUtil||(e.objectUtil={})).mergeShapes=(e,t)=>({...e,...t}),e.ZodParsedType=t.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]);e.getParsedType=t=>{switch(typeof t){case"undefined":return e.ZodParsedType.undefined;case"string":return e.ZodParsedType.string;case"number":return isNaN(t)?e.ZodParsedType.nan:e.ZodParsedType.number;case"boolean":return e.ZodParsedType.boolean;case"function":return e.ZodParsedType.function;case"bigint":return e.ZodParsedType.bigint;case"symbol":return e.ZodParsedType.symbol;case"object":return Array.isArray(t)?e.ZodParsedType.array:null===t?e.ZodParsedType.null:t.then&&"function"==typeof t.then&&t.catch&&"function"==typeof t.catch?e.ZodParsedType.promise:"undefined"!=typeof Map&&t instanceof Map?e.ZodParsedType.map:"undefined"!=typeof Set&&t instanceof Set?e.ZodParsedType.set:"undefined"!=typeof Date&&t instanceof Date?e.ZodParsedType.date:e.ZodParsedType.object;default:return e.ZodParsedType.unknown}}}(an);var rn={};Object.defineProperty(rn,"__esModule",{value:!0}),rn.ZodError=rn.quotelessJson=rn.ZodIssueCode=void 0;const nn=an;rn.ZodIssueCode=nn.util.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);rn.quotelessJson=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class sn extends Error{constructor(e){super(),this.issues=[],this.addIssue=e=>{this.issues=[...this.issues,e]},this.addIssues=(e=[])=>{this.issues=[...this.issues,...e]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}get errors(){return this.issues}format(e){const t=e||function(e){return e.message},a={_errors:[]},r=e=>{for(const n of e.issues)if("invalid_union"===n.code)n.unionErrors.map(r);else if("invalid_return_type"===n.code)r(n.returnTypeError);else if("invalid_arguments"===n.code)r(n.argumentsError);else if(0===n.path.length)a._errors.push(t(n));else{let e=a,r=0;for(;r<n.path.length;){const a=n.path[r];r===n.path.length-1?(e[a]=e[a]||{_errors:[]},e[a]._errors.push(t(n))):e[a]=e[a]||{_errors:[]},e=e[a],r++}}};return r(this),a}toString(){return this.message}get message(){return JSON.stringify(this.issues,nn.util.jsonStringifyReplacer,2)}get isEmpty(){return 0===this.issues.length}flatten(e=(e=>e.message)){const t={},a=[];for(const r of this.issues)r.path.length>0?(t[r.path[0]]=t[r.path[0]]||[],t[r.path[0]].push(e(r))):a.push(e(r));return{formErrors:a,fieldErrors:t}}get formErrors(){return this.flatten()}}rn.ZodError=sn,sn.create=e=>new sn(e),Object.defineProperty(tn,"__esModule",{value:!0});const on=an,cn=rn;tn.default=(e,t)=>{let a;switch(e.code){case cn.ZodIssueCode.invalid_type:a=e.received===on.ZodParsedType.undefined?"Required":`Expected ${e.expected}, received ${e.received}`;break;case cn.ZodIssueCode.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(e.expected,on.util.jsonStringifyReplacer)}`;break;case cn.ZodIssueCode.unrecognized_keys:a=`Unrecognized key(s) in object: ${on.util.joinValues(e.keys,", ")}`;break;case cn.ZodIssueCode.invalid_union:a="Invalid input";break;case cn.ZodIssueCode.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${on.util.joinValues(e.options)}`;break;case cn.ZodIssueCode.invalid_enum_value:a=`Invalid enum value. Expected ${on.util.joinValues(e.options)}, received '${e.received}'`;break;case cn.ZodIssueCode.invalid_arguments:a="Invalid function arguments";break;case cn.ZodIssueCode.invalid_return_type:a="Invalid function return type";break;case cn.ZodIssueCode.invalid_date:a="Invalid date";break;case cn.ZodIssueCode.invalid_string:"object"==typeof e.validation?"includes"in e.validation?(a=`Invalid input: must include "${e.validation.includes}"`,"number"==typeof e.validation.position&&(a=`${a} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?a=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?a=`Invalid input: must end with "${e.validation.endsWith}"`:on.util.assertNever(e.validation):a="regex"!==e.validation?`Invalid ${e.validation}`:"Invalid";break;case cn.ZodIssueCode.too_small:a="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:"date"===e.type?`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:"Invalid input";break;case cn.ZodIssueCode.too_big:a="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"bigint"===e.type?`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"date"===e.type?`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:"Invalid input";break;case cn.ZodIssueCode.custom:a="Invalid input";break;case cn.ZodIssueCode.invalid_intersection_types:a="Intersection results could not be merged";break;case cn.ZodIssueCode.not_multiple_of:a=`Number must be a multiple of ${e.multipleOf}`;break;case cn.ZodIssueCode.not_finite:a="Number must be finite";break;default:a=t.defaultError,on.util.assertNever(e)}return{message:a}};var dn=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(en,"__esModule",{value:!0}),en.getErrorMap=en.setErrorMap=en.defaultErrorMap=void 0;const un=dn(tn);en.defaultErrorMap=un.default;let ln=un.default;en.setErrorMap=function(e){ln=e},en.getErrorMap=function(){return ln};var hn={};!function(t){var a=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isAsync=t.isValid=t.isDirty=t.isAborted=t.OK=t.DIRTY=t.INVALID=t.ParseStatus=t.addIssueToContext=t.EMPTY_PATH=t.makeIssue=void 0;const r=en,n=a(tn);t.makeIssue=e=>{const{data:t,path:a,errorMaps:r,issueData:n}=e,s=[...a,...n.path||[]],o={...n,path:s};let i="";const c=r.filter((e=>!!e)).slice().reverse();for(const e of c)i=e(o,{data:t,defaultError:i}).message;return{...n,path:s,message:n.message||i}},t.EMPTY_PATH=[],t.addIssueToContext=function(e,a){const s=(0,t.makeIssue)({issueData:a,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,(0,r.getErrorMap)(),n.default].filter((e=>!!e))});e.common.issues.push(s)};class s{constructor(){this.value="valid"}dirty(){"valid"===this.value&&(this.value="dirty")}abort(){"aborted"!==this.value&&(this.value="aborted")}static mergeArray(e,a){const r=[];for(const n of a){if("aborted"===n.status)return t.INVALID;"dirty"===n.status&&e.dirty(),r.push(n.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,t){const a=[];for(const e of t)a.push({key:await e.key,value:await e.value});return s.mergeObjectSync(e,a)}static mergeObjectSync(e,a){const r={};for(const n of a){const{key:a,value:s}=n;if("aborted"===a.status)return t.INVALID;if("aborted"===s.status)return t.INVALID;"dirty"===a.status&&e.dirty(),"dirty"===s.status&&e.dirty(),"__proto__"===a.value||void 0===s.value&&!n.alwaysSet||(r[a.value]=s.value)}return{status:e.value,value:r}}}t.ParseStatus=s,t.INVALID=Object.freeze({status:"aborted"});t.DIRTY=e=>({status:"dirty",value:e});t.OK=e=>({status:"valid",value:e});t.isAborted=e=>"aborted"===e.status;t.isDirty=e=>"dirty"===e.status;t.isValid=e=>"valid"===e.status;t.isAsync=e=>"undefined"!=typeof Promise&&e instanceof Promise}(hn);var pn={};Object.defineProperty(pn,"__esModule",{value:!0});var mn,fn={},gn={};mn=gn,Object.defineProperty(mn,"__esModule",{value:!0}),mn.errorUtil=void 0,function(e){e.errToObj=e=>"string"==typeof e?{message:e}:e||{},e.toString=e=>"string"==typeof e?e:null==e?void 0:e.message}(mn.errorUtil||(mn.errorUtil={})),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.date=e.boolean=e.bigint=e.array=e.any=e.coerce=e.ZodFirstPartyTypeKind=e.late=e.ZodSchema=e.Schema=e.custom=e.ZodReadonly=e.ZodPipeline=e.ZodBranded=e.BRAND=e.ZodNaN=e.ZodCatch=e.ZodDefault=e.ZodNullable=e.ZodOptional=e.ZodTransformer=e.ZodEffects=e.ZodPromise=e.ZodNativeEnum=e.ZodEnum=e.ZodLiteral=e.ZodLazy=e.ZodFunction=e.ZodSet=e.ZodMap=e.ZodRecord=e.ZodTuple=e.ZodIntersection=e.ZodDiscriminatedUnion=e.ZodUnion=e.ZodObject=e.ZodArray=e.ZodVoid=e.ZodNever=e.ZodUnknown=e.ZodAny=e.ZodNull=e.ZodUndefined=e.ZodSymbol=e.ZodDate=e.ZodBoolean=e.ZodBigInt=e.ZodNumber=e.ZodString=e.ZodType=void 0,e.NEVER=e.void=e.unknown=e.union=e.undefined=e.tuple=e.transformer=e.symbol=e.string=e.strictObject=e.set=e.record=e.promise=e.preprocess=e.pipeline=e.ostring=e.optional=e.onumber=e.oboolean=e.object=e.number=e.nullable=e.null=e.never=e.nativeEnum=e.nan=e.map=e.literal=e.lazy=e.intersection=e.instanceof=e.function=e.enum=e.effect=e.discriminatedUnion=void 0;const t=en,a=gn,r=hn,n=an,s=rn;class o{constructor(e,t,a,r){this._cachedPath=[],this.parent=e,this.data=t,this._path=a,this._key=r}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const i=(e,t)=>{if((0,r.isValid)(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const t=new s.ZodError(e.common.issues);return this._error=t,this._error}}};function c(e){if(!e)return{};const{errorMap:t,invalid_type_error:a,required_error:r,description:n}=e;if(t&&(a||r))throw new Error('Can\'t use "invalid_type_error" or "required_error" in conjunction with custom error map.');if(t)return{errorMap:t,description:n};return{errorMap:(e,t)=>"invalid_type"!==e.code?{message:t.defaultError}:void 0===t.data?{message:null!=r?r:t.defaultError}:{message:null!=a?a:t.defaultError},description:n}}class d{constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(e){return(0,n.getParsedType)(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:(0,n.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new r.ParseStatus,ctx:{common:e.parent.common,data:e.data,parsedType:(0,n.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if((0,r.isAsync)(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const a=this.safeParse(e,t);if(a.success)return a.data;throw a.error}safeParse(e,t){var a;const r={common:{issues:[],async:null!==(a=null==t?void 0:t.async)&&void 0!==a&&a,contextualErrorMap:null==t?void 0:t.errorMap},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,n.getParsedType)(e)},s=this._parseSync({data:e,path:r.path,parent:r});return i(r,s)}async parseAsync(e,t){const a=await this.safeParseAsync(e,t);if(a.success)return a.data;throw a.error}async safeParseAsync(e,t){const a={common:{issues:[],contextualErrorMap:null==t?void 0:t.errorMap,async:!0},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,n.getParsedType)(e)},s=this._parse({data:e,path:a.path,parent:a}),o=await((0,r.isAsync)(s)?s:Promise.resolve(s));return i(a,o)}refine(e,t){const a=e=>"string"==typeof t||void 0===t?{message:t}:"function"==typeof t?t(e):t;return this._refinement(((t,r)=>{const n=e(t),o=()=>r.addIssue({code:s.ZodIssueCode.custom,...a(t)});return"undefined"!=typeof Promise&&n instanceof Promise?n.then((e=>!!e||(o(),!1))):!!n||(o(),!1)}))}refinement(e,t){return this._refinement(((a,r)=>!!e(a)||(r.addIssue("function"==typeof t?t(a,r):t),!1)))}_refinement(e){return new G({schema:this,typeName:se.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}optional(){return X.create(this,this._def)}nullable(){return Y.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return N.create(this,this._def)}promise(){return J.create(this,this._def)}or(e){return M.create([this,e],this._def)}and(e){return z.create(this,e,this._def)}transform(e){return new G({...c(this._def),schema:this,typeName:se.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t="function"==typeof e?e:()=>e;return new Q({...c(this._def),innerType:this,defaultValue:t,typeName:se.ZodDefault})}brand(){return new ae({typeName:se.ZodBranded,type:this,...c(this._def)})}catch(e){const t="function"==typeof e?e:()=>e;return new ee({...c(this._def),innerType:this,catchValue:t,typeName:se.ZodCatch})}describe(e){return new(0,this.constructor)({...this._def,description:e})}pipe(e){return re.create(this,e)}readonly(){return ne.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}e.ZodType=d,e.Schema=d,e.ZodSchema=d;const u=/^c[^\s-]{8,}$/i,l=/^[a-z][a-z0-9]*$/,h=/^[0-9A-HJKMNP-TV-Z]{26}$/,p=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,m=/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i;let f;const g=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,y=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;class S extends d{_parse(e){this._def.coerce&&(e.data=String(e.data));if(this._getType(e)!==n.ZodParsedType.string){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.string,received:t.parsedType}),r.INVALID}const t=new r.ParseStatus;let a;for(const d of this._def.checks)if("min"===d.kind)e.data.length<d.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:d.value,type:"string",inclusive:!0,exact:!1,message:d.message}),t.dirty());else if("max"===d.kind)e.data.length>d.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:d.value,type:"string",inclusive:!0,exact:!1,message:d.message}),t.dirty());else if("length"===d.kind){const n=e.data.length>d.value,o=e.data.length<d.value;(n||o)&&(a=this._getOrReturnCtx(e,a),n?(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:d.value,type:"string",inclusive:!0,exact:!0,message:d.message}):o&&(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:d.value,type:"string",inclusive:!0,exact:!0,message:d.message}),t.dirty())}else if("email"===d.kind)m.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"email",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("emoji"===d.kind)f||(f=new RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),f.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"emoji",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("uuid"===d.kind)p.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"uuid",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("cuid"===d.kind)u.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"cuid",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("cuid2"===d.kind)l.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"cuid2",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("ulid"===d.kind)h.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"ulid",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("url"===d.kind)try{new URL(e.data)}catch(n){a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"url",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty()}else if("regex"===d.kind){d.regex.lastIndex=0;d.regex.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"regex",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty())}else if("trim"===d.kind)e.data=e.data.trim();else if("includes"===d.kind)e.data.includes(d.value,d.position)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:{includes:d.value,position:d.position},message:d.message}),t.dirty());else if("toLowerCase"===d.kind)e.data=e.data.toLowerCase();else if("toUpperCase"===d.kind)e.data=e.data.toUpperCase();else if("startsWith"===d.kind)e.data.startsWith(d.value)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:{startsWith:d.value},message:d.message}),t.dirty());else if("endsWith"===d.kind)e.data.endsWith(d.value)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:{endsWith:d.value},message:d.message}),t.dirty());else if("datetime"===d.kind){((c=d).precision?c.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${c.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${c.precision}}Z$`):0===c.precision?c.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):c.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$")).test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:"datetime",message:d.message}),t.dirty())}else"ip"===d.kind?(o=e.data,("v4"!==(i=d.version)&&i||!g.test(o))&&("v6"!==i&&i||!y.test(o))&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"ip",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty())):n.util.assertNever(d);var o,i,c;return{status:t.value,value:e.data}}_regex(e,t,r){return this.refinement((t=>e.test(t)),{validation:t,code:s.ZodIssueCode.invalid_string,...a.errorUtil.errToObj(r)})}_addCheck(e){return new S({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...a.errorUtil.errToObj(e)})}url(e){return this._addCheck({kind:"url",...a.errorUtil.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...a.errorUtil.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...a.errorUtil.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...a.errorUtil.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...a.errorUtil.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...a.errorUtil.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...a.errorUtil.errToObj(e)})}datetime(e){var t;return"string"==typeof e?this._addCheck({kind:"datetime",precision:null,offset:!1,message:e}):this._addCheck({kind:"datetime",precision:void 0===(null==e?void 0:e.precision)?null:null==e?void 0:e.precision,offset:null!==(t=null==e?void 0:e.offset)&&void 0!==t&&t,...a.errorUtil.errToObj(null==e?void 0:e.message)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...a.errorUtil.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:null==t?void 0:t.position,...a.errorUtil.errToObj(null==t?void 0:t.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...a.errorUtil.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...a.errorUtil.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...a.errorUtil.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...a.errorUtil.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...a.errorUtil.errToObj(t)})}nonempty(e){return this.min(1,a.errorUtil.errToObj(e))}trim(){return new S({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new S({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new S({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find((e=>"datetime"===e.kind))}get isEmail(){return!!this._def.checks.find((e=>"email"===e.kind))}get isURL(){return!!this._def.checks.find((e=>"url"===e.kind))}get isEmoji(){return!!this._def.checks.find((e=>"emoji"===e.kind))}get isUUID(){return!!this._def.checks.find((e=>"uuid"===e.kind))}get isCUID(){return!!this._def.checks.find((e=>"cuid"===e.kind))}get isCUID2(){return!!this._def.checks.find((e=>"cuid2"===e.kind))}get isULID(){return!!this._def.checks.find((e=>"ulid"===e.kind))}get isIP(){return!!this._def.checks.find((e=>"ip"===e.kind))}get minLength(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}function v(e,t){const a=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,n=a>r?a:r;return parseInt(e.toFixed(n).replace(".",""))%parseInt(t.toFixed(n).replace(".",""))/Math.pow(10,n)}e.ZodString=S,S.create=e=>{var t;return new S({checks:[],typeName:se.ZodString,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...c(e)})};class w extends d{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){this._def.coerce&&(e.data=Number(e.data));if(this._getType(e)!==n.ZodParsedType.number){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.number,received:t.parsedType}),r.INVALID}let t;const a=new r.ParseStatus;for(const o of this._def.checks)if("int"===o.kind)n.util.isInteger(e.data)||(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:"integer",received:"float",message:o.message}),a.dirty());else if("min"===o.kind){(o.inclusive?e.data<o.value:e.data<=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_small,minimum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty())}else if("max"===o.kind){(o.inclusive?e.data>o.value:e.data>=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty())}else"multipleOf"===o.kind?0!==v(e.data,o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):"finite"===o.kind?Number.isFinite(e.data)||(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.not_finite,message:o.message}),a.dirty()):n.util.assertNever(o);return{status:a.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,a.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,a.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,a.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,a.errorUtil.toString(t))}setLimit(e,t,r,n){return new w({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:a.errorUtil.toString(n)}]})}_addCheck(e){return new w({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:a.errorUtil.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:a.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:a.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:a.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:a.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:a.errorUtil.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:a.errorUtil.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:a.errorUtil.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:a.errorUtil.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find((e=>"int"===e.kind||"multipleOf"===e.kind&&n.util.isInteger(e.value)))}get isFinite(){let e=null,t=null;for(const a of this._def.checks){if("finite"===a.kind||"int"===a.kind||"multipleOf"===a.kind)return!0;"min"===a.kind?(null===t||a.value>t)&&(t=a.value):"max"===a.kind&&(null===e||a.value<e)&&(e=a.value)}return Number.isFinite(t)&&Number.isFinite(e)}}e.ZodNumber=w,w.create=e=>new w({checks:[],typeName:se.ZodNumber,coerce:(null==e?void 0:e.coerce)||!1,...c(e)});class C extends d{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){this._def.coerce&&(e.data=BigInt(e.data));if(this._getType(e)!==n.ZodParsedType.bigint){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.bigint,received:t.parsedType}),r.INVALID}let t;const a=new r.ParseStatus;for(const o of this._def.checks)if("min"===o.kind){(o.inclusive?e.data<o.value:e.data<=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_small,type:"bigint",minimum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty())}else if("max"===o.kind){(o.inclusive?e.data>o.value:e.data>=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty())}else"multipleOf"===o.kind?e.data%o.value!==BigInt(0)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):n.util.assertNever(o);return{status:a.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,a.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,a.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,a.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,a.errorUtil.toString(t))}setLimit(e,t,r,n){return new C({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:a.errorUtil.toString(n)}]})}_addCheck(e){return new C({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:a.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:a.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:a.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:a.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:a.errorUtil.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}e.ZodBigInt=C,C.create=e=>{var t;return new C({checks:[],typeName:se.ZodBigInt,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...c(e)})};class b extends d{_parse(e){this._def.coerce&&(e.data=Boolean(e.data));if(this._getType(e)!==n.ZodParsedType.boolean){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.boolean,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodBoolean=b,b.create=e=>new b({typeName:se.ZodBoolean,coerce:(null==e?void 0:e.coerce)||!1,...c(e)});class x extends d{_parse(e){this._def.coerce&&(e.data=new Date(e.data));if(this._getType(e)!==n.ZodParsedType.date){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.date,received:t.parsedType}),r.INVALID}if(isNaN(e.data.getTime())){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_date}),r.INVALID}const t=new r.ParseStatus;let a;for(const o of this._def.checks)"min"===o.kind?e.data.getTime()<o.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,message:o.message,inclusive:!0,exact:!1,minimum:o.value,type:"date"}),t.dirty()):"max"===o.kind?e.data.getTime()>o.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),t.dirty()):n.util.assertNever(o);return{status:t.value,value:new Date(e.data.getTime())}}_addCheck(e){return new x({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:a.errorUtil.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:a.errorUtil.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return null!=e?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return null!=e?new Date(e):null}}e.ZodDate=x,x.create=e=>new x({checks:[],coerce:(null==e?void 0:e.coerce)||!1,typeName:se.ZodDate,...c(e)});class P extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.symbol){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.symbol,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodSymbol=P,P.create=e=>new P({typeName:se.ZodSymbol,...c(e)});class I extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.undefined,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodUndefined=I,I.create=e=>new I({typeName:se.ZodUndefined,...c(e)});class k extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.null){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.null,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodNull=k,k.create=e=>new k({typeName:se.ZodNull,...c(e)});class R extends d{constructor(){super(...arguments),this._any=!0}_parse(e){return(0,r.OK)(e.data)}}e.ZodAny=R,R.create=e=>new R({typeName:se.ZodAny,...c(e)});class E extends d{constructor(){super(...arguments),this._unknown=!0}_parse(e){return(0,r.OK)(e.data)}}e.ZodUnknown=E,E.create=e=>new E({typeName:se.ZodUnknown,...c(e)});class _ extends d{_parse(e){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.never,received:t.parsedType}),r.INVALID}}e.ZodNever=_,_.create=e=>new _({typeName:se.ZodNever,...c(e)});class T extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.void,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodVoid=T,T.create=e=>new T({typeName:se.ZodVoid,...c(e)});class N extends d{_parse(e){const{ctx:t,status:a}=this._processInputParams(e),i=this._def;if(t.parsedType!==n.ZodParsedType.array)return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.array,received:t.parsedType}),r.INVALID;if(null!==i.exactLength){const e=t.data.length>i.exactLength.value,n=t.data.length<i.exactLength.value;(e||n)&&((0,r.addIssueToContext)(t,{code:e?s.ZodIssueCode.too_big:s.ZodIssueCode.too_small,minimum:n?i.exactLength.value:void 0,maximum:e?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),a.dirty())}if(null!==i.minLength&&t.data.length<i.minLength.value&&((0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),a.dirty()),null!==i.maxLength&&t.data.length>i.maxLength.value&&((0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),a.dirty()),t.common.async)return Promise.all([...t.data].map(((e,a)=>i.type._parseAsync(new o(t,e,t.path,a))))).then((e=>r.ParseStatus.mergeArray(a,e)));const c=[...t.data].map(((e,a)=>i.type._parseSync(new o(t,e,t.path,a))));return r.ParseStatus.mergeArray(a,c)}get element(){return this._def.type}min(e,t){return new N({...this._def,minLength:{value:e,message:a.errorUtil.toString(t)}})}max(e,t){return new N({...this._def,maxLength:{value:e,message:a.errorUtil.toString(t)}})}length(e,t){return new N({...this._def,exactLength:{value:e,message:a.errorUtil.toString(t)}})}nonempty(e){return this.min(1,e)}}function j(e){if(e instanceof O){const t={};for(const a in e.shape){const r=e.shape[a];t[a]=X.create(j(r))}return new O({...e._def,shape:()=>t})}return e instanceof N?new N({...e._def,type:j(e.element)}):e instanceof X?X.create(j(e.unwrap())):e instanceof Y?Y.create(j(e.unwrap())):e instanceof L?L.create(e.items.map((e=>j(e)))):e}e.ZodArray=N,N.create=(e,t)=>new N({type:e,minLength:null,maxLength:null,exactLength:null,typeName:se.ZodArray,...c(t)});class O extends d{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(null!==this._cached)return this._cached;const e=this._def.shape(),t=n.util.objectKeys(e);return this._cached={shape:e,keys:t}}_parse(e){if(this._getType(e)!==n.ZodParsedType.object){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.object,received:t.parsedType}),r.INVALID}const{status:t,ctx:a}=this._processInputParams(e),{shape:i,keys:c}=this._getCached(),d=[];if(!(this._def.catchall instanceof _&&"strip"===this._def.unknownKeys))for(const e in a.data)c.includes(e)||d.push(e);const u=[];for(const e of c){const t=i[e],r=a.data[e];u.push({key:{status:"valid",value:e},value:t._parse(new o(a,r,a.path,e)),alwaysSet:e in a.data})}if(this._def.catchall instanceof _){const e=this._def.unknownKeys;if("passthrough"===e)for(const e of d)u.push({key:{status:"valid",value:e},value:{status:"valid",value:a.data[e]}});else if("strict"===e)d.length>0&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.unrecognized_keys,keys:d}),t.dirty());else if("strip"!==e)throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const e=this._def.catchall;for(const t of d){const r=a.data[t];u.push({key:{status:"valid",value:t},value:e._parse(new o(a,r,a.path,t)),alwaysSet:t in a.data})}}return a.common.async?Promise.resolve().then((async()=>{const e=[];for(const t of u){const a=await t.key;e.push({key:a,value:await t.value,alwaysSet:t.alwaysSet})}return e})).then((e=>r.ParseStatus.mergeObjectSync(t,e))):r.ParseStatus.mergeObjectSync(t,u)}get shape(){return this._def.shape()}strict(e){return a.errorUtil.errToObj,new O({...this._def,unknownKeys:"strict",...void 0!==e?{errorMap:(t,r)=>{var n,s,o,i;const c=null!==(o=null===(s=(n=this._def).errorMap)||void 0===s?void 0:s.call(n,t,r).message)&&void 0!==o?o:r.defaultError;return"unrecognized_keys"===t.code?{message:null!==(i=a.errorUtil.errToObj(e).message)&&void 0!==i?i:c}:{message:c}}}:{}})}strip(){return new O({...this._def,unknownKeys:"strip"})}passthrough(){return new O({...this._def,unknownKeys:"passthrough"})}extend(e){return new O({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new O({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:se.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new O({...this._def,catchall:e})}pick(e){const t={};return n.util.objectKeys(e).forEach((a=>{e[a]&&this.shape[a]&&(t[a]=this.shape[a])})),new O({...this._def,shape:()=>t})}omit(e){const t={};return n.util.objectKeys(this.shape).forEach((a=>{e[a]||(t[a]=this.shape[a])})),new O({...this._def,shape:()=>t})}deepPartial(){return j(this)}partial(e){const t={};return n.util.objectKeys(this.shape).forEach((a=>{const r=this.shape[a];e&&!e[a]?t[a]=r:t[a]=r.optional()})),new O({...this._def,shape:()=>t})}required(e){const t={};return n.util.objectKeys(this.shape).forEach((a=>{if(e&&!e[a])t[a]=this.shape[a];else{let e=this.shape[a];for(;e instanceof X;)e=e._def.innerType;t[a]=e}})),new O({...this._def,shape:()=>t})}keyof(){return K(n.util.objectKeys(this.shape))}}e.ZodObject=O,O.create=(e,t)=>new O({shape:()=>e,unknownKeys:"strip",catchall:_.create(),typeName:se.ZodObject,...c(t)}),O.strictCreate=(e,t)=>new O({shape:()=>e,unknownKeys:"strict",catchall:_.create(),typeName:se.ZodObject,...c(t)}),O.lazycreate=(e,t)=>new O({shape:e,unknownKeys:"strip",catchall:_.create(),typeName:se.ZodObject,...c(t)});class M extends d{_parse(e){const{ctx:t}=this._processInputParams(e),a=this._def.options;if(t.common.async)return Promise.all(a.map((async e=>{const a={...t,common:{...t.common,issues:[]},parent:null};return{result:await e._parseAsync({data:t.data,path:t.path,parent:a}),ctx:a}}))).then((function(e){for(const t of e)if("valid"===t.result.status)return t.result;for(const a of e)if("dirty"===a.result.status)return t.common.issues.push(...a.ctx.common.issues),a.result;const a=e.map((e=>new s.ZodError(e.ctx.common.issues)));return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_union,unionErrors:a}),r.INVALID}));{let e;const n=[];for(const r of a){const a={...t,common:{...t.common,issues:[]},parent:null},s=r._parseSync({data:t.data,path:t.path,parent:a});if("valid"===s.status)return s;"dirty"!==s.status||e||(e={result:s,ctx:a}),a.common.issues.length&&n.push(a.common.issues)}if(e)return t.common.issues.push(...e.ctx.common.issues),e.result;const o=n.map((e=>new s.ZodError(e)));return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_union,unionErrors:o}),r.INVALID}}get options(){return this._def.options}}e.ZodUnion=M,M.create=(e,t)=>new M({options:e,typeName:se.ZodUnion,...c(t)});const A=e=>e instanceof V?A(e.schema):e instanceof G?A(e.innerType()):e instanceof $?[e.value]:e instanceof W?e.options:e instanceof H?Object.keys(e.enum):e instanceof Q?A(e._def.innerType):e instanceof I?[void 0]:e instanceof k?[null]:null;class D extends d{_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==n.ZodParsedType.object)return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.object,received:t.parsedType}),r.INVALID;const a=this.discriminator,o=t.data[a],i=this.optionsMap.get(o);return i?t.common.async?i._parseAsync({data:t.data,path:t.path,parent:t}):i._parseSync({data:t.data,path:t.path,parent:t}):((0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[a]}),r.INVALID)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,a){const r=new Map;for(const a of t){const t=A(a.shape[e]);if(!t)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const n of t){if(r.has(n))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(n)}`);r.set(n,a)}}return new D({typeName:se.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:r,...c(a)})}}function B(e,t){const a=(0,n.getParsedType)(e),r=(0,n.getParsedType)(t);if(e===t)return{valid:!0,data:e};if(a===n.ZodParsedType.object&&r===n.ZodParsedType.object){const a=n.util.objectKeys(t),r=n.util.objectKeys(e).filter((e=>-1!==a.indexOf(e))),s={...e,...t};for(const a of r){const r=B(e[a],t[a]);if(!r.valid)return{valid:!1};s[a]=r.data}return{valid:!0,data:s}}if(a===n.ZodParsedType.array&&r===n.ZodParsedType.array){if(e.length!==t.length)return{valid:!1};const a=[];for(let r=0;r<e.length;r++){const n=B(e[r],t[r]);if(!n.valid)return{valid:!1};a.push(n.data)}return{valid:!0,data:a}}return a===n.ZodParsedType.date&&r===n.ZodParsedType.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}e.ZodDiscriminatedUnion=D;class z extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e),n=(e,n)=>{if((0,r.isAborted)(e)||(0,r.isAborted)(n))return r.INVALID;const o=B(e.value,n.value);return o.valid?(((0,r.isDirty)(e)||(0,r.isDirty)(n))&&t.dirty(),{status:t.value,value:o.data}):((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_intersection_types}),r.INVALID)};return a.common.async?Promise.all([this._def.left._parseAsync({data:a.data,path:a.path,parent:a}),this._def.right._parseAsync({data:a.data,path:a.path,parent:a})]).then((([e,t])=>n(e,t))):n(this._def.left._parseSync({data:a.data,path:a.path,parent:a}),this._def.right._parseSync({data:a.data,path:a.path,parent:a}))}}e.ZodIntersection=z,z.create=(e,t,a)=>new z({left:e,right:t,typeName:se.ZodIntersection,...c(a)});class L extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.array)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.array,received:a.parsedType}),r.INVALID;if(a.data.length<this._def.items.length)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),r.INVALID;!this._def.rest&&a.data.length>this._def.items.length&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());const i=[...a.data].map(((e,t)=>{const r=this._def.items[t]||this._def.rest;return r?r._parse(new o(a,e,a.path,t)):null})).filter((e=>!!e));return a.common.async?Promise.all(i).then((e=>r.ParseStatus.mergeArray(t,e))):r.ParseStatus.mergeArray(t,i)}get items(){return this._def.items}rest(e){return new L({...this._def,rest:e})}}e.ZodTuple=L,L.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new L({items:e,typeName:se.ZodTuple,rest:null,...c(t)})};class Z extends d{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.object)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.object,received:a.parsedType}),r.INVALID;const i=[],c=this._def.keyType,d=this._def.valueType;for(const e in a.data)i.push({key:c._parse(new o(a,e,a.path,e)),value:d._parse(new o(a,a.data[e],a.path,e))});return a.common.async?r.ParseStatus.mergeObjectAsync(t,i):r.ParseStatus.mergeObjectSync(t,i)}get element(){return this._def.valueType}static create(e,t,a){return new Z(t instanceof d?{keyType:e,valueType:t,typeName:se.ZodRecord,...c(a)}:{keyType:S.create(),valueType:e,typeName:se.ZodRecord,...c(t)})}}e.ZodRecord=Z;class U extends d{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.map)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.map,received:a.parsedType}),r.INVALID;const i=this._def.keyType,c=this._def.valueType,d=[...a.data.entries()].map((([e,t],r)=>({key:i._parse(new o(a,e,a.path,[r,"key"])),value:c._parse(new o(a,t,a.path,[r,"value"]))})));if(a.common.async){const e=new Map;return Promise.resolve().then((async()=>{for(const a of d){const n=await a.key,s=await a.value;if("aborted"===n.status||"aborted"===s.status)return r.INVALID;"dirty"!==n.status&&"dirty"!==s.status||t.dirty(),e.set(n.value,s.value)}return{status:t.value,value:e}}))}{const e=new Map;for(const a of d){const n=a.key,s=a.value;if("aborted"===n.status||"aborted"===s.status)return r.INVALID;"dirty"!==n.status&&"dirty"!==s.status||t.dirty(),e.set(n.value,s.value)}return{status:t.value,value:e}}}}e.ZodMap=U,U.create=(e,t,a)=>new U({valueType:t,keyType:e,typeName:se.ZodMap,...c(a)});class F extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.set)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.set,received:a.parsedType}),r.INVALID;const i=this._def;null!==i.minSize&&a.data.size<i.minSize.value&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),t.dirty()),null!==i.maxSize&&a.data.size>i.maxSize.value&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),t.dirty());const c=this._def.valueType;function d(e){const a=new Set;for(const n of e){if("aborted"===n.status)return r.INVALID;"dirty"===n.status&&t.dirty(),a.add(n.value)}return{status:t.value,value:a}}const u=[...a.data.values()].map(((e,t)=>c._parse(new o(a,e,a.path,t))));return a.common.async?Promise.all(u).then((e=>d(e))):d(u)}min(e,t){return new F({...this._def,minSize:{value:e,message:a.errorUtil.toString(t)}})}max(e,t){return new F({...this._def,maxSize:{value:e,message:a.errorUtil.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}e.ZodSet=F,F.create=(e,t)=>new F({valueType:e,minSize:null,maxSize:null,typeName:se.ZodSet,...c(t)});class q extends d{constructor(){super(...arguments),this.validate=this.implement}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.function)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.function,received:a.parsedType}),r.INVALID;function o(e,n){return(0,r.makeIssue)({data:e,path:a.path,errorMaps:[a.common.contextualErrorMap,a.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:s.ZodIssueCode.invalid_arguments,argumentsError:n}})}function i(e,n){return(0,r.makeIssue)({data:e,path:a.path,errorMaps:[a.common.contextualErrorMap,a.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:s.ZodIssueCode.invalid_return_type,returnTypeError:n}})}const c={errorMap:a.common.contextualErrorMap},d=a.data;if(this._def.returns instanceof J){const e=this;return(0,r.OK)((async function(...t){const a=new s.ZodError([]),r=await e._def.args.parseAsync(t,c).catch((e=>{throw a.addIssue(o(t,e)),a})),n=await Reflect.apply(d,this,r),u=await e._def.returns._def.type.parseAsync(n,c).catch((e=>{throw a.addIssue(i(n,e)),a}));return u}))}{const e=this;return(0,r.OK)((function(...t){const a=e._def.args.safeParse(t,c);if(!a.success)throw new s.ZodError([o(t,a.error)]);const r=Reflect.apply(d,this,a.data),n=e._def.returns.safeParse(r,c);if(!n.success)throw new s.ZodError([i(r,n.error)]);return n.data}))}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new q({...this._def,args:L.create(e).rest(E.create())})}returns(e){return new q({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,t,a){return new q({args:e||L.create([]).rest(E.create()),returns:t||E.create(),typeName:se.ZodFunction,...c(a)})}}e.ZodFunction=q;class V extends d{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}e.ZodLazy=V,V.create=(e,t)=>new V({getter:e,typeName:se.ZodLazy,...c(t)});class $ extends d{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{received:t.data,code:s.ZodIssueCode.invalid_literal,expected:this._def.value}),r.INVALID}return{status:"valid",value:e.data}}get value(){return this._def.value}}function K(e,t){return new W({values:e,typeName:se.ZodEnum,...c(t)})}e.ZodLiteral=$,$.create=(e,t)=>new $({value:e,typeName:se.ZodLiteral,...c(t)});class W extends d{_parse(e){if("string"!=typeof e.data){const t=this._getOrReturnCtx(e),a=this._def.values;return(0,r.addIssueToContext)(t,{expected:n.util.joinValues(a),received:t.parsedType,code:s.ZodIssueCode.invalid_type}),r.INVALID}if(-1===this._def.values.indexOf(e.data)){const t=this._getOrReturnCtx(e),a=this._def.values;return(0,r.addIssueToContext)(t,{received:t.data,code:s.ZodIssueCode.invalid_enum_value,options:a}),r.INVALID}return(0,r.OK)(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values)e[t]=t;return e}get Values(){const e={};for(const t of this._def.values)e[t]=t;return e}get Enum(){const e={};for(const t of this._def.values)e[t]=t;return e}extract(e){return W.create(e)}exclude(e){return W.create(this.options.filter((t=>!e.includes(t))))}}e.ZodEnum=W,W.create=K;class H extends d{_parse(e){const t=n.util.getValidEnumValues(this._def.values),a=this._getOrReturnCtx(e);if(a.parsedType!==n.ZodParsedType.string&&a.parsedType!==n.ZodParsedType.number){const e=n.util.objectValues(t);return(0,r.addIssueToContext)(a,{expected:n.util.joinValues(e),received:a.parsedType,code:s.ZodIssueCode.invalid_type}),r.INVALID}if(-1===t.indexOf(e.data)){const e=n.util.objectValues(t);return(0,r.addIssueToContext)(a,{received:a.data,code:s.ZodIssueCode.invalid_enum_value,options:e}),r.INVALID}return(0,r.OK)(e.data)}get enum(){return this._def.values}}e.ZodNativeEnum=H,H.create=(e,t)=>new H({values:e,typeName:se.ZodNativeEnum,...c(t)});class J extends d{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==n.ZodParsedType.promise&&!1===t.common.async)return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.promise,received:t.parsedType}),r.INVALID;const a=t.parsedType===n.ZodParsedType.promise?t.data:Promise.resolve(t.data);return(0,r.OK)(a.then((e=>this._def.type.parseAsync(e,{path:t.path,errorMap:t.common.contextualErrorMap}))))}}e.ZodPromise=J,J.create=(e,t)=>new J({type:e,typeName:se.ZodPromise,...c(t)});class G extends d{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===se.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:a}=this._processInputParams(e),s=this._def.effect||null,o={addIssue:e=>{(0,r.addIssueToContext)(a,e),e.fatal?t.abort():t.dirty()},get path(){return a.path}};if(o.addIssue=o.addIssue.bind(o),"preprocess"===s.type){const e=s.transform(a.data,o);return a.common.issues.length?{status:"dirty",value:a.data}:a.common.async?Promise.resolve(e).then((e=>this._def.schema._parseAsync({data:e,path:a.path,parent:a}))):this._def.schema._parseSync({data:e,path:a.path,parent:a})}if("refinement"===s.type){const e=e=>{const t=s.refinement(e,o);if(a.common.async)return Promise.resolve(t);if(t instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return e};if(!1===a.common.async){const n=this._def.schema._parseSync({data:a.data,path:a.path,parent:a});return"aborted"===n.status?r.INVALID:("dirty"===n.status&&t.dirty(),e(n.value),{status:t.value,value:n.value})}return this._def.schema._parseAsync({data:a.data,path:a.path,parent:a}).then((a=>"aborted"===a.status?r.INVALID:("dirty"===a.status&&t.dirty(),e(a.value).then((()=>({status:t.value,value:a.value}))))))}if("transform"===s.type){if(!1===a.common.async){const e=this._def.schema._parseSync({data:a.data,path:a.path,parent:a});if(!(0,r.isValid)(e))return e;const n=s.transform(e.value,o);if(n instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:n}}return this._def.schema._parseAsync({data:a.data,path:a.path,parent:a}).then((e=>(0,r.isValid)(e)?Promise.resolve(s.transform(e.value,o)).then((e=>({status:t.value,value:e}))):e))}n.util.assertNever(s)}}e.ZodEffects=G,e.ZodTransformer=G,G.create=(e,t,a)=>new G({schema:e,typeName:se.ZodEffects,effect:t,...c(a)}),G.createWithPreprocess=(e,t,a)=>new G({schema:t,effect:{type:"preprocess",transform:e},typeName:se.ZodEffects,...c(a)});class X extends d{_parse(e){return this._getType(e)===n.ZodParsedType.undefined?(0,r.OK)(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodOptional=X,X.create=(e,t)=>new X({innerType:e,typeName:se.ZodOptional,...c(t)});class Y extends d{_parse(e){return this._getType(e)===n.ZodParsedType.null?(0,r.OK)(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodNullable=Y,Y.create=(e,t)=>new Y({innerType:e,typeName:se.ZodNullable,...c(t)});class Q extends d{_parse(e){const{ctx:t}=this._processInputParams(e);let a=t.data;return t.parsedType===n.ZodParsedType.undefined&&(a=this._def.defaultValue()),this._def.innerType._parse({data:a,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}e.ZodDefault=Q,Q.create=(e,t)=>new Q({innerType:e,typeName:se.ZodDefault,defaultValue:"function"==typeof t.default?t.default:()=>t.default,...c(t)});class ee extends d{_parse(e){const{ctx:t}=this._processInputParams(e),a={...t,common:{...t.common,issues:[]}},n=this._def.innerType._parse({data:a.data,path:a.path,parent:{...a}});return(0,r.isAsync)(n)?n.then((e=>({status:"valid",value:"valid"===e.status?e.value:this._def.catchValue({get error(){return new s.ZodError(a.common.issues)},input:a.data})}))):{status:"valid",value:"valid"===n.status?n.value:this._def.catchValue({get error(){return new s.ZodError(a.common.issues)},input:a.data})}}removeCatch(){return this._def.innerType}}e.ZodCatch=ee,ee.create=(e,t)=>new ee({innerType:e,typeName:se.ZodCatch,catchValue:"function"==typeof t.catch?t.catch:()=>t.catch,...c(t)});class te extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.nan){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.nan,received:t.parsedType}),r.INVALID}return{status:"valid",value:e.data}}}e.ZodNaN=te,te.create=e=>new te({typeName:se.ZodNaN,...c(e)}),e.BRAND=Symbol("zod_brand");class ae extends d{_parse(e){const{ctx:t}=this._processInputParams(e),a=t.data;return this._def.type._parse({data:a,path:t.path,parent:t})}unwrap(){return this._def.type}}e.ZodBranded=ae;class re extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.common.async){return(async()=>{const e=await this._def.in._parseAsync({data:a.data,path:a.path,parent:a});return"aborted"===e.status?r.INVALID:"dirty"===e.status?(t.dirty(),(0,r.DIRTY)(e.value)):this._def.out._parseAsync({data:e.value,path:a.path,parent:a})})()}{const e=this._def.in._parseSync({data:a.data,path:a.path,parent:a});return"aborted"===e.status?r.INVALID:"dirty"===e.status?(t.dirty(),{status:"dirty",value:e.value}):this._def.out._parseSync({data:e.value,path:a.path,parent:a})}}static create(e,t){return new re({in:e,out:t,typeName:se.ZodPipeline})}}e.ZodPipeline=re;class ne extends d{_parse(e){const t=this._def.innerType._parse(e);return(0,r.isValid)(t)&&(t.value=Object.freeze(t.value)),t}}e.ZodReadonly=ne,ne.create=(e,t)=>new ne({innerType:e,typeName:se.ZodReadonly,...c(t)});var se;e.custom=(e,t={},a)=>e?R.create().superRefine(((r,n)=>{var s,o;if(!e(r)){const e="function"==typeof t?t(r):"string"==typeof t?{message:t}:t,i=null===(o=null!==(s=e.fatal)&&void 0!==s?s:a)||void 0===o||o,c="string"==typeof e?{message:e}:e;n.addIssue({code:"custom",...c,fatal:i})}})):R.create(),e.late={object:O.lazycreate},function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"}(se=e.ZodFirstPartyTypeKind||(e.ZodFirstPartyTypeKind={}));e.instanceof=(t,a={message:`Input not instance of ${t.name}`})=>(0,e.custom)((e=>e instanceof t),a);const oe=S.create;e.string=oe;const ie=w.create;e.number=ie;const ce=te.create;e.nan=ce;const de=C.create;e.bigint=de;const ue=b.create;e.boolean=ue;const le=x.create;e.date=le;const he=P.create;e.symbol=he;const pe=I.create;e.undefined=pe;const me=k.create;e.null=me;const fe=R.create;e.any=fe;const ge=E.create;e.unknown=ge;const ye=_.create;e.never=ye;const Se=T.create;e.void=Se;const ve=N.create;e.array=ve;const we=O.create;e.object=we;const Ce=O.strictCreate;e.strictObject=Ce;const be=M.create;e.union=be;const xe=D.create;e.discriminatedUnion=xe;const Pe=z.create;e.intersection=Pe;const Ie=L.create;e.tuple=Ie;const ke=Z.create;e.record=ke;const Re=U.create;e.map=Re;const Ee=F.create;e.set=Ee;const _e=q.create;e.function=_e;const Te=V.create;e.lazy=Te;const Ne=$.create;e.literal=Ne;const je=W.create;e.enum=je;const Oe=H.create;e.nativeEnum=Oe;const Me=J.create;e.promise=Me;const Ae=G.create;e.effect=Ae,e.transformer=Ae;const De=X.create;e.optional=De;const Be=Y.create;e.nullable=Be;const ze=G.createWithPreprocess;e.preprocess=ze;const Le=re.create;e.pipeline=Le;e.ostring=()=>oe().optional();e.onumber=()=>ie().optional();e.oboolean=()=>ue().optional(),e.coerce={string:e=>S.create({...e,coerce:!0}),number:e=>w.create({...e,coerce:!0}),boolean:e=>b.create({...e,coerce:!0}),bigint:e=>C.create({...e,coerce:!0}),date:e=>x.create({...e,coerce:!0})},e.NEVER=r.INVALID}(fn),function(t){var a=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),r=e&&e.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),r(en,t),r(hn,t),r(pn,t),r(an,t),r(fn,t),r(rn,t)}(Qr),function(t){var a=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),r=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&a(t,e,n);return r(t,e),t},s=e&&e.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.z=void 0;const o=n(Qr);t.z=o,s(Qr,t),t.default=o}(Yr);var yn={},Sn=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(yn,"__esModule",{value:!0}),yn.Permissions=yn.PermissionsCommandSchema=void 0;const vn=Sn(Yr);var wn;yn.PermissionsCommandSchema=vn.default.lazy((()=>wn.SetPermissionSchema)),function(e){e.PermissionDescriptorSchema=vn.default.lazy((()=>vn.default.object({name:vn.default.string()})))}(wn||(yn.Permissions=wn={})),function(e){e.PermissionStateSchema=vn.default.lazy((()=>vn.default.enum(["granted","denied","prompt"])))}(wn||(yn.Permissions=wn={})),function(e){e.SetPermissionSchema=vn.default.lazy((()=>vn.default.object({method:vn.default.literal("permissions.setPermission"),params:e.SetPermissionParametersSchema})))}(wn||(yn.Permissions=wn={})),function(e){e.SetPermissionParametersSchema=vn.default.lazy((()=>vn.default.object({descriptor:e.PermissionDescriptorSchema,state:e.PermissionStateSchema,origin:vn.default.string()})))}(wn||(yn.Permissions=wn={}));var Cn={};!function(t){var a=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Input=t.InputCommandSchema=t.Log=t.LogEventSchema=t.Storage=t.StorageResultSchema=t.StorageCommandSchema=t.Script=t.ScriptResultSchema=t.ScriptCommandSchema=t.ScriptEventSchema=t.Network=t.NetworkResultSchema=t.NetworkEventSchema=t.NetworkCommandSchema=t.BrowsingContext=t.BrowsingContextResultSchema=t.BrowsingContextEventSchema=t.BrowsingContextCommandSchema=t.Browser=t.BrowserCommandSchema=t.SessionResultSchema=t.Session=t.SessionCommandSchema=t.ErrorCodeSchema=t.JsUintSchema=t.JsIntSchema=t.ExtensibleSchema=t.EmptyResultSchema=t.ErrorResponseSchema=t.MessageSchema=t.EmptyParamsSchema=t.ResultDataSchema=t.CommandDataSchema=t.EventDataSchema=t.CommandResponseSchema=t.CommandSchema=t.EventSchema=void 0;const r=a(Yr);var n,s,o,i,c,d,u,l;t.EventSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("event")}).and(t.EventDataSchema).and(t.ExtensibleSchema))),t.CommandSchema=r.default.lazy((()=>r.default.object({id:t.JsUintSchema}).and(t.CommandDataSchema).and(t.ExtensibleSchema))),t.CommandResponseSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("success"),id:t.JsUintSchema,result:t.ResultDataSchema}).and(t.ExtensibleSchema))),t.EventDataSchema=r.default.lazy((()=>r.default.union([t.BrowsingContextEventSchema,t.LogEventSchema,t.NetworkEventSchema,t.ScriptEventSchema]))),t.CommandDataSchema=r.default.lazy((()=>r.default.union([t.BrowserCommandSchema,t.BrowsingContextCommandSchema,t.InputCommandSchema,t.NetworkCommandSchema,t.ScriptCommandSchema,t.SessionCommandSchema,t.StorageCommandSchema]))),t.ResultDataSchema=r.default.lazy((()=>r.default.union([t.BrowsingContextResultSchema,t.EmptyResultSchema,t.NetworkResultSchema,t.ScriptResultSchema,t.SessionResultSchema,t.StorageResultSchema]))),t.EmptyParamsSchema=r.default.lazy((()=>t.ExtensibleSchema)),t.MessageSchema=r.default.lazy((()=>r.default.union([t.CommandResponseSchema,t.ErrorResponseSchema,t.EventSchema]))),t.ErrorResponseSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("error"),id:r.default.union([t.JsUintSchema,r.default.null()]),error:t.ErrorCodeSchema,message:r.default.string(),stacktrace:r.default.string().optional()}).and(t.ExtensibleSchema))),t.EmptyResultSchema=r.default.lazy((()=>t.ExtensibleSchema)),t.ExtensibleSchema=r.default.lazy((()=>r.default.record(r.default.string(),r.default.any()))),t.JsIntSchema=r.default.lazy((()=>r.default.number().int().gte(-9007199254740991).lte(9007199254740991))),t.JsUintSchema=r.default.lazy((()=>r.default.number().int().nonnegative().gte(0).lte(9007199254740991))),t.ErrorCodeSchema=r.default.lazy((()=>r.default.enum(["invalid argument","invalid session id","move target out of bounds","no such alert","no such element","no such frame","no such handle","no such history entry","no such intercept","no such node","no such request","no such script","no such storage partition","session not created","unable to capture screen","unable to close browser","unable to set cookie","unable to set file input","underspecified storage partition","unknown command","unknown error","unsupported operation"]))),t.SessionCommandSchema=r.default.lazy((()=>r.default.union([n.EndSchema,n.NewSchema,n.StatusSchema,n.SubscribeSchema,n.UnsubscribeSchema]))),function(e){e.ProxyConfigurationSchema=r.default.lazy((()=>r.default.union([e.AutodetectProxyConfigurationSchema,e.DirectProxyConfigurationSchema,e.ManualProxyConfigurationSchema,e.PacProxyConfigurationSchema,e.SystemProxyConfigurationSchema,r.default.object({})])))}(n||(t.Session=n={})),t.SessionResultSchema=r.default.lazy((()=>r.default.union([n.NewResultSchema,n.StatusResultSchema]))),function(e){e.CapabilitiesRequestSchema=r.default.lazy((()=>r.default.object({alwaysMatch:e.CapabilityRequestSchema.optional(),firstMatch:r.default.array(e.CapabilityRequestSchema).optional()})))}(n||(t.Session=n={})),function(e){e.CapabilityRequestSchema=r.default.lazy((()=>r.default.object({acceptInsecureCerts:r.default.boolean().optional(),browserName:r.default.string().optional(),browserVersion:r.default.string().optional(),platformName:r.default.string().optional(),proxy:e.ProxyConfigurationSchema.optional(),webSocketUrl:r.default.boolean().optional()}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.AutodetectProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("autodetect")}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.DirectProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("direct")}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.ManualProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("manual"),ftpProxy:r.default.string().optional(),httpProxy:r.default.string().optional(),sslProxy:r.default.string().optional()}).and(e.SocksProxyConfigurationSchema.or(r.default.object({}))).and(r.default.object({noProxy:r.default.array(r.default.string()).optional()})).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.SocksProxyConfigurationSchema=r.default.lazy((()=>r.default.object({socksProxy:r.default.string(),socksVersion:r.default.number().int().nonnegative().gte(0).lte(255)})))}(n||(t.Session=n={})),function(e){e.PacProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("pac"),proxyAutoconfigUrl:r.default.string()}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.SystemProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("system")}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.SubscriptionRequestSchema=r.default.lazy((()=>r.default.object({events:r.default.array(r.default.string()),contexts:r.default.array(o.BrowsingContextSchema).optional()})))}(n||(t.Session=n={})),function(e){e.StatusSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.status"),params:t.EmptyParamsSchema})))}(n||(t.Session=n={})),function(e){e.StatusResultSchema=r.default.lazy((()=>r.default.object({ready:r.default.boolean(),message:r.default.string()})))}(n||(t.Session=n={})),function(e){e.NewSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.new"),params:e.NewParametersSchema})))}(n||(t.Session=n={})),function(e){e.NewParametersSchema=r.default.lazy((()=>r.default.object({capabilities:e.CapabilitiesRequestSchema})))}(n||(t.Session=n={})),function(e){e.NewResultSchema=r.default.lazy((()=>r.default.object({sessionId:r.default.string(),capabilities:r.default.object({acceptInsecureCerts:r.default.boolean(),browserName:r.default.string(),browserVersion:r.default.string(),platformName:r.default.string(),setWindowRect:r.default.boolean(),proxy:e.ProxyConfigurationSchema.optional(),webSocketUrl:r.default.string().optional()}).and(t.ExtensibleSchema)})))}(n||(t.Session=n={})),function(e){e.EndSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.end"),params:t.EmptyParamsSchema})))}(n||(t.Session=n={})),function(e){e.SubscribeSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.subscribe"),params:e.SubscriptionRequestSchema})))}(n||(t.Session=n={})),function(e){e.UnsubscribeSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.unsubscribe"),params:e.SubscriptionRequestSchema})))}(n||(t.Session=n={})),t.BrowserCommandSchema=r.default.lazy((()=>s.CloseSchema)),function(e){e.CloseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browser.close"),params:t.EmptyParamsSchema})))}(s||(t.Browser=s={})),t.BrowsingContextCommandSchema=r.default.lazy((()=>r.default.union([o.ActivateSchema,o.CaptureScreenshotSchema,o.CloseSchema,o.CreateSchema,o.GetTreeSchema,o.HandleUserPromptSchema,o.LocateNodesSchema,o.NavigateSchema,o.PrintSchema,o.ReloadSchema,o.SetViewportSchema,o.TraverseHistorySchema]))),t.BrowsingContextEventSchema=r.default.lazy((()=>r.default.union([o.ContextCreatedSchema,o.ContextDestroyedSchema,o.DomContentLoadedSchema,o.DownloadWillBeginSchema,o.FragmentNavigatedSchema,o.LoadSchema,o.NavigationAbortedSchema,o.NavigationFailedSchema,o.NavigationStartedSchema,o.UserPromptClosedSchema,o.UserPromptOpenedSchema]))),t.BrowsingContextResultSchema=r.default.lazy((()=>r.default.union([o.CaptureScreenshotResultSchema,o.CreateResultSchema,o.GetTreeResultSchema,o.LocateNodesResultSchema,o.NavigateResultSchema,o.PrintResultSchema,o.TraverseHistoryResultSchema]))),function(e){e.BrowsingContextSchema=r.default.lazy((()=>r.default.string()))}(o||(t.BrowsingContext=o={})),function(e){e.InfoListSchema=r.default.lazy((()=>r.default.array(e.InfoSchema)))}(o||(t.BrowsingContext=o={})),function(e){e.InfoSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,url:r.default.string(),children:r.default.union([e.InfoListSchema,r.default.null()]),parent:r.default.union([e.BrowsingContextSchema,r.default.null()]).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.LocatorSchema=r.default.lazy((()=>r.default.union([e.CssLocatorSchema,e.InnerTextLocatorSchema,e.XPathLocatorSchema])))}(o||(t.BrowsingContext=o={})),function(e){e.CssLocatorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("css"),value:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.InnerTextLocatorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("innerText"),value:r.default.string(),ignoreCase:r.default.boolean().optional(),matchType:r.default.enum(["full","partial"]).optional(),maxDepth:t.JsUintSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.XPathLocatorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("xpath"),value:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationSchema=r.default.lazy((()=>r.default.string()))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationInfoSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,navigation:r.default.union([e.NavigationSchema,r.default.null()]),timestamp:t.JsUintSchema,url:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.ReadinessStateSchema=r.default.lazy((()=>r.default.enum(["none","interactive","complete"])))}(o||(t.BrowsingContext=o={})),function(e){e.ActivateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.activate"),params:e.ActivateParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ActivateParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.CaptureScreenshotParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,origin:r.default.enum(["viewport","document"]).default("viewport").optional(),format:e.ImageFormatSchema.optional(),clip:e.ClipRectangleSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.CaptureScreenshotSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.captureScreenshot"),params:e.CaptureScreenshotParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ImageFormatSchema=r.default.lazy((()=>r.default.object({type:r.default.string(),quality:r.default.number().gte(0).lte(1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.ClipRectangleSchema=r.default.lazy((()=>r.default.union([e.BoxClipRectangleSchema,e.ElementClipRectangleSchema])))}(o||(t.BrowsingContext=o={})),function(e){e.ElementClipRectangleSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("element"),element:c.SharedReferenceSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.BoxClipRectangleSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("box"),x:r.default.number(),y:r.default.number(),width:r.default.number(),height:r.default.number()})))}(o||(t.BrowsingContext=o={})),function(e){e.CaptureScreenshotResultSchema=r.default.lazy((()=>r.default.object({data:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.CloseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.close"),params:e.CloseParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.CloseParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,promptUnload:r.default.boolean().default(!1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.CreateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.create"),params:e.CreateParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.CreateTypeSchema=r.default.lazy((()=>r.default.enum(["tab","window"])))}(o||(t.BrowsingContext=o={})),function(e){e.CreateParametersSchema=r.default.lazy((()=>r.default.object({type:e.CreateTypeSchema,referenceContext:e.BrowsingContextSchema.optional(),background:r.default.boolean().default(!1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.CreateResultSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.GetTreeSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.getTree"),params:e.GetTreeParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.GetTreeParametersSchema=r.default.lazy((()=>r.default.object({maxDepth:t.JsUintSchema.optional(),root:e.BrowsingContextSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.GetTreeResultSchema=r.default.lazy((()=>r.default.object({contexts:e.InfoListSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.HandleUserPromptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.handleUserPrompt"),params:e.HandleUserPromptParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.HandleUserPromptParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,accept:r.default.boolean().optional(),userText:r.default.string().optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.LocateNodesParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,locator:e.LocatorSchema,maxNodeCount:t.JsUintSchema.gte(1).optional(),ownership:c.ResultOwnershipSchema.optional(),sandbox:r.default.string().optional(),serializationOptions:c.SerializationOptionsSchema.optional(),startNodes:r.default.array(c.SharedReferenceSchema).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.LocateNodesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.locateNodes"),params:e.LocateNodesParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.LocateNodesResultSchema=r.default.lazy((()=>r.default.object({nodes:r.default.array(c.NodeRemoteValueSchema)})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigate"),params:e.NavigateParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigateParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,url:r.default.string(),wait:e.ReadinessStateSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigateResultSchema=r.default.lazy((()=>r.default.object({navigation:r.default.union([e.NavigationSchema,r.default.null()]),url:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.print"),params:e.PrintParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,background:r.default.boolean().default(!1).optional(),margin:e.PrintMarginParametersSchema.optional(),orientation:r.default.enum(["portrait","landscape"]).default("portrait").optional(),page:e.PrintPageParametersSchema.optional(),pageRanges:r.default.array(r.default.union([t.JsUintSchema,r.default.string()])).optional(),scale:r.default.number().gte(.1).lte(2).default(1).optional(),shrinkToFit:r.default.boolean().default(!0).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintMarginParametersSchema=r.default.lazy((()=>r.default.object({bottom:r.default.number().gte(0).default(1).optional(),left:r.default.number().gte(0).default(1).optional(),right:r.default.number().gte(0).default(1).optional(),top:r.default.number().gte(0).default(1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintPageParametersSchema=r.default.lazy((()=>r.default.object({height:r.default.number().gte(.0352).default(27.94).optional(),width:r.default.number().gte(.0352).default(21.59).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintResultSchema=r.default.lazy((()=>r.default.object({data:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.ReloadSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.reload"),params:e.ReloadParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ReloadParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,ignoreCache:r.default.boolean().optional(),wait:e.ReadinessStateSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.SetViewportSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.setViewport"),params:e.SetViewportParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.SetViewportParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,viewport:r.default.union([e.ViewportSchema,r.default.null()]).optional(),devicePixelRatio:r.default.union([r.default.number().gt(0),r.default.null()]).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.ViewportSchema=r.default.lazy((()=>r.default.object({width:t.JsUintSchema,height:t.JsUintSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.TraverseHistorySchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.traverseHistory"),params:e.TraverseHistoryParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.TraverseHistoryParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,delta:t.JsIntSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.TraverseHistoryResultSchema=r.default.lazy((()=>r.default.object({})))}(o||(t.BrowsingContext=o={})),function(e){e.ContextCreatedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.contextCreated"),params:e.InfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ContextDestroyedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.contextDestroyed"),params:e.InfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationStartedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigationStarted"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.FragmentNavigatedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.fragmentNavigated"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.DomContentLoadedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.domContentLoaded"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.LoadSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.load"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.DownloadWillBeginSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.downloadWillBegin"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationAbortedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigationAborted"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationFailedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigationFailed"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptClosedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.userPromptClosed"),params:e.UserPromptClosedParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptClosedParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,accepted:r.default.boolean(),userText:r.default.string().optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptOpenedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.userPromptOpened"),params:e.UserPromptOpenedParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptOpenedParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,type:r.default.enum(["alert","confirm","prompt","beforeunload"]),message:r.default.string(),defaultValue:r.default.string().optional()})))}(o||(t.BrowsingContext=o={})),t.NetworkCommandSchema=r.default.lazy((()=>r.default.union([i.AddInterceptSchema,i.ContinueRequestSchema,i.ContinueResponseSchema,i.ContinueWithAuthSchema,i.FailRequestSchema,i.ProvideResponseSchema,i.RemoveInterceptSchema]))),t.NetworkEventSchema=r.default.lazy((()=>r.default.union([i.AuthRequiredSchema,i.BeforeRequestSentSchema,i.FetchErrorSchema,i.ResponseCompletedSchema,i.ResponseStartedSchema]))),t.NetworkResultSchema=r.default.lazy((()=>i.AddInterceptResultSchema)),function(e){e.AuthChallengeSchema=r.default.lazy((()=>r.default.object({scheme:r.default.string(),realm:r.default.string()})))}(i||(t.Network=i={})),function(e){e.AuthCredentialsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("password"),username:r.default.string(),password:r.default.string()})))}(i||(t.Network=i={})),function(e){e.BaseParametersSchema=r.default.lazy((()=>r.default.object({context:r.default.union([o.BrowsingContextSchema,r.default.null()]),isBlocked:r.default.boolean(),navigation:r.default.union([o.NavigationSchema,r.default.null()]),redirectCount:t.JsUintSchema,request:e.RequestDataSchema,timestamp:t.JsUintSchema,intercepts:r.default.array(e.InterceptSchema).optional()})))}(i||(t.Network=i={})),function(e){e.BytesValueSchema=r.default.lazy((()=>r.default.union([e.StringValueSchema,e.Base64ValueSchema])))}(i||(t.Network=i={})),function(e){e.StringValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("string"),value:r.default.string()})))}(i||(t.Network=i={})),function(e){e.Base64ValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("base64"),value:r.default.string()})))}(i||(t.Network=i={})),function(e){e.SameSiteSchema=r.default.lazy((()=>r.default.enum(["strict","lax","none"])))}(i||(t.Network=i={})),function(e){e.CookieSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema,domain:r.default.string(),path:r.default.string(),size:t.JsUintSchema,httpOnly:r.default.boolean(),secure:r.default.boolean(),sameSite:e.SameSiteSchema,expiry:t.JsUintSchema.optional()}).and(t.ExtensibleSchema)))}(i||(t.Network=i={})),function(e){e.CookieHeaderSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema})))}(i||(t.Network=i={})),function(e){e.FetchTimingInfoSchema=r.default.lazy((()=>r.default.object({timeOrigin:r.default.number(),requestTime:r.default.number(),redirectStart:r.default.number(),redirectEnd:r.default.number(),fetchStart:r.default.number(),dnsStart:r.default.number(),dnsEnd:r.default.number(),connectStart:r.default.number(),connectEnd:r.default.number(),tlsStart:r.default.number(),requestStart:r.default.number(),responseStart:r.default.number(),responseEnd:r.default.number()})))}(i||(t.Network=i={})),function(e){e.HeaderSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema})))}(i||(t.Network=i={})),function(e){e.InitiatorSchema=r.default.lazy((()=>r.default.object({type:r.default.enum(["parser","script","preflight","other"]),columnNumber:t.JsUintSchema.optional(),lineNumber:t.JsUintSchema.optional(),stackTrace:c.StackTraceSchema.optional(),request:e.RequestSchema.optional()})))}(i||(t.Network=i={})),function(e){e.InterceptSchema=r.default.lazy((()=>r.default.string()))}(i||(t.Network=i={})),function(e){e.RequestSchema=r.default.lazy((()=>r.default.string()))}(i||(t.Network=i={})),function(e){e.RequestDataSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,url:r.default.string(),method:r.default.string(),headers:r.default.array(e.HeaderSchema),cookies:r.default.array(e.CookieSchema),headersSize:t.JsUintSchema,bodySize:r.default.union([t.JsUintSchema,r.default.null()]),timings:e.FetchTimingInfoSchema})))}(i||(t.Network=i={})),function(e){e.ResponseContentSchema=r.default.lazy((()=>r.default.object({size:t.JsUintSchema})))}(i||(t.Network=i={})),function(e){e.ResponseDataSchema=r.default.lazy((()=>r.default.object({url:r.default.string(),protocol:r.default.string(),status:t.JsUintSchema,statusText:r.default.string(),fromCache:r.default.boolean(),headers:r.default.array(e.HeaderSchema),mimeType:r.default.string(),bytesReceived:t.JsUintSchema,headersSize:r.default.union([t.JsUintSchema,r.default.null()]),bodySize:r.default.union([t.JsUintSchema,r.default.null()]),content:e.ResponseContentSchema,authChallenge:e.AuthChallengeSchema.optional()})))}(i||(t.Network=i={})),function(e){e.SetCookieHeaderSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema,domain:r.default.string().optional(),httpOnly:r.default.boolean().optional(),expiry:r.default.string().optional(),maxAge:t.JsIntSchema.optional(),path:r.default.string().optional(),sameSite:e.SameSiteSchema.optional(),secure:r.default.boolean().optional()})))}(i||(t.Network=i={})),function(e){e.UrlPatternSchema=r.default.lazy((()=>r.default.union([e.UrlPatternPatternSchema,e.UrlPatternStringSchema])))}(i||(t.Network=i={})),function(e){e.UrlPatternPatternSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pattern"),protocol:r.default.string().optional(),hostname:r.default.string().optional(),port:r.default.string().optional(),pathname:r.default.string().optional(),search:r.default.string().optional()})))}(i||(t.Network=i={})),function(e){e.UrlPatternStringSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("string"),pattern:r.default.string()})))}(i||(t.Network=i={})),function(e){e.AddInterceptParametersSchema=r.default.lazy((()=>r.default.object({phases:r.default.array(e.InterceptPhaseSchema),urlPatterns:r.default.array(e.UrlPatternSchema).optional()})))}(i||(t.Network=i={})),function(e){e.AddInterceptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.addIntercept"),params:e.AddInterceptParametersSchema})))}(i||(t.Network=i={})),function(e){e.InterceptPhaseSchema=r.default.lazy((()=>r.default.enum(["beforeRequestSent","responseStarted","authRequired"])))}(i||(t.Network=i={})),function(e){e.AddInterceptResultSchema=r.default.lazy((()=>r.default.object({intercept:e.InterceptSchema})))}(i||(t.Network=i={})),function(e){e.ContinueRequestSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.continueRequest"),params:e.ContinueRequestParametersSchema})))}(i||(t.Network=i={})),function(e){e.ContinueRequestParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,body:e.BytesValueSchema.optional(),cookies:r.default.array(e.CookieHeaderSchema).optional(),headers:r.default.array(e.HeaderSchema).optional(),method:r.default.string().optional(),url:r.default.string().optional()})))}(i||(t.Network=i={})),function(e){e.ContinueResponseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.continueResponse"),params:e.ContinueResponseParametersSchema})))}(i||(t.Network=i={})),function(e){e.ContinueResponseParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,cookies:r.default.array(e.SetCookieHeaderSchema).optional(),credentials:e.AuthCredentialsSchema.optional(),headers:r.default.array(e.HeaderSchema).optional(),reasonPhrase:r.default.string().optional(),statusCode:t.JsUintSchema.optional()})))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.continueWithAuth"),params:e.ContinueWithAuthParametersSchema})))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema}).and(r.default.union([e.ContinueWithAuthCredentialsSchema,e.ContinueWithAuthNoCredentialsSchema]))))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthCredentialsSchema=r.default.lazy((()=>r.default.object({action:r.default.literal("provideCredentials"),credentials:e.AuthCredentialsSchema})))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthNoCredentialsSchema=r.default.lazy((()=>r.default.object({action:r.default.enum(["default","cancel"])})))}(i||(t.Network=i={})),function(e){e.FailRequestSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.failRequest"),params:e.FailRequestParametersSchema})))}(i||(t.Network=i={})),function(e){e.FailRequestParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema})))}(i||(t.Network=i={})),function(e){e.ProvideResponseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.provideResponse"),params:e.ProvideResponseParametersSchema})))}(i||(t.Network=i={})),function(e){e.ProvideResponseParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,body:e.BytesValueSchema.optional(),cookies:r.default.array(e.SetCookieHeaderSchema).optional(),headers:r.default.array(e.HeaderSchema).optional(),reasonPhrase:r.default.string().optional(),statusCode:t.JsUintSchema.optional()})))}(i||(t.Network=i={})),function(e){e.RemoveInterceptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.removeIntercept"),params:e.RemoveInterceptParametersSchema})))}(i||(t.Network=i={})),function(e){e.RemoveInterceptParametersSchema=r.default.lazy((()=>r.default.object({intercept:e.InterceptSchema})))}(i||(t.Network=i={})),t.ScriptEventSchema=r.default.lazy((()=>r.default.union([c.MessageSchema,c.RealmCreatedSchema,c.RealmDestroyedSchema]))),function(e){e.AuthRequiredParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({response:e.ResponseDataSchema}))))}(i||(t.Network=i={})),function(e){e.BeforeRequestSentParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({initiator:e.InitiatorSchema}))))}(i||(t.Network=i={})),function(e){e.FetchErrorParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({errorText:r.default.string()}))))}(i||(t.Network=i={})),function(e){e.ResponseCompletedParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({response:e.ResponseDataSchema}))))}(i||(t.Network=i={})),function(e){e.ResponseStartedParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({response:e.ResponseDataSchema}))))}(i||(t.Network=i={})),t.ScriptCommandSchema=r.default.lazy((()=>r.default.union([c.AddPreloadScriptSchema,c.CallFunctionSchema,c.DisownSchema,c.EvaluateSchema,c.GetRealmsSchema,c.RemovePreloadScriptSchema]))),t.ScriptResultSchema=r.default.lazy((()=>r.default.union([c.AddPreloadScriptResultSchema,c.EvaluateResultSchema,c.GetRealmsResultSchema]))),function(e){e.AuthRequiredSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.authRequired"),params:e.AuthRequiredParametersSchema})))}(i||(t.Network=i={})),function(e){e.BeforeRequestSentSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.beforeRequestSent"),params:e.BeforeRequestSentParametersSchema})))}(i||(t.Network=i={})),function(e){e.FetchErrorSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.fetchError"),params:e.FetchErrorParametersSchema})))}(i||(t.Network=i={})),function(e){e.ResponseCompletedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.responseCompleted"),params:e.ResponseCompletedParametersSchema})))}(i||(t.Network=i={})),function(e){e.ResponseStartedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.responseStarted"),params:e.ResponseStartedParametersSchema})))}(i||(t.Network=i={})),function(e){e.ChannelSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.EvaluateResultSuccessSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("success"),result:e.RemoteValueSchema,realm:e.RealmSchema})))}(c||(t.Script=c={})),function(e){e.ExceptionDetailsSchema=r.default.lazy((()=>r.default.object({columnNumber:t.JsUintSchema,exception:e.RemoteValueSchema,lineNumber:t.JsUintSchema,stackTrace:e.StackTraceSchema,text:r.default.string()})))}(c||(t.Script=c={})),function(e){e.ChannelValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("channel"),value:e.ChannelPropertiesSchema})))}(c||(t.Script=c={})),function(e){e.ChannelPropertiesSchema=r.default.lazy((()=>r.default.object({channel:e.ChannelSchema,serializationOptions:e.SerializationOptionsSchema.optional(),ownership:e.ResultOwnershipSchema.optional()})))}(c||(t.Script=c={})),function(e){e.EvaluateResultSchema=r.default.lazy((()=>r.default.union([e.EvaluateResultSuccessSchema,e.EvaluateResultExceptionSchema])))}(c||(t.Script=c={})),function(e){e.EvaluateResultExceptionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("exception"),exceptionDetails:e.ExceptionDetailsSchema,realm:e.RealmSchema})))}(c||(t.Script=c={})),function(e){e.HandleSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.InternalIdSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.ListLocalValueSchema=r.default.lazy((()=>r.default.array(e.LocalValueSchema)))}(c||(t.Script=c={})),function(e){e.LocalValueSchema=r.default.lazy((()=>r.default.union([e.RemoteReferenceSchema,e.PrimitiveProtocolValueSchema,e.ChannelValueSchema,e.ArrayLocalValueSchema,e.DateLocalValueSchema,e.MapLocalValueSchema,e.ObjectLocalValueSchema,e.RegExpLocalValueSchema,e.SetLocalValueSchema])))}(c||(t.Script=c={})),function(e){e.ArrayLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("array"),value:e.ListLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.DateLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("date"),value:r.default.string()})))}(c||(t.Script=c={})),function(e){e.MappingLocalValueSchema=r.default.lazy((()=>r.default.array(r.default.tuple([r.default.union([e.LocalValueSchema,r.default.string()]),e.LocalValueSchema]))))}(c||(t.Script=c={})),function(e){e.MapLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("map"),value:e.MappingLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.ObjectLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("object"),value:e.MappingLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.RegExpValueSchema=r.default.lazy((()=>r.default.object({pattern:r.default.string(),flags:r.default.string().optional()})))}(c||(t.Script=c={})),function(e){e.RegExpLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("regexp"),value:e.RegExpValueSchema})))}(c||(t.Script=c={})),function(e){e.SetLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("set"),value:e.ListLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.PreloadScriptSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.RealmSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.PrimitiveProtocolValueSchema=r.default.lazy((()=>r.default.union([e.UndefinedValueSchema,e.NullValueSchema,e.StringValueSchema,e.NumberValueSchema,e.BooleanValueSchema,e.BigIntValueSchema])))}(c||(t.Script=c={})),function(e){e.UndefinedValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("undefined")})))}(c||(t.Script=c={})),function(e){e.NullValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("null")})))}(c||(t.Script=c={})),function(e){e.StringValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("string"),value:r.default.string()})))}(c||(t.Script=c={})),function(e){e.SpecialNumberSchema=r.default.lazy((()=>r.default.enum(["NaN","-0","Infinity","-Infinity"])))}(c||(t.Script=c={})),function(e){e.NumberValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("number"),value:r.default.union([r.default.number(),e.SpecialNumberSchema])})))}(c||(t.Script=c={})),function(e){e.BooleanValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("boolean"),value:r.default.boolean()})))}(c||(t.Script=c={})),function(e){e.BigIntValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("bigint"),value:r.default.string()})))}(c||(t.Script=c={})),function(e){e.RealmInfoSchema=r.default.lazy((()=>r.default.union([e.WindowRealmInfoSchema,e.DedicatedWorkerRealmInfoSchema,e.SharedWorkerRealmInfoSchema,e.ServiceWorkerRealmInfoSchema,e.WorkerRealmInfoSchema,e.PaintWorkletRealmInfoSchema,e.AudioWorkletRealmInfoSchema,e.WorkletRealmInfoSchema])))}(c||(t.Script=c={})),function(e){e.BaseRealmInfoSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema,origin:r.default.string()})))}(c||(t.Script=c={})),function(e){e.WindowRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("window"),context:o.BrowsingContextSchema,sandbox:r.default.string().optional()}))))}(c||(t.Script=c={})),function(e){e.DedicatedWorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("dedicated-worker"),owners:r.default.tuple([e.RealmSchema])}))))}(c||(t.Script=c={})),function(e){e.SharedWorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("shared-worker"),owners:r.default.array(e.RealmSchema)}))))}(c||(t.Script=c={})),function(e){e.ServiceWorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("service-worker"),owners:r.default.array(e.RealmSchema)}))))}(c||(t.Script=c={})),function(e){e.WorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("worker")}))))}(c||(t.Script=c={})),function(e){e.PaintWorkletRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("paint-worklet")}))))}(c||(t.Script=c={})),function(e){e.AudioWorkletRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("audio-worklet")}))))}(c||(t.Script=c={})),function(e){e.WorkletRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("worklet")}))))}(c||(t.Script=c={})),function(e){e.RealmTypeSchema=r.default.lazy((()=>r.default.enum(["window","dedicated-worker","shared-worker","service-worker","worker","paint-worklet","audio-worklet","worklet"])))}(c||(t.Script=c={})),function(e){e.ListRemoteValueSchema=r.default.lazy((()=>r.default.array(e.RemoteValueSchema)))}(c||(t.Script=c={})),function(e){e.MappingRemoteValueSchema=r.default.lazy((()=>r.default.array(r.default.tuple([r.default.union([e.RemoteValueSchema,r.default.string()]),e.RemoteValueSchema]))))}(c||(t.Script=c={})),function(e){e.RemoteValueSchema=r.default.lazy((()=>r.default.union([e.PrimitiveProtocolValueSchema,e.SymbolRemoteValueSchema,e.ArrayRemoteValueSchema,e.ObjectRemoteValueSchema,e.FunctionRemoteValueSchema,e.RegExpRemoteValueSchema,e.DateRemoteValueSchema,e.MapRemoteValueSchema,e.SetRemoteValueSchema,e.WeakMapRemoteValueSchema,e.WeakSetRemoteValueSchema,e.IteratorRemoteValueSchema,e.GeneratorRemoteValueSchema,e.ErrorRemoteValueSchema,e.ProxyRemoteValueSchema,e.PromiseRemoteValueSchema,e.TypedArrayRemoteValueSchema,e.ArrayBufferRemoteValueSchema,e.NodeListRemoteValueSchema,e.HtmlCollectionRemoteValueSchema,e.NodeRemoteValueSchema,e.WindowProxyRemoteValueSchema])))}(c||(t.Script=c={})),function(e){e.RemoteReferenceSchema=r.default.lazy((()=>r.default.union([e.SharedReferenceSchema,e.RemoteObjectReferenceSchema])))}(c||(t.Script=c={})),function(e){e.SharedReferenceSchema=r.default.lazy((()=>r.default.object({sharedId:e.SharedIdSchema,handle:e.HandleSchema.optional()}).and(t.ExtensibleSchema)))}(c||(t.Script=c={})),function(e){e.RemoteObjectReferenceSchema=r.default.lazy((()=>r.default.object({handle:e.HandleSchema,sharedId:e.SharedIdSchema.optional()}).and(t.ExtensibleSchema)))}(c||(t.Script=c={})),function(e){e.SymbolRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("symbol"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ArrayRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("array"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ObjectRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("object"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.MappingRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.FunctionRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("function"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.RegExpRemoteValueSchema=r.default.lazy((()=>r.default.object({handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()}).and(e.RegExpLocalValueSchema)))}(c||(t.Script=c={})),function(e){e.DateRemoteValueSchema=r.default.lazy((()=>r.default.object({handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()}).and(e.DateLocalValueSchema)))}(c||(t.Script=c={})),function(e){e.MapRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("map"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.MappingRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.SetRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("set"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.WeakMapRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("weakmap"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.WeakSetRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("weakset"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.IteratorRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("iterator"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.GeneratorRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("generator"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ErrorRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("error"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ProxyRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("proxy"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.PromiseRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("promise"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.TypedArrayRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("typedarray"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ArrayBufferRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("arraybuffer"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.NodeListRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("nodelist"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.HtmlCollectionRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("htmlcollection"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.NodeRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("node"),sharedId:e.SharedIdSchema.optional(),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.NodePropertiesSchema.optional()})))}(c||(t.Script=c={})),function(e){e.NodePropertiesSchema=r.default.lazy((()=>r.default.object({nodeType:t.JsUintSchema,childNodeCount:t.JsUintSchema,attributes:r.default.record(r.default.string(),r.default.string()).optional(),children:r.default.array(e.NodeRemoteValueSchema).optional(),localName:r.default.string().optional(),mode:r.default.enum(["open","closed"]).optional(),namespaceURI:r.default.string().optional(),nodeValue:r.default.string().optional(),shadowRoot:r.default.union([e.NodeRemoteValueSchema,r.default.null()]).optional()})))}(c||(t.Script=c={})),function(e){e.WindowProxyRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("window"),value:e.WindowProxyPropertiesSchema,handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.WindowProxyPropertiesSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema})))}(c||(t.Script=c={})),function(e){e.ResultOwnershipSchema=r.default.lazy((()=>r.default.enum(["root","none"])))}(c||(t.Script=c={})),function(e){e.SerializationOptionsSchema=r.default.lazy((()=>r.default.object({maxDomDepth:r.default.union([t.JsUintSchema,r.default.null()]).default(0).optional(),maxObjectDepth:r.default.union([t.JsUintSchema,r.default.null()]).default(null).optional(),includeShadowTree:r.default.enum(["none","open","all"]).default("none").optional()})))}(c||(t.Script=c={})),function(e){e.SharedIdSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.StackFrameSchema=r.default.lazy((()=>r.default.object({columnNumber:t.JsUintSchema,functionName:r.default.string(),lineNumber:t.JsUintSchema,url:r.default.string()})))}(c||(t.Script=c={})),function(e){e.StackTraceSchema=r.default.lazy((()=>r.default.object({callFrames:r.default.array(e.StackFrameSchema)})))}(c||(t.Script=c={})),function(e){e.SourceSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema,context:o.BrowsingContextSchema.optional()})))}(c||(t.Script=c={})),function(e){e.RealmTargetSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema})))}(c||(t.Script=c={})),function(e){e.ContextTargetSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema,sandbox:r.default.string().optional()})))}(c||(t.Script=c={})),function(e){e.TargetSchema=r.default.lazy((()=>r.default.union([e.RealmTargetSchema,e.ContextTargetSchema])))}(c||(t.Script=c={})),function(e){e.AddPreloadScriptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.addPreloadScript"),params:e.AddPreloadScriptParametersSchema})))}(c||(t.Script=c={})),function(e){e.AddPreloadScriptParametersSchema=r.default.lazy((()=>r.default.object({functionDeclaration:r.default.string(),arguments:r.default.array(e.ChannelValueSchema).optional(),contexts:r.default.array(o.BrowsingContextSchema).optional(),sandbox:r.default.string().optional()})))}(c||(t.Script=c={})),function(e){e.AddPreloadScriptResultSchema=r.default.lazy((()=>r.default.object({script:e.PreloadScriptSchema})))}(c||(t.Script=c={})),function(e){e.DisownSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.disown"),params:e.DisownParametersSchema})))}(c||(t.Script=c={})),function(e){e.DisownParametersSchema=r.default.lazy((()=>r.default.object({handles:r.default.array(e.HandleSchema),target:e.TargetSchema})))}(c||(t.Script=c={})),function(e){e.CallFunctionParametersSchema=r.default.lazy((()=>r.default.object({functionDeclaration:r.default.string(),awaitPromise:r.default.boolean(),target:e.TargetSchema,arguments:r.default.array(e.LocalValueSchema).optional(),resultOwnership:e.ResultOwnershipSchema.optional(),serializationOptions:e.SerializationOptionsSchema.optional(),this:e.LocalValueSchema.optional(),userActivation:r.default.boolean().default(!1).optional()})))}(c||(t.Script=c={})),function(e){e.CallFunctionSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.callFunction"),params:e.CallFunctionParametersSchema})))}(c||(t.Script=c={})),function(e){e.EvaluateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.evaluate"),params:e.EvaluateParametersSchema})))}(c||(t.Script=c={})),function(e){e.EvaluateParametersSchema=r.default.lazy((()=>r.default.object({expression:r.default.string(),target:e.TargetSchema,awaitPromise:r.default.boolean(),resultOwnership:e.ResultOwnershipSchema.optional(),serializationOptions:e.SerializationOptionsSchema.optional(),userActivation:r.default.boolean().default(!1).optional()})))}(c||(t.Script=c={})),function(e){e.GetRealmsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.getRealms"),params:e.GetRealmsParametersSchema})))}(c||(t.Script=c={})),function(e){e.GetRealmsParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema.optional(),type:e.RealmTypeSchema.optional()})))}(c||(t.Script=c={})),function(e){e.GetRealmsResultSchema=r.default.lazy((()=>r.default.object({realms:r.default.array(e.RealmInfoSchema)})))}(c||(t.Script=c={})),function(e){e.RemovePreloadScriptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.removePreloadScript"),params:e.RemovePreloadScriptParametersSchema})))}(c||(t.Script=c={})),function(e){e.RemovePreloadScriptParametersSchema=r.default.lazy((()=>r.default.object({script:e.PreloadScriptSchema})))}(c||(t.Script=c={})),function(e){e.MessageParametersSchema=r.default.lazy((()=>r.default.object({channel:e.ChannelSchema,data:e.RemoteValueSchema,source:e.SourceSchema})))}(c||(t.Script=c={})),function(e){e.RealmCreatedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.realmCreated"),params:e.RealmInfoSchema})))}(c||(t.Script=c={})),function(e){e.MessageSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.message"),params:e.MessageParametersSchema})))}(c||(t.Script=c={})),function(e){e.RealmDestroyedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.realmDestroyed"),params:e.RealmDestroyedParametersSchema})))}(c||(t.Script=c={})),function(e){e.RealmDestroyedParametersSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema})))}(c||(t.Script=c={})),t.StorageCommandSchema=r.default.lazy((()=>r.default.union([d.DeleteCookiesSchema,d.GetCookiesSchema,d.SetCookieSchema]))),t.StorageResultSchema=r.default.lazy((()=>r.default.union([d.DeleteCookiesResultSchema,d.GetCookiesResultSchema,d.SetCookieResultSchema]))),function(e){e.PartitionKeySchema=r.default.lazy((()=>r.default.object({userContext:r.default.string().optional(),sourceOrigin:r.default.string().optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.GetCookiesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("storage.getCookies"),params:e.GetCookiesParametersSchema})))}(d||(t.Storage=d={})),function(e){e.CookieFilterSchema=r.default.lazy((()=>r.default.object({name:r.default.string().optional(),value:i.BytesValueSchema.optional(),domain:r.default.string().optional(),path:r.default.string().optional(),size:t.JsUintSchema.optional(),httpOnly:r.default.boolean().optional(),secure:r.default.boolean().optional(),sameSite:i.SameSiteSchema.optional(),expiry:t.JsUintSchema.optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.BrowsingContextPartitionDescriptorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("context"),context:o.BrowsingContextSchema})))}(d||(t.Storage=d={})),function(e){e.StorageKeyPartitionDescriptorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("storageKey"),userContext:r.default.string().optional(),sourceOrigin:r.default.string().optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.PartitionDescriptorSchema=r.default.lazy((()=>r.default.union([e.BrowsingContextPartitionDescriptorSchema,e.StorageKeyPartitionDescriptorSchema])))}(d||(t.Storage=d={})),function(e){e.GetCookiesParametersSchema=r.default.lazy((()=>r.default.object({filter:e.CookieFilterSchema.optional(),partition:e.PartitionDescriptorSchema.optional()})))}(d||(t.Storage=d={})),function(e){e.GetCookiesResultSchema=r.default.lazy((()=>r.default.object({cookies:r.default.array(i.CookieSchema),partitionKey:e.PartitionKeySchema})))}(d||(t.Storage=d={})),function(e){e.SetCookieSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("storage.setCookie"),params:e.SetCookieParametersSchema})))}(d||(t.Storage=d={})),function(e){e.PartialCookieSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:i.BytesValueSchema,domain:r.default.string(),path:r.default.string().optional(),httpOnly:r.default.boolean().optional(),secure:r.default.boolean().optional(),sameSite:i.SameSiteSchema.optional(),expiry:t.JsUintSchema.optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.SetCookieParametersSchema=r.default.lazy((()=>r.default.object({cookie:e.PartialCookieSchema,partition:e.PartitionDescriptorSchema.optional()})))}(d||(t.Storage=d={})),function(e){e.SetCookieResultSchema=r.default.lazy((()=>r.default.object({partitionKey:e.PartitionKeySchema})))}(d||(t.Storage=d={})),function(e){e.DeleteCookiesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("storage.deleteCookies"),params:e.DeleteCookiesParametersSchema})))}(d||(t.Storage=d={})),function(e){e.DeleteCookiesParametersSchema=r.default.lazy((()=>r.default.object({filter:e.CookieFilterSchema.optional(),partition:e.PartitionDescriptorSchema.optional()})))}(d||(t.Storage=d={})),function(e){e.DeleteCookiesResultSchema=r.default.lazy((()=>r.default.object({partitionKey:e.PartitionKeySchema})))}(d||(t.Storage=d={})),t.LogEventSchema=r.default.lazy((()=>u.EntryAddedSchema)),function(e){e.LevelSchema=r.default.lazy((()=>r.default.enum(["debug","info","warn","error"])))}(u||(t.Log=u={})),function(e){e.EntrySchema=r.default.lazy((()=>r.default.union([e.GenericLogEntrySchema,e.ConsoleLogEntrySchema,e.JavascriptLogEntrySchema])))}(u||(t.Log=u={})),function(e){e.BaseLogEntrySchema=r.default.lazy((()=>r.default.object({level:e.LevelSchema,source:c.SourceSchema,text:r.default.union([r.default.string(),r.default.null()]),timestamp:t.JsUintSchema,stackTrace:c.StackTraceSchema.optional()})))}(u||(t.Log=u={})),function(e){e.GenericLogEntrySchema=r.default.lazy((()=>e.BaseLogEntrySchema.and(r.default.object({type:r.default.string()}))))}(u||(t.Log=u={})),function(e){e.ConsoleLogEntrySchema=r.default.lazy((()=>e.BaseLogEntrySchema.and(r.default.object({type:r.default.literal("console"),method:r.default.string(),args:r.default.array(c.RemoteValueSchema)}))))}(u||(t.Log=u={})),function(e){e.JavascriptLogEntrySchema=r.default.lazy((()=>e.BaseLogEntrySchema.and(r.default.object({type:r.default.literal("javascript")}))))}(u||(t.Log=u={})),function(e){e.EntryAddedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("log.entryAdded"),params:e.EntrySchema})))}(u||(t.Log=u={})),t.InputCommandSchema=r.default.lazy((()=>r.default.union([l.PerformActionsSchema,l.ReleaseActionsSchema,l.SetFilesSchema]))),function(e){e.ElementOriginSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("element"),element:c.SharedReferenceSchema})))}(l||(t.Input=l={})),function(e){e.PerformActionsParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema,actions:r.default.array(e.SourceActionsSchema)})))}(l||(t.Input=l={})),function(e){e.NoneSourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("none"),id:r.default.string(),actions:r.default.array(e.NoneSourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.KeySourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("key"),id:r.default.string(),actions:r.default.array(e.KeySourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.PointerSourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointer"),id:r.default.string(),parameters:e.PointerParametersSchema.optional(),actions:r.default.array(e.PointerSourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.PerformActionsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("input.performActions"),params:e.PerformActionsParametersSchema})))}(l||(t.Input=l={})),function(e){e.SourceActionsSchema=r.default.lazy((()=>r.default.union([e.NoneSourceActionsSchema,e.KeySourceActionsSchema,e.PointerSourceActionsSchema,e.WheelSourceActionsSchema])))}(l||(t.Input=l={})),function(e){e.NoneSourceActionSchema=r.default.lazy((()=>e.PauseActionSchema))}(l||(t.Input=l={})),function(e){e.KeySourceActionSchema=r.default.lazy((()=>r.default.union([e.PauseActionSchema,e.KeyDownActionSchema,e.KeyUpActionSchema])))}(l||(t.Input=l={})),function(e){e.PointerTypeSchema=r.default.lazy((()=>r.default.enum(["mouse","pen","touch"])))}(l||(t.Input=l={})),function(e){e.PointerParametersSchema=r.default.lazy((()=>r.default.object({pointerType:e.PointerTypeSchema.default("mouse").optional()})))}(l||(t.Input=l={})),function(e){e.WheelSourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("wheel"),id:r.default.string(),actions:r.default.array(e.WheelSourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.PointerSourceActionSchema=r.default.lazy((()=>r.default.union([e.PauseActionSchema,e.PointerDownActionSchema,e.PointerUpActionSchema,e.PointerMoveActionSchema])))}(l||(t.Input=l={})),function(e){e.WheelSourceActionSchema=r.default.lazy((()=>r.default.union([e.PauseActionSchema,e.WheelScrollActionSchema])))}(l||(t.Input=l={})),function(e){e.PauseActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pause"),duration:t.JsUintSchema.optional()})))}(l||(t.Input=l={})),function(e){e.KeyDownActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("keyDown"),value:r.default.string()})))}(l||(t.Input=l={})),function(e){e.KeyUpActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("keyUp"),value:r.default.string()})))}(l||(t.Input=l={})),function(e){e.PointerUpActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointerUp"),button:t.JsUintSchema}).and(e.PointerCommonPropertiesSchema)))}(l||(t.Input=l={})),function(e){e.PointerDownActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointerDown"),button:t.JsUintSchema}).and(e.PointerCommonPropertiesSchema)))}(l||(t.Input=l={})),function(e){e.PointerMoveActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointerMove"),x:t.JsIntSchema,y:t.JsIntSchema,duration:t.JsUintSchema.optional(),origin:e.OriginSchema.optional()}).and(e.PointerCommonPropertiesSchema)))}(l||(t.Input=l={})),function(e){e.WheelScrollActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("scroll"),x:t.JsIntSchema,y:t.JsIntSchema,deltaX:t.JsIntSchema,deltaY:t.JsIntSchema,duration:t.JsUintSchema.optional(),origin:e.OriginSchema.default("viewport").optional()})))}(l||(t.Input=l={})),function(e){e.PointerCommonPropertiesSchema=r.default.lazy((()=>r.default.object({width:t.JsUintSchema.default(1).optional(),height:t.JsUintSchema.default(1).optional(),pressure:r.default.number().default(0).optional(),tangentialPressure:r.default.number().default(0).optional(),twist:r.default.number().int().nonnegative().gte(0).lte(359).default(0).optional(),altitudeAngle:r.default.number().gte(0).lte(1.5707963267948966).default(0).optional(),azimuthAngle:r.default.number().gte(0).lte(6.283185307179586).default(0).optional()})))}(l||(t.Input=l={})),function(e){e.OriginSchema=r.default.lazy((()=>r.default.union([r.default.literal("viewport"),r.default.literal("pointer"),e.ElementOriginSchema])))}(l||(t.Input=l={})),function(e){e.ReleaseActionsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("input.releaseActions"),params:e.ReleaseActionsParametersSchema})))}(l||(t.Input=l={})),function(e){e.ReleaseActionsParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema})))}(l||(t.Input=l={})),function(e){e.SetFilesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("input.setFiles"),params:e.SetFilesParametersSchema})))}(l||(t.Input=l={})),function(e){e.SetFilesParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema,element:c.SharedReferenceSchema,files:r.default.array(r.default.string())})))}(l||(t.Input=l={}))}(Cn);var bn=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,n)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),xn=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Pn=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&bn(t,e,a);return xn(t,e),t};Object.defineProperty(Xr,"__esModule",{value:!0}),Xr.Permissions=Xr.Cdp=Xr.Storage=Xr.Input=Xr.Session=Xr.BrowsingContext=Xr.Script=Xr.Network=Xr.parseObject=void 0;const In=Yr,kn=g,Rn=Pn(yn),En=Pn(Cn);function _n(e,t){const a=t.safeParse(e);if(a.success)return a.data;const r=a.error.errors.map((e=>`${e.message} in ${e.path.map((e=>JSON.stringify(e))).join("/")}.`)).join(" ");throw new kn.InvalidArgumentException(r)}var Tn,Nn,jn,On,Mn,An,Dn,Bn;Xr.parseObject=_n,function(e){e.parseAddInterceptParameters=function(e){return _n(e,En.Network.AddInterceptParametersSchema)},e.parseContinueRequestParameters=function(e){return _n(e,En.Network.ContinueRequestParametersSchema)},e.parseContinueResponseParameters=function(e){return _n(e,En.Network.ContinueResponseParametersSchema)},e.parseContinueWithAuthParameters=function(e){return _n(e,En.Network.ContinueWithAuthParametersSchema)},e.parseFailRequestParameters=function(e){return _n(e,En.Network.FailRequestParametersSchema)},e.parseProvideResponseParameters=function(e){return _n(e,En.Network.ProvideResponseParametersSchema)},e.parseRemoveInterceptParameters=function(e){return _n(e,En.Network.RemoveInterceptParametersSchema)}}(Tn||(Xr.Network=Tn={})),function(e){e.parseGetRealmsParams=function(e){return _n(e,En.Script.GetRealmsParametersSchema)},e.parseEvaluateParams=function(e){return _n(e,En.Script.EvaluateParametersSchema)},e.parseDisownParams=function(e){return _n(e,En.Script.DisownParametersSchema)},e.parseAddPreloadScriptParams=function(e){return _n(e,En.Script.AddPreloadScriptParametersSchema)},e.parseRemovePreloadScriptParams=function(e){return _n(e,En.Script.RemovePreloadScriptParametersSchema)},e.parseCallFunctionParams=function(e){return _n(e,En.Script.CallFunctionParametersSchema)}}(Nn||(Xr.Script=Nn={})),function(e){e.parseActivateParams=function(e){return _n(e,En.BrowsingContext.ActivateParametersSchema)},e.parseGetTreeParams=function(e){return _n(e,En.BrowsingContext.GetTreeParametersSchema)},e.parseNavigateParams=function(e){return _n(e,En.BrowsingContext.NavigateParametersSchema)},e.parseReloadParams=function(e){return _n(e,En.BrowsingContext.ReloadParametersSchema)},e.parseCreateParams=function(e){return _n(e,En.BrowsingContext.CreateParametersSchema)},e.parseCloseParams=function(e){return _n(e,En.BrowsingContext.CloseParametersSchema)},e.parseCaptureScreenshotParams=function(e){return _n(e,En.BrowsingContext.CaptureScreenshotParametersSchema)},e.parsePrintParams=function(e){return _n(e,En.BrowsingContext.PrintParametersSchema)},e.parseSetViewportParams=function(e){return _n(e,En.BrowsingContext.SetViewportParametersSchema)},e.parseTraverseHistoryParams=function(e){return _n(e,En.BrowsingContext.TraverseHistoryParametersSchema)},e.parseHandleUserPromptParameters=function(e){return _n(e,En.BrowsingContext.HandleUserPromptParametersSchema)}}(jn||(Xr.BrowsingContext=jn={})),function(e){e.parseSubscribeParams=function(e){return _n(e,En.Session.SubscriptionRequestSchema)}}(On||(Xr.Session=On={})),function(e){e.parsePerformActionsParams=function(e){return _n(e,En.Input.PerformActionsParametersSchema)},e.parseReleaseActionsParams=function(e){return _n(e,En.Input.ReleaseActionsParametersSchema)},e.parseSetFilesParams=function(e){return _n(e,En.Input.SetFilesParametersSchema)}}(Mn||(Xr.Input=Mn={})),function(e){e.parseGetCookiesParams=function(e){return _n(e,En.Storage.GetCookiesParametersSchema)},e.parseSetCookieParams=function(e){return _n(e,En.Storage.SetCookieParametersSchema)},e.parseDeleteCookiesParams=function(e){return _n(e,En.Storage.DeleteCookiesParametersSchema)}}(An||(Xr.Storage=An={})),function(e){const t=In.z.object({method:In.z.string(),params:In.z.object({}).passthrough().optional(),session:In.z.string().optional()}),a=In.z.object({context:En.BrowsingContext.BrowsingContextSchema});e.parseSendCommandRequest=function(e){return _n(e,t)},e.parseGetSessionRequest=function(e){return _n(e,a)}}(Dn||(Xr.Cdp=Dn={})),function(e){e.parseSetPermissionsParams=function(e){return _n(e,Rn.Permissions.SetPermissionParametersSchema)}}(Bn||(Xr.Permissions=Bn={}));var zn=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,n)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),Ln=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Zn=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&zn(t,e,a);return Ln(t,e),t};Object.defineProperty(Gr,"__esModule",{value:!0}),Gr.BidiParser=void 0;const Un=Zn(Xr);Gr.BidiParser=class{parseActivateParams(e){return Un.BrowsingContext.parseActivateParams(e)}parseCaptureScreenshotParams(e){return Un.BrowsingContext.parseCaptureScreenshotParams(e)}parseCloseParams(e){return Un.BrowsingContext.parseCloseParams(e)}parseCreateParams(e){return Un.BrowsingContext.parseCreateParams(e)}parseGetTreeParams(e){return Un.BrowsingContext.parseGetTreeParams(e)}parseHandleUserPromptParams(e){return Un.BrowsingContext.parseHandleUserPromptParameters(e)}parseNavigateParams(e){return Un.BrowsingContext.parseNavigateParams(e)}parsePrintParams(e){return Un.BrowsingContext.parsePrintParams(e)}parseReloadParams(e){return Un.BrowsingContext.parseReloadParams(e)}parseSetViewportParams(e){return Un.BrowsingContext.parseSetViewportParams(e)}parseTraverseHistoryParams(e){return Un.BrowsingContext.parseTraverseHistoryParams(e)}parseGetSessionParams(e){return Un.Cdp.parseGetSessionRequest(e)}parseSendCommandParams(e){return Un.Cdp.parseSendCommandRequest(e)}parsePerformActionsParams(e){return Un.Input.parsePerformActionsParams(e)}parseReleaseActionsParams(e){return Un.Input.parseReleaseActionsParams(e)}parseSetFilesParams(e){return Un.Input.parseSetFilesParams(e)}parseAddInterceptParams(e){return Un.Network.parseAddInterceptParameters(e)}parseContinueRequestParams(e){return Un.Network.parseContinueRequestParameters(e)}parseContinueResponseParams(e){return Un.Network.parseContinueResponseParameters(e)}parseContinueWithAuthParams(e){return Un.Network.parseContinueWithAuthParameters(e)}parseFailRequestParams(e){return Un.Network.parseFailRequestParameters(e)}parseProvideResponseParams(e){return Un.Network.parseProvideResponseParameters(e)}parseRemoveInterceptParams(e){return Un.Network.parseRemoveInterceptParameters(e)}parseSetPermissionsParams(e){return Un.Permissions.parseSetPermissionsParams(e)}parseAddPreloadScriptParams(e){return Un.Script.parseAddPreloadScriptParams(e)}parseCallFunctionParams(e){return Un.Script.parseCallFunctionParams(e)}parseDisownParams(e){return Un.Script.parseDisownParams(e)}parseEvaluateParams(e){return Un.Script.parseEvaluateParams(e)}parseGetRealmsParams(e){return Un.Script.parseGetRealmsParams(e)}parseRemovePreloadScriptParams(e){return Un.Script.parseRemovePreloadScriptParams(e)}parseSubscribeParams(e){return Un.Session.parseSubscribeParams(e)}parseDeleteCookiesParams(e){return Un.Storage.parseDeleteCookiesParams(e)}parseGetCookiesParams(e){return Un.Storage.parseGetCookiesParams(e)}parseSetCookieParams(e){return Un.Storage.parseSetCookieParams(e)}};var Fn={};Object.defineProperty(Fn,"__esModule",{value:!0}),Fn.log=Fn.generatePage=void 0;const qn=l;function Vn(e){const t=e.split(":")[0],a=`${t}_log`,r=document.getElementById(a);if(r)return r;const n=document.getElementById("details"),s=document.createElement("div");s.className="divider",n.appendChild(s);const o=document.createElement("div");return o.className="item",o.innerHTML=`<h3>${t}</h3><div id="${a}" class="log"></div>`,n.appendChild(o),document.getElementById(a)}function $n(e){return"object"==typeof e?JSON.stringify(e,null,2):e}Fn.generatePage=function(){globalThis.document.documentElement&&(globalThis.document.documentElement.innerHTML='<!DOCTYPE html><title>BiDi-CDP Mapper</title><style>body{font-family: Roboto, serif; font-size: 13px; color: #202124;}.log{padding: 12px; font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace; font-size: 11px; line-height: 180%; background: #f1f3f4; border-radius: 4px;}.pre{overflow-wrap: break-word; padding: 10px;}.card{margin: 60px auto; padding: 2px 0; max-width: 900px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15), 0 1px 6px rgba(0, 0, 0, 0.2); border-radius: 8px;}.divider{height: 1px; background: #f0f0f0;}.item{padding: 16px 20px;}</style><div class="card"><div class="item"><h1>BiDi-CDP Mapper is controlling this tab</h1><p>Closing or reloading it will stop the BiDi process. <a target="_blank" title="BiDi-CDP Mapper GitHub Repository" href="https://github.com/GoogleChromeLabs/chromium-bidi">Details.</a></p></div><div class="divider"></div><details id="details"><summary class="item">Debug information</summary></details></div>',Vn(qn.LogType.debugInfo),Vn(qn.LogType.bidi),Vn(qn.LogType.cdp))},Fn.log=function(t,...a){if(!globalThis.document.documentElement)return;t.startsWith(qn.LogType.bidi)||e.window?.sendDebugMessage?.(JSON.stringify({logType:t,messages:a}));const r=Vn(t),n=document.createElement("div");n.className="pre",n.textContent=[t,...a].map($n).join(" "),r.appendChild(n)};var Kn={};Object.defineProperty(Kn,"__esModule",{value:!0}),Kn.WindowCdpTransport=Kn.WindowBidiTransport=void 0;const Wn=l,Hn=Fn;class Jn{static LOGGER_PREFIX_RECV=`${Wn.LogType.bidi}:RECV \u25c2`;static LOGGER_PREFIX_SEND=`${Wn.LogType.bidi}:SEND \u25b8`;#hr=null;constructor(){window.onBidiMessage=e=>{(0,Hn.log)(Jn.LOGGER_PREFIX_RECV,e);try{const t=Jn.#mr(e);this.#hr?.call(null,t)}catch(t){const a=t instanceof Error?t:new Error(t);this.#fr(e,"invalid argument",a,null)}}}setOnMessage(e){this.#hr=e}sendMessage(e){(0,Hn.log)(Jn.LOGGER_PREFIX_SEND,e);const t=JSON.stringify(e);window.sendBidiResponse(t)}close(){this.#hr=null,window.onBidiMessage=null}#fr(e,t,a,r){const n=Jn.#gr(e,t,a);r?this.sendMessage({...n,channel:r}):this.sendMessage(n)}static#yr(e){return null===e?"null":Array.isArray(e)?"array":typeof e}static#gr(e,t,a){let r;try{const t=JSON.parse(e);"object"===Jn.#yr(t)&&"id"in t&&(r=t.id)}catch{}return{type:"error",id:r,error:t,message:a.message}}static#mr(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Cannot parse data as JSON")}const a=Jn.#yr(t);if("object"!==a)throw new Error(`Expected JSON object but got ${a}`);const{id:r,method:n,params:s}=t,o=Jn.#yr(r);if("number"!==o||!Number.isInteger(r)||r<0)throw new Error(`Expected unsigned integer but got ${o}`);const i=Jn.#yr(n);if("string"!==i)throw new Error(`Expected string method but got ${i}`);const c=Jn.#yr(s);if("object"!==c)throw new Error(`Expected object params but got ${c}`);let d=t.channel;if(void 0!==d){const e=Jn.#yr(d);if("string"!==e)throw new Error(`Expected string channel but got ${e}`);""===d&&(d=void 0)}return{id:r,method:n,params:s,channel:d}}}Kn.WindowBidiTransport=Jn;Kn.WindowCdpTransport=class{#hr=null;constructor(){window.cdp.onmessage=e=>{this.#hr?.call(null,e)}}setOnMessage(e){this.#hr=e}sendMessage(e){window.cdp.send(e)}close(){this.#hr=null,window.cdp.onmessage=null}}, +var mapperTab=function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e){if(e.__esModule)return e;var t=e.default;if("function"==typeof t){var a=function e(){return this instanceof e?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};a.prototype=t.prototype}else a={};return Object.defineProperty(a,"__esModule",{value:!0}),Object.keys(e).forEach((function(t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(a,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})})),a}var a={},r={},n={},s={};var o=Object.freeze({__proto__:null,default:function(e){return{all:e=e||new Map,on:function(t,a){var r=e.get(t);r?r.push(a):e.set(t,[a])},off:function(t,a){var r=e.get(t);r&&(a?r.splice(r.indexOf(a)>>>0,1):e.set(t,[]))},emit:function(t,a){var r=e.get(t);r&&r.slice().map((function(e){e(a)})),(r=e.get("*"))&&r.slice().map((function(e){e(t,a)}))}}}}),i=t(o),c=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(s,"__esModule",{value:!0}),s.EventEmitter=void 0;const d=c(i);s.EventEmitter=class{#e=(0,d.default)();on(e,t){return this.#e.on(e,t),this}once(e,t){const a=r=>{t(r),this.off(e,a)};return this.on(e,a)}off(e,t){return this.#e.off(e,t),this}emit(e,t){this.#e.emit(e,t)}removeAllListeners(e){return e?this.#e.all.delete(e):this.#e.all.clear(),this}};var u,l={};Object.defineProperty(l,"__esModule",{value:!0}),l.LogType=void 0,function(e){e.bidi="bidi",e.cdp="cdp",e.debug="debug",e.debugError="debug:error",e.debugInfo="debug:info"}(u||(l.LogType=u={}));var h={};Object.defineProperty(h,"__esModule",{value:!0}),h.ProcessingQueue=void 0;const p=l;class m{static LOGGER_PREFIX=`${p.LogType.debug}:queue`;#t;#a;#r=[];#n=!1;constructor(e,t){this.#a=e,this.#t=t}add(e,t){this.#r.push([e,t]),this.#s()}async#s(){if(!this.#n){for(this.#n=!0;this.#r.length>0;){const e=this.#r.shift();if(!e)continue;const[t,a]=e;this.#t?.(m.LOGGER_PREFIX,"Processing event:",a),await t.then((e=>{if("error"!==e.kind)return this.#a(e.value);this.#t?.(p.LogType.debugError,"Event threw before sending:",e.error.message,e.error.stack)})).catch((e=>{this.#t?.(p.LogType.debugError,"Event was not processed:",e?.message)}))}this.#n=!1}}}h.ProcessingQueue=m;var f={},g={},y={};Object.defineProperty(y,"__esModule",{value:!0});var S,v,w,C,b,x={};Object.defineProperty(x,"__esModule",{value:!0}),x.EVENT_NAMES=x.Network=x.BrowsingContext=x.Log=x.Script=x.BiDiModule=void 0,function(e){e.Browser="browser",e.BrowsingContext="browsingContext",e.Cdp="cdp",e.Input="input",e.Log="log",e.Network="network",e.Script="script",e.Session="session"}(S||(x.BiDiModule=S={})),function(e){var t;(t=e.EventNames||(e.EventNames={})).Message="script.message",t.RealmCreated="script.realmCreated",t.RealmDestroyed="script.realmDestroyed"}(v||(x.Script=v={})),function(e){(e.EventNames||(e.EventNames={})).LogEntryAdded="log.entryAdded"}(w||(x.Log=w={})),function(e){var t;(t=e.EventNames||(e.EventNames={})).ContextCreated="browsingContext.contextCreated",t.ContextDestroyed="browsingContext.contextDestroyed",t.DomContentLoaded="browsingContext.domContentLoaded",t.DownloadWillBegin="browsingContext.downloadWillBegin",t.FragmentNavigated="browsingContext.fragmentNavigated",t.Load="browsingContext.load",t.NavigationAborted="browsingContext.navigationAborted",t.NavigationFailed="browsingContext.navigationFailed",t.NavigationStarted="browsingContext.navigationStarted",t.UserPromptClosed="browsingContext.userPromptClosed",t.UserPromptOpened="browsingContext.userPromptOpened"}(C||(x.BrowsingContext=C={})),function(e){var t;(t=e.EventNames||(e.EventNames={})).AuthRequired="network.authRequired",t.BeforeRequestSent="network.beforeRequestSent",t.FetchError="network.fetchError",t.ResponseCompleted="network.responseCompleted",t.ResponseStarted="network.responseStarted"}(b||(x.Network=b={})),x.EVENT_NAMES=new Set([...Object.values(S),...Object.values(C.EventNames),...Object.values(w.EventNames),...Object.values(b.EventNames),...Object.values(v.EventNames)]);var P={};Object.defineProperty(P,"__esModule",{value:!0});var I={};Object.defineProperty(I,"__esModule",{value:!0}),I.UnderspecifiedStoragePartitionException=I.UnableToSetFileInputException=I.UnableToSetCookieException=I.NoSuchStoragePartitionException=I.UnsupportedOperationException=I.UnableToCloseBrowserException=I.UnableToCaptureScreenException=I.UnknownErrorException=I.UnknownCommandException=I.SessionNotCreatedException=I.NoSuchUserContextException=I.NoSuchScriptException=I.NoSuchRequestException=I.NoSuchNodeException=I.NoSuchInterceptException=I.NoSuchHistoryEntryException=I.NoSuchHandleException=I.NoSuchFrameException=I.NoSuchElementException=I.NoSuchAlertException=I.MoveTargetOutOfBoundsException=I.InvalidSessionIdException=I.InvalidArgumentException=I.Exception=void 0;class k{error;message;stacktrace;constructor(e,t,a){this.error=e,this.message=t,this.stacktrace=a}toErrorResponse(e){return{type:"error",id:e,error:this.error,message:this.message,stacktrace:this.stacktrace}}}I.Exception=k;I.InvalidArgumentException=class extends k{constructor(e,t){super("invalid argument",e,t)}};I.InvalidSessionIdException=class extends k{constructor(e,t){super("invalid session id",e,t)}};I.MoveTargetOutOfBoundsException=class extends k{constructor(e,t){super("move target out of bounds",e,t)}};I.NoSuchAlertException=class extends k{constructor(e,t){super("no such alert",e,t)}};I.NoSuchElementException=class extends k{constructor(e,t){super("no such element",e,t)}};I.NoSuchFrameException=class extends k{constructor(e,t){super("no such frame",e,t)}};I.NoSuchHandleException=class extends k{constructor(e,t){super("no such handle",e,t)}};I.NoSuchHistoryEntryException=class extends k{constructor(e,t){super("no such history entry",e,t)}};I.NoSuchInterceptException=class extends k{constructor(e,t){super("no such intercept",e,t)}};I.NoSuchNodeException=class extends k{constructor(e,t){super("no such node",e,t)}};I.NoSuchRequestException=class extends k{constructor(e,t){super("no such request",e,t)}};I.NoSuchScriptException=class extends k{constructor(e,t){super("no such script",e,t)}};I.NoSuchUserContextException=class extends k{constructor(e,t){super("no such user context",e,t)}};I.SessionNotCreatedException=class extends k{constructor(e,t){super("session not created",e,t)}};I.UnknownCommandException=class extends k{constructor(e,t){super("unknown command",e,t)}};I.UnknownErrorException=class extends k{constructor(e,t=(new Error).stack){super("unknown error",e,t)}};I.UnableToCaptureScreenException=class extends k{constructor(e,t){super("unable to capture screen",e,t)}};I.UnableToCloseBrowserException=class extends k{constructor(e,t){super("unable to close browser",e,t)}};I.UnsupportedOperationException=class extends k{constructor(e,t){super("unsupported operation",e,t)}};I.NoSuchStoragePartitionException=class extends k{constructor(e,t){super("no such storage partition",e,t)}};I.UnableToSetCookieException=class extends k{constructor(e,t){super("unable to set cookie",e,t)}};I.UnableToSetFileInputException=class extends k{constructor(e,t){super("unable to set file input",e,t)}};I.UnderspecifiedStoragePartitionException=class extends k{constructor(e,t){super("underspecified storage partition",e,t)}};var R={};Object.defineProperty(R,"__esModule",{value:!0}),function(t){var a=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,n)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),r=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&a(t,e,n);return r(t,e),t},s=e&&e.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.ChromiumBidi=t.Cdp=void 0,t.Cdp=n(y),t.ChromiumBidi=n(x),s(P,t),s(I,t),s(R,t)}(g);var E={};Object.defineProperty(E,"__esModule",{value:!0}),E.BidiNoOpParser=void 0;E.BidiNoOpParser=class{parseActivateParams(e){return e}parseCaptureScreenshotParams(e){return e}parseCloseParams(e){return e}parseCreateParams(e){return e}parseGetTreeParams(e){return e}parseHandleUserPromptParams(e){return e}parseNavigateParams(e){return e}parsePrintParams(e){return e}parseReloadParams(e){return e}parseSetViewportParams(e){return e}parseTraverseHistoryParams(e){return e}parseGetSessionParams(e){return e}parseSendCommandParams(e){return e}parseAddPreloadScriptParams(e){return e}parseCallFunctionParams(e){return e}parseDisownParams(e){return e}parseEvaluateParams(e){return e}parseGetRealmsParams(e){return e}parseRemovePreloadScriptParams(e){return e}parsePerformActionsParams(e){return e}parseReleaseActionsParams(e){return e}parseSetFilesParams(e){return e}parseAddInterceptParams(e){return e}parseContinueRequestParams(e){return e}parseContinueResponseParams(e){return e}parseContinueWithAuthParams(e){return e}parseFailRequestParams(e){return e}parseProvideResponseParams(e){return e}parseRemoveInterceptParams(e){return e}parseSetPermissionsParams(e){return e}parseSubscribeParams(e){return e}parseDeleteCookiesParams(e){return e}parseGetCookiesParams(e){return e}parseSetCookieParams(e){return e}};var _={};Object.defineProperty(_,"__esModule",{value:!0}),_.BrowserProcessor=void 0;const T=g;_.BrowserProcessor=class{#o;constructor(e){this.#o=e}close(){return setTimeout((()=>this.#o.sendCommand("Browser.close")),0),{}}async createUserContext(){return{userContext:(await this.#o.sendCommand("Target.createBrowserContext")).browserContextId}}async removeUserContext(e){if("default"===e)throw new T.InvalidArgumentException("`default` user context cannot be removed");try{await this.#o.sendCommand("Target.disposeBrowserContext",{browserContextId:e})}catch(e){if(e.message.startsWith("Failed to find context with id"))throw new T.NoSuchUserContextException(e.message);throw e}return{}}async getUserContexts(){return{userContexts:[{userContext:"default"},...(await this.#o.sendCommand("Target.getBrowserContexts")).browserContextIds.map((e=>({userContext:e})))]}}};var N={};Object.defineProperty(N,"__esModule",{value:!0}),N.CdpProcessor=void 0;N.CdpProcessor=class{#i;#c;#o;constructor(e,t,a){this.#i=e,this.#c=t,this.#o=a}getSession(e){const t=e.context,a=this.#i.getContext(t).cdpTarget.cdpSessionId;return void 0===a?{}:{session:a}}async sendCommand(e){const t=e.session?this.#c.getCdpClient(e.session):this.#o;return{result:await t.sendCommand(e.method,e.params),session:e.session}}};var j={},O={},M={};Object.defineProperty(M,"__esModule",{value:!0}),M.uuidv4=void 0,M.uuidv4=function(){if("crypto"in globalThis&&"randomUUID"in globalThis.crypto)return globalThis.crypto.randomUUID();const e=new Uint8Array(16);"crypto"in globalThis&&"getRandomValues"in globalThis.crypto?globalThis.crypto.getRandomValues(e):require("crypto").webcrypto.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=e=>e.reduce(((e,t)=>e+t.toString(16).padStart(2,"0")),"");return[t(e.subarray(0,4)),t(e.subarray(4,6)),t(e.subarray(6,8)),t(e.subarray(8,10)),t(e.subarray(10,16))].join("-")};var A={};Object.defineProperty(A,"__esModule",{value:!0}),A.ChannelProxy=void 0;const B=g,z=l,D=M;class L{#d;#u=(0,D.uuidv4)();#t;constructor(e,t){this.#d=e,this.#t=t}async init(e,t){const a=await L.#l(e),r=await L.#h(e,a);return this.#p(e,a,t),r}async startListenerFromWindow(e,t){try{const a=await this.#m(e);this.#p(e,a,t)}catch(e){this.#t?.(z.LogType.debugError,e)}}static#f(){return`(${String((()=>{const e=[];let t=null;return{async getMessage(){const a=e.length>0?Promise.resolve():new Promise((e=>{t=e}));return await a,e.shift()},sendMessage(a){e.push(a),null!==t&&(t(),t=null)}}}))})()`}static async#l(e){const t=await e.cdpClient.sendCommand("Runtime.evaluate",{expression:this.#f(),contextId:e.executionContextId,serializationOptions:{serialization:"idOnly"}});if(t.exceptionDetails||void 0===t.result.objectId)throw new Error("Cannot create channel");return t.result.objectId}static async#h(e,t){return(await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e.sendMessage)),arguments:[{objectId:t}],executionContextId:e.executionContextId,serializationOptions:{serialization:"idOnly"}})).result.objectId}async#p(e,t,a){for(;;)try{const r=await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((async e=>await e.getMessage())),arguments:[{objectId:t}],awaitPromise:!0,executionContextId:e.executionContextId,serializationOptions:{serialization:"deep",maxDepth:this.#d.serializationOptions?.maxObjectDepth??void 0}});if(r.exceptionDetails)throw r.exceptionDetails;a.registerEvent({type:"event",method:B.ChromiumBidi.Script.EventNames.Message,params:{channel:this.#d.channel,data:e.cdpToBidiValue(r,this.#d.ownership??"none"),source:{realm:e.realmId,context:e.browsingContextId}}},e.browsingContextId)}catch(e){this.#t?.(z.LogType.debugError,e);break}}async#m(e){const t=await e.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>{const t=window;if(void 0===t[e])return new Promise((a=>t[e]=a));const a=t[e];return delete t[e],a})),arguments:[{value:this.#u}],executionContextId:e.executionContextId,awaitPromise:!0,serializationOptions:{serialization:"idOnly"}});if(void 0!==t.exceptionDetails||void 0===t.result.objectId)throw new Error(`ChannelHandle not found in window["${this.#u}"]`);return t.result.objectId}getEvalInWindowStr(){const e=String(((e,t)=>{const a=window;return void 0===a[e]?a[e]=t:(a[e](t),delete a[e]),t.sendMessage})),t=L.#f();return`(${e})('${this.#u}',${t})`}}A.ChannelProxy=L;var U={};Object.defineProperty(U,"__esModule",{value:!0}),U.parseSharedId=U.getSharedId=void 0;const Z="_element_";U.getSharedId=function(e,t,a,r){return r?`f.${e}.d.${t}.e.${a}`:`${t}${Z}${a}`},U.parseSharedId=function(e){const t=function(e){const t=e.match(new RegExp(`(.*)${Z}(.*)`));if(!t)return null;const a=t[1],r=t[2];if(void 0===a||void 0===r)return null;const n=parseInt(r??"");return isNaN(n)?null:{documentId:a,backendNodeId:n}}(e);if(null!==t)return{...t,frameId:void 0};const a=e.match(/f\.(.*)\.d\.(.*)\.e\.([0-9]*)/);if(!a)return null;const r=a[1],n=a[2],s=a[3];if(void 0===r||void 0===n||void 0===s)return null;const o=parseInt(s??"");return isNaN(o)?null:{frameId:r,documentId:n,backendNodeId:o}},Object.defineProperty(O,"__esModule",{value:!0}),O.Realm=void 0;const F=g,q=l,V=M,$=A,K=U;class W{#g;#i;#y;#S;#v;#w;#C;#b;#x;#P;sandbox;#t;constructor(e,t,a,r,n,s,o,i,c,d,u,l){this.#C=u,this.#y=a,this.#S=r,this.#v=n,this.sandbox=i,this.#w=s,this.#b=o,this.#x=c,this.#g=e,this.#i=t,this.#P=d,this.#t=l,this.#g.addRealm(this),this.#P.registerEvent({type:"event",method:F.ChromiumBidi.Script.EventNames.RealmCreated,params:this.realmInfo},this.browsingContextId)}cdpToBidiValue(e,t){const a=this.#I(e.result.deepSerializedValue,new Map);if(e.result.objectId){const r=e.result.objectId;"root"===t?(a.handle=r,this.#g.knownHandlesToRealmMap.set(r,this.realmId)):this.#k(r).catch((e=>this.#t?.(q.LogType.debugError,e)))}if("object"===e.result.type)switch(e.result.subtype){case"generator":case"iterator":a.type=e.result.subtype,delete a.value}return a}#I(e,t){if(Object.hasOwn(e,"weakLocalObjectReference")){const a=e.weakLocalObjectReference;t.has(a)||t.set(a,(0,V.uuidv4)()),e.internalId=t.get(a),delete e.weakLocalObjectReference}if("platformobject"===e.type)return{type:"object"};const a=e.value;if(void 0===a)return e;if("node"===e.type){if(Object.hasOwn(a,"backendNodeId")){let t=this.navigableId;Object.hasOwn(a,"loaderId")&&(t=a.loaderId,delete a.loaderId),e.sharedId=(0,K.getSharedId)(this.#R(t),t,a.backendNodeId,this.#C),delete a.backendNodeId}if(Object.hasOwn(a,"children"))for(const e in a.children)a.children[e]=this.#I(a.children[e],t);Object.hasOwn(a,"shadowRoot")&&null!==a.shadowRoot&&(a.shadowRoot=this.#I(a.shadowRoot,t)),""===a.namespaceURI&&(a.namespaceURI=null)}if(["array","set","htmlcollection","nodelist"].includes(e.type))for(const e in a)a[e]=this.#I(a[e],t);if(["object","map"].includes(e.type))for(const e in a)a[e]=[this.#I(a[e][0],t),this.#I(a[e][1],t)];return e}#R(e){const t=this.#i.getAllContexts().find((t=>t.navigableId===e));return t?.id??"UNKNOWN"}get realmId(){return this.#y}get navigableId(){return(this.browsingContextId&&this.#i.findContext(this.browsingContextId)?.navigableId)??"UNKNOWN"}get browsingContextId(){return this.#S}get executionContextId(){return this.#v}get origin(){return this.#w}get type(){return this.#b}get cdpClient(){return this.#x}get realmInfo(){return"window"===this.type?{realm:this.realmId,origin:this.origin,type:this.type,context:this.browsingContextId,...void 0===this.sandbox?{}:{sandbox:this.sandbox}}:{owners:[],realm:this.realmId,origin:this.origin,type:this.type}}async evaluate(e,t,a,r,n=!1){await this.#i.getContext(this.browsingContextId).targetUnblockedOrThrow();const s=await this.cdpClient.sendCommand("Runtime.evaluate",{contextId:this.executionContextId,expression:e,awaitPromise:t,serializationOptions:W.#E("deep",r),userGesture:n});return s.exceptionDetails?await this.#_(s.exceptionDetails,0,a):{realm:this.realmId,result:this.cdpToBidiValue(s,a),type:"success"}}async serializeCdpObject(e,t){const a=W.#T(e),r=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>e)),awaitPromise:!1,arguments:[a],serializationOptions:{serialization:"deep"},executionContextId:this.executionContextId});return this.cdpToBidiValue(r,t)}static#T(e){return void 0!==e.objectId?{objectId:e.objectId}:void 0!==e.unserializableValue?{unserializableValue:e.unserializableValue}:{value:e.value}}async stringifyObject(e){const{result:t}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String((e=>String(e))),awaitPromise:!1,arguments:[e],returnByValue:!0,executionContextId:this.executionContextId});return t.value}async#N(e){const t=[];for(const[a,r]of e){let e;e="string"==typeof a?{value:a}:await this.deserializeToCdpArg(a);const n=await this.deserializeToCdpArg(r);t.push(e),t.push(n)}return t}async#j(e){return await Promise.all(e.map((e=>this.deserializeToCdpArg(e))))}async#O(e,t,a){const r=e.stackTrace?.callFrames.map((e=>({url:e.url,functionName:e.functionName,lineNumber:e.lineNumber-t,columnNumber:e.columnNumber})))??[],n=e.exception;return{exception:await this.serializeCdpObject(n,a),columnNumber:e.columnNumber,lineNumber:e.lineNumber-t,stackTrace:{callFrames:r},text:await this.stringifyObject(n)||e.text}}async callFunction(e,t,a,r,n,s,o=!1){await this.#i.getContext(this.browsingContextId).targetUnblockedOrThrow();const i=`(...args) => {\n function callFunction(f, args) {\n const deserializedThis = args.shift();\n const deserializedArgs = args;\n return f.apply(deserializedThis, deserializedArgs);\n }\n return callFunction((\n ${e}\n ), args);\n }`,c=[await this.deserializeToCdpArg(t),...await Promise.all(a.map((async e=>await this.deserializeToCdpArg(e))))];let d;try{d=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:i,awaitPromise:r,arguments:c,serializationOptions:W.#E("deep",s),executionContextId:this.executionContextId,userGesture:o})}catch(e){if(-32e3===e.code&&["Could not find object with given id","Argument should belong to the same JavaScript world as target object","Invalid remote object id"].includes(e.message))throw new F.NoSuchHandleException("Handle was not found.");throw e}return d.exceptionDetails?await this.#_(d.exceptionDetails,1,n):{type:"success",result:this.cdpToBidiValue(d,n),realm:this.realmId}}async deserializeToCdpArg(e){if("sharedId"in e&&e.sharedId){const t=(0,K.parseSharedId)(e.sharedId);if(null===t)throw new F.NoSuchNodeException(`SharedId "${e.sharedId}" was not found.`);const{documentId:a,backendNodeId:r}=t;if(this.navigableId!==a)throw new F.NoSuchNodeException(`SharedId "${e.sharedId}" belongs to different document. Current document is ${this.navigableId}.`);try{const{object:e}=await this.cdpClient.sendCommand("DOM.resolveNode",{backendNodeId:r,executionContextId:this.executionContextId});return{objectId:e.objectId}}catch(t){if(-32e3===t.code&&"No node with given id found"===t.message)throw new F.NoSuchNodeException(`SharedId "${e.sharedId}" was not found.`);throw new F.UnknownErrorException(t.message,t.stack)}}else{if("handle"in e&&e.handle)return{objectId:e.handle};if("handle"in e||"sharedId"in e)throw new F.NoSuchHandleException("Handle was not found.")}switch(e.type){case"undefined":return{unserializableValue:"undefined"};case"null":return{unserializableValue:"null"};case"string":return{value:e.value};case"number":return"NaN"===e.value?{unserializableValue:"NaN"}:"-0"===e.value?{unserializableValue:"-0"}:"Infinity"===e.value?{unserializableValue:"Infinity"}:"-Infinity"===e.value?{unserializableValue:"-Infinity"}:{value:e.value};case"boolean":return{value:Boolean(e.value)};case"bigint":return{unserializableValue:`BigInt(${JSON.stringify(e.value)})`};case"date":return{unserializableValue:`new Date(Date.parse(${JSON.stringify(e.value)}))`};case"regexp":return{unserializableValue:`new RegExp(${JSON.stringify(e.value.pattern)}, ${JSON.stringify(e.value.flags)})`};case"map":{const t=await this.#N(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t=new Map;for(let a=0;a<e.length;a+=2)t.set(e[a],e[a+1]);return t})),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"object":{const t=await this.#N(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>{const t={};for(let a=0;a<e.length;a+=2){t[e[a]]=e[a+1]}return t})),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"array":{const t=await this.#j(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>e)),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"set":{const t=await this.#j(e.value),{result:a}=await this.cdpClient.sendCommand("Runtime.callFunctionOn",{functionDeclaration:String(((...e)=>new Set(e))),awaitPromise:!1,arguments:t,returnByValue:!1,executionContextId:this.executionContextId});return{objectId:a.objectId}}case"channel":{const t=new $.ChannelProxy(e.value,this.#t);return{objectId:await t.init(this,this.#P)}}}throw new Error(`Value ${JSON.stringify(e)} is not deserializable.`)}async#_(e,t,a){return{exceptionDetails:await this.#O(e,t,a),realm:this.realmId,type:"exception"}}static#E(e,t){return{serialization:e,additionalParameters:W.#M(t),...W.#A(t)}}static#M(e){const t={};return void 0!==e.maxDomDepth&&(t.maxNodeDepth=null===e.maxDomDepth?1e3:e.maxDomDepth),void 0!==e.includeShadowTree&&(t.includeShadowTree=e.includeShadowTree),t}static#A(e){return void 0===e.maxObjectDepth||null===e.maxObjectDepth?{}:{maxDepth:e.maxObjectDepth}}async#k(e){try{await this.cdpClient.sendCommand("Runtime.releaseObject",{objectId:e})}catch(e){if(-32e3!==e.code||"Invalid remote object id"!==e.message)throw e}}async disown(e){this.#g.knownHandlesToRealmMap.get(e)===this.realmId&&(await this.#k(e),this.#g.knownHandlesToRealmMap.delete(e))}dispose(){this.#P.registerEvent({type:"event",method:F.ChromiumBidi.Script.EventNames.RealmDestroyed,params:{realm:this.realmId}},this.browsingContextId)}}O.Realm=W;var H={},J={};Object.defineProperty(J,"__esModule",{value:!0}),J.assert=void 0,J.assert=function(e,t){if(!e)throw new Error(t??"Internal assertion failed.")};var G={};Object.defineProperty(G,"__esModule",{value:!0}),G.Deferred=void 0;class X{#B=!1;#z;#D;#L;get isFinished(){return this.#B}constructor(){this.#z=new Promise(((e,t)=>{this.#D=e,this.#L=t})),this.#z.catch((e=>{}))}then(e,t){return this.#z.then(e,t)}catch(e){return this.#z.catch(e)}resolve(e){this.#B||(this.#B=!0,this.#D(e))}reject(e){this.#B||(this.#B=!0,this.#L(e))}finally(e){return this.#z.finally(e)}[Symbol.toStringTag]="Promise"}G.Deferred=X;var Y={};Object.defineProperty(Y,"__esModule",{value:!0}),Y.inchesFromCm=void 0,Y.inchesFromCm=function(e){return e/2.54},Object.defineProperty(H,"__esModule",{value:!0}),H.serializeOrigin=H.BrowsingContextImpl=void 0;const Q=g,ee=J,te=G,ae=l,re=Y,ne=O;class se{static LOGGER_PREFIX=`${ae.LogType.debug}:browsingContext`;#u;userContext;#U;#Z=new Set;#i;#F={Page:{navigatedWithinDocument:new te.Deferred,lifecycleEvent:{DOMContentLoaded:new te.Deferred,load:new te.Deferred},frameStartedLoading:new te.Deferred}};#q="about:blank";#P;#g;#V;#$;#K;#C;#t;constructor(e,t,a,r,n,s,o,i,c){this.#$=e,this.#g=t,this.#u=a,this.#U=r,this.userContext=n,this.#P=s,this.#i=o,this.#C=i,this.#t=c}static create(e,t,a,r,n,s,o,i,c){const d=new se(e,t,a,r,n,s,o,i,c);return d.#W(),o.addContext(d),d.isTopLevelContext()||d.parent.addChild(d.id),s.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.ContextCreated,params:d.serializeToBidiValue()},d.id),d}static getTimestamp(){return(new Date).getTime()}get navigableId(){return this.#V}dispose(){this.#H(),this.#g.deleteRealms({browsingContextId:this.id}),this.isTopLevelContext()||this.parent.#Z.delete(this.id),this.#J(),this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.ContextDestroyed,params:this.serializeToBidiValue()},this.id),this.#i.deleteContextById(this.id)}get id(){return this.#u}get parentId(){return this.#U}get parent(){return null===this.parentId?null:this.#i.getContext(this.parentId)}get directChildren(){return[...this.#Z].map((e=>this.#i.getContext(e)))}get allChildren(){const e=this.directChildren;return e.concat(...e.map((e=>e.allChildren)))}isTopLevelContext(){return null===this.#U}get top(){let e=this,t=e.parent;for(;t;)e=t,t=e.parent;return e}addChild(e){this.#Z.add(e)}#H(){this.directChildren.map((e=>e.dispose()))}get#G(){return(0,ee.assert)(this.#K,`No default realm for browsing context ${this.#u}`),this.#K}get cdpTarget(){return this.#$}updateCdpTarget(e){this.#$=e,this.#W()}get url(){return this.#q}async lifecycleLoaded(){await this.#F.Page.lifecycleEvent.load}async targetUnblockedOrThrow(){const e=await this.#$.targetUnblocked;if("error"===e.kind)throw e.error}async getOrCreateSandbox(e){if(void 0===e||""===e)return this.#G;let t=this.#g.findRealms({browsingContextId:this.id,sandbox:e});return 0===t.length&&(await this.#$.cdpClient.sendCommand("Page.createIsolatedWorld",{frameId:this.id,worldName:e}),t=this.#g.findRealms({browsingContextId:this.id,sandbox:e}),(0,ee.assert)(0!==t.length)),t[0]}serializeToBidiValue(e=0,t=!0){return{context:this.#u,url:this.url,userContext:this.userContext,children:e>0?this.directChildren.map((t=>t.serializeToBidiValue(e-1,!1))):null,...t?{parent:this.#U}:{}}}onTargetInfoChanged(e){this.#q=e.targetInfo.url}#W(){this.#$.cdpClient.on("Page.frameNavigated",(e=>{this.id===e.frame.id&&(this.#q=e.frame.url+(e.frame.urlFragment??""),this.#H())})),this.#$.cdpClient.on("Page.navigatedWithinDocument",(e=>{if(this.id!==e.frameId)return;const t=se.getTimestamp();this.#q=e.url,this.#F.Page.navigatedWithinDocument.resolve(e),this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.FragmentNavigated,params:{context:this.id,navigation:null,timestamp:t,url:this.#q}},this.id)})),this.#$.cdpClient.on("Page.frameStartedLoading",(e=>{this.id===e.frameId&&this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.NavigationStarted,params:{context:this.id,navigation:null,timestamp:se.getTimestamp(),url:""}},this.id)})),this.#$.cdpClient.on("Page.lifecycleEvent",(e=>{if(this.id!==e.frameId)return;if("init"===e.name)return void this.#X(e.loaderId);if("commit"===e.name)return void(this.#V=e.loaderId);if(e.loaderId!==this.#V)return;const t=se.getTimestamp();switch(e.name){case"DOMContentLoaded":this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.DomContentLoaded,params:{context:this.id,navigation:this.#V??null,timestamp:t,url:this.#q}},this.id),this.#F.Page.lifecycleEvent.DOMContentLoaded.resolve(e);break;case"load":this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.Load,params:{context:this.id,navigation:this.#V??null,timestamp:t,url:this.#q}},this.id),this.#F.Page.lifecycleEvent.load.resolve(e)}})),this.#$.cdpClient.on("Runtime.executionContextCreated",(e=>{const{auxData:t,name:a,uniqueId:r,id:n}=e.context;if(!t||t.frameId!==this.id)return;let s,o;switch(t.type){case"isolated":o=a,s=this.#G.origin;break;case"default":s=oe(e.context.origin);break;default:return}const i=new ne.Realm(this.#g,this.#i,r,this.id,n,s,"window",o,this.#$.cdpClient,this.#P,this.#C,this.#t);t.isDefault&&(this.#K=i,Promise.all(this.#$.getChannels().map((e=>e.startListenerFromWindow(i,this.#P)))))})),this.#$.cdpClient.on("Runtime.executionContextDestroyed",(e=>{this.#g.deleteRealms({cdpSessionId:this.#$.cdpSessionId,executionContextId:e.executionContextId})})),this.#$.cdpClient.on("Runtime.executionContextsCleared",(()=>{this.#g.deleteRealms({cdpSessionId:this.#$.cdpSessionId})})),this.#$.cdpClient.on("Page.javascriptDialogClosed",(e=>{const t=e.result;this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.UserPromptClosed,params:{context:this.id,accepted:t,userText:t&&e.userInput?e.userInput:void 0}},this.id)})),this.#$.cdpClient.on("Page.javascriptDialogOpening",(e=>{this.#P.registerEvent({type:"event",method:Q.ChromiumBidi.BrowsingContext.EventNames.UserPromptOpened,params:{context:this.id,type:e.type,message:e.message,defaultValue:e.defaultPrompt||void 0}},this.id)}))}#X(e){void 0!==e&&this.#V!==e?(this.#Y(),this.#V=e):this.#F.Page.navigatedWithinDocument.isFinished?this.#F.Page.navigatedWithinDocument=new te.Deferred:this.#t?.(se.LOGGER_PREFIX,"Document changed (navigatedWithinDocument)")}#Y(){this.#F.Page.lifecycleEvent.DOMContentLoaded.isFinished?this.#F.Page.lifecycleEvent.DOMContentLoaded=new te.Deferred:this.#t?.(se.LOGGER_PREFIX,"Document changed (DOMContentLoaded)"),this.#F.Page.lifecycleEvent.load.isFinished?this.#F.Page.lifecycleEvent.load=new te.Deferred:this.#t?.(se.LOGGER_PREFIX,"Document changed (load)")}#J(){this.#F.Page.lifecycleEvent.DOMContentLoaded.isFinished||this.#F.Page.lifecycleEvent.DOMContentLoaded.reject(new Q.UnknownErrorException("navigation canceled")),this.#F.Page.lifecycleEvent.load.isFinished||this.#F.Page.lifecycleEvent.load.reject(new Q.UnknownErrorException("navigation canceled"))}async navigate(e,t){try{new URL(e)}catch{throw new Q.InvalidArgumentException(`Invalid URL: ${e}`)}await this.targetUnblockedOrThrow();const a=await this.#$.cdpClient.sendCommand("Page.navigate",{url:e,frameId:this.id});if(a.errorText)throw new Q.UnknownErrorException(a.errorText);switch(this.#X(a.loaderId),t){case"none":break;case"interactive":void 0===a.loaderId?await this.#F.Page.navigatedWithinDocument:await this.#F.Page.lifecycleEvent.DOMContentLoaded;break;case"complete":void 0===a.loaderId?await this.#F.Page.navigatedWithinDocument:await this.lifecycleLoaded()}return{navigation:a.loaderId??null,url:"none"===t?e:this.#q}}async reload(e,t){switch(await this.targetUnblockedOrThrow(),await this.#$.cdpClient.sendCommand("Page.reload",{ignoreCache:e}),this.#Y(),t){case"none":break;case"interactive":await this.#F.Page.lifecycleEvent.DOMContentLoaded;break;case"complete":await this.lifecycleLoaded()}return{navigation:"none"===t?null:this.navigableId??null,url:this.url}}async setViewport(e,t){if(null===e&&null===t)await this.#$.cdpClient.sendCommand("Emulation.clearDeviceMetricsOverride");else try{await this.#$.cdpClient.sendCommand("Emulation.setDeviceMetricsOverride",{width:e?e.width:0,height:e?e.height:0,deviceScaleFactor:t||0,mobile:!1,dontSetVisibleSize:!0})}catch(e){if(e.message.startsWith("Width and height values must be positive"))throw new Q.UnsupportedOperationException("Provided viewport dimensions are not supported");throw e}}async handleUserPrompt(e){await this.#$.cdpClient.sendCommand("Page.handleJavaScriptDialog",{accept:e.accept??!0,promptText:e.userText})}async activate(){await this.#$.cdpClient.sendCommand("Page.bringToFront")}async captureScreenshot(e){if(!this.isTopLevelContext())throw new Q.UnsupportedOperationException(`Non-top-level 'context' (${e.context}) is currently not supported`);const t=function(e){const{quality:t,type:a}=e.format??{type:"image/png"};switch(a){case"image/png":return{format:"png"};case"image/jpeg":return{format:"jpeg",...void 0===t?{}:{quality:Math.round(100*t)}};case"image/webp":return{format:"webp",...void 0===t?{}:{quality:Math.round(100*t)}}}throw new Q.InvalidArgumentException(`Image format '${a}' is not a supported format`)}(e);await this.#$.cdpClient.sendCommand("Page.bringToFront");let a,r=!1;switch(e.origin??="viewport",e.origin){case"document":a=String((()=>{const e=document.documentElement;return{x:0,y:0,width:e.scrollWidth,height:e.scrollHeight}})),r=!0;break;case"viewport":a=String((()=>{const e=window.visualViewport;return{x:e.pageLeft,y:e.pageTop,width:e.width,height:e.height}}))}const n=await this.getOrCreateSandbox(void 0),s=await n.callFunction(a,{type:"undefined"},[],!1,"none",{},!1);(0,ee.assert)("success"===s.type);const o=ie(s.result);(0,ee.assert)(o);const i=e.clip?function(e,t){e=ce(e),t=ce(t);const a=Math.max(e.x,t.x),r=Math.max(e.y,t.y);return{x:a,y:r,width:Math.max(Math.min(e.x+e.width,t.x+t.width)-a,0),height:Math.max(Math.min(e.y+e.height,t.y+t.height)-r,0)}}(await this.#Q(e.clip),o):o;if(0===i.width||0===i.height)throw new Q.UnableToCaptureScreenException(`Unable to capture screenshot with zero dimensions: width=${i.width}, height=${i.height}`);return await this.#$.cdpClient.sendCommand("Page.captureScreenshot",{clip:{...i,scale:1},...t,captureBeyondViewport:r})}async print(e){const t={};if(void 0!==e.background&&(t.printBackground=e.background),void 0!==e.margin?.bottom&&(t.marginBottom=(0,re.inchesFromCm)(e.margin.bottom)),void 0!==e.margin?.left&&(t.marginLeft=(0,re.inchesFromCm)(e.margin.left)),void 0!==e.margin?.right&&(t.marginRight=(0,re.inchesFromCm)(e.margin.right)),void 0!==e.margin?.top&&(t.marginTop=(0,re.inchesFromCm)(e.margin.top)),void 0!==e.orientation&&(t.landscape="landscape"===e.orientation),void 0!==e.page?.height&&(t.paperHeight=(0,re.inchesFromCm)(e.page.height)),void 0!==e.page?.width&&(t.paperWidth=(0,re.inchesFromCm)(e.page.width)),void 0!==e.pageRanges){for(const t of e.pageRanges){if("number"==typeof t)continue;const e=t.split("-");if(e.length<1||e.length>2)throw new Q.InvalidArgumentException(`Invalid page range: ${t} is not a valid integer range.`);if(1===e.length){de(e[0]??"");continue}let a,r;const[n="",s=""]=e;if(a=""===n?1:de(n),r=""===s?Number.MAX_SAFE_INTEGER:de(s),a>r)throw new Q.InvalidArgumentException(`Invalid page range: ${n} > ${s}`)}t.pageRanges=e.pageRanges.join(",")}void 0!==e.scale&&(t.scale=e.scale),void 0!==e.shrinkToFit&&(t.preferCSSPageSize=!e.shrinkToFit);try{return{data:(await this.#$.cdpClient.sendCommand("Page.printToPDF",t)).data}}catch(e){if("invalid print parameters: content area is empty"===e.message)throw new Q.UnsupportedOperationException(e.message);throw e}}async#Q(e){switch(e.type){case"box":return{x:e.x,y:e.y,width:e.width,height:e.height};case"element":{const t=await this.getOrCreateSandbox(void 0),a=await t.callFunction(String((e=>e instanceof Element)),{type:"undefined"},[e.element],!1,"none",{});if("exception"===a.type)throw new Q.NoSuchElementException(`Element '${e.element.sharedId}' was not found`);if((0,ee.assert)("boolean"===a.result.type),!a.result.value)throw new Q.NoSuchElementException(`Node '${e.element.sharedId}' is not an Element`);{const a=await t.callFunction(String((e=>{const t=e.getBoundingClientRect();return{x:t.x,y:t.y,height:t.height,width:t.width}})),{type:"undefined"},[e.element],!1,"none",{});(0,ee.assert)("success"===a.type);const r=ie(a.result);if(!r)throw new Q.UnableToCaptureScreenException(`Could not get bounding box for Element '${e.element.sharedId}'`);return r}}}}async close(){await this.#$.cdpClient.sendCommand("Page.close")}async traverseHistory(e){if(0===e)return;const t=await this.#$.cdpClient.sendCommand("Page.getNavigationHistory"),a=t.entries[t.currentIndex+e];if(!a)throw new Q.NoSuchHistoryEntryException(`No history entry at delta ${e}`);await this.#$.cdpClient.sendCommand("Page.navigateToHistoryEntry",{entryId:a.id})}}function oe(e){return["://",""].includes(e)&&(e="null"),e}function ie(e){if("object"!==e.type||void 0===e.value)return;const t=e.value.find((([e])=>"x"===e))?.[1],a=e.value.find((([e])=>"y"===e))?.[1],r=e.value.find((([e])=>"height"===e))?.[1],n=e.value.find((([e])=>"width"===e))?.[1];return"number"===t?.type&&"number"===a?.type&&"number"===r?.type&&"number"===n?.type?{x:t.value,y:a.value,width:n.value,height:r.value}:void 0}function ce(e){return{...e.width<0?{x:e.x+e.width,width:-e.width}:{x:e.x,width:e.width},...e.height<0?{y:e.y+e.height,height:-e.height}:{y:e.y,height:e.height}}}function de(e){if(e=e.trim(),!/^[0-9]+$/.test(e))throw new Q.InvalidArgumentException(`Invalid integer: ${e}`);return parseInt(e)}H.BrowsingContextImpl=se,H.serializeOrigin=oe;var ue={},le={},he={};Object.defineProperty(he,"__esModule",{value:!0}),he.getRemoteValuesText=he.logMessageFormatter=void 0;const pe=J,me=["%s","%d","%i","%f","%o","%O","%c"];function fe(e){return me.some((t=>e.includes(t)))}function ge(e){let t="";const a=e[0].value.toString(),r=e.slice(1,void 0),n=a.split(new RegExp(me.map((e=>`(${e})`)).join("|"),"g"));for(const a of n)if(void 0!==a&&""!==a)if(fe(a)){const n=r.shift();(0,pe.assert)(n,`Less value is provided: "${ve(e,!1)}"`),"%s"===a?t+=Se(n):"%d"===a||"%i"===a?"bigint"===n.type||"number"===n.type||"string"===n.type?t+=parseInt(n.value.toString(),10):t+="NaN":"%f"===a?"bigint"===n.type||"number"===n.type||"string"===n.type?t+=parseFloat(n.value.toString()):t+="NaN":t+=ye(n)}else t+=a;if(r.length>0)throw new Error(`More value is provided: "${ve(e,!1)}"`);return t}function ye(e){if("array"!==e.type&&"bigint"!==e.type&&"date"!==e.type&&"number"!==e.type&&"object"!==e.type&&"string"!==e.type)return Se(e);if("bigint"===e.type)return`${e.value.toString()}n`;if("number"===e.type)return e.value.toString();if(["date","string"].includes(e.type))return JSON.stringify(e.value);if("object"===e.type)return`{${e.value.map((e=>`${JSON.stringify(e[0])}:${ye(e[1])}`)).join(",")}}`;if("array"===e.type)return`[${e.value?.map((e=>ye(e))).join(",")??""}]`;throw Error(`Invalid value type: ${e}`)}function Se(e){if(!Object.hasOwn(e,"value"))return e.type;switch(e.type){case"string":case"number":case"boolean":case"bigint":return String(e.value);case"regexp":return`/${e.value.pattern}/${e.value.flags??""}`;case"date":return new Date(e.value).toString();case"object":return`Object(${e.value?.length??""})`;case"array":return`Array(${e.value?.length??""})`;case"map":return`Map(${e.value?.length})`;case"set":return`Set(${e.value?.length})`;default:return e.type}}function ve(e,t){const a=e[0];return a?"string"===a.type&&fe(a.value.toString())&&t?ge(e):e.map((e=>Se(e))).join(" "):""}he.logMessageFormatter=ge,he.getRemoteValuesText=ve,Object.defineProperty(le,"__esModule",{value:!0}),le.LogManager=void 0;const we=g,Ce=he;function be(e){const t=e?.callFrames.map((e=>({columnNumber:e.columnNumber,functionName:e.functionName,lineNumber:e.lineNumber,url:e.url})));return t?{callFrames:t}:void 0}class xe{#P;#g;#$;constructor(e,t,a){this.#$=e,this.#g=t,this.#P=a}static create(e,t,a){const r=new xe(e,t,a);return r.#ee(),r}#ee(){this.#$.cdpClient.on("Runtime.consoleAPICalled",(e=>{const t=this.#g.findRealm({cdpSessionId:this.#$.cdpSessionId,executionContextId:e.executionContextId}),a=void 0===t?Promise.resolve(e.args):Promise.all(e.args.map((e=>t.serializeCdpObject(e,"none"))));this.#P.registerPromiseEvent(a.then((a=>{return{kind:"success",value:{type:"event",method:we.ChromiumBidi.Log.EventNames.LogEntryAdded,params:{level:(r=e.type,["error","assert"].includes(r)?"error":["debug","trace"].includes(r)?"debug":["warn","warning"].includes(r)?"warn":"info"),source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:(0,Ce.getRemoteValuesText)(a,!0),timestamp:Math.round(e.timestamp),stackTrace:be(e.stackTrace),type:"console",method:"warning"===e.type?"warn":e.type,args:a}}};var r})),t?.browsingContextId??"UNKNOWN",we.ChromiumBidi.Log.EventNames.LogEntryAdded)})),this.#$.cdpClient.on("Runtime.exceptionThrown",(e=>{const t=this.#g.findRealm({cdpSessionId:this.#$.cdpSessionId,executionContextId:e.exceptionDetails.executionContextId});this.#P.registerPromiseEvent(xe.#te(e,t).then((a=>({kind:"success",value:{type:"event",method:we.ChromiumBidi.Log.EventNames.LogEntryAdded,params:{level:"error",source:{realm:t?.realmId??"UNKNOWN",context:t?.browsingContextId??"UNKNOWN"},text:a,timestamp:Math.round(e.timestamp),stackTrace:be(e.exceptionDetails.stackTrace),type:"javascript"}}}))),t?.browsingContextId??"UNKNOWN",we.ChromiumBidi.Log.EventNames.LogEntryAdded)}))}static async#te(e,t){return e.exceptionDetails.exception?void 0===t?JSON.stringify(e.exceptionDetails.exception):await t.stringifyObject(e.exceptionDetails.exception):e.exceptionDetails.text}}le.LogManager=xe;var Pe={},Ie={},ke={};Object.defineProperty(ke,"__esModule",{value:!0}),ke.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction=ke.cdpFetchHeadersFromBidiNetworkHeaders=ke.bidiNetworkHeadersFromCdpFetchHeaders=ke.cdpNetworkHeadersFromBidiNetworkHeaders=ke.bidiNetworkHeadersFromCdpNetworkHeaders=ke.computeHeadersSize=void 0,ke.computeHeadersSize=function(e){const t=e.reduce(((e,t)=>`${e}${t.name}: ${t.value.value}\r\n`),"");return(new TextEncoder).encode(t).length},ke.bidiNetworkHeadersFromCdpNetworkHeaders=function(e){return e?Object.entries(e).map((([e,t])=>({name:e,value:{type:"string",value:t}}))):[]},ke.cdpNetworkHeadersFromBidiNetworkHeaders=function(e){if(void 0!==e)return e.reduce(((e,t)=>(e[t.name]=t.value.value,e)),{})},ke.bidiNetworkHeadersFromCdpFetchHeaders=function(e){return e?e.map((({name:e,value:t})=>({name:e,value:{type:"string",value:t}}))):[]},ke.cdpFetchHeadersFromBidiNetworkHeaders=function(e){if(void 0!==e)return e.map((({name:e,value:t})=>({name:e,value:t.value})))},ke.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction=function(e){switch(e){case"default":return"Default";case"cancel":return"CancelAuth";case"provideCredentials":return"ProvideCredentials"}},Object.defineProperty(Ie,"__esModule",{value:!0}),Ie.NetworkRequest=void 0;const Re=g,Ee=J,_e=G,Te=ke;class Ne{static#ae="UNKNOWN";#re;#ne=void 0;#se=!1;#oe;#P;#ie;#ce={};#de={};#ue=new _e.Deferred;#le=new _e.Deferred;#he=new _e.Deferred;#$;constructor(e,t,a,r,n=0){this.#re=e,this.#P=t,this.#ie=a,this.#$=r,this.#oe=n}get requestId(){return this.#re}get url(){return this.#de.info?.url??this.#ce.info?.request.url}get redirectCount(){return this.#oe}get cdpTarget(){return this.#$}isRedirecting(){return Boolean(this.#ce.info)}handleRedirect(e){this.#pe(),this.#me(),this.#de.hasExtraInfo=e.redirectHasExtraInfo,this.#de.info=e.redirectResponse,this.#fe(!0)}#fe(e=!1){const t=e||Boolean(this.#ce.extraInfo)||this.#se||Boolean(this.#de.info&&!this.#de.hasExtraInfo)||"beforeRequestSent"===this.#ne;this.#ce.info&&t&&this.#ue.resolve({kind:"success",value:void 0});const a=Boolean(this.#de.extraInfo)||this.#se||Boolean(this.#de.info&&!this.#de.hasExtraInfo)||"responseStarted"===this.#ne;this.#de.info&&a&&(this.#le.resolve({kind:"success",value:void 0}),this.#he.resolve({kind:"success",value:void 0}))}onRequestWillBeSentEvent(e){this.#ce.info=e,this.#ge(),this.#fe()}onRequestWillBeSentExtraInfoEvent(e){this.#ce.extraInfo=e,this.#fe()}onResponseReceivedExtraInfoEvent(e){this.#de.extraInfo=e,this.#fe()}onResponseReceivedEvent(e){this.#de.hasExtraInfo=e.hasExtraInfo,this.#de.info=e.response,this.#pe(),this.#me(),this.#fe()}onServedFromCache(){this.#se=!0,this.#fe()}onLoadingFailedEvent(e){this.#ue.resolve({kind:"success",value:void 0}),this.#le.resolve({kind:"error",error:new Error("Network event loading failed")}),this.#he.resolve({kind:"error",error:new Error("Network event loading failed")}),this.#P.registerEvent({type:"event",method:Re.ChromiumBidi.Network.EventNames.FetchError,params:{...this.#ye(),errorText:e.errorText}},this.#Se)}onRequestPaused(e){if(this.#ve())return void this.continueRequest(e.requestId).catch((()=>{}));let t;t=void 0===e.responseErrorReason&&void 0===e.responseStatusCode?"beforeRequestSent":401===e.responseStatusCode&&"Unauthorized"===e.responseStatusText?"authRequired":"responseStarted";const a=(0,Te.bidiNetworkHeadersFromCdpFetchHeaders)(e.responseHeaders);this.#ie.addBlockedRequest(this.requestId,{request:e.requestId,phase:t,response:{url:e.request.url,protocol:"",status:e.responseStatusCode??0,statusText:e.responseStatusText??"",fromCache:!1,headers:a,mimeType:"",bytesReceived:0,headersSize:(0,Te.computeHeadersSize)(a),bodySize:0,content:{size:0},authChallenge:void 0}}),this.#ne=t,this.#fe()}async failRequest(e,t){await this.#$.cdpClient.sendCommand("Fetch.failRequest",{requestId:e,errorReason:t}),this.#ne=void 0}async continueRequest(e,t,a,r){await this.#$.cdpClient.sendCommand("Fetch.continueRequest",{requestId:e,url:t,method:a,headers:r}),this.#ne=void 0}async continueResponse(e,t,a,r){await this.#$.cdpClient.sendCommand("Fetch.continueResponse",{requestId:e,responseCode:t,responsePhrase:a,responseHeaders:r}),this.#ne=void 0}async continueWithAuth(e,t,a,r){await this.#$.cdpClient.sendCommand("Fetch.continueWithAuth",{requestId:e,authChallengeResponse:{response:t,username:a,password:r}}),this.#ne=void 0}async provideResponse(e,t,a,r,n){await this.#$.cdpClient.sendCommand("Fetch.fulfillRequest",{requestId:e,responseCode:t,responsePhrase:a,responseHeaders:r,...n?{body:btoa(n)}:{}}),this.#ne=void 0}dispose(){const e={kind:"error",error:new Error("Network processor detached")};this.#ue.resolve(e),this.#le.resolve(e),this.#he.resolve(e)}get#Se(){return this.#ce.info?.frameId??null}get statusCode(){return this.#de.info?.status??this.#de.extraInfo?.statusCode??-1}#ye(e){const t=void 0!==e&&e===this.#ne,a=this.#ie.getNetworkIntercepts(this.#re,e);return{isBlocked:t,context:this.#Se,navigation:this.#we(),redirectCount:this.#oe,request:this.#Ce(),timestamp:Math.round(1e3*(this.#ce.info?.wallTime??0)),intercepts:t?a:void 0}}#we(){return this.#ce.info&&this.#ce.info.loaderId&&this.#ce.info.loaderId===this.#ce.info.requestId?this.#ce.info.loaderId:null}#Ce(){const e=this.#ce.extraInfo?Ne.#be(this.#ce.extraInfo.associatedCookies):[],t=(0,Te.bidiNetworkHeadersFromCdpNetworkHeaders)(this.#ce.info?.request.headers);return{request:this.#ce.info?.requestId??Ne.#ae,url:this.#ce.info?.request.url??Ne.#ae,method:this.#ce.info?.request.method??Ne.#ae,headers:t,cookies:e,headersSize:(0,Te.computeHeadersSize)(t),bodySize:0,timings:this.#xe()}}#xe(){return{timeOrigin:0,requestTime:0,redirectStart:0,redirectEnd:0,fetchStart:0,dnsStart:0,dnsEnd:0,connectStart:0,connectEnd:0,tlsStart:0,requestStart:0,responseStart:0,responseEnd:0}}#ge(){this.#ve()||this.#P.registerPromiseEvent(this.#ue.then((e=>{if("success"===e.kind)try{return{kind:"success",value:Object.assign(this.#Pe(),{type:"event"})}}catch(e){return{kind:"error",error:e instanceof Error?e:new Error("Unknown")}}return e})),this.#Se,Re.ChromiumBidi.Network.EventNames.BeforeRequestSent)}#Pe(){return(0,Ee.assert)(this.#ce.info,"RequestWillBeSentEvent is not set"),{method:Re.ChromiumBidi.Network.EventNames.BeforeRequestSent,params:{...this.#ye("beforeRequestSent"),initiator:{type:Ne.#Ie(this.#ce.info.initiator.type)}}}}#pe(){this.#ve()||this.#P.registerPromiseEvent(this.#le.then((e=>{if("success"===e.kind)try{return{kind:"success",value:Object.assign(this.#ke(),{type:"event"})}}catch(e){return{kind:"error",error:e instanceof Error?e:new Error("Unknown")}}return e})),this.#Se,Re.ChromiumBidi.Network.EventNames.ResponseStarted)}#ke(){(0,Ee.assert)(this.#ce.info,"RequestWillBeSentEvent is not set"),(0,Ee.assert)(this.#de.info,"ResponseReceivedEvent is not set"),this.#de.info.fromDiskCache&&(this.#de.extraInfo=void 0);const e=(0,Te.bidiNetworkHeadersFromCdpNetworkHeaders)(this.#de.info.headers);return{method:Re.ChromiumBidi.Network.EventNames.ResponseStarted,params:{...this.#ye(),response:{url:this.#de.info.url??Ne.#ae,protocol:this.#de.info.protocol??"",status:this.statusCode,statusText:this.#de.info.statusText,fromCache:this.#de.info.fromDiskCache||this.#de.info.fromPrefetchCache||this.#se,headers:e,mimeType:this.#de.info.mimeType,bytesReceived:this.#de.info.encodedDataLength,headersSize:(0,Te.computeHeadersSize)(e),bodySize:0,content:{size:0}}}}}#me(){this.#ve()||this.#P.registerPromiseEvent(this.#he.then((e=>{if("success"===e.kind)try{return{kind:"success",value:Object.assign(this.#Re(),{type:"event"})}}catch(e){return{kind:"error",error:e instanceof Error?e:new Error("Unknown")}}return e})),this.#Se,Re.ChromiumBidi.Network.EventNames.ResponseCompleted)}#Re(){(0,Ee.assert)(this.#ce.info,"RequestWillBeSentEvent is not set"),(0,Ee.assert)(this.#de.info,"ResponseReceivedEvent is not set"),this.#de.info.fromDiskCache&&(this.#de.extraInfo=void 0);const e=(0,Te.bidiNetworkHeadersFromCdpNetworkHeaders)(this.#de.info.headers);return{method:Re.ChromiumBidi.Network.EventNames.ResponseCompleted,params:{...this.#ye(),response:{url:this.#de.info.url??Ne.#ae,protocol:this.#de.info.protocol??"",status:this.statusCode,statusText:this.#de.info.statusText,fromCache:this.#de.info.fromDiskCache||this.#de.info.fromPrefetchCache||this.#se,headers:e,mimeType:this.#de.info.mimeType,bytesReceived:this.#de.info.encodedDataLength,headersSize:(0,Te.computeHeadersSize)(e),bodySize:0,content:{size:0}}}}}#ve(){return this.#ce.info?.request.url.endsWith("/favicon.ico")??!1}static#Ie(e){switch(e){case"parser":case"script":case"preflight":return e;default:return"other"}}static#be(e){return e.filter((({blockedReasons:e})=>!Array.isArray(e)||0===e.length)).map((({cookie:e})=>({name:e.name,value:{type:"string",value:e.value},domain:e.domain,path:e.path,expires:e.expires,size:e.size,httpOnly:e.httpOnly,secure:e.secure,sameSite:Ne.#Ee(e.sameSite)})))}static#Ee(e){switch(e){case"Strict":return"strict";case"Lax":return"lax";default:return"none"}}}Ie.NetworkRequest=Ne,Object.defineProperty(Pe,"__esModule",{value:!0}),Pe.NetworkManager=void 0;const je=Ie;class Oe{#$;#P;#ie;constructor(e,t,a){this.#$=e,this.#P=t,this.#ie=a}get cdpTarget(){return this.#$}#_e(e,t){let a=this.#ie.getRequest(e);return a||(a=new je.NetworkRequest(e,this.#P,this.#ie,this.#$,t),this.#ie.addRequest(a),a)}static create(e,t,a){const r=new Oe(e,t,a);return e.browserCdpClient.on("Target.detachedFromTarget",(t=>{e.cdpClient.sessionId===t.sessionId&&r.#ie.disposeRequestMap()})),e.cdpClient.on("Network.requestWillBeSent",(e=>{const t=r.#ie.getRequest(e.requestId);t&&t.isRedirecting()?(t.handleRedirect(e),r.#ie.deleteRequest(e.requestId),r.#_e(e.requestId,t.redirectCount+1).onRequestWillBeSentEvent(e)):t?t.onRequestWillBeSentEvent(e):r.#_e(e.requestId).onRequestWillBeSentEvent(e)})),e.cdpClient.on("Network.requestWillBeSentExtraInfo",(e=>{r.#_e(e.requestId).onRequestWillBeSentExtraInfoEvent(e)})),e.cdpClient.on("Network.responseReceived",(e=>{r.#_e(e.requestId).onResponseReceivedEvent(e)})),e.cdpClient.on("Network.responseReceivedExtraInfo",(e=>{r.#_e(e.requestId).onResponseReceivedExtraInfoEvent(e)})),e.cdpClient.on("Network.requestServedFromCache",(e=>{r.#_e(e.requestId).onServedFromCache()})),e.cdpClient.on("Network.loadingFailed",(e=>{r.#_e(e.requestId).onLoadingFailedEvent(e)})),e.cdpClient.on("Fetch.requestPaused",(e=>{e.networkId&&r.#_e(e.networkId).onRequestPaused(e)})),r}}Pe.NetworkManager=Oe,Object.defineProperty(ue,"__esModule",{value:!0}),ue.CdpTarget=void 0;const Me=G,Ae=le,Be=Pe;class ze{#Te;#x;#o;#Ne;#P;#je;#ie;#Oe=new Me.Deferred;#Me;static create(e,t,a,r,n,s,o,i,c){const d=new ze(e,t,a,r,s,o,i,c);return Ae.LogManager.create(d,n,s),Be.NetworkManager.create(d,s,i),d.#Ae(),d.#Be(),d}constructor(e,t,a,r,n,s,o,i){this.#Te=e,this.#x=t,this.#Ne=r,this.#P=n,this.#je=s,this.#ie=o,this.#o=a,this.#Me=i}get targetUnblocked(){return this.#Oe}get targetId(){return this.#Te}get cdpClient(){return this.#x}get browserCdpClient(){return this.#o}get cdpSessionId(){return this.#Ne}async fetchEnable(){await this.#x.sendCommand("Fetch.enable",this.#ie.getFetchEnableParams())}async fetchDisable(){await this.#x.sendCommand("Fetch.disable")}async#Be(){try{await Promise.all([this.#x.sendCommand("Runtime.enable"),this.#x.sendCommand("Page.enable"),this.#x.sendCommand("Page.setLifecycleEventsEnabled",{enabled:!0}),this.#x.sendCommand("Security.setIgnoreCertificateErrors",{ignore:this.#Me}),this.#x.sendCommand("Network.enable"),this.fetchEnable(),this.#x.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),this.#ze(),this.#x.sendCommand("Runtime.runIfWaitingForDebugger")])}catch(e){if(!this.#x.isCloseError(e))return void this.#Oe.resolve({kind:"error",error:e})}this.#Oe.resolve({kind:"success",value:void 0})}#Ae(){this.#x.on("*",((e,t)=>{"string"==typeof e&&this.#P.registerEvent({type:"event",method:`cdp.${e}`,params:{event:e,params:t,session:this.#Ne}},null)}))}getChannels(){return this.#je.find().flatMap((e=>e.channels))}async#ze(){for(const e of this.#je.find({global:!0}))await e.initInTarget(this,!0)}}ue.CdpTarget=ze,Object.defineProperty(j,"__esModule",{value:!0}),j.BrowsingContextProcessor=void 0;const De=g,Le=l,Ue=O,Ze=H,Fe=ue;j.BrowsingContextProcessor=class{#o;#c;#De;#P;#i;#ie;#Me;#C;#je;#g;#Le;#t;constructor(e,t,a,r,n,s,o,i,c,d,u,l){this.#Me=c,this.#c=e,this.#o=t,this.#De=a,this.#P=r,this.#i=n,this.#je=i,this.#ie=o,this.#g=s,this.#C=d,this.#Le=u,this.#t=l,this.#Ae(t)}getTree(e){return{contexts:(void 0===e.root?this.#i.getTopLevelContexts():[this.#i.getContext(e.root)]).map((t=>t.serializeToBidiValue(e.maxDepth??Number.MAX_VALUE)))}}async create(e){let t,a=e.userContext??"default";if(void 0!==e.referenceContext){if(t=this.#i.getContext(e.referenceContext),!t.isTopLevelContext())throw new De.InvalidArgumentException("referenceContext should be a top-level context");a=t.userContext}let r,n=!1;switch(e.type){case"tab":n=!1;break;case"window":n=!0}if("default"!==a){const e=this.#i.getAllContexts().filter((e=>e.userContext===a));e.length||(n=!0)}try{r=await this.#o.sendCommand("Target.createTarget",{url:"about:blank",newWindow:n,browserContextId:"default"===a?void 0:a})}catch(e){if(e.message.startsWith("Failed to find browser context with id"))throw new De.NoSuchUserContextException(`The context ${a} was not found`);throw e}const s=r.targetId,o=this.#i.getContext(s);return await o.lifecycleLoaded(),{context:o.id}}navigate(e){return this.#i.getContext(e.context).navigate(e.url,e.wait??"none")}reload(e){return this.#i.getContext(e.context).reload(e.ignoreCache??!1,e.wait??"none")}async activate(e){const t=this.#i.getContext(e.context);if(!t.isTopLevelContext())throw new De.InvalidArgumentException("Activation is only supported on the top-level context");return await t.activate(),{}}async captureScreenshot(e){const t=this.#i.getContext(e.context);return await t.captureScreenshot(e)}async print(e){const t=this.#i.getContext(e.context);return await t.print(e)}async setViewport(e){const t=this.#i.getContext(e.context);if(!t.isTopLevelContext())throw new De.InvalidArgumentException("Emulating viewport is only supported on the top-level context");return await t.setViewport(e.viewport,e.devicePixelRatio),{}}async traverseHistory(e){const t=this.#i.getContext(e.context);if(!t)throw new De.InvalidArgumentException(`No browsing context with id ${e.context}`);return await t.traverseHistory(e.delta),{}}async handleUserPrompt(e){const t=this.#i.getContext(e.context);return await t.handleUserPrompt(e),{}}async close(e){const t=this.#i.getContext(e.context);if(!t.isTopLevelContext())throw new De.InvalidArgumentException(`Non top-level browsing context ${t.id} cannot be closed.`);try{const a=new Promise((t=>{const a=r=>{r.targetId===e.context&&(this.#o.off("Target.detachedFromTarget",a),t())};this.#o.on("Target.detachedFromTarget",a)}));e.promptUnload?await t.close():await this.#o.sendCommand("Target.closeTarget",{targetId:e.context}),await a}catch(e){if(-32e3!==e.code||"Not attached to an active page"!==e.message)throw e}return{}}#Ae(e){e.on("Target.attachedToTarget",(t=>{this.#Ue(t,e)})),e.on("Target.detachedFromTarget",(e=>{this.#Ze(e)})),e.on("Target.targetInfoChanged",(e=>{this.#Fe(e)})),e.on("Page.frameAttached",(e=>{this.#qe(e)})),e.on("Page.frameDetached",(e=>{this.#Ve(e)}))}#qe(e){const t=this.#i.findContext(e.parentFrameId);void 0!==t&&Ze.BrowsingContextImpl.create(t.cdpTarget,this.#g,e.frameId,e.parentFrameId,t.userContext,this.#P,this.#i,this.#C,this.#t)}#Ve(e){"swap"!==e.reason&&this.#i.findContext(e.frameId)?.dispose()}#Ue(e,t){const{sessionId:a,targetInfo:r}=e,n=this.#c.getCdpClient(a);switch(this.#t?.(Le.LogType.debugInfo,"AttachedToTarget event received:",e),r.type){case"page":case"iframe":{if(r.targetId===this.#De)break;this.#Ae(n);const e=Fe.CdpTarget.create(r.targetId,n,this.#o,a,this.#g,this.#P,this.#je,this.#ie,this.#Me),t=this.#i.findContext(r.targetId);return void(t?t.updateCdpTarget(e):Ze.BrowsingContextImpl.create(e,this.#g,r.targetId,null,r.browserContextId&&r.browserContextId!==this.#Le?r.browserContextId:"default",this.#P,this.#i,this.#C,this.#t))}case"worker":{this.#Ae(n);const e=Fe.CdpTarget.create(r.targetId,n,this.#o,a,this.#g,this.#P,this.#je,this.#ie,this.#Me),s=t.sessionId&&this.#i.findContextBySession(t.sessionId);if(!s)break;return void this.#$e(e,s.id)}}n.sendCommand("Runtime.runIfWaitingForDebugger").then((()=>t.sendCommand("Target.detachFromTarget",e))).catch((e=>this.#t?.(Le.LogType.debugError,e)))}#Ke=new Map;#$e(e,t){e.cdpClient.on("Runtime.executionContextCreated",(a=>{const{uniqueId:r,id:n,origin:s}=a.context,o=new Ue.Realm(this.#g,this.#i,r,t,n,(0,Ze.serializeOrigin)(s),"dedicated-worker",void 0,e.cdpClient,this.#P,this.#C,this.#t);this.#Ke.set(e.cdpSessionId,o)}))}#Ze(e){const t=this.#i.findContextBySession(e.sessionId);if(t)return t.dispose(),void this.#je.find({targetId:t.id}).map((e=>e.dispose(t.id)));const a=this.#Ke.get(e.sessionId);a&&this.#g.deleteRealms({cdpSessionId:a.cdpClient.sessionId})}#Fe(e){const t=this.#i.findContext(e.targetInfo.targetId);t&&t.onTargetInfoChanged(e)}};var qe={},Ve={},$e={};Object.defineProperty($e,"__esModule",{value:!0}),$e.WheelSource=$e.PointerSource=$e.KeySource=$e.NoneSource=void 0;$e.NoneSource=class{type="none"};$e.KeySource=class{type="key";pressed=new Set;#We=0;get modifiers(){return this.#We}get alt(){return 1==(1&this.#We)}set alt(e){this.#He(e,1)}get ctrl(){return 2==(2&this.#We)}set ctrl(e){this.#He(e,2)}get meta(){return 4==(4&this.#We)}set meta(e){this.#He(e,4)}get shift(){return 8==(8&this.#We)}set shift(e){this.#He(e,8)}#He(e,t){e?this.#We|=t:this.#We&=~t}};$e.PointerSource=class{type="pointer";subtype;pointerId;pressed=new Set;x=0;y=0;constructor(e,t){this.pointerId=e,this.subtype=t}get buttons(){let e=0;for(const t of this.pressed)switch(t){case 0:e|=1;break;case 1:e|=4;break;case 2:e|=2;break;case 3:e|=8;break;case 4:e|=16}return e}static ClickContext=class e{static#Je=500;static#Ge=2;count=0;#Xe;#Ye;#Qe;constructor(e,t,a){this.#Xe=e,this.#Ye=t,this.#Qe=a}compare(t){return t.#Qe-this.#Qe>e.#Je||Math.abs(t.#Xe-this.#Xe)>e.#Ge||Math.abs(t.#Ye-this.#Ye)>e.#Ge}};#et=new Map;setClickCount(e,t){let a=this.#et.get(e);return a&&!a.compare(t)||(a=t),++a.count,this.#et.set(e,a),a.count}getClickCount(e){return this.#et.get(e)?.count??0}};$e.WheelSource=class{type="wheel"};var Ke={};Object.defineProperty(Ke,"__esModule",{value:!0}),Ke.getKeyLocation=Ke.getKeyCode=Ke.getNormalizedKey=void 0,Ke.getNormalizedKey=function(e){switch(e){case"\ue000":return"Unidentified";case"\ue001":return"Cancel";case"\ue002":return"Help";case"\ue003":return"Backspace";case"\ue004":return"Tab";case"\ue005":return"Clear";case"\ue006":return"Return";case"\ue007":return"Enter";case"\ue008":case"\ue050":return"Shift";case"\ue009":case"\ue051":return"Control";case"\ue00a":case"\ue052":return"Alt";case"\ue00b":return"Pause";case"\ue00c":return"Escape";case"\ue00d":return" ";case"\ue00e":case"\ue054":return"PageUp";case"\ue00f":case"\ue055":return"PageDown";case"\ue010":case"\ue056":return"End";case"\ue011":case"\ue057":return"Home";case"\ue012":case"\ue058":return"ArrowLeft";case"\ue013":case"\ue059":return"ArrowUp";case"\ue014":case"\ue05a":return"ArrowRight";case"\ue015":case"\ue05b":return"ArrowDown";case"\ue016":case"\ue05c":return"Insert";case"\ue017":case"\ue05d":return"Delete";case"\ue018":return";";case"\ue019":return"=";case"\ue01a":return"0";case"\ue01b":return"1";case"\ue01c":return"2";case"\ue01d":return"3";case"\ue01e":return"4";case"\ue01f":return"5";case"\ue020":return"6";case"\ue021":return"7";case"\ue022":return"8";case"\ue023":return"9";case"\ue024":return"*";case"\ue025":return"+";case"\ue026":return",";case"\ue027":return"-";case"\ue028":return".";case"\ue029":return"/";case"\ue031":return"F1";case"\ue032":return"F2";case"\ue033":return"F3";case"\ue034":return"F4";case"\ue035":return"F5";case"\ue036":return"F6";case"\ue037":return"F7";case"\ue038":return"F8";case"\ue039":return"F9";case"\ue03a":return"F10";case"\ue03b":return"F11";case"\ue03c":return"F12";case"\ue03d":case"\ue053":return"Meta";case"\ue040":return"ZenkakuHankaku";default:return e}},Ke.getKeyCode=function(e){switch(e){case"`":case"~":return"Backquote";case"\\":case"|":return"Backslash";case"\ue003":return"Backspace";case"[":case"{":return"BracketLeft";case"]":case"}":return"BracketRight";case",":case"<":return"Comma";case"0":case")":return"Digit0";case"1":case"!":return"Digit1";case"2":case"@":return"Digit2";case"3":case"#":return"Digit3";case"4":case"$":return"Digit4";case"5":case"%":return"Digit5";case"6":case"^":return"Digit6";case"7":case"&":return"Digit7";case"8":case"*":return"Digit8";case"9":case"(":return"Digit9";case"=":case"+":return"Equal";case"a":case"A":return"KeyA";case"b":case"B":return"KeyB";case"c":case"C":return"KeyC";case"d":case"D":return"KeyD";case"e":case"E":return"KeyE";case"f":case"F":return"KeyF";case"g":case"G":return"KeyG";case"h":case"H":return"KeyH";case"i":case"I":return"KeyI";case"j":case"J":return"KeyJ";case"k":case"K":return"KeyK";case"l":case"L":return"KeyL";case"m":case"M":return"KeyM";case"n":case"N":return"KeyN";case"o":case"O":return"KeyO";case"p":case"P":return"KeyP";case"q":case"Q":return"KeyQ";case"r":case"R":return"KeyR";case"s":case"S":return"KeyS";case"t":case"T":return"KeyT";case"u":case"U":return"KeyU";case"v":case"V":return"KeyV";case"w":case"W":return"KeyW";case"x":case"X":return"KeyX";case"y":case"Y":return"KeyY";case"z":case"Z":return"KeyZ";case"-":case"_":return"Minus";case".":return"Period";case"'":case'"':return"Quote";case";":case":":return"Semicolon";case"/":case"?":return"Slash";case"\ue00a":return"AltLeft";case"\ue052":return"AltRight";case"\ue009":return"ControlLeft";case"\ue051":return"ControlRight";case"\ue006":return"Enter";case"\ue03d":return"MetaLeft";case"\ue053":return"MetaRight";case"\ue008":return"ShiftLeft";case"\ue050":return"ShiftRight";case" ":case"\ue00d":return"Space";case"\ue004":return"Tab";case"\ue017":return"Delete";case"\ue010":return"End";case"\ue002":return"Help";case"\ue011":return"Home";case"\ue016":return"Insert";case"\ue00f":return"PageDown";case"\ue00e":return"PageUp";case"\ue015":return"ArrowDown";case"\ue012":return"ArrowLeft";case"\ue014":return"ArrowRight";case"\ue013":return"ArrowUp";case"\ue00c":return"Escape";case"\ue031":return"F1";case"\ue032":return"F2";case"\ue033":return"F3";case"\ue034":return"F4";case"\ue035":return"F5";case"\ue036":return"F6";case"\ue037":return"F7";case"\ue038":return"F8";case"\ue039":return"F9";case"\ue03a":return"F10";case"\ue03b":return"F11";case"\ue03c":return"F12";case"\ue01a":case"\ue05c":return"Numpad0";case"\ue01b":case"\ue056":return"Numpad1";case"\ue01c":case"\ue05b":return"Numpad2";case"\ue01d":case"\ue055":return"Numpad3";case"\ue01e":case"\ue058":return"Numpad4";case"\ue01f":return"Numpad5";case"\ue020":case"\ue05a":return"Numpad6";case"\ue021":case"\ue057":return"Numpad7";case"\ue022":case"\ue059":return"Numpad8";case"\ue023":case"\ue054":return"Numpad9";case"\ue025":return"NumpadAdd";case"\ue026":return"NumpadComma";case"\ue028":case"\ue05d":return"NumpadDecimal";case"\ue029":return"NumpadDivide";case"\ue007":return"NumpadEnter";case"\ue024":return"NumpadMultiply";case"\ue027":return"NumpadSubtract";default:return}},Ke.getKeyLocation=function(e){switch(e){case"\ue007":case"\ue008":case"\ue009":case"\ue00a":case"\ue03d":return 1;case"\ue01a":case"\ue01b":case"\ue01c":case"\ue01d":case"\ue01e":case"\ue01f":case"\ue020":case"\ue021":case"\ue022":case"\ue023":case"\ue024":case"\ue025":case"\ue026":case"\ue027":case"\ue028":case"\ue029":case"\ue054":case"\ue055":case"\ue056":case"\ue057":case"\ue058":case"\ue059":case"\ue05a":case"\ue05b":case"\ue05c":case"\ue05d":return 3;case"\ue050":case"\ue051":case"\ue052":case"\ue053":return 2;default:return 0}};var We={};Object.defineProperty(We,"__esModule",{value:!0}),We.KeyToKeyCode=void 0,We.KeyToKeyCode={0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,Abort:3,Help:6,Backspace:8,Tab:9,Numpad5:12,NumpadEnter:13,Enter:13,"\\r":13,"\\n":13,ShiftLeft:16,ShiftRight:16,ControlLeft:17,ControlRight:17,AltLeft:18,AltRight:18,Pause:19,CapsLock:20,Escape:27,Convert:28,NonConvert:29,Space:32,Numpad9:33,PageUp:33,Numpad3:34,PageDown:34,End:35,Numpad1:35,Home:36,Numpad7:36,ArrowLeft:37,Numpad4:37,Numpad8:38,ArrowUp:38,ArrowRight:39,Numpad6:39,Numpad2:40,ArrowDown:40,Select:41,Open:43,PrintScreen:44,Insert:45,Numpad0:45,Delete:46,NumpadDecimal:46,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,KeyA:65,KeyB:66,KeyC:67,KeyD:68,KeyE:69,KeyF:70,KeyG:71,KeyH:72,KeyI:73,KeyJ:74,KeyK:75,KeyL:76,KeyM:77,KeyN:78,KeyO:79,KeyP:80,KeyQ:81,KeyR:82,KeyS:83,KeyT:84,KeyU:85,KeyV:86,KeyW:87,KeyX:88,KeyY:89,KeyZ:90,MetaLeft:91,MetaRight:92,ContextMenu:93,NumpadMultiply:106,NumpadAdd:107,NumpadSubtract:109,NumpadDivide:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,F16:127,F17:128,F18:129,F19:130,F20:131,F21:132,F22:133,F23:134,F24:135,NumLock:144,ScrollLock:145,AudioVolumeMute:173,AudioVolumeDown:174,AudioVolumeUp:175,MediaTrackNext:176,MediaTrackPrevious:177,MediaStop:178,MediaPlayPause:179,Semicolon:186,Equal:187,NumpadEqual:187,Comma:188,Minus:189,Period:190,Slash:191,Backquote:192,BracketLeft:219,Backslash:220,BracketRight:221,Quote:222,AltGraph:225,Props:247,Cancel:3,Clear:12,Shift:16,Control:17,Alt:18,Accept:30,ModeChange:31," ":32,Print:42,Execute:43,"\\u0000":46,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,Meta:91,"*":106,"+":107,"-":109,"/":111,";":186,"=":187,",":188,".":190,"`":192,"[":219,"\\\\":220,"]":221,"'":222,Attn:246,CrSel:247,ExSel:248,EraseEof:249,Play:250,ZoomOut:251,")":48,"!":49,"@":50,"#":51,$:52,"%":53,"^":54,"&":55,"(":57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,":":186,"<":188,_:189,">":190,"?":191,"~":192,"{":219,"|":220,"}":221,'"':222,Camera:44,EndCall:95,VolumeDown:182,VolumeUp:183},Object.defineProperty(Ve,"__esModule",{value:!0}),Ve.ActionDispatcher=void 0;const He=g,Je=J,Ge=$e,Xe=Ke,Ye=We,Qe=(e=>{const t=e.getClientRects()[0],a=Math.max(0,Math.min(t.x,t.x+t.width)),r=Math.min(window.innerWidth,Math.max(t.x,t.x+t.width)),n=Math.max(0,Math.min(t.y,t.y+t.height));return[a+(r-a>>1),n+(Math.min(window.innerHeight,Math.max(t.y,t.y+t.height))-n>>1)]}).toString(),et=(()=>navigator.platform.toLowerCase().includes("mac")).toString();Ve.ActionDispatcher=class{static isMacOS=async e=>{const t=await(await e.getOrCreateSandbox(void 0)).callFunction(et,{type:"undefined"},[],!1,"none",{});return(0,Je.assert)("exception"!==t.type),(0,Je.assert)("boolean"===t.result.type),t.result.value};#tt=0;#at=0;#rt;#Se;#nt;constructor(e,t,a){this.#rt=e,this.#Se=t,this.#nt=a}async dispatchActions(e){await this.#rt.queue.run((async()=>{for(const t of e)await this.dispatchTickActions(t)}))}async dispatchTickActions(e){this.#tt=performance.now(),this.#at=0;for(const{action:t}of e)"duration"in t&&void 0!==t.duration&&(this.#at=Math.max(this.#at,t.duration));const t=[new Promise((e=>setTimeout(e,this.#at)))];for(const a of e)t.push(this.#st(a));await Promise.all(t)}async#st({id:e,action:t}){const a=this.#rt.get(e),r=this.#rt.getGlobalKeyState();switch(t.type){case"keyDown":await this.#ot(a,t),this.#rt.cancelList.push({id:e,action:{...t,type:"keyUp"}});break;case"keyUp":await this.#it(a,t);break;case"pause":break;case"pointerDown":await this.#ct(a,r,t),this.#rt.cancelList.push({id:e,action:{...t,type:"pointerUp"}});break;case"pointerMove":await this.#dt(a,r,t);break;case"pointerUp":await this.#ut(a,r,t);break;case"scroll":await this.#lt(a,r,t)}}#ct(e,t,a){const{button:r}=a;if(e.pressed.has(r))return;e.pressed.add(r);const{x:n,y:s,subtype:o}=e,{width:i,height:c,pressure:d,twist:u,tangentialPressure:l}=a,{tiltX:h,tiltY:p}=nt(a),{modifiers:m}=t;switch(o){case"mouse":case"pen":return this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mousePressed",x:n,y:s,modifiers:m,button:rt(r),buttons:e.buttons,clickCount:e.setClickCount(r,new Ge.PointerSource.ClickContext(n,s,performance.now())),pointerType:o,tangentialPressure:l,tiltX:h,tiltY:p,twist:u,force:d});case"touch":return this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[{x:n,y:s,...st(i??1,c??1),tangentialPressure:l,tiltX:h,tiltY:p,twist:u,force:d,id:e.pointerId}],modifiers:m})}}#ut(e,t,a){const{button:r}=a;if(!e.pressed.has(r))return;e.pressed.delete(r);const{x:n,y:s,subtype:o}=e,{modifiers:i}=t;switch(o){case"mouse":case"pen":return this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseReleased",x:n,y:s,modifiers:i,button:rt(r),buttons:e.buttons,clickCount:e.getClickCount(r),pointerType:o});case"touch":return this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[{x:n,y:s,id:e.pointerId}],modifiers:i})}}async#dt(e,t,a){const{x:r,y:n,subtype:s}=e,{width:o,height:i,pressure:c,twist:d,tangentialPressure:u,x:l,y:h,origin:p="viewport",duration:m=this.#at}=a,{tiltX:f,tiltY:g}=nt(a),{targetX:y,targetY:S}=await this.#ht(p,l,h,r,n);if(y<0||S<0)throw new He.MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${y}, y: ${S})`);let v;do{const a=m>0?(performance.now()-this.#tt)/m:1;let l,h;if(v=a>=1,v?(l=y,h=S):(l=Math.round(a*(y-r)+r),h=Math.round(a*(S-n)+n)),e.x!==l||e.y!==h){const{modifiers:a}=t;switch(s){case"mouse":await this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseMoved",x:l,y:h,modifiers:a,clickCount:0,button:rt(e.pressed.values().next().value??5),buttons:e.buttons,pointerType:s,tangentialPressure:u,tiltX:f,tiltY:g,twist:d,force:c});break;case"pen":0!==e.pressed.size&&await this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseMoved",x:l,y:h,modifiers:a,clickCount:0,button:rt(e.pressed.values().next().value??5),buttons:e.buttons,pointerType:s,tangentialPressure:u,tiltX:f,tiltY:g,twist:d,force:c});break;case"touch":0!==e.pressed.size&&await this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchTouchEvent",{type:"touchMove",touchPoints:[{x:l,y:h,...st(o??1,i??1),tangentialPressure:u,tiltX:f,tiltY:g,twist:d,force:c,id:e.pointerId}],modifiers:a})}e.x=l,e.y=h}}while(!v)}async#ht(e,t,a,r,n){let s,o;switch(e){case"viewport":s=t,o=a;break;case"pointer":s=r+t,o=n+a;break;default:{const{x:r,y:n}=await async function(e,t){const a=await e.getOrCreateSandbox(void 0),r=await a.callFunction(Qe,{type:"undefined"},[t],!1,"none",{});if("exception"===r.type)throw new He.NoSuchElementException(`Origin element ${t.sharedId} was not found`);(0,Je.assert)("array"===r.result.type),(0,Je.assert)("number"===r.result.value?.[0]?.type),(0,Je.assert)("number"===r.result.value?.[1]?.type);const{result:{value:[{value:n},{value:s}]}}=r;return{x:n,y:s}}(this.#Se,e.element);s=r+t,o=n+a;break}}return{targetX:s,targetY:o}}async#lt(e,t,a){const{deltaX:r,deltaY:n,x:s,y:o,origin:i="viewport",duration:c=this.#at}=a;if("pointer"===i)throw new He.InvalidArgumentException('"pointer" origin is invalid for scrolling.');const{targetX:d,targetY:u}=await this.#ht(i,s,o,0,0);if(d<0||u<0)throw new He.MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${d}, y: ${u})`);let l,h=0,p=0;do{const e=c>0?(performance.now()-this.#tt)/c:1;let a,s;if(l=e>=1,l?(a=r-h,s=n-p):(a=Math.round(e*r-h),s=Math.round(e*n-p)),0!==a||0!==s){const{modifiers:e}=t;await this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchMouseEvent",{type:"mouseWheel",deltaX:a,deltaY:s,x:d,y:u,modifiers:e}),h+=a,p+=s}}while(!l)}async#ot(e,t){if([...t.value].length>1)throw new He.InvalidArgumentException(`Invalid key value: ${t.value}`);const a=t.value,r=(0,Xe.getNormalizedKey)(a),n=e.pressed.has(r),s=(0,Xe.getKeyCode)(a),o=(0,Xe.getKeyLocation)(a);switch(r){case"Alt":e.alt=!0;break;case"Shift":e.shift=!0;break;case"Control":e.ctrl=!0;break;case"Meta":e.meta=!0}e.pressed.add(r);const{modifiers:i}=e,c=tt(r,e),d=at(s??"",e)??c;let u;if(this.#nt&&e.meta)switch(s){case"KeyA":u="SelectAll";break;case"KeyC":u="Copy";break;case"KeyV":u=e.shift?"PasteAndMatchStyle":"Paste";break;case"KeyX":u="Cut";break;case"KeyZ":u=e.shift?"Redo":"Undo"}const l=[this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchKeyEvent",{type:d?"keyDown":"rawKeyDown",windowsVirtualKeyCode:Ye.KeyToKeyCode[r],key:r,code:s,text:d,unmodifiedText:c,autoRepeat:n,isSystemKey:e.alt||void 0,location:o<3?o:void 0,isKeypad:3===o,modifiers:i,commands:u?[u]:void 0})];"Escape"===r&&(e.alt||(!this.#nt||e.ctrl||e.meta)&&this.#nt||l.push(this.#Se.cdpTarget.cdpClient.sendCommand("Input.cancelDragging"))),await Promise.all(l)}#it(e,t){if([...t.value].length>1)throw new He.InvalidArgumentException(`Invalid key value: ${t.value}`);const a=t.value,r=(0,Xe.getNormalizedKey)(a);if(!e.pressed.has(r))return;const n=(0,Xe.getKeyCode)(a),s=(0,Xe.getKeyLocation)(a);switch(r){case"Alt":e.alt=!1;break;case"Shift":e.shift=!1;break;case"Control":e.ctrl=!1;break;case"Meta":e.meta=!1}e.pressed.delete(r);const{modifiers:o}=e,i=tt(r,e),c=at(n??"",e)??i;return this.#Se.cdpTarget.cdpClient.sendCommand("Input.dispatchKeyEvent",{type:"keyUp",windowsVirtualKeyCode:Ye.KeyToKeyCode[r],key:r,code:n,text:c,unmodifiedText:i,location:s<3?s:void 0,isSystemKey:e.alt||void 0,isKeypad:3===s,modifiers:o})}};const tt=(e,t)=>"Enter"===e?"\r":1===[...e].length?t.shift?e.toLocaleUpperCase("en-US"):e:void 0,at=(e,t)=>{if(t.ctrl){switch(e){case"Digit2":if(t.shift)return"\0";break;case"KeyA":return"\x01";case"KeyB":return"\x02";case"KeyC":return"\x03";case"KeyD":return"\x04";case"KeyE":return"\x05";case"KeyF":return"\x06";case"KeyG":return"\x07";case"KeyH":return"\b";case"KeyI":return"\t";case"KeyJ":return"\n";case"KeyK":return"\v";case"KeyL":return"\f";case"KeyM":return"\r";case"KeyN":return"\x0e";case"KeyO":return"\x0f";case"KeyP":return"\x10";case"KeyQ":return"\x11";case"KeyR":return"\x12";case"KeyS":return"\x13";case"KeyT":return"\x14";case"KeyU":return"\x15";case"KeyV":return"\x16";case"KeyW":return"\x17";case"KeyX":return"\x18";case"KeyY":return"\x19";case"KeyZ":return"\x1a";case"BracketLeft":return"\x1b";case"Backslash":return"\x1c";case"BracketRight":return"\x1d";case"Digit6":if(t.shift)return"\x1e";break;case"Minus":return"\x1f"}return""}if(t.alt)return""};function rt(e){switch(e){case 0:return"left";case 1:return"middle";case 2:return"right";case 3:return"back";case 4:return"forward";default:return"none"}}function nt(e){const t=e.altitudeAngle??0,a=e.azimuthAngle??0;let r=0,n=0;if(0===t&&(0!==a&&a!==2*Math.PI||(r=Math.PI/2),a===Math.PI/2&&(n=Math.PI/2),a===Math.PI&&(r=-Math.PI/2),a===3*Math.PI/2&&(n=-Math.PI/2),a>0&&a<Math.PI/2&&(r=Math.PI/2,n=Math.PI/2),a>Math.PI/2&&a<Math.PI&&(r=-Math.PI/2,n=Math.PI/2),a>Math.PI&&a<3*Math.PI/2&&(r=-Math.PI/2,n=-Math.PI/2),a>3*Math.PI/2&&a<2*Math.PI&&(r=Math.PI/2,n=-Math.PI/2)),0!==t){const e=Math.tan(t);r=Math.atan(Math.cos(a)/e),n=Math.atan(Math.sin(a)/e)}const s=180/Math.PI;return{tiltX:Math.round(r*s),tiltY:Math.round(n*s)}}function st(e,t){return{radiusX:e?e/2:.5,radiusY:t?t/2:.5}}var ot={},it={},ct={};Object.defineProperty(ct,"__esModule",{value:!0}),ct.Mutex=void 0;ct.Mutex=class{#pt=!1;#mt=[];acquire(){const e={resolved:!1};return this.#pt?new Promise((t=>{this.#mt.push((()=>t(this.#ft.bind(this,e))))})):(this.#pt=!0,Promise.resolve(this.#ft.bind(this,e)))}#ft(e){if(e.resolved)throw new Error("Cannot release more than once.");e.resolved=!0;const t=this.#mt.shift();t?t():this.#pt=!1}async run(e){const t=await this.acquire();try{return await e()}finally{t()}}},Object.defineProperty(it,"__esModule",{value:!0}),it.InputState=void 0;const dt=g,ut=ct,lt=$e;it.InputState=class{cancelList=[];#gt=new Map;#yt=new ut.Mutex;getOrCreate(e,t,a){let r=this.#gt.get(e);if(!r){switch(t){case"none":r=new lt.NoneSource;break;case"key":r=new lt.KeySource;break;case"pointer":{let e="mouse"===a?0:2;const t=new Set;for(const[,e]of this.#gt)"pointer"===e.type&&t.add(e.pointerId);for(;t.has(e);)++e;r=new lt.PointerSource(e,a);break}case"wheel":r=new lt.WheelSource;break;default:throw new dt.InvalidArgumentException(`Expected "none", "key", "pointer", or "wheel". Found unknown source type ${t}.`)}return this.#gt.set(e,r),r}if(r.type!==t)throw new dt.InvalidArgumentException(`Input source type of ${e} is ${r.type}, but received ${t}.`);return r}get(e){const t=this.#gt.get(e);if(!t)throw new dt.UnknownErrorException("Internal error.");return t}getGlobalKeyState(){const e=new lt.KeySource;for(const[,t]of this.#gt)if("key"===t.type){for(const a of t.pressed)e.pressed.add(a);e.alt||=t.alt,e.ctrl||=t.ctrl,e.meta||=t.meta,e.shift||=t.shift}return e}get queue(){return this.#yt}},Object.defineProperty(ot,"__esModule",{value:!0}),ot.InputStateManager=void 0;const ht=J,pt=it;class mt extends WeakMap{get(e){return(0,ht.assert)(e.isTopLevelContext()),this.has(e)||this.set(e,new pt.InputState),super.get(e)}}ot.InputStateManager=mt,Object.defineProperty(qe,"__esModule",{value:!0}),qe.InputProcessor=void 0;const ft=g,gt=J,yt=Ve,St=ot;qe.InputProcessor=class{#i;#g;#St=new St.InputStateManager;constructor(e,t){this.#i=e,this.#g=t}async performActions(e){const t=this.#i.getContext(e.context),a=this.#St.get(t.top),r=this.#vt(e,a),n=new yt.ActionDispatcher(a,t,await yt.ActionDispatcher.isMacOS(t).catch((()=>!1)));return await n.dispatchActions(r),{}}async releaseActions(e){const t=this.#i.getContext(e.context),a=t.top,r=this.#St.get(a),n=new yt.ActionDispatcher(r,t,await yt.ActionDispatcher.isMacOS(t).catch((()=>!1)));return await n.dispatchTickActions(r.cancelList.reverse()),this.#St.delete(a),{}}async setFiles(e){const t=this.#g.findRealm({browsingContextId:e.context});if(void 0===t)throw new ft.NoSuchFrameException(`Could not find browsingContext ${e.context}`);let a;try{const r=await t.callFunction(String((function(){return this instanceof HTMLInputElement&&"file"===this.type&&!this.disabled})),e.element,[],!1,"none",{},!1);(0,gt.assert)("success"===r.type),(0,gt.assert)("boolean"===r.result.type),a=r.result.value}catch{throw new ft.NoSuchElementException(`Could not find element ${e.element.sharedId}`)}if(!a)throw new ft.UnableToSetFileInputException(`Element ${e.element.sharedId} is not a mutable file input.`);const r=[];for(let a=0;a<e.files.length;++a){const a=await t.callFunction(String((function(e){return this.files?this.files.item(e):null})),e.element,[{type:"number",value:0}],!1,"root",{},!1);if((0,gt.assert)("success"===a.type),"object"!==a.result.type)break;const{handle:n}=a.result;(0,gt.assert)(void 0!==n);const{path:s}=await t.cdpClient.sendCommand("DOM.getFileInfo",{objectId:n});r.push(s),t.disown(n).catch(void 0)}r.sort();const n=[...e.files].sort();if(r.length!==e.files.length||n.some(((e,t)=>r[t]!==e))){const{objectId:a}=await t.deserializeToCdpArg(e.element);(0,gt.assert)(void 0!==a),await t.cdpClient.sendCommand("DOM.setFileInputFiles",{files:e.files,objectId:a})}else await t.callFunction(String((function(){this.dispatchEvent(new Event("cancel",{bubbles:!0}))})),e.element,[],!1,"none",{},!1);return{}}#vt(e,t){const a=[];for(const r of e.actions){switch(r.type){case"pointer":{r.parameters??={pointerType:"mouse"},r.parameters.pointerType??="mouse";const e=t.getOrCreate(r.id,"pointer",r.parameters.pointerType);if(e.subtype!==r.parameters.pointerType)throw new ft.InvalidArgumentException(`Expected input source ${r.id} to be ${e.subtype}; got ${r.parameters.pointerType}.`);break}default:t.getOrCreate(r.id,r.type)}const e=r.actions.map((e=>({id:r.id,action:e})));for(let t=0;t<e.length;t++)a.length===t&&a.push([]),a[t].push(e[t])}return a}};var vt={},wt={},Ct={},bt=Object.defineProperty,xt=Object.getOwnPropertyDescriptor,Pt=Object.getOwnPropertyNames,It=Object.prototype.hasOwnProperty,kt={};((e,t)=>{for(var a in t)bt(e,a,{get:t[a],enumerable:!0})})(kt,{URLPattern:()=>ha});var Rt,Et=(Rt=kt,((e,t,a,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let n of Pt(t))!It.call(e,n)&&n!==a&&bt(e,n,{get:()=>t[n],enumerable:!(r=xt(t,n))||r.enumerable});return e})(bt({},"__esModule",{value:!0}),Rt)),_t=class{type=3;name="";prefix="";value="";suffix="";modifier=3;constructor(e,t,a,r,n,s){this.type=e,this.name=t,this.prefix=a,this.value=r,this.suffix=n,this.modifier=s}hasCustomName(){return""!==this.name&&"number"!=typeof this.name}},Tt=/[$_\p{ID_Start}]/u,Nt=/[$_\u200C\u200D\p{ID_Continue}]/u,jt=".*";function Ot(e,t){return(t?/^[\x00-\xFF]*$/:/^[\x00-\x7F]*$/).test(e)}function Mt(e,t=!1){let a=[],r=0;for(;r<e.length;){let n=e[r],s=function(n){if(!t)throw new TypeError(n);a.push({type:"INVALID_CHAR",index:r,value:e[r++]})};if("*"!==n)if("+"!==n&&"?"!==n)if("\\"!==n)if("{"!==n)if("}"!==n)if(":"!==n)if("("!==n)a.push({type:"CHAR",index:r,value:e[r++]});else{let t=1,n="",o=r+1,i=!1;if("?"===e[o]){s(`Pattern cannot start with "?" at ${o}`);continue}for(;o<e.length;){if(!Ot(e[o],!1)){s(`Invalid character '${e[o]}' at ${o}.`),i=!0;break}if("\\"!==e[o]){if(")"===e[o]){if(t--,0===t){o++;break}}else if("("===e[o]&&(t++,"?"!==e[o+1])){s(`Capturing groups are not allowed at ${o}`),i=!0;break}n+=e[o++]}else n+=e[o++]+e[o++]}if(i)continue;if(t){s(`Unbalanced pattern at ${r}`);continue}if(!n){s(`Missing pattern at ${r}`);continue}a.push({type:"REGEX",index:r,value:n}),r=o}else{let t="",n=r+1;for(;n<e.length;){let a=e.substr(n,1);if(!(n===r+1&&Tt.test(a)||n!==r+1&&Nt.test(a)))break;t+=e[n++]}if(!t){s(`Missing parameter name at ${r}`);continue}a.push({type:"NAME",index:r,value:t}),r=n}else a.push({type:"CLOSE",index:r,value:e[r++]});else a.push({type:"OPEN",index:r,value:e[r++]});else a.push({type:"ESCAPED_CHAR",index:r++,value:e[r++]});else a.push({type:"OTHER_MODIFIER",index:r,value:e[r++]});else a.push({type:"ASTERISK",index:r,value:e[r++]})}return a.push({type:"END",index:r,value:""}),a}function At(e,t={}){let a=Mt(e);t.delimiter??="/#?",t.prefixes??="./";let r=`[^${Bt(t.delimiter)}]+?`,n=[],s=0,o=0,i=new Set,c=e=>{if(o<a.length&&a[o].type===e)return a[o++].value},d=()=>c("OTHER_MODIFIER")??c("ASTERISK"),u=e=>{let t=c(e);if(void 0!==t)return t;let{type:r,index:n}=a[o];throw new TypeError(`Unexpected ${r} at ${n}, expected ${e}`)},l=()=>{let e,t="";for(;e=c("CHAR")??c("ESCAPED_CHAR");)t+=e;return t},h=t.encodePart||(e=>e),p="",m=e=>{p+=e},f=()=>{p.length&&(n.push(new _t(3,"","",h(p),"",3)),p="")},g=(e,t,a,o,c)=>{let d,u=3;switch(c){case"?":u=1;break;case"*":u=0;break;case"+":u=2}if(!t&&!a&&3===u)return void m(e);if(f(),!t&&!a){if(!e)return;return void n.push(new _t(3,"","",h(e),"",u))}d=a?"*"===a?jt:a:r;let l,p=2;if(d===r?(p=1,d=""):d===jt&&(p=0,d=""),t?l=t:a&&(l=s++),i.has(l))throw new TypeError(`Duplicate name '${l}'.`);i.add(l),n.push(new _t(p,l,h(e),d,h(o),u))};for(;o<a.length;){let e=c("CHAR"),a=c("NAME"),r=c("REGEX");if(!a&&!r&&(r=c("ASTERISK")),a||r){let n=e??"";-1===t.prefixes.indexOf(n)&&(m(n),n=""),f(),g(n,a,r,"",d());continue}let n=e??c("ESCAPED_CHAR");if(n)m(n);else if(c("OPEN")){let e=l(),t=c("NAME"),a=c("REGEX");!t&&!a&&(a=c("ASTERISK"));let r=l();u("CLOSE"),g(e,t,a,r,d())}else f(),u("END")}return n}function Bt(e){return e.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}function zt(e){return e&&e.ignoreCase?"ui":"u"}function Dt(e){switch(e){case 0:return"*";case 1:return"?";case 2:return"+";case 3:return""}}function Lt(e,t,a={}){a.delimiter??="/#?",a.prefixes??="./",a.sensitive??=!1,a.strict??=!1,a.end??=!0,a.start??=!0,a.endsWith="";let r=a.start?"^":"";for(let n of e){if(3===n.type){3===n.modifier?r+=Bt(n.value):r+=`(?:${Bt(n.value)})${Dt(n.modifier)}`;continue}t&&t.push(n.name);let e=`[^${Bt(a.delimiter)}]+?`,s=n.value;(1===n.type?s=e:0===n.type&&(s=jt),n.prefix.length||n.suffix.length)?3!==n.modifier&&1!==n.modifier?(r+=`(?:${Bt(n.prefix)}`,r+=`((?:${s})(?:`,r+=Bt(n.suffix),r+=Bt(n.prefix),r+=`(?:${s}))*)${Bt(n.suffix)})`,0===n.modifier&&(r+="?")):(r+=`(?:${Bt(n.prefix)}(${s})${Bt(n.suffix)})`,r+=Dt(n.modifier)):3===n.modifier||1===n.modifier?r+=`(${s})${Dt(n.modifier)}`:r+=`((?:${s})${Dt(n.modifier)})`}let n=`[${Bt(a.endsWith)}]|$`,s=`[${Bt(a.delimiter)}]`;if(a.end)return a.strict||(r+=`${s}?`),a.endsWith.length?r+=`(?=${n})`:r+="$",new RegExp(r,zt(a));a.strict||(r+=`(?:${s}(?=${n}))?`);let o=!1;if(e.length){let t=e[e.length-1];3===t.type&&3===t.modifier&&(o=a.delimiter.indexOf(t)>-1)}return o||(r+=`(?=${s}|${n})`),new RegExp(r,zt(a))}var Ut={delimiter:"",prefixes:"",sensitive:!0,strict:!0},Zt={delimiter:".",prefixes:"",sensitive:!0,strict:!0},Ft={delimiter:"/",prefixes:"/",sensitive:!0,strict:!0};function qt(e,t){return e.startsWith(t)?e.substring(t.length,e.length):e}function Vt(e){return!(!e||e.length<2)&&("["===e[0]||("\\"===e[0]||"{"===e[0])&&"["===e[1])}var $t=["ftp","file","http","https","ws","wss"];function Kt(e){if(!e)return!0;for(let t of $t)if(e.test(t))return!0;return!1}function Wt(e){switch(e){case"ws":case"http":return"80";case"wws":case"https":return"443";case"ftp":return"21";default:return""}}function Ht(e){if(""===e)return e;if(/^[-+.A-Za-z0-9]*$/.test(e))return e.toLowerCase();throw new TypeError(`Invalid protocol '${e}'.`)}function Jt(e){if(""===e)return e;let t=new URL("https://example.com");return t.username=e,t.username}function Gt(e){if(""===e)return e;let t=new URL("https://example.com");return t.password=e,t.password}function Xt(e){if(""===e)return e;if(/[\t\n\r #%/:<>?@[\]^\\|]/g.test(e))throw new TypeError(`Invalid hostname '${e}'`);let t=new URL("https://example.com");return t.hostname=e,t.hostname}function Yt(e){if(""===e)return e;if(/[^0-9a-fA-F[\]:]/g.test(e))throw new TypeError(`Invalid IPv6 hostname '${e}'`);return e.toLowerCase()}function Qt(e){if(""===e||/^[0-9]*$/.test(e)&&parseInt(e)<=65535)return e;throw new TypeError(`Invalid port '${e}'.`)}function ea(e){if(""===e)return e;let t=new URL("https://example.com");return t.pathname="/"!==e[0]?"/-"+e:e,"/"!==e[0]?t.pathname.substring(2,t.pathname.length):t.pathname}function ta(e){return""===e?e:new URL(`data:${e}`).pathname}function aa(e){if(""===e)return e;let t=new URL("https://example.com");return t.search=e,t.search.substring(1,t.search.length)}function ra(e){if(""===e)return e;let t=new URL("https://example.com");return t.hash=e,t.hash.substring(1,t.hash.length)}var na=class{#wt;#Ct=[];#bt={};#xt=0;#Pt=1;#It=0;#kt=0;#Rt=0;#Et=0;#_t=!1;constructor(e){this.#wt=e}get result(){return this.#bt}parse(){for(this.#Ct=Mt(this.#wt,!0);this.#xt<this.#Ct.length;this.#xt+=this.#Pt){if(this.#Pt=1,"END"===this.#Ct[this.#xt].type){if(0===this.#kt){this.#Tt(),this.#Nt()?this.#jt(9,1):this.#Ot()?(this.#jt(8,1),this.#bt.hash=""):(this.#jt(7,0),this.#bt.search="",this.#bt.hash="");continue}if(2===this.#kt){this.#Mt(5);continue}this.#jt(10,0);break}if(this.#Rt>0){if(!this.#At())continue;this.#Rt-=1}if(this.#Bt())this.#Rt+=1;else switch(this.#kt){case 0:this.#zt()&&(this.#bt.username="",this.#bt.password="",this.#bt.hostname="",this.#bt.port="",this.#bt.pathname="",this.#bt.search="",this.#bt.hash="",this.#Mt(1));break;case 1:if(this.#zt()){this.#Dt();let e=7,t=1;this.#_t&&(this.#bt.pathname="/"),this.#Lt()?(e=2,t=3):this.#_t&&(e=2),this.#jt(e,t)}break;case 2:this.#Xe()?this.#Mt(3):(this.#Ut()||this.#Ot()||this.#Nt())&&this.#Mt(5);break;case 3:this.#Zt()?this.#jt(4,1):this.#Xe()&&this.#jt(5,1);break;case 4:this.#Xe()&&this.#jt(5,1);break;case 5:this.#Ft()?this.#Et+=1:this.#qt()&&(this.#Et-=1),this.#Ye()&&!this.#Et?this.#jt(6,1):this.#Ut()?this.#jt(7,0):this.#Ot()?this.#jt(8,1):this.#Nt()&&this.#jt(9,1);break;case 6:this.#Ut()?this.#jt(7,0):this.#Ot()?this.#jt(8,1):this.#Nt()&&this.#jt(9,1);break;case 7:this.#Ot()?this.#jt(8,1):this.#Nt()&&this.#jt(9,1);break;case 8:this.#Nt()&&this.#jt(9,1)}}}#jt(e,t){switch(this.#kt){case 0:case 2:break;case 1:this.#bt.protocol=this.#Vt();break;case 3:this.#bt.username=this.#Vt();break;case 4:this.#bt.password=this.#Vt();break;case 5:this.#bt.hostname=this.#Vt();break;case 6:this.#bt.port=this.#Vt();break;case 7:this.#bt.pathname=this.#Vt();break;case 8:this.#bt.search=this.#Vt();break;case 9:this.#bt.hash=this.#Vt()}this.#$t(e,t)}#$t(e,t){this.#kt=e,this.#It=this.#xt+t,this.#xt+=t,this.#Pt=0}#Tt(){this.#xt=this.#It,this.#Pt=0}#Mt(e){this.#Tt(),this.#kt=e}#Kt(e){return e<0&&(e=this.#Ct.length-e),e<this.#Ct.length?this.#Ct[e]:this.#Ct[this.#Ct.length-1]}#Wt(e,t){let a=this.#Kt(e);return a.value===t&&("CHAR"===a.type||"ESCAPED_CHAR"===a.type||"INVALID_CHAR"===a.type)}#zt(){return this.#Wt(this.#xt,":")}#Lt(){return this.#Wt(this.#xt+1,"/")&&this.#Wt(this.#xt+2,"/")}#Xe(){return this.#Wt(this.#xt,"@")}#Zt(){return this.#Wt(this.#xt,":")}#Ye(){return this.#Wt(this.#xt,":")}#Ut(){return this.#Wt(this.#xt,"/")}#Ot(){if(this.#Wt(this.#xt,"?"))return!0;if("?"!==this.#Ct[this.#xt].value)return!1;let e=this.#Kt(this.#xt-1);return"NAME"!==e.type&&"REGEX"!==e.type&&"CLOSE"!==e.type&&"ASTERISK"!==e.type}#Nt(){return this.#Wt(this.#xt,"#")}#Bt(){return"OPEN"==this.#Ct[this.#xt].type}#At(){return"CLOSE"==this.#Ct[this.#xt].type}#Ft(){return this.#Wt(this.#xt,"[")}#qt(){return this.#Wt(this.#xt,"]")}#Vt(){let e=this.#Ct[this.#xt],t=this.#Kt(this.#It).index;return this.#wt.substring(t,e.index)}#Dt(){let e={};Object.assign(e,Ut),e.encodePart=Ht;let t=function(e,t,a){return Lt(At(e,a),t,a)}(this.#Vt(),void 0,e);this.#_t=Kt(t)}},sa=["protocol","username","password","hostname","port","pathname","search","hash"],oa="*";function ia(e,t){if("string"!=typeof e)throw new TypeError("parameter 1 is not of type 'string'.");let a=new URL(e,t);return{protocol:a.protocol.substring(0,a.protocol.length-1),username:a.username,password:a.password,hostname:a.hostname,port:a.port,pathname:a.pathname,search:""!==a.search?a.search.substring(1,a.search.length):void 0,hash:""!==a.hash?a.hash.substring(1,a.hash.length):void 0}}function ca(e,t){return t?ua(e):e}function da(e,t,a){let r;if("string"==typeof t.baseURL)try{r=new URL(t.baseURL),e.protocol=ca(r.protocol.substring(0,r.protocol.length-1),a),e.username=ca(r.username,a),e.password=ca(r.password,a),e.hostname=ca(r.hostname,a),e.port=ca(r.port,a),e.pathname=ca(r.pathname,a),e.search=ca(r.search.substring(1,r.search.length),a),e.hash=ca(r.hash.substring(1,r.hash.length),a)}catch{throw new TypeError(`invalid baseURL '${t.baseURL}'.`)}if("string"==typeof t.protocol&&(e.protocol=function(e,t){return e=function(e,t){return e.endsWith(t)?e.substr(0,e.length-t.length):e}(e,":"),t||""===e?e:Ht(e)}(t.protocol,a)),"string"==typeof t.username&&(e.username=function(e,t){if(t||""===e)return e;let a=new URL("https://example.com");return a.username=e,a.username}(t.username,a)),"string"==typeof t.password&&(e.password=function(e,t){if(t||""===e)return e;let a=new URL("https://example.com");return a.password=e,a.password}(t.password,a)),"string"==typeof t.hostname&&(e.hostname=function(e,t){return t||""===e?e:Vt(e)?Yt(e):Xt(e)}(t.hostname,a)),"string"==typeof t.port&&(e.port=function(e,t,a){return Wt(t)===e&&(e=""),a||""===e?e:Qt(e)}(t.port,e.protocol,a)),"string"==typeof t.pathname){if(e.pathname=t.pathname,r&&!function(e,t){return!(!e.length||"/"!==e[0]&&(!t||e.length<2||"\\"!=e[0]&&"{"!=e[0]||"/"!=e[1]))}(e.pathname,a)){let t=r.pathname.lastIndexOf("/");t>=0&&(e.pathname=ca(r.pathname.substring(0,t+1),a)+e.pathname)}e.pathname=function(e,t,a){if(a||""===e)return e;if(t&&!$t.includes(t))return new URL(`${t}:${e}`).pathname;let r="/"==e[0];return e=new URL(r?e:"/-"+e,"https://example.com").pathname,r||(e=e.substring(2,e.length)),e}(e.pathname,e.protocol,a)}return"string"==typeof t.search&&(e.search=function(e,t){if(e=qt(e,"?"),t||""===e)return e;let a=new URL("https://example.com");return a.search=e,a.search?a.search.substring(1,a.search.length):""}(t.search,a)),"string"==typeof t.hash&&(e.hash=function(e,t){if(e=qt(e,"#"),t||""===e)return e;let a=new URL("https://example.com");return a.hash=e,a.hash?a.hash.substring(1,a.hash.length):""}(t.hash,a)),e}function ua(e){return e.replace(/([+*?:{}()\\])/g,"\\$1")}function la(e,t){t.delimiter??="/#?",t.prefixes??="./",t.sensitive??=!1,t.strict??=!1,t.end??=!0,t.start??=!0,t.endsWith="";let a=`[^${function(e){return e.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}(t.delimiter)}]+?`,r=/[$_\u200C\u200D\p{ID_Continue}]/u,n="";for(let s=0;s<e.length;++s){let o=e[s];if(3===o.type){if(3===o.modifier){n+=ua(o.value);continue}n+=`{${ua(o.value)}}${Dt(o.modifier)}`;continue}let i=o.hasCustomName(),c=!!o.suffix.length||!!o.prefix.length&&(1!==o.prefix.length||!t.prefixes.includes(o.prefix)),d=s>0?e[s-1]:null,u=s<e.length-1?e[s+1]:null;if(!c&&i&&1===o.type&&3===o.modifier&&u&&!u.prefix.length&&!u.suffix.length)if(3===u.type){let e=u.value.length>0?u.value[0]:"";c=r.test(e)}else c=!u.hasCustomName();if(!c&&!o.prefix.length&&d&&3===d.type){let e=d.value[d.value.length-1];c=t.prefixes.includes(e)}c&&(n+="{"),n+=ua(o.prefix),i&&(n+=`:${o.name}`),2===o.type?n+=`(${o.value})`:1===o.type?i||(n+=`(${a})`):0===o.type&&(i||d&&3!==d.type&&3===d.modifier&&!c&&""===o.prefix?n+="(.*)":n+="*"),1===o.type&&i&&o.suffix.length&&r.test(o.suffix[0])&&(n+="\\"),n+=ua(o.suffix),c&&(n+="}"),3!==o.modifier&&(n+=Dt(o.modifier))}return n}var ha=class{#wt;#Ct={};#bt={};#xt={};#Pt={};constructor(e={},t,a){try{let r;if("string"==typeof t?r=t:a=t,"string"==typeof e){let t=new na(e);if(t.parse(),e=t.result,void 0===r&&"string"!=typeof e.protocol)throw new TypeError("A base URL must be provided for a relative constructor string.");e.baseURL=r}else{if(!e||"object"!=typeof e)throw new TypeError("parameter 1 is not of type 'string' and cannot convert to dictionary.");if(r)throw new TypeError("parameter 1 is not of type 'string'.")}typeof a>"u"&&(a={ignoreCase:!1});let n,s={ignoreCase:!0===a.ignoreCase},o={pathname:oa,protocol:oa,username:oa,password:oa,hostname:oa,port:oa,search:oa,hash:oa};for(n of(this.#wt=da(o,e,!0),Wt(this.#wt.protocol)===this.#wt.port&&(this.#wt.port=""),sa)){if(!(n in this.#wt))continue;let e={},t=this.#wt[n];switch(this.#bt[n]=[],n){case"protocol":Object.assign(e,Ut),e.encodePart=Ht;break;case"username":Object.assign(e,Ut),e.encodePart=Jt;break;case"password":Object.assign(e,Ut),e.encodePart=Gt;break;case"hostname":Object.assign(e,Zt),Vt(t)?e.encodePart=Yt:e.encodePart=Xt;break;case"port":Object.assign(e,Ut),e.encodePart=Qt;break;case"pathname":Kt(this.#Ct.protocol)?(Object.assign(e,Ft,s),e.encodePart=ea):(Object.assign(e,Ut,s),e.encodePart=ta);break;case"search":Object.assign(e,Ut,s),e.encodePart=aa;break;case"hash":Object.assign(e,Ut,s),e.encodePart=ra}try{this.#Pt[n]=At(t,e),this.#Ct[n]=Lt(this.#Pt[n],this.#bt[n],e),this.#xt[n]=la(this.#Pt[n],e)}catch{throw new TypeError(`invalid ${n} pattern '${this.#wt[n]}'.`)}}}catch(e){throw new TypeError(`Failed to construct 'URLPattern': ${e.message}`)}}test(e={},t){let a,r={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if("string"!=typeof e&&t)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof e>"u")return!1;try{r=da(r,"object"==typeof e?e:ia(e,t),!1)}catch{return!1}for(a of sa)if(!this.#Ct[a].exec(r[a]))return!1;return!0}exec(e={},t){let a={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if("string"!=typeof e&&t)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof e>"u")return;try{a=da(a,"object"==typeof e?e:ia(e,t),!1)}catch{return null}let r,n={};for(r of(n.inputs=t?[e,t]:[e],sa)){let e=this.#Ct[r].exec(a[r]);if(!e)return null;let t={};for(let[a,n]of this.#bt[r].entries())if("string"==typeof n||"number"==typeof n){let r=e[a+1];t[n]=r}n[r]={input:a[r]??"",groups:t}}return n}static compareComponent(e,t,a){let r=(e,t)=>{for(let a of["type","modifier","prefix","value","suffix"]){if(e[a]<t[a])return-1;if(e[a]!==t[a])return 1}return 0},n=new _t(3,"","","","",3),s=new _t(0,"","","","",3),o=(e,t)=>{let a=0;for(;a<Math.min(e.length,t.length);++a){let n=r(e[a],t[a]);if(n)return n}return e.length===t.length?0:r(e[a]??n,t[a]??n)};return t.#xt[e]||a.#xt[e]?t.#xt[e]&&!a.#xt[e]?o(t.#Pt[e],[s]):!t.#xt[e]&&a.#xt[e]?o([s],a.#Pt[e]):o(t.#Pt[e],a.#Pt[e]):0}get protocol(){return this.#xt.protocol}get username(){return this.#xt.username}get password(){return this.#xt.password}get hostname(){return this.#xt.hostname}get port(){return this.#xt.port}get pathname(){return this.#xt.pathname}get search(){return this.#xt.search}get hash(){return this.#xt.hash}};const{URLPattern:pa}=Et;var ma={URLPattern:pa};globalThis.URLPattern||(globalThis.URLPattern=pa),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.URLPattern=void 0;const t=ma;Object.defineProperty(e,"URLPattern",{enumerable:!0,get:function(){return t.URLPattern}}),"URLPattern"in globalThis&&(t.URLPattern=globalThis.URLPattern)}(Ct),Object.defineProperty(wt,"__esModule",{value:!0}),wt.NetworkStorage=void 0;const fa=g,ga=Ct,ya=M;class Sa{#Ht=new Map;#Jt=new Map;#Gt=new Map;disposeRequestMap(){for(const e of this.#Ht.values())e.dispose();this.#Ht.clear()}addIntercept(e){for(const[t,{urlPatterns:a,phases:r}]of this.#Jt.entries())if(JSON.stringify(e.urlPatterns)===JSON.stringify(a)&&JSON.stringify(e.phases)===JSON.stringify(r))return t;const t=(0,ya.uuidv4)();return this.#Jt.set(t,e),t}removeIntercept(e){if(!this.#Jt.has(e))throw new fa.NoSuchInterceptException(`Intercept '${e}' does not exist.`);this.#Jt.delete(e)}hasIntercepts(){return this.#Jt.size>0}getFetchEnableParams(){const e=[];for(const t of this.#Jt.values())for(const a of t.phases){const r=Sa.requestStageFromPhase(a);if(0!==t.urlPatterns.length)for(const a of t.urlPatterns){const t=Sa.cdpFromSpecUrlPattern(a);e.push({urlPattern:t,requestStage:r})}else e.push({urlPattern:"*",requestStage:r})}return{patterns:e,handleAuthRequests:[...this.#Jt.values()].some((e=>e.phases.includes("authRequired")))}}getRequest(e){return this.#Ht.get(e)}addRequest(e){this.#Ht.set(e.requestId,e)}deleteRequest(e){const t=this.#Ht.get(e);t&&(t.dispose(),this.#Ht.delete(e))}hasNetworkRequests(){return this.#Ht.size>0}hasBlockedRequests(){return this.#Gt.size>0}static cdpFromSpecUrlPattern(e){switch(e.type){case"string":return e.pattern;case"pattern":return Sa.buildUrlPatternString(e)}}static buildUrlPatternString({protocol:e,hostname:t,port:a,pathname:r,search:n}){if(!(e||t||a||r||n))return"*";let s="";return e&&(s+=e,e.endsWith(":")||(s+=":"),Sa.isSpecialScheme(e)&&(s+="//")),t&&(s+=t),a&&(s+=`:${a}`),r&&(r.startsWith("/")||(s+="/"),s+=r),n&&(n.startsWith("?")||(s+="?"),s+=n),s}static requestStageFromPhase(e){switch(e){case"beforeRequestSent":return"Request";case"responseStarted":case"authRequired":return"Response"}}static isSpecialScheme(e){return["ftp","file","http","https","ws","wss"].includes(e.replace(/:$/,""))}addBlockedRequest(e,t){this.#Gt.set(e,t)}removeBlockedRequest(e){this.#Gt.delete(e)}getBlockedRequest(e){return this.#Gt.get(e)}getNetworkIntercepts(e,t){const a=this.#Ht.get(e);if(!a)return[];const r=[];for(const[e,{phases:n,urlPatterns:s}]of this.#Jt.entries())t&&n.includes(t)&&(0===s.length||s.some((e=>Sa.matchUrlPattern(e,a.url))))&&r.push(e);return r}static matchUrlPattern(e,t){switch(e.type){case"string":return e.pattern===t;case"pattern":return null!==new ga.URLPattern({protocol:e.protocol,hostname:e.hostname,port:e.port,pathname:e.pathname,search:e.search}).exec(t)}}}wt.NetworkStorage=Sa,Object.defineProperty(vt,"__esModule",{value:!0}),vt.NetworkProcessor=void 0;const va=g,wa=J,Ca=wt,ba=ke;class xa{#i;#ie;constructor(e,t){this.#i=e,this.#ie=t}async addIntercept(e){if(0===e.phases.length)throw new va.InvalidArgumentException("At least one phase must be specified.");e.phases.includes("authRequired")&&!e.phases.includes("beforeRequestSent")&&e.phases.unshift("beforeRequestSent");const t=e.urlPatterns??[],a=xa.parseUrlPatterns(t),r=this.#ie.addIntercept({urlPatterns:a,phases:e.phases});return await this.#Xt(),{intercept:r}}async continueRequest(e){const t=e.request,{request:a,phase:r}=this.#Yt(t);if("beforeRequestSent"!==r)throw new va.InvalidArgumentException(`Blocked request for network id '${t}' is not in 'BeforeRequestSent' phase`);void 0!==e.url&&xa.parseUrlString(e.url);const{url:n,method:s,headers:o}=e,i=(0,ba.cdpFetchHeadersFromBidiNetworkHeaders)(o),c=this.#Qt(t);return await c.continueRequest(a,n,s,i),this.#ie.removeBlockedRequest(t),{}}async continueResponse(e){const t=e.request,{request:a,phase:r}=this.#Yt(t);if("beforeRequestSent"===r)throw new va.InvalidArgumentException(`Blocked request for network id '${t}' is in 'BeforeRequestSent' phase`);const{statusCode:n,reasonPhrase:s,headers:o}=e,i=(0,ba.cdpFetchHeadersFromBidiNetworkHeaders)(o),c=this.#Qt(t);return await c.continueResponse(a,n,s,i),this.#ie.removeBlockedRequest(t),{}}async continueWithAuth(e){const t=e.request,{request:a,phase:r}=this.#Yt(t);if("authRequired"!==r)throw new va.InvalidArgumentException(`Blocked request for network id '${t}' is not in 'AuthRequired' phase`);const n=this.#Qt(t);let s,o;if("provideCredentials"===e.action){const{credentials:t}=e;s=t.username,o=t.password,(0,wa.assert)("password"===t.type,`Credentials type ${t.type} must be 'password'`)}const i=(0,ba.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction)(e.action);return await n.continueWithAuth(a,i,s,o),{}}async failRequest({request:e}){const{request:t,phase:a}=this.#Yt(e);if("authRequired"===a)throw new va.InvalidArgumentException(`Blocked request for network id '${e}' is in 'AuthRequired' phase`);const r=this.#Qt(e);return await r.failRequest(t,"Failed"),this.#ie.removeBlockedRequest(e),{}}async provideResponse(e){const{statusCode:t,reasonPhrase:a,headers:r,body:n,request:s}=e,{request:o}=this.#Yt(s),i=(0,ba.cdpFetchHeadersFromBidiNetworkHeaders)(r),c=this.#Qt(s);return await c.provideResponse(o,t??c.statusCode,a,i,n?.value),this.#ie.removeBlockedRequest(s),{}}async removeIntercept(e){return this.#ie.removeIntercept(e.intercept),await this.#Xt(),{}}async#ea(){await Promise.all(this.#i.getAllContexts().map((async e=>{await e.cdpTarget.fetchEnable()})))}async#ta(){await Promise.all(this.#i.getAllContexts().map((async e=>{await e.cdpTarget.fetchDisable()})))}async#Xt(){this.#ie.hasIntercepts()||this.#ie.hasBlockedRequests()||this.#ie.hasNetworkRequests()?await this.#ea():await this.#ta()}#Yt(e){const t=this.#ie.getBlockedRequest(e);if(!t)throw new va.NoSuchRequestException(`No blocked request found for network id '${e}'`);return t}#Qt(e){const t=this.#ie.getRequest(e);if(!t)throw new va.NoSuchRequestException(`Network request with ID ${e} doesn't exist`);return t}static parseUrlString(e){try{return new URL(e)}catch(t){throw new va.InvalidArgumentException(`Invalid URL '${e}': ${t}`)}}static parseUrlPatterns(e){return e.map((e=>{switch(e.type){case"string":return xa.parseUrlString(e.pattern),e;case"pattern":if(void 0===e.protocol&&void 0===e.hostname&&void 0===e.port&&void 0===e.pathname&&void 0===e.search)return e;if(""===e.protocol)throw new va.InvalidArgumentException("URL pattern must specify a protocol");if(""===e.hostname)throw new va.InvalidArgumentException("URL pattern must specify a hostname");if((e.hostname?.length??0)>0){if(e.protocol?.match(/^file/i))throw new va.InvalidArgumentException("URL pattern protocol cannot be 'file'");if(e.hostname?.includes(":"))throw new va.InvalidArgumentException("URL pattern hostname must not contain a colon")}if(""===e.port)throw new va.InvalidArgumentException("URL pattern must specify a port");try{new URL(Ca.NetworkStorage.buildUrlPatternString(e))}catch(e){throw new va.InvalidArgumentException(`${e}`)}return e}}))}}vt.NetworkProcessor=xa;var Pa={};Object.defineProperty(Pa,"__esModule",{value:!0}),Pa.PermissionsProcessor=void 0;const Ia=g;Pa.PermissionsProcessor=class{#o;constructor(e){this.#o=e}async setPermissions(e){try{await this.#o.sendCommand("Browser.setPermission",{origin:e.origin,permission:{name:e.descriptor.name},setting:e.state})}catch(e){if("Permission can't be granted to opaque origins."===e.message)return{};throw new Ia.InvalidArgumentException(e.message)}return{}}};var ka={};Object.defineProperty(ka,"__esModule",{value:!0}),ka.PreloadScriptStorage=void 0;ka.PreloadScriptStorage=class{#aa=new Set;find(e){return e?[...this.#aa].filter((t=>(void 0===e.id||e.id===t.id)&&(!(void 0!==e.targetId&&!t.targetIds.has(e.targetId))&&(void 0===e.global||!(e.global&&void 0!==t.contexts||!e.global&&void 0===t.contexts))))):[...this.#aa]}add(e){this.#aa.add(e)}remove(e){for(const t of this.find(e))this.#aa.delete(t)}};var Ra={},Ea={};Object.defineProperty(Ea,"__esModule",{value:!0}),Ea.PreloadScript=void 0;const _a=M,Ta=A;Ea.PreloadScript=class{#u=(0,_a.uuidv4)();#ra=[];#na;#sa=new Set;#oa;#ia;#ca;get id(){return this.#u}get targetIds(){return this.#sa}constructor(e,t){this.#oa=e.arguments?.map((e=>new Ta.ChannelProxy(e.value,t)))??[],this.#na=e.functionDeclaration,this.#ia=e.sandbox,this.#ca=e.contexts}get channels(){return this.#oa}get contexts(){return this.#ca}#da(){const e=`[${this.channels.map((e=>e.getEvalInWindowStr())).join(", ")}]`;return`(()=>{(${this.#na})(...${e})})()`}async initInTargets(e,t){await Promise.all(Array.from(e).map((e=>this.initInTarget(e,t))))}async initInTarget(e,t){const a=await e.cdpClient.sendCommand("Page.addScriptToEvaluateOnNewDocument",{source:this.#da(),worldName:this.#ia,runImmediately:t});this.#ra.push({target:e,preloadScriptId:a.identifier}),this.#sa.add(e.targetId)}async remove(){for(const e of this.#ra){const t=e.target,a=e.preloadScriptId;await t.cdpClient.sendCommand("Page.removeScriptToEvaluateOnNewDocument",{identifier:a})}}dispose(e){this.#ra=this.#ra.filter((t=>t.target?.targetId!==e)),this.#sa.delete(e)}},Object.defineProperty(Ra,"__esModule",{value:!0}),Ra.ScriptProcessor=void 0;const Na=g,ja=Ea;Ra.ScriptProcessor=class{#i;#g;#je;#t;constructor(e,t,a,r){this.#i=e,this.#g=t,this.#je=a,this.#t=r}async addPreloadScript(e){const t=new Set;if(e.contexts){if(0===e.contexts.length)throw new Na.InvalidArgumentException("Contexts list is empty.");for(const a of e.contexts){const e=this.#i.getContext(a);if(!e.isTopLevelContext())throw new Na.InvalidArgumentException(`Non top-level context '${a}' given.`);t.add(e)}}const a=new ja.PreloadScript(e,this.#t);this.#je.add(a);const r=0===t.size?new Set(this.#i.getTopLevelContexts().map((e=>e.cdpTarget))):new Set([...t.values()].map((e=>e.cdpTarget)));return await a.initInTargets(r,!1),{script:a.id}}async removePreloadScript(e){const t=e.script,a=this.#je.find({id:t});if(0===a.length)throw new Na.NoSuchScriptException(`No preload script with BiDi ID '${t}'`);return await Promise.all(a.map((e=>e.remove()))),this.#je.remove({id:t}),{}}async callFunction(e){const t=await this.#ua(e.target);return await t.callFunction(e.functionDeclaration,e.this??{type:"undefined"},e.arguments??[],e.awaitPromise,e.resultOwnership??"none",e.serializationOptions??{},e.userActivation??!1)}async evaluate(e){const t=await this.#ua(e.target);return await t.evaluate(e.expression,e.awaitPromise,e.resultOwnership??"none",e.serializationOptions??{},e.userActivation??!1)}async disown(e){const t=await this.#ua(e.target);return await Promise.all(e.handles.map((async e=>await t.disown(e)))),{}}getRealms(e){void 0!==e.context&&this.#i.getContext(e.context);return{realms:this.#g.findRealms({browsingContextId:e.context,type:e.type}).map((e=>e.realmInfo))}}async#ua(e){if("realm"in e)return this.#g.getRealm({realmId:e.realm});const t=this.#i.getContext(e.context);return await t.getOrCreateSandbox(e.sandbox)}};var Oa={};Object.defineProperty(Oa,"__esModule",{value:!0}),Oa.SessionProcessor=void 0;Oa.SessionProcessor=class{#P;constructor(e){this.#P=e}status(){return{ready:!1,message:"already connected"}}subscribe(e,t=null){return this.#P.subscribe(e.events,e.contexts??[null],t),{}}unsubscribe(e,t=null){return this.#P.unsubscribe(e.events,e.contexts??[null],t),{}}};var Ma={};Object.defineProperty(Ma,"__esModule",{value:!0}),Ma.StorageProcessor=void 0;const Aa=g,Ba=J,za=l,Da=vt;class La{#o;#i;#t;constructor(e,t,a){this.#i=t,this.#o=e,this.#t=a}async getCookies(e){const t=this.#la(e.partition);return{cookies:(await this.#o.sendCommand("Storage.getCookies",{})).cookies.filter((e=>void 0===t.sourceOrigin||e.partitionKey===t.sourceOrigin)).map((e=>this.#ha(e))).filter((t=>this.#pa(t,e.filter))),partitionKey:t}}async setCookie(e){const t=this.#la(e.partition),a=this.#ma(e,t);try{await this.#o.sendCommand("Storage.setCookies",{cookies:[a]})}catch(e){throw this.#t?.(za.LogType.debugError,e),new Aa.UnableToSetCookieException(e.toString())}return{partitionKey:t}}#fa(e){const t=e.context;return this.#i.getContext(t),{}}#ga(e){const t=new Map;let a=e.sourceOrigin;if(void 0!==a){const e=Da.NetworkProcessor.parseUrlString(a);a="null"===e.origin?e.origin:`${e.protocol}//${e.hostname}`}for(const[a,r]of Object.entries(e))void 0===a||void 0===r||["type","sourceOrigin"].includes(a)||t.set(a,r);return t.size>0&&this.#t?.(za.LogType.debugInfo,`Unsupported partition keys: ${JSON.stringify(Object.fromEntries(t))}`),{...void 0===a?{}:{sourceOrigin:a}}}#la(e){return void 0===e?{}:"context"===e.type?this.#fa(e):((0,Ba.assert)("storageKey"===e.type,"Unknown partition type"),this.#ga(e))}#ma(e,t){if("string"!==e.cookie.value.type)throw new Aa.UnsupportedOperationException("Only string cookie values are supported");const a=e.cookie.value.value;return{name:e.cookie.name,value:a,domain:e.cookie.domain,path:e.cookie.path??"/",secure:e.cookie.secure??!1,httpOnly:e.cookie.httpOnly??!1,...void 0!==t.sourceOrigin&&{partitionKey:t.sourceOrigin},...void 0!==e.cookie.expiry&&{expires:e.cookie.expiry},...void 0!==e.cookie.sameSite&&{sameSite:La.#ya(e.cookie.sameSite)}}}#ha(e){return{name:e.name,value:{type:"string",value:e.value},domain:e.domain,path:e.path,size:e.size,httpOnly:e.httpOnly,secure:e.secure,sameSite:void 0===e.sameSite?"none":La.#Sa(e.sameSite),...e.expires>=0?{expiry:e.expires}:void 0}}static#Sa(e){switch(e){case"Strict":return"strict";case"None":return"none";default:return"lax"}}static#ya(e){switch(e){case"strict":return"Strict";case"lax":return"Lax";case"none":return"None"}throw new Aa.InvalidArgumentException(`Unknown 'sameSite' value ${e}`)}#pa(e,t){return void 0===t||!(void 0!==t.domain&&t.domain!==e.domain||void 0!==t.name&&t.name!==e.name||void 0!==t.value&&(t.value.type!==e.value.type||t.value.value!==e.value.value)||void 0!==t.path&&t.path!==e.path||void 0!==t.size&&t.size!==e.size||void 0!==t.httpOnly&&t.httpOnly!==e.httpOnly||void 0!==t.secure&&t.secure!==e.secure||void 0!==t.sameSite&&t.sameSite!==e.sameSite||void 0!==t.expiry&&t.expiry!==e.expiry)}}Ma.StorageProcessor=La;var Ua={};Object.defineProperty(Ua,"__esModule",{value:!0}),Ua.OutgoingMessage=void 0;class Za{#va;#wa;constructor(e,t=null){this.#va=e,this.#wa=t}static createFromPromise(e,t){return e.then((e=>"success"===e.kind?{kind:"success",value:new Za(e.value,t)}:e))}static createResolved(e,t){return Promise.resolve({kind:"success",value:new Za(e,t)})}get message(){return this.#va}get channel(){return this.#wa}}Ua.OutgoingMessage=Za,Object.defineProperty(f,"__esModule",{value:!0}),f.CommandProcessor=void 0;const Fa=g,qa=s,Va=l,$a=E,Ka=_,Wa=N,Ha=j,Ja=qe,Ga=vt,Xa=wt,Ya=Pa,Qa=ka,er=Ra,tr=Oa,ar=Ma,rr=Ua;class nr extends qa.EventEmitter{#Ca;#ba;#xa;#Pa;#Ia;#ka;#Ra;#Ea;#_a;#Ta;#t;constructor(e,t,a,r,n,s,o,i,c,d=new $a.BidiNoOpParser,u){super(),this.#Ta=d,this.#t=u;const l=new Xa.NetworkStorage,h=new Qa.PreloadScriptStorage;this.#Ca=new Ka.BrowserProcessor(t),this.#ba=new Ha.BrowsingContextProcessor(e,t,r,a,s,o,l,h,i,c,n,u),this.#xa=new Wa.CdpProcessor(s,e,t),this.#Pa=new Ja.InputProcessor(s,o),this.#Ia=new Ga.NetworkProcessor(s,l),this.#ka=new Ya.PermissionsProcessor(t),this.#Ra=new er.ScriptProcessor(s,o,h,u),this.#Ea=new tr.SessionProcessor(a),this.#_a=new ar.StorageProcessor(t,s,u)}async#Na(e){switch(e.method){case"session.end":case"session.new":break;case"browser.close":return this.#Ca.close();case"browser.createUserContext":return await this.#Ca.createUserContext();case"browser.getUserContexts":return await this.#Ca.getUserContexts();case"browser.removeUserContext":return await this.#Ca.removeUserContext(e.params.userContext);case"browsingContext.activate":return await this.#ba.activate(this.#Ta.parseActivateParams(e.params));case"browsingContext.captureScreenshot":return await this.#ba.captureScreenshot(this.#Ta.parseCaptureScreenshotParams(e.params));case"browsingContext.close":return await this.#ba.close(this.#Ta.parseCloseParams(e.params));case"browsingContext.create":return await this.#ba.create(this.#Ta.parseCreateParams(e.params));case"browsingContext.getTree":return this.#ba.getTree(this.#Ta.parseGetTreeParams(e.params));case"browsingContext.handleUserPrompt":return await this.#ba.handleUserPrompt(this.#Ta.parseHandleUserPromptParams(e.params));case"browsingContext.locateNodes":throw new Fa.UnsupportedOperationException(`Command '${e.method}' not yet implemented.`);case"browsingContext.navigate":return await this.#ba.navigate(this.#Ta.parseNavigateParams(e.params));case"browsingContext.print":return await this.#ba.print(this.#Ta.parsePrintParams(e.params));case"browsingContext.reload":return await this.#ba.reload(this.#Ta.parseReloadParams(e.params));case"browsingContext.setViewport":return await this.#ba.setViewport(this.#Ta.parseSetViewportParams(e.params));case"browsingContext.traverseHistory":return await this.#ba.traverseHistory(this.#Ta.parseTraverseHistoryParams(e.params));case"cdp.getSession":return this.#xa.getSession(this.#Ta.parseGetSessionParams(e.params));case"cdp.sendCommand":return await this.#xa.sendCommand(this.#Ta.parseSendCommandParams(e.params));case"input.performActions":return await this.#Pa.performActions(this.#Ta.parsePerformActionsParams(e.params));case"input.releaseActions":return await this.#Pa.releaseActions(this.#Ta.parseReleaseActionsParams(e.params));case"input.setFiles":return await this.#Pa.setFiles(this.#Ta.parseSetFilesParams(e.params));case"network.addIntercept":return await this.#Ia.addIntercept(this.#Ta.parseAddInterceptParams(e.params));case"network.continueRequest":return await this.#Ia.continueRequest(this.#Ta.parseContinueRequestParams(e.params));case"network.continueResponse":return await this.#Ia.continueResponse(this.#Ta.parseContinueResponseParams(e.params));case"network.continueWithAuth":return await this.#Ia.continueWithAuth(this.#Ta.parseContinueWithAuthParams(e.params));case"network.failRequest":return await this.#Ia.failRequest(this.#Ta.parseFailRequestParams(e.params));case"network.provideResponse":return await this.#Ia.provideResponse(this.#Ta.parseProvideResponseParams(e.params));case"network.removeIntercept":return await this.#Ia.removeIntercept(this.#Ta.parseRemoveInterceptParams(e.params));case"permissions.setPermission":return await this.#ka.setPermissions(this.#Ta.parseSetPermissionsParams(e.params));case"script.addPreloadScript":return await this.#Ra.addPreloadScript(this.#Ta.parseAddPreloadScriptParams(e.params));case"script.callFunction":return await this.#Ra.callFunction(this.#Ta.parseCallFunctionParams(e.params));case"script.disown":return await this.#Ra.disown(this.#Ta.parseDisownParams(e.params));case"script.evaluate":return await this.#Ra.evaluate(this.#Ta.parseEvaluateParams(e.params));case"script.getRealms":return this.#Ra.getRealms(this.#Ta.parseGetRealmsParams(e.params));case"script.removePreloadScript":return await this.#Ra.removePreloadScript(this.#Ta.parseRemovePreloadScriptParams(e.params));case"session.status":return this.#Ea.status();case"session.subscribe":return this.#Ea.subscribe(this.#Ta.parseSubscribeParams(e.params),e.channel);case"session.unsubscribe":return this.#Ea.unsubscribe(this.#Ta.parseSubscribeParams(e.params),e.channel);case"storage.deleteCookies":throw new Fa.UnsupportedOperationException(`${e.method} is not supported yet`);case"storage.getCookies":return await this.#_a.getCookies(this.#Ta.parseGetCookiesParams(e.params));case"storage.setCookie":return await this.#_a.setCookie(this.#Ta.parseSetCookieParams(e.params))}throw new Fa.UnknownCommandException(`Unknown command '${e.method}'.`)}async processCommand(e){try{const t=await this.#Na(e),a={type:"success",id:e.id,result:t};this.emit("response",{message:rr.OutgoingMessage.createResolved(a,e.channel),event:e.method})}catch(t){if(t instanceof Fa.Exception)this.emit("response",{message:rr.OutgoingMessage.createResolved(t.toErrorResponse(e.id),e.channel),event:e.method});else{const a=t;this.#t?.(Va.LogType.bidi,a),this.emit("response",{message:rr.OutgoingMessage.createResolved(new Fa.UnknownErrorException(a.message,a.stack).toErrorResponse(e.id),e.channel),event:e.method})}}}}f.CommandProcessor=nr;var sr={};Object.defineProperty(sr,"__esModule",{value:!0}),sr.BrowsingContextStorage=void 0;const or=g;sr.BrowsingContextStorage=class{#ca=new Map;getTopLevelContexts(){return this.getAllContexts().filter((e=>e.isTopLevelContext()))}getAllContexts(){return Array.from(this.#ca.values())}deleteContextById(e){this.#ca.delete(e)}deleteContext(e){this.#ca.delete(e.id)}addContext(e){this.#ca.set(e.id,e)}hasContext(e){return this.#ca.has(e)}findContext(e){return this.#ca.get(e)}findTopLevelContextId(e){if(null===e)return null;const t=this.findContext(e),a=t?.parentId??null;return null===a?e:this.findTopLevelContextId(a)}findContextBySession(e){for(const t of this.#ca.values())if(t.cdpTarget.cdpSessionId===e)return t}getContext(e){const t=this.findContext(e);if(void 0===t)throw new or.NoSuchFrameException(`Context ${e} not found`);return t}};var ir={};Object.defineProperty(ir,"__esModule",{value:!0}),ir.RealmStorage=void 0;const cr=g;ir.RealmStorage=class{#ja=new Map;#Oa=new Map;get knownHandlesToRealmMap(){return this.#ja}addRealm(e){this.#Oa.set(e.realmId,e)}findRealms(e){return Array.from(this.#Oa.values()).filter((t=>(void 0===e.realmId||e.realmId===t.realmId)&&((void 0===e.browsingContextId||e.browsingContextId===t.browsingContextId)&&((void 0===e.navigableId||e.navigableId===t.navigableId)&&((void 0===e.executionContextId||e.executionContextId===t.executionContextId)&&((void 0===e.origin||e.origin===t.origin)&&((void 0===e.type||e.type===t.type)&&((void 0===e.sandbox||e.sandbox===t.sandbox)&&(void 0===e.cdpSessionId||e.cdpSessionId===t.cdpClient.sessionId)))))))))}findRealm(e){const t=this.findRealms(e);if(1===t.length)return t[0]}getRealm(e){const t=this.findRealm(e);if(void 0===t)throw new cr.NoSuchFrameException(`Realm ${JSON.stringify(e)} not found`);return t}deleteRealms(e){this.findRealms(e).map((e=>{e.dispose(),this.#Oa.delete(e.realmId),Array.from(this.knownHandlesToRealmMap.entries()).filter((([,t])=>t===e.realmId)).map((([e])=>this.knownHandlesToRealmMap.delete(e)))}))}};var dr={},ur={};Object.defineProperty(ur,"__esModule",{value:!0}),ur.Buffer=void 0;ur.Buffer=class{#Ma;#Aa=[];#Ba;constructor(e,t){this.#Ma=e,this.#Ba=t}get(){return this.#Aa}add(e){for(this.#Aa.push(e);this.#Aa.length>this.#Ma;){const e=this.#Aa.shift();void 0!==e&&this.#Ba?.(e)}}};var lr={};Object.defineProperty(lr,"__esModule",{value:!0}),lr.DefaultMap=void 0;class hr extends Map{#za;constructor(e,t){super(t),this.#za=e}get(e){return this.has(e)||this.set(e,this.#za(e)),super.get(e)}}lr.DefaultMap=hr;var pr={};Object.defineProperty(pr,"__esModule",{value:!0}),pr.IdWrapper=void 0;class mr{static#Da=0;#u;constructor(){this.#u=++mr.#Da}get id(){return this.#u}}pr.IdWrapper=mr;var fr={};Object.defineProperty(fr,"__esModule",{value:!0}),fr.assertSupportedEvent=fr.isCdpEvent=void 0;const gr=g;function yr(e){return e.split(".").at(0)?.startsWith(gr.ChromiumBidi.BiDiModule.Cdp)??!1}fr.isCdpEvent=yr,fr.assertSupportedEvent=function(e){if(!gr.ChromiumBidi.EVENT_NAMES.has(e)&&!yr(e))throw new gr.InvalidArgumentException(`Unknown event: ${e}`)};var Sr={};Object.defineProperty(Sr,"__esModule",{value:!0}),Sr.SubscriptionManager=Sr.unrollEvents=Sr.cartesianProduct=void 0;const vr=g,wr=fr;function Cr(...e){return e.reduce(((e,t)=>e.flatMap((e=>t.map((t=>[e,t].flat()))))))}function br(e){const t=new Set;function a(e){for(const a of e)t.add(a)}for(const r of e)switch(r){case vr.ChromiumBidi.BiDiModule.BrowsingContext:a(Object.values(vr.ChromiumBidi.BrowsingContext.EventNames));break;case vr.ChromiumBidi.BiDiModule.Log:a(Object.values(vr.ChromiumBidi.Log.EventNames));break;case vr.ChromiumBidi.BiDiModule.Network:a(Object.values(vr.ChromiumBidi.Network.EventNames));break;case vr.ChromiumBidi.BiDiModule.Script:a(Object.values(vr.ChromiumBidi.Script.EventNames));break;default:t.add(r)}return[...t.values()]}Sr.cartesianProduct=Cr,Sr.unrollEvents=br;Sr.SubscriptionManager=class{#La=0;#Ua=new Map;#i;constructor(e){this.#i=e}getChannelsSubscribedToEvent(e,t){return Array.from(this.#Ua.keys()).map((a=>({priority:this.#Za(e,t,a),channel:a}))).filter((({priority:e})=>null!==e)).sort(((e,t)=>e.priority-t.priority)).map((({channel:e})=>e))}#Za(e,t,a){const r=this.#Ua.get(a);if(void 0===r)return null;const n=this.#i.findTopLevelContextId(t),s=[...new Set([null,n])].map((t=>{const a=r.get(t)?.get(e);if((0,wr.isCdpEvent)(e)){const e=r.get(t)?.get(vr.ChromiumBidi.BiDiModule.Cdp);return a&&e?Math.min(a,e):a??e}return a})).filter((e=>void 0!==e));return 0===s.length?null:Math.min(...s)}subscribe(e,t,a){switch(t=this.#i.findTopLevelContextId(t),e){case vr.ChromiumBidi.BiDiModule.BrowsingContext:return void Object.values(vr.ChromiumBidi.BrowsingContext.EventNames).map((e=>this.subscribe(e,t,a)));case vr.ChromiumBidi.BiDiModule.Log:return void Object.values(vr.ChromiumBidi.Log.EventNames).map((e=>this.subscribe(e,t,a)));case vr.ChromiumBidi.BiDiModule.Network:return void Object.values(vr.ChromiumBidi.Network.EventNames).map((e=>this.subscribe(e,t,a)));case vr.ChromiumBidi.BiDiModule.Script:return void Object.values(vr.ChromiumBidi.Script.EventNames).map((e=>this.subscribe(e,t,a)))}this.#Ua.has(a)||this.#Ua.set(a,new Map);const r=this.#Ua.get(a);r.has(t)||r.set(t,new Map);const n=r.get(t);n.has(e)||n.set(e,this.#La++)}unsubscribeAll(e,t,a){for(const e of t)null!==e&&this.#i.getContext(e);Cr(br(e),t).map((([e,t])=>this.#Fa(e,t,a))).forEach((e=>e()))}unsubscribe(e,t,a){this.unsubscribeAll([e],[t],a)}#Fa(e,t,a){if(t=this.#i.findTopLevelContextId(t),!this.#Ua.has(a))throw new vr.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const r=this.#Ua.get(a);if(!r.has(t))throw new vr.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);const n=r.get(t);if(!n.has(e))throw new vr.InvalidArgumentException(`Cannot unsubscribe from ${e}, ${null===t?"null":t}. No subscription found.`);return()=>{n.delete(e),0===n.size&&r.delete(e),0===r.size&&this.#Ua.delete(a)}}},Object.defineProperty(dr,"__esModule",{value:!0}),dr.EventManager=void 0;const xr=g,Pr=ur,Ir=lr,kr=s,Rr=pr,Er=Ua,_r=fr,Tr=Sr;class Nr{#qa=new Rr.IdWrapper;#Va;#$a;constructor(e,t){this.#$a=e,this.#Va=t}get id(){return this.#qa.id}get contextId(){return this.#Va}get event(){return this.#$a}}const jr=new Map([[xr.ChromiumBidi.Log.EventNames.LogEntryAdded,100]]);class Or extends kr.EventEmitter{#Ka=new Ir.DefaultMap((()=>new Set));#Wa=new Map;#Ha=new Map;#Ja;#i;constructor(e){super(),this.#i=e,this.#Ja=new Tr.SubscriptionManager(e)}static#Ga(e,t,a){return JSON.stringify({eventName:e,browsingContext:t,channel:a})}registerEvent(e,t){this.registerPromiseEvent(Promise.resolve({kind:"success",value:e}),t,e.method)}registerPromiseEvent(e,t,a){const r=new Nr(e,t),n=this.#Ja.getChannelsSubscribedToEvent(a,t);this.#Xa(r,a);for(const t of n)this.emit("event",{message:Er.OutgoingMessage.createFromPromise(e,t),event:a}),this.#Ya(r,t,a)}subscribe(e,t,a){for(const t of e)(0,_r.assertSupportedEvent)(t);for(const e of t)null!==e&&this.#i.getContext(e);for(const r of e)for(const e of t){this.#Ja.subscribe(r,e,a);for(const t of this.#Qa(r,e,a))this.emit("event",{message:Er.OutgoingMessage.createFromPromise(t.event,a),event:r}),this.#Ya(t,a,r)}}unsubscribe(e,t,a){for(const t of e)(0,_r.assertSupportedEvent)(t);this.#Ja.unsubscribeAll(e,t,a)}#Xa(e,t){if(!jr.has(t))return;const a=Or.#Ga(t,e.contextId);this.#Wa.has(a)||this.#Wa.set(a,new Pr.Buffer(jr.get(t))),this.#Wa.get(a).add(e),this.#Ka.get(t).add(e.contextId)}#Ya(e,t,a){if(!jr.has(a))return;const r=Or.#Ga(a,e.contextId,t);this.#Ha.set(r,Math.max(this.#Ha.get(r)??0,e.id))}#Qa(e,t,a){const r=Or.#Ga(e,t),n=Or.#Ga(e,t,a),s=this.#Ha.get(n)??-1/0,o=this.#Wa.get(r)?.get().filter((e=>e.id>s))??[];return null===t&&Array.from(this.#Ka.get(e).keys()).filter((e=>null!==e&&this.#i.hasContext(e))).map((t=>this.#Qa(e,t,a))).forEach((e=>o.push(...e))),o.sort(((e,t)=>e.id-t.id))}}dr.EventManager=Or,Object.defineProperty(n,"__esModule",{value:!0}),n.BidiServer=void 0;const Mr=s,Ar=l,Br=h,zr=f,Dr=sr,Lr=ir,Ur=dr;class Zr extends Mr.EventEmitter{#er;#tr;#ar;#P;#i=new Dr.BrowsingContextStorage;#t;#rr=e=>{this.#ar.processCommand(e).catch((e=>{this.#t?.(Ar.LogType.debugError,e)}))};#nr=async e=>{const t=e.message;null!==e.channel&&(t.channel=e.channel),await this.#tr.sendMessage(t)};constructor(e,t,a,r,n,s,o,i){super(),this.#t=i,this.#er=new Br.ProcessingQueue(this.#nr,this.#t),this.#tr=e,this.#tr.setOnMessage(this.#rr),this.#P=new Ur.EventManager(this.#i),this.#ar=new zr.CommandProcessor(t,a,this.#P,r,n,this.#i,new Lr.RealmStorage,s?.acceptInsecureCerts??!1,s?.sharedIdWithFrame??!1,o,this.#t),this.#P.on("event",(({message:e,event:t})=>{this.emitOutgoingMessage(e,t)})),this.#ar.on("response",(({message:e,event:t})=>{this.emitOutgoingMessage(e,t)}))}static async createAndStart(e,t,a,r,n,s,o){const[{browserContextIds:i},{targetInfos:c}]=await Promise.all([a.sendCommand("Target.getBrowserContexts"),a.sendCommand("Target.getTargets")]);let d="default";for(const e of c)if(e.browserContextId&&!i.includes(e.browserContextId)){d=e.browserContextId;break}const u=new Zr(e,t,a,r,d,n,s,o);return await a.sendCommand("Target.setDiscoverTargets",{discover:!0}),await a.sendCommand("Target.setAutoAttach",{autoAttach:!0,waitForDebuggerOnStart:!0,flatten:!0}),await u.#sr(),u}emitOutgoingMessage(e,t){this.#er.add(e,t)}close(){this.#tr.close()}async#sr(){await Promise.all(this.#i.getTopLevelContexts().map((e=>e.lifecycleLoaded())))}}n.BidiServer=Zr,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.OutgoingMessage=e.EventEmitter=e.BidiServer=void 0;var t=n;Object.defineProperty(e,"BidiServer",{enumerable:!0,get:function(){return t.BidiServer}});var a=s;Object.defineProperty(e,"EventEmitter",{enumerable:!0,get:function(){return a.EventEmitter}});var r=Ua;Object.defineProperty(e,"OutgoingMessage",{enumerable:!0,get:function(){return r.OutgoingMessage}})}(r);var Fr={},qr={};Object.defineProperty(qr,"__esModule",{value:!0}),qr.MapperCdpClient=qr.CloseError=void 0;const Vr=s;class $r extends Error{}qr.CloseError=$r;class Kr extends Vr.EventEmitter{#c;#or;constructor(e,t){super(),this.#c=e,this.#or=t}get sessionId(){return this.#or}sendCommand(e,...t){return this.#c.sendCommand(e,t[0],this.#or)}isCloseError(e){return e instanceof $r}}qr.MapperCdpClient=Kr,Object.defineProperty(Fr,"__esModule",{value:!0}),Fr.MapperCdpConnection=void 0;const Wr=l,Hr=qr;class Jr{static LOGGER_PREFIX_RECV=`${Wr.LogType.cdp}:RECV \u25c2`;static LOGGER_PREFIX_SEND=`${Wr.LogType.cdp}:SEND \u25b8`;#ir;#tr;#cr=new Map;#dr=new Map;#t;#ur=0;constructor(e,t){this.#tr=e,this.#t=t,this.#tr.setOnMessage(this.#lr),this.#ir=this.#hr(void 0)}close(){this.#tr.close();for(const[,{reject:e,error:t}]of this.#dr)e(t);this.#dr.clear(),this.#cr.clear()}async createBrowserSession(){const{sessionId:e}=await this.#ir.sendCommand("Target.attachToBrowserTarget");return this.#hr(e)}getCdpClient(e){const t=this.#cr.get(e);if(!t)throw new Error(`Unknown CDP session ID: ${e}`);return t}sendCommand(e,t,a){return new Promise(((r,n)=>{const s=this.#ur++;this.#dr.set(s,{resolve:r,reject:n,error:new Hr.CloseError(`${e} ${JSON.stringify(t)} ${a??""} call rejected because the connection has been closed.`)});const o={id:s,method:e,params:t};a&&(o.sessionId=a),this.#tr.sendMessage(JSON.stringify(o))?.catch((e=>{this.#t?.(Wr.LogType.debugError,e),this.#tr.close()})),this.#t?.(Jr.LOGGER_PREFIX_SEND,o)}))}#lr=e=>{const t=JSON.parse(e);if(this.#t?.(Jr.LOGGER_PREFIX_RECV,t),"Target.attachedToTarget"===t.method){const{sessionId:e}=t.params;this.#hr(e)}if(void 0!==t.id){const e=this.#dr.get(t.id);this.#dr.delete(t.id),e&&(t.result?e.resolve(t.result):t.error&&e.reject(t.error))}else if(t.method){const e=this.#cr.get(t.sessionId??void 0);if(e?.emit(t.method,t.params||{}),"Target.detachedFromTarget"===t.method){const{sessionId:e}=t.params,a=this.#cr.get(e);a&&(this.#cr.delete(e),a.removeAllListeners())}}};#hr(e){const t=new Hr.MapperCdpClient(this,e);return this.#cr.set(e,t),t}}Fr.MapperCdpConnection=Jr;var Gr={},Xr={},Yr={},Qr={},en={},tn={},an={};!function(e){var t;Object.defineProperty(e,"__esModule",{value:!0}),e.getParsedType=e.ZodParsedType=e.objectUtil=e.util=void 0,function(e){e.assertEqual=e=>e,e.assertIs=function(e){},e.assertNever=function(e){throw new Error},e.arrayToEnum=e=>{const t={};for(const a of e)t[a]=a;return t},e.getValidEnumValues=t=>{const a=e.objectKeys(t).filter((e=>"number"!=typeof t[t[e]])),r={};for(const e of a)r[e]=t[e];return e.objectValues(r)},e.objectValues=t=>e.objectKeys(t).map((function(e){return t[e]})),e.objectKeys="function"==typeof Object.keys?e=>Object.keys(e):e=>{const t=[];for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.push(a);return t},e.find=(e,t)=>{for(const a of e)if(t(a))return a},e.isInteger="function"==typeof Number.isInteger?e=>Number.isInteger(e):e=>"number"==typeof e&&isFinite(e)&&Math.floor(e)===e,e.joinValues=function(e,t=" | "){return e.map((e=>"string"==typeof e?`'${e}'`:e)).join(t)},e.jsonStringifyReplacer=(e,t)=>"bigint"==typeof t?t.toString():t}(t=e.util||(e.util={})),(e.objectUtil||(e.objectUtil={})).mergeShapes=(e,t)=>({...e,...t}),e.ZodParsedType=t.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]);e.getParsedType=t=>{switch(typeof t){case"undefined":return e.ZodParsedType.undefined;case"string":return e.ZodParsedType.string;case"number":return isNaN(t)?e.ZodParsedType.nan:e.ZodParsedType.number;case"boolean":return e.ZodParsedType.boolean;case"function":return e.ZodParsedType.function;case"bigint":return e.ZodParsedType.bigint;case"symbol":return e.ZodParsedType.symbol;case"object":return Array.isArray(t)?e.ZodParsedType.array:null===t?e.ZodParsedType.null:t.then&&"function"==typeof t.then&&t.catch&&"function"==typeof t.catch?e.ZodParsedType.promise:"undefined"!=typeof Map&&t instanceof Map?e.ZodParsedType.map:"undefined"!=typeof Set&&t instanceof Set?e.ZodParsedType.set:"undefined"!=typeof Date&&t instanceof Date?e.ZodParsedType.date:e.ZodParsedType.object;default:return e.ZodParsedType.unknown}}}(an);var rn={};Object.defineProperty(rn,"__esModule",{value:!0}),rn.ZodError=rn.quotelessJson=rn.ZodIssueCode=void 0;const nn=an;rn.ZodIssueCode=nn.util.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);rn.quotelessJson=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class sn extends Error{constructor(e){super(),this.issues=[],this.addIssue=e=>{this.issues=[...this.issues,e]},this.addIssues=(e=[])=>{this.issues=[...this.issues,...e]};const t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e}get errors(){return this.issues}format(e){const t=e||function(e){return e.message},a={_errors:[]},r=e=>{for(const n of e.issues)if("invalid_union"===n.code)n.unionErrors.map(r);else if("invalid_return_type"===n.code)r(n.returnTypeError);else if("invalid_arguments"===n.code)r(n.argumentsError);else if(0===n.path.length)a._errors.push(t(n));else{let e=a,r=0;for(;r<n.path.length;){const a=n.path[r];r===n.path.length-1?(e[a]=e[a]||{_errors:[]},e[a]._errors.push(t(n))):e[a]=e[a]||{_errors:[]},e=e[a],r++}}};return r(this),a}toString(){return this.message}get message(){return JSON.stringify(this.issues,nn.util.jsonStringifyReplacer,2)}get isEmpty(){return 0===this.issues.length}flatten(e=(e=>e.message)){const t={},a=[];for(const r of this.issues)r.path.length>0?(t[r.path[0]]=t[r.path[0]]||[],t[r.path[0]].push(e(r))):a.push(e(r));return{formErrors:a,fieldErrors:t}}get formErrors(){return this.flatten()}}rn.ZodError=sn,sn.create=e=>new sn(e),Object.defineProperty(tn,"__esModule",{value:!0});const on=an,cn=rn;tn.default=(e,t)=>{let a;switch(e.code){case cn.ZodIssueCode.invalid_type:a=e.received===on.ZodParsedType.undefined?"Required":`Expected ${e.expected}, received ${e.received}`;break;case cn.ZodIssueCode.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(e.expected,on.util.jsonStringifyReplacer)}`;break;case cn.ZodIssueCode.unrecognized_keys:a=`Unrecognized key(s) in object: ${on.util.joinValues(e.keys,", ")}`;break;case cn.ZodIssueCode.invalid_union:a="Invalid input";break;case cn.ZodIssueCode.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${on.util.joinValues(e.options)}`;break;case cn.ZodIssueCode.invalid_enum_value:a=`Invalid enum value. Expected ${on.util.joinValues(e.options)}, received '${e.received}'`;break;case cn.ZodIssueCode.invalid_arguments:a="Invalid function arguments";break;case cn.ZodIssueCode.invalid_return_type:a="Invalid function return type";break;case cn.ZodIssueCode.invalid_date:a="Invalid date";break;case cn.ZodIssueCode.invalid_string:"object"==typeof e.validation?"includes"in e.validation?(a=`Invalid input: must include "${e.validation.includes}"`,"number"==typeof e.validation.position&&(a=`${a} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?a=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?a=`Invalid input: must end with "${e.validation.endsWith}"`:on.util.assertNever(e.validation):a="regex"!==e.validation?`Invalid ${e.validation}`:"Invalid";break;case cn.ZodIssueCode.too_small:a="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:"date"===e.type?`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:"Invalid input";break;case cn.ZodIssueCode.too_big:a="array"===e.type?`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:"string"===e.type?`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:"number"===e.type?`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"bigint"===e.type?`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:"date"===e.type?`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:"Invalid input";break;case cn.ZodIssueCode.custom:a="Invalid input";break;case cn.ZodIssueCode.invalid_intersection_types:a="Intersection results could not be merged";break;case cn.ZodIssueCode.not_multiple_of:a=`Number must be a multiple of ${e.multipleOf}`;break;case cn.ZodIssueCode.not_finite:a="Number must be finite";break;default:a=t.defaultError,on.util.assertNever(e)}return{message:a}};var dn=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(en,"__esModule",{value:!0}),en.getErrorMap=en.setErrorMap=en.defaultErrorMap=void 0;const un=dn(tn);en.defaultErrorMap=un.default;let ln=un.default;en.setErrorMap=function(e){ln=e},en.getErrorMap=function(){return ln};var hn={};!function(t){var a=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.isAsync=t.isValid=t.isDirty=t.isAborted=t.OK=t.DIRTY=t.INVALID=t.ParseStatus=t.addIssueToContext=t.EMPTY_PATH=t.makeIssue=void 0;const r=en,n=a(tn);t.makeIssue=e=>{const{data:t,path:a,errorMaps:r,issueData:n}=e,s=[...a,...n.path||[]],o={...n,path:s};let i="";const c=r.filter((e=>!!e)).slice().reverse();for(const e of c)i=e(o,{data:t,defaultError:i}).message;return{...n,path:s,message:n.message||i}},t.EMPTY_PATH=[],t.addIssueToContext=function(e,a){const s=(0,t.makeIssue)({issueData:a,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,(0,r.getErrorMap)(),n.default].filter((e=>!!e))});e.common.issues.push(s)};class s{constructor(){this.value="valid"}dirty(){"valid"===this.value&&(this.value="dirty")}abort(){"aborted"!==this.value&&(this.value="aborted")}static mergeArray(e,a){const r=[];for(const n of a){if("aborted"===n.status)return t.INVALID;"dirty"===n.status&&e.dirty(),r.push(n.value)}return{status:e.value,value:r}}static async mergeObjectAsync(e,t){const a=[];for(const e of t)a.push({key:await e.key,value:await e.value});return s.mergeObjectSync(e,a)}static mergeObjectSync(e,a){const r={};for(const n of a){const{key:a,value:s}=n;if("aborted"===a.status)return t.INVALID;if("aborted"===s.status)return t.INVALID;"dirty"===a.status&&e.dirty(),"dirty"===s.status&&e.dirty(),"__proto__"===a.value||void 0===s.value&&!n.alwaysSet||(r[a.value]=s.value)}return{status:e.value,value:r}}}t.ParseStatus=s,t.INVALID=Object.freeze({status:"aborted"});t.DIRTY=e=>({status:"dirty",value:e});t.OK=e=>({status:"valid",value:e});t.isAborted=e=>"aborted"===e.status;t.isDirty=e=>"dirty"===e.status;t.isValid=e=>"valid"===e.status;t.isAsync=e=>"undefined"!=typeof Promise&&e instanceof Promise}(hn);var pn={};Object.defineProperty(pn,"__esModule",{value:!0});var mn,fn={},gn={};mn=gn,Object.defineProperty(mn,"__esModule",{value:!0}),mn.errorUtil=void 0,function(e){e.errToObj=e=>"string"==typeof e?{message:e}:e||{},e.toString=e=>"string"==typeof e?e:null==e?void 0:e.message}(mn.errorUtil||(mn.errorUtil={})),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.date=e.boolean=e.bigint=e.array=e.any=e.coerce=e.ZodFirstPartyTypeKind=e.late=e.ZodSchema=e.Schema=e.custom=e.ZodReadonly=e.ZodPipeline=e.ZodBranded=e.BRAND=e.ZodNaN=e.ZodCatch=e.ZodDefault=e.ZodNullable=e.ZodOptional=e.ZodTransformer=e.ZodEffects=e.ZodPromise=e.ZodNativeEnum=e.ZodEnum=e.ZodLiteral=e.ZodLazy=e.ZodFunction=e.ZodSet=e.ZodMap=e.ZodRecord=e.ZodTuple=e.ZodIntersection=e.ZodDiscriminatedUnion=e.ZodUnion=e.ZodObject=e.ZodArray=e.ZodVoid=e.ZodNever=e.ZodUnknown=e.ZodAny=e.ZodNull=e.ZodUndefined=e.ZodSymbol=e.ZodDate=e.ZodBoolean=e.ZodBigInt=e.ZodNumber=e.ZodString=e.ZodType=void 0,e.NEVER=e.void=e.unknown=e.union=e.undefined=e.tuple=e.transformer=e.symbol=e.string=e.strictObject=e.set=e.record=e.promise=e.preprocess=e.pipeline=e.ostring=e.optional=e.onumber=e.oboolean=e.object=e.number=e.nullable=e.null=e.never=e.nativeEnum=e.nan=e.map=e.literal=e.lazy=e.intersection=e.instanceof=e.function=e.enum=e.effect=e.discriminatedUnion=void 0;const t=en,a=gn,r=hn,n=an,s=rn;class o{constructor(e,t,a,r){this._cachedPath=[],this.parent=e,this.data=t,this._path=a,this._key=r}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const i=(e,t)=>{if((0,r.isValid)(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const t=new s.ZodError(e.common.issues);return this._error=t,this._error}}};function c(e){if(!e)return{};const{errorMap:t,invalid_type_error:a,required_error:r,description:n}=e;if(t&&(a||r))throw new Error('Can\'t use "invalid_type_error" or "required_error" in conjunction with custom error map.');if(t)return{errorMap:t,description:n};return{errorMap:(e,t)=>"invalid_type"!==e.code?{message:t.defaultError}:void 0===t.data?{message:null!=r?r:t.defaultError}:{message:null!=a?a:t.defaultError},description:n}}class d{constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(e){return(0,n.getParsedType)(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:(0,n.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new r.ParseStatus,ctx:{common:e.parent.common,data:e.data,parsedType:(0,n.getParsedType)(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){const t=this._parse(e);if((0,r.isAsync)(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){const t=this._parse(e);return Promise.resolve(t)}parse(e,t){const a=this.safeParse(e,t);if(a.success)return a.data;throw a.error}safeParse(e,t){var a;const r={common:{issues:[],async:null!==(a=null==t?void 0:t.async)&&void 0!==a&&a,contextualErrorMap:null==t?void 0:t.errorMap},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,n.getParsedType)(e)},s=this._parseSync({data:e,path:r.path,parent:r});return i(r,s)}async parseAsync(e,t){const a=await this.safeParseAsync(e,t);if(a.success)return a.data;throw a.error}async safeParseAsync(e,t){const a={common:{issues:[],contextualErrorMap:null==t?void 0:t.errorMap,async:!0},path:(null==t?void 0:t.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:(0,n.getParsedType)(e)},s=this._parse({data:e,path:a.path,parent:a}),o=await((0,r.isAsync)(s)?s:Promise.resolve(s));return i(a,o)}refine(e,t){const a=e=>"string"==typeof t||void 0===t?{message:t}:"function"==typeof t?t(e):t;return this._refinement(((t,r)=>{const n=e(t),o=()=>r.addIssue({code:s.ZodIssueCode.custom,...a(t)});return"undefined"!=typeof Promise&&n instanceof Promise?n.then((e=>!!e||(o(),!1))):!!n||(o(),!1)}))}refinement(e,t){return this._refinement(((a,r)=>!!e(a)||(r.addIssue("function"==typeof t?t(a,r):t),!1)))}_refinement(e){return new G({schema:this,typeName:se.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}optional(){return X.create(this,this._def)}nullable(){return Y.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return N.create(this,this._def)}promise(){return J.create(this,this._def)}or(e){return M.create([this,e],this._def)}and(e){return D.create(this,e,this._def)}transform(e){return new G({...c(this._def),schema:this,typeName:se.ZodEffects,effect:{type:"transform",transform:e}})}default(e){const t="function"==typeof e?e:()=>e;return new Q({...c(this._def),innerType:this,defaultValue:t,typeName:se.ZodDefault})}brand(){return new ae({typeName:se.ZodBranded,type:this,...c(this._def)})}catch(e){const t="function"==typeof e?e:()=>e;return new ee({...c(this._def),innerType:this,catchValue:t,typeName:se.ZodCatch})}describe(e){return new(0,this.constructor)({...this._def,description:e})}pipe(e){return re.create(this,e)}readonly(){return ne.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}e.ZodType=d,e.Schema=d,e.ZodSchema=d;const u=/^c[^\s-]{8,}$/i,l=/^[a-z][a-z0-9]*$/,h=/^[0-9A-HJKMNP-TV-Z]{26}$/,p=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,m=/^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i;let f;const g=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,y=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;class S extends d{_parse(e){this._def.coerce&&(e.data=String(e.data));if(this._getType(e)!==n.ZodParsedType.string){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.string,received:t.parsedType}),r.INVALID}const t=new r.ParseStatus;let a;for(const d of this._def.checks)if("min"===d.kind)e.data.length<d.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:d.value,type:"string",inclusive:!0,exact:!1,message:d.message}),t.dirty());else if("max"===d.kind)e.data.length>d.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:d.value,type:"string",inclusive:!0,exact:!1,message:d.message}),t.dirty());else if("length"===d.kind){const n=e.data.length>d.value,o=e.data.length<d.value;(n||o)&&(a=this._getOrReturnCtx(e,a),n?(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:d.value,type:"string",inclusive:!0,exact:!0,message:d.message}):o&&(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:d.value,type:"string",inclusive:!0,exact:!0,message:d.message}),t.dirty())}else if("email"===d.kind)m.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"email",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("emoji"===d.kind)f||(f=new RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),f.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"emoji",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("uuid"===d.kind)p.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"uuid",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("cuid"===d.kind)u.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"cuid",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("cuid2"===d.kind)l.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"cuid2",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("ulid"===d.kind)h.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"ulid",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty());else if("url"===d.kind)try{new URL(e.data)}catch(n){a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"url",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty()}else if("regex"===d.kind){d.regex.lastIndex=0;d.regex.test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"regex",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty())}else if("trim"===d.kind)e.data=e.data.trim();else if("includes"===d.kind)e.data.includes(d.value,d.position)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:{includes:d.value,position:d.position},message:d.message}),t.dirty());else if("toLowerCase"===d.kind)e.data=e.data.toLowerCase();else if("toUpperCase"===d.kind)e.data=e.data.toUpperCase();else if("startsWith"===d.kind)e.data.startsWith(d.value)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:{startsWith:d.value},message:d.message}),t.dirty());else if("endsWith"===d.kind)e.data.endsWith(d.value)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:{endsWith:d.value},message:d.message}),t.dirty());else if("datetime"===d.kind){((c=d).precision?c.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${c.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${c.precision}}Z$`):0===c.precision?c.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):c.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$")).test(e.data)||(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_string,validation:"datetime",message:d.message}),t.dirty())}else"ip"===d.kind?(o=e.data,("v4"!==(i=d.version)&&i||!g.test(o))&&("v6"!==i&&i||!y.test(o))&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{validation:"ip",code:s.ZodIssueCode.invalid_string,message:d.message}),t.dirty())):n.util.assertNever(d);var o,i,c;return{status:t.value,value:e.data}}_regex(e,t,r){return this.refinement((t=>e.test(t)),{validation:t,code:s.ZodIssueCode.invalid_string,...a.errorUtil.errToObj(r)})}_addCheck(e){return new S({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...a.errorUtil.errToObj(e)})}url(e){return this._addCheck({kind:"url",...a.errorUtil.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...a.errorUtil.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...a.errorUtil.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...a.errorUtil.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...a.errorUtil.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...a.errorUtil.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...a.errorUtil.errToObj(e)})}datetime(e){var t;return"string"==typeof e?this._addCheck({kind:"datetime",precision:null,offset:!1,message:e}):this._addCheck({kind:"datetime",precision:void 0===(null==e?void 0:e.precision)?null:null==e?void 0:e.precision,offset:null!==(t=null==e?void 0:e.offset)&&void 0!==t&&t,...a.errorUtil.errToObj(null==e?void 0:e.message)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...a.errorUtil.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:null==t?void 0:t.position,...a.errorUtil.errToObj(null==t?void 0:t.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...a.errorUtil.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...a.errorUtil.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...a.errorUtil.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...a.errorUtil.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...a.errorUtil.errToObj(t)})}nonempty(e){return this.min(1,a.errorUtil.errToObj(e))}trim(){return new S({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new S({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new S({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find((e=>"datetime"===e.kind))}get isEmail(){return!!this._def.checks.find((e=>"email"===e.kind))}get isURL(){return!!this._def.checks.find((e=>"url"===e.kind))}get isEmoji(){return!!this._def.checks.find((e=>"emoji"===e.kind))}get isUUID(){return!!this._def.checks.find((e=>"uuid"===e.kind))}get isCUID(){return!!this._def.checks.find((e=>"cuid"===e.kind))}get isCUID2(){return!!this._def.checks.find((e=>"cuid2"===e.kind))}get isULID(){return!!this._def.checks.find((e=>"ulid"===e.kind))}get isIP(){return!!this._def.checks.find((e=>"ip"===e.kind))}get minLength(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}function v(e,t){const a=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,n=a>r?a:r;return parseInt(e.toFixed(n).replace(".",""))%parseInt(t.toFixed(n).replace(".",""))/Math.pow(10,n)}e.ZodString=S,S.create=e=>{var t;return new S({checks:[],typeName:se.ZodString,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...c(e)})};class w extends d{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(e){this._def.coerce&&(e.data=Number(e.data));if(this._getType(e)!==n.ZodParsedType.number){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.number,received:t.parsedType}),r.INVALID}let t;const a=new r.ParseStatus;for(const o of this._def.checks)if("int"===o.kind)n.util.isInteger(e.data)||(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:"integer",received:"float",message:o.message}),a.dirty());else if("min"===o.kind){(o.inclusive?e.data<o.value:e.data<=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_small,minimum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty())}else if("max"===o.kind){(o.inclusive?e.data>o.value:e.data>=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),a.dirty())}else"multipleOf"===o.kind?0!==v(e.data,o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):"finite"===o.kind?Number.isFinite(e.data)||(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.not_finite,message:o.message}),a.dirty()):n.util.assertNever(o);return{status:a.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,a.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,a.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,a.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,a.errorUtil.toString(t))}setLimit(e,t,r,n){return new w({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:a.errorUtil.toString(n)}]})}_addCheck(e){return new w({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:a.errorUtil.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:!1,message:a.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:!1,message:a.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:!0,message:a.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:!0,message:a.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:a.errorUtil.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:a.errorUtil.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:a.errorUtil.toString(e)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:a.errorUtil.toString(e)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}get isInt(){return!!this._def.checks.find((e=>"int"===e.kind||"multipleOf"===e.kind&&n.util.isInteger(e.value)))}get isFinite(){let e=null,t=null;for(const a of this._def.checks){if("finite"===a.kind||"int"===a.kind||"multipleOf"===a.kind)return!0;"min"===a.kind?(null===t||a.value>t)&&(t=a.value):"max"===a.kind&&(null===e||a.value<e)&&(e=a.value)}return Number.isFinite(t)&&Number.isFinite(e)}}e.ZodNumber=w,w.create=e=>new w({checks:[],typeName:se.ZodNumber,coerce:(null==e?void 0:e.coerce)||!1,...c(e)});class C extends d{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(e){this._def.coerce&&(e.data=BigInt(e.data));if(this._getType(e)!==n.ZodParsedType.bigint){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.bigint,received:t.parsedType}),r.INVALID}let t;const a=new r.ParseStatus;for(const o of this._def.checks)if("min"===o.kind){(o.inclusive?e.data<o.value:e.data<=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_small,type:"bigint",minimum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty())}else if("max"===o.kind){(o.inclusive?e.data>o.value:e.data>=o.value)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),a.dirty())}else"multipleOf"===o.kind?e.data%o.value!==BigInt(0)&&(t=this._getOrReturnCtx(e,t),(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.not_multiple_of,multipleOf:o.value,message:o.message}),a.dirty()):n.util.assertNever(o);return{status:a.value,value:e.data}}gte(e,t){return this.setLimit("min",e,!0,a.errorUtil.toString(t))}gt(e,t){return this.setLimit("min",e,!1,a.errorUtil.toString(t))}lte(e,t){return this.setLimit("max",e,!0,a.errorUtil.toString(t))}lt(e,t){return this.setLimit("max",e,!1,a.errorUtil.toString(t))}setLimit(e,t,r,n){return new C({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:r,message:a.errorUtil.toString(n)}]})}_addCheck(e){return new C({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:a.errorUtil.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:a.errorUtil.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:a.errorUtil.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:a.errorUtil.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:a.errorUtil.toString(t)})}get minValue(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return e}}e.ZodBigInt=C,C.create=e=>{var t;return new C({checks:[],typeName:se.ZodBigInt,coerce:null!==(t=null==e?void 0:e.coerce)&&void 0!==t&&t,...c(e)})};class b extends d{_parse(e){this._def.coerce&&(e.data=Boolean(e.data));if(this._getType(e)!==n.ZodParsedType.boolean){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.boolean,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodBoolean=b,b.create=e=>new b({typeName:se.ZodBoolean,coerce:(null==e?void 0:e.coerce)||!1,...c(e)});class x extends d{_parse(e){this._def.coerce&&(e.data=new Date(e.data));if(this._getType(e)!==n.ZodParsedType.date){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.date,received:t.parsedType}),r.INVALID}if(isNaN(e.data.getTime())){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_date}),r.INVALID}const t=new r.ParseStatus;let a;for(const o of this._def.checks)"min"===o.kind?e.data.getTime()<o.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,message:o.message,inclusive:!0,exact:!1,minimum:o.value,type:"date"}),t.dirty()):"max"===o.kind?e.data.getTime()>o.value&&(a=this._getOrReturnCtx(e,a),(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),t.dirty()):n.util.assertNever(o);return{status:t.value,value:new Date(e.data.getTime())}}_addCheck(e){return new x({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:a.errorUtil.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:a.errorUtil.toString(t)})}get minDate(){let e=null;for(const t of this._def.checks)"min"===t.kind&&(null===e||t.value>e)&&(e=t.value);return null!=e?new Date(e):null}get maxDate(){let e=null;for(const t of this._def.checks)"max"===t.kind&&(null===e||t.value<e)&&(e=t.value);return null!=e?new Date(e):null}}e.ZodDate=x,x.create=e=>new x({checks:[],coerce:(null==e?void 0:e.coerce)||!1,typeName:se.ZodDate,...c(e)});class P extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.symbol){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.symbol,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodSymbol=P,P.create=e=>new P({typeName:se.ZodSymbol,...c(e)});class I extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.undefined,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodUndefined=I,I.create=e=>new I({typeName:se.ZodUndefined,...c(e)});class k extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.null){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.null,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodNull=k,k.create=e=>new k({typeName:se.ZodNull,...c(e)});class R extends d{constructor(){super(...arguments),this._any=!0}_parse(e){return(0,r.OK)(e.data)}}e.ZodAny=R,R.create=e=>new R({typeName:se.ZodAny,...c(e)});class E extends d{constructor(){super(...arguments),this._unknown=!0}_parse(e){return(0,r.OK)(e.data)}}e.ZodUnknown=E,E.create=e=>new E({typeName:se.ZodUnknown,...c(e)});class _ extends d{_parse(e){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.never,received:t.parsedType}),r.INVALID}}e.ZodNever=_,_.create=e=>new _({typeName:se.ZodNever,...c(e)});class T extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.undefined){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.void,received:t.parsedType}),r.INVALID}return(0,r.OK)(e.data)}}e.ZodVoid=T,T.create=e=>new T({typeName:se.ZodVoid,...c(e)});class N extends d{_parse(e){const{ctx:t,status:a}=this._processInputParams(e),i=this._def;if(t.parsedType!==n.ZodParsedType.array)return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.array,received:t.parsedType}),r.INVALID;if(null!==i.exactLength){const e=t.data.length>i.exactLength.value,n=t.data.length<i.exactLength.value;(e||n)&&((0,r.addIssueToContext)(t,{code:e?s.ZodIssueCode.too_big:s.ZodIssueCode.too_small,minimum:n?i.exactLength.value:void 0,maximum:e?i.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:i.exactLength.message}),a.dirty())}if(null!==i.minLength&&t.data.length<i.minLength.value&&((0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_small,minimum:i.minLength.value,type:"array",inclusive:!0,exact:!1,message:i.minLength.message}),a.dirty()),null!==i.maxLength&&t.data.length>i.maxLength.value&&((0,r.addIssueToContext)(t,{code:s.ZodIssueCode.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),a.dirty()),t.common.async)return Promise.all([...t.data].map(((e,a)=>i.type._parseAsync(new o(t,e,t.path,a))))).then((e=>r.ParseStatus.mergeArray(a,e)));const c=[...t.data].map(((e,a)=>i.type._parseSync(new o(t,e,t.path,a))));return r.ParseStatus.mergeArray(a,c)}get element(){return this._def.type}min(e,t){return new N({...this._def,minLength:{value:e,message:a.errorUtil.toString(t)}})}max(e,t){return new N({...this._def,maxLength:{value:e,message:a.errorUtil.toString(t)}})}length(e,t){return new N({...this._def,exactLength:{value:e,message:a.errorUtil.toString(t)}})}nonempty(e){return this.min(1,e)}}function j(e){if(e instanceof O){const t={};for(const a in e.shape){const r=e.shape[a];t[a]=X.create(j(r))}return new O({...e._def,shape:()=>t})}return e instanceof N?new N({...e._def,type:j(e.element)}):e instanceof X?X.create(j(e.unwrap())):e instanceof Y?Y.create(j(e.unwrap())):e instanceof L?L.create(e.items.map((e=>j(e)))):e}e.ZodArray=N,N.create=(e,t)=>new N({type:e,minLength:null,maxLength:null,exactLength:null,typeName:se.ZodArray,...c(t)});class O extends d{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(null!==this._cached)return this._cached;const e=this._def.shape(),t=n.util.objectKeys(e);return this._cached={shape:e,keys:t}}_parse(e){if(this._getType(e)!==n.ZodParsedType.object){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.object,received:t.parsedType}),r.INVALID}const{status:t,ctx:a}=this._processInputParams(e),{shape:i,keys:c}=this._getCached(),d=[];if(!(this._def.catchall instanceof _&&"strip"===this._def.unknownKeys))for(const e in a.data)c.includes(e)||d.push(e);const u=[];for(const e of c){const t=i[e],r=a.data[e];u.push({key:{status:"valid",value:e},value:t._parse(new o(a,r,a.path,e)),alwaysSet:e in a.data})}if(this._def.catchall instanceof _){const e=this._def.unknownKeys;if("passthrough"===e)for(const e of d)u.push({key:{status:"valid",value:e},value:{status:"valid",value:a.data[e]}});else if("strict"===e)d.length>0&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.unrecognized_keys,keys:d}),t.dirty());else if("strip"!==e)throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const e=this._def.catchall;for(const t of d){const r=a.data[t];u.push({key:{status:"valid",value:t},value:e._parse(new o(a,r,a.path,t)),alwaysSet:t in a.data})}}return a.common.async?Promise.resolve().then((async()=>{const e=[];for(const t of u){const a=await t.key;e.push({key:a,value:await t.value,alwaysSet:t.alwaysSet})}return e})).then((e=>r.ParseStatus.mergeObjectSync(t,e))):r.ParseStatus.mergeObjectSync(t,u)}get shape(){return this._def.shape()}strict(e){return a.errorUtil.errToObj,new O({...this._def,unknownKeys:"strict",...void 0!==e?{errorMap:(t,r)=>{var n,s,o,i;const c=null!==(o=null===(s=(n=this._def).errorMap)||void 0===s?void 0:s.call(n,t,r).message)&&void 0!==o?o:r.defaultError;return"unrecognized_keys"===t.code?{message:null!==(i=a.errorUtil.errToObj(e).message)&&void 0!==i?i:c}:{message:c}}}:{}})}strip(){return new O({...this._def,unknownKeys:"strip"})}passthrough(){return new O({...this._def,unknownKeys:"passthrough"})}extend(e){return new O({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new O({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:se.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new O({...this._def,catchall:e})}pick(e){const t={};return n.util.objectKeys(e).forEach((a=>{e[a]&&this.shape[a]&&(t[a]=this.shape[a])})),new O({...this._def,shape:()=>t})}omit(e){const t={};return n.util.objectKeys(this.shape).forEach((a=>{e[a]||(t[a]=this.shape[a])})),new O({...this._def,shape:()=>t})}deepPartial(){return j(this)}partial(e){const t={};return n.util.objectKeys(this.shape).forEach((a=>{const r=this.shape[a];e&&!e[a]?t[a]=r:t[a]=r.optional()})),new O({...this._def,shape:()=>t})}required(e){const t={};return n.util.objectKeys(this.shape).forEach((a=>{if(e&&!e[a])t[a]=this.shape[a];else{let e=this.shape[a];for(;e instanceof X;)e=e._def.innerType;t[a]=e}})),new O({...this._def,shape:()=>t})}keyof(){return K(n.util.objectKeys(this.shape))}}e.ZodObject=O,O.create=(e,t)=>new O({shape:()=>e,unknownKeys:"strip",catchall:_.create(),typeName:se.ZodObject,...c(t)}),O.strictCreate=(e,t)=>new O({shape:()=>e,unknownKeys:"strict",catchall:_.create(),typeName:se.ZodObject,...c(t)}),O.lazycreate=(e,t)=>new O({shape:e,unknownKeys:"strip",catchall:_.create(),typeName:se.ZodObject,...c(t)});class M extends d{_parse(e){const{ctx:t}=this._processInputParams(e),a=this._def.options;if(t.common.async)return Promise.all(a.map((async e=>{const a={...t,common:{...t.common,issues:[]},parent:null};return{result:await e._parseAsync({data:t.data,path:t.path,parent:a}),ctx:a}}))).then((function(e){for(const t of e)if("valid"===t.result.status)return t.result;for(const a of e)if("dirty"===a.result.status)return t.common.issues.push(...a.ctx.common.issues),a.result;const a=e.map((e=>new s.ZodError(e.ctx.common.issues)));return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_union,unionErrors:a}),r.INVALID}));{let e;const n=[];for(const r of a){const a={...t,common:{...t.common,issues:[]},parent:null},s=r._parseSync({data:t.data,path:t.path,parent:a});if("valid"===s.status)return s;"dirty"!==s.status||e||(e={result:s,ctx:a}),a.common.issues.length&&n.push(a.common.issues)}if(e)return t.common.issues.push(...e.ctx.common.issues),e.result;const o=n.map((e=>new s.ZodError(e)));return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_union,unionErrors:o}),r.INVALID}}get options(){return this._def.options}}e.ZodUnion=M,M.create=(e,t)=>new M({options:e,typeName:se.ZodUnion,...c(t)});const A=e=>e instanceof V?A(e.schema):e instanceof G?A(e.innerType()):e instanceof $?[e.value]:e instanceof W?e.options:e instanceof H?Object.keys(e.enum):e instanceof Q?A(e._def.innerType):e instanceof I?[void 0]:e instanceof k?[null]:null;class B extends d{_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==n.ZodParsedType.object)return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.object,received:t.parsedType}),r.INVALID;const a=this.discriminator,o=t.data[a],i=this.optionsMap.get(o);return i?t.common.async?i._parseAsync({data:t.data,path:t.path,parent:t}):i._parseSync({data:t.data,path:t.path,parent:t}):((0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[a]}),r.INVALID)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,a){const r=new Map;for(const a of t){const t=A(a.shape[e]);if(!t)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(const n of t){if(r.has(n))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(n)}`);r.set(n,a)}}return new B({typeName:se.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:r,...c(a)})}}function z(e,t){const a=(0,n.getParsedType)(e),r=(0,n.getParsedType)(t);if(e===t)return{valid:!0,data:e};if(a===n.ZodParsedType.object&&r===n.ZodParsedType.object){const a=n.util.objectKeys(t),r=n.util.objectKeys(e).filter((e=>-1!==a.indexOf(e))),s={...e,...t};for(const a of r){const r=z(e[a],t[a]);if(!r.valid)return{valid:!1};s[a]=r.data}return{valid:!0,data:s}}if(a===n.ZodParsedType.array&&r===n.ZodParsedType.array){if(e.length!==t.length)return{valid:!1};const a=[];for(let r=0;r<e.length;r++){const n=z(e[r],t[r]);if(!n.valid)return{valid:!1};a.push(n.data)}return{valid:!0,data:a}}return a===n.ZodParsedType.date&&r===n.ZodParsedType.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}e.ZodDiscriminatedUnion=B;class D extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e),n=(e,n)=>{if((0,r.isAborted)(e)||(0,r.isAborted)(n))return r.INVALID;const o=z(e.value,n.value);return o.valid?(((0,r.isDirty)(e)||(0,r.isDirty)(n))&&t.dirty(),{status:t.value,value:o.data}):((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_intersection_types}),r.INVALID)};return a.common.async?Promise.all([this._def.left._parseAsync({data:a.data,path:a.path,parent:a}),this._def.right._parseAsync({data:a.data,path:a.path,parent:a})]).then((([e,t])=>n(e,t))):n(this._def.left._parseSync({data:a.data,path:a.path,parent:a}),this._def.right._parseSync({data:a.data,path:a.path,parent:a}))}}e.ZodIntersection=D,D.create=(e,t,a)=>new D({left:e,right:t,typeName:se.ZodIntersection,...c(a)});class L extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.array)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.array,received:a.parsedType}),r.INVALID;if(a.data.length<this._def.items.length)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),r.INVALID;!this._def.rest&&a.data.length>this._def.items.length&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());const i=[...a.data].map(((e,t)=>{const r=this._def.items[t]||this._def.rest;return r?r._parse(new o(a,e,a.path,t)):null})).filter((e=>!!e));return a.common.async?Promise.all(i).then((e=>r.ParseStatus.mergeArray(t,e))):r.ParseStatus.mergeArray(t,i)}get items(){return this._def.items}rest(e){return new L({...this._def,rest:e})}}e.ZodTuple=L,L.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new L({items:e,typeName:se.ZodTuple,rest:null,...c(t)})};class U extends d{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.object)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.object,received:a.parsedType}),r.INVALID;const i=[],c=this._def.keyType,d=this._def.valueType;for(const e in a.data)i.push({key:c._parse(new o(a,e,a.path,e)),value:d._parse(new o(a,a.data[e],a.path,e))});return a.common.async?r.ParseStatus.mergeObjectAsync(t,i):r.ParseStatus.mergeObjectSync(t,i)}get element(){return this._def.valueType}static create(e,t,a){return new U(t instanceof d?{keyType:e,valueType:t,typeName:se.ZodRecord,...c(a)}:{keyType:S.create(),valueType:e,typeName:se.ZodRecord,...c(t)})}}e.ZodRecord=U;class Z extends d{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.map)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.map,received:a.parsedType}),r.INVALID;const i=this._def.keyType,c=this._def.valueType,d=[...a.data.entries()].map((([e,t],r)=>({key:i._parse(new o(a,e,a.path,[r,"key"])),value:c._parse(new o(a,t,a.path,[r,"value"]))})));if(a.common.async){const e=new Map;return Promise.resolve().then((async()=>{for(const a of d){const n=await a.key,s=await a.value;if("aborted"===n.status||"aborted"===s.status)return r.INVALID;"dirty"!==n.status&&"dirty"!==s.status||t.dirty(),e.set(n.value,s.value)}return{status:t.value,value:e}}))}{const e=new Map;for(const a of d){const n=a.key,s=a.value;if("aborted"===n.status||"aborted"===s.status)return r.INVALID;"dirty"!==n.status&&"dirty"!==s.status||t.dirty(),e.set(n.value,s.value)}return{status:t.value,value:e}}}}e.ZodMap=Z,Z.create=(e,t,a)=>new Z({valueType:t,keyType:e,typeName:se.ZodMap,...c(a)});class F extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.set)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.set,received:a.parsedType}),r.INVALID;const i=this._def;null!==i.minSize&&a.data.size<i.minSize.value&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_small,minimum:i.minSize.value,type:"set",inclusive:!0,exact:!1,message:i.minSize.message}),t.dirty()),null!==i.maxSize&&a.data.size>i.maxSize.value&&((0,r.addIssueToContext)(a,{code:s.ZodIssueCode.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),t.dirty());const c=this._def.valueType;function d(e){const a=new Set;for(const n of e){if("aborted"===n.status)return r.INVALID;"dirty"===n.status&&t.dirty(),a.add(n.value)}return{status:t.value,value:a}}const u=[...a.data.values()].map(((e,t)=>c._parse(new o(a,e,a.path,t))));return a.common.async?Promise.all(u).then((e=>d(e))):d(u)}min(e,t){return new F({...this._def,minSize:{value:e,message:a.errorUtil.toString(t)}})}max(e,t){return new F({...this._def,maxSize:{value:e,message:a.errorUtil.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}}e.ZodSet=F,F.create=(e,t)=>new F({valueType:e,minSize:null,maxSize:null,typeName:se.ZodSet,...c(t)});class q extends d{constructor(){super(...arguments),this.validate=this.implement}_parse(e){const{ctx:a}=this._processInputParams(e);if(a.parsedType!==n.ZodParsedType.function)return(0,r.addIssueToContext)(a,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.function,received:a.parsedType}),r.INVALID;function o(e,n){return(0,r.makeIssue)({data:e,path:a.path,errorMaps:[a.common.contextualErrorMap,a.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:s.ZodIssueCode.invalid_arguments,argumentsError:n}})}function i(e,n){return(0,r.makeIssue)({data:e,path:a.path,errorMaps:[a.common.contextualErrorMap,a.schemaErrorMap,(0,t.getErrorMap)(),t.defaultErrorMap].filter((e=>!!e)),issueData:{code:s.ZodIssueCode.invalid_return_type,returnTypeError:n}})}const c={errorMap:a.common.contextualErrorMap},d=a.data;if(this._def.returns instanceof J){const e=this;return(0,r.OK)((async function(...t){const a=new s.ZodError([]),r=await e._def.args.parseAsync(t,c).catch((e=>{throw a.addIssue(o(t,e)),a})),n=await Reflect.apply(d,this,r),u=await e._def.returns._def.type.parseAsync(n,c).catch((e=>{throw a.addIssue(i(n,e)),a}));return u}))}{const e=this;return(0,r.OK)((function(...t){const a=e._def.args.safeParse(t,c);if(!a.success)throw new s.ZodError([o(t,a.error)]);const r=Reflect.apply(d,this,a.data),n=e._def.returns.safeParse(r,c);if(!n.success)throw new s.ZodError([i(r,n.error)]);return n.data}))}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new q({...this._def,args:L.create(e).rest(E.create())})}returns(e){return new q({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,t,a){return new q({args:e||L.create([]).rest(E.create()),returns:t||E.create(),typeName:se.ZodFunction,...c(a)})}}e.ZodFunction=q;class V extends d{get schema(){return this._def.getter()}_parse(e){const{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}e.ZodLazy=V,V.create=(e,t)=>new V({getter:e,typeName:se.ZodLazy,...c(t)});class $ extends d{_parse(e){if(e.data!==this._def.value){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{received:t.data,code:s.ZodIssueCode.invalid_literal,expected:this._def.value}),r.INVALID}return{status:"valid",value:e.data}}get value(){return this._def.value}}function K(e,t){return new W({values:e,typeName:se.ZodEnum,...c(t)})}e.ZodLiteral=$,$.create=(e,t)=>new $({value:e,typeName:se.ZodLiteral,...c(t)});class W extends d{_parse(e){if("string"!=typeof e.data){const t=this._getOrReturnCtx(e),a=this._def.values;return(0,r.addIssueToContext)(t,{expected:n.util.joinValues(a),received:t.parsedType,code:s.ZodIssueCode.invalid_type}),r.INVALID}if(-1===this._def.values.indexOf(e.data)){const t=this._getOrReturnCtx(e),a=this._def.values;return(0,r.addIssueToContext)(t,{received:t.data,code:s.ZodIssueCode.invalid_enum_value,options:a}),r.INVALID}return(0,r.OK)(e.data)}get options(){return this._def.values}get enum(){const e={};for(const t of this._def.values)e[t]=t;return e}get Values(){const e={};for(const t of this._def.values)e[t]=t;return e}get Enum(){const e={};for(const t of this._def.values)e[t]=t;return e}extract(e){return W.create(e)}exclude(e){return W.create(this.options.filter((t=>!e.includes(t))))}}e.ZodEnum=W,W.create=K;class H extends d{_parse(e){const t=n.util.getValidEnumValues(this._def.values),a=this._getOrReturnCtx(e);if(a.parsedType!==n.ZodParsedType.string&&a.parsedType!==n.ZodParsedType.number){const e=n.util.objectValues(t);return(0,r.addIssueToContext)(a,{expected:n.util.joinValues(e),received:a.parsedType,code:s.ZodIssueCode.invalid_type}),r.INVALID}if(-1===t.indexOf(e.data)){const e=n.util.objectValues(t);return(0,r.addIssueToContext)(a,{received:a.data,code:s.ZodIssueCode.invalid_enum_value,options:e}),r.INVALID}return(0,r.OK)(e.data)}get enum(){return this._def.values}}e.ZodNativeEnum=H,H.create=(e,t)=>new H({values:e,typeName:se.ZodNativeEnum,...c(t)});class J extends d{unwrap(){return this._def.type}_parse(e){const{ctx:t}=this._processInputParams(e);if(t.parsedType!==n.ZodParsedType.promise&&!1===t.common.async)return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.promise,received:t.parsedType}),r.INVALID;const a=t.parsedType===n.ZodParsedType.promise?t.data:Promise.resolve(t.data);return(0,r.OK)(a.then((e=>this._def.type.parseAsync(e,{path:t.path,errorMap:t.common.contextualErrorMap}))))}}e.ZodPromise=J,J.create=(e,t)=>new J({type:e,typeName:se.ZodPromise,...c(t)});class G extends d{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===se.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){const{status:t,ctx:a}=this._processInputParams(e),s=this._def.effect||null,o={addIssue:e=>{(0,r.addIssueToContext)(a,e),e.fatal?t.abort():t.dirty()},get path(){return a.path}};if(o.addIssue=o.addIssue.bind(o),"preprocess"===s.type){const e=s.transform(a.data,o);return a.common.issues.length?{status:"dirty",value:a.data}:a.common.async?Promise.resolve(e).then((e=>this._def.schema._parseAsync({data:e,path:a.path,parent:a}))):this._def.schema._parseSync({data:e,path:a.path,parent:a})}if("refinement"===s.type){const e=e=>{const t=s.refinement(e,o);if(a.common.async)return Promise.resolve(t);if(t instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return e};if(!1===a.common.async){const n=this._def.schema._parseSync({data:a.data,path:a.path,parent:a});return"aborted"===n.status?r.INVALID:("dirty"===n.status&&t.dirty(),e(n.value),{status:t.value,value:n.value})}return this._def.schema._parseAsync({data:a.data,path:a.path,parent:a}).then((a=>"aborted"===a.status?r.INVALID:("dirty"===a.status&&t.dirty(),e(a.value).then((()=>({status:t.value,value:a.value}))))))}if("transform"===s.type){if(!1===a.common.async){const e=this._def.schema._parseSync({data:a.data,path:a.path,parent:a});if(!(0,r.isValid)(e))return e;const n=s.transform(e.value,o);if(n instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:n}}return this._def.schema._parseAsync({data:a.data,path:a.path,parent:a}).then((e=>(0,r.isValid)(e)?Promise.resolve(s.transform(e.value,o)).then((e=>({status:t.value,value:e}))):e))}n.util.assertNever(s)}}e.ZodEffects=G,e.ZodTransformer=G,G.create=(e,t,a)=>new G({schema:e,typeName:se.ZodEffects,effect:t,...c(a)}),G.createWithPreprocess=(e,t,a)=>new G({schema:t,effect:{type:"preprocess",transform:e},typeName:se.ZodEffects,...c(a)});class X extends d{_parse(e){return this._getType(e)===n.ZodParsedType.undefined?(0,r.OK)(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodOptional=X,X.create=(e,t)=>new X({innerType:e,typeName:se.ZodOptional,...c(t)});class Y extends d{_parse(e){return this._getType(e)===n.ZodParsedType.null?(0,r.OK)(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}}e.ZodNullable=Y,Y.create=(e,t)=>new Y({innerType:e,typeName:se.ZodNullable,...c(t)});class Q extends d{_parse(e){const{ctx:t}=this._processInputParams(e);let a=t.data;return t.parsedType===n.ZodParsedType.undefined&&(a=this._def.defaultValue()),this._def.innerType._parse({data:a,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}e.ZodDefault=Q,Q.create=(e,t)=>new Q({innerType:e,typeName:se.ZodDefault,defaultValue:"function"==typeof t.default?t.default:()=>t.default,...c(t)});class ee extends d{_parse(e){const{ctx:t}=this._processInputParams(e),a={...t,common:{...t.common,issues:[]}},n=this._def.innerType._parse({data:a.data,path:a.path,parent:{...a}});return(0,r.isAsync)(n)?n.then((e=>({status:"valid",value:"valid"===e.status?e.value:this._def.catchValue({get error(){return new s.ZodError(a.common.issues)},input:a.data})}))):{status:"valid",value:"valid"===n.status?n.value:this._def.catchValue({get error(){return new s.ZodError(a.common.issues)},input:a.data})}}removeCatch(){return this._def.innerType}}e.ZodCatch=ee,ee.create=(e,t)=>new ee({innerType:e,typeName:se.ZodCatch,catchValue:"function"==typeof t.catch?t.catch:()=>t.catch,...c(t)});class te extends d{_parse(e){if(this._getType(e)!==n.ZodParsedType.nan){const t=this._getOrReturnCtx(e);return(0,r.addIssueToContext)(t,{code:s.ZodIssueCode.invalid_type,expected:n.ZodParsedType.nan,received:t.parsedType}),r.INVALID}return{status:"valid",value:e.data}}}e.ZodNaN=te,te.create=e=>new te({typeName:se.ZodNaN,...c(e)}),e.BRAND=Symbol("zod_brand");class ae extends d{_parse(e){const{ctx:t}=this._processInputParams(e),a=t.data;return this._def.type._parse({data:a,path:t.path,parent:t})}unwrap(){return this._def.type}}e.ZodBranded=ae;class re extends d{_parse(e){const{status:t,ctx:a}=this._processInputParams(e);if(a.common.async){return(async()=>{const e=await this._def.in._parseAsync({data:a.data,path:a.path,parent:a});return"aborted"===e.status?r.INVALID:"dirty"===e.status?(t.dirty(),(0,r.DIRTY)(e.value)):this._def.out._parseAsync({data:e.value,path:a.path,parent:a})})()}{const e=this._def.in._parseSync({data:a.data,path:a.path,parent:a});return"aborted"===e.status?r.INVALID:"dirty"===e.status?(t.dirty(),{status:"dirty",value:e.value}):this._def.out._parseSync({data:e.value,path:a.path,parent:a})}}static create(e,t){return new re({in:e,out:t,typeName:se.ZodPipeline})}}e.ZodPipeline=re;class ne extends d{_parse(e){const t=this._def.innerType._parse(e);return(0,r.isValid)(t)&&(t.value=Object.freeze(t.value)),t}}e.ZodReadonly=ne,ne.create=(e,t)=>new ne({innerType:e,typeName:se.ZodReadonly,...c(t)});var se;e.custom=(e,t={},a)=>e?R.create().superRefine(((r,n)=>{var s,o;if(!e(r)){const e="function"==typeof t?t(r):"string"==typeof t?{message:t}:t,i=null===(o=null!==(s=e.fatal)&&void 0!==s?s:a)||void 0===o||o,c="string"==typeof e?{message:e}:e;n.addIssue({code:"custom",...c,fatal:i})}})):R.create(),e.late={object:O.lazycreate},function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"}(se=e.ZodFirstPartyTypeKind||(e.ZodFirstPartyTypeKind={}));e.instanceof=(t,a={message:`Input not instance of ${t.name}`})=>(0,e.custom)((e=>e instanceof t),a);const oe=S.create;e.string=oe;const ie=w.create;e.number=ie;const ce=te.create;e.nan=ce;const de=C.create;e.bigint=de;const ue=b.create;e.boolean=ue;const le=x.create;e.date=le;const he=P.create;e.symbol=he;const pe=I.create;e.undefined=pe;const me=k.create;e.null=me;const fe=R.create;e.any=fe;const ge=E.create;e.unknown=ge;const ye=_.create;e.never=ye;const Se=T.create;e.void=Se;const ve=N.create;e.array=ve;const we=O.create;e.object=we;const Ce=O.strictCreate;e.strictObject=Ce;const be=M.create;e.union=be;const xe=B.create;e.discriminatedUnion=xe;const Pe=D.create;e.intersection=Pe;const Ie=L.create;e.tuple=Ie;const ke=U.create;e.record=ke;const Re=Z.create;e.map=Re;const Ee=F.create;e.set=Ee;const _e=q.create;e.function=_e;const Te=V.create;e.lazy=Te;const Ne=$.create;e.literal=Ne;const je=W.create;e.enum=je;const Oe=H.create;e.nativeEnum=Oe;const Me=J.create;e.promise=Me;const Ae=G.create;e.effect=Ae,e.transformer=Ae;const Be=X.create;e.optional=Be;const ze=Y.create;e.nullable=ze;const De=G.createWithPreprocess;e.preprocess=De;const Le=re.create;e.pipeline=Le;e.ostring=()=>oe().optional();e.onumber=()=>ie().optional();e.oboolean=()=>ue().optional(),e.coerce={string:e=>S.create({...e,coerce:!0}),number:e=>w.create({...e,coerce:!0}),boolean:e=>b.create({...e,coerce:!0}),bigint:e=>C.create({...e,coerce:!0}),date:e=>x.create({...e,coerce:!0})},e.NEVER=r.INVALID}(fn),function(t){var a=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),r=e&&e.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),r(en,t),r(hn,t),r(pn,t),r(an,t),r(fn,t),r(rn,t)}(Qr),function(t){var a=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),r=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&a(t,e,n);return r(t,e),t},s=e&&e.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.z=void 0;const o=n(Qr);t.z=o,s(Qr,t),t.default=o}(Yr);var yn={},Sn=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(yn,"__esModule",{value:!0}),yn.Permissions=yn.PermissionsCommandSchema=void 0;const vn=Sn(Yr);var wn;yn.PermissionsCommandSchema=vn.default.lazy((()=>wn.SetPermissionSchema)),function(e){e.PermissionDescriptorSchema=vn.default.lazy((()=>vn.default.object({name:vn.default.string()})))}(wn||(yn.Permissions=wn={})),function(e){e.PermissionStateSchema=vn.default.lazy((()=>vn.default.enum(["granted","denied","prompt"])))}(wn||(yn.Permissions=wn={})),function(e){e.SetPermissionSchema=vn.default.lazy((()=>vn.default.object({method:vn.default.literal("permissions.setPermission"),params:e.SetPermissionParametersSchema})))}(wn||(yn.Permissions=wn={})),function(e){e.SetPermissionParametersSchema=vn.default.lazy((()=>vn.default.object({descriptor:e.PermissionDescriptorSchema,state:e.PermissionStateSchema,origin:vn.default.string()})))}(wn||(yn.Permissions=wn={}));var Cn={};!function(t){var a=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Input=t.InputCommandSchema=t.Log=t.LogEventSchema=t.Storage=t.StorageResultSchema=t.StorageCommandSchema=t.Script=t.ScriptResultSchema=t.ScriptCommandSchema=t.ScriptEventSchema=t.Network=t.NetworkResultSchema=t.NetworkEventSchema=t.NetworkCommandSchema=t.BrowsingContext=t.BrowsingContextResultSchema=t.BrowsingContextEventSchema=t.BrowsingContextCommandSchema=t.Browser=t.BrowserResultSchema=t.BrowserCommandSchema=t.SessionResultSchema=t.Session=t.SessionCommandSchema=t.ErrorCodeSchema=t.JsUintSchema=t.JsIntSchema=t.ExtensibleSchema=t.EmptyResultSchema=t.ErrorResponseSchema=t.MessageSchema=t.EmptyParamsSchema=t.ResultDataSchema=t.CommandDataSchema=t.EventDataSchema=t.CommandResponseSchema=t.CommandSchema=t.EventSchema=void 0;const r=a(Yr);var n,s,o,i,c,d,u,l;t.EventSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("event")}).and(t.EventDataSchema).and(t.ExtensibleSchema))),t.CommandSchema=r.default.lazy((()=>r.default.object({id:t.JsUintSchema}).and(t.CommandDataSchema).and(t.ExtensibleSchema))),t.CommandResponseSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("success"),id:t.JsUintSchema,result:t.ResultDataSchema}).and(t.ExtensibleSchema))),t.EventDataSchema=r.default.lazy((()=>r.default.union([t.BrowsingContextEventSchema,t.LogEventSchema,t.NetworkEventSchema,t.ScriptEventSchema]))),t.CommandDataSchema=r.default.lazy((()=>r.default.union([t.BrowserCommandSchema,t.BrowsingContextCommandSchema,t.InputCommandSchema,t.NetworkCommandSchema,t.ScriptCommandSchema,t.SessionCommandSchema,t.StorageCommandSchema]))),t.ResultDataSchema=r.default.lazy((()=>r.default.union([t.BrowsingContextResultSchema,t.EmptyResultSchema,t.NetworkResultSchema,t.ScriptResultSchema,t.SessionResultSchema,t.StorageResultSchema]))),t.EmptyParamsSchema=r.default.lazy((()=>t.ExtensibleSchema)),t.MessageSchema=r.default.lazy((()=>r.default.union([t.CommandResponseSchema,t.ErrorResponseSchema,t.EventSchema]))),t.ErrorResponseSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("error"),id:r.default.union([t.JsUintSchema,r.default.null()]),error:t.ErrorCodeSchema,message:r.default.string(),stacktrace:r.default.string().optional()}).and(t.ExtensibleSchema))),t.EmptyResultSchema=r.default.lazy((()=>t.ExtensibleSchema)),t.ExtensibleSchema=r.default.lazy((()=>r.default.record(r.default.string(),r.default.any()))),t.JsIntSchema=r.default.lazy((()=>r.default.number().int().gte(-9007199254740991).lte(9007199254740991))),t.JsUintSchema=r.default.lazy((()=>r.default.number().int().nonnegative().gte(0).lte(9007199254740991))),t.ErrorCodeSchema=r.default.lazy((()=>r.default.enum(["invalid argument","invalid session id","move target out of bounds","no such alert","no such element","no such frame","no such handle","no such history entry","no such intercept","no such node","no such request","no such script","no such storage partition","no such user context","session not created","unable to capture screen","unable to close browser","unable to set cookie","unable to set file input","underspecified storage partition","unknown command","unknown error","unsupported operation"]))),t.SessionCommandSchema=r.default.lazy((()=>r.default.union([n.EndSchema,n.NewSchema,n.StatusSchema,n.SubscribeSchema,n.UnsubscribeSchema]))),function(e){e.ProxyConfigurationSchema=r.default.lazy((()=>r.default.union([e.AutodetectProxyConfigurationSchema,e.DirectProxyConfigurationSchema,e.ManualProxyConfigurationSchema,e.PacProxyConfigurationSchema,e.SystemProxyConfigurationSchema,r.default.object({})])))}(n||(t.Session=n={})),t.SessionResultSchema=r.default.lazy((()=>r.default.union([n.NewResultSchema,n.StatusResultSchema]))),function(e){e.CapabilitiesRequestSchema=r.default.lazy((()=>r.default.object({alwaysMatch:e.CapabilityRequestSchema.optional(),firstMatch:r.default.array(e.CapabilityRequestSchema).optional()})))}(n||(t.Session=n={})),function(e){e.CapabilityRequestSchema=r.default.lazy((()=>r.default.object({acceptInsecureCerts:r.default.boolean().optional(),browserName:r.default.string().optional(),browserVersion:r.default.string().optional(),platformName:r.default.string().optional(),proxy:e.ProxyConfigurationSchema.optional(),webSocketUrl:r.default.boolean().optional()}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.AutodetectProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("autodetect")}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.DirectProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("direct")}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.ManualProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("manual"),ftpProxy:r.default.string().optional(),httpProxy:r.default.string().optional(),sslProxy:r.default.string().optional()}).and(e.SocksProxyConfigurationSchema.or(r.default.object({}))).and(r.default.object({noProxy:r.default.array(r.default.string()).optional()})).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.SocksProxyConfigurationSchema=r.default.lazy((()=>r.default.object({socksProxy:r.default.string(),socksVersion:r.default.number().int().nonnegative().gte(0).lte(255)})))}(n||(t.Session=n={})),function(e){e.PacProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("pac"),proxyAutoconfigUrl:r.default.string()}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.SystemProxyConfigurationSchema=r.default.lazy((()=>r.default.object({proxyType:r.default.literal("system")}).and(t.ExtensibleSchema)))}(n||(t.Session=n={})),function(e){e.SubscriptionRequestSchema=r.default.lazy((()=>r.default.object({events:r.default.array(r.default.string()),contexts:r.default.array(o.BrowsingContextSchema).optional()})))}(n||(t.Session=n={})),function(e){e.StatusSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.status"),params:t.EmptyParamsSchema})))}(n||(t.Session=n={})),function(e){e.StatusResultSchema=r.default.lazy((()=>r.default.object({ready:r.default.boolean(),message:r.default.string()})))}(n||(t.Session=n={})),function(e){e.NewSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.new"),params:e.NewParametersSchema})))}(n||(t.Session=n={})),function(e){e.NewParametersSchema=r.default.lazy((()=>r.default.object({capabilities:e.CapabilitiesRequestSchema})))}(n||(t.Session=n={})),function(e){e.NewResultSchema=r.default.lazy((()=>r.default.object({sessionId:r.default.string(),capabilities:r.default.object({acceptInsecureCerts:r.default.boolean(),browserName:r.default.string(),browserVersion:r.default.string(),platformName:r.default.string(),setWindowRect:r.default.boolean(),proxy:e.ProxyConfigurationSchema.optional(),webSocketUrl:r.default.string().optional()}).and(t.ExtensibleSchema)})))}(n||(t.Session=n={})),function(e){e.EndSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.end"),params:t.EmptyParamsSchema})))}(n||(t.Session=n={})),function(e){e.SubscribeSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.subscribe"),params:e.SubscriptionRequestSchema})))}(n||(t.Session=n={})),function(e){e.UnsubscribeSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("session.unsubscribe"),params:e.SubscriptionRequestSchema})))}(n||(t.Session=n={})),t.BrowserCommandSchema=r.default.lazy((()=>r.default.union([s.CloseSchema,s.CreateUserContextSchema,s.GetUserContextsSchema,s.RemoveUserContextSchema]))),t.BrowserResultSchema=r.default.lazy((()=>r.default.union([s.CreateUserContextResultSchema,s.GetUserContextsResultSchema]))),function(e){e.UserContextSchema=r.default.lazy((()=>r.default.string()))}(s||(t.Browser=s={})),function(e){e.UserContextInfoSchema=r.default.lazy((()=>r.default.object({userContext:e.UserContextSchema})))}(s||(t.Browser=s={})),function(e){e.CloseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browser.close"),params:t.EmptyParamsSchema})))}(s||(t.Browser=s={})),function(e){e.CreateUserContextSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browser.createUserContext"),params:t.EmptyParamsSchema})))}(s||(t.Browser=s={})),function(e){e.CreateUserContextResultSchema=r.default.lazy((()=>e.UserContextInfoSchema))}(s||(t.Browser=s={})),function(e){e.GetUserContextsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browser.getUserContexts"),params:t.EmptyParamsSchema})))}(s||(t.Browser=s={})),function(e){e.GetUserContextsResultSchema=r.default.lazy((()=>r.default.object({userContexts:r.default.array(e.UserContextInfoSchema)})))}(s||(t.Browser=s={})),function(e){e.RemoveUserContextSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browser.removeUserContext"),params:r.default.object({userContext:e.UserContextSchema})})))}(s||(t.Browser=s={})),t.BrowsingContextCommandSchema=r.default.lazy((()=>r.default.union([o.ActivateSchema,o.CaptureScreenshotSchema,o.CloseSchema,o.CreateSchema,o.GetTreeSchema,o.HandleUserPromptSchema,o.LocateNodesSchema,o.NavigateSchema,o.PrintSchema,o.ReloadSchema,o.SetViewportSchema,o.TraverseHistorySchema]))),t.BrowsingContextEventSchema=r.default.lazy((()=>r.default.union([o.ContextCreatedSchema,o.ContextDestroyedSchema,o.DomContentLoadedSchema,o.DownloadWillBeginSchema,o.FragmentNavigatedSchema,o.LoadSchema,o.NavigationAbortedSchema,o.NavigationFailedSchema,o.NavigationStartedSchema,o.UserPromptClosedSchema,o.UserPromptOpenedSchema]))),t.BrowsingContextResultSchema=r.default.lazy((()=>r.default.union([o.CaptureScreenshotResultSchema,o.CreateResultSchema,o.GetTreeResultSchema,o.LocateNodesResultSchema,o.NavigateResultSchema,o.PrintResultSchema,o.TraverseHistoryResultSchema]))),function(e){e.BrowsingContextSchema=r.default.lazy((()=>r.default.string()))}(o||(t.BrowsingContext=o={})),function(e){e.InfoListSchema=r.default.lazy((()=>r.default.array(e.InfoSchema)))}(o||(t.BrowsingContext=o={})),function(e){e.InfoSchema=r.default.lazy((()=>r.default.object({children:r.default.union([e.InfoListSchema,r.default.null()]),context:e.BrowsingContextSchema,url:r.default.string(),userContext:s.UserContextSchema,parent:r.default.union([e.BrowsingContextSchema,r.default.null()]).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.LocatorSchema=r.default.lazy((()=>r.default.union([e.CssLocatorSchema,e.InnerTextLocatorSchema,e.XPathLocatorSchema])))}(o||(t.BrowsingContext=o={})),function(e){e.CssLocatorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("css"),value:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.InnerTextLocatorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("innerText"),value:r.default.string(),ignoreCase:r.default.boolean().optional(),matchType:r.default.enum(["full","partial"]).optional(),maxDepth:t.JsUintSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.XPathLocatorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("xpath"),value:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationSchema=r.default.lazy((()=>r.default.string()))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationInfoSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,navigation:r.default.union([e.NavigationSchema,r.default.null()]),timestamp:t.JsUintSchema,url:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.ReadinessStateSchema=r.default.lazy((()=>r.default.enum(["none","interactive","complete"])))}(o||(t.BrowsingContext=o={})),function(e){e.ActivateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.activate"),params:e.ActivateParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ActivateParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.CaptureScreenshotParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,origin:r.default.enum(["viewport","document"]).default("viewport").optional(),format:e.ImageFormatSchema.optional(),clip:e.ClipRectangleSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.CaptureScreenshotSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.captureScreenshot"),params:e.CaptureScreenshotParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ImageFormatSchema=r.default.lazy((()=>r.default.object({type:r.default.string(),quality:r.default.number().gte(0).lte(1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.ClipRectangleSchema=r.default.lazy((()=>r.default.union([e.BoxClipRectangleSchema,e.ElementClipRectangleSchema])))}(o||(t.BrowsingContext=o={})),function(e){e.ElementClipRectangleSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("element"),element:c.SharedReferenceSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.BoxClipRectangleSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("box"),x:r.default.number(),y:r.default.number(),width:r.default.number(),height:r.default.number()})))}(o||(t.BrowsingContext=o={})),function(e){e.CaptureScreenshotResultSchema=r.default.lazy((()=>r.default.object({data:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.CloseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.close"),params:e.CloseParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.CloseParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,promptUnload:r.default.boolean().default(!1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.CreateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.create"),params:e.CreateParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.CreateTypeSchema=r.default.lazy((()=>r.default.enum(["tab","window"])))}(o||(t.BrowsingContext=o={})),function(e){e.CreateParametersSchema=r.default.lazy((()=>r.default.object({type:e.CreateTypeSchema,referenceContext:e.BrowsingContextSchema.optional(),background:r.default.boolean().default(!1).optional(),userContext:r.default.union([s.UserContextSchema,r.default.null()]).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.CreateResultSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.GetTreeSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.getTree"),params:e.GetTreeParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.GetTreeParametersSchema=r.default.lazy((()=>r.default.object({maxDepth:t.JsUintSchema.optional(),root:e.BrowsingContextSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.GetTreeResultSchema=r.default.lazy((()=>r.default.object({contexts:e.InfoListSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.HandleUserPromptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.handleUserPrompt"),params:e.HandleUserPromptParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.HandleUserPromptParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,accept:r.default.boolean().optional(),userText:r.default.string().optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.LocateNodesParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,locator:e.LocatorSchema,maxNodeCount:t.JsUintSchema.gte(1).optional(),ownership:c.ResultOwnershipSchema.optional(),sandbox:r.default.string().optional(),serializationOptions:c.SerializationOptionsSchema.optional(),startNodes:r.default.array(c.SharedReferenceSchema).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.LocateNodesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.locateNodes"),params:e.LocateNodesParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.LocateNodesResultSchema=r.default.lazy((()=>r.default.object({nodes:r.default.array(c.NodeRemoteValueSchema)})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigate"),params:e.NavigateParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigateParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,url:r.default.string(),wait:e.ReadinessStateSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigateResultSchema=r.default.lazy((()=>r.default.object({navigation:r.default.union([e.NavigationSchema,r.default.null()]),url:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.print"),params:e.PrintParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,background:r.default.boolean().default(!1).optional(),margin:e.PrintMarginParametersSchema.optional(),orientation:r.default.enum(["portrait","landscape"]).default("portrait").optional(),page:e.PrintPageParametersSchema.optional(),pageRanges:r.default.array(r.default.union([t.JsUintSchema,r.default.string()])).optional(),scale:r.default.number().gte(.1).lte(2).default(1).optional(),shrinkToFit:r.default.boolean().default(!0).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintMarginParametersSchema=r.default.lazy((()=>r.default.object({bottom:r.default.number().gte(0).default(1).optional(),left:r.default.number().gte(0).default(1).optional(),right:r.default.number().gte(0).default(1).optional(),top:r.default.number().gte(0).default(1).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintPageParametersSchema=r.default.lazy((()=>r.default.object({height:r.default.number().gte(.0352).default(27.94).optional(),width:r.default.number().gte(.0352).default(21.59).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.PrintResultSchema=r.default.lazy((()=>r.default.object({data:r.default.string()})))}(o||(t.BrowsingContext=o={})),function(e){e.ReloadSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.reload"),params:e.ReloadParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ReloadParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,ignoreCache:r.default.boolean().optional(),wait:e.ReadinessStateSchema.optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.SetViewportSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.setViewport"),params:e.SetViewportParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.SetViewportParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,viewport:r.default.union([e.ViewportSchema,r.default.null()]).optional(),devicePixelRatio:r.default.union([r.default.number().gt(0),r.default.null()]).optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.ViewportSchema=r.default.lazy((()=>r.default.object({width:t.JsUintSchema,height:t.JsUintSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.TraverseHistorySchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.traverseHistory"),params:e.TraverseHistoryParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.TraverseHistoryParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,delta:t.JsIntSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.TraverseHistoryResultSchema=r.default.lazy((()=>r.default.object({})))}(o||(t.BrowsingContext=o={})),function(e){e.ContextCreatedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.contextCreated"),params:e.InfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.ContextDestroyedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.contextDestroyed"),params:e.InfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationStartedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigationStarted"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.FragmentNavigatedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.fragmentNavigated"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.DomContentLoadedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.domContentLoaded"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.LoadSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.load"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.DownloadWillBeginSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.downloadWillBegin"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationAbortedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigationAborted"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.NavigationFailedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.navigationFailed"),params:e.NavigationInfoSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptClosedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.userPromptClosed"),params:e.UserPromptClosedParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptClosedParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,accepted:r.default.boolean(),userText:r.default.string().optional()})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptOpenedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("browsingContext.userPromptOpened"),params:e.UserPromptOpenedParametersSchema})))}(o||(t.BrowsingContext=o={})),function(e){e.UserPromptOpenedParametersSchema=r.default.lazy((()=>r.default.object({context:e.BrowsingContextSchema,type:r.default.enum(["alert","confirm","prompt","beforeunload"]),message:r.default.string(),defaultValue:r.default.string().optional()})))}(o||(t.BrowsingContext=o={})),t.NetworkCommandSchema=r.default.lazy((()=>r.default.union([i.AddInterceptSchema,i.ContinueRequestSchema,i.ContinueResponseSchema,i.ContinueWithAuthSchema,i.FailRequestSchema,i.ProvideResponseSchema,i.RemoveInterceptSchema]))),t.NetworkEventSchema=r.default.lazy((()=>r.default.union([i.AuthRequiredSchema,i.BeforeRequestSentSchema,i.FetchErrorSchema,i.ResponseCompletedSchema,i.ResponseStartedSchema]))),t.NetworkResultSchema=r.default.lazy((()=>i.AddInterceptResultSchema)),function(e){e.AuthChallengeSchema=r.default.lazy((()=>r.default.object({scheme:r.default.string(),realm:r.default.string()})))}(i||(t.Network=i={})),function(e){e.AuthCredentialsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("password"),username:r.default.string(),password:r.default.string()})))}(i||(t.Network=i={})),function(e){e.BaseParametersSchema=r.default.lazy((()=>r.default.object({context:r.default.union([o.BrowsingContextSchema,r.default.null()]),isBlocked:r.default.boolean(),navigation:r.default.union([o.NavigationSchema,r.default.null()]),redirectCount:t.JsUintSchema,request:e.RequestDataSchema,timestamp:t.JsUintSchema,intercepts:r.default.array(e.InterceptSchema).optional()})))}(i||(t.Network=i={})),function(e){e.BytesValueSchema=r.default.lazy((()=>r.default.union([e.StringValueSchema,e.Base64ValueSchema])))}(i||(t.Network=i={})),function(e){e.StringValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("string"),value:r.default.string()})))}(i||(t.Network=i={})),function(e){e.Base64ValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("base64"),value:r.default.string()})))}(i||(t.Network=i={})),function(e){e.SameSiteSchema=r.default.lazy((()=>r.default.enum(["strict","lax","none"])))}(i||(t.Network=i={})),function(e){e.CookieSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema,domain:r.default.string(),path:r.default.string(),size:t.JsUintSchema,httpOnly:r.default.boolean(),secure:r.default.boolean(),sameSite:e.SameSiteSchema,expiry:t.JsUintSchema.optional()}).and(t.ExtensibleSchema)))}(i||(t.Network=i={})),function(e){e.CookieHeaderSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema})))}(i||(t.Network=i={})),function(e){e.FetchTimingInfoSchema=r.default.lazy((()=>r.default.object({timeOrigin:r.default.number(),requestTime:r.default.number(),redirectStart:r.default.number(),redirectEnd:r.default.number(),fetchStart:r.default.number(),dnsStart:r.default.number(),dnsEnd:r.default.number(),connectStart:r.default.number(),connectEnd:r.default.number(),tlsStart:r.default.number(),requestStart:r.default.number(),responseStart:r.default.number(),responseEnd:r.default.number()})))}(i||(t.Network=i={})),function(e){e.HeaderSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema})))}(i||(t.Network=i={})),function(e){e.InitiatorSchema=r.default.lazy((()=>r.default.object({type:r.default.enum(["parser","script","preflight","other"]),columnNumber:t.JsUintSchema.optional(),lineNumber:t.JsUintSchema.optional(),stackTrace:c.StackTraceSchema.optional(),request:e.RequestSchema.optional()})))}(i||(t.Network=i={})),function(e){e.InterceptSchema=r.default.lazy((()=>r.default.string()))}(i||(t.Network=i={})),function(e){e.RequestSchema=r.default.lazy((()=>r.default.string()))}(i||(t.Network=i={})),function(e){e.RequestDataSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,url:r.default.string(),method:r.default.string(),headers:r.default.array(e.HeaderSchema),cookies:r.default.array(e.CookieSchema),headersSize:t.JsUintSchema,bodySize:r.default.union([t.JsUintSchema,r.default.null()]),timings:e.FetchTimingInfoSchema})))}(i||(t.Network=i={})),function(e){e.ResponseContentSchema=r.default.lazy((()=>r.default.object({size:t.JsUintSchema})))}(i||(t.Network=i={})),function(e){e.ResponseDataSchema=r.default.lazy((()=>r.default.object({url:r.default.string(),protocol:r.default.string(),status:t.JsUintSchema,statusText:r.default.string(),fromCache:r.default.boolean(),headers:r.default.array(e.HeaderSchema),mimeType:r.default.string(),bytesReceived:t.JsUintSchema,headersSize:r.default.union([t.JsUintSchema,r.default.null()]),bodySize:r.default.union([t.JsUintSchema,r.default.null()]),content:e.ResponseContentSchema,authChallenge:e.AuthChallengeSchema.optional()})))}(i||(t.Network=i={})),function(e){e.SetCookieHeaderSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:e.BytesValueSchema,domain:r.default.string().optional(),httpOnly:r.default.boolean().optional(),expiry:r.default.string().optional(),maxAge:t.JsIntSchema.optional(),path:r.default.string().optional(),sameSite:e.SameSiteSchema.optional(),secure:r.default.boolean().optional()})))}(i||(t.Network=i={})),function(e){e.UrlPatternSchema=r.default.lazy((()=>r.default.union([e.UrlPatternPatternSchema,e.UrlPatternStringSchema])))}(i||(t.Network=i={})),function(e){e.UrlPatternPatternSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pattern"),protocol:r.default.string().optional(),hostname:r.default.string().optional(),port:r.default.string().optional(),pathname:r.default.string().optional(),search:r.default.string().optional()})))}(i||(t.Network=i={})),function(e){e.UrlPatternStringSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("string"),pattern:r.default.string()})))}(i||(t.Network=i={})),function(e){e.AddInterceptParametersSchema=r.default.lazy((()=>r.default.object({phases:r.default.array(e.InterceptPhaseSchema),urlPatterns:r.default.array(e.UrlPatternSchema).optional()})))}(i||(t.Network=i={})),function(e){e.AddInterceptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.addIntercept"),params:e.AddInterceptParametersSchema})))}(i||(t.Network=i={})),function(e){e.InterceptPhaseSchema=r.default.lazy((()=>r.default.enum(["beforeRequestSent","responseStarted","authRequired"])))}(i||(t.Network=i={})),function(e){e.AddInterceptResultSchema=r.default.lazy((()=>r.default.object({intercept:e.InterceptSchema})))}(i||(t.Network=i={})),function(e){e.ContinueRequestSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.continueRequest"),params:e.ContinueRequestParametersSchema})))}(i||(t.Network=i={})),function(e){e.ContinueRequestParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,body:e.BytesValueSchema.optional(),cookies:r.default.array(e.CookieHeaderSchema).optional(),headers:r.default.array(e.HeaderSchema).optional(),method:r.default.string().optional(),url:r.default.string().optional()})))}(i||(t.Network=i={})),function(e){e.ContinueResponseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.continueResponse"),params:e.ContinueResponseParametersSchema})))}(i||(t.Network=i={})),function(e){e.ContinueResponseParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,cookies:r.default.array(e.SetCookieHeaderSchema).optional(),credentials:e.AuthCredentialsSchema.optional(),headers:r.default.array(e.HeaderSchema).optional(),reasonPhrase:r.default.string().optional(),statusCode:t.JsUintSchema.optional()})))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.continueWithAuth"),params:e.ContinueWithAuthParametersSchema})))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema}).and(r.default.union([e.ContinueWithAuthCredentialsSchema,e.ContinueWithAuthNoCredentialsSchema]))))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthCredentialsSchema=r.default.lazy((()=>r.default.object({action:r.default.literal("provideCredentials"),credentials:e.AuthCredentialsSchema})))}(i||(t.Network=i={})),function(e){e.ContinueWithAuthNoCredentialsSchema=r.default.lazy((()=>r.default.object({action:r.default.enum(["default","cancel"])})))}(i||(t.Network=i={})),function(e){e.FailRequestSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.failRequest"),params:e.FailRequestParametersSchema})))}(i||(t.Network=i={})),function(e){e.FailRequestParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema})))}(i||(t.Network=i={})),function(e){e.ProvideResponseSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.provideResponse"),params:e.ProvideResponseParametersSchema})))}(i||(t.Network=i={})),function(e){e.ProvideResponseParametersSchema=r.default.lazy((()=>r.default.object({request:e.RequestSchema,body:e.BytesValueSchema.optional(),cookies:r.default.array(e.SetCookieHeaderSchema).optional(),headers:r.default.array(e.HeaderSchema).optional(),reasonPhrase:r.default.string().optional(),statusCode:t.JsUintSchema.optional()})))}(i||(t.Network=i={})),function(e){e.RemoveInterceptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.removeIntercept"),params:e.RemoveInterceptParametersSchema})))}(i||(t.Network=i={})),function(e){e.RemoveInterceptParametersSchema=r.default.lazy((()=>r.default.object({intercept:e.InterceptSchema})))}(i||(t.Network=i={})),t.ScriptEventSchema=r.default.lazy((()=>r.default.union([c.MessageSchema,c.RealmCreatedSchema,c.RealmDestroyedSchema]))),function(e){e.AuthRequiredParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({response:e.ResponseDataSchema}))))}(i||(t.Network=i={})),function(e){e.BeforeRequestSentParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({initiator:e.InitiatorSchema}))))}(i||(t.Network=i={})),function(e){e.FetchErrorParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({errorText:r.default.string()}))))}(i||(t.Network=i={})),function(e){e.ResponseCompletedParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({response:e.ResponseDataSchema}))))}(i||(t.Network=i={})),function(e){e.ResponseStartedParametersSchema=r.default.lazy((()=>e.BaseParametersSchema.and(r.default.object({response:e.ResponseDataSchema}))))}(i||(t.Network=i={})),t.ScriptCommandSchema=r.default.lazy((()=>r.default.union([c.AddPreloadScriptSchema,c.CallFunctionSchema,c.DisownSchema,c.EvaluateSchema,c.GetRealmsSchema,c.RemovePreloadScriptSchema]))),t.ScriptResultSchema=r.default.lazy((()=>r.default.union([c.AddPreloadScriptResultSchema,c.EvaluateResultSchema,c.GetRealmsResultSchema]))),function(e){e.AuthRequiredSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.authRequired"),params:e.AuthRequiredParametersSchema})))}(i||(t.Network=i={})),function(e){e.BeforeRequestSentSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.beforeRequestSent"),params:e.BeforeRequestSentParametersSchema})))}(i||(t.Network=i={})),function(e){e.FetchErrorSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.fetchError"),params:e.FetchErrorParametersSchema})))}(i||(t.Network=i={})),function(e){e.ResponseCompletedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.responseCompleted"),params:e.ResponseCompletedParametersSchema})))}(i||(t.Network=i={})),function(e){e.ResponseStartedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("network.responseStarted"),params:e.ResponseStartedParametersSchema})))}(i||(t.Network=i={})),function(e){e.ChannelSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.EvaluateResultSuccessSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("success"),result:e.RemoteValueSchema,realm:e.RealmSchema})))}(c||(t.Script=c={})),function(e){e.ExceptionDetailsSchema=r.default.lazy((()=>r.default.object({columnNumber:t.JsUintSchema,exception:e.RemoteValueSchema,lineNumber:t.JsUintSchema,stackTrace:e.StackTraceSchema,text:r.default.string()})))}(c||(t.Script=c={})),function(e){e.ChannelValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("channel"),value:e.ChannelPropertiesSchema})))}(c||(t.Script=c={})),function(e){e.ChannelPropertiesSchema=r.default.lazy((()=>r.default.object({channel:e.ChannelSchema,serializationOptions:e.SerializationOptionsSchema.optional(),ownership:e.ResultOwnershipSchema.optional()})))}(c||(t.Script=c={})),function(e){e.EvaluateResultSchema=r.default.lazy((()=>r.default.union([e.EvaluateResultSuccessSchema,e.EvaluateResultExceptionSchema])))}(c||(t.Script=c={})),function(e){e.EvaluateResultExceptionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("exception"),exceptionDetails:e.ExceptionDetailsSchema,realm:e.RealmSchema})))}(c||(t.Script=c={})),function(e){e.HandleSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.InternalIdSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.ListLocalValueSchema=r.default.lazy((()=>r.default.array(e.LocalValueSchema)))}(c||(t.Script=c={})),function(e){e.LocalValueSchema=r.default.lazy((()=>r.default.union([e.RemoteReferenceSchema,e.PrimitiveProtocolValueSchema,e.ChannelValueSchema,e.ArrayLocalValueSchema,e.DateLocalValueSchema,e.MapLocalValueSchema,e.ObjectLocalValueSchema,e.RegExpLocalValueSchema,e.SetLocalValueSchema])))}(c||(t.Script=c={})),function(e){e.ArrayLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("array"),value:e.ListLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.DateLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("date"),value:r.default.string()})))}(c||(t.Script=c={})),function(e){e.MappingLocalValueSchema=r.default.lazy((()=>r.default.array(r.default.tuple([r.default.union([e.LocalValueSchema,r.default.string()]),e.LocalValueSchema]))))}(c||(t.Script=c={})),function(e){e.MapLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("map"),value:e.MappingLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.ObjectLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("object"),value:e.MappingLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.RegExpValueSchema=r.default.lazy((()=>r.default.object({pattern:r.default.string(),flags:r.default.string().optional()})))}(c||(t.Script=c={})),function(e){e.RegExpLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("regexp"),value:e.RegExpValueSchema})))}(c||(t.Script=c={})),function(e){e.SetLocalValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("set"),value:e.ListLocalValueSchema})))}(c||(t.Script=c={})),function(e){e.PreloadScriptSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.RealmSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.PrimitiveProtocolValueSchema=r.default.lazy((()=>r.default.union([e.UndefinedValueSchema,e.NullValueSchema,e.StringValueSchema,e.NumberValueSchema,e.BooleanValueSchema,e.BigIntValueSchema])))}(c||(t.Script=c={})),function(e){e.UndefinedValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("undefined")})))}(c||(t.Script=c={})),function(e){e.NullValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("null")})))}(c||(t.Script=c={})),function(e){e.StringValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("string"),value:r.default.string()})))}(c||(t.Script=c={})),function(e){e.SpecialNumberSchema=r.default.lazy((()=>r.default.enum(["NaN","-0","Infinity","-Infinity"])))}(c||(t.Script=c={})),function(e){e.NumberValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("number"),value:r.default.union([r.default.number(),e.SpecialNumberSchema])})))}(c||(t.Script=c={})),function(e){e.BooleanValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("boolean"),value:r.default.boolean()})))}(c||(t.Script=c={})),function(e){e.BigIntValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("bigint"),value:r.default.string()})))}(c||(t.Script=c={})),function(e){e.RealmInfoSchema=r.default.lazy((()=>r.default.union([e.WindowRealmInfoSchema,e.DedicatedWorkerRealmInfoSchema,e.SharedWorkerRealmInfoSchema,e.ServiceWorkerRealmInfoSchema,e.WorkerRealmInfoSchema,e.PaintWorkletRealmInfoSchema,e.AudioWorkletRealmInfoSchema,e.WorkletRealmInfoSchema])))}(c||(t.Script=c={})),function(e){e.BaseRealmInfoSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema,origin:r.default.string()})))}(c||(t.Script=c={})),function(e){e.WindowRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("window"),context:o.BrowsingContextSchema,sandbox:r.default.string().optional()}))))}(c||(t.Script=c={})),function(e){e.DedicatedWorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("dedicated-worker"),owners:r.default.tuple([e.RealmSchema])}))))}(c||(t.Script=c={})),function(e){e.SharedWorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("shared-worker"),owners:r.default.array(e.RealmSchema)}))))}(c||(t.Script=c={})),function(e){e.ServiceWorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("service-worker"),owners:r.default.array(e.RealmSchema)}))))}(c||(t.Script=c={})),function(e){e.WorkerRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("worker")}))))}(c||(t.Script=c={})),function(e){e.PaintWorkletRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("paint-worklet")}))))}(c||(t.Script=c={})),function(e){e.AudioWorkletRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("audio-worklet")}))))}(c||(t.Script=c={})),function(e){e.WorkletRealmInfoSchema=r.default.lazy((()=>e.BaseRealmInfoSchema.and(r.default.object({type:r.default.literal("worklet")}))))}(c||(t.Script=c={})),function(e){e.RealmTypeSchema=r.default.lazy((()=>r.default.enum(["window","dedicated-worker","shared-worker","service-worker","worker","paint-worklet","audio-worklet","worklet"])))}(c||(t.Script=c={})),function(e){e.ListRemoteValueSchema=r.default.lazy((()=>r.default.array(e.RemoteValueSchema)))}(c||(t.Script=c={})),function(e){e.MappingRemoteValueSchema=r.default.lazy((()=>r.default.array(r.default.tuple([r.default.union([e.RemoteValueSchema,r.default.string()]),e.RemoteValueSchema]))))}(c||(t.Script=c={})),function(e){e.RemoteValueSchema=r.default.lazy((()=>r.default.union([e.PrimitiveProtocolValueSchema,e.SymbolRemoteValueSchema,e.ArrayRemoteValueSchema,e.ObjectRemoteValueSchema,e.FunctionRemoteValueSchema,e.RegExpRemoteValueSchema,e.DateRemoteValueSchema,e.MapRemoteValueSchema,e.SetRemoteValueSchema,e.WeakMapRemoteValueSchema,e.WeakSetRemoteValueSchema,e.IteratorRemoteValueSchema,e.GeneratorRemoteValueSchema,e.ErrorRemoteValueSchema,e.ProxyRemoteValueSchema,e.PromiseRemoteValueSchema,e.TypedArrayRemoteValueSchema,e.ArrayBufferRemoteValueSchema,e.NodeListRemoteValueSchema,e.HtmlCollectionRemoteValueSchema,e.NodeRemoteValueSchema,e.WindowProxyRemoteValueSchema])))}(c||(t.Script=c={})),function(e){e.RemoteReferenceSchema=r.default.lazy((()=>r.default.union([e.SharedReferenceSchema,e.RemoteObjectReferenceSchema])))}(c||(t.Script=c={})),function(e){e.SharedReferenceSchema=r.default.lazy((()=>r.default.object({sharedId:e.SharedIdSchema,handle:e.HandleSchema.optional()}).and(t.ExtensibleSchema)))}(c||(t.Script=c={})),function(e){e.RemoteObjectReferenceSchema=r.default.lazy((()=>r.default.object({handle:e.HandleSchema,sharedId:e.SharedIdSchema.optional()}).and(t.ExtensibleSchema)))}(c||(t.Script=c={})),function(e){e.SymbolRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("symbol"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ArrayRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("array"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ObjectRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("object"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.MappingRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.FunctionRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("function"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.RegExpRemoteValueSchema=r.default.lazy((()=>r.default.object({handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()}).and(e.RegExpLocalValueSchema)))}(c||(t.Script=c={})),function(e){e.DateRemoteValueSchema=r.default.lazy((()=>r.default.object({handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()}).and(e.DateLocalValueSchema)))}(c||(t.Script=c={})),function(e){e.MapRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("map"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.MappingRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.SetRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("set"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.WeakMapRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("weakmap"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.WeakSetRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("weakset"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.IteratorRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("iterator"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.GeneratorRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("generator"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ErrorRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("error"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ProxyRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("proxy"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.PromiseRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("promise"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.TypedArrayRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("typedarray"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.ArrayBufferRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("arraybuffer"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.NodeListRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("nodelist"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.HtmlCollectionRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("htmlcollection"),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.ListRemoteValueSchema.optional()})))}(c||(t.Script=c={})),function(e){e.NodeRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("node"),sharedId:e.SharedIdSchema.optional(),handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional(),value:e.NodePropertiesSchema.optional()})))}(c||(t.Script=c={})),function(e){e.NodePropertiesSchema=r.default.lazy((()=>r.default.object({nodeType:t.JsUintSchema,childNodeCount:t.JsUintSchema,attributes:r.default.record(r.default.string(),r.default.string()).optional(),children:r.default.array(e.NodeRemoteValueSchema).optional(),localName:r.default.string().optional(),mode:r.default.enum(["open","closed"]).optional(),namespaceURI:r.default.string().optional(),nodeValue:r.default.string().optional(),shadowRoot:r.default.union([e.NodeRemoteValueSchema,r.default.null()]).optional()})))}(c||(t.Script=c={})),function(e){e.WindowProxyRemoteValueSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("window"),value:e.WindowProxyPropertiesSchema,handle:e.HandleSchema.optional(),internalId:e.InternalIdSchema.optional()})))}(c||(t.Script=c={})),function(e){e.WindowProxyPropertiesSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema})))}(c||(t.Script=c={})),function(e){e.ResultOwnershipSchema=r.default.lazy((()=>r.default.enum(["root","none"])))}(c||(t.Script=c={})),function(e){e.SerializationOptionsSchema=r.default.lazy((()=>r.default.object({maxDomDepth:r.default.union([t.JsUintSchema,r.default.null()]).default(0).optional(),maxObjectDepth:r.default.union([t.JsUintSchema,r.default.null()]).default(null).optional(),includeShadowTree:r.default.enum(["none","open","all"]).default("none").optional()})))}(c||(t.Script=c={})),function(e){e.SharedIdSchema=r.default.lazy((()=>r.default.string()))}(c||(t.Script=c={})),function(e){e.StackFrameSchema=r.default.lazy((()=>r.default.object({columnNumber:t.JsUintSchema,functionName:r.default.string(),lineNumber:t.JsUintSchema,url:r.default.string()})))}(c||(t.Script=c={})),function(e){e.StackTraceSchema=r.default.lazy((()=>r.default.object({callFrames:r.default.array(e.StackFrameSchema)})))}(c||(t.Script=c={})),function(e){e.SourceSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema,context:o.BrowsingContextSchema.optional()})))}(c||(t.Script=c={})),function(e){e.RealmTargetSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema})))}(c||(t.Script=c={})),function(e){e.ContextTargetSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema,sandbox:r.default.string().optional()})))}(c||(t.Script=c={})),function(e){e.TargetSchema=r.default.lazy((()=>r.default.union([e.RealmTargetSchema,e.ContextTargetSchema])))}(c||(t.Script=c={})),function(e){e.AddPreloadScriptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.addPreloadScript"),params:e.AddPreloadScriptParametersSchema})))}(c||(t.Script=c={})),function(e){e.AddPreloadScriptParametersSchema=r.default.lazy((()=>r.default.object({functionDeclaration:r.default.string(),arguments:r.default.array(e.ChannelValueSchema).optional(),contexts:r.default.array(o.BrowsingContextSchema).optional(),sandbox:r.default.string().optional()})))}(c||(t.Script=c={})),function(e){e.AddPreloadScriptResultSchema=r.default.lazy((()=>r.default.object({script:e.PreloadScriptSchema})))}(c||(t.Script=c={})),function(e){e.DisownSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.disown"),params:e.DisownParametersSchema})))}(c||(t.Script=c={})),function(e){e.DisownParametersSchema=r.default.lazy((()=>r.default.object({handles:r.default.array(e.HandleSchema),target:e.TargetSchema})))}(c||(t.Script=c={})),function(e){e.CallFunctionParametersSchema=r.default.lazy((()=>r.default.object({functionDeclaration:r.default.string(),awaitPromise:r.default.boolean(),target:e.TargetSchema,arguments:r.default.array(e.LocalValueSchema).optional(),resultOwnership:e.ResultOwnershipSchema.optional(),serializationOptions:e.SerializationOptionsSchema.optional(),this:e.LocalValueSchema.optional(),userActivation:r.default.boolean().default(!1).optional()})))}(c||(t.Script=c={})),function(e){e.CallFunctionSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.callFunction"),params:e.CallFunctionParametersSchema})))}(c||(t.Script=c={})),function(e){e.EvaluateSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.evaluate"),params:e.EvaluateParametersSchema})))}(c||(t.Script=c={})),function(e){e.EvaluateParametersSchema=r.default.lazy((()=>r.default.object({expression:r.default.string(),target:e.TargetSchema,awaitPromise:r.default.boolean(),resultOwnership:e.ResultOwnershipSchema.optional(),serializationOptions:e.SerializationOptionsSchema.optional(),userActivation:r.default.boolean().default(!1).optional()})))}(c||(t.Script=c={})),function(e){e.GetRealmsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.getRealms"),params:e.GetRealmsParametersSchema})))}(c||(t.Script=c={})),function(e){e.GetRealmsParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema.optional(),type:e.RealmTypeSchema.optional()})))}(c||(t.Script=c={})),function(e){e.GetRealmsResultSchema=r.default.lazy((()=>r.default.object({realms:r.default.array(e.RealmInfoSchema)})))}(c||(t.Script=c={})),function(e){e.RemovePreloadScriptSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.removePreloadScript"),params:e.RemovePreloadScriptParametersSchema})))}(c||(t.Script=c={})),function(e){e.RemovePreloadScriptParametersSchema=r.default.lazy((()=>r.default.object({script:e.PreloadScriptSchema})))}(c||(t.Script=c={})),function(e){e.MessageParametersSchema=r.default.lazy((()=>r.default.object({channel:e.ChannelSchema,data:e.RemoteValueSchema,source:e.SourceSchema})))}(c||(t.Script=c={})),function(e){e.RealmCreatedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.realmCreated"),params:e.RealmInfoSchema})))}(c||(t.Script=c={})),function(e){e.MessageSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.message"),params:e.MessageParametersSchema})))}(c||(t.Script=c={})),function(e){e.RealmDestroyedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("script.realmDestroyed"),params:e.RealmDestroyedParametersSchema})))}(c||(t.Script=c={})),function(e){e.RealmDestroyedParametersSchema=r.default.lazy((()=>r.default.object({realm:e.RealmSchema})))}(c||(t.Script=c={})),t.StorageCommandSchema=r.default.lazy((()=>r.default.union([d.DeleteCookiesSchema,d.GetCookiesSchema,d.SetCookieSchema]))),t.StorageResultSchema=r.default.lazy((()=>r.default.union([d.DeleteCookiesResultSchema,d.GetCookiesResultSchema,d.SetCookieResultSchema]))),function(e){e.PartitionKeySchema=r.default.lazy((()=>r.default.object({userContext:r.default.string().optional(),sourceOrigin:r.default.string().optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.GetCookiesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("storage.getCookies"),params:e.GetCookiesParametersSchema})))}(d||(t.Storage=d={})),function(e){e.CookieFilterSchema=r.default.lazy((()=>r.default.object({name:r.default.string().optional(),value:i.BytesValueSchema.optional(),domain:r.default.string().optional(),path:r.default.string().optional(),size:t.JsUintSchema.optional(),httpOnly:r.default.boolean().optional(),secure:r.default.boolean().optional(),sameSite:i.SameSiteSchema.optional(),expiry:t.JsUintSchema.optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.BrowsingContextPartitionDescriptorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("context"),context:o.BrowsingContextSchema})))}(d||(t.Storage=d={})),function(e){e.StorageKeyPartitionDescriptorSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("storageKey"),userContext:r.default.string().optional(),sourceOrigin:r.default.string().optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.PartitionDescriptorSchema=r.default.lazy((()=>r.default.union([e.BrowsingContextPartitionDescriptorSchema,e.StorageKeyPartitionDescriptorSchema])))}(d||(t.Storage=d={})),function(e){e.GetCookiesParametersSchema=r.default.lazy((()=>r.default.object({filter:e.CookieFilterSchema.optional(),partition:e.PartitionDescriptorSchema.optional()})))}(d||(t.Storage=d={})),function(e){e.GetCookiesResultSchema=r.default.lazy((()=>r.default.object({cookies:r.default.array(i.CookieSchema),partitionKey:e.PartitionKeySchema})))}(d||(t.Storage=d={})),function(e){e.SetCookieSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("storage.setCookie"),params:e.SetCookieParametersSchema})))}(d||(t.Storage=d={})),function(e){e.PartialCookieSchema=r.default.lazy((()=>r.default.object({name:r.default.string(),value:i.BytesValueSchema,domain:r.default.string(),path:r.default.string().optional(),httpOnly:r.default.boolean().optional(),secure:r.default.boolean().optional(),sameSite:i.SameSiteSchema.optional(),expiry:t.JsUintSchema.optional()}).and(t.ExtensibleSchema)))}(d||(t.Storage=d={})),function(e){e.SetCookieParametersSchema=r.default.lazy((()=>r.default.object({cookie:e.PartialCookieSchema,partition:e.PartitionDescriptorSchema.optional()})))}(d||(t.Storage=d={})),function(e){e.SetCookieResultSchema=r.default.lazy((()=>r.default.object({partitionKey:e.PartitionKeySchema})))}(d||(t.Storage=d={})),function(e){e.DeleteCookiesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("storage.deleteCookies"),params:e.DeleteCookiesParametersSchema})))}(d||(t.Storage=d={})),function(e){e.DeleteCookiesParametersSchema=r.default.lazy((()=>r.default.object({filter:e.CookieFilterSchema.optional(),partition:e.PartitionDescriptorSchema.optional()})))}(d||(t.Storage=d={})),function(e){e.DeleteCookiesResultSchema=r.default.lazy((()=>r.default.object({partitionKey:e.PartitionKeySchema})))}(d||(t.Storage=d={})),t.LogEventSchema=r.default.lazy((()=>u.EntryAddedSchema)),function(e){e.LevelSchema=r.default.lazy((()=>r.default.enum(["debug","info","warn","error"])))}(u||(t.Log=u={})),function(e){e.EntrySchema=r.default.lazy((()=>r.default.union([e.GenericLogEntrySchema,e.ConsoleLogEntrySchema,e.JavascriptLogEntrySchema])))}(u||(t.Log=u={})),function(e){e.BaseLogEntrySchema=r.default.lazy((()=>r.default.object({level:e.LevelSchema,source:c.SourceSchema,text:r.default.union([r.default.string(),r.default.null()]),timestamp:t.JsUintSchema,stackTrace:c.StackTraceSchema.optional()})))}(u||(t.Log=u={})),function(e){e.GenericLogEntrySchema=r.default.lazy((()=>e.BaseLogEntrySchema.and(r.default.object({type:r.default.string()}))))}(u||(t.Log=u={})),function(e){e.ConsoleLogEntrySchema=r.default.lazy((()=>e.BaseLogEntrySchema.and(r.default.object({type:r.default.literal("console"),method:r.default.string(),args:r.default.array(c.RemoteValueSchema)}))))}(u||(t.Log=u={})),function(e){e.JavascriptLogEntrySchema=r.default.lazy((()=>e.BaseLogEntrySchema.and(r.default.object({type:r.default.literal("javascript")}))))}(u||(t.Log=u={})),function(e){e.EntryAddedSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("log.entryAdded"),params:e.EntrySchema})))}(u||(t.Log=u={})),t.InputCommandSchema=r.default.lazy((()=>r.default.union([l.PerformActionsSchema,l.ReleaseActionsSchema,l.SetFilesSchema]))),function(e){e.ElementOriginSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("element"),element:c.SharedReferenceSchema})))}(l||(t.Input=l={})),function(e){e.PerformActionsParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema,actions:r.default.array(e.SourceActionsSchema)})))}(l||(t.Input=l={})),function(e){e.NoneSourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("none"),id:r.default.string(),actions:r.default.array(e.NoneSourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.KeySourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("key"),id:r.default.string(),actions:r.default.array(e.KeySourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.PointerSourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointer"),id:r.default.string(),parameters:e.PointerParametersSchema.optional(),actions:r.default.array(e.PointerSourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.PerformActionsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("input.performActions"),params:e.PerformActionsParametersSchema})))}(l||(t.Input=l={})),function(e){e.SourceActionsSchema=r.default.lazy((()=>r.default.union([e.NoneSourceActionsSchema,e.KeySourceActionsSchema,e.PointerSourceActionsSchema,e.WheelSourceActionsSchema])))}(l||(t.Input=l={})),function(e){e.NoneSourceActionSchema=r.default.lazy((()=>e.PauseActionSchema))}(l||(t.Input=l={})),function(e){e.KeySourceActionSchema=r.default.lazy((()=>r.default.union([e.PauseActionSchema,e.KeyDownActionSchema,e.KeyUpActionSchema])))}(l||(t.Input=l={})),function(e){e.PointerTypeSchema=r.default.lazy((()=>r.default.enum(["mouse","pen","touch"])))}(l||(t.Input=l={})),function(e){e.PointerParametersSchema=r.default.lazy((()=>r.default.object({pointerType:e.PointerTypeSchema.default("mouse").optional()})))}(l||(t.Input=l={})),function(e){e.WheelSourceActionsSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("wheel"),id:r.default.string(),actions:r.default.array(e.WheelSourceActionSchema)})))}(l||(t.Input=l={})),function(e){e.PointerSourceActionSchema=r.default.lazy((()=>r.default.union([e.PauseActionSchema,e.PointerDownActionSchema,e.PointerUpActionSchema,e.PointerMoveActionSchema])))}(l||(t.Input=l={})),function(e){e.WheelSourceActionSchema=r.default.lazy((()=>r.default.union([e.PauseActionSchema,e.WheelScrollActionSchema])))}(l||(t.Input=l={})),function(e){e.PauseActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pause"),duration:t.JsUintSchema.optional()})))}(l||(t.Input=l={})),function(e){e.KeyDownActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("keyDown"),value:r.default.string()})))}(l||(t.Input=l={})),function(e){e.KeyUpActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("keyUp"),value:r.default.string()})))}(l||(t.Input=l={})),function(e){e.PointerUpActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointerUp"),button:t.JsUintSchema}).and(e.PointerCommonPropertiesSchema)))}(l||(t.Input=l={})),function(e){e.PointerDownActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointerDown"),button:t.JsUintSchema}).and(e.PointerCommonPropertiesSchema)))}(l||(t.Input=l={})),function(e){e.PointerMoveActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("pointerMove"),x:t.JsIntSchema,y:t.JsIntSchema,duration:t.JsUintSchema.optional(),origin:e.OriginSchema.optional()}).and(e.PointerCommonPropertiesSchema)))}(l||(t.Input=l={})),function(e){e.WheelScrollActionSchema=r.default.lazy((()=>r.default.object({type:r.default.literal("scroll"),x:t.JsIntSchema,y:t.JsIntSchema,deltaX:t.JsIntSchema,deltaY:t.JsIntSchema,duration:t.JsUintSchema.optional(),origin:e.OriginSchema.default("viewport").optional()})))}(l||(t.Input=l={})),function(e){e.PointerCommonPropertiesSchema=r.default.lazy((()=>r.default.object({width:t.JsUintSchema.default(1).optional(),height:t.JsUintSchema.default(1).optional(),pressure:r.default.number().default(0).optional(),tangentialPressure:r.default.number().default(0).optional(),twist:r.default.number().int().nonnegative().gte(0).lte(359).default(0).optional(),altitudeAngle:r.default.number().gte(0).lte(1.5707963267948966).default(0).optional(),azimuthAngle:r.default.number().gte(0).lte(6.283185307179586).default(0).optional()})))}(l||(t.Input=l={})),function(e){e.OriginSchema=r.default.lazy((()=>r.default.union([r.default.literal("viewport"),r.default.literal("pointer"),e.ElementOriginSchema])))}(l||(t.Input=l={})),function(e){e.ReleaseActionsSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("input.releaseActions"),params:e.ReleaseActionsParametersSchema})))}(l||(t.Input=l={})),function(e){e.ReleaseActionsParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema})))}(l||(t.Input=l={})),function(e){e.SetFilesSchema=r.default.lazy((()=>r.default.object({method:r.default.literal("input.setFiles"),params:e.SetFilesParametersSchema})))}(l||(t.Input=l={})),function(e){e.SetFilesParametersSchema=r.default.lazy((()=>r.default.object({context:o.BrowsingContextSchema,element:c.SharedReferenceSchema,files:r.default.array(r.default.string())})))}(l||(t.Input=l={}))}(Cn);var bn=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,n)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),xn=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Pn=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&bn(t,e,a);return xn(t,e),t};Object.defineProperty(Xr,"__esModule",{value:!0}),Xr.Permissions=Xr.Cdp=Xr.Storage=Xr.Input=Xr.Session=Xr.BrowsingContext=Xr.Script=Xr.Network=Xr.parseObject=void 0;const In=Yr,kn=g,Rn=Pn(yn),En=Pn(Cn);function _n(e,t){const a=t.safeParse(e);if(a.success)return a.data;const r=a.error.errors.map((e=>`${e.message} in ${e.path.map((e=>JSON.stringify(e))).join("/")}.`)).join(" ");throw new kn.InvalidArgumentException(r)}var Tn,Nn,jn,On,Mn,An,Bn,zn;Xr.parseObject=_n,function(e){e.parseAddInterceptParameters=function(e){return _n(e,En.Network.AddInterceptParametersSchema)},e.parseContinueRequestParameters=function(e){return _n(e,En.Network.ContinueRequestParametersSchema)},e.parseContinueResponseParameters=function(e){return _n(e,En.Network.ContinueResponseParametersSchema)},e.parseContinueWithAuthParameters=function(e){return _n(e,En.Network.ContinueWithAuthParametersSchema)},e.parseFailRequestParameters=function(e){return _n(e,En.Network.FailRequestParametersSchema)},e.parseProvideResponseParameters=function(e){return _n(e,En.Network.ProvideResponseParametersSchema)},e.parseRemoveInterceptParameters=function(e){return _n(e,En.Network.RemoveInterceptParametersSchema)}}(Tn||(Xr.Network=Tn={})),function(e){e.parseGetRealmsParams=function(e){return _n(e,En.Script.GetRealmsParametersSchema)},e.parseEvaluateParams=function(e){return _n(e,En.Script.EvaluateParametersSchema)},e.parseDisownParams=function(e){return _n(e,En.Script.DisownParametersSchema)},e.parseAddPreloadScriptParams=function(e){return _n(e,En.Script.AddPreloadScriptParametersSchema)},e.parseRemovePreloadScriptParams=function(e){return _n(e,En.Script.RemovePreloadScriptParametersSchema)},e.parseCallFunctionParams=function(e){return _n(e,En.Script.CallFunctionParametersSchema)}}(Nn||(Xr.Script=Nn={})),function(e){e.parseActivateParams=function(e){return _n(e,En.BrowsingContext.ActivateParametersSchema)},e.parseGetTreeParams=function(e){return _n(e,En.BrowsingContext.GetTreeParametersSchema)},e.parseNavigateParams=function(e){return _n(e,En.BrowsingContext.NavigateParametersSchema)},e.parseReloadParams=function(e){return _n(e,En.BrowsingContext.ReloadParametersSchema)},e.parseCreateParams=function(e){return _n(e,En.BrowsingContext.CreateParametersSchema)},e.parseCloseParams=function(e){return _n(e,En.BrowsingContext.CloseParametersSchema)},e.parseCaptureScreenshotParams=function(e){return _n(e,En.BrowsingContext.CaptureScreenshotParametersSchema)},e.parsePrintParams=function(e){return _n(e,En.BrowsingContext.PrintParametersSchema)},e.parseSetViewportParams=function(e){return _n(e,En.BrowsingContext.SetViewportParametersSchema)},e.parseTraverseHistoryParams=function(e){return _n(e,En.BrowsingContext.TraverseHistoryParametersSchema)},e.parseHandleUserPromptParameters=function(e){return _n(e,En.BrowsingContext.HandleUserPromptParametersSchema)}}(jn||(Xr.BrowsingContext=jn={})),function(e){e.parseSubscribeParams=function(e){return _n(e,En.Session.SubscriptionRequestSchema)}}(On||(Xr.Session=On={})),function(e){e.parsePerformActionsParams=function(e){return _n(e,En.Input.PerformActionsParametersSchema)},e.parseReleaseActionsParams=function(e){return _n(e,En.Input.ReleaseActionsParametersSchema)},e.parseSetFilesParams=function(e){return _n(e,En.Input.SetFilesParametersSchema)}}(Mn||(Xr.Input=Mn={})),function(e){e.parseGetCookiesParams=function(e){return _n(e,En.Storage.GetCookiesParametersSchema)},e.parseSetCookieParams=function(e){return _n(e,En.Storage.SetCookieParametersSchema)},e.parseDeleteCookiesParams=function(e){return _n(e,En.Storage.DeleteCookiesParametersSchema)}}(An||(Xr.Storage=An={})),function(e){const t=In.z.object({method:In.z.string(),params:In.z.object({}).passthrough().optional(),session:In.z.string().optional()}),a=In.z.object({context:En.BrowsingContext.BrowsingContextSchema});e.parseSendCommandRequest=function(e){return _n(e,t)},e.parseGetSessionRequest=function(e){return _n(e,a)}}(Bn||(Xr.Cdp=Bn={})),function(e){e.parseSetPermissionsParams=function(e){return _n(e,Rn.Permissions.SetPermissionParametersSchema)}}(zn||(Xr.Permissions=zn={}));var Dn=e&&e.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,n)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),Ln=e&&e.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),Un=e&&e.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&Dn(t,e,a);return Ln(t,e),t};Object.defineProperty(Gr,"__esModule",{value:!0}),Gr.BidiParser=void 0;const Zn=Un(Xr);Gr.BidiParser=class{parseActivateParams(e){return Zn.BrowsingContext.parseActivateParams(e)}parseCaptureScreenshotParams(e){return Zn.BrowsingContext.parseCaptureScreenshotParams(e)}parseCloseParams(e){return Zn.BrowsingContext.parseCloseParams(e)}parseCreateParams(e){return Zn.BrowsingContext.parseCreateParams(e)}parseGetTreeParams(e){return Zn.BrowsingContext.parseGetTreeParams(e)}parseHandleUserPromptParams(e){return Zn.BrowsingContext.parseHandleUserPromptParameters(e)}parseNavigateParams(e){return Zn.BrowsingContext.parseNavigateParams(e)}parsePrintParams(e){return Zn.BrowsingContext.parsePrintParams(e)}parseReloadParams(e){return Zn.BrowsingContext.parseReloadParams(e)}parseSetViewportParams(e){return Zn.BrowsingContext.parseSetViewportParams(e)}parseTraverseHistoryParams(e){return Zn.BrowsingContext.parseTraverseHistoryParams(e)}parseGetSessionParams(e){return Zn.Cdp.parseGetSessionRequest(e)}parseSendCommandParams(e){return Zn.Cdp.parseSendCommandRequest(e)}parsePerformActionsParams(e){return Zn.Input.parsePerformActionsParams(e)}parseReleaseActionsParams(e){return Zn.Input.parseReleaseActionsParams(e)}parseSetFilesParams(e){return Zn.Input.parseSetFilesParams(e)}parseAddInterceptParams(e){return Zn.Network.parseAddInterceptParameters(e)}parseContinueRequestParams(e){return Zn.Network.parseContinueRequestParameters(e)}parseContinueResponseParams(e){return Zn.Network.parseContinueResponseParameters(e)}parseContinueWithAuthParams(e){return Zn.Network.parseContinueWithAuthParameters(e)}parseFailRequestParams(e){return Zn.Network.parseFailRequestParameters(e)}parseProvideResponseParams(e){return Zn.Network.parseProvideResponseParameters(e)}parseRemoveInterceptParams(e){return Zn.Network.parseRemoveInterceptParameters(e)}parseSetPermissionsParams(e){return Zn.Permissions.parseSetPermissionsParams(e)}parseAddPreloadScriptParams(e){return Zn.Script.parseAddPreloadScriptParams(e)}parseCallFunctionParams(e){return Zn.Script.parseCallFunctionParams(e)}parseDisownParams(e){return Zn.Script.parseDisownParams(e)}parseEvaluateParams(e){return Zn.Script.parseEvaluateParams(e)}parseGetRealmsParams(e){return Zn.Script.parseGetRealmsParams(e)}parseRemovePreloadScriptParams(e){return Zn.Script.parseRemovePreloadScriptParams(e)}parseSubscribeParams(e){return Zn.Session.parseSubscribeParams(e)}parseDeleteCookiesParams(e){return Zn.Storage.parseDeleteCookiesParams(e)}parseGetCookiesParams(e){return Zn.Storage.parseGetCookiesParams(e)}parseSetCookieParams(e){return Zn.Storage.parseSetCookieParams(e)}};var Fn={};Object.defineProperty(Fn,"__esModule",{value:!0}),Fn.log=Fn.generatePage=void 0;const qn=l;function Vn(e){const t=e.split(":")[0],a=`${t}_log`,r=document.getElementById(a);if(r)return r;const n=document.getElementById("details"),s=document.createElement("div");s.className="divider",n.appendChild(s);const o=document.createElement("div");return o.className="item",o.innerHTML=`<h3>${t}</h3><div id="${a}" class="log"></div>`,n.appendChild(o),document.getElementById(a)}function $n(e){return"object"==typeof e?JSON.stringify(e,null,2):e}Fn.generatePage=function(){globalThis.document.documentElement&&(globalThis.document.documentElement.innerHTML='<!DOCTYPE html><title>BiDi-CDP Mapper</title><style>body{font-family: Roboto, serif; font-size: 13px; color: #202124;}.log{padding: 12px; font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace; font-size: 11px; line-height: 180%; background: #f1f3f4; border-radius: 4px;}.pre{overflow-wrap: break-word; padding: 10px;}.card{margin: 60px auto; padding: 2px 0; max-width: 900px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15), 0 1px 6px rgba(0, 0, 0, 0.2); border-radius: 8px;}.divider{height: 1px; background: #f0f0f0;}.item{padding: 16px 20px;}</style><div class="card"><div class="item"><h1>BiDi-CDP Mapper is controlling this tab</h1><p>Closing or reloading it will stop the BiDi process. <a target="_blank" title="BiDi-CDP Mapper GitHub Repository" href="https://github.com/GoogleChromeLabs/chromium-bidi">Details.</a></p></div><div class="divider"></div><details id="details"><summary class="item">Debug information</summary></details></div>',Vn(qn.LogType.debugInfo),Vn(qn.LogType.bidi),Vn(qn.LogType.cdp))},Fn.log=function(t,...a){if(!globalThis.document.documentElement)return;t.startsWith(qn.LogType.bidi)||e.window?.sendDebugMessage?.(JSON.stringify({logType:t,messages:a}));const r=Vn(t),n=document.createElement("div");n.className="pre",n.textContent=[t,...a].map($n).join(" "),r.appendChild(n)};var Kn={};Object.defineProperty(Kn,"__esModule",{value:!0}),Kn.WindowCdpTransport=Kn.WindowBidiTransport=void 0;const Wn=l,Hn=Fn;class Jn{static LOGGER_PREFIX_RECV=`${Wn.LogType.bidi}:RECV \u25c2`;static LOGGER_PREFIX_SEND=`${Wn.LogType.bidi}:SEND \u25b8`;#lr=null;constructor(){window.onBidiMessage=e=>{(0,Hn.log)(Jn.LOGGER_PREFIX_RECV,e);try{const t=Jn.#pr(e);this.#lr?.call(null,t)}catch(t){const a=t instanceof Error?t:new Error(t);this.#mr(e,"invalid argument",a,null)}}}setOnMessage(e){this.#lr=e}sendMessage(e){(0,Hn.log)(Jn.LOGGER_PREFIX_SEND,e);const t=JSON.stringify(e);window.sendBidiResponse(t)}close(){this.#lr=null,window.onBidiMessage=null}#mr(e,t,a,r){const n=Jn.#fr(e,t,a);r?this.sendMessage({...n,channel:r}):this.sendMessage(n)}static#gr(e){return null===e?"null":Array.isArray(e)?"array":typeof e}static#fr(e,t,a){let r;try{const t=JSON.parse(e);"object"===Jn.#gr(t)&&"id"in t&&(r=t.id)}catch{}return{type:"error",id:r,error:t,message:a.message}}static#pr(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Cannot parse data as JSON")}const a=Jn.#gr(t);if("object"!==a)throw new Error(`Expected JSON object but got ${a}`);const{id:r,method:n,params:s}=t,o=Jn.#gr(r);if("number"!==o||!Number.isInteger(r)||r<0)throw new Error(`Expected unsigned integer but got ${o}`);const i=Jn.#gr(n);if("string"!==i)throw new Error(`Expected string method but got ${i}`);const c=Jn.#gr(s);if("object"!==c)throw new Error(`Expected object params but got ${c}`);let d=t.channel;if(void 0!==d){const e=Jn.#gr(d);if("string"!==e)throw new Error(`Expected string channel but got ${e}`);""===d&&(d=void 0)}return{id:r,method:n,params:s,channel:d}}}Kn.WindowBidiTransport=Jn;Kn.WindowCdpTransport=class{#lr=null;constructor(){window.cdp.onmessage=e=>{this.#lr?.call(null,e)}}setOnMessage(e){this.#lr=e}sendMessage(e){window.cdp.send(e)}close(){this.#lr=null,window.cdp.onmessage=null}}, /** * Copyright 2021 Google LLC. * Copyright (c) Microsoft Corporation.
diff --git a/third_party/blink/common/storage_key/storage_key_mojom_traits_unittest.cc b/third_party/blink/common/storage_key/storage_key_mojom_traits_unittest.cc index ee9560c..60f3b62 100644 --- a/third_party/blink/common/storage_key/storage_key_mojom_traits_unittest.cc +++ b/third_party/blink/common/storage_key/storage_key_mojom_traits_unittest.cc
@@ -15,11 +15,12 @@ #include "url/gurl.h" #include "url/origin.h" +namespace blink { + namespace mojom { class StorageKey; } // namespace mojom -namespace blink { namespace { TEST(StorageKeyMojomTraitsTest, SerializeAndDeserialize) {
diff --git a/third_party/blink/common/storage_key/storage_key_unittest.cc b/third_party/blink/common/storage_key/storage_key_unittest.cc index b78596c..dc6c15e 100644 --- a/third_party/blink/common/storage_key/storage_key_unittest.cc +++ b/third_party/blink/common/storage_key/storage_key_unittest.cc
@@ -1344,7 +1344,7 @@ const raw_ref<const net::SchemefulSite> top_level_site; const raw_ref<const net::SchemefulSite> top_level_site_if_third_party_enabled; - // Excluded: can't wrap `absl::nullopt` in `raw_ref`. + // RAW_PTR_EXCLUSION: Can't wrap `absl::nullopt` in `raw_ref`. RAW_PTR_EXCLUSION const absl::optional<base::UnguessableToken>& nonce; AncestorChainBit ancestor_chain_bit; AncestorChainBit ancestor_chain_bit_if_third_party_enabled;
diff --git a/third_party/blink/common/switches.cc b/third_party/blink/common/switches.cc index 71c6ec94..63c471d 100644 --- a/third_party/blink/common/switches.cc +++ b/third_party/blink/common/switches.cc
@@ -87,6 +87,11 @@ const char kEnableGpuMemoryBufferCompositorResources[] = "enable-gpu-memory-buffer-compositor-resources"; +// Enables taking a heap snapshot and dumping it to file when using leak +// detection. +const char kEnableLeakDetectionHeapSnapshot[] = + "enable-leak-detection-heap-snapshot"; + // When using CPU rasterizing generate low resolution tiling. Low res // tiles may be displayed during fast scrolls especially on slower devices. const char kEnableLowResTiling[] = "enable-low-res-tiling";
diff --git a/third_party/blink/public/common/switches.h b/third_party/blink/public/common/switches.h index 26cba95a..0db2b7c 100644 --- a/third_party/blink/public/common/switches.h +++ b/third_party/blink/public/common/switches.h
@@ -39,6 +39,7 @@ BLINK_COMMON_EXPORT extern const char kDumpRuntimeCallStats[]; BLINK_COMMON_EXPORT extern const char kEnableGpuMemoryBufferCompositorResources[]; +BLINK_COMMON_EXPORT extern const char kEnableLeakDetectionHeapSnapshot[]; BLINK_COMMON_EXPORT extern const char kEnableLowResTiling[]; BLINK_COMMON_EXPORT extern const char kEnablePreferCompositingToLCDText[]; BLINK_COMMON_EXPORT extern const char kEnableRasterSideDarkModeForImages[];
diff --git a/third_party/blink/public/common/web_preferences/web_preferences.h b/third_party/blink/public/common/web_preferences/web_preferences.h index 48134e1d..c206966b 100644 --- a/third_party/blink/public/common/web_preferences/web_preferences.h +++ b/third_party/blink/public/common/web_preferences/web_preferences.h
@@ -21,8 +21,6 @@ namespace blink { -class WebView; - namespace web_pref { using blink::mojom::EffectiveConnectionType;
diff --git a/third_party/blink/public/mojom/mediastream/media_stream.mojom b/third_party/blink/public/mojom/mediastream/media_stream.mojom index c3c6b5da..2775041a 100644 --- a/third_party/blink/public/mojom/mediastream/media_stream.mojom +++ b/third_party/blink/public/mojom/mediastream/media_stream.mojom
@@ -73,6 +73,7 @@ KILL_SWITCH_ON, SYSTEM_PERMISSION_DENIED, DEVICE_IN_USE, + REQUEST_CANCELLED, NUM_MEDIA_REQUEST_RESULTS }; @@ -196,6 +197,9 @@ // Informs the renderer-side that the device's capture handle has changed. OnDeviceCaptureHandleChange(string label, MediaStreamDevice device); + // Informs the renderer-side that captured surface's the zoom-level has + // changed. + OnZoomLevelChange(string label, MediaStreamDevice device, int32 zoom_level); }; // Contains devices that are assigned to a specific stream. At least one of
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index 9fd7c49..07e535c 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4144,6 +4144,9 @@ kCapturedSurfaceControl = 4780, kElementGetHTML = 4781, kElementAttachSerializableShadow = 4782, + kCSSBareDeclarationShift = 4783, + kCSSNestedGroupRuleSpecificity = 4784, + kCSSRuleWithSignalingChildModified = 4785, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h index 52829e87..55c0d5a 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h
@@ -120,7 +120,6 @@ class MediaInspectorContext; class MainThread; class ThreadSafeBrowserInterfaceBrokerProxy; -class Thread; class URLLoaderThrottle; class UserMetricsAction; class WebAudioBus;
diff --git a/third_party/blink/public/platform/web_audio_bus.h b/third_party/blink/public/platform/web_audio_bus.h index 024b2f8..0f52d2b 100644 --- a/third_party/blink/public/platform/web_audio_bus.h +++ b/third_party/blink/public/platform/web_audio_bus.h
@@ -25,7 +25,7 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_AUDIO_BUS_H_ #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_AUDIO_BUS_H_ -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "third_party/blink/public/platform/web_common.h" #if INSIDE_BLINK @@ -75,9 +75,7 @@ WebAudioBus(const WebAudioBus&) = delete; void operator=(const WebAudioBus&) = delete; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION AudioBus* private_ = nullptr; + raw_ptr<AudioBus> private_ = nullptr; }; } // namespace blink
diff --git a/third_party/blink/public/strings/translations/blink_accessibility_strings_or.xtb b/third_party/blink/public/strings/translations/blink_accessibility_strings_or.xtb index f3bbc92..138a602 100644 --- a/third_party/blink/public/strings/translations/blink_accessibility_strings_or.xtb +++ b/third_party/blink/public/strings/translations/blink_accessibility_strings_or.xtb
@@ -5,7 +5,7 @@ <translation id="1193819188371549072">ସୂର୍ଯ୍ୟ ଆଇକନ, ଏହାର ଅର୍ଥ ଦିନବେଳାର ସମୟ ହୋଇପାରେ</translation> <translation id="1197443222693564123">ତିନୋଟି ଡଟ, ଏହାର ଅର୍ଥ ଅଧିକ ହୋଇପାରେ</translation> <translation id="1231311685714446044">ଦୁଃଖୀ ମୁହଁ ଆଇକନ</translation> -<translation id="1248712480115826517">ମାଗ୍ନିଫାଇଂ ଗ୍ଲାସ ଆଇକନ, ଏହାର ଅର୍ଥ ସନ୍ଧାନ କିମ୍ବା ଜୁମ କରିବା ହୋଇପାରେ</translation> +<translation id="1248712480115826517">ମାଗ୍ନିଫାଇଂ ଗ୍ଲାସ ଆଇକନ, ଏହାର ଅର୍ଥ ସର୍ଚ୍ଚ କିମ୍ବା ଜୁମ କରିବା ହୋଇପାରେ</translation> <translation id="1253694090376430115">ସପିଂ ବ୍ୟାଗ ଆଇକନ</translation> <translation id="1292759642840406299">କମ୍ପାସ ଆଇକନ</translation> <translation id="1301463715094321941">ଫୋନ ହ୍ୟାଣ୍ଡସେଟ ଆଇକନ, ଏହାର ଅର୍ଥ କଲ କରିବା ହୋଇପାରେ</translation>
diff --git a/third_party/blink/public/web/web_frame.h b/third_party/blink/public/web/web_frame.h index 3cd6816..5d94357 100644 --- a/third_party/blink/public/web/web_frame.h +++ b/third_party/blink/public/web/web_frame.h
@@ -44,7 +44,10 @@ namespace blink { +#if INSIDE_BLINK class Frame; +#endif + class WebLocalFrame; class WebRemoteFrame; class WebSecurityOrigin;
diff --git a/third_party/blink/public/web/web_range.h b/third_party/blink/public/web/web_range.h index 037e43a..1bddac06 100644 --- a/third_party/blink/public/web/web_range.h +++ b/third_party/blink/public/web/web_range.h
@@ -38,9 +38,10 @@ namespace blink { +#if INSIDE_BLINK class LocalFrame; +#endif class PlainTextRange; -class Range; class BLINK_EXPORT WebRange final { public:
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc index b1c041a6..afa4847 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
@@ -396,7 +396,13 @@ TEST_F(ScriptStreamingTest, ConsumeLocalCompileHints) { // If we notice before streaming that there is a compile hints cache, we use // it for eager compilation. - base::test::ScopedFeatureList flag_on(features::kLocalCompileHints); + + // Disable features::kProduceCompileHints2 forcefully, because local compile + // hints are not used when producing crowdsourced compile hints. + base::test::ScopedFeatureList features; + features.InitWithFeatureStates({{features::kLocalCompileHints, true}, + {features::kProduceCompileHints2, false}}); + V8TestingScope scope; CachedMetadataHandler* cache_handler = resource_->CacheHandler(); @@ -419,6 +425,11 @@ V8CodeCache::TagForCompileHints(cache_handler), cached_data->data, cached_data->length); + // Checks for debugging failures in this test. + EXPECT_TRUE(V8CodeCache::HasCompileHints( + cache_handler, CachedMetadataHandler::kAllowUnchecked)); + EXPECT_TRUE(V8CodeCache::HasHotTimestamp(cache_handler)); + AppendData("/*this doesn't matter*/"); Finish(); RunUntilResourceLoaded();
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h index 29d361a..c9d0030b 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h
@@ -63,7 +63,6 @@ class ExceptionState; class ExecutionContext; -class Frame; class LocalDOMWindow; class LocalFrame; class XPathNSResolver;
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h index 6269656..5b2b138 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_code_cache.h
@@ -24,15 +24,12 @@ namespace blink { class CachedMetadata; +class CodeCacheHost; class ClassicScript; class KURL; class ModuleRecordProduceCacheData; class ScriptState; -namespace mojom { -class CodeCacheHost; -} - class CORE_EXPORT V8CodeCache final { STATIC_ONLY(V8CodeCache);
diff --git a/third_party/blink/renderer/controller/blink_leak_detector.cc b/third_party/blink/renderer/controller/blink_leak_detector.cc index 18dd2309..fe2b08f 100644 --- a/third_party/blink/renderer/controller/blink_leak_detector.cc +++ b/third_party/blink/renderer/controller/blink_leak_detector.cc
@@ -4,8 +4,10 @@ #include "third_party/blink/renderer/controller/blink_leak_detector.h" +#include "base/command_line.h" #include "base/task/single_thread_task_runner.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" +#include "third_party/blink/public/common/switches.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h" @@ -134,6 +136,16 @@ } void BlinkLeakDetector::ReportResult() { + // Run with --enable-leak-detection-heap-snapshot (in addition to + // --enable-leak-detection) to dunp a heap snapshot to file named + // "leak_detection.heapsnapshot". This requires --no-sandbox, otherwise the + // write to the file is blocked. + const base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess(); + if (cmd.HasSwitch(switches::kEnableLeakDetectionHeapSnapshot)) { + ThreadState::Current()->TakeHeapSnapshotForTesting( + "leak_detection.heapsnapshot"); + } + mojom::blink::LeakDetectionResultPtr result = mojom::blink::LeakDetectionResult::New(); result->number_of_live_audio_nodes =
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni index f01cdf5..e3be82a 100644 --- a/third_party/blink/renderer/core/css/build.gni +++ b/third_party/blink/renderer/core/css/build.gni
@@ -768,6 +768,7 @@ "css_ratio_value_test.cc", "css_revert_layer_value_test.cc", "css_revert_value_test.cc", + "css_rule_test.cc", "css_selector_test.cc", "css_selector_watch_test.cc", "css_style_declaration_test.cc",
diff --git a/third_party/blink/renderer/core/css/css_grouping_rule.cc b/third_party/blink/renderer/core/css/css_grouping_rule.cc index 7cf9e278..853e0ab 100644 --- a/third_party/blink/renderer/core/css/css_grouping_rule.cc +++ b/third_party/blink/renderer/core/css/css_grouping_rule.cc
@@ -37,6 +37,7 @@ #include "third_party/blink/renderer/core/css/css_try_rule.h" #include "third_party/blink/renderer/core/css/parser/css_parser.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -168,6 +169,7 @@ CSSStyleSheet::RuleMutationScope mutation_scope(this); group_rule_->WrapperInsertRule(parentStyleSheet(), index, new_rule); child_rule_cssom_wrappers_.insert(index, Member<CSSRule>(nullptr)); + UseCountForSignalAffected(); return index; } } @@ -193,6 +195,7 @@ child_rule_cssom_wrappers_[index]->SetParentRule(nullptr); } child_rule_cssom_wrappers_.EraseAt(index); + UseCountForSignalAffected(); } // Returns true if this is a style rule whose selector is & {} and has no @@ -337,6 +340,12 @@ } } +void CSSGroupingRule::UseCountForSignalAffected() { + if (group_rule_->HasSignalingChildRule()) { + CountUse(WebFeature::kCSSRuleWithSignalingChildModified); + } +} + void CSSGroupingRule::Trace(Visitor* visitor) const { CSSRule::Trace(visitor); visitor->Trace(child_rule_cssom_wrappers_);
diff --git a/third_party/blink/renderer/core/css/css_grouping_rule.h b/third_party/blink/renderer/core/css/css_grouping_rule.h index d490c473..b0071ff 100644 --- a/third_party/blink/renderer/core/css/css_grouping_rule.h +++ b/third_party/blink/renderer/core/css/css_grouping_rule.h
@@ -65,6 +65,8 @@ unsigned length() const; CSSRule* Item(unsigned index) const; + void UseCountForSignalAffected() override; + void Trace(Visitor*) const override; protected:
diff --git a/third_party/blink/renderer/core/css/css_rule.h b/third_party/blink/renderer/core/css/css_rule.h index 2eedae5..bc041b58 100644 --- a/third_party/blink/renderer/core/css/css_rule.h +++ b/third_party/blink/renderer/core/css/css_rule.h
@@ -117,6 +117,8 @@ // The CSSOM spec states that "setting the cssText attribute must do nothing." void setCSSText(const String&) {} + virtual void UseCountForSignalAffected() {} + protected: explicit CSSRule(CSSStyleSheet* parent);
diff --git a/third_party/blink/renderer/core/css/css_rule_test.cc b/third_party/blink/renderer/core/css/css_rule_test.cc new file mode 100644 index 0000000..ba95dfde --- /dev/null +++ b/third_party/blink/renderer/core/css/css_rule_test.cc
@@ -0,0 +1,162 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/css/css_rule.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_css_style_sheet_init.h" +#include "third_party/blink/renderer/core/css/css_style_rule.h" +#include "third_party/blink/renderer/core/css/css_supports_rule.h" +#include "third_party/blink/renderer/core/css/css_test_helpers.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" +#include "third_party/blink/renderer/core/testing/page_test_base.h" + +namespace blink { + +class CSSRuleTest : public PageTestBase { + public: + bool IsUseCounted(WebFeature feature) { + return GetDocument().IsUseCounted(feature); + } + + void ClearUseCounter(WebFeature feature) { + GetDocument().ClearUseCounterForTesting(feature); + DCHECK(!IsUseCounted(feature)); + } + + StyleRule* MakeNonSignalingRule() { + return DynamicTo<StyleRule>( + css_test_helpers::ParseRule(GetDocument(), "body { color: green; }")); + } + + StyleRule* MakeSignalingRule() { + return css_test_helpers::MakeSignalingRule( + MakeNonSignalingRule(), CSSSelector::Signal::kBareDeclarationShift); + } +}; + +TEST_F(CSSRuleTest, NoUseCountSignalingChildModified_StyleRule) { + DummyExceptionStateForTesting exception_state; + auto* stylesheet = CSSStyleSheet::Create( + GetDocument(), CSSStyleSheetInit::Create(), exception_state); + StyleRule* style_rule = MakeNonSignalingRule(); + style_rule->AddChildRule(MakeNonSignalingRule()); + style_rule->AddChildRule(MakeNonSignalingRule()); + auto* css_style_rule = MakeGarbageCollected<CSSStyleRule>( + style_rule, stylesheet, /* position_hint */ 0); + + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_style_rule->insertRule(GetDocument().GetExecutionContext(), + "div { left: 10px; }", 0, exception_state); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_style_rule->deleteRule(0, exception_state); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); +} + +TEST_F(CSSRuleTest, UseCountSignalingChildModified_StyleRule) { + DummyExceptionStateForTesting exception_state; + auto* stylesheet = CSSStyleSheet::Create( + GetDocument(), CSSStyleSheetInit::Create(), exception_state); + StyleRule* style_rule = MakeNonSignalingRule(); + style_rule->AddChildRule(MakeNonSignalingRule()); + style_rule->AddChildRule(MakeSignalingRule()); + auto* css_style_rule = MakeGarbageCollected<CSSStyleRule>( + style_rule, stylesheet, /* position_hint */ 0); + + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_style_rule->insertRule(GetDocument().GetExecutionContext(), + "div { left: 10px; }", 0, exception_state); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + // This removes the signaling rule. This counts as a mutation that triggers + // the use-counter. + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_style_rule->deleteRule(css_style_rule->length() - 1, exception_state); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + // The use-counter should trigger if a signaling rule has ever been seen, + // even if it doesn't exist anymore. + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_style_rule->insertRule(GetDocument().GetExecutionContext(), + "div { left: 10px; }", 0, exception_state); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + // No count for mutations that don't affect child rules. + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_style_rule->setSelectorText(GetDocument().GetExecutionContext(), "p"); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); +} + +TEST_F(CSSRuleTest, NoUseCountSignalingChildModified_GroupingRule) { + DummyExceptionStateForTesting exception_state; + auto* stylesheet = CSSStyleSheet::Create( + GetDocument(), CSSStyleSheetInit::Create(), exception_state); + HeapVector<Member<StyleRuleBase>> child_rules; + child_rules.push_back(MakeNonSignalingRule()); + child_rules.push_back(MakeNonSignalingRule()); + auto* supports_rule = MakeGarbageCollected<StyleRuleSupports>( + "width:100px", + /* condition_is_supported */ true, std::move(child_rules)); + auto* css_supports_rule = + MakeGarbageCollected<CSSSupportsRule>(supports_rule, stylesheet); + + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_supports_rule->insertRule(GetDocument().GetExecutionContext(), + "div { left: 10px; }", 0, exception_state); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_supports_rule->deleteRule(0, exception_state); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); +} + +TEST_F(CSSRuleTest, UseCountSignalingChildModified_GroupingRule) { + DummyExceptionStateForTesting exception_state; + auto* stylesheet = CSSStyleSheet::Create( + GetDocument(), CSSStyleSheetInit::Create(), exception_state); + HeapVector<Member<StyleRuleBase>> child_rules; + child_rules.push_back(MakeNonSignalingRule()); + child_rules.push_back(MakeSignalingRule()); + auto* supports_rule = MakeGarbageCollected<StyleRuleSupports>( + "width:100px", + /* condition_is_supported */ true, std::move(child_rules)); + auto* css_supports_rule = + MakeGarbageCollected<CSSSupportsRule>(supports_rule, stylesheet); + + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_supports_rule->insertRule(GetDocument().GetExecutionContext(), + "div { left: 10px; }", 0, exception_state); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + // This removes the signaling rule. This counts as a mutation that triggers + // the use-counter. + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_supports_rule->deleteRule(css_supports_rule->length() - 1, + exception_state); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + // The use-counter should trigger if a signaling rule has ever been seen, + // even if it doesn't exist anymore. + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_supports_rule->insertRule(GetDocument().GetExecutionContext(), + "div { left: 10px; }", 0, exception_state); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); + + // No count for mutations that don't affect child rules. + ClearUseCounter(WebFeature::kCSSRuleWithSignalingChildModified); + css_supports_rule->SetConditionText(GetDocument().GetExecutionContext(), + "width:200px"); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSRuleWithSignalingChildModified)); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h index ca4d68b5..862d3dc 100644 --- a/third_party/blink/renderer/core/css/css_selector.h +++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -545,6 +545,43 @@ // position like :first-of-type and :nth-child(). bool IsChildIndexedSelector() const; + // Signaling Rules + // ================ + // + // Signaling rules are style rules whose declarations trigger + // a certain use-counter. The use-counter is triggered by StyleCascade + // when a signaling declaration satisfies all of the following: + // + // - The declaration is added to the cascade map. + // - Adding the declaration to the map actually changed the value, + // i.e. the cascaded value before/after isn't the same. + // - The declaration ultimately won the cascade, i.e. nothing else + // overwrote it. + // + // Note: the final goal of signaling rules is to hopefully unblock + // the following CSSWG issues: + // + // - https://github.com/w3c/csswg-drafts/issues/8738 + // - https://github.com/w3c/csswg-drafts/issues/9492 + // + // TODO(crbug.com/1517290): Remove signaling rules when we're done + // use-counting. + + enum class Signal { + kNone = 0, + + // WebFeature::kCSSBareDeclarationShift + kBareDeclarationShift = 1, + + // WebFeature::kCSSNestedGroupRuleSpecificity + kNestedGroupRuleSpecificity = 2, + + kMax = kNestedGroupRuleSpecificity, + }; + + void SetSignal(Signal signal) { signal_ = static_cast<unsigned>(signal); } + Signal GetSignal() const { return static_cast<Signal>(signal_); } + void Trace(Visitor* visitor) const; static String FormatPseudoTypeForDebugging(PseudoType); @@ -577,6 +614,7 @@ // This always starts out false, and is set when we bucket a given // RuleData (by calling MarkAsCoveredByBucketing()). unsigned is_covered_by_bucketing_ : 1; + unsigned signal_ : 2 = static_cast<unsigned>(Signal::kNone); void SetPseudoType(PseudoType pseudo_type) { pseudo_type_ = pseudo_type; @@ -786,6 +824,7 @@ is_for_page_(o.is_for_page_), is_implicitly_added_(o.is_implicitly_added_), is_covered_by_bucketing_(o.is_covered_by_bucketing_), + signal_(o.signal_), data_(DataUnion::kConstructUninitialized) { if (o.match_ == kTag) { new (&data_.tag_q_name_) QualifiedName(o.data_.tag_q_name_);
diff --git a/third_party/blink/renderer/core/css/css_style_rule.cc b/third_party/blink/renderer/core/css/css_style_rule.cc index c240105b..8821e857 100644 --- a/third_party/blink/renderer/core/css/css_style_rule.cc +++ b/third_party/blink/renderer/core/css/css_style_rule.cc
@@ -32,6 +32,7 @@ #include "third_party/blink/renderer/core/css/style_rule_css_style_declaration.h" #include "third_party/blink/renderer/core/css/style_sheet_contents.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -255,6 +256,7 @@ CSSStyleSheet::RuleMutationScope mutation_scope(this); style_rule_->WrapperInsertRule(index, new_rule); child_rule_cssom_wrappers_.insert(index, Member<CSSRule>(nullptr)); + UseCountForSignalAffected(); return index; } } @@ -280,6 +282,13 @@ child_rule_cssom_wrappers_[index]->SetParentRule(nullptr); } child_rule_cssom_wrappers_.EraseAt(index); + UseCountForSignalAffected(); +} + +void CSSStyleRule::UseCountForSignalAffected() { + if (style_rule_->HasSignalingChildRule()) { + CountUse(WebFeature::kCSSRuleWithSignalingChildModified); + } } } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_style_rule.h b/third_party/blink/renderer/core/css/css_style_rule.h index b8c8c973..f191bd0 100644 --- a/third_party/blink/renderer/core/css/css_style_rule.h +++ b/third_party/blink/renderer/core/css/css_style_rule.h
@@ -68,6 +68,8 @@ // FIXME: Not CSSOM. Remove. StyleRule* GetStyleRule() const { return style_rule_.Get(); } + void UseCountForSignalAffected() override; + void Trace(Visitor*) const override; private:
diff --git a/third_party/blink/renderer/core/css/css_supports_rule.h b/third_party/blink/renderer/core/css/css_supports_rule.h index 3a08cee..5d090e2 100644 --- a/third_party/blink/renderer/core/css/css_supports_rule.h +++ b/third_party/blink/renderer/core/css/css_supports_rule.h
@@ -29,6 +29,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SUPPORTS_RULE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SUPPORTS_RULE_H_ +#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_condition_rule.h" #include "third_party/blink/renderer/platform/wtf/casting.h" @@ -36,7 +37,8 @@ class StyleRuleSupports; -class CSSSupportsRule final : public CSSConditionRule { +// TODO(crbug.com/1517290): Remove CORE_EXPORT when we're done use-counting. +class CORE_EXPORT CSSSupportsRule final : public CSSConditionRule { DEFINE_WRAPPERTYPEINFO(); public:
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.cc b/third_party/blink/renderer/core/css/css_test_helpers.cc index 08f5891..ba99d8e 100644 --- a/third_party/blink/renderer/core/css/css_test_helpers.cc +++ b/third_party/blink/renderer/core/css/css_test_helpers.cc
@@ -242,5 +242,22 @@ return CSSSelectorList::AdoptSelectorVector(vector); } +StyleRule* MakeSignalingRule(StyleRule* style_rule, + CSSSelector::Signal signal) { + CHECK(style_rule); + HeapVector<CSSSelector> selectors; + const CSSSelector* selector = style_rule->FirstSelector(); + CHECK(selector); + while (true) { + selectors.push_back(*selector); + selectors.back().SetSignal(signal); + if (selector->IsLastInSelectorList()) { + break; + } + ++selector; + } + return StyleRule::Create(selectors, std::move(*style_rule)); +} + } // namespace css_test_helpers } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.h b/third_party/blink/renderer/core/css/css_test_helpers.h index 941124fa..58dbdcc 100644 --- a/third_party/blink/renderer/core/css/css_test_helpers.h +++ b/third_party/blink/renderer/core/css/css_test_helpers.h
@@ -7,6 +7,7 @@ #include "base/memory/scoped_refptr.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/core/css/css_selector.h" #include "third_party/blink/renderer/core/css/css_selector_list.h" #include "third_party/blink/renderer/core/css/rule_set.h" #include "third_party/blink/renderer/core/testing/null_execution_context.h" @@ -102,6 +103,9 @@ const StyleRule* parent_rule_for_nesting, bool is_within_scope); +// Make a copy of a style rule which carries the specified signal. +StyleRule* MakeSignalingRule(StyleRule*, CSSSelector::Signal); + } // namespace css_test_helpers } // namespace blink
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc index a96d5063..a3a10c4 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -1085,6 +1085,7 @@ AdjustLinkMatchType(inside_link_, rule_data->LinkMatchType()), .valid_property_filter = rule_data->GetValidPropertyFilter(matching_ua_rules_), + .signal = rule_data->Selector().GetSignal(), .layer_order = matched_rule.LayerOrder(), .is_inline_style = is_vtt_embedded_style}); }
diff --git a/third_party/blink/renderer/core/css/element_rule_collector_test.cc b/third_party/blink/renderer/core/css/element_rule_collector_test.cc index 3ef316f5..d9cc141 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector_test.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector_test.cc
@@ -25,6 +25,9 @@ namespace blink { +using css_test_helpers::MakeSignalingRule; +using css_test_helpers::ParseRule; + static RuleSet* RuleSetFromSingleRule(Document& document, const String& text) { auto* style_rule = DynamicTo<StyleRule>(css_test_helpers::ParseRule(document, text)); @@ -125,6 +128,22 @@ return collector.MatchedCSSRuleList(); } + + void CollectIntoMatchResult(Element* element, + RuleSet* rule_set, + MatchResult& result) { + ElementResolveContext context(*element); + SelectorFilter filter; + ElementRuleCollector collector(context, StyleRecalcContext(), filter, + result, InsideLink(element)); + + MatchRequest request(rule_set, {}); + + collector.CollectMatchingRules(request); + collector.SortAndTransferMatchedRules(CascadeOrigin::kAuthor, + /*is_vtt_embedded_style=*/false, + /*tracker=*/nullptr); + } }; TEST_F(ElementRuleCollectorTest, LinkMatchType) { @@ -555,4 +574,70 @@ EXPECT_EQ("& > .b", DynamicTo<CSSStyleRule>(bar_css_rule_1)->selectorText()); } +class ElementRuleCollectorSignalTest : public ElementRuleCollectorTest { + public: + void SetUp() override { + ElementRuleCollectorTest::SetUp(); + UpdateAllLifecyclePhasesForTest(); + body_ = GetDocument().body(); + ASSERT_TRUE(body_); + medium_ = + MakeGarbageCollected<MediaQueryEvaluator>(GetDocument().GetFrame()); + } + + Persistent<Element> body_; + Persistent<MediaQueryEvaluator> medium_; +}; + +TEST_F(ElementRuleCollectorSignalTest, NoSignal) { + RuleSet* rule_set = MakeGarbageCollected<RuleSet>(); + rule_set->AddStyleRule( + DynamicTo<StyleRule>(ParseRule(GetDocument(), "body { color: green; }")), + *medium_, kRuleHasNoSpecialState); + MatchResult result; + CollectIntoMatchResult(body_, rule_set, result); + ASSERT_EQ(1u, result.GetMatchedProperties().size()); + EXPECT_EQ(CSSSelector::Signal::kNone, + static_cast<CSSSelector::Signal>( + result.GetMatchedProperties()[0].types_.signal)); +} + +TEST_F(ElementRuleCollectorSignalTest, SignalAloneInMatchResult) { + RuleSet* rule_set = MakeGarbageCollected<RuleSet>(); + rule_set->AddStyleRule( + MakeSignalingRule(DynamicTo<StyleRule>( + ParseRule(GetDocument(), "body { color: green; }")), + CSSSelector::Signal::kBareDeclarationShift), + *medium_, kRuleHasNoSpecialState); + MatchResult result; + CollectIntoMatchResult(body_, rule_set, result); + ASSERT_EQ(1u, result.GetMatchedProperties().size()); + EXPECT_EQ(CSSSelector::Signal::kBareDeclarationShift, + static_cast<CSSSelector::Signal>( + result.GetMatchedProperties()[0].types_.signal)); +} + +// Like SignalAloneInMatchResult, but there's also a non-signaling rule +// in the MatchResult. +TEST_F(ElementRuleCollectorSignalTest, SignalInMatchResult) { + RuleSet* rule_set = MakeGarbageCollected<RuleSet>(); + rule_set->AddStyleRule( + DynamicTo<StyleRule>(ParseRule(GetDocument(), "body { width: 10px; }")), + *medium_, kRuleHasNoSpecialState); + rule_set->AddStyleRule( + MakeSignalingRule(DynamicTo<StyleRule>( + ParseRule(GetDocument(), "body { color: green; }")), + CSSSelector::Signal::kBareDeclarationShift), + *medium_, kRuleHasNoSpecialState); + MatchResult result; + CollectIntoMatchResult(body_, rule_set, result); + ASSERT_EQ(2u, result.GetMatchedProperties().size()); + EXPECT_EQ(CSSSelector::Signal::kNone, + static_cast<CSSSelector::Signal>( + result.GetMatchedProperties()[0].types_.signal)); + EXPECT_EQ(CSSSelector::Signal::kBareDeclarationShift, + static_cast<CSSSelector::Signal>( + result.GetMatchedProperties()[1].types_.signal)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index bb41b2d..5f96739a 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -6700,8 +6700,8 @@ // Consume the `spacing-trim` production. // https://drafts.csswg.org/css-text-4/#typedef-spacing-trim CSSValue* ConsumeSpacingTrim(CSSParserTokenRange& range) { - // Currently, only `space-first` and `space-all` are supported. - return ConsumeIdent<CSSValueID::kSpaceFirst, CSSValueID::kSpaceAll>(range); + return ConsumeIdent<CSSValueID::kTrimStart, CSSValueID::kSpaceAll, + CSSValueID::kSpaceFirst>(range); } CSSValue* ConsumeTransformValue(CSSParserTokenRange& range,
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc index c542f5f3..884c9cdf 100644 --- a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -3869,30 +3869,28 @@ // grammar, instead uses the `autospace` and `spacing-trim` productions. // https://drafts.csswg.org/css-text-4/#text-spacing-property // - // Try `normal | none` first. + // Try `none` first. if (const CSSIdentifierValue* ident = - css_parsing_utils::ConsumeIdent<CSSValueID::kNone, - CSSValueID::kNormal>(range); + css_parsing_utils::ConsumeIdent<CSSValueID::kNone>(range); ident && range.AtEnd()) { - switch (ident->GetValueID()) { - case CSSValueID::kNone: - autospace = CSSIdentifierValue::Create(CSSValueID::kNoAutospace); - spacing_trim = CSSIdentifierValue::Create(CSSValueID::kSpaceAll); - break; - case CSSValueID::kNormal: - autospace = CSSIdentifierValue::Create(CSSValueID::kNormal); - spacing_trim = CSSIdentifierValue::Create(CSSValueID::kSpaceFirst); - break; - default: - NOTREACHED_NORETURN(); - } + autospace = CSSIdentifierValue::Create(CSSValueID::kNoAutospace); + spacing_trim = CSSIdentifierValue::Create(CSSValueID::kSpaceAll); } // Try `<autospace> || <spacing-trim>`. if (!autospace) { range = original_range; + wtf_size_t num_values = 0; while (!range.AtEnd()) { + if (++num_values > 2) { + return false; + } + if (css_parsing_utils::ConsumeIdent<CSSValueID::kNormal>(range)) { + // `normal` can be either `text-autospace`, `text-spacing-trim`, or + // both. Keep parsing without setting the value. + continue; + } if (!autospace && (autospace = css_parsing_utils::ConsumeAutospace(range))) { continue; @@ -3903,14 +3901,15 @@ } return false; } - if (!autospace && !spacing_trim) { + + if (!num_values) { return false; } if (!autospace) { autospace = CSSIdentifierValue::Create(CSSValueID::kNormal); } if (!spacing_trim) { - spacing_trim = CSSIdentifierValue::Create(CSSValueID::kSpaceFirst); + spacing_trim = CSSIdentifierValue::Create(CSSValueID::kNormal); } } @@ -3957,8 +3956,8 @@ return autospace_value; } CSSValueList* list = CSSValueList::CreateSpaceSeparated(); - list->Append(*autospace_value); list->Append(*spacing_trim_value); + list->Append(*autospace_value); return list; }
diff --git a/third_party/blink/renderer/core/css/resolver/match_result.cc b/third_party/blink/renderer/core/css/resolver/match_result.cc index 8d45a0e4..075a1cbb 100644 --- a/third_party/blink/renderer/core/css/resolver/match_result.cc +++ b/third_party/blink/renderer/core/css/resolver/match_result.cc
@@ -59,6 +59,7 @@ new_properties.types_.valid_property_filter = static_cast<std::underlying_type_t<ValidPropertyFilter>>( options.valid_property_filter); + new_properties.types_.signal = static_cast<unsigned>(options.signal); new_properties.types_.layer_order = ClampTo<uint16_t>(options.layer_order); new_properties.types_.is_inline_style = options.is_inline_style; new_properties.types_.is_fallback_style = options.is_fallback_style;
diff --git a/third_party/blink/renderer/core/css/resolver/match_result.h b/third_party/blink/renderer/core/css/resolver/match_result.h index ff4144a..b0e3f19 100644 --- a/third_party/blink/renderer/core/css/resolver/match_result.h +++ b/third_party/blink/renderer/core/css/resolver/match_result.h
@@ -53,6 +53,7 @@ struct Data { unsigned link_match_type : 2; unsigned valid_property_filter : 3; + unsigned signal : 2; // CSSSelector::Signal CascadeOrigin origin; // This is approximately equivalent to the 'shadow-including tree order'. // It can be used to evaluate the 'Shadow Tree' criteria. Note that the @@ -86,6 +87,7 @@ public: unsigned link_match_type = CSSSelector::kMatchAll; ValidPropertyFilter valid_property_filter = ValidPropertyFilter::kNoFilter; + CSSSelector::Signal signal = CSSSelector::Signal::kNone; unsigned layer_order = CascadeLayerMap::kImplicitOuterLayerOrder; bool is_inline_style = false; bool is_fallback_style = false;
diff --git a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc index 2cf63697..90bb0f5 100644 --- a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc +++ b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
@@ -204,6 +204,9 @@ matched_properties_types[i].is_fallback_style) { return false; } + if (properties[i].types_.signal != matched_properties_types[i].signal) { + return false; + } } return true; }
diff --git a/third_party/blink/renderer/core/css/resolver/matched_properties_cache_test.cc b/third_party/blink/renderer/core/css/resolver/matched_properties_cache_test.cc index 7b93679..75beb309 100644 --- a/third_party/blink/renderer/core/css/resolver/matched_properties_cache_test.cc +++ b/third_party/blink/renderer/core/css/resolver/matched_properties_cache_test.cc
@@ -20,19 +20,23 @@ STACK_ALLOCATED(); public: - explicit MatchedPropertiesCacheTestKey(String block_text, - unsigned hash, - const TreeScope& tree_scope) - : key_(ParseBlock(block_text, tree_scope), hash) {} + explicit MatchedPropertiesCacheTestKey( + String block_text, + unsigned hash, + const TreeScope& tree_scope, + const AddMatchedPropertiesOptions& options = + AddMatchedPropertiesOptions()) + : key_(ParseBlock(block_text, tree_scope, options), hash) {} const MatchedPropertiesCache::Key& InnerKey() const { return key_; } private: const MatchResult& ParseBlock(String block_text, - const TreeScope& tree_scope) { + const TreeScope& tree_scope, + const AddMatchedPropertiesOptions& options) { auto* set = css_test_helpers::ParseDeclarationBlock(block_text); result_.BeginAddingAuthorRulesForTreeScope(tree_scope); - result_.AddMatchedProperties(set, CascadeOrigin::kAuthor); + result_.AddMatchedProperties(set, CascadeOrigin::kAuthor, options); return result_; } @@ -349,4 +353,23 @@ EXPECT_TRUE(cache.Find(key, style_b, *parent_b)); } +TEST_F(MatchedPropertiesCacheTest, Signaling) { + TestCache cache(GetDocument()); + + const ComputedStyle& parent_style = InitialStyle(); + const ComputedStyle& style = InitialStyle(); + + TestKey key_non_signaling("top:1px", /* hash */ 1, GetDocument(), + {.signal = CSSSelector::Signal::kNone}); + TestKey key_signaling("top:1px", /* hash */ 1, GetDocument(), + {.signal = CSSSelector::Signal::kBareDeclarationShift}); + + cache.Add(key_non_signaling, style, parent_style); + + // We must not find a non-signaling entry in the cache using a signaling key, + // because a cache hit in that situation skips the cascade, which prevents + // any actual use-counting from happening. + EXPECT_FALSE(cache.Find(key_signaling, style, parent_style)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc index f276ae77..6c4a2973 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc +++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -182,6 +182,7 @@ void StyleCascade::Apply(CascadeFilter filter) { AnalyzeIfNeeded(); + ProcessPendingSignals(); state_.UpdateLengthConversionData(); CascadeResolver resolver(filter, ++generation_); @@ -400,6 +401,14 @@ int index = 0; for (const MatchedProperties& properties : match_result_.GetMatchedProperties()) { + // We expect signals to be very rare, so to avoid the cost of checking + // against Signal::kNone for every *declaration*, we check once for + // every declaration *block* (i.e. rule), and then use a separate call to + // ExpandCascade (via ExpandSignals) to handle the signals. + if (Signal signal = static_cast<Signal>(properties.types_.signal); + signal != Signal::kNone) { + ExpandSignals(properties, index, signal); + } ExpandCascade( properties, GetDocument(), index++, [this](CascadePriority cascade_priority, @@ -1410,4 +1419,75 @@ } } +void StyleCascade::ExpandSignals(const MatchedProperties& properties, + int index, + Signal signal) { + ExpandCascade( + properties, GetDocument(), index, + [this, signal](CascadePriority cascade_priority, + const AtomicString& custom_property_name) { + MaybeAddPendingSignal(CSSPropertyName(custom_property_name), + cascade_priority, signal); + }, + [this, signal](CascadePriority cascade_priority, + CSSPropertyID property_id) { + if (kSurrogateProperties.Has(property_id)) { + const CSSProperty& property = + ResolveSurrogate(CSSProperty::Get(property_id)); + MaybeAddPendingSignal(property.GetCSSPropertyName(), cascade_priority, + signal); + } else { + MaybeAddPendingSignal(CSSPropertyName(property_id), cascade_priority, + signal); + } + }); +} + +void StyleCascade::MaybeAddPendingSignal(const CSSPropertyName& name, + CascadePriority priority, + Signal signal) { + CHECK_NE(signal, Signal::kNone); + + const CascadePriority* existing_priority = map_.Find(name); + + bool add_would_change_value = + !existing_priority || + (ValueAt(match_result_, existing_priority->GetPosition()) != + ValueAt(match_result_, priority.GetPosition())); + + // We only add a pending signal if the declaration actually makes + // a difference to the cascade. The pending signals then either get + // converted to actual use-counting during `ProcessPendingSignals` + // if they end up winning the cascade, or they just get ignored. + if (add_would_change_value) { + wtf_size_t index = static_cast<wtf_size_t>(signal) - 1; + CHECK_LT(index, static_cast<wtf_size_t>(Signal::kMax)); + pending_signals_[index].Set(name, priority); + } +} + +void StyleCascade::ProcessPendingSignals() { + static_assert(static_cast<int>(Signal::kBareDeclarationShift) == 1); + static_assert(static_cast<int>(Signal::kNestedGroupRuleSpecificity) == 2); + static_assert(static_cast<int>(Signal::kMax) == 2); + ProcessPendingSignals(WebFeature::kCSSBareDeclarationShift, + pending_signals_[0]); + pending_signals_[0].clear(); + ProcessPendingSignals(WebFeature::kCSSNestedGroupRuleSpecificity, + pending_signals_[1]); + pending_signals_[1].clear(); +} + +void StyleCascade::ProcessPendingSignals( + WebFeature feature, + const HashMap<CSSPropertyName, CascadePriority>& signals) { + for (const auto& [name, signal_priority] : signals) { + // Only trigger the use-counter if the signaling declaration + // won the cascade. + if (signal_priority == map_.At(name)) { + CountUse(feature); + } + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.h b/third_party/blink/renderer/core/css/resolver/style_cascade.h index b4f55a4..2dd5c35 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade.h +++ b/third_party/blink/renderer/core/css/resolver/style_cascade.h
@@ -66,6 +66,7 @@ STACK_ALLOCATED(); using CSSPendingSubstitutionValue = cssvalue::CSSPendingSubstitutionValue; + using Signal = CSSSelector::Signal; public: StyleCascade(StyleResolverState& state) : state_(state) {} @@ -435,6 +436,21 @@ void MaybeUseCountRevert(const CSSValue&); void MaybeUseCountSummaryDisplayBlock(); + // Expands the cascade for the incoming `MatchedProperties`, and adds + // pending signals (via `MaybeAddPendingSignal`) for the declarations + // that actually change the cascade map. + void ExpandSignals(const MatchedProperties&, int index, Signal); + void MaybeAddPendingSignal(const CSSPropertyName& name, + CascadePriority priority, + Signal signal); + + // Looks at pending signals produced by `ExpandSignals`, and either triggers + // a real use-count for the signals (if the signaling declaration ended up + // winning the cascade), or ignores them. + void ProcessPendingSignals(); + void ProcessPendingSignals(WebFeature, + const HashMap<CSSPropertyName, CascadePriority>&); + StyleResolverState& state_; MatchResult match_result_; CascadeInterpolations interpolations_; @@ -484,6 +500,10 @@ // computed value of the property affects how e.g. margin-inline-start // (and other css-logical properties) cascade. bool depends_on_cascade_affecting_property_ = false; + // Properties that had a signal (see CSSSelector::Signal) which changed + // the value of the cascade map. + HashMap<CSSPropertyName, CascadePriority> + pending_signals_[static_cast<wtf_size_t>(Signal::kMax)]; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc index b62e23a7..d12f97f31 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
@@ -86,6 +86,7 @@ struct AddOptions { CascadeOrigin origin = CascadeOrigin::kAuthor; unsigned link_match_type = CSSSelector::kMatchAll; + CSSSelector::Signal signal = CSSSelector::Signal::kNone; bool is_inline_style = false; bool is_fallback_style = false; }; @@ -136,6 +137,7 @@ cascade_.MutableMatchResult().AddMatchedProperties( set, options.origin, {.link_match_type = options.link_match_type, + .signal = options.signal, .is_inline_style = options.is_inline_style, .is_fallback_style = options.is_fallback_style}); } @@ -406,6 +408,15 @@ String name) { return CssText(map.at(PropertyName(name))); } + + bool IsUseCounted(mojom::WebFeature feature) { + return GetDocument().IsUseCounted(feature); + } + + void ClearUseCounter(mojom::WebFeature feature) { + GetDocument().ClearUseCounterForTesting(feature); + DCHECK(!IsUseCounted(feature)); + } }; TEST_F(StyleCascadeTest, ApplySingle) { @@ -3846,4 +3857,88 @@ EXPECT_EQ("0px", cascade.ComputedValue("--z")); } +TEST_F(StyleCascadeTest, SignalBareDeclarationShift_NoSignal) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green"); + cascade.Apply(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSBareDeclarationShift)); +} + +TEST_F(StyleCascadeTest, SignalBareDeclarationShift_Overwritten) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kBareDeclarationShift}); + cascade.Add("color:red"); // Overwrites signal. + cascade.Apply(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSBareDeclarationShift)); +} + +TEST_F(StyleCascadeTest, SignalBareDeclarationShift_NoChange) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green"); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kBareDeclarationShift}); + cascade.Apply(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSBareDeclarationShift)); +} + +TEST_F(StyleCascadeTest, SignalBareDeclarationShift_Uncontested) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kBareDeclarationShift}); + cascade.Apply(); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSBareDeclarationShift)); +} + +TEST_F(StyleCascadeTest, SignalBareDeclarationShift_Winning) { + TestCascade cascade(GetDocument()); + cascade.Add("color:red"); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kBareDeclarationShift}); + cascade.Apply(); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSBareDeclarationShift)); +} + +TEST_F(StyleCascadeTest, SignalNestedGroupRuleSpecificity_NoSignal) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green"); + cascade.Apply(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSNestedGroupRuleSpecificity)); +} + +TEST_F(StyleCascadeTest, SignalNestedGroupRuleSpecificity_Overwritten) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kNestedGroupRuleSpecificity}); + cascade.Add("color:red"); // Overwrites signal. + cascade.Apply(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSNestedGroupRuleSpecificity)); +} + +TEST_F(StyleCascadeTest, SignalNestedGroupRuleSpecificity_NoChange) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green"); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kNestedGroupRuleSpecificity}); + cascade.Apply(); + EXPECT_FALSE(IsUseCounted(WebFeature::kCSSNestedGroupRuleSpecificity)); +} + +TEST_F(StyleCascadeTest, SignalNestedGroupRuleSpecificity_Uncontested) { + TestCascade cascade(GetDocument()); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kNestedGroupRuleSpecificity}); + cascade.Apply(); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSNestedGroupRuleSpecificity)); +} + +TEST_F(StyleCascadeTest, SignalNestedGroupRuleSpecificity_Winning) { + TestCascade cascade(GetDocument()); + cascade.Add("color:red"); + cascade.Add("color:green", + {.signal = CSSSelector::Signal::kNestedGroupRuleSpecificity}); + cascade.Apply(); + EXPECT_TRUE(IsUseCounted(WebFeature::kCSSNestedGroupRuleSpecificity)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_property_serializer.cc b/third_party/blink/renderer/core/css/style_property_serializer.cc index 059280e..fd4bb16 100644 --- a/third_party/blink/renderer/core/css/style_property_serializer.cc +++ b/third_party/blink/renderer/core/css/style_property_serializer.cc
@@ -2349,7 +2349,7 @@ const CSSValueID autospace_id = autospace_value->GetValueID(); const CSSValueID spacing_trim_id = spacing_trim_value->GetValueID(); if (autospace_id == CSSValueID::kNormal && - spacing_trim_id == CSSValueID::kSpaceFirst) { + spacing_trim_id == CSSValueID::kNormal) { return getValueName(CSSValueID::kNormal); } if (autospace_id == CSSValueID::kNoAutospace && @@ -2359,14 +2359,14 @@ // Otherwise build a multi-value list. StringBuilder result; - if (autospace_id != CSSValueID::kNormal) { - result.Append(getValueName(autospace_id)); + if (spacing_trim_id != CSSValueID::kNormal) { + result.Append(getValueName(spacing_trim_id)); } - if (spacing_trim_id != CSSValueID::kSpaceFirst) { + if (autospace_id != CSSValueID::kNormal) { if (!result.empty()) { result.Append(kSpaceCharacter); } - result.Append(getValueName(spacing_trim_id)); + result.Append(getValueName(autospace_id)); } // When all longhands are initial values, it should be `normal`. DCHECK(!result.empty());
diff --git a/third_party/blink/renderer/core/css/style_rule.cc b/third_party/blink/renderer/core/css/style_rule.cc index be0a038e..ad4869e6 100644 --- a/third_party/blink/renderer/core/css/style_rule.cc +++ b/third_party/blink/renderer/core/css/style_rule.cc
@@ -67,6 +67,7 @@ struct SameSizeAsStyleRuleBase final : public GarbageCollected<SameSizeAsStyleRuleBase> { uint8_t field; + bool has_signal; }; ASSERT_SIZE(StyleRuleBase, SameSizeAsStyleRuleBase); @@ -81,6 +82,12 @@ return CreateCSSOMWrapper(position_hint, nullptr, parent_rule); } +bool StyleRuleBase::IsSignaling() const { + auto* style_rule = DynamicTo<StyleRule>(this); + return style_rule && (style_rule->FirstSelector()->GetSignal() != + CSSSelector::Signal::kNone); +} + void StyleRuleBase::Trace(Visitor* visitor) const { switch (GetType()) { case kCharset: @@ -453,6 +460,7 @@ child_rules_->push_back(child_rule->Copy()); } } + SetHasSignalingChildRule(other.HasSignalingChildRule()); } StyleRule::~StyleRule() { @@ -481,6 +489,14 @@ return properties_ && properties_->HasFailedOrCanceledSubresources(); } +void StyleRule::AddChildRule(StyleRuleBase* child) { + EnsureChildRules(); + child_rules_->push_back(child); + if (child->IsSignaling()) { + SetHasSignalingChildRule(true); + } +} + bool StyleRule::HasParsedProperties() const { // StyleRule should only have one of {lazy_property_parser_, properties_} set. DCHECK(lazy_property_parser_ || properties_); @@ -693,13 +709,20 @@ StyleRuleGroup::StyleRuleGroup(RuleType type, HeapVector<Member<StyleRuleBase>> rules) - : StyleRuleBase(type), child_rules_(std::move(rules)) {} + : StyleRuleBase(type), child_rules_(std::move(rules)) { + for (const StyleRuleBase* rule : child_rules_) { + if (rule->IsSignaling()) { + SetHasSignalingChildRule(true); + } + } +} StyleRuleGroup::StyleRuleGroup(const StyleRuleGroup& group_rule) : StyleRuleBase(group_rule), child_rules_(group_rule.child_rules_.size()) { for (unsigned i = 0; i < child_rules_.size(); ++i) { child_rules_[i] = group_rule.child_rules_[i]->Copy(); } + SetHasSignalingChildRule(group_rule.HasSignalingChildRule()); } void StyleRuleGroup::WrapperInsertRule(CSSStyleSheet* parent_sheet,
diff --git a/third_party/blink/renderer/core/css/style_rule.h b/third_party/blink/renderer/core/css/style_rule.h index 445eb17c..6b56fc0 100644 --- a/third_party/blink/renderer/core/css/style_rule.h +++ b/third_party/blink/renderer/core/css/style_rule.h
@@ -135,9 +135,21 @@ void TraceAfterDispatch(blink::Visitor* visitor) const {} void FinalizeGarbageCollectedObject(); + // See CSSSelector::Signal. + bool IsSignaling() const; + + bool HasSignalingChildRule() const { return has_signaling_child_rule_; } + protected: - explicit StyleRuleBase(RuleType type) : type_(type) {} - StyleRuleBase(const StyleRuleBase& rule) : type_(rule.type_) {} + explicit StyleRuleBase(RuleType type) + : type_(type), has_signaling_child_rule_(false) {} + StyleRuleBase(const StyleRuleBase& rule) + : type_(rule.type_), + has_signaling_child_rule_(rule.has_signaling_child_rule_) {} + + void SetHasSignalingChildRule(bool has_signaling_child_rule) { + has_signaling_child_rule_ = has_signaling_child_rule; + } private: CSSRule* CreateCSSOMWrapper(wtf_size_t position_hint, @@ -145,6 +157,8 @@ CSSRule* parent_rule) const; const uint8_t type_; + // See CSSSelector::Signal. + bool has_signaling_child_rule_; }; // A single rule from a stylesheet. Contains a selector list (one or more @@ -280,10 +294,7 @@ child_rules_ = MakeGarbageCollected<HeapVector<Member<StyleRuleBase>>>(); } } - void AddChildRule(StyleRuleBase* child) { - EnsureChildRules(); - child_rules_->push_back(child); - } + void AddChildRule(StyleRuleBase*); void WrapperInsertRule(unsigned index, StyleRuleBase* rule) { EnsureChildRules(); child_rules_->insert(index, rule); @@ -546,7 +557,7 @@ Member<const MediaQuerySet> media_queries_; }; -class StyleRuleSupports : public StyleRuleCondition { +class CORE_EXPORT StyleRuleSupports : public StyleRuleCondition { public: StyleRuleSupports(const String& condition_text, bool condition_is_supported,
diff --git a/third_party/blink/renderer/core/css/style_rule_test.cc b/third_party/blink/renderer/core/css/style_rule_test.cc index 31cfa91d7..b1952388 100644 --- a/third_party/blink/renderer/core/css/style_rule_test.cc +++ b/third_party/blink/renderer/core/css/style_rule_test.cc
@@ -14,6 +14,9 @@ namespace blink { +using css_test_helpers::MakeSignalingRule; +using css_test_helpers::ParseRule; + class StyleRuleTest : public PageTestBase {}; namespace { @@ -259,4 +262,50 @@ EXPECT_FALSE(scope_rule->GetStyleRuleScope().GetStyleScope().IsImplicit()); } +TEST_F(StyleRuleTest, HasSignalingChildRule_StyleRule) { + StyleRule* parent_rule = + DynamicTo<StyleRule>(ParseRule(GetDocument(), "body { width: 1px; }")); + StyleRule* signaling_rule = MakeSignalingRule( + DynamicTo<StyleRule>(ParseRule(GetDocument(), "div { color: red; }")), + CSSSelector::Signal::kBareDeclarationShift); + + EXPECT_FALSE(parent_rule->IsSignaling()); + EXPECT_TRUE(signaling_rule->IsSignaling()); + + EXPECT_FALSE(parent_rule->HasSignalingChildRule()); + EXPECT_FALSE(signaling_rule->HasSignalingChildRule()); + + parent_rule->AddChildRule(signaling_rule); + + EXPECT_TRUE(parent_rule->HasSignalingChildRule()); + EXPECT_TRUE(parent_rule->Copy()->HasSignalingChildRule()); + + EXPECT_FALSE(signaling_rule->HasSignalingChildRule()); + EXPECT_FALSE(signaling_rule->Copy()->HasSignalingChildRule()); +} + +TEST_F(StyleRuleTest, HasSignalingChildRule_GroupingRule_NoSignal) { + // Any subclass of StyleRuleGroup will do here, @supports is chosen + // since it's relatively easy to instantiate. + auto* supports_rule = MakeGarbageCollected<StyleRuleSupports>( + "width:100px", /* condition_is_supported */ true, + /* rules */ HeapVector<Member<StyleRuleBase>>()); + EXPECT_FALSE(supports_rule->IsSignaling()); + EXPECT_FALSE(supports_rule->HasSignalingChildRule()); + EXPECT_FALSE(supports_rule->Copy()->HasSignalingChildRule()); +} + +TEST_F(StyleRuleTest, HasSignalingChildRule_GroupingRule) { + HeapVector<Member<StyleRuleBase>> child_rules; + child_rules.push_back(ParseRule(GetDocument(), "div { color: green; }")); + child_rules.push_back(MakeSignalingRule( + DynamicTo<StyleRule>(ParseRule(GetDocument(), "div { color: red; }")), + CSSSelector::Signal::kBareDeclarationShift)); + auto* supports_rule = MakeGarbageCollected<StyleRuleSupports>( + "width:100px", /* condition_is_supported */ true, std::move(child_rules)); + EXPECT_FALSE(supports_rule->IsSignaling()); + EXPECT_TRUE(supports_rule->HasSignalingChildRule()); + EXPECT_TRUE(supports_rule->Copy()->HasSignalingChildRule()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/events/event_target_impl.h b/third_party/blink/renderer/core/dom/events/event_target_impl.h index 48e3214..c825a4cb 100644 --- a/third_party/blink/renderer/core/dom/events/event_target_impl.h +++ b/third_party/blink/renderer/core/dom/events/event_target_impl.h
@@ -10,10 +10,10 @@ #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" -class ScriptState; - namespace blink { +class ScriptState; + // Constructible version of EventTarget. Calls to EventTarget // constructor in JavaScript will return an instance of this class. // We don't use EventTarget directly because EventTarget is an abstract
diff --git a/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc b/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc index 6e1c87b5..1c5ffbd 100644 --- a/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc +++ b/third_party/blink/renderer/core/frame/csp/source_list_directive_test.cc
@@ -523,7 +523,7 @@ // Dots. {"a.b.c", true}, - {"a.b.", false}, + {"a.b.", true}, {".b.c", false}, {"a..c", false},
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h index 3ddb037..901e211b 100644 --- a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h +++ b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
@@ -21,7 +21,6 @@ class HTMLAnchorElement; class IntersectionObserver; class IntersectionObserverEntry; -class AnchorElementMetrics; class PointerEvent; // AnchorElementMetricsSender is responsible to send anchor element metrics to
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_agent.h b/third_party/blink/renderer/core/inspector/inspector_audits_agent.h index 569fb14..892f854 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_audits_agent.h
@@ -12,9 +12,14 @@ #include "third_party/blink/renderer/core/inspector/inspector_contrast.h" #include "third_party/blink/renderer/core/inspector/protocol/audits.h" +namespace protocol { +namespace Audits { +class InspectorIssue; +} // namespace Audits +} // namespace protocol + namespace blink { -class InspectorIssue; class InspectorIssueStorage; class WebAutofillClient;
diff --git a/third_party/blink/renderer/core/speculation_rules/stub_speculation_host.h b/third_party/blink/renderer/core/speculation_rules/stub_speculation_host.h index f24fe16..b11a16b 100644 --- a/third_party/blink/renderer/core/speculation_rules/stub_speculation_host.h +++ b/third_party/blink/renderer/core/speculation_rules/stub_speculation_host.h
@@ -11,10 +11,10 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SPECULATION_RULES_STUB_SPECULATION_HOST_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_SPECULATION_RULES_STUB_SPECULATION_HOST_H_ -class KURL; - namespace blink { +class KURL; + class StubSpeculationHost : public mojom::blink::SpeculationHost { public: using Candidates = Vector<mojom::blink::SpeculationCandidatePtr>;
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index ba26e87d..0581156 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -91,7 +91,6 @@ class ContentData; class CounterDirectives; class CSSAnimationData; -class FloodColor; class CSSTransitionData; class CSSVariableData; class Font;
diff --git a/third_party/blink/renderer/core/timing/performance_observer_test.cc b/third_party/blink/renderer/core/timing/performance_observer_test.cc index 281aa49..d08e05c 100644 --- a/third_party/blink/renderer/core/timing/performance_observer_test.cc +++ b/third_party/blink/renderer/core/timing/performance_observer_test.cc
@@ -166,77 +166,4 @@ EXPECT_FALSE(observer_->GetExecutionContext()); observer_->observe(script_state, options, exception_state); } - -// Origin trial integration tests for Long Animation Frames -TEST_F(PerformanceObserverTest, ObserveLoAFWithoutOriginTrial) { - ScopedLongAnimationFrameTimingForTest rtef_scope(false); - V8TestingScope scope; - Initialize(scope.GetScriptState()); - - NonThrowableExceptionState exception_state; - PerformanceObserverInit* options = PerformanceObserverInit::Create(); - Vector<String> entry_type_vec; - entry_type_vec.push_back("long-animation-frame"); - options->setEntryTypes(entry_type_vec); - - observer_->observe(scope.GetScriptState(), options, exception_state); - EXPECT_FALSE(IsRegistered()); -} - -TEST_F(PerformanceObserverTest, ObserveLoAFWithOriginTrial) { - ScopedLongAnimationFrameTimingForTest rtef_scope(false); - ScopedTestOriginTrialPolicy origin_trial_policy; - V8TestingScope scope(KURL("http://127.0.0.1:8000/")); - Initialize(scope.GetScriptState()); - - // Generate token with the command: - // tools/origin_trials/generate_token.py http://127.0.0.1:8000 \ - // LongAnimationFrameTiming --expire-timestamp=2000000000 - scope.GetExecutionContext()->GetOriginTrialContext()->AddToken( - "A552VLYxq9h4IFXr7EdTlq4df/" - "Y0SUK6Fc8hicuJYKiTa7uuxb9h8cfpgBocxjo45VzW4HHZQwxad6rSmL19CgQAAABgeyJvcm" - "lnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiTG9uZ0FuaW1hdG" - "lvbkZyYW1lVGltaW5nIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9"); - - NonThrowableExceptionState exception_state; - PerformanceObserverInit* options = PerformanceObserverInit::Create(); - Vector<String> entry_type_vec; - entry_type_vec.push_back("long-animation-frame"); - options->setEntryTypes(entry_type_vec); - - observer_->observe(scope.GetScriptState(), options, exception_state); - EXPECT_TRUE(IsRegistered()); -} - -TEST_F(PerformanceObserverTest, ObserveLoAFWithThirdPartyOriginTrial) { - ScopedLongAnimationFrameTimingForTest rtef_scope(false); - ScopedTestOriginTrialPolicy origin_trial_policy; - V8TestingScope scope(KURL("http://127.0.0.1:8000/")); - Initialize(scope.GetScriptState()); - - // Generate token with the command: - // tools/origin_trials/generate_token.py http://127.0.0.1:8001 \ - // LongAnimationFrameTiming --expire-timestamp=2000000000 --is-third-party - scoped_refptr<SecurityOrigin> third_party_origin = - SecurityOrigin::Create(KURL("http://127.0.0.1:8001")); - scope.GetExecutionContext() - ->GetOriginTrialContext() - ->AddTokenFromExternalScript( - "A/HCdSqPWTUezQlvIpOXlq0Asl62Zy3BI6sZwOzhNciuy/" - "Q3ZsoWIFrJPh3nl4etnZydDeruU50G1m7nL20C+" - "AsAAAB2eyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAxIiwgImZlYXR1cmUiO" - "iAiTG9uZ0FuaW1hdGlvbkZyYW1lVGltaW5nIiwgImV4cGlyeSI6IDIwMDAwMDAwMDAsI" - "CJpc1RoaXJkUGFydHkiOiB0cnVlfQ==", - {third_party_origin}); - - NonThrowableExceptionState exception_state; - PerformanceObserverInit* options = PerformanceObserverInit::Create(); - Vector<String> entry_type_vec; - entry_type_vec.push_back("long-animation-frame"); - options->setEntryTypes(entry_type_vec); - - observer_->observe(scope.GetScriptState(), options, exception_state); - EXPECT_TRUE(IsRegistered()); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h index 99b7344..1b3a165 100644 --- a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h +++ b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h
@@ -15,9 +15,12 @@ #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +namespace net { +class CanonicalCookie; +} // namespace net + namespace blink { -class CanonicalCookie; class CookieChangeEventInit; class CookieChangeEvent final : public Event {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h b/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h index 381f086c..47bf00e4 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h
@@ -23,7 +23,6 @@ namespace blink { -class Blob; class BlobDataHandle; class ExceptionState; class IDBValue;
diff --git a/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc index e076dea..52e2a2b 100644 --- a/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc +++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc
@@ -63,22 +63,6 @@ namespace { -enum GetOutputDeviceInfoCacheUtilization { - // No cached sink found. - SINK_CACHE_MISS_NO_SINK = 0, - - // If session id is used to specify a device, we always have to create and - // cache a new sink. - // DEPRECATED: Do not edit, to preserve UMAs. - // SINK_CACHE_MISS_CANNOT_LOOKUP_BY_SESSION_ID = 1, - - // Output parmeters for an already-cached sink are requested. - SINK_CACHE_HIT = 2, - - // For UMA. - SINK_CACHE_LAST_ENTRY -}; - bool SinkIsHealthy(media::AudioRendererSink* sink) { return sink->GetOutputDeviceInfo().device_status() == media::OUTPUT_DEVICE_STATUS_OK; @@ -135,9 +119,6 @@ auto* cache_iter = FindCacheEntry_Locked(source_frame_token, device_id); if (cache_iter != cache_.end()) { // A matching cached sink is found. - UMA_HISTOGRAM_ENUMERATION( - "Media.Audio.Render.SinkCache.GetOutputDeviceInfoCacheUtilization", - SINK_CACHE_HIT, SINK_CACHE_LAST_ENTRY); TRACE_EVENT_END1("audio", "AudioRendererSinkCache::GetSinkInfo", "result", "Cache hit"); return cache_iter->sink->GetOutputDeviceInfo(); @@ -150,10 +131,6 @@ MaybeCacheSink(source_frame_token, device_id, sink); - UMA_HISTOGRAM_ENUMERATION( - "Media.Audio.Render.SinkCache.GetOutputDeviceInfoCacheUtilization", - SINK_CACHE_MISS_NO_SINK, SINK_CACHE_LAST_ENTRY); - TRACE_EVENT_END1("audio", "AudioRendererSinkCache::GetSinkInfo", "result", "Cache miss"); // |sink| is ref-counted, so it's ok if it is removed from cache before we
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc index c92fb08..16678c84 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc
@@ -224,6 +224,17 @@ } } +void MediaStreamDeviceObserver::OnZoomLevelChange( + const String& label, + const MediaStreamDevice& device, + int zoom_level) { + DVLOG(1) << __func__ << " label=" << label << " device_id=" << device.id; + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + CHECK_GT(zoom_level, 0); + + // TODO(crbug.com/1466247): Implement +} + void MediaStreamDeviceObserver::BindMediaStreamDeviceObserverReceiver( mojo::PendingReceiver<mojom::blink::MediaStreamDeviceObserver> receiver) { receiver_.reset();
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h index a97e392..571473b 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h +++ b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h
@@ -112,6 +112,9 @@ const MediaStreamDevice& device) override; void OnDeviceCaptureHandleChange(const String& label, const MediaStreamDevice& device) override; + void OnZoomLevelChange(const String& label, + const MediaStreamDevice& device, + int zoom_level) override; void BindMediaStreamDeviceObserverReceiver( mojo::PendingReceiver<mojom::blink::MediaStreamDeviceObserver> receiver);
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc index 2c77f5af..339303f6 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -109,6 +109,8 @@ return "SYSTEM_PERMISSION_DENIED"; case MediaStreamRequestResult::DEVICE_IN_USE: return "DEVICE_IN_USE"; + case MediaStreamRequestResult::REQUEST_CANCELLED: + return "REQUEST_CANCELLED"; case MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS: return "NUM_MEDIA_REQUEST_RESULTS"; default: @@ -294,6 +296,8 @@ return "Permission denied by system"; case MediaStreamRequestResult::DEVICE_IN_USE: return "Device in use"; + case MediaStreamRequestResult::REQUEST_CANCELLED: + return "Request was cancelled"; default: NOTREACHED(); return ""; @@ -1061,6 +1065,8 @@ SendLogMessage(base::StringPrintf( "OnStreamsGenerated([request_id=%d]) => (ERROR: invalid request ID)", request_id)); + blink::LogUserMediaRequestResult( + MediaStreamRequestResult::REQUEST_CANCELLED); for (const mojom::blink::StreamDevicesPtr& stream_devices : stream_devices_set->stream_devices) { OnStreamGeneratedForCancelledRequest(*stream_devices);
diff --git a/third_party/blink/renderer/modules/webaudio/script_processor_handler.h b/third_party/blink/renderer/modules/webaudio/script_processor_handler.h index 7b3ffbad0..737b29a 100644 --- a/third_party/blink/renderer/modules/webaudio/script_processor_handler.h +++ b/third_party/blink/renderer/modules/webaudio/script_processor_handler.h
@@ -19,6 +19,7 @@ namespace base { class SingleThreadTaskRunner; +class WaitableEvent; } namespace blink { @@ -26,7 +27,6 @@ class AudioBuffer; class BaseAudioContext; class SharedAudioBuffer; -class WaitableEvent; class ScriptProcessorHandler final : public AudioHandler,
diff --git a/third_party/blink/renderer/modules/webaudio/script_processor_node.h b/third_party/blink/renderer/modules/webaudio/script_processor_node.h index ace32bf..64b6c66 100644 --- a/third_party/blink/renderer/modules/webaudio/script_processor_node.h +++ b/third_party/blink/renderer/modules/webaudio/script_processor_node.h
@@ -48,7 +48,6 @@ class AudioBuffer; class BaseAudioContext; class SharedAudioBuffer; -class WaitableEvent; // ScriptProcessorNode is an AudioNode which allows for arbitrary synthesis or // processing directly using JavaScript. The API allows for a variable number
diff --git a/third_party/blink/renderer/modules/websockets/websocket_message_chunk_accumulator.h b/third_party/blink/renderer/modules/websockets/websocket_message_chunk_accumulator.h index cd21899..e06110987 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_message_chunk_accumulator.h +++ b/third_party/blink/renderer/modules/websockets/websocket_message_chunk_accumulator.h
@@ -17,13 +17,12 @@ #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h" namespace base { +class SingleThreadTaskRunner; class TickClock; } namespace blink { -class SingleThreadTaskRunner; - // WebSocketMessageChunkAccumulator stores chunks for one WebSocket message. A // user can call Append() to append bytes, and call GetView() to get a list of // base::spans of data previously stored.
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 3bf0369..2c8c4864 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -2261,6 +2261,7 @@ sources += [ "text/locale_win_test.cc" ] } else if (is_mac) { sources += [ + "fonts/mac/font_cache_mac_test.mm", "fonts/mac/font_matcher_mac_test.mm", "fonts/mac/font_platform_data_mac_test.mm", "fonts/opentype/open_type_caps_support_test.mm",
diff --git a/third_party/blink/renderer/platform/audio/hrtf_database_loader.h b/third_party/blink/renderer/platform/audio/hrtf_database_loader.h index aef7b87..36d59a3 100644 --- a/third_party/blink/renderer/platform/audio/hrtf_database_loader.h +++ b/third_party/blink/renderer/platform/audio/hrtf_database_loader.h
@@ -40,9 +40,11 @@ #include "third_party/blink/renderer/platform/wtf/ref_counted.h" #include "third_party/blink/renderer/platform/wtf/threading_primitives.h" -namespace blink { - +namespace base { class WaitableEvent; +} // namespace base + +namespace blink { // HRTFDatabaseLoader will asynchronously load the default HRTFDatabase in a new // thread.
diff --git a/third_party/blink/renderer/platform/exported/web_audio_bus.cc b/third_party/blink/renderer/platform/exported/web_audio_bus.cc index 1cae0121..c62ef4c5 100644 --- a/third_party/blink/renderer/platform/exported/web_audio_bus.cc +++ b/third_party/blink/renderer/platform/exported/web_audio_bus.cc
@@ -84,7 +84,7 @@ } scoped_refptr<AudioBus> WebAudioBus::Release() { - scoped_refptr<AudioBus> audio_bus(private_); + scoped_refptr<AudioBus> audio_bus(private_.get()); private_->Release(); private_ = nullptr; return audio_bus;
diff --git a/third_party/blink/renderer/platform/fonts/font_cache.h b/third_party/blink/renderer/platform/fonts/font_cache.h index 4ebace59..2ae70d6 100644 --- a/third_party/blink/renderer/platform/fonts/font_cache.h +++ b/third_party/blink/renderer/platform/fonts/font_cache.h
@@ -386,6 +386,7 @@ friend class SimpleFontData; // For fontDataFromFontPlatformData friend class FontFallbackList; friend class FontPlatformDataCache; + friend class FontCacheMacTest; FRIEND_TEST_ALL_PREFIXES(FontCacheAndroidTest, LocaleSpecificTypeface); };
diff --git a/third_party/blink/renderer/platform/fonts/font_fallback_map.h b/third_party/blink/renderer/platform/fonts/font_fallback_map.h index 83f54077..75159e07 100644 --- a/third_party/blink/renderer/platform/fonts/font_fallback_map.h +++ b/third_party/blink/renderer/platform/fonts/font_fallback_map.h
@@ -14,10 +14,10 @@ #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/vector.h" -class FontSelector; - namespace blink { +class FontSelector; + // This class acts as a cache ensuring that equivalent `FontDescription`s will // have the same `FontFallbackList`. //
diff --git a/third_party/blink/renderer/platform/fonts/font_platform_data.h b/third_party/blink/renderer/platform/fonts/font_platform_data.h index 6c5f268..fbec85a 100644 --- a/third_party/blink/renderer/platform/fonts/font_platform_data.h +++ b/third_party/blink/renderer/platform/fonts/font_platform_data.h
@@ -56,7 +56,6 @@ namespace blink { -class Font; class HarfBuzzFace; class OpenTypeVerticalData;
diff --git a/third_party/blink/renderer/platform/fonts/font_selection_types.h b/third_party/blink/renderer/platform/fonts/font_selection_types.h index 5c2ea0c0..8831ae0 100644 --- a/third_party/blink/renderer/platform/fonts/font_selection_types.h +++ b/third_party/blink/renderer/platform/fonts/font_selection_types.h
@@ -185,12 +185,28 @@ inline constexpr FontSelectionValue kMaxWeightValue = FontSelectionValue(1000); +inline constexpr FontSelectionValue kBlackWeightValue = FontSelectionValue(900); + +inline constexpr FontSelectionValue kExtraBoldWeightValue = + FontSelectionValue(800); + inline constexpr FontSelectionValue kBoldWeightValue = FontSelectionValue(700); +inline constexpr FontSelectionValue kSemiBoldWeightValue = + FontSelectionValue(600); + +inline constexpr FontSelectionValue kMediumWeightValue = + FontSelectionValue(500); + inline constexpr FontSelectionValue kNormalWeightValue = FontSelectionValue(400); -inline constexpr FontSelectionValue kLightWeightValue = FontSelectionValue(200); +inline constexpr FontSelectionValue kLightWeightValue = FontSelectionValue(300); + +inline constexpr FontSelectionValue kExtraLightWeightValue = + FontSelectionValue(200); + +inline constexpr FontSelectionValue kThinWeightValue = FontSelectionValue(100); static constexpr inline bool isFontWeightBold(FontSelectionValue fontWeight) { return fontWeight >= kBoldThreshold;
diff --git a/third_party/blink/renderer/platform/fonts/mac/font_cache_mac_test.mm b/third_party/blink/renderer/platform/fonts/mac/font_cache_mac_test.mm new file mode 100644 index 0000000..318370d --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/mac/font_cache_mac_test.mm
@@ -0,0 +1,73 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/platform/fonts/font_cache.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/platform/fonts/font_description.h" +#include "third_party/blink/renderer/platform/fonts/font_selection_types.h" +#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" + +namespace blink { + +const FontSelectionValue Weights[] = { + kThinWeightValue, kExtraLightWeightValue, kLightWeightValue, + kNormalWeightValue, kMediumWeightValue, kSemiBoldWeightValue, + kBoldWeightValue, kExtraBoldWeightValue, kBlackWeightValue}; + +class FontCacheMacTest : public testing::TestWithParam<FontSelectionValue> { + protected: + FontDescription CreateFontDescriptionWithFontSynthesisNone( + FontSelectionValue weight, + FontSelectionValue style, + FontSelectionValue stretch) { + FontDescription font_description; + + font_description.SetWeight(weight); + font_description.SetStyle(style); + font_description.SetStretch(stretch); + + font_description.SetSyntheticBold(false); + font_description.SetSyntheticItalic(false); + + font_description.SetFontSynthesisWeight( + FontDescription::kAutoFontSynthesisWeight); + font_description.SetFontSynthesisStyle( + FontDescription::kAutoFontSynthesisStyle); + + return font_description; + } + + void TestSystemUISyntheticBold() { + FontSelectionValue weight = GetParam(); + + FontCache& font_cache = FontCache::Get(); + for (size_t size = 5; size <= 30; size++) { + FontDescription font_description = + CreateFontDescriptionWithFontSynthesisNone(weight, kNormalSlopeValue, + kNormalWidthValue); + std::unique_ptr<FontPlatformData> font_platform_data = + font_cache.CreateFontPlatformData( + font_description, + FontFaceCreationParams(font_family_names::kSystemUi), size); + EXPECT_FALSE(font_platform_data->SyntheticBold()); + } + } +}; + +INSTANTIATE_TEST_SUITE_P(SystemUISyntheticBold, + FontCacheMacTest, + testing::ValuesIn(Weights)); + +TEST_P(FontCacheMacTest, SystemUISyntheticBoldCoreText) { + ScopedFontMatchingCTMigrationForTest scoped_feature(true); + TestSystemUISyntheticBold(); +} + +TEST_P(FontCacheMacTest, SystemUISyntheticBoldAppKit) { + ScopedFontMatchingCTMigrationForTest scoped_feature(false); + TestSystemUISyntheticBold(); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/mac/font_matcher_mac.mm b/third_party/blink/renderer/platform/fonts/mac/font_matcher_mac.mm index ae63467..bfeb430 100644 --- a/third_party/blink/renderer/platform/fonts/mac/font_matcher_mac.mm +++ b/third_party/blink/renderer/platform/fonts/mac/font_matcher_mac.mm
@@ -339,9 +339,19 @@ // CoreText should always return a system-ui font. DCHECK(ct_font); + CTFontSymbolicTraits desired_traits = 0; + if (desired_slant != kNormalSlopeValue) { + desired_traits |= kCTFontItalicTrait; + } + + if (desired_weight >= kBoldThreshold) { + desired_traits |= kCTFontBoldTrait; + } + + if (desired_traits) { ct_font.reset(CTFontCreateCopyWithSymbolicTraits( - ct_font.get(), size, nullptr, kCTFontItalicTrait, kCTFontItalicTrait)); + ct_font.get(), size, nullptr, desired_traits, desired_traits)); } if (desired_weight == kNormalWeightValue &&
diff --git a/third_party/blink/renderer/platform/fonts/segmented_font_data.h b/third_party/blink/renderer/platform/fonts/segmented_font_data.h index 17cc3ed..b969d02e 100644 --- a/third_party/blink/renderer/platform/fonts/segmented_font_data.h +++ b/third_party/blink/renderer/platform/fonts/segmented_font_data.h
@@ -31,10 +31,10 @@ #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/casting.h" -class SimpleFontData; - namespace blink { +class SimpleFontData; + class PLATFORM_EXPORT SegmentedFontData : public FontData { public: static scoped_refptr<SegmentedFontData> Create() {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc index 16ae3c60..e3ce8ca 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -500,8 +500,9 @@ gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE | gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT; - // RASTER usage should be included, but historically it was not. - // Currently in the process of adding with a killswitch. + // RASTER_{READ, WRITE} usages should be included as these SharedImages are + // both read and written via raster, but historically these usages were not + // included. Currently in the process of adding with a killswitch. // TODO(crbug.com/1518427): Remove this killswitch post-safe rollout. if (base::FeatureList::IsEnabled(kAddSharedImageRasterUsageWithNonOOPR)) { shared_image_usage_flags = shared_image_usage_flags | @@ -1260,8 +1261,9 @@ } else { // The GLES2_WRITE flag is needed due to raster being over GL. usage = usage | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE; - // RASTER usage should be included, but historically it was not. - // Currently in the process of adding with a killswitch. + // RASTER_{READ, WRITE} usages should be included as these SharedImages are + // both read and written via raster, but historically these usages were not + // included. Currently in the process of adding with a killswitch. // TODO(crbug.com/1518427): Remove this killswitch post-safe rollout. if (base::FeatureList::IsEnabled(kAddSharedImageRasterUsageWithNonOOPR)) { usage = usage | gpu::SHARED_IMAGE_USAGE_RASTER_READ |
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.h b/third_party/blink/renderer/platform/media/web_media_player_impl.h index f76f0269..d9dece6 100644 --- a/third_party/blink/renderer/platform/media/web_media_player_impl.h +++ b/third_party/blink/renderer/platform/media/web_media_player_impl.h
@@ -72,10 +72,6 @@ class Size; } -namespace learning { -class LearningTaskController; -} - namespace media { class CdmContextRef; class ChunkDemuxer; @@ -84,6 +80,10 @@ class MemoryDumpProviderProxy; class PipelineController; class SwitchableAudioRendererSink; + +namespace learning { +class LearningTaskController; +} } // namespace media namespace viz {
diff --git a/third_party/blink/renderer/platform/peerconnection/bridge_ice_controller_test.cc b/third_party/blink/renderer/platform/peerconnection/bridge_ice_controller_test.cc index 39b6f5a..9019bd5 100644 --- a/third_party/blink/renderer/platform/peerconnection/bridge_ice_controller_test.cc +++ b/third_party/blink/renderer/platform/peerconnection/bridge_ice_controller_test.cc
@@ -31,14 +31,14 @@ #include "third_party/webrtc_overrides/p2p/base/ice_prune_proposal.h" #include "third_party/webrtc_overrides/p2p/base/ice_switch_proposal.h" -namespace { - namespace cricket { // This is an opaque type for the purposes of this test, so a forward // declaration suffices -class IceConfig; +struct IceConfig; } // namespace cricket +namespace { + using ::blink::BridgeIceController; using ::blink::FakeConnectionFactory; using ::blink::IceConnection;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 916d23ff..843b2df 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -372,11 +372,6 @@ origin_trial_feature_name: "AutoDarkMode", }, { - name: "AutoDisableAccessibilityV2", - base_feature: "none", - public: true, - }, - { name: "AutomationControlled", base_feature: "none", public: true, @@ -2265,9 +2260,7 @@ // Enables long aniamtion frames as a performance API (the // "long-animation-frame" timeline entry) name: "LongAnimationFrameTiming", - status: "experimental", - origin_trial_allows_third_party: true, - origin_trial_feature_name: "LongAnimationFrameTiming" + status: "stable" }, { // Use LongAnimationFrameMonitor to emit longtask entries
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc index eb8d727..7ebb95d 100644 --- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc +++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -578,7 +578,6 @@ // NOTE: GLES2_READ can be removed once OOP-R ships definitively. uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_RASTER_READ | - gpu::SHARED_IMAGE_USAGE_RASTER_WRITE | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_SCANOUT; #if BUILDFLAG(IS_APPLE) usage |= gpu::SHARED_IMAGE_USAGE_MACOS_VIDEO_TOOLBOX;
diff --git a/third_party/blink/renderer/platform/wtf/dtoa.cc b/third_party/blink/renderer/platform/wtf/dtoa.cc index a5e8810d..6c0dc25 100644 --- a/third_party/blink/renderer/platform/wtf/dtoa.cc +++ b/third_party/blink/renderer/platform/wtf/dtoa.cc
@@ -38,7 +38,8 @@ #include <string.h> #include "base/numerics/safe_conversions.h" -#include "third_party/blink/renderer/platform/wtf/vector.h" +#include "base/third_party/double_conversion/double-conversion/double-conversion.h" +#include "third_party/blink/renderer/platform/wtf/wtf_size_t.h" namespace WTF { @@ -133,16 +134,25 @@ return builder.Finalize(); } +double ParseDouble(const LChar* string, size_t length, size_t& parsed_length) { + int int_parsed_length = 0; + double d = internal::GetDoubleConverter().StringToDouble( + reinterpret_cast<const char*>(string), base::saturated_cast<int>(length), + &int_parsed_length); + parsed_length = int_parsed_length; + return d; +} + namespace internal { double ParseDoubleFromLongString(const UChar* string, size_t length, size_t& parsed_length) { wtf_size_t conversion_length = base::checked_cast<wtf_size_t>(length); - Vector<LChar> conversion_buffer(conversion_length); + auto conversion_buffer = std::make_unique<LChar[]>(conversion_length); for (wtf_size_t i = 0; i < conversion_length; ++i) conversion_buffer[i] = IsASCII(string[i]) ? string[i] : 0; - return ParseDouble(conversion_buffer.data(), length, parsed_length); + return ParseDouble(conversion_buffer.get(), length, parsed_length); } const double_conversion::StringToDoubleConverter& GetDoubleConverter() {
diff --git a/third_party/blink/renderer/platform/wtf/dtoa.h b/third_party/blink/renderer/platform/wtf/dtoa.h index 6db1d86a..a53cd33 100644 --- a/third_party/blink/renderer/platform/wtf/dtoa.h +++ b/third_party/blink/renderer/platform/wtf/dtoa.h
@@ -22,11 +22,14 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_DTOA_H_ #include "base/numerics/safe_conversions.h" -#include "base/third_party/double_conversion/double-conversion/double-conversion.h" #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h" #include "third_party/blink/renderer/platform/wtf/wtf_export.h" +namespace double_conversion { +class StringToDoubleConverter; +} // namespace double_conversion + namespace WTF { // Size = 80 for sizeof(DtoaBuffer) + some sign bits, decimal point, 'e', @@ -57,17 +60,6 @@ const double_conversion::StringToDoubleConverter& GetDoubleConverter(); } // namespace internal -inline double ParseDouble(const LChar* string, - size_t length, - size_t& parsed_length) { - int int_parsed_length = 0; - double d = internal::GetDoubleConverter().StringToDouble( - reinterpret_cast<const char*>(string), base::saturated_cast<int>(length), - &int_parsed_length); - parsed_length = int_parsed_length; - return d; -} - inline double ParseDouble(const UChar* string, size_t length, size_t& parsed_length) {
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index e8e7c563..4a6c38c 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -1868,6 +1868,15 @@ }, { 'paths': [ + 'third_party/blink/renderer/controller/blink_leak_detector.cc', + ], + 'allowed': [ + 'base::CommandLine', + 'switches::kEnableLeakDetectionHeapSnapshot', + ] + }, + { + 'paths': [ 'third_party/blink/renderer/controller/blink_shutdown.cc', ], 'allowed': [
diff --git a/third_party/blink/tools/commit_stats/affiliations.json5 b/third_party/blink/tools/commit_stats/affiliations.json5 index 7c1b467..aa36acd8 100644 --- a/third_party/blink/tools/commit_stats/affiliations.json5 +++ b/third_party/blink/tools/commit_stats/affiliations.json5
@@ -47,10 +47,15 @@ { start: "2020-07-10", domain: "tencent.com" }, ] }, - zenye@chromium.org: { + "zenye@chromium.org": { affiliations: [ { start: "2019-09-26", domain: "microsoft.com" }, ] }, + "kzar@chromium.org": { + affiliations: [ + { start: "2021-11-29", domain: "kzar.co.uk" }, + ] + }, }
diff --git a/third_party/blink/tools/commit_stats/org-list.txt b/third_party/blink/tools/commit_stats/org-list.txt index 73819ed..553810a 100644 --- a/third_party/blink/tools/commit_stats/org-list.txt +++ b/third_party/blink/tools/commit_stats/org-list.txt
@@ -53,3 +53,4 @@ GNU,gnu.org Netflix,netflix.com Shopify,shopify.com +Individuals,kzar.co.uk
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations index 39e7fe5..7c54cff 100644 --- a/third_party/blink/web_tests/LeakExpectations +++ b/third_party/blink/web_tests/LeakExpectations
@@ -52,14 +52,6 @@ # Sheriff 2023-04-04 crbug.com/1430360 [ Linux ] external/wpt/custom-elements/form-associated/label-delegatesFocus.html [ Failure Pass ] -# Sheriff 2023-11-22 -crbug.com/1499775 external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers.html?mouse [ Failure Pass ] -crbug.com/1499775 external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html?mouse [ Failure Pass ] -crbug.com/1499775 external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html?pen [ Failure Pass ] - -# Sheriff 2023-12-25 -crbug.com/1514134 external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers.html?pen [ Failure Pass ] - ########################################################################### # WARNING: Memory leaks must be fixed asap. Sheriff is expected to revert # # culprit CLs instead of suppressing the leaks. If you have any question, #
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 45d33c7..e2a6c00 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -5167,8 +5167,8 @@ crbug.com/1507761 external/wpt/fetch/private-network-access/window-open-existing.tentative.https.window.html?include=from-public [ Failure Pass Timeout ] # Temp disable MST transfer tests until Browser feature can be enabled in tests -crbug.com/1288839 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-iframe-transfer.https.html [ Failure Skip ] -crbug.com/1288839 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-iframe-audio-transfer.https.html [ Failure Skip ] +crbug.com/1288839 external/wpt/mediacapture-streams/MediaStreamTrack-iframe-transfer.https.html [ Failure Skip ] +crbug.com/1288839 external/wpt/mediacapture-streams/MediaStreamTrack-iframe-audio-transfer.https.html [ Failure Skip ] crbug.com/1288839 external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html [ Failure Skip ] crbug.com/1288839 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html [ Failure Skip ] crbug.com/1288839 external/wpt/mediacapture-streams/MediaStreamTrack-transfer.https.html [ Failure Skip ] @@ -5374,8 +5374,6 @@ crbug.com/1459038 [ Linux ] external/wpt/webmidi/idlharness.https.window.html [ Failure ] -crbug.com/1446799 external/wpt/pointerevents/pointerevent_attributes_nohover_pointers.html [ Failure Pass ] - # These tests are optional and not reliably supported in Chrome. crbug.com/1370307 [ Release Win ] external/wpt/encoding-detection/ar-ISO-8859-6-late.tentative.html [ Failure Pass ] crbug.com/1370307 external/wpt/encoding-detection/ar-windows-1256-late.tentative.html [ Failure Pass ] @@ -6795,3 +6793,7 @@ # Fix the duplicated reporting on Mac11 and Mac12. crbug.com/1505556 [ Mac ] http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-details-captured.js [ Failure Pass ] + + +# Flaky test +crbug.com/1521140 inspector-protocol/timeline/render-blocking-style.js [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 5ce0c3d3..030aa0ee 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1897,22 +1897,6 @@ "expires": "Jul 1, 2023" }, { - "prefix": "mediastreamtrack-transfer", - "platforms": ["Linux", "Mac", "Win"], - "bases": [ - "external/wpt/mediacapture-streams/MediaStreamTrack-iframe-transfer.https.html", - "external/wpt/mediacapture-streams/MediaStreamTrack-iframe-audio-transfer.https.html" - ], - "exclusive_tests": "ALL", - "args": [ - "--enable-blink-features=MediaStreamTrackTransfer", - "--enable-features=MediaStreamTrackTransfer", - "--use-fake-device-for-media-stream=display-media-type=browser", - "--disable-threaded-compositing", "--disable-threaded-animation" - ], - "expires": "Jul 1, 2023" - }, - { "prefix": "force-defer-script", "platforms": ["Linux", "Mac", "Win"], "bases": ["external/wpt/html/semantics/scripting-1/the-script-element/defer-script/"],
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any-expected.txt b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any-expected.txt deleted file mode 100644 index 08c1bb1..0000000 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Fetch from host with trailing dot should be allowed by CSP. - promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.serviceworker-expected.txt deleted file mode 100644 index 08c1bb1..0000000 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.serviceworker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Fetch from host with trailing dot should be allowed by CSP. - promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.sharedworker-expected.txt deleted file mode 100644 index 08c1bb1..0000000 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.sharedworker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Fetch from host with trailing dot should be allowed by CSP. - promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.worker-expected.txt deleted file mode 100644 index 08c1bb1..0000000 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/generic/src-trailing-dot.sub.any.worker-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Fetch from host with trailing dot should be allowed by CSP. - promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained-dynamic.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained-dynamic.tentative-expected.txt new file mode 100644 index 0000000..6c083835 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained-dynamic.tentative-expected.txt
@@ -0,0 +1,11 @@ +This is a testharness.js-based test. +[FAIL] .target 1 + assert_equals: \n<div class="container">\n <div class="anchor a1"></div>\n <div class="contain-style">\n <div class="anchor a1"></div>\n </div>\n <div id="target-a1" class="target" data-offset-y="100"></div>\n</div>\noffsetTop expected 100 but got 200 +[FAIL] .target 2 + assert_equals: \n<div id="target-a2" class="target" data-offset-y="50"></div>\noffsetTop expected 50 but got 200 +[FAIL] .target 5 + assert_equals: \n<div class="container">\n <div class="anchor a1"></div>\n <div class="contain-style" style="">\n <div class="anchor a1"></div>\n </div>\n <div id="target-a1" class="target" data-offset-y="100"></div>\n</div>\noffsetTop expected 100 but got 200 +[FAIL] .target 6 + assert_equals: \n<div id="target-a2" class="target" data-offset-y="50"></div>\noffsetTop expected 50 but got 200 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained-dynamic.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained-dynamic.tentative.html new file mode 100644 index 0000000..36b326b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained-dynamic.tentative.html
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<title>CSS Anchor Positioning: anchor-name is style contained - dynamic containment</title> +<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#determining"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/9100"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script src="support/test-common.js"></script> +<style> + .container { + position: relative; + } + .anchor { + width: 100px; + height: 100px; + } + .a1 { + anchor-name: --a1; + } + .a2 { + anchor-name: --a2; + } + .contain-style { + contain: style; + } + .target { + position: absolute; + top: anchor(bottom, 50px); + } + #target-a1 { + anchor-default: --a1; + } + #target-a2 { + anchor-default: --a2; + } +</style> +<div class="container"> + <div class="anchor a1"></div> + <div class="contain-style"> + <div class="anchor a1"></div> + </div> + <div id="target-a1" class="target" data-offset-y="100"></div> +</div> +<div class="container"> + <div class="anchor a2"></div> + <div class="anchor a2"></div> + <div class="contain-style"> + <div id="target-a2" class="target" data-offset-y="50"></div> + </div> +</div> +<script type="module"> + await checkLayoutForAnchorPos('.target'); + + const t1 = document.querySelector("#target-a1"); + const t2 = document.querySelector("#target-a2"); + t1.setAttribute("data-offset-y", "200"); + t2.setAttribute("data-offset-y", "200"); + for (let element of document.querySelectorAll(".contain-style")) { + element.style.contain = "none"; + } + await checkLayoutForAnchorPos('.target'); + + t1.setAttribute("data-offset-y", "100"); + t2.setAttribute("data-offset-y", "50"); + for (let element of document.querySelectorAll(".contain-style")) { + element.style.contain = ""; + } + await checkLayoutForAnchorPos('.target'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained.tentative-expected.txt new file mode 100644 index 0000000..3aff573 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained.tentative-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +[FAIL] .target 1 + assert_equals: \n<div class="container">\n <div class="anchor a1"></div>\n <div class="contain-style">\n <div class="anchor a1"></div>\n </div>\n <div id="target-a1" class="target" data-offset-y="100"></div>\n</div>\noffsetTop expected 100 but got 200 +[FAIL] .target 2 + assert_equals: \n<div id="target-a2" class="target" data-offset-y="50"></div>\noffsetTop expected 50 but got 200 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained.tentative.html new file mode 100644 index 0000000..0d4afa7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-style-contained.tentative.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<title>CSS Anchor Positioning: anchor-name is style contained</title> +<link rel="help" href="https://drafts.csswg.org/css-anchor-1/#determining"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/9100"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script src="support/test-common.js"></script> +<style> + .container { + position: relative; + } + .anchor { + width: 100px; + height: 100px; + } + .a1 { + anchor-name: --a1; + } + .a2 { + anchor-name: --a2; + } + .contain-style { + contain: style; + } + .target { + position: absolute; + top: anchor(bottom, 50px); + } + #target-a1 { + anchor-default: --a1; + } + #target-a2 { + anchor-default: --a2; + } +</style> +<body onload="checkLayoutForAnchorPos('.target')"> +<div class="container"> + <div class="anchor a1"></div> + <div class="contain-style"> + <div class="anchor a1"></div> + </div> + <div id="target-a1" class="target" data-offset-y="100"></div> +</div> +<div class="container"> + <div class="anchor a2"></div> + <div class="anchor a2"></div> + <div class="contain-style"> + <div id="target-a2" class="target" data-offset-y="50"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt index 120ed7ea..49de6fd9 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt
@@ -11,13 +11,23 @@ assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false [FAIL] Property text-spacing value 'space-all' assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false +[FAIL] Property text-spacing value 'normal normal' + assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false +[FAIL] Property text-spacing value 'normal trim-start' + assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false [FAIL] Property text-spacing value 'no-autospace normal' assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false [FAIL] Property text-spacing value 'no-autospace space-all' assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false +[FAIL] Property text-spacing value 'no-autospace trim-start' + assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false +[FAIL] Property text-spacing value 'trim-start normal ' + assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false [FAIL] Property text-spacing value 'normal no-autospace' assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false [FAIL] Property text-spacing value 'space-all no-autospace' assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false +[FAIL] Property text-spacing value 'trim-start no-autospace' + assert_true: text-spacing doesn't seem to be supported in the computed style expected true got false Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed.html b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed.html index 84d267c4..845cf075a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-computed.html
@@ -23,11 +23,16 @@ test_computed_value("text-spacing", "space-all"); // `text-autospace` and `text-spacing-trim`. +test_computed_value("text-spacing", "normal normal", "normal"); +test_computed_value("text-spacing", "normal trim-start", "trim-start"); test_computed_value("text-spacing", "no-autospace normal", "no-autospace"); test_computed_value("text-spacing", "no-autospace space-all", "none"); +test_computed_value("text-spacing", "no-autospace trim-start", "trim-start no-autospace"); // Test the reversed order. +test_computed_value("text-spacing", "trim-start normal ", "trim-start"); test_computed_value("text-spacing", "normal no-autospace", "no-autospace"); test_computed_value("text-spacing", "space-all no-autospace", "none"); +test_computed_value("text-spacing", "trim-start no-autospace", "trim-start no-autospace"); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-invalid.html index 5b83dfb..99cac86 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-invalid.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-invalid.html
@@ -18,6 +18,7 @@ test_invalid_value("text-spacing", `${keyword2} ${keyword}`); } } +test_invalid_value("text-spacing", `normal normal no-autospace`); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt index e47b4e2..dc4d9d1c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt
@@ -11,13 +11,23 @@ assert_not_equals: property should be set got disallowed value "" [FAIL] e.style['text-spacing'] = "space-all" should set the property value assert_not_equals: property should be set got disallowed value "" +[FAIL] e.style['text-spacing'] = "normal normal" should set the property value + assert_not_equals: property should be set got disallowed value "" +[FAIL] e.style['text-spacing'] = "normal trim-start" should set the property value + assert_not_equals: property should be set got disallowed value "" [FAIL] e.style['text-spacing'] = "no-autospace normal" should set the property value assert_not_equals: property should be set got disallowed value "" [FAIL] e.style['text-spacing'] = "no-autospace space-all" should set the property value assert_not_equals: property should be set got disallowed value "" +[FAIL] e.style['text-spacing'] = "no-autospace trim-start" should set the property value + assert_not_equals: property should be set got disallowed value "" +[FAIL] e.style['text-spacing'] = "trim-start normal " should set the property value + assert_not_equals: property should be set got disallowed value "" [FAIL] e.style['text-spacing'] = "normal no-autospace" should set the property value assert_not_equals: property should be set got disallowed value "" [FAIL] e.style['text-spacing'] = "space-all no-autospace" should set the property value assert_not_equals: property should be set got disallowed value "" +[FAIL] e.style['text-spacing'] = "trim-start no-autospace" should set the property value + assert_not_equals: property should be set got disallowed value "" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid.html b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid.html index 994ea01..d0cb332d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/parsing/text-spacing-valid.html
@@ -22,11 +22,16 @@ test_valid_value("text-spacing", "space-all"); // `text-autospace` and `text-spacing-trim`. +test_valid_value("text-spacing", "normal normal", "normal"); +test_valid_value("text-spacing", "normal trim-start", "trim-start"); test_valid_value("text-spacing", "no-autospace normal", "no-autospace"); test_valid_value("text-spacing", "no-autospace space-all", "none"); +test_valid_value("text-spacing", "no-autospace trim-start", "trim-start no-autospace"); // Test the reversed order. +test_valid_value("text-spacing", "trim-start normal ", "trim-start"); test_valid_value("text-spacing", "normal no-autospace", "no-autospace"); test_valid_value("text-spacing", "space-all no-autospace", "none"); +test_valid_value("text-spacing", "trim-start no-autospace", "trim-start no-autospace"); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes.html new file mode 100644 index 0000000..7675dd5a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes.html
@@ -0,0 +1,295 @@ +<!doctype html> +<html> +<head> + <title>Pointer Events properties tests</title> + <meta name="viewport" content="width=device-width"> + <meta name="variant" content="?mouse"> + <meta name="variant" content="?pen"> + <meta name="variant" content="?mouse-right"> + <meta name="variant" content="?pen-right"> + <meta name="variant" content="?touch"> + <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> + <style> + html { + touch-action: none; + } + + div { + padding: 0; + } + + #square1 { + background-color: green; + border: 1px solid black; + height: 50px; + width: 50px; + margin-bottom: 3px; + display: inline-block; + } + + #innerFrame { + position: relative; + margin-bottom: 3px; + margin-left: 0; + top: 0; + left: 0; + } + </style> +</head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<!-- Additional helper script for common checks across event types --> +<script type="text/javascript" src="pointerevent_support.js"></script> +<script> +let frameLoaded = undefined; +const frameLoadedPromise = new Promise(resolve => { + frameLoaded = resolve; +}); +</script> +<body> + <div id="square1"></div> + <div> + <iframe onLoad = "frameLoaded()" id="innerFrame" srcdoc=' + <style> + html { + touch-action: none; + } + #square2 { + background-color: green; + border: 1px solid black; + height: 50px; + width: 50px; + display: inline-block; + } + </style> + <body> + <div id="square2"></div> + </body> + '></iframe> + </div> + <!-- Used to detect a sentinel event. Once triggered, all other events must + have been processed. --> + <div> + <button id="done">done</button> + </div> +</body> +<script> + window.onload = runTests(); + + async function runTests() { + + const queryStringFragments = location.search.substring(1).split('-'); + const pointerType = queryStringFragments[0]; + const button = queryStringFragments[1]; + + const eventList = [ + 'pointerover', + 'pointerenter', + 'pointerdown', + 'pointerup', + 'pointerout', + 'pointerleave', + 'pointermove' + ]; + + function injectScrubGesture(element) { + const doneButton = document.getElementById('done'); + const actions = new test_driver.Actions(); + + let buttonArguments = + (button == 'right') ? { button: actions.ButtonType.RIGHT } + : undefined; + + // The following comments refer to the first event of each type since + // that is what is being validated in the test. + return actions + .addPointer('pointer1', pointerType) + // The pointermove, pointerover and pointerenter events will be + // triggered here with a hover pointer. + .pointerMove(0, -20, { origin: element }) + // Pointerdown triggers pointerover, pointerenter with a non-hover + // pointer type. + .pointerDown(buttonArguments) + // This move triggers pointermove with a non-hover pointer-type. + .pointerMove(0, 20, { origin: element }) + // The pointerout and pointerleave events are triggered here with a + // touch pointer. + .pointerUp(buttonArguments) + // An addition move outside of the target bounds is required to trigger + // pointerout & pointerleave events with a hover pointer. + .pointerMove(0, 0) + .send(); + } + + // Processing a click or tap on the done button is used to signal that all + // other events should have beem handled. This is used to catch unhandled + // events that would otherwise result in a timeout. + function clickOrTapDone() { + const doneButton = document.getElementById('done'); + const pointerupPromise = getEvent('pointerup', doneButton); + const actionPromise = new test_driver.Actions() + .addPointer('pointer1', 'touch') + .pointerMove(0, 0, {origin: doneButton}) + .pointerDown() + .pointerUp() + .send(); + return actionPromise.then(pointerupPromise); + } + + function verifyButtonAttributes(event) { + let downButton, upButton, downButtons, upButtons; + if (button == 'right') { + downButton = 2; + downButtons = 2; + upButton = 2; + upButtons = 0; + } else { + // defaults to left button click + downButton = 0; + downButtons = 1; + upButton = 0; + upButtons = 0; + } + const expectationsHover = { + // Pointer over, enter, and move are processed before the button press. + pointerover: { button: -1, buttons: 0 }, + pointerenter: { button: -1, buttons: 0 }, + pointermove: { button: -1, buttons: 0 }, + // Button status changes on pointer down and up. + pointerdown: { button: downButton, buttons: downButtons }, + pointerup: { button: upButton, buttons: upButtons }, + // Pointer out and leave are processed after the button release. + pointerout: { button: -1, buttons: 0 }, + pointerleave: { button: -1, buttons: 0 } + }; + const expectationsNoHover = { + // We don't see pointer events except during a touch gesture. + // Move is the only pointer event where the "button" click state is not + // changing. All other pointer events are associated with the start or + // end of a touch gesture. + pointerover: { button: 0, buttons: 1 }, + pointerenter: { button: 0, buttons: 1 }, + pointerdown: { button: 0, buttons: 1 }, + pointermove: { button: -1, buttons: 1 }, + pointerup: { button: 0, buttons: 0 }, + pointerout: { button: 0, buttons: 0 }, + pointerleave: { button: 0, buttons: 0 } + }; + const expectations = + (pointerType == 'touch') ? expectationsNoHover : expectationsHover; + + assert_equals(event.button, expectations[event.type].button, + `Button attribute on ${event.type}`); + assert_equals(event.buttons, expectations[event.type].buttons, + `Buttons attribute on ${event.type}`); + } + + function verifyPosition(event) { + const boundingRect = event.target.getBoundingClientRect(); + + // With a touch pointer type, the pointerout and pointerleave will trigger + // on pointerup while clientX and clientY are still within the target's + // bounds. With a hover pointer, these events will be triggered only after + // clientX or clientY are out of the target's bounds. + if (pointerType != 'touch' && + (event.type == 'pointerout' || event.type == 'pointerleave')) { + assert_true( + boundingRect.left > event.clientX || + boundingRect.right < event.clientX || + boundingRect.top > event.clientY || + boundingRect.bottom < event.clientY, + `clientX/clientY is outside the element bounds for ${event.type} event`); + } else { + assert_true( + boundingRect.left <= event.clientX && + boundingRect.right >= event.clientX, + `clientX is within the expected range for ${event.type} event`); + assert_true( + boundingRect.top <= event.clientY && + boundingRect.bottom >= event.clientY, + `clientY is within the expected range for ${event.type} event`); + } + } + + function verifyEventAttributes(event, testNamePrefix) { + verifyButtonAttributes(event); + verifyPosition(event); + assert_true(event.isPrimary, 'isPrimary attribute is true'); + check_PointerEvent(event, testNamePrefix); + } + + function pointerPromise(test, testNamePrefix, type, target) { + let rejectCallback = undefined; + promise = new Promise((resolve, reject) => { + // Store a reference to the promise rejection functions, which would + // otherwise not be visible outside the promise object. If the callback + // remains set when the deadline is reached, it means that the promise + // will not get resolved and should be rejected. + rejectCallback = reject; + const pointerEventListener = event => { + rejectCallback = undefined; + assert_equals(event.type, type, `type attribute for ${type} event`); + event.preventDefault(); + resolve(event); + }; + target.addEventListener(type, pointerEventListener, { once: true }); + test.add_cleanup(() => { + // Just in case of an assert prior to the events being triggered. + document.removeEventListener(type, pointerEventListener, + { once: true }); + }); + }).then(result => { verifyEventAttributes(result, testNamePrefix); }, + error => { assert_unreached(error); }); + promise.deadlineReached = () => { + // If the event has not been received, the promise will not be + // fulfilled, leading to a timeout. Reject the promise if still pending. + if (rejectCallback) { + rejectCallback(`missing ${type} event`); + } + } + return promise; + } + + async function runPointerEventsTest(test, testNamePrefix, target) { + assert_true(['mouse', 'pen', 'touch'].indexOf(pointerType) >= 0, + `Unexpected pointer type (${pointerType})`); + + const promises = []; + eventList.forEach(type => { + // Create a promise for each event type. If clicking on the done button + // is detected before an event's promise is resolved, then the promise + // will be rejected. Otherwise, the attributes for the event are + // verified. + promises.push(pointerPromise(test, testNamePrefix, type, target)); + }); + + await injectScrubGesture(target); + + // The injected gestures consist of a shrub on a button followed by a + // click on the done button. The promise is only resolved after the + // done click is detected. At this stage all other events must have been + // processed. Any unresolved promises in the list will be rejected to + // avoid a test timeout. The rejection will trigger a test failure. + await clickOrTapDone().then(promises.map(p => p.deadlineReached())); + + // Once all promises are resolved, all event attributes have been + // successfully verified. + return Promise.all(promises); + } + + promise_test(t => { + const square1 = document.getElementById('square1'); + return runPointerEventsTest(t, '', square1); + }, 'Test pointer events in the main document'); + + promise_test(async t => { + const innerFrame = document.getElementById('innerFrame'); + await frameLoadedPromise; + const square2 = innerFrame.contentDocument.getElementById('square2'); + return runPointerEventsTest(t, 'Inner Frame', square2); + }, 'Test pointer events in an iframe'); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers.html deleted file mode 100644 index c8443d9..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_hoverable_pointers.html +++ /dev/null
@@ -1,158 +0,0 @@ -<!doctype html> -<html> - <head> - <title>Pointer Events properties tests</title> - <meta name="viewport" content="width=device-width"> - <meta name="variant" content="?mouse"> - <meta name="variant" content="?pen"> - <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/resources/testdriver.js"></script> - <script src="/resources/testdriver-actions.js"></script> - <script src="/resources/testdriver-vendor.js"></script> - <!-- Additional helper script for common checks across event types --> - <script type="text/javascript" src="pointerevent_support.js"></script> - <script> - var input_pointertype = location.search.substring(1); - var detected_pointertypes = {}; - var detected_eventTypes = {}; - var eventList = ['pointerover', 'pointerenter', 'pointermove', 'pointerdown', 'pointerup', 'pointerout', 'pointerleave']; - var expectedPointerId = NaN; - - function resetTestState() { - detected_eventTypes = {}; - document.getElementById("square1").style.visibility = 'visible'; - document.getElementById('innerFrame').contentDocument.getElementById("square2").style.visibility = 'hidden'; - expectedPointerId = NaN; - } - function checkPointerEventAttributes(event, targetBoundingClientRect, testNamePrefix) { - if (detected_eventTypes[event.type]) - return; - var expectedEventType = eventList[Object.keys(detected_eventTypes).length]; - detected_eventTypes[event.type] = true; - var pointerTestName = (testNamePrefix ? testNamePrefix + ' ' : '') - + expectedPointerType + ' ' + expectedEventType; - - detected_pointertypes[event.pointerType] = true; - - test(function() { - assert_equals(event.type, expectedEventType); - }, pointerTestName + ".type should be " + expectedEventType); - - // Test button and buttons - if (event.type == 'pointerdown') { - test(function() { - assert_equals(event.button, 0); - }, pointerTestName + ".button attribute is 0 when left mouse button is pressed."); - test(function() { - assert_equals(event.buttons, 1); - }, pointerTestName + ".buttons attribute is 1 when left mouse button is pressed."); - } else if (event.type == 'pointerup') { - test(function() { - assert_equals(event.button, 0); - }, pointerTestName + ".button attribute is 0 when left mouse button is just released."); - test(function() { - assert_equals(event.buttons, 0); - }, pointerTestName + ".buttons attribute is 0 when left mouse button is just released."); - } else { - test(function() { - assert_equals(event.button, -1); - }, pointerTestName + ".button is -1 when mouse buttons are in released state."); - test(function() { - assert_equals(event.buttons, 0); - }, pointerTestName + ".buttons is 0 when mouse buttons are in released state."); - } - - // Test clientX and clientY - if (event.type != 'pointerout' && event.type != 'pointerleave' ) { - test(function () { - assert_greater_than_equal(event.clientX, targetBoundingClientRect.left, "clientX should be greater or equal than left of the box"); - assert_greater_than_equal(event.clientY, targetBoundingClientRect.top, "clientY should be greater or equal than top of the box"); - assert_less_than_equal(event.clientX, targetBoundingClientRect.right, "clientX should be less or equal than right of the box"); - assert_less_than_equal(event.clientY, targetBoundingClientRect.bottom, "clientY should be less or equal than bottom of the box"); - }, pointerTestName + ".clientX and .clientY attributes are correct."); - } else { - test(function () { - assert_true(event.clientX < targetBoundingClientRect.left || event.clientX >= targetBoundingClientRect.right || event.clientY < targetBoundingClientRect.top || event.clientY >= targetBoundingClientRect.bottom); - }, pointerTestName + ".clientX and .clientY attributes are correct."); - } - - check_PointerEvent(event, testNamePrefix); - - // Test isPrimary - test(function () { - assert_equals(event.isPrimary, true); - }, pointerTestName + ".isPrimary attribute is true."); - - // Test pointerId value - if (isNaN(expectedPointerId)) { - expectedPointerId = event.pointerId; - } else { - test(function () { - assert_equals(event.pointerId, expectedPointerId); - }, pointerTestName + ".pointerId should be the same as previous pointer events for this active pointer."); - } - } - - async function run() { - var test_pointerEvent = setup_pointerevent_test("pointerevent attributes", [input_pointertype]); - var square1 = document.getElementById("square1"); - var rectSquare1 = square1.getBoundingClientRect(); - var innerFrame = document.getElementById('innerFrame'); - var square2 = innerFrame.contentDocument.getElementById('square2'); - var rectSquare2 = square2.getBoundingClientRect(); - - eventList.forEach(function(eventName) { - on_event(square1, eventName, function (event) { - if (square1.style.visibility == 'hidden') - return; - checkPointerEventAttributes(event, rectSquare1, ""); - if (Object.keys(detected_eventTypes).length == eventList.length) { - square1.style.visibility = 'hidden'; - detected_eventTypes = {}; - square2.style.visibility = 'visible'; - expectedPointerId = NaN; - } - }); - on_event(square2, eventName, function (event) { - checkPointerEventAttributes(event, rectSquare2, "Inner frame "); - if (Object.keys(detected_eventTypes).length == eventList.length) { - square2.style.visibility = 'hidden'; - test_pointerEvent.done(); - } - }); - }); - - // Inject mouse or pen inputs. - await clickInTarget(input_pointertype, square1); - await moveToDocument(input_pointertype); - await clickInTarget(input_pointertype, square2); - await moveToDocument(input_pointertype); - } - </script> - </head> - <body onload="run()"> - <h1>Pointer Events hoverable pointer attributes test</h1> - <h2 id="pointerTypeDescription"></h2> - <h4> - Test Description: This test checks the properties of hoverable pointer events. If you are using hoverable pen don't leave the range of digitizer while doing the instructions. - <ol> - <li>Move your pointer over the black square and click on it.</li> - <li>Then move it off the black square so that it disappears.</li> - <li>When red square appears move your pointer over the red square and click on it.</li> - <li>Then move it off the red square.</li> - </ol> - - Test passes if the proper behavior of the events is observed. - </h4> - <div id="square1" class="square"></div> - <iframe id="innerFrame" src="resources/pointerevent_attributes_hoverable_pointers-iframe.html"></iframe> - <div class="spacer"></div> - <div id="complete-notice"> - <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> - <p>Refresh the page to run the tests again with a different pointer type.</p> - </div> - <div id="log"></div> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html deleted file mode 100644 index 9a449ed7..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html +++ /dev/null
@@ -1,168 +0,0 @@ -<!doctype html> -<html> - <head> - <title>Pointer Events properties tests</title> - <meta name="viewport" content="width=device-width"> - <meta name="variant" content="?mouse"> - <meta name="variant" content="?pen"> - <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/resources/testdriver.js"></script> - <script src="/resources/testdriver-actions.js"></script> - <script src="/resources/testdriver-vendor.js"></script> - <!-- Additional helper script for common checks across event types --> - <script type="text/javascript" src="pointerevent_support.js"></script> - <script> - var input_pointertype = location.search.substring(1); - var detected_eventTypes = {}; - var eventList = [ - 'pointerover', 'pointerenter', 'pointermove', 'pointerdown', - 'pointerup', 'pointerout', 'pointerleave' - ]; - var expectedPointerId = NaN; - - function resetTestState() { - detected_eventTypes = {}; - document.getElementById("square1").style.visibility = 'visible'; - document.getElementById('innerFrame').contentDocument - .getElementById("square2").style.visibility = 'hidden'; - expectedPointerId = NaN; - } - function checkPointerEventAttributes( - event, targetBoundingClientRect, testNamePrefix) { - if (detected_eventTypes[event.type]) - return; - var expectedEventType = - eventList[Object.keys(detected_eventTypes).length]; - detected_eventTypes[event.type] = true; - var pointerTestName = (testNamePrefix ? testNamePrefix + ' ' : '') - + expectedPointerType + ' ' + expectedEventType; - - test(function() { - assert_equals(event.type, expectedEventType); - }, pointerTestName + "'s type should be " + expectedEventType); - - // Test button and buttons - if (event.type == 'pointerdown') { - test(function() { - assert_equals(event.button, 2); - }, pointerTestName + "'s button attribute is 2 when right mouse " - + "button is pressed."); - test(function() { - assert_equals(event.buttons, 2); - }, pointerTestName + "'s buttons attribute is 2 when right mouse " - + "button is pressed."); - } else if (event.type == 'pointerup') { - test(function() { - assert_equals(event.button, 2); - }, pointerTestName + "'s button attribute is 0 when right mouse " - + "button is just released."); - test(function() { - assert_equals(event.buttons, 0); - }, pointerTestName + "'s buttons attribute is 0 when right mouse " - + "button is just released."); - } else { - test(function() { - assert_equals(event.button, -1); - }, pointerTestName + "'s button is -1 when mouse buttons are in " - + "released state."); - test(function() { - assert_equals(event.buttons, 0); - }, pointerTestName + "'s buttons is 0 when mouse buttons are in " - + "released state."); - } - - // Test clientX and clientY - if (event.type != 'pointerout' && event.type != 'pointerleave' ) { - test(function () { - assert_greater_than_equal( - event.clientX, targetBoundingClientRect.left, - "clientX should be greater or equal than left of the box"); - assert_greater_than_equal( - event.clientY, targetBoundingClientRect.top, - "clientY should be greater or equal than top of the box"); - assert_less_than_equal( - event.clientX, targetBoundingClientRect.right, - "clientX should be less or equal than right of the box"); - assert_less_than_equal( - event.clientY, targetBoundingClientRect.bottom, - "clientY should be less or equal than bottom of the box"); - }, pointerTestName + "'s ClientX and ClientY attributes are correct."); - } else { - test(function () { - assert_true( - event.clientX < targetBoundingClientRect.left - || event.clientX >= targetBoundingClientRect.right - || event.clientY < targetBoundingClientRect.top - || event.clientY >= targetBoundingClientRect.bottom, - "ClientX/Y should be out of the boundaries of the box"); - }, pointerTestName + "'s ClientX and ClientY attributes are correct."); - } - - check_PointerEvent(event, testNamePrefix); - - // Test isPrimary - test(function () { - assert_equals(event.isPrimary, true); - }, pointerTestName + ".isPrimary attribute is correct."); - - // Test pointerId value - if (isNaN(expectedPointerId)) { - expectedPointerId = event.pointerId; - } else { - test(function () { - assert_equals(event.pointerId, expectedPointerId); - }, pointerTestName + ".pointerId should be the same as previous " - + "pointer events for this active pointer."); - } - } - - async function run() { - var test_pointerEvent = setup_pointerevent_test( - "pointerevent attributes", [input_pointertype]); - var square1 = document.getElementById("square1"); - var rectSquare1 = square1.getBoundingClientRect(); - var innerFrame = document.getElementById('innerFrame'); - var square2 = innerFrame.contentDocument.getElementById('square2'); - var rectSquare2 = square2.getBoundingClientRect(); - var actions_promise; - - eventList.forEach(function(eventName) { - on_event(square1, eventName, function (event) { - if (square1.style.visibility == 'hidden') - return; - checkPointerEventAttributes(event, rectSquare1, ""); - if (Object.keys(detected_eventTypes).length == eventList.length) { - square1.style.visibility = 'hidden'; - detected_eventTypes = {}; - square2.style.visibility = 'visible'; - expectedPointerId = NaN; - } - }); - on_event(square2, eventName, function (event) { - checkPointerEventAttributes(event, rectSquare2, "Inner frame"); - if (Object.keys(detected_eventTypes).length == eventList.length) { - square2.style.visibility = 'hidden'; - test_pointerEvent.done(); - } - }); - }); - - // Inject mouse or pen inputs. - await rightClickInTarget(input_pointertype, square1); - await moveToDocument(input_pointertype); - await rightClickInTarget(input_pointertype, square2); - await moveToDocument(input_pointertype); - } - </script> - </head> - <body onload="run()"> - <h1>Pointer Events hoverable pointer attributes test</h1> - <h2 id="pointerTypeDescription"></h2> - <div id="square1" class="square"></div> - <iframe id="innerFrame" - src="resources/pointerevent_attributes_hoverable_pointers-iframe.html"> - </iframe> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_nohover_pointers.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_nohover_pointers.html deleted file mode 100644 index 3441417c4..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_attributes_nohover_pointers.html +++ /dev/null
@@ -1,200 +0,0 @@ -<!doctype html> -<html> -<head> - <title>Pointer Events properties tests</title> - <meta name="viewport" content="width=device-width"> - <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> - <style> - html { - touch-action: none; - } - - div { - padding: 0; - } - - #square1 { - background-color: green; - border: 1px solid black; - height: 50px; - width: 50px; - margin-bottom: 3px; - display: inline-block; - } - - #innerFrame { - position: relative; - margin-bottom: 3px; - margin-left: 0; - top: 0; - left: 0; - } - </style> -</head> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-actions.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<!-- Additional helper script for common checks across event types --> -<script type="text/javascript" src="pointerevent_support.js"></script> -<script> - - window.onload = async () => { - const event_list = [ - 'pointerover', - 'pointerenter', - 'pointerdown', - 'pointerup', - 'pointerout', - 'pointerleave', - 'pointermove' - ]; - - function checkPointerEventAttributes(testPrefix, event, expectations) { - const pointerTestName = - `${testPrefix} touch.${expectations.type}`; - - test(function() { - assert_equals(event.type, expectations.type); - }, `${pointerTestName}.type should be ${expectations.type}`); - - test(function() { - assert_equals(event.button, expectations.button); - }, `${pointerTestName}.button should be ${expectations.button}`); - - test(function() { - assert_equals(event.buttons, expectations.buttons); - }, `${pointerTestName}.buttons should be ${expectations.buttons}`); - - // Bounding rect of the event target must contain (clienX, clientY). - const boundingRect = event.target.getBoundingClientRect(); - test(function() { - assert_true( - boundingRect.left <= event.clientX && - boundingRect.right >= event.clientX); - }, `${pointerTestName}.clientX is within the expected range`); - test(function() { - assert_true( - boundingRect.top <= event.clientY && - boundingRect.bottom >= event.clientY); - }, `${pointerTestName}.clientY is within the expected range`); - - check_PointerEvent(event, testPrefix); - - // Test isPrimary - test(function () { - assert_equals(event.isPrimary, true); - }, `${pointerTestName}: isPrimary attribute is true.`); - } - - function injectScrub(element) { - return new test_driver.Actions() - .addPointer('pointer1', 'touch') - .pointerMove(0, -20, {origin: element}) - .pointerDown() - .addTick() - .addTick() - .pointerMove(0, 20, {origin: element}) - .addTick() - .addTick() - .pointerUp() - .send(); - } - - async function tapDone() { - const done_button = document.getElementById('done'); - const pointerupPromise = getEvent('pointerup', done_button); - const actionPromise = new test_driver.Actions() - .addPointer('pointer1', 'touch') - .pointerMove(0, 0, {origin: done_button}) - .pointerDown() - .addTick() - .addTick() - .pointerUp() - .send(); - return actionPromise.then(pointerupPromise); - } - - const test_fixture = async_test("All events handled"); - const listeners = {}; - const attachListener = (testPrefix, target, type, expectations, - elements) => { - expectations.type = type; - const pointer_ids = {}; - const key = `${testPrefix} ${type}`; - const listener = (event) => { - if (pointer_ids[testPrefix] == undefined) { - pointer_ids[testPrefix] == event.pointerId; - } else { - test(() => { - assert_equals(event.pointerId, pointer_ids[testPrefix]); - }, `${testPrefix} touch.pointerId matches expectation`); - } - // Don't let the browser handle the event to help guard against - // potential memory leaks. - event.preventDefault(); - checkPointerEventAttributes(testPrefix, event, expectations); - target.removeEventListener(type, listener); - delete listeners[key]; - }; - target.addEventListener(type, listener); - listeners[key] = listener; - }; - - const square1 = document.getElementById("square1"); - const innerFrame = document.getElementById('innerFrame'); - const square2 = innerFrame.contentDocument.getElementById('square2'); - const expectations = { - pointerover: { button: 0, buttons: 1 }, - pointerenter: { button: 0, buttons: 1 }, - pointerdown: { button: 0, buttons: 1 }, - pointermove: { button: -1, buttons: 1 }, - pointerup: { button: 0, buttons: 0 }, - pointerout: { button: 0, buttons: 0 }, - pointerleave: { button: 0, buttons: 0 }, - }; - event_list.forEach(type => { - attachListener('', square1, type, expectations[type]); - attachListener('inner frame', square2, type, expectations[type]); - }); - await injectScrub(square1); - await injectScrub(square2); - await tapDone(); - - test_fixture.step(() => { - assert_equals( - Object.keys(listeners).length, 0, - `Missing tests for ${Object.keys(listeners).join(', ')}`); - test_fixture.done(); - }); - }; -</script> -<body> - <div id="square1"></div> - <div> - <iframe id="innerFrame" srcdoc=' - <style> - html { - touch-action: none; - } - #square2 { - background-color: green; - border: 1px solid black; - height: 50px; - width: 50px; - display: inline-block; - } - </style> - <body> - <div id="square2"></div> - </body> - '></iframe> - </div> - <!-- Used to detect a sentinel event. Once triggered, all other events must - have been processed. --> - <div> - <button id="done">done</button> - </div> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/resources/pointerevent_attributes_hoverable_pointers-iframe.html b/third_party/blink/web_tests/external/wpt/pointerevents/resources/pointerevent_attributes_hoverable_pointers-iframe.html deleted file mode 100644 index 5e55868..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/resources/pointerevent_attributes_hoverable_pointers-iframe.html +++ /dev/null
@@ -1,10 +0,0 @@ -<!doctype html> -<html> - <head> - <meta name="viewport" content="width=device-width"> - <link rel="stylesheet" type="text/css" href="../pointerevent_styles.css"> - </head> - <body> - <div id="square2" class="square"></div> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-helpers.sub.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-helpers.sub.js index 44cb57a6..cf58181 100644 --- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-helpers.sub.js +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-helpers.sub.js
@@ -8,7 +8,8 @@ // - errors. // // See: static-router-sw.js for details. -const get_info_from_worker = async worker => { +const get_info_from_worker = + async worker => { const promise = new Promise(function(resolve) { var channel = new MessageChannel(); channel.port1.onmessage = function(msg) { resolve(msg); }; @@ -20,7 +21,8 @@ } // Reset information stored inside ServiceWorker. -const reset_info_in_worker = async worker => { +const reset_info_in_worker = + async worker => { const promise = new Promise(function(resolve) { var channel = new MessageChannel(); channel.port1.onmessage = function(msg) { resolve(msg); }; @@ -31,8 +33,11 @@ // Register the ServiceWorker and wait until activated. // {ruleKey} represents the key of routerRules defined in router-rules.js. -const registerAndActivate = async (test, ruleKey) => { - const swScript = 'resources/static-router-sw.js'; +// {swScript} represents the service worker source URL. +const registerAndActivate = async (test, ruleKey, swScript) => { + if (!swScript) { + swScript = 'resources/static-router-sw.js' + } const swURL = `${swScript}?key=${ruleKey}`; const swScope = 'resources/'; const reg = await service_worker_unregister_and_register( @@ -43,3 +48,21 @@ return worker; }; + +// Create iframe with the given url. This automatically removes the iframe in a +// cleanup. +const createIframe = async (t, url) => { + const iframe = await with_iframe(url); + t.add_cleanup(() => iframe.remove()); + + return iframe; +}; + +// Register a service worker, then create an iframe at url. +function iframeTest(url, ruleKey, callback, name) { + return promise_test(async t => { + const worker = await registerAndActivate(t, ruleKey); + const iframe = await createIframe(t, url); + await callback(t, iframe.contentWindow, worker); + }, name); +};
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-no-fetch-handler-sw.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-no-fetch-handler-sw.js new file mode 100644 index 0000000..1ba5fd7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-no-fetch-handler-sw.js
@@ -0,0 +1,35 @@ +'use strict'; + +import {routerRules} from './router-rules.js'; +import { + recordError, + getRecords, + resetRecords } from './static-router-sw.sub.js'; + +self.addEventListener('install', async e => { + e.waitUntil(caches.open('v1').then( + cache => {cache.put('cache.txt', new Response('From cache'))})); + + const params = new URLSearchParams(location.search); + const key = params.get('key'); + try { + await e.addRoutes(routerRules[key]); + } catch (e) { + recordError(e); + } + self.skipWaiting(); +}); + +self.addEventListener('activate', e => { + e.waitUntil(clients.claim()); +}); + +self.addEventListener('message', function(event) { + if (event.data.reset) { + resetRecords(); + } + if (event.data.port) { + const {requests, errors} = getRecords(); + event.data.port.postMessage({requests, errors}); + } +});
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.js index d2ce2c4..67702a2 100644 --- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.js +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.js
@@ -1,9 +1,11 @@ 'use strict'; import {routerRules} from './router-rules.js'; - -var requests = []; -var errors = []; +import { + recordRequest, + recordError, + getRecords, + resetRecords } from './static-router-sw.sub.js'; self.addEventListener('install', async e => { e.waitUntil(caches.open('v1').then( @@ -14,7 +16,7 @@ try { await e.addRoutes(routerRules[key]); } catch (e) { - errors.push(e); + recordError(e); } self.skipWaiting(); }); @@ -24,20 +26,18 @@ }); self.addEventListener('fetch', function(event) { - requests.push({url: event.request.url, mode: event.request.mode}); + recordRequest(event.request); const url = new URL(event.request.url); const nonce = url.searchParams.get('nonce'); event.respondWith(new Response(nonce)); }); self.addEventListener('message', function(event) { - let r = requests; - let e = errors; if (event.data.reset) { - requests = []; - errors = []; + resetRecords(); } if (event.data.port) { - event.data.port.postMessage({requests: r, errors: e}); + const {requests, errors} = getRecords(); + event.data.port.postMessage({requests, errors}); } });
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.sub.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.sub.js new file mode 100644 index 0000000..e12a588 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/resources/static-router-sw.sub.js
@@ -0,0 +1,29 @@ +var requests = []; +var errors = []; + +const recordRequest = req => { + requests.push({url: req.url, mode: req.mode}); +}; + +const recordError = (error) => { + errors.push(error); +}; + +const getRecords = () => { + return { + requests, + errors + }; +} + +const resetRecords = () => { + requests = []; + errors = []; +} + +export { + recordRequest, + recordError, + getRecords, + resetRecords +};
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html index 9be7d74c..d9a3d2c 100644 --- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-main-resource.https.html
@@ -7,9 +7,9 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helpers.sub.js"></script> +<script src="resources/static-router-helpers.sub.js"></script> <body> <script> -const SCRIPT = 'resources/static-router-sw.js'; const ROUTER_RULE_KEY = 'condition-urlpattern-constructed-source-network'; const ROUTER_RULE_KEY_IGNORE_CASE = 'condition-urlpattern-constructed-ignore-case-source-network'; @@ -19,7 +19,6 @@ const ROUTER_RULE_KEY_URLPATTERN_CACHE = 'condition-urlpattern-string-source-cache'; const ROUTER_RULE_KEY_REQUEST_CACHE = 'condition-request-navigate-source-cache'; -const SCOPE = 'resources/'; const REGISTERED_ROUTE = 'resources/direct.txt'; const ADDITIONAL_REGISTERED_ROUTE = 'resources/direct.html'; const CACHED_ROUTE = 'resources/cache.txt'; @@ -27,63 +26,25 @@ const host_info = get_host_info(); const path = new URL(".", window.location).pathname; -const registerAndActivate = async (t, ruleKey) => { - const swURL = `${SCRIPT}?key=${ruleKey}`; - const reg = await service_worker_unregister_and_register( - t, swURL, SCOPE, { type: 'module' }); - add_completion_callback(() => reg.unregister()); - const worker = reg.installing; - await wait_for_state(t, worker, 'activated'); - - return worker; -}; - -const createIframe = async (t, url) => { - const iframe = await with_iframe(url); - t.add_cleanup(() => iframe.remove()); - - return iframe; -}; - -// Register a service worker, then create an iframe at url. -function iframeTest(url, ruleKey, callback, name) { - return promise_test(async t => { - const worker = await registerAndActivate(t, ruleKey); - const iframe = await createIframe(t, url); - await callback(t, iframe.contentWindow, worker); - }, name); -} - -const get_fetched_urls = async worker => { - const promise = new Promise(function(resolve) { - var channel = new MessageChannel(); - channel.port1.onmessage = function(msg) { resolve(msg); }; - worker.postMessage({port: channel.port2}, [channel.port2]); - }); - const message = await promise; - - return message.data; -} - iframeTest(REGISTERED_ROUTE, ROUTER_RULE_KEY, async (t, iwin, worker) => { - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); assert_equals(requests.length, 0); assert_equals(iwin.document.body.innerText, "Network\n"); }, 'Main resource load matched with the condition'); iframeTest(REGISTERED_ROUTE, ROUTER_RULE_KEY_IGNORE_CASE, async (t, iwin, worker) => { - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); assert_equals(requests.length, 0); assert_equals(iwin.document.body.innerText, "Network\n"); }, 'Main resource load matched with the ignore case condition'); iframeTest(REGISTERED_ROUTE, ROUTER_RULE_KEY_RESPECT_CASE, async (t, iwin, worker) => { - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); assert_equals(requests.length, 1); }, 'Main resource load matched without the ignore case condition'); iframeTest(NON_REGISTERED_ROUTE, ROUTER_RULE_KEY, async (t, iwin, worker) => { - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); assert_equals(requests.length, 1); assert_equals( requests[0].url, @@ -102,18 +63,18 @@ const second_iframe = await createIframe(t, ADDITIONAL_REGISTERED_ROUTE); assert_equals(second_iframe.contentWindow.document.body.innerText, "Here's a direct html from network."); - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); assert_equals(requests.length, 0); }, 'Main reosurce load matched with the service worker having multiple rules'); iframeTest(CACHED_ROUTE, ROUTER_RULE_KEY_URLPATTERN_CACHE, async (t, iwin, worker) => { - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); assert_equals(requests.length, 0); assert_equals(iwin.document.body.innerText, "From cache"); }, 'Main resource load matched with the cache source'); iframeTest(NON_REGISTERED_ROUTE, ROUTER_RULE_KEY_REQUEST_CACHE, async (t, iwin, worker) => { - const {requests} = await get_fetched_urls(worker); + const {requests} = await get_info_from_worker(worker); // When the request matched to the rule with the "cache" source but failed to // get the cache entry, the fetch handler is not involved and the network // fallback is triggered instead.
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-no-fetch-handler.https.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-no-fetch-handler.https.html new file mode 100644 index 0000000..64678ee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/tentative/static-router/static-router-no-fetch-handler.https.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title> + Static Router: routers are evaluated when there is no fetch handler. +</title> +<script src="/common/get-host-info.sub.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"> +</script> +<script src="resources/static-router-helpers.sub.js"> +</script> +<body> +<script> +const RULE_KEY = 'condition-urlpattern-string-source-cache'; +const SW_SRC = 'resources/static-router-no-fetch-handler-sw.js'; +const CACHED_FILE = 'cache.txt'; + +promise_test(async t => { + const worker = await registerAndActivate(t, RULE_KEY, SW_SRC); + + // Matched with the main reosurce load. + const {contentWindow} = await createIframe(t, `resources/${CACHED_FILE}`); + assert_equals(contentWindow.document.body.innerText, "From cache"); + + // TODO: Matched with the subreosurce load. +}, 'The router rule is evaluated without fetch handlers in service worker'); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt deleted file mode 100644 index 3771970..0000000 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] getStats() audio and video validate all mandatory stats - assert_equals: Expect dictionary.sdpFmtpLine to be string expected "string" but got "undefined" -[FAIL] getStats() with connected peer connections having tracks and data channel should return all mandatory to implement stats - assert_unreached: test failed with error: Error: assert_equals: Expect dictionary.sdpFmtpLine to be string expected "string" but got "undefined" Reached unreachable code -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html index 4889bcf..66cbedb 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html
@@ -177,22 +177,6 @@ assert_stats_report_has_stats(statsReport, ['outbound-rtp']); }, 'getStats() video outbound-rtp contains all mandatory stats'); - promise_test(async t => { - const pc = createPeerConnectionWithCleanup(t); - const pc2 = createPeerConnectionWithCleanup(t); - const [audioTrack, audioStream] = await getTrackFromUserMedia('audio'); - pc.addTrack(audioTrack, audioStream); - const [videoTrack, videoStream] = await getTrackFromUserMedia('video'); - pc.addTrack(videoTrack, videoStream); - exchangeIceCandidates(pc, pc2); - await Promise.all([ - exchangeOfferAnswer(pc, pc2), - new Promise(r => pc2.ontrack = e => e.track.onunmute = r) - ]); - const statsReport = await pc.getStats(); - validateStatsReport(statsReport); - }, 'getStats() audio and video validate all mandatory stats'); - /* 8.5. The stats selection algorithm 3. If selector is an RTCRtpSender, gather stats for and add the following objects @@ -264,131 +248,6 @@ getRequiredStats(stats, 'inbound-rtp'); }, `getStats() inbound-rtp contains all mandatory stats`); - /* - 8.6 Mandatory To Implement Stats - An implementation MUST support generating statistics of the following types - when the corresponding objects exist on a PeerConnection, with the attributes - that are listed when they are valid for that object. - */ - - const mandatoryStats = [ - "codec", - "inbound-rtp", - "outbound-rtp", - "remote-inbound-rtp", - "remote-outbound-rtp", - "media-source", - "peer-connection", - "data-channel", - "sender", - "receiver", - "transport", - "candidate-pair", - "local-candidate", - "remote-candidate", - "certificate" - ]; - - async_test(t => { - const pc1 = new RTCPeerConnection(); - t.add_cleanup(() => pc1.close()); - const pc2 = new RTCPeerConnection(); - t.add_cleanup(() => pc2.close()); - - const dataChannel = pc1.createDataChannel('test-channel'); - - getNoiseStream({ - audio: true, - video: true - }) - .then(t.step_func(mediaStream => { - const tracks = mediaStream.getTracks(); - const [audioTrack] = mediaStream.getAudioTracks(); - const [videoTrack] = mediaStream.getVideoTracks(); - - for (const track of mediaStream.getTracks()) { - t.add_cleanup(() => track.stop()); - pc1.addTrack(track, mediaStream); - } - - const testStatsReport = (pc, statsReport) => { - validateStatsReport(statsReport); - assert_stats_report_has_stats(statsReport, mandatoryStats); - - const dataChannelStats = findStatsFromReport(statsReport, - stats => { - return stats.type === 'data-channel' && - stats.dataChannelIdentifier === dataChannel.id; - }, - 'Expect data channel stats to be found'); - - assert_equals(dataChannelStats.label, 'test-channel'); - - /* TODO track stats are obsolete - replace with sender/receiver? */ - const audioTrackStats = findStatsFromReport(statsReport, - stats => { - return stats.type === 'track' && - stats.trackIdentifier === audioTrack.id; - }, - 'Expect audio track stats to be found'); - - assert_equals(audioTrackStats.kind, 'audio'); - - const videoTrackStats = findStatsFromReport(statsReport, - stats => { - return stats.type === 'track' && - stats.trackIdentifier === videoTrack.id; - }, - 'Expect video track stats to be found'); - - assert_equals(videoTrackStats.kind, 'video'); - } - - const onConnected = t.step_func(() => { - // Wait a while for the peer connections to collect stats - t.step_timeout(() => { - Promise.all([ - /* TODO: for both pc1 and pc2 to expose all mandatory stats, they need to both send/receive tracks and data channels */ - pc1.getStats() - .then(statsReport => testStatsReport(pc1, statsReport)), - - pc2.getStats() - .then(statsReport => testStatsReport(pc2, statsReport)) - ]) - .then(t.step_func_done()) - .catch(t.step_func(err => { - assert_unreached(`test failed with error: ${err}`); - })); - }, 200) - }) - - let onTrackCount = 0 - let onDataChannelCalled = false - - pc2.addEventListener('track', t.step_func(() => { - onTrackCount++; - if (onTrackCount === 2 && onDataChannelCalled) { - onConnected(); - } - })); - - pc2.addEventListener('datachannel', t.step_func(() => { - onDataChannelCalled = true; - if (onTrackCount === 2) { - onConnected(); - } - })); - - - exchangeIceCandidates(pc1, pc2); - exchangeOfferAnswer(pc1, pc2); - })) - .catch(t.step_func(err => { - assert_unreached(`test failed with error: ${err}`); - })); - - }, `getStats() with connected peer connections having tracks and data channel should return all mandatory to implement stats`); - promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close());
diff --git a/third_party/blink/web_tests/flag-specific/enable-skia-graphite/virtual/text-antialias/mac-system-ui-slant-expected.png b/third_party/blink/web_tests/flag-specific/enable-skia-graphite/virtual/text-antialias/mac-system-ui-slant-expected.png new file mode 100644 index 0000000..c6a707a --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-skia-graphite/virtual/text-antialias/mac-system-ui-slant-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-skia-graphite/virtual/text-antialias/mac-system-ui-weight-expected.png b/third_party/blink/web_tests/flag-specific/enable-skia-graphite/virtual/text-antialias/mac-system-ui-weight-expected.png new file mode 100644 index 0000000..f189e0a0 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-skia-graphite/virtual/text-antialias/mac-system-ui-weight-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/devtools/indexeddb/database-version-number-expected.txt b/third_party/blink/web_tests/http/tests/devtools/indexeddb/database-version-number-expected.txt deleted file mode 100644 index 23f9b9735..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/indexeddb/database-version-number-expected.txt +++ /dev/null
@@ -1,35 +0,0 @@ -Tests that database names are correctly loaded and saved in IndexedDBModel. - -Dumping database: -Dumping database: -testDatabase1 - version: 2147483647 - objectStores: - -Dumping database: -testDatabase1 - version: 2147483648 - objectStores: - testObjectStore1 - keyPath: "test.key.path" - autoIncrement: true - indexes: - -Dumping database: -testDatabase1 - version: 2147483649 - objectStores: - testObjectStore1 - keyPath: "test.key.path" - autoIncrement: true - indexes: - testObjectStore2 - keyPath: null - autoIncrement: false - indexes: - -VM:3 InspectorTest.IndexedDB_callback1 -VM:3 InspectorTest.IndexedDB_callback2 -VM:3 InspectorTest.IndexedDB_callback3 -VM:3 InspectorTest.IndexedDB_callback4 -
diff --git a/third_party/blink/web_tests/http/tests/devtools/indexeddb/database-version-number.js b/third_party/blink/web_tests/http/tests/devtools/indexeddb/database-version-number.js deleted file mode 100644 index d504e56..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/indexeddb/database-version-number.js +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {TestRunner} from 'test_runner'; -import {ApplicationTestRunner} from 'application_test_runner'; -import {ConsoleTestRunner} from 'console_test_runner'; - -import * as Application from 'devtools/panels/application/application.js'; - -(async function() { - TestRunner.addResult(`Tests that database names are correctly loaded and saved in IndexedDBModel.\n`); - // Note: every test that uses a storage API must manually clean-up state from previous tests. - await ApplicationTestRunner.resetState(); - - var indexedDBModel = ApplicationTestRunner.createIndexedDBModel(); - var mainFrameId = TestRunner.resourceTreeModel.mainFrame.id; - var databaseName = 'testDatabase1'; - var storageKey = 'http://127.0.0.1:8000/'; - var databaseId = new Application.IndexedDBModel.DatabaseId({storageKey}, databaseName); - - function dumpDatabase() { - TestRunner.addResult('Dumping database:'); - const database = indexedDBModel.databasesInternal.get(databaseId); - if (!database) - return; - TestRunner.addResult(database.databaseId.name); - TestRunner.addResult(' version: ' + database.version); - TestRunner.addResult(' objectStores:'); - const objectStoreNames = [...database.objectStores.keys()]; - objectStoreNames.sort(); - for (const objectStoreName of objectStoreNames) { - const objectStore = database.objectStores.get(objectStoreName); - TestRunner.addResult(' ' + objectStore.name); - TestRunner.addResult(' keyPath: ' + JSON.stringify(objectStore.keyPath)); - TestRunner.addResult(' autoIncrement: ' + objectStore.autoIncrement); - TestRunner.addResult(' indexes: '); - const indexNames = [...objectStore.indexes.keys()]; - indexNames.sort(); - for (const indexName of indexNames) { - const index = objectStore.indexes.get(indexName); - TestRunner.addResult(' ' + index.name); - TestRunner.addResult(' keyPath: ' + JSON.stringify(index.keyPath)); - TestRunner.addResult(' unique: ' + index.unique); - TestRunner.addResult(' multiEntry: ' + index.multiEntry); - } - } - TestRunner.addResult(''); -} - - step2(); - - function step2() { - ApplicationTestRunner.createDatabaseWithVersion(mainFrameId, databaseName, 2147483647, step3); - } - - function step3() { - TestRunner.addSniffer(Application.IndexedDBModel.IndexedDBModel.prototype, 'updateStorageKeyDatabaseNames', step4, false); - indexedDBModel.refreshDatabaseNames(); - } - - function step4() { - dumpDatabase(); - - indexedDBModel.addEventListener(Application.IndexedDBModel.Events.DatabaseLoaded, step5); - indexedDBModel.refreshDatabase(databaseId); - } - - function step5() { - indexedDBModel.removeEventListener(Application.IndexedDBModel.Events.DatabaseLoaded, step5); - dumpDatabase(); - - ApplicationTestRunner.createObjectStore( - mainFrameId, databaseName, 'testObjectStore1', 'test.key.path', true, step6); - } - - function step6() { - indexedDBModel.addEventListener(Application.IndexedDBModel.Events.DatabaseLoaded, step7); - indexedDBModel.refreshDatabase(databaseId); - } - - function step7() { - indexedDBModel.removeEventListener(Application.IndexedDBModel.Events.DatabaseLoaded, step7); - dumpDatabase(); - - ApplicationTestRunner.createObjectStore(mainFrameId, databaseName, 'testObjectStore2', null, false, step8); - } - - function step8() { - indexedDBModel.addEventListener(Application.IndexedDBModel.Events.DatabaseLoaded, step9); - indexedDBModel.refreshDatabase(databaseId); - } - - - function step9() { - indexedDBModel.removeEventListener(Application.IndexedDBModel.Events.DatabaseLoaded, step9); - dumpDatabase(); - ApplicationTestRunner.deleteDatabase(mainFrameId, databaseName, step10); - } - - async function step10() { - await ConsoleTestRunner.dumpConsoleMessages(); - TestRunner.completeTest(); - } -})();
diff --git a/third_party/blink/web_tests/inspector-protocol/indexeddb/database-version-number-expected.txt b/third_party/blink/web_tests/inspector-protocol/indexeddb/database-version-number-expected.txt new file mode 100644 index 0000000..0595b584 --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/indexeddb/database-version-number-expected.txt
@@ -0,0 +1,8 @@ +Tests that IndexedDB database version is reported correctly +{ + name : testDatabase1 + objectStores : [ + ] + version : 2147483649 +} +
diff --git a/third_party/blink/web_tests/inspector-protocol/indexeddb/database-version-number.js b/third_party/blink/web_tests/inspector-protocol/indexeddb/database-version-number.js new file mode 100644 index 0000000..e09d8be --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/indexeddb/database-version-number.js
@@ -0,0 +1,21 @@ +// Copyright 2024 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +(async function(/** @type {import('test_runner').TestRunner} */ testRunner) { + var {page, session, dp} = await testRunner.startURL( + '../resources/indexeddb.html', + 'Tests that IndexedDB database version is reported correctly'); + + await dp.IndexedDB.enable(); + await session.evaluateAsync('window.dbPromise'); + + const {result: {databaseWithObjectStores}} = + await dp.IndexedDB.requestDatabase({ + databaseName: 'testDatabase1', + securityOrigin: 'file://', + }); + + testRunner.log(databaseWithObjectStores); + testRunner.completeTest(); +});
diff --git a/third_party/blink/web_tests/inspector-protocol/resources/indexeddb.html b/third_party/blink/web_tests/inspector-protocol/resources/indexeddb.html new file mode 100644 index 0000000..f120a00 --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/resources/indexeddb.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> + <head> + <script> +window.dbPromise = new Promise(resolve => { + var dbRequest = indexedDB.open('testDatabase1', 2147483649); + dbRequest.onsuccess = () => resolve(dbRequest.result); +}); + </script> + </head> +</html>
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-slant-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-slant-expected.png index 04876fd..28e2484 100644 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-slant-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-slant-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-weight-expected.png b/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-weight-expected.png index 02131eb..efb0495 100644 --- a/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-weight-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11/virtual/text-antialias/mac-system-ui-weight-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12/virtual/text-antialias/mac-system-ui-weight-expected.png b/third_party/blink/web_tests/platform/mac-mac12/virtual/text-antialias/mac-system-ui-weight-expected.png index 3cd5b9a13..11eb94fbe 100644 --- a/third_party/blink/web_tests/platform/mac-mac12/virtual/text-antialias/mac-system-ui-weight-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12/virtual/text-antialias/mac-system-ui-weight-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt b/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt index ae2a7b2..ea6c68f 100644 --- a/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt +++ b/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-computed-expected.txt
@@ -1,15 +1,5 @@ This is a testharness.js-based test. -[FAIL] Property text-spacing value 'normal' - assert_equals: expected "normal" but got "space-first" [FAIL] Property text-spacing value 'auto' assert_true: 'auto' is a supported value for text-spacing. expected true got false -[FAIL] Property text-spacing value 'no-autospace' - assert_equals: expected "no-autospace" but got "no-autospace space-first" -[FAIL] Property text-spacing value 'trim-start' - assert_true: 'trim-start' is a supported value for text-spacing. expected true got false -[FAIL] Property text-spacing value 'no-autospace normal' - assert_true: 'no-autospace normal' is a supported value for text-spacing. expected true got false -[FAIL] Property text-spacing value 'normal no-autospace' - assert_true: 'normal no-autospace' is a supported value for text-spacing. expected true got false Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt b/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt index 84f2ac4..4debcfe 100644 --- a/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt +++ b/third_party/blink/web_tests/virtual/css-text-spacing-trim/external/wpt/css/css-text/parsing/text-spacing-valid-expected.txt
@@ -1,11 +1,5 @@ This is a testharness.js-based test. [FAIL] e.style['text-spacing'] = "auto" should set the property value assert_not_equals: property should be set got disallowed value "" -[FAIL] e.style['text-spacing'] = "trim-start" should set the property value - assert_not_equals: property should be set got disallowed value "" -[FAIL] e.style['text-spacing'] = "no-autospace normal" should set the property value - assert_not_equals: property should be set got disallowed value "" -[FAIL] e.style['text-spacing'] = "normal no-autospace" should set the property value - assert_not_equals: property should be set got disallowed value "" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/virtual/mediastreamtrack-transfer/README.md b/third_party/blink/web_tests/virtual/mediastreamtrack-transfer/README.md deleted file mode 100644 index 5f4ce8c..0000000 --- a/third_party/blink/web_tests/virtual/mediastreamtrack-transfer/README.md +++ /dev/null
@@ -1,2 +0,0 @@ -Tests run with the browser feature MediaStreamTrackTransfer enabled. -See crbug.com/1288839. \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/mediastreamtrack-transfer/external/wpt/mediacapture-streams/README.txt b/third_party/blink/web_tests/virtual/mediastreamtrack-transfer/external/wpt/mediacapture-streams/README.txt deleted file mode 100644 index 5f4ce8c..0000000 --- a/third_party/blink/web_tests/virtual/mediastreamtrack-transfer/external/wpt/mediacapture-streams/README.txt +++ /dev/null
@@ -1,2 +0,0 @@ -Tests run with the browser feature MediaStreamTrackTransfer enabled. -See crbug.com/1288839. \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt index b2b49ed..8d1adcb5 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -6208,6 +6208,15 @@ getter target method constructor method toJSON +interface PerformanceLongAnimationFrameTiming : PerformanceEntry + attribute @@toStringTag + getter blockingDuration + getter firstUIEventTimestamp + getter renderStart + getter scripts + getter styleAndLayoutStart + method constructor + method toJSON interface PerformanceLongTaskTiming : PerformanceEntry attribute @@toStringTag getter attribution @@ -6289,6 +6298,18 @@ getter workerStart method constructor method toJSON +interface PerformanceScriptTiming : PerformanceEntry + attribute @@toStringTag + getter executionStart + getter forcedStyleAndLayoutDuration + getter invoker + getter invokerType + getter pauseDuration + getter sourceLocation + getter window + getter windowAttribution + method constructor + method toJSON interface PerformanceServerTiming attribute @@toStringTag getter description
diff --git a/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-slant-expected.png b/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-slant-expected.png index 63fb8838..229891c 100644 --- a/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-slant-expected.png +++ b/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-slant-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight-expected.png b/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight-expected.png index 8460af0..cf79b97 100644 --- a/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight-expected.png +++ b/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight.html b/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight.html index 02ea3c92..5a24971 100644 --- a/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight.html +++ b/third_party/blink/web_tests/virtual/text-antialias/mac-system-ui-weight.html
@@ -5,7 +5,7 @@ } </style> <div style="display: flex;"> -<div style="flex: 1; font-size: 12px;"> +<div style="flex: 1; font-size: 14px;"> <div class="system-ui-font" style="font-weight: 100;">System font at weight 100</div> <div class="system-ui-font" style="font-weight: 200;">System font at weight 200</div> <div class="system-ui-font" style="font-weight: 300;">System font at weight 300</div>
diff --git a/third_party/catapult b/third_party/catapult index d1eeccf..d7ee2f7 160000 --- a/third_party/catapult +++ b/third_party/catapult
@@ -1 +1 @@ -Subproject commit d1eeccf9e4a273c3639d6554c889f8ee3ca9bc0d +Subproject commit d7ee2f7345cc7b989b88c5323f9b3e6e380fb0d5
diff --git a/third_party/chromium-variations b/third_party/chromium-variations index d370e39..a2d67c6 160000 --- a/third_party/chromium-variations +++ b/third_party/chromium-variations
@@ -1 +1 @@ -Subproject commit d370e39f2d5d7ea3b25afcda4acf56682854f097 +Subproject commit a2d67c6b98b7924209af2aae5be3da8a9a4b69a6
diff --git a/third_party/dawn b/third_party/dawn index be3d39c..10d6e1f 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit be3d39c265017ff85a3f7fcd50e52849835e6b02 +Subproject commit 10d6e1fa0349777c9e99b9ad431dcf5806397769
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal index 7fc0271..6ae0c39 160000 --- a/third_party/devtools-frontend-internal +++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@ -Subproject commit 7fc0271543993e57b56c4e628037d320a8e7c3e4 +Subproject commit 6ae0c39dd87c7dc0ffb214eb2e372178eb259345
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index e7083d45..8c6063b 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit e7083d45c07666a4c81a69df7317e741aed20fc2 +Subproject commit 8c6063b58de3e8ce312977c50ed9a9385167be87
diff --git a/third_party/fuzztest/BUILD.gn b/third_party/fuzztest/BUILD.gn index 95ac41c2..09004893 100644 --- a/third_party/fuzztest/BUILD.gn +++ b/third_party/fuzztest/BUILD.gn
@@ -187,9 +187,6 @@ "//testing/libfuzzer:fuzzing_engine", "//third_party/boringssl", ] - } else { - # Other projects sharing fuzztest might not have boringssl. - ldflags = [ "-lcrypto" ] } } @@ -211,6 +208,10 @@ "src/centipede/environment_flags.cc", "src/centipede/environment_flags.h", ] + if (!build_with_chromium) { + # Other projects sharing fuzztest might not have boringssl. + ldflags = [ "-lcrypto" ] + } } }
diff --git a/third_party/perfetto b/third_party/perfetto index bd299c3..d9c3231 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit bd299c3878ebd23de57b0f1cef2811a92c6a3407 +Subproject commit d9c3231123fd6b1d0c1afd49d27c628a3b01c4f6
diff --git a/third_party/skia b/third_party/skia index 21c53af..416d7b0 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 21c53af2e9f593e3378bdb0ead5d8b2c824a3b29 +Subproject commit 416d7b0e5ba1f773fe4c08cd398a1207b6d781f7
diff --git a/third_party/webrtc b/third_party/webrtc index 1b61c71..cc70a6d 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit 1b61c7161edb645153f1f76e1f731443f95e6bfb +Subproject commit cc70a6d1748cd28a9d62fb234ab3f0b48cbebb1e
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp index 5967fbd..6f1c5ae7 100644 --- a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp +++ b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
@@ -202,11 +202,7 @@ if (CXXMethodDecl* trace = info->GetTraceMethod()) { if (info->IsStackAllocated()) reporter_.TraceMethodForStackAllocatedClass(info, trace); -#if defined(LLVM_FORCE_HEAD_REVISION) if (trace->isPureVirtual()) -#else - if (trace->isPure()) -#endif reporter_.ClassDeclaresPureVirtualTrace(info, trace); } else if (info->RequiresTraceMethod()) { reporter_.ClassRequiresTraceMethod(info); @@ -403,11 +399,7 @@ bool BlinkGCPluginConsumer::DeclaresVirtualMethods(CXXRecordDecl* decl) { CXXRecordDecl::method_iterator it = decl->method_begin(); for (; it != decl->method_end(); ++it) -#if defined(LLVM_FORCE_HEAD_REVISION) if (it->isVirtual() && !it->isPureVirtual()) -#else - if (it->isVirtual() && !it->isPure()) -#endif return true; return false; }
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index 06ab632..d0b74809 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -35,8 +35,8 @@ # https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang.md # Reverting problematic clang rolls is safe, though. # This is the output of `git describe` and is usable as a commit-ish. -CLANG_REVISION = 'llvmorg-18-init-16072-gc4146121e940' -CLANG_SUB_REVISION = 5 +CLANG_REVISION = 'llvmorg-18-init-17730-gf670112a' +CLANG_SUB_REVISION = 1 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) RELEASE_VERSION = '18'
diff --git a/tools/clang/translation_unit/TranslationUnitGenerator.cpp b/tools/clang/translation_unit/TranslationUnitGenerator.cpp index ffff76a..47f3b1e 100644 --- a/tools/clang/translation_unit/TranslationUnitGenerator.cpp +++ b/tools/clang/translation_unit/TranslationUnitGenerator.cpp
@@ -131,7 +131,8 @@ current_files_.push(last_inclusion_directive_); } else { current_files_.push(std::string( - source_manager_->getFileEntryForID(source_manager_->getMainFileID()) + source_manager_ + ->getFileEntryRefForID(source_manager_->getMainFileID()) ->getName())); } } else if (reason == ExitFile) { @@ -216,8 +217,9 @@ } void IncludeFinderPPCallbacks::EndOfMainFile() { - const clang::FileEntry* main_file = - source_manager_->getFileEntryForID(source_manager_->getMainFileID()); + clang::OptionalFileEntryRef main_file = + source_manager_->getFileEntryRefForID(source_manager_->getMainFileID()); + assert(main_file.has_value()); SmallVector<char, 100> main_source_file_real_path; SmallVector<char, 100> main_file_name_real_path;
diff --git a/tools/crates/run_cargo.py b/tools/crates/run_cargo.py index 569ecf9..e37059f 100755 --- a/tools/crates/run_cargo.py +++ b/tools/crates/run_cargo.py
@@ -43,15 +43,6 @@ default=DEFAULT_SYSROOT, help='use cargo and rustc from here') (args, cargo_args) = parser.parse_known_args() - - if sys.platform == 'darwin' and platform.machine() == 'arm64': - if args.rust_sysroot == 'third_party/rust-toolchain': - args.rust_sysroot = os.path.expanduser( - '~/.rustup/toolchains/nightly-aarch64-apple-darwin') - print('No "cargo" provided in the Chromium toolchain on Mac-ARM. ' - 'Install cargo nightly to ~/.rustup or use --rust-sysroot:') - print("== To install: `rustup install nightly`") - return RunCargo(args.rust_sysroot, None, cargo_args)
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 0bf7cb9..d826a5a 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -39490,6 +39490,11 @@ <description>Please enter the description of this user action.</description> </action> +<action name="UniversalInstallFromMenu"> + <owner>Please list the metric's owners. Add more owner tags as needed.</owner> + <description>Please enter the description of the metric.</description> +</action> + <action name="Unlink"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b3db1ae..fbf69a7 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -3057,6 +3057,8 @@ <int value="-402" label="CACHE_WRITE_FAILURE"/> <int value="-401" label="CACHE_READ_FAILURE"/> <int value="-400" label="CACHE_MISS"/> + <int value="-386" label="ZSTD_WINDOW_SIZE_TOO_BIG"/> + <int value="-385" label="BLOCKED_BY_PRIVATE_NETWORK_ACCESS_CHECKS"/> <int value="-384" label="CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_LOCAL_NETWORK_ACCESS_POLICY"/> <int value="-383" label="INCONSISTENT_IP_ADDRESS_SPACE"/> @@ -11173,6 +11175,9 @@ <int value="4780" label="CapturedSurfaceControl"/> <int value="4781" label="ElementGetHTML"/> <int value="4782" label="ElementAttachSerializableShadow"/> + <int value="4783" label="CSSBareDeclarationShift"/> + <int value="4784" label="CSSNestedGroupRuleSpecificity"/> + <int value="4785" label="CSSRuleWithSignalingChildModified"/> </enum> <enum name="FeaturePolicyFeature"> @@ -16522,6 +16527,7 @@ <int value="-1875168316" label="UseMonitorColorSpace:disabled"/> <int value="-1874908826" label="enable-instant-search-clicks"/> <int value="-1874842483" label="FeedLoadingPlaceholder:disabled"/> + <int value="-1874349308" label="PwaUniversalInstallUi:enabled"/> <int value="-1874141108" label="NewOmniboxAnswerTypes:enabled"/> <int value="-1872989945" label="enable-webview-based-signin"/> <int value="-1872867546" label="EnumerateAudioDevices:disabled"/> @@ -17278,7 +17284,6 @@ <int value="-1514717827" label="ConvertTrackpadEventsToMouse:enabled"/> <int value="-1514611301" label="enable-data-reduction-proxy-bypass-warnings"/> <int value="-1513112313" label="AudioSettingsPage:enabled"/> - <int value="-1513034305" label="UniversalInstallUi:enabled"/> <int value="-1512656386" label="disable-new-audio-rendering-mixing-strategy"/> <int value="-1512555526" label="PaintPreviewShowOnStartup:enabled"/> <int value="-1511549741" label="verbose-logging-in-nacl"/> @@ -19440,7 +19445,6 @@ <int value="-518104091" label="NewAudioRenderingMixingStrategy:enabled"/> <int value="-518037829" label="ProjectorExcludeTranscript:disabled"/> <int value="-517913118" label="OmahaMinSdkVersionAndroid:enabled"/> - <int value="-517279198" label="UniversalInstallUi:disabled"/> <int value="-516845951" label="enable-embedded-extension-options"/> <int value="-516269317" label="HttpsFirstModeV2:enabled"/> <int value="-515913489" label="EphemeralTabUsingBottomSheet:disabled"/> @@ -20645,6 +20649,7 @@ <int value="41881657" label="MessagesForAndroidAdsBlocked:enabled"/> <int value="41990393" label="ContextMenuGoogleLensChip:enabled"/> <int value="42098736" label="TranslateAndroidManualTrigger:disabled"/> + <int value="42780498" label="PwaUniversalInstallUi:disabled"/> <int value="42844603" label="AndroidSurfaceControl:disabled"/> <int value="42881842" label="EnablePenetratingImageSelection:disabled"/> <int value="43949416" label="Journeys:enabled"/> @@ -26809,6 +26814,8 @@ <int value="383" label="INCONSISTENT_IP_ADDRESS_SPACE"/> <int value="384" label="CACHED_IP_ADDRESS_SPACE_BLOCKED_BY_LOCAL_NETWORK_ACCESS_POLICY"/> + <int value="385" label="BLOCKED_BY_PRIVATE_NETWORK_ACCESS_CHECKS"/> + <int value="386" label="ZSTD_WINDOW_SIZE_TOO_BIG"/> <int value="400" label="CACHE_MISS"/> <int value="401" label="CACHE_READ_FAILURE"/> <int value="402" label="CACHE_WRITE_FAILURE"/>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index e24a843a..786b95b 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -2823,16 +2823,6 @@ </token> </histogram> -<histogram name="Autofill.NewerStreetAddressWithSameStatusIsChosen" - enum="Boolean" expires_after="2024-06-02"> - <owner>jihadghanna@google.com</owner> - <owner>chrome-autofill-alerts@google.com</owner> - <summary> - Logs whether a street address merge operation favored the new or old address - because of the feature `kAutofillConvergeToExtremeLengthStreetAddress`. - </summary> -</histogram> - <histogram name="Autofill.NumberOfAutofilledFieldsAtSubmission.{AcceptanceStatus}" units="fields" expires_after="2024-06-30">
diff --git a/tools/metrics/histograms/metadata/media/enums.xml b/tools/metrics/histograms/metadata/media/enums.xml index 05669b4..c2945d8a 100644 --- a/tools/metrics/histograms/metadata/media/enums.xml +++ b/tools/metrics/histograms/metadata/media/enums.xml
@@ -1006,21 +1006,6 @@ label="Failed as no factory associated with the profile found"/> </enum> -<enum name="GetOutputDeviceInfoCacheHit"> - <int value="0" label="Miss: no cached sink found"> - Output parmeters for a device are requested, and there is no corresponding - sink cached; new sink is created and cached. - </int> - <int value="1" label="Miss: cannot lookup by session id"> - If session id is used to specify a device, we always have to create and - cache a new sink. - </int> - <int value="2" label="Hit"> - Output parmeters for a device are requested, and there is a corresponding - sink cached. - </int> -</enum> - <enum name="GlobalMediaControlsCastMode"> <int value="0" label="Presentation"/> <int value="1" label="Remote Playback"/>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index 6339d65..28139c6 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -1202,17 +1202,6 @@ </summary> </histogram> -<histogram - name="Media.Audio.Render.SinkCache.GetOutputDeviceInfoCacheUtilization" - enum="GetOutputDeviceInfoCacheHit" expires_after="2024-02-04"> - <owner>guidou@chromium.org</owner> - <owner>olka@chromium.org</owner> - <summary> - Whether a cached sink was used to get audio output device information, or a - new sink was created for that. - </summary> -</histogram> - <histogram name="Media.Audio.Render.StreamCallbackError2" enum="AudioRenderDeviceError" expires_after="never"> <!-- expires-never: Audio pipeline health metric. -->
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml index ecb47b3..138ad7d 100644 --- a/tools/metrics/histograms/metadata/signin/histograms.xml +++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -1893,7 +1893,7 @@ </histogram> <histogram name="Signin.SyncOptIn.PreSyncConfirmationLatency" units="ms" - expires_after="2024-02-01"> + expires_after="2024-05-01"> <owner>ljjlee@google.com</owner> <owner>chrome-signin-team@google.com</owner> <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 69e05b0..c065d2e 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "perfetto-luci-artifacts/v41.0/linux-arm64/trace_processor_shell" }, "win": { - "hash": "e78dfeee755601b7022c96a672ee56422057bd59", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/bd299c3878ebd23de57b0f1cef2811a92c6a3407/trace_processor_shell.exe" + "hash": "4b8be132aa980f874bc2bd0f45952993941eab5f", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/5dbacf5464d62811e53750cb164fe81ca52c1372/trace_processor_shell.exe" }, "linux_arm": { "hash": "b1a376729d0b7aefc4c38db1348d94d068be07f1", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v41.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "6955f0ab58f04a14af38cad6ce16471a8f0682c3", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/bd299c3878ebd23de57b0f1cef2811a92c6a3407/trace_processor_shell" + "hash": "a9a5a5a489a0d651968a81eaa4072ff702f23828", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d9c3231123fd6b1d0c1afd49d27c628a3b01c4f6/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/search_engine_choice/OWNERS b/tools/search_engine_choice/OWNERS index 4b1c099..a8ff91d 100644 --- a/tools/search_engine_choice/OWNERS +++ b/tools/search_engine_choice/OWNERS
@@ -1 +1 @@ -file://chrome/browser/search_engine_choice/OWNERS +file://components/search_engines/search_engine_choice/OWNERS
diff --git a/tools/traffic_annotation/safe_list.txt b/tools/traffic_annotation/safe_list.txt index 2ca5858..49adedb 100644 --- a/tools/traffic_annotation/safe_list.txt +++ b/tools/traffic_annotation/safe_list.txt
@@ -351,7 +351,6 @@ missing_new_fields,chrome/browser/ash/wallpaper/wallpaper_drivefs_delegate_impl.cc missing_new_fields,chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc missing_new_fields,chromeos/ash/components/trial_group/trial_group_checker.cc -missing_new_fields,chrome/browser/apps/app_service/app_install/web_app_installer.cc missing_new_fields,chrome/browser/ash/net/network_diagnostics/network_diagnostics_util.cc missing_new_fields,chrome/browser/ash/net/network_diagnostics/tls_prober.cc missing_new_fields,chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_impl.cc
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 8c589542..06d91bd4 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -373,7 +373,6 @@ <item id="chromeos_emoji_picker_categories_fetcher" added_in_milestone="111" content_hash_code="081a9095" os_list="chromeos" file_path="chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc" /> <item id="chromeos_emoji_picker_featured_fetcher" added_in_milestone="111" content_hash_code="020b30c7" os_list="chromeos" file_path="chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc" /> <item id="chromeos_emoji_picker_search_fetcher" added_in_milestone="111" content_hash_code="035497ee" os_list="chromeos" file_path="chrome/browser/ui/webui/ash/emoji/gif_tenor_api_fetcher.cc" /> - <item id="app_preload_service_web_installer" added_in_milestone="111" content_hash_code="057d2379" os_list="chromeos" file_path="chrome/browser/apps/app_service/app_install/web_app_installer.cc" /> <item id="network_diagnostics_stun" added_in_milestone="111" content_hash_code="059bf138" os_list="chromeos" file_path="chrome/browser/ash/net/network_diagnostics/network_diagnostics_util.cc" /> <item id="network_diagnostics_tls" added_in_milestone="111" content_hash_code="0170b367" os_list="chromeos" file_path="chrome/browser/ash/net/network_diagnostics/tls_prober.cc" /> <item id="gstatic_fast_checkout_funnels" added_in_milestone="111" content_hash_code="0531d118" os_list="android" file_path="chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_impl.cc" /> @@ -451,4 +450,5 @@ <item id="essential_search_manager" added_in_milestone="122" content_hash_code="0410c589" os_list="chromeos" file_path="chrome/browser/ash/app_list/search/essential_search/socs_cookie_fetcher.cc" /> <item id="pepper_tcp_socket" added_in_milestone="123" content_hash_code="01a37664" os_list="chromeos" file_path="content/browser/renderer_host/pepper/pepper_socket_utils.cc" /> <item id="pepper_udp_socket" added_in_milestone="123" content_hash_code="006ee842" os_list="chromeos" file_path="content/browser/renderer_host/pepper/pepper_socket_utils.cc" /> + <item id="app_install_service_web_app_installer" added_in_milestone="123" content_hash_code="0790ca69" os_list="chromeos" file_path="chrome/browser/apps/app_service/app_install/web_app_installer.cc" /> </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml index 88fc0a2..af1c6d4 100644 --- a/tools/traffic_annotation/summary/grouping.xml +++ b/tools/traffic_annotation/summary/grouping.xml
@@ -252,7 +252,6 @@ <annotation id="chromeos_emoji_picker_categories_fetcher"/> <annotation id="chromeos_emoji_picker_featured_fetcher"/> <annotation id="chromeos_emoji_picker_search_fetcher"/> - <annotation id="app_preload_service_web_installer"/> <annotation id="network_diagnostics_stun"/> <annotation id="network_diagnostics_tls"/> <annotation id="chromeos_emoji_picker_posts_fetcher"/> @@ -309,6 +308,7 @@ <annotation id="essential_search_manager"/> <annotation id="pepper_tcp_socket"/> <annotation id="pepper_udp_socket"/> + <annotation id="app_install_service_web_app_installer"/> </sender> </group> <group name="Admin Features" hidden="true">
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h index 44d7ce2b..6a25bb2a 100644 --- a/ui/accessibility/ax_event_generator.h +++ b/ui/accessibility/ax_event_generator.h
@@ -14,6 +14,7 @@ #include <vector> #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/scoped_observation.h" #include "ui/accessibility/ax_event_intent.h" #include "ui/accessibility/ax_export.h" @@ -156,9 +157,7 @@ ~TargetedEvent(); const AXNodeID node_id; - // This field is not a raw_ref<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const EventParams& event_params; + const raw_ref<const EventParams, DanglingUntriaged> event_params; }; class AX_EXPORT Iterator {
diff --git a/ui/accessibility/ax_event_generator_unittest.cc b/ui/accessibility/ax_event_generator_unittest.cc index 8fc8e1d..f7afd0b 100644 --- a/ui/accessibility/ax_event_generator_unittest.cc +++ b/ui/accessibility/ax_event_generator_unittest.cc
@@ -18,7 +18,7 @@ // Required by gmock to print TargetedEvent in a human-readable way. void PrintTo(const AXEventGenerator::TargetedEvent& event, std::ostream* os) { - *os << event.event_params.event << " on " << event.node_id; + *os << event.event_params->event << " on " << event.node_id; } namespace { @@ -37,10 +37,10 @@ PrintToString(expected_node_id)) { const auto& event = arg; std::string failure_message; - if (!Matches(expected_event_type)(event.event_params.event)) { + if (!Matches(expected_event_type)(event.event_params->event)) { failure_message += "Expected event type: " + PrintToString(expected_event_type) + - ", actual event type: " + PrintToString(event.event_params.event); + ", actual event type: " + PrintToString(event.event_params->event); } if (!Matches(expected_node_id)(event.node_id)) { if (!failure_message.empty()) { @@ -172,10 +172,10 @@ << (map_iter != expected_event_map.end()); std::set<AXEventGenerator::Event>& node_events = map_iter->second; - auto event_iter = node_events.find(targeted_event.event_params.event); + auto event_iter = node_events.find(targeted_event.event_params->event); ASSERT_NE(event_iter, node_events.end()) - << "Event=" << targeted_event.event_params.event + << "Event=" << targeted_event.event_params->event << ", on node_id=" << targeted_event.node_id << " NOT found in |expected_event_map|";
diff --git a/ui/accessibility/ax_generated_tree_unittest.cc b/ui/accessibility/ax_generated_tree_unittest.cc index 447fccd..32c2663 100644 --- a/ui/accessibility/ax_generated_tree_unittest.cc +++ b/ui/accessibility/ax_generated_tree_unittest.cc
@@ -423,12 +423,12 @@ const AXNode* node = fat_tree.GetFromId(event.node_id); ASSERT_NE(nullptr, node); if (node->IsIgnored() || - event.event_params.event == + event.event_params->event == AXEventGenerator::Event::IGNORED_CHANGED) { continue; } - actual_events[event.node_id].insert(event.event_params.event); + actual_events[event.node_id].insert(event.event_params->event); } // Now, turn skinny_tree into skinny_tree1 and compare @@ -448,7 +448,7 @@ std::map<AXNodeID, std::set<AXEventGenerator::Event>> expected_events; for (const AXEventGenerator::TargetedEvent& event : skinny_event_generator) - expected_events[event.node_id].insert(event.event_params.event); + expected_events[event.node_id].insert(event.event_params->event); for (auto& entry : expected_events) { AXNodeID node_id = entry.first;
diff --git a/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc b/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc index 076a373..8465cf8 100644 --- a/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc +++ b/ui/accessibility/platform/automation/automation_ax_tree_wrapper.cc
@@ -141,16 +141,17 @@ // Send auto-generated AXEventGenerator events. for (const auto& targeted_event : event_generator_) { if (ShouldIgnoreGeneratedEventForAutomation( - targeted_event.event_params.event)) + targeted_event.event_params->event)) { continue; + } AXEvent generated_event; generated_event.id = targeted_event.node_id; - generated_event.event_from = targeted_event.event_params.event_from; + generated_event.event_from = targeted_event.event_params->event_from; generated_event.event_from_action = - targeted_event.event_params.event_from_action; - generated_event.event_intents = targeted_event.event_params.event_intents; + targeted_event.event_params->event_from_action; + generated_event.event_intents = targeted_event.event_params->event_intents; owner_->SendAutomationEvent(tree_id, mouse_location, generated_event, - targeted_event.event_params.event); + targeted_event.event_params->event); } event_generator_.ClearEvents();
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h index f3dc177..8f0ba3f 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux.h +++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -12,6 +12,7 @@ #include <utility> #include "base/component_export.h" +#include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/strings/utf_offset_string_conversions.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -41,9 +42,7 @@ namespace ui { struct FindInPageResultInfo { - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union - RAW_PTR_EXCLUSION AtkObject* node; + raw_ptr<AtkObject> node; int start_offset; int end_offset; @@ -295,7 +294,7 @@ absl::optional<std::pair<int, int>> GetEmbeddedObjectIndices(); std::string accessible_name_; - + protected: AXPlatformNodeAuraLinux(); @@ -400,13 +399,12 @@ ImplementedAtkInterfaces interface_mask_; // We own a reference to these ref-counted objects. - // These fields are not a raw_ptr<> because of in-out-arg usage. + // RAW_PTR_EXCLUSION: in-out-arg usage. RAW_PTR_EXCLUSION AtkObject* atk_object_ = nullptr; RAW_PTR_EXCLUSION AtkHyperlink* atk_hyperlink_ = nullptr; // A weak pointers which help us track the ATK embeds relation. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #addr-of + // RAW_PTR_EXCLUSION: #addr-of RAW_PTR_EXCLUSION AtkObject* document_parent_ = nullptr; // Whether or not this node (if it is a frame or a window) was
diff --git a/ui/android/java/src/org/chromium/ui/UiUtils.java b/ui/android/java/src/org/chromium/ui/UiUtils.java index da6446f..dd46249 100644 --- a/ui/android/java/src/org/chromium/ui/UiUtils.java +++ b/ui/android/java/src/org/chromium/ui/UiUtils.java
@@ -22,7 +22,6 @@ import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.view.Window; -import android.view.WindowInsetsController; import android.view.WindowManager; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; @@ -33,7 +32,6 @@ import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.annotation.StyleableRes; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.graphics.drawable.DrawableCompat; @@ -441,26 +439,15 @@ } /** - * Sets the status bar icons to dark or light. Note that this is only valid for Android M+. + * Sets the status bar icons to dark or light. Note that this is only valid for + * Android M+. * - * @param window The window used to request updates to the system UI theming. - * @param useDarkIcons Whether the status bar icons should be dark. - */ - public static void setStatusBarIconColor(Window window, boolean useDarkIcons) { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - setStatusBarIconColorApiRAndBelow(window.getDecorView().getRootView(), useDarkIcons); - } else { - setStatusBarIconColorApiSAndAbove(window, useDarkIcons); - } - } - - /** - * Sets the status bar icons to dark or light. Note that this is only valid for Android M+. + * TODO: migrate to WindowInsetsController API for Android R+ (API 30+) * * @param rootView The root view used to request updates to the system UI theming. * @param useDarkIcons Whether the status bar icons should be dark. */ - private static void setStatusBarIconColorApiRAndBelow(View rootView, boolean useDarkIcons) { + public static void setStatusBarIconColor(View rootView, boolean useDarkIcons) { int systemUiVisibility = rootView.getSystemUiVisibility(); // The status bar should always be black in automotive devices to match the black back // button toolbar, so we should not use dark icons. @@ -473,28 +460,6 @@ } /** - * Sets the status bar icons to dark or light. Requires API S+. - * - * @param window The window used to request updates to the system UI theming. - * @param useDarkIcons Whether the status bar icons should be dark. - */ - @RequiresApi(Build.VERSION_CODES.S) - public static void setStatusBarIconColorApiSAndAbove(Window window, boolean useDarkIcons) { - // The status bar should always be black in automotive devices to match the black back - // button toolbar, so we should use dark theme icons. - if (useDarkIcons && !BuildInfo.getInstance().isAutomotive) { - window.getInsetsController() - .setSystemBarsAppearance( - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); - } else { - window.getInsetsController() - .setSystemBarsAppearance( - 0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); - } - } - - /** * @return True if a hardware keyboard is detected. */ public static boolean isHardwareKeyboardAttached() {
diff --git a/ui/base/ime/input_method_base_unittest.cc b/ui/base/ime/input_method_base_unittest.cc index 8375580..d61a103 100644 --- a/ui/base/ime/input_method_base_unittest.cc +++ b/ui/base/ime/input_method_base_unittest.cc
@@ -8,7 +8,6 @@ #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/run_loop.h" #include "base/scoped_observation.h" #include "base/test/task_environment.h" @@ -103,12 +102,8 @@ } private: - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION TextInputClient* previous_client_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION TextInputClient* next_client_ = nullptr; + raw_ptr<TextInputClient> previous_client_ = nullptr; + raw_ptr<TextInputClient> next_client_ = nullptr; bool call_expected_ = false; bool on_will_change_focused_client_called_ = false; bool on_did_change_focused_client_called_ = false;
diff --git a/ui/base/webui/i18n_source_stream_unittest.cc b/ui/base/webui/i18n_source_stream_unittest.cc index 13bead3..6280585 100644 --- a/ui/base/webui/i18n_source_stream_unittest.cc +++ b/ui/base/webui/i18n_source_stream_unittest.cc
@@ -5,7 +5,6 @@ #include <utility> #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "net/base/io_buffer.h" #include "net/base/test_completion_callback.h" #include "net/filter/mock_source_stream.h" @@ -78,9 +77,7 @@ const int buffer_size; const int read_size; const net::MockSourceStream::Mode mode; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION const I18nTest* test; + raw_ptr<const I18nTest> test; }; } // namespace
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb index cce6886f..6d377a4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -95,7 +95,7 @@ <translation id="1742316578210444689">hebreiska, translitterering</translation> <translation id="1747761757048858544">nederländska (Nederländerna)</translation> <translation id="174937106936716857">Totalt antal filer</translation> -<translation id="1755345808328621801">Den här filen är avsedd för en dator med Windows-programvara. Den är inte kompatibel med din enhet, som har Chrome OS. Sök efter en lämplig ersättningsapp i Chrome Web Store.</translation> +<translation id="1755345808328621801">Den här filen är avsedd för en dator med Windows-programvara. Den är inte kompatibel med din enhet, som har ChromeOS. Sök efter en lämplig ersättningsapp i Chrome Web Store.</translation> <translation id="1757915090001272240">Wide Latin</translation> <translation id="1761091787730831947">Dela med <ph name="VM_NAME" /></translation> <translation id="1773212559869067373">Autentiseringscertifikatet godkändes inte lokalt</translation> @@ -243,7 +243,7 @@ <translation id="2949781154072577687">Formaterar <ph name="DRIVE_NAME" /> …</translation> <translation id="2951236788251446349">Manet</translation> <translation id="2958458230122209142">Ont om lagringsutrymme – <ph name="REMAINING_PERCENTAGE" /> % kvar av ditt individuella lagringsutrymme på <ph name="TOTAL_SPACE" />.</translation> -<translation id="2977940621473452797">Den här filen är avsedd för en dator med programvara från Macintosh. Den är inte kompatibel med din enhet, som har Chrome OS. Sök efter en lämplig ersättningsapp i Chrome Web Store.</translation> +<translation id="2977940621473452797">Den här filen är avsedd för en dator med programvara från Macintosh. Den är inte kompatibel med din enhet, som har ChromeOS. Sök efter en lämplig ersättningsapp i Chrome Web Store.</translation> <translation id="2984337792991268709">Idag kl. <ph name="TODAY_DAYTIME" /></translation> <translation id="299638574917407533">franska (Kanada)</translation> <translation id="3003189754374775221">Nätverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" />, signalstyrka <ph name="SIGNAL_STRENGTH" /> %, anslut</translation> @@ -464,7 +464,7 @@ <translation id="4694604912444486114">Apa</translation> <translation id="469612310041132144">kinesiska (snabb inmatningsmetod)</translation> <translation id="4697043402264950621">Fillistan har sorterats efter <ph name="COLUMN_NAME" /> i stigande ordning.</translation> -<translation id="469897186246626197">Den här filen är avsedd för en Windows-dator. Den är inte kompatibel med din enhet, som har Chrome OS. <ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /> om att öppna filer i Chrome OS.</translation> +<translation id="469897186246626197">Den här filen är avsedd för en Windows-dator. Den är inte kompatibel med din enhet, som har ChromeOS. <ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /> om att öppna filer i ChromeOS.</translation> <translation id="4706042980341760088">tamilskt tangentbord (skrivmaskin)</translation> <translation id="4711094779914110278">turkiska</translation> <translation id="4712283082407695269">Öppnar <ph name="PATH" /></translation> @@ -601,7 +601,7 @@ <translation id="5596627076506792578">Fler alternativ</translation> <translation id="5602622065581044566">bulgariskt fonetiskt tangentbord</translation> <translation id="5605830556594064952">USA (dvorak)</translation> -<translation id="5618330573454123917">Den här filen är avsedd för en Macintosh. Den är inte kompatibel med din enhet, som har Chrome OS. <ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /> om att öppna filer i Chrome OS.</translation> +<translation id="5618330573454123917">Den här filen är avsedd för en Macintosh. Den är inte kompatibel med din enhet, som har ChromeOS. <ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /> om att öppna filer i ChromeOS.</translation> <translation id="5625294776298156701">tamilskt tangentbord (Tamil99)</translation> <translation id="5633226425545095130">Om du flyttar det här objektet delas det med alla som har åtkomst till den delade mappen <ph name="DESTINATION_NAME" />.</translation> <translation id="5649768706273821470">Lyssna</translation> @@ -822,7 +822,7 @@ <translation id="7339898014177206373">Nytt fönster</translation> <translation id="7343393116438664539">vietnamesiska (telex)</translation> <translation id="7347346221088620549">Krypterad fil</translation> -<translation id="7357762654218998920">Den här filtypen stöds inte. <ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /> om att öppna filer i Chrome OS.</translation> +<translation id="7357762654218998920">Den här filtypen stöds inte. <ph name="BEGIN_LINK_HELP" />Läs mer<ph name="END_LINK_HELP" /> om att öppna filer i ChromeOS.</translation> <translation id="7359359531237882347"><ph name="NUMBER_OF_ITEMS" /> objekt kopieras ...</translation> <translation id="7375951387215729722">Fillistan har sorterats efter <ph name="COLUMN_NAME" /> i fallande ordning.</translation> <translation id="7377161162143020057">Möjligheten att kopiera den här filen blockeras av administratörspolicyn</translation>
diff --git a/ui/events/event_target.h b/ui/events/event_target.h index 1027691..8785c9b7 100644 --- a/ui/events/event_target.h +++ b/ui/events/event_target.h
@@ -114,8 +114,8 @@ // A handler with a priority. struct PrioritizedHandler { - // `handler` is not a raw_ptr<> for performance reasons: based on this - // sampling profiler result on ChromeOS. go/brp-cros-prof-diff-20230403 + // RAW_PTR_EXCLUSION: Performance reasons: based on this sampling profiler + // result on ChromeOS. go/brp-cros-prof-diff-20230403 RAW_PTR_EXCLUSION EventHandler* handler = nullptr; Priority priority = Priority::kDefault;
diff --git a/ui/gfx/android/android_surface_control_compat.h b/ui/gfx/android/android_surface_control_compat.h index ebb9881..68fc0eb 100644 --- a/ui/gfx/android/android_surface_control_compat.h +++ b/ui/gfx/android/android_surface_control_compat.h
@@ -14,7 +14,6 @@ #include "base/android/scoped_java_ref.h" #include "base/files/scoped_file.h" #include "base/memory/raw_ptr.h" -#include "base/memory/raw_ptr_exclusion.h" #include "base/memory/ref_counted.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" @@ -196,9 +195,7 @@ void DestroyIfNeeded(); int id_; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #union - RAW_PTR_EXCLUSION ASurfaceTransaction* transaction_; + raw_ptr<ASurfaceTransaction> transaction_; OnCommitCb on_commit_cb_; OnCompleteCb on_complete_cb_; bool need_to_apply_ = false;
diff --git a/ui/gfx/color_analysis.cc b/ui/gfx/color_analysis.cc index 63d7cce9..5d9bacde 100644 --- a/ui/gfx/color_analysis.cc +++ b/ui/gfx/color_analysis.cc
@@ -18,7 +18,7 @@ #include "base/check_op.h" #include "base/functional/bind.h" #include "base/functional/callback.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "base/notreached.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkUnPreMultiply.h" @@ -301,9 +301,7 @@ // The set of colors of which this box captures a subset. This vector is not // owned but may be modified during the split operation. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION std::vector<SkColor>* color_space_; + raw_ptr<std::vector<SkColor>> color_space_; // The range of indexes into |color_space_| that are part of this box. gfx::Range color_range_;
diff --git a/ui/gfx/native_widget_types.h b/ui/gfx/native_widget_types.h index 51d412fa..a5584067 100644 --- a/ui/gfx/native_widget_types.h +++ b/ui/gfx/native_widget_types.h
@@ -158,9 +158,7 @@ #if HAS_FEATURE(objc_arc) __unsafe_unretained NSView* ns_view_ = nullptr; #else - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer, #global-scope, #union - // This field also points to Objective-C object. + // RAW_PTR_EXCLUSION: Points to Objective-C object which isn't supported. RAW_PTR_EXCLUSION NSView* ns_view_ = nullptr; #endif };
diff --git a/ui/message_center/public/cpp/notification.h b/ui/message_center/public/cpp/notification.h index dfafd7ed..a1278b6 100644 --- a/ui/message_center/public/cpp/notification.h +++ b/ui/message_center/public/cpp/notification.h
@@ -159,16 +159,16 @@ // and only pass globally defined constants. // TODO(tetsui): Remove the pointer, after fixing VectorIconSource not to // retain VectorIcon reference. https://crbug.com/760866 - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon* vector_small_image = &gfx::kNoneIcon; // Vector image to display on the parent notification of this notification, // illustrating the source of the group notification that this notification // belongs to. Optional. Note that all notification belongs to the same group // should have the same `parent_vector_small_image`. - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #union + // RAW_PTR_EXCLUSION: Never allocated by PartitionAlloc (always points to a + // global), so there is no benefit to using a raw_ptr, only cost. RAW_PTR_EXCLUSION const gfx::VectorIcon* parent_vector_small_image = &gfx::kNoneIcon;
diff --git a/ui/ozone/platform/wayland/host/wayland_data_offer.cc b/ui/ozone/platform/wayland/host/wayland_data_offer.cc index 737ad09c..f19e1d3 100644 --- a/ui/ozone/platform/wayland/host/wayland_data_offer.cc +++ b/ui/ozone/platform/wayland/host/wayland_data_offer.cc
@@ -58,7 +58,10 @@ void WaylandDataOffer::FinishOffer() { if (wl::get_version_of_object(data_offer_.get()) >= WL_DATA_OFFER_FINISH_SINCE_VERSION) { - wl_data_offer_finish(data_offer_.get()); + // As per the spec it is illegal to call finish if no action was received. + if (dnd_action_) { + wl_data_offer_finish(data_offer_.get()); + } } }
diff --git a/ui/views/accessibility/views_ax_tree_manager.cc b/ui/views/accessibility/views_ax_tree_manager.cc index ebf34833..c5a2054 100644 --- a/ui/views/accessibility/views_ax_tree_manager.cc +++ b/ui/views/accessibility/views_ax_tree_manager.cc
@@ -159,7 +159,7 @@ for (const ui::AXEventGenerator::TargetedEvent& targeted_event : event_generator_) { if (ui::AXNode* node = ax_tree_->GetFromId(targeted_event.node_id)) - FireGeneratedEvent(targeted_event.event_params.event, node); + FireGeneratedEvent(targeted_event.event_params->event, node); } event_generator_.ClearEvents(); }
diff --git a/ui/views/layout/box_layout.h b/ui/views/layout/box_layout.h index 38a712d..4e0026b 100644 --- a/ui/views/layout/box_layout.h +++ b/ui/views/layout/box_layout.h
@@ -228,9 +228,8 @@ bool VisibleToLayout() const; private: - // `view_` and `layout_` is not a raw_ptr<> for performance reasons: based - // on this sampling profiler result on ChromeOS. - // go/brp-cros-prof-diff-20230403 + // RAW_PTR_EXCLUSION: Performance reasons: based on this sampling profiler + // result on ChromeOS. go/brp-cros-prof-diff-20230403 RAW_PTR_EXCLUSION View* view_ = nullptr; RAW_PTR_EXCLUSION const BoxLayout* layout_ = nullptr; gfx::Insets margins_;
diff --git a/ui/views/view_model.h b/ui/views/view_model.h index a45457f..164acf2e 100644 --- a/ui/views/view_model.h +++ b/ui/views/view_model.h
@@ -8,7 +8,7 @@ #include <vector> #include "base/check_op.h" -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/rect.h" #include "ui/views/views_export.h" @@ -28,9 +28,7 @@ struct Entry { Entry() = default; - // This field is not a raw_ptr<> because it was filtered by the rewriter - // for: #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION View* view = nullptr; + raw_ptr<View> view = nullptr; gfx::Rect ideal_bounds; }; using Entries = std::vector<Entry>;
diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc index 1b398ba..5786744b 100644 --- a/ui/views/widget/root_view.cc +++ b/ui/views/widget/root_view.cc
@@ -83,10 +83,9 @@ private: base::ScopedObservation<views::View, views::ViewObserver> scoped_observation{ this}; - // Excluded from `raw_ref` rewriter which would otherwise turn this - // into a `raw_ref<raw_ptr<>>`. The current `raw_ptr&` setup is - // intentional and used to observe the pointer without counting as a - // live reference to the underlying memory. + // RAW_PTR_EXCLUSION: Avoid turning this into a `raw_ref<raw_ptr<>>`. The + // current `raw_ptr&` setup is intentional and used to observe the pointer + // without counting as a live reference to the underlying memory. RAW_PTR_EXCLUSION const raw_ptr<views::View, AcrossTasksDanglingUntriaged>& mouse_move_handler_; };
diff --git a/ui/wm/core/capture_controller_unittest.cc b/ui/wm/core/capture_controller_unittest.cc index a2984a8..dccd709b 100644 --- a/ui/wm/core/capture_controller_unittest.cc +++ b/ui/wm/core/capture_controller_unittest.cc
@@ -7,7 +7,7 @@ #include <memory> #include <utility> -#include "base/memory/raw_ptr_exclusion.h" +#include "base/memory/raw_ptr.h" #include "ui/aura/client/capture_delegate.h" #include "ui/aura/env.h" #include "ui/aura/test/aura_test_base.h" @@ -56,12 +56,8 @@ private: bool has_capture_ = false; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION aura::Window* old_capture_ = nullptr; - // This field is not a raw_ptr<> because it was filtered by the rewriter for: - // #constexpr-ctor-field-initializer - RAW_PTR_EXCLUSION aura::Window* new_capture_ = nullptr; + raw_ptr<aura::Window, DanglingUntriaged> old_capture_ = nullptr; + raw_ptr<aura::Window, DanglingUntriaged> new_capture_ = nullptr; bool destroy_old_capture_ = false; };
diff --git a/v8 b/v8 index c5ab7c35..aacf1e1 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit c5ab7c355c16e632dd3cc88d2f32202c9ca9b94a +Subproject commit aacf1e1b503a77d4c030a42a6f8dd8323e4dcecb