diff --git a/DEPS b/DEPS index 73435d6..cd44b558 100644 --- a/DEPS +++ b/DEPS
@@ -300,11 +300,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'ef226c5a7930c04e78f987ff7bfb14f487baf79f', + 'skia_revision': 'ded3a30f03a703181b82d89ed52ffc91d0d25b30', # 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': 'aa5ec7646265bd97a4ecd51d2bdcfeae116253d8', + 'v8_revision': '0f44e4c2a6fe21c4ef4cf1f1fba2aa145209d91d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -387,7 +387,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': '70475a9b48dddc74a07cd67b2be714b98e8458a8', + 'devtools_frontend_revision': '01ca16d2eb9769c9f758a859821c84bbd2f150f1', # 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. @@ -803,7 +803,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'dac084598c86c1719fce71aedab9fcdbcecf54bb', + '40cae7a77511b53c30fb73089d662019aa8006e0', 'condition': 'checkout_android and checkout_src_internal', }, @@ -902,7 +902,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'wfoWtJb_lDzbd2ZM21HQN4vxQg0fMzMkNoKAg0t1jEsC', + 'version': 'DgO5iraLNCzb4PVDYsfAz0VB4EmOfAl5Ktch6jabdisC', }, ], 'dep_type': 'cipd', @@ -913,7 +913,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'kt-cEtZd1GRlCq7RoQ8-SX_0ImshR3OjWx56yBd3prAC', + 'version': 'D9HGEkmYRI7dvDO31rgru_CPZ-5YItG_QFlIMsDKr1oC', }, ], 'dep_type': 'cipd', @@ -924,7 +924,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'UFh2XztXF0_vGJ-n807-b4F47SpGh5j-R9rR7KE1Tr8C', + 'version': 'N3tEBmfSDhrfbY5LHR4_q30LQHWNzClkcL2FUJXfGW8C', }, ], 'dep_type': 'cipd', @@ -1195,7 +1195,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'c039ce12a59be1650e06b0e4b9c362d524444948', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '7e05dbf6aa5ac8c8bf56e8a68140e3619b1bfe92', 'condition': 'checkout_chromeos', }, @@ -1233,7 +1233,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' + '@' + '7b4ebf8878d739aa9fad8fe292301d0613f32a5e', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '7f9702a966933ef94236412434152cebd054500a', 'condition': 'checkout_src_internal', }, @@ -1700,7 +1700,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f7a6f0099ec3287ef9496bac0a27d0405b9fb4c3', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '24fae90b5e4ce0b2b970670e2795f9c258db5033', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1838,7 +1838,7 @@ 'packages': [ { 'package': 'chromium/third_party/turbine', - 'version': 'sTawWbD0GN8RYp6JHHFxxGNi2nNPvuNSuBjIpS4GaD0C', + 'version': 'Foa7uRpVoKr4YoayCKc9EERkjpmGOE3DAUTWFLL7gKEC', }, ], 'condition': 'checkout_android', @@ -1885,7 +1885,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'b033a4f1ae4a0e19ae4d5563fae023001bbf570f', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '15feded162a254474a3aa7c573724b5ed460a57b', + Var('webrtc_git') + '/src.git' + '@' + '13897e67c8e89f9fe377b171e0153dd520fa83ea', # 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. @@ -2005,7 +2005,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'fq0DC9T64wSLTY2rJ31RzPaJfXhu5jkPi_ZC52i3AhwC', + 'version': 'Rue7PaOjH2iBrltijkX5UYgknSeT11RyJbKHS4K4CJ0C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 3c56044..ff9be24 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -471,7 +471,6 @@ "java/src/org/chromium/android_webview/AwDarkMode.java", "java/src/org/chromium/android_webview/AwDevToolsServer.java", "java/src/org/chromium/android_webview/AwFeatureMap.java", - "java/src/org/chromium/android_webview/AwFormDatabase.java", "java/src/org/chromium/android_webview/AwHttpAuthHandler.java", "java/src/org/chromium/android_webview/AwOriginVerificationSchedulerBridge.java", "java/src/org/chromium/android_webview/AwPacProcessor.java", @@ -531,7 +530,6 @@ "java/src/org/chromium/android_webview/AwDisplayCutoutController.java", "java/src/org/chromium/android_webview/AwDisplayModeController.java", "java/src/org/chromium/android_webview/AwFeatureMap.java", - "java/src/org/chromium/android_webview/AwFormDatabase.java", "java/src/org/chromium/android_webview/AwGeolocationPermissions.java", "java/src/org/chromium/android_webview/AwHistogramRecorder.java", "java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn index cd03b2a..6d0883a 100644 --- a/android_webview/browser/BUILD.gn +++ b/android_webview/browser/BUILD.gn
@@ -69,7 +69,6 @@ "aw_feature_map.cc", "aw_field_trials.cc", "aw_field_trials.h", - "aw_form_database.cc", "aw_form_database_service.cc", "aw_form_database_service.h", "aw_http_auth_handler.cc",
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc index 3e266a4..bed698f 100644 --- a/android_webview/browser/aw_browser_context.cc +++ b/android_webview/browser/aw_browser_context.cc
@@ -603,6 +603,14 @@ delegate->ClearPersistedTokens(); } +jboolean AwBrowserContext::HasFormData(JNIEnv* env) { + return GetFormDatabaseService()->HasFormData(); +} + +void AwBrowserContext::ClearFormData(JNIEnv* env) { + return GetFormDatabaseService()->ClearFormData(); +} + base::android::ScopedJavaLocalRef<jobject> AwBrowserContext::GetJavaBrowserContext() { if (!obj_) {
diff --git a/android_webview/browser/aw_browser_context.h b/android_webview/browser/aw_browser_context.h index 558ec494..52caeea 100644 --- a/android_webview/browser/aw_browser_context.h +++ b/android_webview/browser/aw_browser_context.h
@@ -146,6 +146,9 @@ void ClearPersistentOriginTrialStorageForTesting(JNIEnv* env); + jboolean HasFormData(JNIEnv* env); + void ClearFormData(JNIEnv* env); + scoped_refptr<AwContentsOriginMatcher> service_worker_xrw_allowlist_matcher(); void SetExtraHeaders(const GURL& url, const std::string& headers);
diff --git a/android_webview/browser/aw_form_database.cc b/android_webview/browser/aw_form_database.cc deleted file mode 100644 index 19b785e..0000000 --- a/android_webview/browser/aw_form_database.cc +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2013 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_browser_context.h" -#include "android_webview/browser/aw_content_browser_client.h" -#include "android_webview/browser/aw_form_database_service.h" -#include "android_webview/browser_jni_headers/AwFormDatabase_jni.h" -#include "base/android/jni_android.h" -#include "base/time/time.h" - -using base::android::JavaParamRef; - -namespace android_webview { - -namespace { - -AwFormDatabaseService* GetFormDatabaseService() { - AwBrowserContext* context = AwBrowserContext::GetDefault(); - AwFormDatabaseService* service = context->GetFormDatabaseService(); - return service; -} - -} // anonymous namespace - -// static -jboolean JNI_AwFormDatabase_HasFormData(JNIEnv*) { - return GetFormDatabaseService()->HasFormData(); -} - -// static -void JNI_AwFormDatabase_ClearFormData(JNIEnv*) { - GetFormDatabaseService()->ClearFormData(); -} - -} // namespace android_webview
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java index d3da54d..0cdb9c9 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java
@@ -500,8 +500,9 @@ synchronized (mLock) { ensureChromiumStartedLocked(true); if (mWebViewDatabase == null) { - mWebViewDatabase = new WebViewDatabaseAdapter( - mFactory, HttpAuthDatabase.newInstance(context, HTTP_AUTH_DATABASE_FILE)); + mWebViewDatabase = new WebViewDatabaseAdapter(mFactory, + HttpAuthDatabase.newInstance(context, HTTP_AUTH_DATABASE_FILE), + mBrowserContext); } } return mWebViewDatabase;
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java index 795139b..79cf26a 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java
@@ -9,7 +9,7 @@ import com.android.webview.chromium.WebViewChromium.ApiCall; -import org.chromium.android_webview.AwFormDatabase; +import org.chromium.android_webview.AwBrowserContext; import org.chromium.android_webview.HttpAuthDatabase; import org.chromium.base.ThreadUtils; @@ -23,11 +23,13 @@ final class WebViewDatabaseAdapter extends WebViewDatabase { private final WebViewChromiumFactoryProvider mFactory; private final HttpAuthDatabase mHttpAuthDatabase; + private final AwBrowserContext mBrowserContext; - public WebViewDatabaseAdapter( - WebViewChromiumFactoryProvider factory, HttpAuthDatabase httpAuthDatabase) { + public WebViewDatabaseAdapter(WebViewChromiumFactoryProvider factory, + HttpAuthDatabase httpAuthDatabase, AwBrowserContext browserContext) { mFactory = factory; mHttpAuthDatabase = httpAuthDatabase; + mBrowserContext = browserContext; } @Override @@ -126,14 +128,14 @@ @Override public Boolean call() { WebViewChromium.recordWebViewApiCall(ApiCall.WEBVIEW_DATABASE_HAS_FORM_DATA); - return AwFormDatabase.hasFormData(); + return mBrowserContext.hasFormData(); } }); } WebViewChromium.recordWebViewApiCall(ApiCall.WEBVIEW_DATABASE_HAS_FORM_DATA); - return AwFormDatabase.hasFormData(); + return mBrowserContext.hasFormData(); } @Override @@ -145,7 +147,7 @@ @Override public void run() { WebViewChromium.recordWebViewApiCall(ApiCall.WEBVIEW_DATABASE_CLEAR_FORM_DATA); - AwFormDatabase.clearFormData(); + mBrowserContext.clearFormData(); } }); @@ -153,7 +155,7 @@ } WebViewChromium.recordWebViewApiCall(ApiCall.WEBVIEW_DATABASE_CLEAR_FORM_DATA); - AwFormDatabase.clearFormData(); + mBrowserContext.clearFormData(); } private static boolean checkNeedsPost() {
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java index d4ec32c7..21bf705 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java +++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
@@ -39,7 +39,6 @@ private final SharedPreferences mSharedPreferences; private AwGeolocationPermissions mGeolocationPermissions; - private AwFormDatabase mFormDatabase; private AwServiceWorkerController mServiceWorkerController; private AwQuotaManagerBridge mQuotaManagerBridge; @@ -86,13 +85,6 @@ return mGeolocationPermissions; } - public AwFormDatabase getFormDatabase() { - if (mFormDatabase == null) { - mFormDatabase = new AwFormDatabase(); - } - return mFormDatabase; - } - public AwServiceWorkerController getServiceWorkerController() { if (mServiceWorkerController == null) { mServiceWorkerController = @@ -176,6 +168,14 @@ mNativeAwBrowserContext); } + public boolean hasFormData() { + return AwBrowserContextJni.get().hasFormData(mNativeAwBrowserContext); + } + + public void clearFormData() { + AwBrowserContextJni.get().clearFormData(mNativeAwBrowserContext); + } + @CalledByNative public static AwBrowserContext create(long nativeAwBrowserContext, boolean isDefault) { SharedPreferences sharedPreferences; @@ -196,5 +196,7 @@ String[] updateServiceWorkerXRequestedWithAllowListOriginMatcher( long nativeAwBrowserContext, String[] rules); void clearPersistentOriginTrialStorageForTesting(long nativeAwBrowserContext); + boolean hasFormData(long nativeAwBrowserContext); + void clearFormData(long nativeAwBrowserContext); } }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java b/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java deleted file mode 100644 index 6254025..0000000 --- a/android_webview/java/src/org/chromium/android_webview/AwFormDatabase.java +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2013 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.android_webview; - -import org.chromium.base.annotations.JNINamespace; -import org.chromium.base.annotations.NativeMethods; - -/** - * Exposes a subset of Chromium form database to Webview database for managing autocomplete - * functionality. - */ -@JNINamespace("android_webview") -public class AwFormDatabase { - - public static boolean hasFormData() { - return AwFormDatabaseJni.get().hasFormData(); - } - - public static void clearFormData() { - AwFormDatabaseJni.get().clearFormData(); - } - - @NativeMethods - interface Natives { - boolean hasFormData(); - void clearFormData(); - } -}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwBrowserContextFormDataTest.java similarity index 67% rename from android_webview/javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java rename to android_webview/javatests/src/org/chromium/android_webview/test/AwBrowserContextFormDataTest.java index 43d0b2b..41202614 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwBrowserContextFormDataTest.java
@@ -12,11 +12,11 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.android_webview.AwFormDatabase; - -/** AwFormDatabaseTest. */ +/** + * Tests the methods on AwBrowserContext that expose the Chromium form database for the WebView API. + */ @RunWith(AwJUnit4ClassRunner.class) -public class AwFormDatabaseTest { +public class AwBrowserContextFormDataTest { @Rule public AwActivityTestRule mActivityTestRule = new AwActivityTestRule(); @@ -24,8 +24,8 @@ @SmallTest public void testSmoke() { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { - AwFormDatabase.clearFormData(); - Assert.assertFalse(AwFormDatabase.hasFormData()); + mActivityTestRule.getAwBrowserContext().clearFormData(); + Assert.assertFalse(mActivityTestRule.getAwBrowserContext().hasFormData()); }); } }
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index 33d27f0..86f1fc3 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -324,6 +324,7 @@ "../javatests/src/org/chromium/android_webview/test/ArchiveTest.java", "../javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java", "../javatests/src/org/chromium/android_webview/test/AwAutofillTest.java", + "../javatests/src/org/chromium/android_webview/test/AwBrowserContextFormDataTest.java", "../javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java", "../javatests/src/org/chromium/android_webview/test/AwContentsAnchorViewTest.java", "../javatests/src/org/chromium/android_webview/test/AwContentsClientAutoLoginTest.java", @@ -348,7 +349,6 @@ "../javatests/src/org/chromium/android_webview/test/AwDarkModeTest.java", "../javatests/src/org/chromium/android_webview/test/AwDisplayCutoutTest.java", "../javatests/src/org/chromium/android_webview/test/AwFileChooserTest.java", - "../javatests/src/org/chromium/android_webview/test/AwFormDatabaseTest.java", "../javatests/src/org/chromium/android_webview/test/AwImeTest.java", "../javatests/src/org/chromium/android_webview/test/AwJavaBridgeTest.java", "../javatests/src/org/chromium/android_webview/test/AwKeyboardShortcutsTest.java",
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.cc b/ash/ambient/backdrop/ambient_backend_controller_impl.cc index e05fdaa63..de34897 100644 --- a/ash/ambient/backdrop/ambient_backend_controller_impl.cc +++ b/ash/ambient/backdrop/ambient_backend_controller_impl.cc
@@ -501,6 +501,10 @@ return chromeos::ambient::kTimeOfDayBannerImageUrl; } +const char* AmbientBackendControllerImpl::GetTimeOfDayProductName() const { + return chromeos::ambient::kTimeOfDayProductName; +} + void AmbientBackendControllerImpl::FetchScreenUpdateInfoInternal( int num_topics, bool show_pair_personal_portraits,
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.h b/ash/ambient/backdrop/ambient_backend_controller_impl.h index aae35538..5b0408b 100644 --- a/ash/ambient/backdrop/ambient_backend_controller_impl.h +++ b/ash/ambient/backdrop/ambient_backend_controller_impl.h
@@ -47,6 +47,7 @@ std::array<const char*, 2> GetTimeOfDayVideoPreviewImageUrls( AmbientVideo video) const override; const char* GetPromoBannerUrl() const override; + const char* GetTimeOfDayProductName() const override; private: using BackdropClientConfig = chromeos::ambient::BackdropClientConfig;
diff --git a/ash/booting/booting_animation_controller.cc b/ash/booting/booting_animation_controller.cc index e3deba73..f349a350 100644 --- a/ash/booting/booting_animation_controller.cc +++ b/ash/booting/booting_animation_controller.cc
@@ -180,8 +180,15 @@ start_once_ready_ = false; BootingAnimationView* view = widget_->SetContentsView( std::make_unique<BootingAnimationView>(animation_data_)); + auto* animated_image = view->GetAnimatedImage(); + // If there is no animated image set at this point it means that data file + // is invalid and we need to finish the animation immediately. + if (!animated_image) { + std::move(animation_played_callback_).Run(); + return; + } // Observe animation to know when it finishes playing. - scoped_animation_observer_.Observe(view->GetAnimatedImage()); + scoped_animation_observer_.Observe(animated_image); widget_->Show(); view->Play(); }
diff --git a/ash/booting/booting_animation_view.cc b/ash/booting/booting_animation_view.cc index 263c3f1a..6feda94 100644 --- a/ash/booting/booting_animation_view.cc +++ b/ash/booting/booting_animation_view.cc
@@ -7,9 +7,11 @@ #include <string> #include "ash/public/cpp/image_util.h" +#include "base/i18n/rtl.h" #include "cc/paint/skottie_wrapper.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/geometry/size.h" +#include "ui/gfx/geometry/transform.h" #include "ui/lottie/animation.h" #include "ui/views/background.h" #include "ui/views/controls/animated_image_view.h" @@ -61,6 +63,10 @@ SetLayoutManager(std::make_unique<views::FillLayout>()); auto skottie = cc::SkottieWrapper::CreateSerializable( std::vector<uint8_t>(animation_data.begin(), animation_data.end())); + if (!skottie->is_valid()) { + LOG(ERROR) << "Invalid animation data."; + return; + } AddChildView( views::Builder<views::AnimatedImageView>() .CopyAddressTo(&animation_) @@ -78,7 +84,7 @@ } lottie::Animation* BootingAnimationView::GetAnimatedImage() { - return animation_->animated_image(); + return animation_ ? animation_->animated_image() : nullptr; } void BootingAnimationView::OnViewBoundsChanged(View* observed_view) { @@ -93,6 +99,14 @@ // so that its proper bounds become available (they are 0x0 initially) before // starting the animation playback. gfx::Rect previous_animation_bounds = animation_->GetImageBounds(); + + if (base::i18n::IsRTL()) { + gfx::Transform transform; + transform.RotateAboutYAxis(180.0); + transform.Translate(-content_bounds.width(), 0); + animation_->SetTransform(transform); + } + Resize(*animation_); VLOG(1) << "View bounds available. Resized animation with native size " << animation_->animated_image()->GetOriginalSize().ToString()
diff --git a/ash/clipboard/clipboard_history_controller_impl.cc b/ash/clipboard/clipboard_history_controller_impl.cc index 2c9e8dc5..7c7ae6fa 100644 --- a/ash/clipboard/clipboard_history_controller_impl.cc +++ b/ash/clipboard/clipboard_history_controller_impl.cc
@@ -949,6 +949,23 @@ ++pastes_to_be_confirmed_; + if (paste_source == crosapi::mojom::ClipboardHistoryControllerShowSource:: + kControlVLongpress) { + // Because we do not require the user to release Ctrl+V before selecting a + // clipboard history item to paste, the Ctrl+V event we synthesize below may + // be discarded as a perceived continuation of the long press. Preempt this + // scenario by issuing a Ctrl+V release to ensure that the press and release + // below are handled as an independent paste. + // TODO(http://b/283533126): Replace this workaround with a long-term fix. + ui::KeyEvent v_release(ui::ET_KEY_RELEASED, ui::VKEY_V, + ui::EF_CONTROL_DOWN); + host->DeliverEventToSink(&v_release); + + ui::KeyEvent ctrl_release(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, + ui::EF_NONE); + host->DeliverEventToSink(&ctrl_release); + } + ui::KeyEvent ctrl_press(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::EF_NONE); host->DeliverEventToSink(&ctrl_press);
diff --git a/ash/in_session_auth/BUILD.gn b/ash/in_session_auth/BUILD.gn index 5234912..381339a2 100644 --- a/ash/in_session_auth/BUILD.gn +++ b/ash/in_session_auth/BUILD.gn
@@ -27,6 +27,7 @@ "//ash/public/cpp", "//ash/resources/vector_icons", "//ash/strings", + "//ash/style", "//base", "//chromeos/ash/components/cryptohome/", "//chromeos/ash/components/dbus/userdataauth",
diff --git a/ash/in_session_auth/auth_dialog_contents_view.cc b/ash/in_session_auth/auth_dialog_contents_view.cc index 031eba02..9c749cd 100644 --- a/ash/in_session_auth/auth_dialog_contents_view.cc +++ b/ash/in_session_auth/auth_dialog_contents_view.cc
@@ -17,6 +17,7 @@ #include "ash/public/cpp/webauthn_dialog_controller.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/strings/grit/ash_strings.h" +#include "ash/style/ash_color_id.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" @@ -25,9 +26,9 @@ #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/base/models/image_model.h" #include "ui/base/resource/resource_bundle.h" #include "ui/compositor/layer.h" -#include "ui/gfx/paint_vector_icon.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/bubble/bubble_border.h" @@ -68,14 +69,6 @@ constexpr base::TimeDelta kFingerprintFailedAnimationDuration = base::Milliseconds(700); -// 38% opacity. -constexpr SkColor kDisabledFingerprintIconColor = - SkColorSetA(gfx::kGoogleGrey900, 97); -constexpr SkColor kBackgroundColor = SK_ColorWHITE; -constexpr SkColor kTextColorSecondary = gfx::kGoogleGrey700; -constexpr SkColor kTextColorPrimary = gfx::kGoogleGrey900; -constexpr SkColor kErrorColor = gfx::kGoogleRed600; - constexpr int kSpacingBeforeButtons = 32; } // namespace @@ -108,7 +101,7 @@ label_ = AddChildView(std::make_unique<FingerprintLabel>()); label_->SetSubpixelRenderingEnabled(false); label_->SetAutoColorReadabilityEnabled(false); - label_->SetEnabledColor(kTextColorPrimary); + label_->SetEnabledColorId(kColorAshTextColorPrimary); label_->SetMultiLine(true); label_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); @@ -118,6 +111,13 @@ FingerprintView& operator=(const FingerprintView&) = delete; ~FingerprintView() override = default; + void OnThemeChanged() override { + views::View::OnThemeChanged(); + if (state_ != FingerprintState::DISABLED_FROM_ATTEMPTS) { + SetIcon(state_); + } + } + void SetState(FingerprintState state) { if (state_ == state) return; @@ -207,18 +207,20 @@ } void SetIcon(FingerprintState state) { - const SkColor color = + const ui::ColorId color_id = (state == FingerprintState::AVAILABLE_DEFAULT || state == FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING - ? kTextColorPrimary - : kDisabledFingerprintIconColor); + ? kColorAshTextColorPrimary + : kColorAshButtonIconDisabledColor); switch (state) { case FingerprintState::UNAVAILABLE: case FingerprintState::AVAILABLE_DEFAULT: case FingerprintState::AVAILABLE_WITH_TOUCH_SENSOR_WARNING: case FingerprintState::DISABLED_FROM_TIMEOUT: - icon_->SetImage(gfx::CreateVectorIcon(kLockScreenFingerprintIcon, - kFingerprintIconSizeDp, color)); + icon_->SetImage( + ui::ImageModel::FromVectorIcon(kLockScreenFingerprintIcon, color_id, + kFingerprintIconSizeDp) + .Rasterize(GetColorProvider())); break; case FingerprintState::DISABLED_FROM_ATTEMPTS: icon_->SetAnimationDecoder( @@ -283,14 +285,14 @@ std::u16string title = l10n_util::GetStringUTF16(IDS_ASH_IN_SESSION_AUTH_TITLE); SetText(title); - SetEnabledColor(kTextColorPrimary); + SetEnabledColorId(kColorAshTextColorPrimary); is_showing_error_ = false; SetAccessibleName(title); } void ShowError(const std::u16string& error_text) { SetText(error_text); - SetEnabledColor(kErrorColor); + SetEnabledColorId(kColorAshTextColorAlert); is_showing_error_ = true; SetAccessibleName(error_text); NotifyAccessibilityEvent(ax::mojom::Event::kAlert, @@ -317,8 +319,8 @@ auth_metadata_(auth_metadata) { SetLayoutManager(std::make_unique<views::FillLayout>()); auto border = std::make_unique<views::BubbleBorder>( - views::BubbleBorder::FLOAT, views::BubbleBorder::STANDARD_SHADOW); - border->SetColor(kBackgroundColor); + views::BubbleBorder::FLOAT, views::BubbleBorder::STANDARD_SHADOW, + ui::kColorPrimaryBackground); border->SetCornerRadius(kCornerRadius); SetBackground(std::make_unique<views::BubbleBackground>(border.get())); SetBorder(std::move(border)); @@ -421,7 +423,7 @@ void AuthDialogContentsView::AddOriginNameView() { origin_name_view_ = container_->AddChildView(std::make_unique<views::Label>()); - origin_name_view_->SetEnabledColor(kTextColorSecondary); + origin_name_view_->SetEnabledColorId(kColorAshTextColorSecondary); origin_name_view_->SetSubpixelRenderingEnabled(false); origin_name_view_->SetAutoColorReadabilityEnabled(false); origin_name_view_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); @@ -537,7 +539,7 @@ base::Unretained(this)), l10n_util::GetStringUTF16(IDS_ASH_IN_SESSION_AUTH_HELP), views::style::CONTEXT_BUTTON)); - help_button_->SetEnabledTextColors(kTextColorPrimary); + help_button_->SetEnabledTextColorIds(kColorAshTextColorPrimary); auto* spacing = action_view_container_->AddChildView( std::make_unique<NonAccessibleView>());
diff --git a/ash/public/cpp/ambient/ambient_backend_controller.h b/ash/public/cpp/ambient/ambient_backend_controller.h index 9539fd24..1dff6c6 100644 --- a/ash/public/cpp/ambient/ambient_backend_controller.h +++ b/ash/public/cpp/ambient/ambient_backend_controller.h
@@ -155,6 +155,10 @@ // Returns the promo banner url to highlight time-of-day wallpapers and screen // saver feature. virtual const char* GetPromoBannerUrl() const = 0; + + // Returns the product name that features the exclusive time of day wallpapers + // and screen savers. + virtual const char* GetTimeOfDayProductName() const = 0; }; } // namespace ash
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc index 0d40161..f78939c 100644 --- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc +++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc
@@ -179,6 +179,10 @@ return kFakeUrl; } +const char* FakeAmbientBackendControllerImpl::GetTimeOfDayProductName() const { + return "Product Name"; +} + void FakeAmbientBackendControllerImpl::ReplyFetchSettingsAndAlbums( bool success, const absl::optional<AmbientSettings>& settings) {
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h index 93853be..43aa5293 100644 --- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h +++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h
@@ -45,6 +45,7 @@ std::array<const char*, 2> GetTimeOfDayVideoPreviewImageUrls( AmbientVideo video) const override; const char* GetPromoBannerUrl() const override; + const char* GetTimeOfDayProductName() const override; // Simulate to reply the request of FetchSettingsAndAlbums(). // If |success| is true, will return fake data.
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 330aee3..1a8bdd9 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -488,7 +488,7 @@ <translation id="3260969790895726815">Řeč se zpracovává místně a diktování funguje offline, ale některé hlasové příkazy nebudou fungovat.</translation> <translation id="3265032511221679826">Zapnout přístup k přesné poloze?</translation> <translation id="3269597722229482060">Kliknutí pravým tlačítkem</translation> -<translation id="3289364673986435196">Nabídka napájení</translation> +<translation id="3289364673986435196">Nabídka vypínače</translation> <translation id="3289544412142055976">Linuxové aplikace v současné době nejsou podporovány</translation> <translation id="3289674678944039601">Nabíjení pomocí adaptéru</translation> <translation id="3290356915286466215">Nezabezpečeno</translation>
diff --git a/ash/webui/file_manager/resources/test_util_swa.js b/ash/webui/file_manager/resources/test_util_swa.js index 9c67834..404aa752 100644 --- a/ash/webui/file_manager/resources/test_util_swa.js +++ b/ash/webui/file_manager/resources/test_util_swa.js
@@ -44,35 +44,32 @@ */ test.swaTestMessageListener = (request) => { request.contentWindow = window.contentWindow || window; - test.util.executeTestMessage(request, (response) => { - response = response === undefined ? '@undefined@' : response; - window.domAutomationController.send(JSON.stringify(response)); + return new Promise(resolve => { + test.util.executeTestMessage(request, (response) => { + response = response === undefined ? '@undefined@' : response; + resolve(JSON.stringify(response)); + }); }); }; let testUtilsLoaded = false; -test.swaLoadTestUtils = async (sendResults=true) => { +test.swaLoadTestUtils = async () => { const scriptUrl = './runtime_loaded_test_util_swa.js'; - let result = false; try { console.log('Loading ' + scriptUrl); await new ScriptLoader(scriptUrl, {type: 'module'}).load(); testUtilsLoaded = true; - result = true; - } finally { - if (sendResults) { - window.domAutomationController.send(result); - } + return true; + } catch { + return false; } - - return result; }; test.getSwaAppId = async () => { if (!testUtilsLoaded) { - await test.swaLoadTestUtils(false); + await test.swaLoadTestUtils(); } - window.domAutomationController.send(String(window.appID)); + return String(window.appID); };
diff --git a/ash/webui/personalization_app/BUILD.gn b/ash/webui/personalization_app/BUILD.gn index 65411b0..95063cb 100644 --- a/ash/webui/personalization_app/BUILD.gn +++ b/ash/webui/personalization_app/BUILD.gn
@@ -42,6 +42,7 @@ "//components/keyed_service/content", "//components/keyed_service/core", "//content/public/browser", + "//ui/chromeos", "//ui/chromeos/styles:cros_styles_views", "//ui/resources:webui_resources_grd_grit", "//ui/webui",
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc index afcd12af..f8ce6b0 100644 --- a/ash/webui/personalization_app/personalization_app_ui.cc +++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -35,6 +35,7 @@ #include "content/public/common/url_constants.h" #include "services/network/public/mojom/content_security_policy.mojom-shared.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/chromeos/devicetype_utils.h" #include "ui/resources/grit/webui_resources.h" #include "ui/webui/color_change_listener/color_change_handler.h" #include "ui/webui/mojo_web_ui_controller.h" @@ -207,8 +208,6 @@ IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_ART_GALLERY_DESCRIPTION}, {"ambientModeTopicSourceVideo", IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO}, - {"ambientModeTopicSourceVideoDescription", - IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION}, {"ambientModeTopicSourceSelectedRow", IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_SELECTED_ROW}, {"ambientModeTopicSourceUnselectedRow", @@ -330,8 +329,6 @@ IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_BACK_BUTTON}, {"timeOfDayWallpaperDialogConfirmButton", IDS_PERSONALIZATION_APP_TIME_OF_DAY_WALLPAPER_DIALOG_CONFIRM_BUTTON}, - {"timeOfDayBannerTitle", - IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE}, {"timeOfDayBannerDescription", IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_DESCRIPTION}, {"timeOfDayBannerDescriptionNoScreensaver", @@ -347,6 +344,26 @@ source->AddString("timeOfDayBannerImageUrl", GetAmbientBackendController()->GetPromoBannerUrl()); + // Product name does not need to be translated. + auto product_name = + l10n_util::GetStringUTF16(ui::GetChromeOSDeviceTypeResourceId()); + // TODO(b/270597524): Switch to `IsTimeOfDayScreenSaverEnabled` once + // `kFeatureManagementTimeOfDayScreenSaver` is used. + if (base::FeatureList::IsEnabled( + features::kFeatureManagementTimeOfDayScreenSaver)) { + product_name = base::UTF8ToUTF16( + GetAmbientBackendController()->GetTimeOfDayProductName()); + } + source->AddString( + "ambientModeTopicSourceVideoDescription", + l10n_util::GetStringFUTF16( + IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION, + product_name)); + source->AddString( + "timeOfDayBannerTitle", + l10n_util::GetStringFUTF16( + IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE, product_name)); + source->AddString( "ambientModeAlbumsSubpageGooglePhotosTitle", l10n_util::GetStringFUTF16(
diff --git a/base/base64url.cc b/base/base64url.cc index 5600c1d..4e285a2 100644 --- a/base/base64url.cc +++ b/base/base64url.cc
@@ -13,6 +13,8 @@ namespace base { +namespace { + const char kPaddingChar = '='; // Base64url maps {+, /} to {-, _} in order for the encoded content to be safe @@ -20,7 +22,81 @@ const char kBase64Chars[] = "+/"; const char kBase64UrlSafeChars[] = "-_"; -void Base64UrlEncode(const StringPiece& input, +class StringPieceOrString { + public: + explicit StringPieceOrString(StringPiece piece) : piece_(piece) {} + explicit StringPieceOrString(std::string str) : str_(std::move(str)) {} + + StringPiece get() const { + if (str_) { + return *str_; + } + return piece_; + } + + private: + const absl::optional<std::string> str_; + const StringPiece piece_; +}; + +// Converts the base64url `input` into a plain base64 string. +absl::optional<StringPieceOrString> Base64ToBase64URL( + StringPiece input, + Base64UrlDecodePolicy policy) { + // Characters outside of the base64url alphabet are disallowed, which includes + // the {+, /} characters found in the conventional base64 alphabet. + if (input.find_first_of(kBase64Chars) != std::string::npos) + return absl::nullopt; + + const size_t required_padding_characters = input.size() % 4; + const bool needs_replacement = + input.find_first_of(kBase64UrlSafeChars) != std::string::npos; + + switch (policy) { + case Base64UrlDecodePolicy::REQUIRE_PADDING: + // Fail if the required padding is not included in |input|. + if (required_padding_characters > 0) + return absl::nullopt; + break; + case Base64UrlDecodePolicy::IGNORE_PADDING: + // Missing padding will be silently appended. + break; + case Base64UrlDecodePolicy::DISALLOW_PADDING: + // Fail if padding characters are included in |input|. + if (input.find_first_of(kPaddingChar) != std::string::npos) + return absl::nullopt; + break; + } + + if (required_padding_characters == 0 && !needs_replacement) { + return StringPieceOrString(input); + } + + // If the string either needs replacement of URL-safe characters to normal + // base64 ones, or additional padding, a copy of |input| needs to be made in + // order to make these adjustments without side effects. + CheckedNumeric<size_t> out_size = input.size(); + if (required_padding_characters > 0) { + out_size += 4 - required_padding_characters; + } + + std::string base64_input; + base64_input.reserve(out_size.ValueOrDie()); + base64_input.append(input.data(), input.size()); + + // Substitute the base64url URL-safe characters to their base64 equivalents. + ReplaceChars(base64_input, "-", "+", &base64_input); + ReplaceChars(base64_input, "_", "/", &base64_input); + + // Append the necessary padding characters. + base64_input.resize(out_size.ValueOrDie(), '='); + + return StringPieceOrString(std::move(base64_input)); +} + +} // namespace + +void Base64UrlEncode(StringPiece input, Base64UrlEncodePolicy policy, std::string* output) { Base64Encode(input, output); @@ -36,65 +112,34 @@ // The padding included in |*output| will be removed. const size_t last_non_padding_pos = output->find_last_not_of(kPaddingChar); - if (last_non_padding_pos != std::string::npos) + if (last_non_padding_pos != std::string::npos) { output->resize(last_non_padding_pos + 1); + } break; } } -bool Base64UrlDecode(const StringPiece& input, +bool Base64UrlDecode(StringPiece input, Base64UrlDecodePolicy policy, std::string* output) { - // Characters outside of the base64url alphabet are disallowed, which includes - // the {+, /} characters found in the conventional base64 alphabet. - if (input.find_first_of(kBase64Chars) != std::string::npos) + absl::optional<StringPieceOrString> base64_input = + Base64ToBase64URL(input, policy); + if (!base64_input) { return false; - - const size_t required_padding_characters = input.size() % 4; - const bool needs_replacement = - input.find_first_of(kBase64UrlSafeChars) != std::string::npos; - - switch (policy) { - case Base64UrlDecodePolicy::REQUIRE_PADDING: - // Fail if the required padding is not included in |input|. - if (required_padding_characters > 0) - return false; - break; - case Base64UrlDecodePolicy::IGNORE_PADDING: - // Missing padding will be silently appended. - break; - case Base64UrlDecodePolicy::DISALLOW_PADDING: - // Fail if padding characters are included in |input|. - if (input.find_first_of(kPaddingChar) != std::string::npos) - return false; - break; } + return Base64Decode(base64_input->get(), output); +} - // If the string either needs replacement of URL-safe characters to normal - // base64 ones, or additional padding, a copy of |input| needs to be made in - // order to make these adjustments without side effects. - if (required_padding_characters > 0 || needs_replacement) { - std::string base64_input; - - CheckedNumeric<size_t> base64_input_size = input.size(); - if (required_padding_characters > 0) - base64_input_size += 4 - required_padding_characters; - - base64_input.reserve(base64_input_size.ValueOrDie()); - base64_input.append(input.data(), input.size()); - - // Substitute the base64url URL-safe characters to their base64 equivalents. - ReplaceChars(base64_input, "-", "+", &base64_input); - ReplaceChars(base64_input, "_", "/", &base64_input); - - // Append the necessary padding characters. - base64_input.resize(base64_input_size.ValueOrDie(), '='); - - return Base64Decode(base64_input, output); +absl::optional<std::vector<uint8_t>> Base64UrlDecode( + StringPiece input, + Base64UrlDecodePolicy policy) { + absl::optional<StringPieceOrString> base64_input = + Base64ToBase64URL(input, policy); + if (!base64_input) { + return absl::nullopt; } - - return Base64Decode(input, output); + return Base64Decode(base64_input->get()); } } // namespace base
diff --git a/base/base64url.h b/base/base64url.h index 404dae2..75b971b9 100644 --- a/base/base64url.h +++ b/base/base64url.h
@@ -6,9 +6,11 @@ #define BASE_BASE64URL_H_ #include <string> +#include <vector> #include "base/base_export.h" #include "base/strings/string_piece.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace base { @@ -25,7 +27,7 @@ // // The |policy| defines whether padding should be included or omitted from the // encoded |*output|. |input| and |*output| may reference the same storage. -BASE_EXPORT void Base64UrlEncode(const StringPiece& input, +BASE_EXPORT void Base64UrlEncode(StringPiece input, Base64UrlEncodePolicy policy, std::string* output); @@ -45,10 +47,15 @@ // // The |policy| defines whether padding will be required, ignored or disallowed // altogether. |input| and |*output| may reference the same storage. -[[nodiscard]] BASE_EXPORT bool Base64UrlDecode(const StringPiece& input, +[[nodiscard]] BASE_EXPORT bool Base64UrlDecode(StringPiece input, Base64UrlDecodePolicy policy, std::string* output); +// Same as the previous function, but writing to a `std::vector`. +[[nodiscard]] BASE_EXPORT absl::optional<std::vector<uint8_t>> Base64UrlDecode( + StringPiece input, + Base64UrlDecodePolicy policy); + } // namespace base #endif // BASE_BASE64URL_H_
diff --git a/base/base64url_unittest.cc b/base/base64url_unittest.cc index 7ce4699..81c6619 100644 --- a/base/base64url_unittest.cc +++ b/base/base64url_unittest.cc
@@ -4,6 +4,7 @@ #include "base/base64url.h" +#include "base/ranges/algorithm.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { @@ -75,6 +76,16 @@ EXPECT_EQ("hello?world", output); } +TEST(Base64UrlTest, DecodeIntoVector) { + ASSERT_FALSE( + Base64UrlDecode("invalid=", Base64UrlDecodePolicy::DISALLOW_PADDING)); + + static constexpr uint8_t kExpected[] = {'1', '2', '3', '4'}; + absl::optional<std::vector<uint8_t>> result = + Base64UrlDecode("MTIzNA", Base64UrlDecodePolicy::DISALLOW_PADDING); + ASSERT_TRUE(ranges::equal(*result, kExpected)); +} + TEST(Base64UrlTest, DecodeDisallowPaddingPolicy) { std::string output; ASSERT_FALSE(Base64UrlDecode(
diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni index 1c85001..757c1c6 100644 --- a/build/rust/rust_target.gni +++ b/build/rust/rust_target.gni
@@ -400,6 +400,7 @@ } sources = _cxx_bindings deps = _cxx_deps + _public_deps + configs = _configs if (is_component_build) { # In a component_build the cxx bindings may be linked into a shared
diff --git a/chrome/VERSION b/chrome/VERSION index bd80dcc..213f9a9 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=115 MINOR=0 -BUILD=5787 +BUILD=5788 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 821f5c9..6b36b78 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1414,6 +1414,12 @@ data = [ "//chrome/test/data/android/" ] } + flatbuffer_java_library( + "critical_persisted_tab_data_flatbuffer_test_v1_java") { + root_dir = "javatests/src/org/chromium/chrome/browser/tab/state/" + sources = [ "$root_dir/critical_persisted_tab_data_test_v1.fbs" ] + } + android_library("chrome_test_java") { testonly = true resources_package = "org.chromium.chrome.test" @@ -1429,6 +1435,7 @@ ":browser_java_test_support", ":chrome_app_java_resources", ":chrome_test_util_java", + ":critical_persisted_tab_data_flatbuffer_test_v1_java", ":delegate_public_impl_java", "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index faca86a..702c567 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -114,6 +114,7 @@ "junit/src/org/chromium/chrome/browser/customtabs/ClientManagerTest.java", "junit/src/org/chromium/chrome/browser/customtabs/CloseButtonNavigatorTest.java", "junit/src/org/chromium/chrome/browser/customtabs/CustomTabActivityLifecycleUmaTrackerUnitTest.java", + "junit/src/org/chromium/chrome/browser/customtabs/CustomTabActivityUnitTest.java", "junit/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegateUnitTest.java", "junit/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProviderTest.java", "junit/src/org/chromium/chrome/browser/customtabs/CustomTabNavigationBarControllerTest.java",
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java index 01ed09f..b35091be 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTabSwitcherTest.java
@@ -100,7 +100,8 @@ Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) @EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, ChromeFeatureList.START_SURFACE_RETURN_TIME + "<Study,", - ChromeFeatureList.START_SURFACE_ANDROID + "<Study", ChromeFeatureList.INSTANT_START}) + ChromeFeatureList.START_SURFACE_ANDROID + "<Study", ChromeFeatureList.INSTANT_START, + ChromeFeatureList.EMPTY_STATES}) @Restriction({Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE, UiRestriction.RESTRICTION_TYPE_PHONE}) @DoNotBatch(reason = "This test suite tests startup behaviours and thus can't be batched.")
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index af14cf33..07a1a27 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -99,7 +99,8 @@ @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) @EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, - ChromeFeatureList.START_SURFACE_ANDROID, ChromeFeatureList.INSTANT_START}) + ChromeFeatureList.START_SURFACE_ANDROID, ChromeFeatureList.INSTANT_START, + ChromeFeatureList.EMPTY_STATES}) @Restriction({Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE, UiRestriction.RESTRICTION_TYPE_PHONE}) @DoNotBatch(reason = "InstantStartTest tests startup behaviours and thus can't be batched.")
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java index 1b3b0c0..c11613bf 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java
@@ -78,7 +78,8 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @Restriction( {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) -@EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID + "<Study"}) +@EnableFeatures( + {ChromeFeatureList.START_SURFACE_ANDROID + "<Study", ChromeFeatureList.EMPTY_STATES}) @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.") @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) @@ -121,7 +122,6 @@ @Before public void setUp() throws IOException { StartSurfaceTestUtils.setUpStartSurfaceTests(mImmediateReturn, mActivityTestRule); - mLayoutChangedCallbackHelper = new CallbackHelper(); if (isInstantReturn()) {
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java index aeaa0bf4..0ac0473 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java
@@ -77,7 +77,8 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @Restriction( {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) -@EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID + "<Study"}) +@EnableFeatures( + {ChromeFeatureList.START_SURFACE_ANDROID + "<Study", ChromeFeatureList.EMPTY_STATES}) @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.") @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"})
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java index ec565d3..7630e7fd 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java
@@ -78,7 +78,8 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @Restriction( {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) -@EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID + "<Study"}) +@EnableFeatures( + {ChromeFeatureList.START_SURFACE_ANDROID + "<Study", ChromeFeatureList.EMPTY_STATES}) @DoNotBatch(reason = "StartSurface*Test tests startup behaviours and thus can't be batched.") @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"})
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index f0f4c3f..faed1e6 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -116,7 +116,8 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @Restriction( {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) -@EnableFeatures({ChromeFeatureList.START_SURFACE_ANDROID + "<Study"}) +@EnableFeatures( + {ChromeFeatureList.START_SURFACE_ANDROID + "<Study", ChromeFeatureList.EMPTY_STATES}) @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) @DoNotBatch(reason = "This test suite tests startup behaviors.")
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 265c8e3e..a0fc650 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -41,6 +41,7 @@ "java/res/drawable/ic_select_all_24dp.xml", "java/res/drawable/iph_drag_and_drop_animated_drawable.xml", "java/res/drawable/iph_drag_and_drop_drawable.xml", + "java/res/drawable/phone_tab_switcher_empty_state_illustration.xml", "java/res/drawable/price_card_background.xml", "java/res/drawable/price_card_scrim.xml", "java/res/drawable/selected_tab_background.xml", @@ -54,6 +55,7 @@ "java/res/drawable/tab_strip_favicon_circle.xml", "java/res/drawable/tab_strip_selected_ring.xml", "java/res/drawable/tab_strip_selected_ring_incognito.xml", + "java/res/drawable/tablet_tab_switcher_empty_state_illustration.xml", "java/res/drawable/tabstrip_favicon_background.xml", "java/res/drawable/ungroup_bar_background.xml", "java/res/layout/bottom_tab_grid_toolbar.xml",
diff --git a/chrome/android/features/tab_ui/java/res/drawable/phone_tab_switcher_empty_state_illustration.xml b/chrome/android/features/tab_ui/java/res/drawable/phone_tab_switcher_empty_state_illustration.xml new file mode 100644 index 0000000..ebad7060 --- /dev/null +++ b/chrome/android/features/tab_ui/java/res/drawable/phone_tab_switcher_empty_state_illustration.xml
@@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +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. +--> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:height="130dp" + android:viewportHeight="130" + android:viewportWidth="130" + android:width="130dp"> + <path + android:fillColor="@color/empty_state_icon_bg_color" + android:pathData="M84.07,67.58L53.87,37.38C44.1,27.6 51.02,10.9 64.84,10.9H100.76C104.87,10.9 108.82,12.53 111.73,15.44L123.97,27.68C130.03,33.74 130.03,43.56 123.97,49.62L106.01,67.58C99.95,73.64 90.13,73.64 84.07,67.58Z"/> + <path + android:fillColor="@color/empty_state_icon_bg_color" + android:pathData="M45.36,61.85L75.57,92.06C85.34,101.83 78.42,118.54 64.6,118.54H28.68C24.56,118.54 20.62,116.9 17.71,114L5.46,101.75C-0.59,95.69 -0.59,85.87 5.46,79.82L23.43,61.85C29.48,55.8 39.3,55.8 45.36,61.85Z"/> + <path + android:pathData="M94,41L94,99A3,3 0,0 1,91 102L50,102A3,3 0,0 1,47 99L47,41A3,3 0,0 1,50 38L91,38A3,3 0,0 1,94 41z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="2"/> + <path + android:fillColor="@color/empty_state_icon_color" + android:fillType="evenOdd" + android:pathData="M50,37C47.79,37 46,38.79 46,41V45H95V41C95,38.79 93.21,37 91,37H50Z"/> + <path + android:fillColor="@color/empty_state_icon_bg_color" + android:pathData="M84,31L84,89A3,3 0,0 1,81 92L40,92A3,3 0,0 1,37 89L37,31A3,3 0,0 1,40 28L81,28A3,3 0,0 1,84 31z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="2"/> + <path + android:fillColor="@color/empty_state_icon_color" + android:fillType="evenOdd" + android:pathData="M40,27C37.79,27 36,28.79 36,31V35H85V31C85,28.79 83.21,27 81,27H40Z"/> + <path + android:fillColor="@macro/default_bg_color_elev_0" + android:pathData="M40,29L42,29A1,1 0,0 1,43 30L43,32A1,1 0,0 1,42 33L40,33A1,1 0,0 1,39 32L39,30A1,1 0,0 1,40 29z"/> + <path + android:pathData="M81,30L79,32" + android:strokeColor="@macro/default_bg_color_elev_0" + android:strokeLineCap="round" + android:strokeWidth="2"/> + <path + android:pathData="M79,30L81,32" + android:strokeColor="@macro/default_bg_color_elev_0" + android:strokeLineCap="round" + android:strokeWidth="2"/> +</vector>
diff --git a/chrome/android/features/tab_ui/java/res/drawable/tablet_tab_switcher_empty_state_illustration.xml b/chrome/android/features/tab_ui/java/res/drawable/tablet_tab_switcher_empty_state_illustration.xml new file mode 100644 index 0000000..6420eb4 --- /dev/null +++ b/chrome/android/features/tab_ui/java/res/drawable/tablet_tab_switcher_empty_state_illustration.xml
@@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +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. +--> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:height="130dp" + android:viewportHeight="130" + android:viewportWidth="130" + android:width="130dp"> + <path + android:fillColor="@color/empty_state_icon_bg_color" + android:pathData="M74.19,76.52L31.3,33.63C20.9,23.23 28.27,5.46 42.97,5.46H93.87C98.25,5.46 102.45,7.2 105.54,10.29L122.98,27.73C129.43,34.17 129.43,44.62 122.98,51.07L97.53,76.52C91.08,82.96 80.64,82.96 74.19,76.52Z"/> + <path + android:fillColor="@color/empty_state_icon_bg_color" + android:pathData="M55.81,52.48L98.7,95.37C109.1,105.77 101.73,123.54 87.03,123.54H36.13C31.75,123.54 27.55,121.81 24.46,118.71L7.02,101.27C0.57,94.83 0.57,84.38 7.02,77.93L32.47,52.48C38.92,46.04 49.37,46.04 55.81,52.48Z"/> + <path + android:pathData="M52,57L110,57A3,3 0,0 1,113 60L113,101A3,3 0,0 1,110 104L52,104A3,3 0,0 1,49 101L49,60A3,3 0,0 1,52 57z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="2"/> + <path + android:pathData="M52,56.5L110,56.5A3.5,3.5 0,0 1,113.5 60L113.5,101A3.5,3.5 0,0 1,110 104.5L52,104.5A3.5,3.5 0,0 1,48.5 101L48.5,60A3.5,3.5 0,0 1,52 56.5z" + android:strokeColor="@color/empty_state_icon_bg_color" + android:strokeWidth="1"/> + <path + android:fillColor="@color/empty_state_icon_color" + android:fillType="evenOdd" + android:pathData="M52,56C49.79,56 48,57.79 48,60V64H114V60C114,57.79 112.21,56 110,56H52Z"/> + <path + android:pathData="M20,25L78,25A3,3 0,0 1,81 28L81,69A3,3 0,0 1,78 72L20,72A3,3 0,0 1,17 69L17,28A3,3 0,0 1,20 25z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="2"/> + <path + android:pathData="M20,24.5L78,24.5A3.5,3.5 0,0 1,81.5 28L81.5,69A3.5,3.5 0,0 1,78 72.5L20,72.5A3.5,3.5 0,0 1,16.5 69L16.5,28A3.5,3.5 0,0 1,20 24.5z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="1"/> + <path + android:fillColor="@color/empty_state_icon_color" + android:fillType="evenOdd" + android:pathData="M20,24C17.79,24 16,25.79 16,28V32H82V28C82,25.79 80.21,24 78,24H20Z"/> + <path + android:pathData="M36,40.5L94,40.5A3.5,3.5 0,0 1,97.5 44L97.5,85A3.5,3.5 0,0 1,94 88.5L36,88.5A3.5,3.5 0,0 1,32.5 85L32.5,44A3.5,3.5 0,0 1,36 40.5z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="1"/> + <path + android:fillColor="@color/empty_state_icon_tabswitcher_bg_color" + android:pathData="M36,41L94,41A3,3 0,0 1,97 44L97,85A3,3 0,0 1,94 88L36,88A3,3 0,0 1,33 85L33,44A3,3 0,0 1,36 41z" + android:strokeColor="@color/empty_state_icon_color" + android:strokeWidth="2"/> + <path + android:fillColor="@color/empty_state_icon_color" + android:fillType="evenOdd" + android:pathData="M36,40C33.79,40 32,41.79 32,44V48H98V44C98,41.79 96.21,40 94,40H36Z"/> + <path + android:fillColor="@macro/default_bg_color_elev_0" + android:pathData="M36,42L38,42A1,1 0,0 1,39 43L39,45A1,1 0,0 1,38 46L36,46A1,1 0,0 1,35 45L35,43A1,1 0,0 1,36 42z"/> + <path + android:pathData="M94,43L92,45" + android:strokeColor="@macro/default_bg_color_elev_0" + android:strokeLineCap="round" + android:strokeWidth="2"/> + <path + android:pathData="M92,43L94,45" + android:strokeColor="@macro/default_bg_color_elev_0" + android:strokeLineCap="round" + android:strokeWidth="2"/> +</vector> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index dcb4621..4213ca7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -30,6 +30,7 @@ import org.chromium.base.Callback; import org.chromium.base.TraceEvent; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lifecycle.DestroyObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabUtils; @@ -81,6 +82,7 @@ static final int GRID_LAYOUT_SPAN_COUNT_LARGE = 4; static final int MAX_SCREEN_WIDTH_COMPACT_DP = 600; static final int MAX_SCREEN_WIDTH_MEDIUM_DP = 800; + private final TabListMediator mMediator; private final TabListRecyclerView mRecyclerView; private final SimpleRecyclerViewAdapter mAdapter; @@ -97,6 +99,7 @@ private @Nullable TabStripSnapshotter mTabStripSnapshotter; private ItemTouchHelper mItemTouchHelper; private OnItemTouchListener mOnItemTouchListener; + private TabListEmptyCoordinator mTabListEmptyCoordinator; /** * Construct a coordinator for UI that shows a list of tabs. @@ -141,6 +144,7 @@ mModel = new TabListModel(); mAdapter = new SimpleRecyclerViewAdapter(mModel); mRootView = rootView; + RecyclerView.RecyclerListener recyclerListener = null; if (mMode == TabListMode.GRID || mMode == TabListMode.CAROUSEL) { mAdapter.registerType(UiType.SELECTABLE, parent -> { @@ -219,6 +223,10 @@ selectionDelegateProvider, gridCardOnClickListenerProvider, dialogHandler, priceWelcomeMessageController, componentName, itemType); + if (ChromeFeatureList.sEmptyStates.isEnabled()) { + mTabListEmptyCoordinator = new TabListEmptyCoordinator(rootView, mModel); + } + try (TraceEvent e = TraceEvent.scoped("TabListCoordinator.setupRecyclerView")) { if (!attachToParent) { mRecyclerView = (TabListRecyclerView) LayoutInflater.from(context).inflate( @@ -530,6 +538,9 @@ @Override public void onDestroy() { mMediator.destroy(); + if (mTabListEmptyCoordinator != null) { + mTabListEmptyCoordinator.destroy(); + } if (mListLayoutListener != null) { mRecyclerView.removeOnLayoutChangeListener(mListLayoutListener); mLayoutListenerRegistered = false;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java new file mode 100644 index 0000000..170ea85 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java
@@ -0,0 +1,80 @@ +// 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. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.chromium.chrome.tab_ui.R; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.modelutil.ListObservable; +import org.chromium.ui.modelutil.ListObservable.ListObserver; + +// @TODO(crbug.com/1442335) Add instrumentation test for TabListEmptyCoordinator class. +public class TabListEmptyCoordinator { + private ViewGroup mRootView; + private View mEmptyView; + private Context mContext; + private TabListModel mModel; + private ListObserver<Void> mListObserver; + + public TabListEmptyCoordinator(ViewGroup rootView, TabListModel model) { + mRootView = rootView; + mContext = rootView.getContext(); + + // Initialize tab switcher Empty State resources. + mEmptyView = (ViewGroup) android.view.LayoutInflater.from(mContext).inflate( + R.layout.empty_state_view, null); + TextView emptyStateHeading = mEmptyView.findViewById(R.id.empty_state_text_title); + TextView emptyStateSubheading = mEmptyView.findViewById(R.id.empty_state_text_description); + ImageView imageView = mEmptyView.findViewById(R.id.empty_state_icon); + + // Set properties. + emptyStateHeading.setText(R.string.tabswitcher_no_tabs_empty_state); + emptyStateSubheading.setText(R.string.tabswitcher_no_tabs_open_to_visit_different_pages); + + // Apply image illustrations based on form factors. + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext)) { + imageView.setImageResource(R.drawable.tablet_tab_switcher_empty_state_illustration); + } else { + imageView.setImageResource(R.drawable.phone_tab_switcher_empty_state_illustration); + } + + // Observe TabListModel to determine when to add / remove empty state view. + mModel = model; + mListObserver = new ListObserver<Void>() { + @Override + public void onItemRangeInserted(ListObservable source, int index, int count) { + updateEmptyView(); + } + + @Override + public void onItemRangeRemoved(ListObservable source, int index, int count) { + updateEmptyView(); + } + }; + mModel.addObserver(mListObserver); + } + + private void updateEmptyView() { + boolean showEmptyView = mModel.size() == 0; + boolean isEmptyViewAttached = mEmptyView.getParent() != null; + + if (showEmptyView && !isEmptyViewAttached) { + mRootView.addView(mEmptyView); + } else if (!showEmptyView && isEmptyViewAttached) { + mRootView.removeView(mEmptyView); + } + } + + public void destroy() { + if (mListObserver != null) { + mModel.removeObserver(mListObserver); + } + } +}
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb index 10c13fd..7863529 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
@@ -22,7 +22,7 @@ <translation id="2759453070259087442">Luaskan grup tab <ph name="TITLE_OF_GROUP" /> yang berisi <ph name="NUMBER_OF_TABS" /> tab.</translation> <translation id="2801787514987684416">Lihat info toko?</translation> <translation id="2928243913527329289">Google | Tentang toko ini</translation> -<translation id="2977480621796371840">Hapus dari grup</translation> +<translation id="2977480621796371840">Keluarkan dari grup</translation> <translation id="3008554597174452548">Hentikan pemantauan produk</translation> <translation id="3052964831964880138">Diskon <ph name="PRICE_DROP" /> untuk <ph name="PRODUCT_NAME" /></translation> <translation id="3194464645767632461">rating</translation>
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java index 2805f1f..77a0308 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherAndStartSurfaceLayoutTest.java
@@ -148,6 +148,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) @EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + "<Study"}) +@DisableFeatures({ChromeFeatureList.EMPTY_STATES}) @Restriction( {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) public class TabSwitcherAndStartSurfaceLayoutTest {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java index 488c9fa..da78b163a 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java
@@ -88,8 +88,8 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) -@EnableFeatures({ChromeFeatureList.TAB_STRIP_REDESIGN}) -@DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) +@EnableFeatures({ChromeFeatureList.TAB_STRIP_REDESIGN, ChromeFeatureList.EMPTY_STATES}) +@DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION}) @Restriction( {Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE, UiRestriction.RESTRICTION_TYPE_TABLET}) @Batch(Batch.PER_CLASS)
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni index afbd60c9..e0581c9 100644 --- a/chrome/android/features/tab_ui/tab_management_java_sources.gni +++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -67,6 +67,7 @@ "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerProperties.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java", + "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListModel.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index 9bc07a26..bd01f54 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -68,6 +68,7 @@ CachedFeatureFlags.cacheNativeFlags(ChromeFeatureList.sFlagsCachedFullBrowser); CachedFeatureFlags.cacheAdditionalNativeFlags(); + //clang-format off List<CachedFieldTrialParameter> fieldTrialsToCache = List.of( BrandingController.BRANDING_CADENCE_MS, BrandingController.MAX_BLANK_TOOLBAR_TIMEOUT_MS,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java index 376440c3..b324a98a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java
@@ -147,7 +147,7 @@ }); getPreferenceScreen().addPreference(autofillSwitch); - final boolean addressSyncEnabled = isAddressSyncEnabled(); + final boolean addressesNotSyncedWithSyncOn = addressesNotSyncedWithSyncOn(); for (AutofillProfile profile : PersonalDataManager.getInstance().getProfilesForSettings()) { assert profile.getIsLocal(); // Add a preference for the profile. @@ -155,7 +155,7 @@ pref.setTitle(profile.getFullName()); pref.setSummary(profile.getLabel()); pref.setKey(pref.getTitle().toString()); // For testing. - if (!addressSyncEnabled && profile.getSource() != Source.ACCOUNT) { + if (addressesNotSyncedWithSyncOn && profile.getSource() != Source.ACCOUNT) { // Conditionally set local profile icon for address profiles that are neither // synced, nor saved in the account. pref.setWidgetLayoutResource(R.layout.autofill_local_profile_icon); @@ -261,10 +261,10 @@ return new AutofillAddress(getActivity(), profile); } - private boolean isAddressSyncEnabled() { + private boolean addressesNotSyncedWithSyncOn() { SyncService syncService = SyncService.get(); return syncService != null && syncService.isSyncFeatureEnabled() - && syncService.getSelectedTypes().contains(UserSelectableType.AUTOFILL); + && !syncService.getSelectedTypes().contains(UserSelectableType.AUTOFILL); } private Context getStyledContext() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java index fc26b8f..a6e4943 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcher.java
@@ -143,6 +143,15 @@ BookmarkId id = childIdIterator.next(); BookmarkItem item = mBookmarkModel.getBookmarkById(id); + + // It's possible that a child was removed during fetching. In that case, just continue on + // to the next child. + if (item == null) { + fetchFirstTwoImagesForFolderImpl( + childIdIterator, firstDrawable, secondDrawable, callback); + return; + } + fetchImageForBookmark(item, drawable -> { Drawable newFirstDrawable = firstDrawable; Drawable newSecondDrawable = secondDrawable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java index 9a341f2b..108d116 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java
@@ -25,6 +25,7 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; +import java.util.ArrayList; import java.util.List; import java.util.function.Function; /** @@ -36,7 +37,7 @@ // TODO(crbug.com/1425201): Remove BookmarkModel reference. private BookmarkModel mBookmarkModel; private BookmarkOpener mBookmarkOpener; - private SelectionDelegate mSelectionDelegate; + private SelectionDelegate<BookmarkId> mSelectionDelegate; // The current folder can be null before being set by the mediator. private @Nullable BookmarkItem mCurrentFolder; @@ -153,6 +154,10 @@ mMenuIdClickedFunction = menuIdClickedFunction; } + void fakeSelectionStateChange() { + onSelectionStateChange(new ArrayList<>(mSelectionDelegate.getSelectedItems())); + } + // OnMenuItemClickListener implementation. @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java index 2a23ef0..e56e398 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediator.java
@@ -219,12 +219,6 @@ @Override public void onFolderStateSet(BookmarkId folder) { - // If we're in the middle of a selection, do not override things. - // TODO(https://crbug.com/1435024): Rework logic to not be more robust. - if (mSelectionDelegate.isSelectionEnabled()) { - return; - } - mCurrentFolder = folder; mModel.set(BookmarkToolbarProperties.CURRENT_FOLDER, mCurrentFolder); @@ -253,8 +247,17 @@ title = folderItem.getTitle(); navigationButton = NavigationButton.BACK; } - + // This doesn't handle selection state correctly, must be before we fake a selection change. mModel.set(BookmarkToolbarProperties.TITLE, title); + + // Selection state isn't routed through MVC, but instead the View directly subscribes to + // events. The view then changes/ignores/overrides properties that were set above, based on + // selection. This is problematic because it means the View is sensitive to the order of + // inputs. To mitigate this, always make it re-apply selection the above properties. + mModel.set(BookmarkToolbarProperties.FAKE_SELECTION_STATE_CHANGE, true); + + // Should typically be the last thing done, because lots of other properties will trigger + // an incorrect button state, and we need to override that. mModel.set(BookmarkToolbarProperties.NAVIGATION_BUTTON_STATE, navigationButton); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java index cd5a8dd6..b509c5c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarProperties.java
@@ -46,6 +46,9 @@ static final WritableIntPropertyKey CHECKED_SORT_MENU_ID = new WritableIntPropertyKey(); static final WritableIntPropertyKey CHECKED_VIEW_MENU_ID = new WritableIntPropertyKey(); + static final WritableObjectPropertyKey<Boolean> FAKE_SELECTION_STATE_CHANGE = + new WritableObjectPropertyKey<>(/*skipEquality=*/true); + /** Bookmark state properties. */ static final WritableObjectPropertyKey<BookmarkId> CURRENT_FOLDER = new WritableObjectPropertyKey<>(/*skipEquality=*/true); @@ -62,5 +65,5 @@ TITLE, BOOKMARK_UI_MODE, SOFT_KEYBOARD_VISIBLE, IS_DIALOG_UI, DRAG_ENABLED, SEARCH_BUTTON_VISIBLE, EDIT_BUTTON_VISIBLE, NAVIGATION_BUTTON_STATE, CURRENT_FOLDER, CHECKED_SORT_MENU_ID, CHECKED_VIEW_MENU_ID, OPEN_SEARCH_UI_RUNNABLE, - MENU_ID_CLICKED_FUNCTION, OPEN_FOLDER_CALLBACK}; + MENU_ID_CLICKED_FUNCTION, OPEN_FOLDER_CALLBACK, FAKE_SELECTION_STATE_CHANGE}; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java index 7d38853..5ce84ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarViewBinder.java
@@ -59,6 +59,8 @@ } else if (key == BookmarkToolbarProperties.MENU_ID_CLICKED_FUNCTION) { bookmarkToolbar.setMenuIdClickedFunction( model.get(BookmarkToolbarProperties.MENU_ID_CLICKED_FUNCTION)); + } else if (key == BookmarkToolbarProperties.FAKE_SELECTION_STATE_CHANGE) { + bookmarkToolbar.fakeSelectionStateChange(); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 32ce62f..892a83e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -159,8 +159,10 @@ @Override protected boolean isPageInsightsHubEnabled() { - // TODO(b/282739536): Add more conditions. - return ChromeFeatureList.isEnabled(ChromeFeatureList.CCT_PAGE_INSIGHTS_HUB); + // TODO(b/282739536): Add supplemental Web and App activity(sWAA) user setting. + return ChromeFeatureList.isEnabled(ChromeFeatureList.CCT_PAGE_INSIGHTS_HUB) + && CustomTabsConnection.getInstance().shouldEnablePageInsightsForIntent( + mIntentDataProvider); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index ce5a638..c8592c6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -58,6 +58,7 @@ import org.chromium.chrome.browser.browserservices.PostMessageHandler; import org.chromium.chrome.browser.browserservices.SessionDataHolder; import org.chromium.chrome.browser.browserservices.SessionHandler; +import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.ActivityLayoutState; import org.chromium.chrome.browser.customtabs.features.sessionrestore.SessionRestoreManager; import org.chromium.chrome.browser.customtabs.features.sessionrestore.SessionRestoreManagerImpl; @@ -1898,6 +1899,15 @@ } /** + * Whether PageInsight Hub is enabled by the launching Intent. False by default. + * @param intentData {@link BrowserServicesIntentDataProvider} built from the Intent that + * launched this CCT. + */ + public boolean shouldEnablePageInsightsForIntent(BrowserServicesIntentDataProvider intentData) { + return false; + } + + /** * Called when text fragment lookups on the current page has completed. * @param session session object. * @param stateKey unique key for the embedder to keep track of the request.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index cfbdd33c..514e6d1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -1145,6 +1145,9 @@ if (!maybeShowNativePage(url.getSpec(), isReload)) { showRenderedPage(); } + + CriticalPersistedTabData.from(this).setLastNavigationCommittedTimestampMillis( + System.currentTimeMillis()); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java index 27269fe9..a1d1bb6c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java
@@ -44,6 +44,8 @@ : TabState.UNSPECIFIED_THEME_COLOR; tabState.rootId = CriticalPersistedTabData.from(tab).getRootId(); tabState.userAgent = CriticalPersistedTabData.from(tab).getUserAgent(); + tabState.lastNavigationCommittedTimestampMillis = + CriticalPersistedTabData.from(tab).getLastNavigationCommittedTimestampMillis(); return tabState; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java index 7bbd7b2..8a43705 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java
@@ -569,7 +569,7 @@ Assert.assertEquals(0, autofillProfileFragment.findPreference(sAccountProfile.getFullName()) .getWidgetLayoutResource()); - Assert.assertEquals(R.layout.autofill_local_profile_icon, + Assert.assertEquals(0, autofillProfileFragment.findPreference(sLocalOrSyncProfile.getFullName()) .getWidgetLayoutResource()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java index 23fd41e3..3d7d672f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab.state; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -43,8 +45,11 @@ import org.chromium.chrome.browser.tab.TabUserAgent; import org.chromium.chrome.browser.tab.WebContentsState; import org.chromium.chrome.browser.tab.flatbuffer.CriticalPersistedTabDataFlatBuffer; +import org.chromium.chrome.browser.tab.flatbuffer.CriticalPersistedTabDataFlatBufferTest; import org.chromium.chrome.browser.tab.flatbuffer.LaunchTypeAtCreation; +import org.chromium.chrome.browser.tab.flatbuffer.LaunchTypeAtCreationTest; import org.chromium.chrome.browser.tab.flatbuffer.UserAgentType; +import org.chromium.chrome.browser.tab.flatbuffer.UserAgentTypeTest; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule; import org.chromium.components.embedder_support.util.UrlConstants; @@ -76,6 +81,7 @@ private static final WebContentsState WEB_CONTENTS_STATE = new WebContentsState(ByteBuffer.allocateDirect(WEB_CONTENTS_STATE_BYTES.length)); private static final long TIMESTAMP = 203847028374L; + private static final long LAST_NAVIGATION_COMMITTED_TIMESTAMP = 3141592653589L; private static final String APP_ID = "AppId"; private static final String OPENER_APP_ID = "OpenerAppId"; private static final int THEME_COLOR = 5; @@ -168,7 +174,7 @@ CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData( new MockTab(TAB_ID, isEncrypted), "", "", PARENT_ID, ROOT_ID, TIMESTAMP, WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, OPENER_APP_ID, THEME_COLOR, - LAUNCH_TYPE_AT_CREATION, USER_AGENT_A); + LAUNCH_TYPE_AT_CREATION, USER_AGENT_A, LAST_NAVIGATION_COMMITTED_TIMESTAMP); criticalPersistedTabData.setShouldSaveForTesting(true); mStorage.setSemaphore(saveSemaphore); ObservableSupplierImpl<Boolean> supplier = new ObservableSupplierImpl<>(); @@ -180,19 +186,20 @@ }); semaphore.acquire(); Assert.assertNotNull(mCriticalPersistedTabData); - Assert.assertEquals(mCriticalPersistedTabData.getParentId(), PARENT_ID); - Assert.assertEquals(mCriticalPersistedTabData.getRootId(), ROOT_ID); - Assert.assertEquals(mCriticalPersistedTabData.getTimestampMillis(), TIMESTAMP); - Assert.assertEquals( - mCriticalPersistedTabData.getContentStateVersion(), CONTENT_STATE_VERSION); - Assert.assertEquals(mCriticalPersistedTabData.getOpenerAppId(), OPENER_APP_ID); - Assert.assertEquals(mCriticalPersistedTabData.getThemeColor(), THEME_COLOR); - Assert.assertEquals( + assertEquals(mCriticalPersistedTabData.getParentId(), PARENT_ID); + assertEquals(mCriticalPersistedTabData.getRootId(), ROOT_ID); + assertEquals(mCriticalPersistedTabData.getTimestampMillis(), TIMESTAMP); + assertEquals(mCriticalPersistedTabData.getContentStateVersion(), CONTENT_STATE_VERSION); + assertEquals(mCriticalPersistedTabData.getOpenerAppId(), OPENER_APP_ID); + assertEquals(mCriticalPersistedTabData.getThemeColor(), THEME_COLOR); + assertEquals( mCriticalPersistedTabData.getTabLaunchTypeAtCreation(), LAUNCH_TYPE_AT_CREATION); Assert.assertArrayEquals(CriticalPersistedTabData.getContentStateByteArray( mCriticalPersistedTabData.getWebContentsState().buffer()), WEB_CONTENTS_STATE_BYTES); - Assert.assertEquals(mCriticalPersistedTabData.getUserAgent(), USER_AGENT_A); + assertEquals(mCriticalPersistedTabData.getUserAgent(), USER_AGENT_A); + assertEquals(mCriticalPersistedTabData.getLastNavigationCommittedTimestampMillis(), + LAST_NAVIGATION_COMMITTED_TIMESTAMP); Semaphore deleteSemaphore = new Semaphore(0); ThreadUtils.runOnUiThreadBlocking(() -> { mStorage.setSemaphore(deleteSemaphore); @@ -258,7 +265,7 @@ prepareCPTDShouldTabSave(canGoBack, canGoForward); spyCriticalPersistedTabData.setShouldSave(); spyCriticalPersistedTabData.setUrl(new GURL(UrlConstants.NTP_URL)); - Assert.assertEquals( + assertEquals( canGoBack || canGoForward, spyCriticalPersistedTabData.shouldSave()); } } @@ -286,7 +293,7 @@ prepareCPTDShouldTabSave(false, false); spyCriticalPersistedTabData.setUrl(new GURL("https://www.google.com")); spyCriticalPersistedTabData.setShouldSave(); - Assert.assertTrue(spyCriticalPersistedTabData.shouldSave()); + assertTrue(spyCriticalPersistedTabData.shouldSave()); } } @@ -304,9 +311,10 @@ @Test public void testSerializationBug() throws InterruptedException { Tab tab = mockTab(TAB_ID, false); - CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, "", - "", PARENT_ID, ROOT_ID, TIMESTAMP, WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, - OPENER_APP_ID, THEME_COLOR, LAUNCH_TYPE_AT_CREATION, USER_AGENT_A); + CriticalPersistedTabData criticalPersistedTabData = + new CriticalPersistedTabData(tab, "", "", PARENT_ID, ROOT_ID, TIMESTAMP, + WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, OPENER_APP_ID, THEME_COLOR, + LAUNCH_TYPE_AT_CREATION, USER_AGENT_A, LAST_NAVIGATION_COMMITTED_TIMESTAMP); Serializer<ByteBuffer> serializer = criticalPersistedTabData.getSerializer(); serializer.preSerialize(); ByteBuffer serialized = serializer.get(); @@ -315,17 +323,19 @@ CriticalPersistedTabData deserialized = new CriticalPersistedTabData(tab, serialized, config.getStorage(), config.getId()); Assert.assertNotNull(deserialized); - Assert.assertEquals(PARENT_ID, deserialized.getParentId()); - Assert.assertEquals(ROOT_ID, deserialized.getRootId()); - Assert.assertEquals(TIMESTAMP, deserialized.getTimestampMillis()); - Assert.assertEquals(CONTENT_STATE_VERSION, deserialized.getContentStateVersion()); - Assert.assertEquals(OPENER_APP_ID, deserialized.getOpenerAppId()); - Assert.assertEquals(THEME_COLOR, deserialized.getThemeColor()); - Assert.assertEquals(LAUNCH_TYPE_AT_CREATION, deserialized.getTabLaunchTypeAtCreation()); + assertEquals(PARENT_ID, deserialized.getParentId()); + assertEquals(ROOT_ID, deserialized.getRootId()); + assertEquals(TIMESTAMP, deserialized.getTimestampMillis()); + assertEquals(CONTENT_STATE_VERSION, deserialized.getContentStateVersion()); + assertEquals(OPENER_APP_ID, deserialized.getOpenerAppId()); + assertEquals(THEME_COLOR, deserialized.getThemeColor()); + assertEquals(LAUNCH_TYPE_AT_CREATION, deserialized.getTabLaunchTypeAtCreation()); Assert.assertArrayEquals(WEB_CONTENTS_STATE_BYTES, CriticalPersistedTabData.getContentStateByteArray( deserialized.getWebContentsState().buffer())); - Assert.assertEquals(USER_AGENT_A, deserialized.getUserAgent()); + assertEquals(USER_AGENT_A, deserialized.getUserAgent()); + assertEquals(LAST_NAVIGATION_COMMITTED_TIMESTAMP, + deserialized.getLastNavigationCommittedTimestampMillis()); } @SmallTest @@ -342,7 +352,8 @@ CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, "", "", PARENT_ID, ROOT_ID, TIMESTAMP, TabStateExtractor.getWebContentsState(tab), CONTENT_STATE_VERSION, - OPENER_APP_ID, THEME_COLOR, LAUNCH_TYPE_AT_CREATION, USER_AGENT_A); + OPENER_APP_ID, THEME_COLOR, LAUNCH_TYPE_AT_CREATION, USER_AGENT_A, + LAST_NAVIGATION_COMMITTED_TIMESTAMP); PersistedTabDataConfiguration config = PersistedTabDataConfiguration.get( CriticalPersistedTabData.class, tab.isIncognito()); FilePersistedTabDataStorage persistedTabDataStorage = @@ -364,10 +375,9 @@ CriticalPersistedTabData.restore(tab.getId(), tab.isIncognito()); CriticalPersistedTabData deserialized = new CriticalPersistedTabData(tab, serialized); - Assert.assertEquals(EXPECTED_TITLE, + assertEquals(EXPECTED_TITLE, deserialized.getWebContentsState().getDisplayTitleFromState()); - Assert.assertEquals( - url, deserialized.getWebContentsState().getVirtualUrlFromState()); + assertEquals(url, deserialized.getWebContentsState().getVirtualUrlFromState()); } }); } @@ -377,9 +387,10 @@ @Test public void testOpenerAppIdNull() { Tab tab = mockTab(TAB_ID, false); - CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, "", - "", PARENT_ID, ROOT_ID, TIMESTAMP, WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, null, - THEME_COLOR, LAUNCH_TYPE_AT_CREATION, USER_AGENT_A); + CriticalPersistedTabData criticalPersistedTabData = + new CriticalPersistedTabData(tab, "", "", PARENT_ID, ROOT_ID, TIMESTAMP, + WEB_CONTENTS_STATE, CONTENT_STATE_VERSION, null, THEME_COLOR, + LAUNCH_TYPE_AT_CREATION, USER_AGENT_A, LAST_NAVIGATION_COMMITTED_TIMESTAMP); Serializer<ByteBuffer> serializer = criticalPersistedTabData.getSerializer(); serializer.preSerialize(); ByteBuffer serialized = serializer.get(); @@ -387,7 +398,7 @@ ShoppingPersistedTabData.class, tab.isIncognito()); CriticalPersistedTabData deserialized = new CriticalPersistedTabData(tab, serialized, config.getStorage(), config.getId()); - Assert.assertEquals(null, deserialized.getOpenerAppId()); + assertEquals(null, deserialized.getOpenerAppId()); } @UiThreadTest @@ -398,19 +409,19 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setUrl(URL_A); - Assert.assertEquals(URL_A, spyCriticalPersistedTabData.getUrl()); + assertEquals(URL_A, spyCriticalPersistedTabData.getUrl()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setUrl(URL_A); - Assert.assertEquals(URL_A, spyCriticalPersistedTabData.getUrl()); + assertEquals(URL_A, spyCriticalPersistedTabData.getUrl()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setUrl(URL_B); - Assert.assertEquals(URL_B, spyCriticalPersistedTabData.getUrl()); + assertEquals(URL_B, spyCriticalPersistedTabData.getUrl()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setUrl(URL_A); - Assert.assertEquals(URL_A, spyCriticalPersistedTabData.getUrl()); + assertEquals(URL_A, spyCriticalPersistedTabData.getUrl()); verify(spyCriticalPersistedTabData, times(3)).save(); spyCriticalPersistedTabData.setUrl(null); @@ -427,19 +438,19 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setTitle(TITLE_A); - Assert.assertEquals(TITLE_A, spyCriticalPersistedTabData.getTitle()); + assertEquals(TITLE_A, spyCriticalPersistedTabData.getTitle()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setTitle(TITLE_A); - Assert.assertEquals(TITLE_A, spyCriticalPersistedTabData.getTitle()); + assertEquals(TITLE_A, spyCriticalPersistedTabData.getTitle()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setTitle(TITLE_B); - Assert.assertEquals(TITLE_B, spyCriticalPersistedTabData.getTitle()); + assertEquals(TITLE_B, spyCriticalPersistedTabData.getTitle()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setTitle(TITLE_A); - Assert.assertEquals(TITLE_A, spyCriticalPersistedTabData.getTitle()); + assertEquals(TITLE_A, spyCriticalPersistedTabData.getTitle()); verify(spyCriticalPersistedTabData, times(3)).save(); spyCriticalPersistedTabData.setTitle(null); @@ -456,19 +467,19 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setRootId(ROOT_ID_A); - Assert.assertEquals(ROOT_ID_A, spyCriticalPersistedTabData.getRootId()); + assertEquals(ROOT_ID_A, spyCriticalPersistedTabData.getRootId()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setRootId(ROOT_ID_A); - Assert.assertEquals(ROOT_ID_A, spyCriticalPersistedTabData.getRootId()); + assertEquals(ROOT_ID_A, spyCriticalPersistedTabData.getRootId()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setRootId(ROOT_ID_B); - Assert.assertEquals(ROOT_ID_B, spyCriticalPersistedTabData.getRootId()); + assertEquals(ROOT_ID_B, spyCriticalPersistedTabData.getRootId()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setRootId(ROOT_ID_A); - Assert.assertEquals(ROOT_ID_A, spyCriticalPersistedTabData.getRootId()); + assertEquals(ROOT_ID_A, spyCriticalPersistedTabData.getRootId()); verify(spyCriticalPersistedTabData, times(3)).save(); } } @@ -481,19 +492,19 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setParentId(PARENT_ID_A); - Assert.assertEquals(PARENT_ID_A, spyCriticalPersistedTabData.getParentId()); + assertEquals(PARENT_ID_A, spyCriticalPersistedTabData.getParentId()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setParentId(PARENT_ID_A); - Assert.assertEquals(PARENT_ID_A, spyCriticalPersistedTabData.getParentId()); + assertEquals(PARENT_ID_A, spyCriticalPersistedTabData.getParentId()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setParentId(PARENT_ID_B); - Assert.assertEquals(PARENT_ID_B, spyCriticalPersistedTabData.getParentId()); + assertEquals(PARENT_ID_B, spyCriticalPersistedTabData.getParentId()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setParentId(PARENT_ID_A); - Assert.assertEquals(PARENT_ID_A, spyCriticalPersistedTabData.getParentId()); + assertEquals(PARENT_ID_A, spyCriticalPersistedTabData.getParentId()); verify(spyCriticalPersistedTabData, times(3)).save(); } } @@ -506,19 +517,48 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setTimestampMillis(TIMESTAMP_A); - Assert.assertEquals(TIMESTAMP_A, spyCriticalPersistedTabData.getTimestampMillis()); + assertEquals(TIMESTAMP_A, spyCriticalPersistedTabData.getTimestampMillis()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setTimestampMillis(TIMESTAMP_A); - Assert.assertEquals(TIMESTAMP_A, spyCriticalPersistedTabData.getTimestampMillis()); + assertEquals(TIMESTAMP_A, spyCriticalPersistedTabData.getTimestampMillis()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setTimestampMillis(TIMESTAMP_B); - Assert.assertEquals(TIMESTAMP_B, spyCriticalPersistedTabData.getTimestampMillis()); + assertEquals(TIMESTAMP_B, spyCriticalPersistedTabData.getTimestampMillis()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setTimestampMillis(TIMESTAMP_A); - Assert.assertEquals(TIMESTAMP_A, spyCriticalPersistedTabData.getTimestampMillis()); + assertEquals(TIMESTAMP_A, spyCriticalPersistedTabData.getTimestampMillis()); + verify(spyCriticalPersistedTabData, times(3)).save(); + } + } + + @UiThreadTest + @SmallTest + @Test + public void testLastNavigationCommittedTimestampMillisSavedWhenNecessary() { + try (StrictModeContext ignored = StrictModeContext.allowAllThreadPolicies()) { + CriticalPersistedTabData spyCriticalPersistedTabData = + spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); + spyCriticalPersistedTabData.setLastNavigationCommittedTimestampMillis(TIMESTAMP_A); + assertEquals(TIMESTAMP_A, + spyCriticalPersistedTabData.getLastNavigationCommittedTimestampMillis()); + verify(spyCriticalPersistedTabData, times(1)).save(); + + spyCriticalPersistedTabData.setLastNavigationCommittedTimestampMillis(TIMESTAMP_A); + assertEquals(TIMESTAMP_A, + spyCriticalPersistedTabData.getLastNavigationCommittedTimestampMillis()); + verify(spyCriticalPersistedTabData, times(1)).save(); + + spyCriticalPersistedTabData.setLastNavigationCommittedTimestampMillis(TIMESTAMP_B); + assertEquals(TIMESTAMP_B, + spyCriticalPersistedTabData.getLastNavigationCommittedTimestampMillis()); + verify(spyCriticalPersistedTabData, times(2)).save(); + + spyCriticalPersistedTabData.setLastNavigationCommittedTimestampMillis(TIMESTAMP_A); + assertEquals(TIMESTAMP_A, + spyCriticalPersistedTabData.getLastNavigationCommittedTimestampMillis()); verify(spyCriticalPersistedTabData, times(3)).save(); } } @@ -531,22 +571,22 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setLaunchTypeAtCreation(TAB_LAUNCH_TYPE_A); - Assert.assertEquals( + assertEquals( TAB_LAUNCH_TYPE_A, spyCriticalPersistedTabData.getTabLaunchTypeAtCreation()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setLaunchTypeAtCreation(TAB_LAUNCH_TYPE_A); - Assert.assertEquals( + assertEquals( TAB_LAUNCH_TYPE_A, spyCriticalPersistedTabData.getTabLaunchTypeAtCreation()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setLaunchTypeAtCreation(TAB_LAUNCH_TYPE_B); - Assert.assertEquals( + assertEquals( TAB_LAUNCH_TYPE_B, spyCriticalPersistedTabData.getTabLaunchTypeAtCreation()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setLaunchTypeAtCreation(TAB_LAUNCH_TYPE_A); - Assert.assertEquals( + assertEquals( TAB_LAUNCH_TYPE_A, spyCriticalPersistedTabData.getTabLaunchTypeAtCreation()); verify(spyCriticalPersistedTabData, times(3)).save(); @@ -564,23 +604,19 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setWebContentsState(WEB_CONTENTS_STATE_A); - Assert.assertEquals( - WEB_CONTENTS_STATE_A, spyCriticalPersistedTabData.getWebContentsState()); + assertEquals(WEB_CONTENTS_STATE_A, spyCriticalPersistedTabData.getWebContentsState()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setWebContentsState(WEB_CONTENTS_STATE_A); - Assert.assertEquals( - WEB_CONTENTS_STATE_A, spyCriticalPersistedTabData.getWebContentsState()); + assertEquals(WEB_CONTENTS_STATE_A, spyCriticalPersistedTabData.getWebContentsState()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setWebContentsState(WEB_CONTENTS_STATE_B); - Assert.assertEquals( - WEB_CONTENTS_STATE_B, spyCriticalPersistedTabData.getWebContentsState()); + assertEquals(WEB_CONTENTS_STATE_B, spyCriticalPersistedTabData.getWebContentsState()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setWebContentsState(WEB_CONTENTS_STATE_A); - Assert.assertEquals( - WEB_CONTENTS_STATE_A, spyCriticalPersistedTabData.getWebContentsState()); + assertEquals(WEB_CONTENTS_STATE_A, spyCriticalPersistedTabData.getWebContentsState()); verify(spyCriticalPersistedTabData, times(3)).save(); spyCriticalPersistedTabData.setWebContentsState(null); @@ -597,19 +633,19 @@ CriticalPersistedTabData spyCriticalPersistedTabData = spy(CriticalPersistedTabData.from(mockTab(TAB_ID, false))); spyCriticalPersistedTabData.setUserAgent(USER_AGENT_A); - Assert.assertEquals(USER_AGENT_A, spyCriticalPersistedTabData.getUserAgent()); + assertEquals(USER_AGENT_A, spyCriticalPersistedTabData.getUserAgent()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setUserAgent(USER_AGENT_A); - Assert.assertEquals(USER_AGENT_A, spyCriticalPersistedTabData.getUserAgent()); + assertEquals(USER_AGENT_A, spyCriticalPersistedTabData.getUserAgent()); verify(spyCriticalPersistedTabData, times(1)).save(); spyCriticalPersistedTabData.setUserAgent(USER_AGENT_B); - Assert.assertEquals(USER_AGENT_B, spyCriticalPersistedTabData.getUserAgent()); + assertEquals(USER_AGENT_B, spyCriticalPersistedTabData.getUserAgent()); verify(spyCriticalPersistedTabData, times(2)).save(); spyCriticalPersistedTabData.setUserAgent(USER_AGENT_A); - Assert.assertEquals(USER_AGENT_A, spyCriticalPersistedTabData.getUserAgent()); + assertEquals(USER_AGENT_A, spyCriticalPersistedTabData.getUserAgent()); verify(spyCriticalPersistedTabData, times(3)).save(); } } @@ -642,7 +678,7 @@ Assert.assertNotEquals("TabUserAgent value is invalid.", flatBufferUserAgentType, UserAgentType.USER_AGENT_UNKNOWN); if (tabUserAgent != TabUserAgent.SIZE) continue; - Assert.assertEquals("TabUserAgent and ProtoUserAgentType should have the same size.", + assertEquals("TabUserAgent and ProtoUserAgentType should have the same size.", flatBufferUserAgentType, UserAgentType.USER_AGENT_SIZE); } } @@ -656,7 +692,7 @@ int tabUserAgent = CriticalPersistedTabData.getTabUserAgentType(type); Assert.assertNotNull("ProtoUserAgentType value is invalid.", tabUserAgent); if (type != UserAgentType.USER_AGENT_SIZE) continue; - Assert.assertEquals("TabUserAgent and ProtoUserAgentType should have the same size.", + assertEquals("TabUserAgent and ProtoUserAgentType should have the same size.", tabUserAgent, TabUserAgent.SIZE); } } @@ -666,31 +702,30 @@ public void testFlatBufferValuesUnchanged() { // FlatBuffer enum values should not be changed as they are persisted across restarts. // Changing them would cause backward compatibility issues crbug.com/1286984. - Assert.assertEquals(-2, LaunchTypeAtCreation.SIZE); - Assert.assertEquals(-1, LaunchTypeAtCreation.UNKNOWN); - Assert.assertEquals(0, LaunchTypeAtCreation.FROM_LINK); - Assert.assertEquals(1, LaunchTypeAtCreation.FROM_EXTERNAL_APP); - Assert.assertEquals(2, LaunchTypeAtCreation.FROM_CHROME_UI); - Assert.assertEquals(3, LaunchTypeAtCreation.FROM_RESTORE); - Assert.assertEquals(4, LaunchTypeAtCreation.FROM_LONGPRESS_FOREGROUND); - Assert.assertEquals(5, LaunchTypeAtCreation.FROM_LONGPRESS_BACKGROUND); - Assert.assertEquals(6, LaunchTypeAtCreation.FROM_REPARENTING); - Assert.assertEquals(7, LaunchTypeAtCreation.FROM_LAUNCHER_SHORTCUT); - Assert.assertEquals(8, LaunchTypeAtCreation.FROM_SPECULATIVE_BACKGROUND_CREATION); - Assert.assertEquals(9, LaunchTypeAtCreation.FROM_BROWSER_ACTIONS); - Assert.assertEquals(10, LaunchTypeAtCreation.FROM_LAUNCH_NEW_INCOGNITO_TAB); - Assert.assertEquals(11, LaunchTypeAtCreation.FROM_STARTUP); - Assert.assertEquals(12, LaunchTypeAtCreation.FROM_START_SURFACE); - Assert.assertEquals(13, LaunchTypeAtCreation.FROM_TAB_GROUP_UI); - Assert.assertEquals(14, LaunchTypeAtCreation.FROM_LONGPRESS_BACKGROUND_IN_GROUP); - Assert.assertEquals(15, LaunchTypeAtCreation.FROM_APP_WIDGET); - Assert.assertEquals(16, LaunchTypeAtCreation.FROM_LONGPRESS_INCOGNITO); - Assert.assertEquals(17, LaunchTypeAtCreation.FROM_RECENT_TABS); - Assert.assertEquals(18, LaunchTypeAtCreation.FROM_READING_LIST); - Assert.assertEquals(19, LaunchTypeAtCreation.FROM_TAB_SWITCHER_UI); - Assert.assertEquals(20, LaunchTypeAtCreation.FROM_RESTORE_TABS_UI); - Assert.assertEquals( - "Need to increment 1 to expected value each time a LaunchTypeAtCreation " + assertEquals(-2, LaunchTypeAtCreation.SIZE); + assertEquals(-1, LaunchTypeAtCreation.UNKNOWN); + assertEquals(0, LaunchTypeAtCreation.FROM_LINK); + assertEquals(1, LaunchTypeAtCreation.FROM_EXTERNAL_APP); + assertEquals(2, LaunchTypeAtCreation.FROM_CHROME_UI); + assertEquals(3, LaunchTypeAtCreation.FROM_RESTORE); + assertEquals(4, LaunchTypeAtCreation.FROM_LONGPRESS_FOREGROUND); + assertEquals(5, LaunchTypeAtCreation.FROM_LONGPRESS_BACKGROUND); + assertEquals(6, LaunchTypeAtCreation.FROM_REPARENTING); + assertEquals(7, LaunchTypeAtCreation.FROM_LAUNCHER_SHORTCUT); + assertEquals(8, LaunchTypeAtCreation.FROM_SPECULATIVE_BACKGROUND_CREATION); + assertEquals(9, LaunchTypeAtCreation.FROM_BROWSER_ACTIONS); + assertEquals(10, LaunchTypeAtCreation.FROM_LAUNCH_NEW_INCOGNITO_TAB); + assertEquals(11, LaunchTypeAtCreation.FROM_STARTUP); + assertEquals(12, LaunchTypeAtCreation.FROM_START_SURFACE); + assertEquals(13, LaunchTypeAtCreation.FROM_TAB_GROUP_UI); + assertEquals(14, LaunchTypeAtCreation.FROM_LONGPRESS_BACKGROUND_IN_GROUP); + assertEquals(15, LaunchTypeAtCreation.FROM_APP_WIDGET); + assertEquals(16, LaunchTypeAtCreation.FROM_LONGPRESS_INCOGNITO); + assertEquals(17, LaunchTypeAtCreation.FROM_RECENT_TABS); + assertEquals(18, LaunchTypeAtCreation.FROM_READING_LIST); + assertEquals(19, LaunchTypeAtCreation.FROM_TAB_SWITCHER_UI); + assertEquals(20, LaunchTypeAtCreation.FROM_RESTORE_TABS_UI); + assertEquals("Need to increment 1 to expected value each time a LaunchTypeAtCreation " + "is added. Also need to add any new LaunchTypeAtCreation to this test.", 23, LaunchTypeAtCreation.names.length); } @@ -703,7 +738,7 @@ CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, CriticalPersistedTabData.getMapperForTesting().map( getFlatBufferWithNoWebContentsState())); - Assert.assertEquals(0, criticalPersistedTabData.getWebContentsState().buffer().limit()); + assertEquals(0, criticalPersistedTabData.getWebContentsState().buffer().limit()); } @SmallTest @@ -713,7 +748,7 @@ Tab tab = new MockTab(1, false); CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab); criticalPersistedTabData.deserialize(getFlatBufferWithNoWebContentsState()); - Assert.assertEquals(0, criticalPersistedTabData.getWebContentsState().buffer().limit()); + assertEquals(0, criticalPersistedTabData.getWebContentsState().buffer().limit()); } @UiThreadTest @@ -767,10 +802,10 @@ CriticalPersistedTabData.class, criticalPersistedTabData); TabStateAttributes.createForTab(uninitializedTab, TabCreationState.FROZEN_ON_RESTORE); TabStateAttributes.from(uninitializedTab).clearTabStateDirtiness(); - Assert.assertEquals(TabStateAttributes.DirtinessState.CLEAN, + assertEquals(TabStateAttributes.DirtinessState.CLEAN, TabStateAttributes.from(uninitializedTab).getDirtinessState()); criticalPersistedTabData.setRootId(ROOT_ID_A); - Assert.assertEquals(TabStateAttributes.DirtinessState.CLEAN, + assertEquals(TabStateAttributes.DirtinessState.CLEAN, TabStateAttributes.from(uninitializedTab).getDirtinessState()); } @@ -780,20 +815,60 @@ public void testSetRootIdInitializedTab() { MockTab initializedTab = new MockTab(1, false); initializedTab.setIsInitialized(true); - Assert.assertTrue(initializedTab.isInitialized()); + assertTrue(initializedTab.isInitialized()); CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(initializedTab); initializedTab.getUserDataHost().setUserData( CriticalPersistedTabData.class, criticalPersistedTabData); TabStateAttributes.createForTab(initializedTab, TabCreationState.FROZEN_ON_RESTORE); TabStateAttributes.from(initializedTab).clearTabStateDirtiness(); - Assert.assertEquals(TabStateAttributes.DirtinessState.CLEAN, + assertEquals(TabStateAttributes.DirtinessState.CLEAN, TabStateAttributes.from(initializedTab).getDirtinessState()); criticalPersistedTabData.setRootId(ROOT_ID_A); Assert.assertNotEquals(TabStateAttributes.DirtinessState.CLEAN, TabStateAttributes.from(initializedTab).getDirtinessState()); } + @SmallTest + @Test + @UiThreadTest + public void testCompatabilityChangeWithOldFlatBuffer() { + FlatBufferBuilder fbb = new FlatBufferBuilder(); + int oaid = fbb.createString(OPENER_APP_ID); + + CriticalPersistedTabDataFlatBufferTest.startCriticalPersistedTabDataFlatBufferTest(fbb); + CriticalPersistedTabDataFlatBufferTest.addParentId(fbb, PARENT_ID); + CriticalPersistedTabDataFlatBufferTest.addRootId(fbb, ROOT_ID); + CriticalPersistedTabDataFlatBufferTest.addTimestampMillis(fbb, TIMESTAMP); + CriticalPersistedTabDataFlatBufferTest.addContentStateVersion(fbb, CONTENT_STATE_VERSION); + CriticalPersistedTabDataFlatBufferTest.addOpenerAppId(fbb, oaid); + CriticalPersistedTabDataFlatBufferTest.addThemeColor(fbb, THEME_COLOR); + CriticalPersistedTabDataFlatBufferTest.addLaunchTypeAtCreation( + fbb, LaunchTypeAtCreationTest.FROM_LINK); + CriticalPersistedTabDataFlatBufferTest.addUserAgent(fbb, UserAgentTypeTest.DEFAULT); + + int r = CriticalPersistedTabDataFlatBufferTest.endCriticalPersistedTabDataFlatBufferTest( + fbb); + fbb.finish(r); + + ByteBuffer byteBuffer = fbb.dataBuffer(); + MockTab tab = new MockTab(TAB_ID, false); + + // Check de-serialization works. + assertTrue(CriticalPersistedTabData.from(tab).deserialize(byteBuffer)); + + CriticalPersistedTabData deserialized = CriticalPersistedTabData.from(tab); + assertEquals(PARENT_ID, deserialized.getParentId()); + assertEquals(ROOT_ID, deserialized.getRootId()); + assertEquals(TIMESTAMP, deserialized.getTimestampMillis()); + assertEquals(CONTENT_STATE_VERSION, deserialized.getContentStateVersion()); + assertEquals(OPENER_APP_ID, deserialized.getOpenerAppId()); + assertEquals(THEME_COLOR, deserialized.getThemeColor()); + assertEquals(LaunchTypeAtCreationTest.FROM_LINK, + (int) deserialized.getTabLaunchTypeAtCreation()); + assertEquals(TabUserAgent.DEFAULT, deserialized.getUserAgent()); + } + private static final ByteBuffer getFlatBufferWithNoWebContentsState() { FlatBufferBuilder fbb = new FlatBufferBuilder(); int oaid = fbb.createString(OPENER_APP_ID); @@ -808,6 +883,9 @@ CriticalPersistedTabDataFlatBuffer.addLaunchTypeAtCreation( fbb, LaunchTypeAtCreation.FROM_LINK); CriticalPersistedTabDataFlatBuffer.addUserAgent(fbb, UserAgentType.DEFAULT); + CriticalPersistedTabDataFlatBuffer.addLastNavigationCommittedTimestampMillis( + fbb, LAST_NAVIGATION_COMMITTED_TIMESTAMP); + int r = CriticalPersistedTabDataFlatBuffer.endCriticalPersistedTabDataFlatBuffer(fbb); fbb.finish(r); return fbb.dataBuffer();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/critical_persisted_tab_data_test_v1.fbs b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/critical_persisted_tab_data_test_v1.fbs new file mode 100644 index 0000000..8f466d4 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/critical_persisted_tab_data_test_v1.fbs
@@ -0,0 +1,82 @@ +// 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. + +namespace org.chromium.chrome.browser.tab.flatbuffer; + +enum LaunchTypeAtCreationTest:int { + // SIZE is typically not used for anything other than bound + // checking but is included for completeness. It is added + // at the start rather than the end to enable other TabLaunchTypes + // to be added. It is not a problem that SIZE is not the same + // enum value as TabLaunchType.SIZE because the FlatBuffer persisted + // enum is mapped directly onto the TabLaunchType value in + // CriticalPersistedTabData. An alternative is to set SIZE to a large + // value but this is not possible as the enum values need to be sequential. + SIZE = -2, + // UNKNOWN indicates the TabLaunchType is null/not known. + UNKNOWN = -1, + FROM_LINK = 0, + FROM_EXTERNAL_APP = 1, + FROM_CHROME_UI = 2, + FROM_RESTORE = 3, + FROM_LONGPRESS_FOREGROUND = 4, + FROM_LONGPRESS_BACKGROUND = 5, + FROM_REPARENTING = 6, + FROM_LAUNCHER_SHORTCUT = 7, + FROM_SPECULATIVE_BACKGROUND_CREATION = 8, + FROM_BROWSER_ACTIONS = 9, + FROM_LAUNCH_NEW_INCOGNITO_TAB = 10, + FROM_STARTUP = 11, + FROM_START_SURFACE = 12, + FROM_TAB_GROUP_UI = 13, + FROM_LONGPRESS_BACKGROUND_IN_GROUP = 14, + FROM_APP_WIDGET = 15, + // Deprecated. Use `FROM_LONGPRESS_FOREGROUND` in new code. + FROM_LONGPRESS_INCOGNITO = 16, + FROM_RECENT_TABS = 17, + FROM_READING_LIST = 18, + FROM_TAB_SWITCHER_UI = 19, + FROM_RESTORE_TABS_UI = 20, + // Add new values here and don't change existing values + // as they are persisted across restarts. Changing existing + // values will lead to backwards compatibility issues crbug.com/1286984. +} + +enum UserAgentTypeTest:int { + DEFAULT = 0, + MOBILE = 1, + DESKTOP = 2, + UNSET = 3, + USER_AGENT_SIZE = 4, + USER_AGENT_UNKNOWN = 5, +} + +table CriticalPersistedTabDataFlatBufferTest { + // Parent Tab identifier. + parent_id:int; + + // Root Tab identifier. + root_id:int; + + // Timestamp when Tab was last accessed. + timestamp_millis:long; + + // WebContentsState. + web_contents_state_bytes:[byte]; + + // Content State version. + content_state_version:int; + + // Identifier for app which opened the Tab. + opener_app_id:string; + + // Theme color. + theme_color:int; + + // Launch type at creation. + launch_type_at_creation:LaunchTypeAtCreationTest; + + // User Agent. + user_agent:UserAgentTypeTest=DEFAULT; +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcherTest.java index e8aa3f7..b847e9c 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcherTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkImageFetcherTest.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.bookmarks; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; @@ -172,6 +173,18 @@ } @Test + public void testFetchFirstTwoImagesForFolder_nullChild() { + doReturn(null).when(mBookmarkModel).getBookmarkById(mBookmarkId2); + + mBookmarkImageFetcher.fetchFirstTwoImagesForFolder(mFolderItem, mFolderDrawablesCallback); + verify(mFolderDrawablesCallback).onResult(mFolderDrawablesCaptor.capture()); + + Pair<Drawable, Drawable> drawables = mFolderDrawablesCaptor.getValue(); + assertNotNull(drawables.first); + assertNull(drawables.second); + } + + @Test public void testFetchImageForBookmarkWithFaviconFallback() { mBookmarkImageFetcher.fetchImageForBookmarkWithFaviconFallback( mBookmarkItem1, mDrawableCallback);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabActivityUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabActivityUnitTest.java new file mode 100644 index 0000000..1bcacb4 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabActivityUnitTest.java
@@ -0,0 +1,85 @@ +// 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. + +package org.chromium.chrome.browser.customtabs; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import android.content.Intent; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.Robolectric; +import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; + +import org.chromium.base.FeatureList; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.flags.ChromeFeatureList; + +import java.util.ArrayList; +import java.util.List; + +/** JUnit tests for CustomTabActivity. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public final class CustomTabActivityUnitTest { + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + private final List<ActivityController> mActivityControllerList = new ArrayList<>(); + + private CustomTabActivity mCustomTabActivity; + + @Before + public void setUp() { + ActivityController<CustomTabActivity> activityController = + Robolectric.buildActivity(CustomTabActivity.class, new Intent()).create(); + mCustomTabActivity = activityController.get(); + mActivityControllerList.add(activityController); + } + + @After + public void tearDown() { + for (ActivityController activityController : mActivityControllerList) { + activityController.destroy(); + } + CustomTabsConnection.setInstanceForTesting(null); + } + + private CustomTabActivity getActivity() { + return mCustomTabActivity; + } + + @Test + public void testPageInsightsHubEnabled() throws Exception { + FeatureList.TestValues testValues = new FeatureList.TestValues(); + testValues.addFeatureFlagOverride(ChromeFeatureList.CCT_PAGE_INSIGHTS_HUB, false); + FeatureList.setTestValues(testValues); + + CustomTabsConnection connection = Mockito.mock(CustomTabsConnection.class); + CustomTabsConnection.setInstanceForTesting(connection); + + assertFalse("PageInsightsHub should be disabled", getActivity().isPageInsightsHubEnabled()); + + testValues.addFeatureFlagOverride(ChromeFeatureList.CCT_PAGE_INSIGHTS_HUB, true); + assertFalse("PageInsightsHub should be disabled", getActivity().isPageInsightsHubEnabled()); + + testValues.addFeatureFlagOverride(ChromeFeatureList.CCT_PAGE_INSIGHTS_HUB, false); + when(connection.shouldEnablePageInsightsForIntent(any())).thenReturn(true); + assertFalse("PageInsightsHub should be disabled", getActivity().isPageInsightsHubEnabled()); + + testValues.addFeatureFlagOverride(ChromeFeatureList.CCT_PAGE_INSIGHTS_HUB, true); + assertTrue("PageInsightsHub should be enabled", getActivity().isPageInsightsHubEnabled()); + } +}
diff --git a/chrome/android/profiles/arm.newest.txt b/chrome/android/profiles/arm.newest.txt index 770c6d3..3f15e69 100644 --- a/chrome/android/profiles/arm.newest.txt +++ b/chrome/android/profiles/arm.newest.txt
@@ -1 +1 @@ -chromeos-chrome-arm-115.0.5785.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-arm-115.0.5786.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 82f5950..8c96aeb 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-115.0.5785.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-115.0.5786.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index fbe997a..11e1b3f 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -1290,6 +1290,63 @@ <message name="IDS_LOGIN_QUICK_START_SETUP" desc="A label on the button. Used on multiple screens in OOBE to allow the user to initiate the Quick Start flow which allows them to set up their Chromebook using an existing Android phone."> Set up with Android phone </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_NETWORK_SCREEN_ENTRY_POINT" desc="A label on the button. Used on OOBE's network screen to allow the user to initiate the Quick Start flow which allows them to set up their Chromebook using an existing Android phone."> + Connect to Wi-Fi with Android phone + </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_SIGNIN_SCREEN_ENTRY_POINT" desc="A label on the button. Used on OOBE's sign-in screen to allow the user to initiate the Quick Start flow which allows them to set up their Chromebook using an existing Android phone."> + Sign in with Android phone + </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_TITLE" desc="A title used on OOBE's Quick Start screen for setting up a Chromebook using an Android device."> + Set up with your Android phone + </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_QR_CODE" desc="A subtitle used on OOBE's Quick Start screen for setting up a Chromebook using an Android device prompting the user to scan the QR code."> + Follow the instructions on your phone to scan the QR code. Make sure your phone's Bluetooth and Wi-Fi are turned on. + <ph name="BR"><br></ph> + <ph name="BR"><br></ph> + You can use your phone to add your Wi-Fi and Google Account info to your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. + <ph name="BR"><br></ph> + <ph name="BR"><br></ph> + Visible to nearby devices as <ph name="QUICK_START_DEVICE_DISPLAY_NAME">$2<ex>Chromebook (123)</ex></ph>... + </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_PIN_CODE" desc="A subtitle used on OOBE's Quick Start screen for setting up a Chromebook using an Android device prompting the user to verify the code shown on the screen."> + Follow the instructions on your phone to verify the code. Make sure your phone's Bluetooth and Wi-Fi are turned on. + <ph name="BR"><br></ph> + <ph name="BR"><br></ph> + You can use your phone to add your Wi-Fi and Google Account info to your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph>. + <ph name="BR"><br></ph> + <ph name="BR"><br></ph> + Visible to nearby devices as <ph name="QUICK_START_DEVICE_DISPLAY_NAME">$2<ex>Chromebook (123)</ex></ph>... + </message> + <message name="IDS_LOGIN_QUICK_START_WIFI_TRANSFER_TITLE" desc="A title used on OOBE's Quick Start screen when WiFi credentials are being transferred to the Chromebook from the Android device."> + Connecting to Wi-Fi... + </message> + <message name="IDS_LOGIN_QUICK_START_WIFI_TRANSFER_SUBTITLE" desc="A subtitle used on OOBE's Quick Start screen when WiFi credentials are being transferred to the Chromebook from the Android device."> + Transfering Wi-Fi from your Android phone + </message> + <message name="IDS_LOGIN_QUICK_START_NETWORK_NEEDED_SUBTITLE" desc="A subtitle used on OOBE's Quick Start flow prompting the user to connect to a WiFi network in order to continue the Chromebook setup using the Android device."> + To continue setup with your Android device, connect your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> to a network + </message> + <message name="IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_TITLE" desc="A title used on OOBE's Quick Start flow when the device reboots after applying an update and tries to continue the setup by connecting to the Android device."> + Connecting to your Android phone... + </message> + <message name="IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_SUBTITLE" desc="A subtitle used on OOBE's Quick Start flow when the device reboots after applying an update and tries to continue the setup by connecting to the Android device."> + Follow the instructions on your phone to continue setup. Make sure your phone is nearby and Bluetooth is turned on. + </message> + <message name="IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_TITLE" desc="A title used on OOBE's Quick Start flow when the user's credentails are being transferred from the Android device to ChromeOS."> + Getting Google Account info... + </message> + <message name="IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_SUBTITLE" desc="A subtitle used on OOBE's Quick Start flow when the user's credentails are being transferred from the Android device to ChromeOS."> + Transfering Google Account info from your Android phone + </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_TITLE" desc="A title used on OOBE's Quick Start screen for signing-in into their Chromebook using an Android device prompting the user to scan a QR code."> + Sign in with your Android phone + </message> + <message name="IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_SUBTITLE" desc="A subtitle used on OOBE's Quick Start screen for signing-in into their Chromebook using an Android device."> + Follow the instructions on your phone to scan the QR code. Make sure your phone's Bluetooth is on. + <ph name="BR"><br></ph> + <ph name="BR"><br></ph> + Visible to nearby devices as <ph name="QUICK_START_DEVICE_DISPLAY_NAME">$1<ex>Chromebook (123)</ex></ph>... + </message> <message name="IDS_LOGIN_MARKETING_OPT_IN_SCREEN_SWIPE_FROM_SHELF_LABEL" desc="The label shown in ChromeOS system shelf above a drag handle UI on the last dialog in the set of screens displayed to the user on the first login to the ChromeOS device. The label informs the user that swiping up from the shelf will start the session."> Swipe up to get started </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_SUBTITLE.png.sha1 new file mode 100644 index 0000000..8eee107 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +b46ee31528a3c3f473608587d143465b395a0f03 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_TITLE.png.sha1 new file mode 100644 index 0000000..8eee107 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_TITLE.png.sha1
@@ -0,0 +1 @@ +b46ee31528a3c3f473608587d143465b395a0f03 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_NETWORK_NEEDED_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_NETWORK_NEEDED_SUBTITLE.png.sha1 new file mode 100644 index 0000000..87239a3 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_NETWORK_NEEDED_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +bb5652f6a18beae908f5dfb3c74467ece1698d81 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_SUBTITLE.png.sha1 new file mode 100644 index 0000000..eaa9bb35 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +d5a8d6a79d03d707983821fa1ef9b11e90994e48 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_TITLE.png.sha1 new file mode 100644 index 0000000..eaa9bb35 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_TITLE.png.sha1
@@ -0,0 +1 @@ +d5a8d6a79d03d707983821fa1ef9b11e90994e48 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_SUBTITLE.png.sha1 new file mode 100644 index 0000000..2eae469 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +14e5fe3cea51864e3d8d3d3023eccdfe8d4c5650 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_TITLE.png.sha1 new file mode 100644 index 0000000..2eae469 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_TITLE.png.sha1
@@ -0,0 +1 @@ +14e5fe3cea51864e3d8d3d3023eccdfe8d4c5650 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_NETWORK_SCREEN_ENTRY_POINT.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_NETWORK_SCREEN_ENTRY_POINT.png.sha1 new file mode 100644 index 0000000..5deb7b6 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_NETWORK_SCREEN_ENTRY_POINT.png.sha1
@@ -0,0 +1 @@ +73fcffc244ff2e9b4910117028f61b14c571b4a7 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SIGNIN_SCREEN_ENTRY_POINT.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SIGNIN_SCREEN_ENTRY_POINT.png.sha1 new file mode 100644 index 0000000..bff6e381 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SIGNIN_SCREEN_ENTRY_POINT.png.sha1
@@ -0,0 +1 @@ +4ed92446b11767c0b080b1240fc7fa11bbb118d7 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_PIN_CODE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_PIN_CODE.png.sha1 new file mode 100644 index 0000000..cb351d89 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_PIN_CODE.png.sha1
@@ -0,0 +1 @@ +b937328e070fd7d8bd53eab303c8e90f50f09075 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_QR_CODE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_QR_CODE.png.sha1 new file mode 100644 index 0000000..ffa62f5 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_QR_CODE.png.sha1
@@ -0,0 +1 @@ +2694497819b6ca3433ebe37646b5239e4a3b80d5 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_TITLE.png.sha1 new file mode 100644 index 0000000..ffa62f5 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_SETUP_TITLE.png.sha1
@@ -0,0 +1 @@ +2694497819b6ca3433ebe37646b5239e4a3b80d5 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_WIFI_TRANSFER_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_WIFI_TRANSFER_SUBTITLE.png.sha1 new file mode 100644 index 0000000..af23d0a --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_WIFI_TRANSFER_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +d52151ac29f5c743fbc5c4bc26a728ffec91a8bd \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_WIFI_TRANSFER_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_WIFI_TRANSFER_TITLE.png.sha1 new file mode 100644 index 0000000..af23d0a --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_QUICK_START_WIFI_TRANSFER_TITLE.png.sha1
@@ -0,0 +1 @@ +d52151ac29f5c743fbc5c4bc26a728ffec91a8bd \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index aa53112d..45856959 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -1186,6 +1186,12 @@ <message name="IDS_FIND_AND_EDIT_MENU" desc="The text label of the Find and edit sub menu item"> &Find and edit </message> + <message name="IDS_PARENT_BLOCKED_SITE_BANNER_TITLE" desc="The banner title for the first time a user is blocked from a website because of parental controls"> + New: Family Link choices for Chrome apply here + </message> + <message name="IDS_PARENT_BLOCKED_SITE_BANNER_MESSAGE" desc="The banner message for the first time a user is blocked from a website because of parental controls"> + The settings your parent chose are now keeping you safer online + </message> <message name="IDS_PASSWORD_MANAGER_SUBMENU_OPTION" desc="The text label of the password manager for the passwords and autofill submenu"> &Google Password Manager </message> @@ -5804,6 +5810,12 @@ <message name="IDS_EXTENSIONS_MENU_SITE_SETTINGS_TOGGLE_OFF_ACCESSIBLE_NAME" desc="Accessibility string for the site setting toggle button when is off.'"> Select to allow extensions on this site </message> + <message name="IDS_EXTENSIONS_MENU_MESSAGE_SECTION_RESTRICTED_ACCESS_TEXT" desc="Text of the message section when this site is restricted to all extensions."> + No extensions need access to this site + </message> + <message name="IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT" desc="Text of the message section when the user blocked access to this site to all extensions."> + Extensions are blocked on this site + </message> <message name="IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE" desc="Title of the requests access section that lists the extensions requesting site access"> Requests access </message> @@ -14333,7 +14345,7 @@ You’re getting standard protection </message> <message name="IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION_UPDATED" desc="Description shown in the Android message when the account tailored security setting changes for a consented primary account"> - You’re getting standard security protection for this Chrome profile + You’re getting standard security protection on this device </message> <message name="IDS_TAILORED_SECURITY_CONSENTED_MESSAGE_OK_BUTTON" desc="The text on the ok button in the Android message when the account tailored security setting changes for a consented primary account"> OK
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_MESSAGE_SECTION_RESTRICTED_ACCESS_TEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_MESSAGE_SECTION_RESTRICTED_ACCESS_TEXT.png.sha1 new file mode 100644 index 0000000..df65a5e --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_MESSAGE_SECTION_RESTRICTED_ACCESS_TEXT.png.sha1
@@ -0,0 +1 @@ +247cd66462b1966a1ec4efc940d30580bbb29a5b \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT.png.sha1 new file mode 100644 index 0000000..7703ce639 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT.png.sha1
@@ -0,0 +1 @@ +c5a412cd9133ba56bca57688126e164b281296ae \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PARENT_BLOCKED_SITE_BANNER_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_PARENT_BLOCKED_SITE_BANNER_MESSAGE.png.sha1 new file mode 100644 index 0000000..999d50c --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_PARENT_BLOCKED_SITE_BANNER_MESSAGE.png.sha1
@@ -0,0 +1 @@ +d85c09f6a737ae05b69046553163c237b41d49dd \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PARENT_BLOCKED_SITE_BANNER_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_PARENT_BLOCKED_SITE_BANNER_TITLE.png.sha1 new file mode 100644 index 0000000..999d50c --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_PARENT_BLOCKED_SITE_BANNER_TITLE.png.sha1
@@ -0,0 +1 @@ +d85c09f6a737ae05b69046553163c237b41d49dd \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION_UPDATED.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION_UPDATED.png.sha1 index c64c0c3..05990e0 100644 --- a/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION_UPDATED.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION_UPDATED.png.sha1
@@ -1 +1 @@ -b378647903e9b0c19714efa6ceb56ca3e6e41b0d \ No newline at end of file +d19b4fb01370487612177a52f60b64f8d7b67285 \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index f775378..e522f5c 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Tanca les pestanyes de la dreta</translation> <translation id="1166583374608765787">Revisa l'actualització del nom</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> pertany a l'escriptori <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Prova d'utilitzar una contrasenya nova</translation> <translation id="1168020859489941584">Obrint a <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Canvia automàticament l'idioma perquè coincideixi amb el contingut seleccionat</translation> <translation id="1169266963600477608">Controls del joc</translation> @@ -907,6 +908,7 @@ <translation id="177336675152937177">Dades d'aplicacions allotjades</translation> <translation id="1776712937009046120">Afegeix un usuari</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Mantén premuda la tecla de cerca per canviar entre les tecles de funció i les tecles de la fila superior del sistema</translation> <translation id="1778457539567749232">Marca com a no llegit</translation> <translation id="1778991607452011493">Envia registres de depuració (opció recomanada)</translation> <translation id="1779441632304440041">Les contrasenyes poc segures són fàcils d'endevinar. Assegura't de crear contrasenyes segures.</translation> @@ -1348,6 +1350,7 @@ <translation id="2142582065325732898">Activa <ph name="LINK1_BEGIN" />Sincronització de Chrome<ph name="LINK1_END" /> per veure les pestanyes recents de Chrome. <ph name="LINK2_BEGIN" />Més informació<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Mostra sempre la barra d'eines en el mode de pantalla completa</translation> <translation id="2143778271340628265">Configuració del servidor intermediari manual</translation> +<translation id="2143808295261240440">Utilitza la contrasenya recomanada</translation> <translation id="2143915448548023856">Configuració de visualització</translation> <translation id="2144536955299248197">Lector de certificats: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Desenvolupament d'aplicacions d'Android a Linux</translation> @@ -2333,6 +2336,7 @@ <translation id="2963151496262057773">El connector següent no respon: <ph name="PLUGIN_NAME" />. Voleu aturar-lo?</translation> <translation id="2964193600955408481">Desactiva la Wi-Fi</translation> <translation id="2964245677645334031">Visibilitat de Compartició Nearby</translation> +<translation id="2966705348606485669">Més opcions per a la carpeta d'adreces d'interès <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Gestiona les preferències d'Android</translation> <translation id="2967926928600500959">Es forçarà l'obertura en un navegador específic dels URL que compleixin aquestes regles.</translation> <translation id="2972581237482394796">&Refés</translation> @@ -2622,6 +2626,7 @@ <translation id="3244294424315804309">Continua silenciant el so</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" />: error de la xarxa</translation> <translation id="3248902735035392926">La seguretat és important. Dedica ara un moment a <ph name="BEGIN_LINK" />consultar les extensions<ph name="END_LINK" />.</translation> +<translation id="3249323165366527554">Registra't i inicia la sessió més ràpidament quan la contrasenya s'hagi desat al <ph name="GOOGLE_PASSWORD_MANAGER" /> per a <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Permet que <ph name="SUPERVISED_USER_NAME" /> accedeixi a l'Assistent de Google amb "Hey Google"</translation> <translation id="3251759466064201842"><No forma part del certificat></translation> <translation id="325238099842880997">Defineix regles digitals bàsiques per ajudar els nens a jugar, explorar i fer el treball escolar a casa</translation> @@ -4115,6 +4120,7 @@ <translation id="4556194354084985730">Inicia fàcilment la sessió en aplicacions i llocs web amb les teves contrasenyes desades. Quan aquesta opció estigui desactivada, se't demanarà la confirmació abans d'iniciar la sessió.</translation> <translation id="4558426062282641716">S'ha sol·licitat permís per iniciar-se automàticament</translation> <translation id="4559617833001311418">Aquest lloc web està accedint als teus sensors de llum i moviment.</translation> +<translation id="4560728518401799797">Més opcions per a l'adreça d'interès <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">No s'ha canviat cap permís recentment</translation> <translation id="4562155214028662640">Afegeix una empremta digital</translation> <translation id="4563210852471260509">L'idioma inicial d'entrada és el xinès</translation> @@ -4398,6 +4404,7 @@ <translation id="4819323978093861656">{0,plural, =0{S'està tancant ara.}=1{Es tancarà d'aquí a 1 segon}other{Es tancarà d'aquí a # segons}}</translation> <translation id="4819607494758673676">Notificacions de l'Assistent de Google</translation> <translation id="4820236583224459650">Estableix com a tiquet actiu</translation> +<translation id="4820795723433418303">Utilitza les tecles de funció com a tecles de la fila superior</translation> <translation id="4821935166599369261">Creació de &perfils activada</translation> <translation id="4823484602432206655">Llegir i canviar la configuració d'usuari i del dispositiu</translation> <translation id="4824037980212326045">Còpia de seguretat i restauració de Linux</translation> @@ -4529,6 +4536,7 @@ <translation id="4925320384394644410">Els ports es mostraran aquí</translation> <translation id="49265687513387605">No es pot emetre la pantalla. Comprova que hagis confirmat la sol·licitud per començar a compartir la pantalla.</translation> <translation id="4927753642311223124">No hi ha cap notificació, podeu continuar.</translation> +<translation id="4928629450964837566">Utilitza una contrasenya més segura</translation> <translation id="4929386379796360314">Destinacions d'impressió</translation> <translation id="4930447554870711875">Desenvolupadors</translation> <translation id="4930714375720679147">Activa</translation> @@ -4611,6 +4619,7 @@ <translation id="5010886807652684893">Visualització visual</translation> <translation id="5015344424288992913">Resolent el servidor intermediari...</translation> <translation id="5016491575926936899">Pots enviar missatges de text des de l'ordinador, compartir la connexió a Internet, respondre a les notificacions de conversa i desbloquejar el dispositiu <ph name="DEVICE_TYPE" /> amb el telèfon.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Prova d'utilitzar una contrasenya nova</translation> <translation id="5017643436812738274">Pots navegar per les pàgines amb un cursor de text. Prem Ctrl+Cerca+7 per desactivar aquesta funció.</translation> <translation id="5018207570537526145">Obre el lloc web de l'extensió</translation> <translation id="5018526990965779848">Envia dades d'ús i de diagnòstic. Ajuda a millorar la teva experiència a Android enviant automàticament a Google dades de diagnòstic, del dispositiu i d'ús d'aplicacions. Aquestes dades ajudaran a millorar l'estabilitat del sistema i de les aplicacions, entre altres característiques. Una part de les dades agregades també serà útil per a les aplicacions i per als partners de Google, com ara els desenvolupadors d'Android. Si tens activada l'opció Activitat al web i en aplicacions addicional, és possible que aquestes dades es desin al teu Compte de Google.</translation> @@ -4679,6 +4688,7 @@ <translation id="5078638979202084724">Afegeix totes les pestanyes a les adreces d'interès</translation> <translation id="5078796286268621944">PIN incorrecte</translation> <translation id="5079010647467150187">Afegeix una VPN integrada...</translation> +<translation id="5079699784114005398">Un cop activada aquesta opció, les teves aplicacions estaran disponibles en qualsevol dispositiu ChromeOS després d'iniciar la sessió amb el teu Compte de Google. Les aplicacions web instal·lades des del navegador Chrome se sincronitzaran encara que la sincronització del navegador estigui desactivada.</translation> <translation id="508059534790499809">Actualitza un tiquet de Kerberos</translation> <translation id="5081960376148623587">Tria si vols precarregar les pàgines</translation> <translation id="5084328598860513926">El flux de proveïment s'ha interromput. Torna-ho a provar o contacta amb el propietari o l'administrador del dispositiu. Codi d'error: <ph name="ERROR_CODE" />.</translation> @@ -4754,6 +4764,7 @@ <translation id="5145464978649806571">Si t'apartes del dispositiu, la pantalla es bloquejarà automàticament. Quan siguis davant del dispositiu, la pantalla es mantindrà activa més temps. Si la pantalla de bloqueig està desactivada, el dispositiu entrarà en mode de repòs en lloc de bloquejar-se.</translation> <translation id="514575469079499857">Utilitza l'adreça IP per determinar la ubicació (opció predeterminada)</translation> <translation id="5146896637028965135">Veu del sistema</translation> +<translation id="5147992672778369947">Utilitza la contrasenya recomanada</translation> <translation id="5148277445782867161">El servei d'ubicació de Google utilitza fonts com ara sensors, xarxes mòbils i Wi-Fi per calcular la ubicació del dispositiu.</translation> <translation id="5150254825601720210">Nom del servidor SSL de certificats de Netscape</translation> <translation id="5151354047782775295">Si no alliberes espai de disc pot ser que algunes dades se suprimeixin automàticament</translation> @@ -5041,6 +5052,7 @@ <translation id="5414566801737831689">Llegeix les icones dels llocs web visitats</translation> <translation id="5414836363063783498">S'està verificant...</translation> <translation id="5417312524372586921">Temes del navegador</translation> +<translation id="5417353542809767994">Utilitza una contrasenya segura ràpidament</translation> <translation id="541737483547792035">Amplia la pantalla</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Sol·licita una contrasenya per desbloquejar el dispositiu i millorar la seguretat</translation> @@ -5161,6 +5173,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Configura amb el telèfon Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Protegeix millor aquest compte amb una contrasenya segura. Es desarà al <ph name="GOOGLE_PASSWORD_MANAGER" /> per a <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Aquesta pàgina d'inici és la que esperàveu?</translation> <translation id="5522156646677899028">Aquesta extensió conté una vulnerabilitat de seguretat greu.</translation> <translation id="5522403133543437426">Motor de cerca que s'utilitza a la barra d'adreces.</translation> @@ -5777,6 +5790,7 @@ <translation id="6070311415473175157">Selecciona l'àrea de la imatge per fer una cerca</translation> <translation id="6071181508177083058">confirmeu la contrasenya</translation> <translation id="6071576563962215370">El sistema no ha pogut establir el bloqueig dels atributs de temps d'instal·lació del dispositiu.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> de memòria estalviada</translation> <translation id="6072442788591997866">No es permet <ph name="APP_NAME" /> en aquest dispositiu. Contacta amb l'administrador. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Atura la gravació</translation> <translation id="6073903501322152803">Afegeix funcions d'accessibilitat</translation> @@ -5824,6 +5838,7 @@ <translation id="6104068876731806426">Comptes de Google</translation> <translation id="6104311680260824317">No es pot connectar el dispositiu al domini. El servidor no admet els tipus d'encriptació de Kerberos especificats. Pots accedir a la configuració d'encriptació des de Més opcions.</translation> <translation id="6104796831253957966">La impressora té la cua plena</translation> +<translation id="6104929924898022309">Utilitza la tecla de cerca per canviar el comportament de les tecles de funció</translation> <translation id="6106167152849320869">Si també has decidit enviar dades de diagnòstic i d'ús al pas anterior, es recolliran per a les aplicacions instal·lades.</translation> <translation id="6111972606040028426">Activa l'Assistent de Google</translation> <translation id="6112294629795967147">Toca la finestra per canviar-ne la mida</translation> @@ -5965,6 +5980,7 @@ <translation id="6234108445915742946">Les condicions del servei de Chrome canviaran el 31 de març</translation> <translation id="6234474535228214774">Instal·lació pendent</translation> <translation id="6235208551686043831">La càmera del dispositiu s'ha activat. Posa el codi QR de l'eSIM davant de la càmera.</translation> +<translation id="6237297174664969437">Pots anar a la configuració de Chrome en qualsevol moment per decidir quines dades del navegador vols sincronitzar. Pots controlar la sincronització de les aplicacions web instal·lades des del navegador Chrome a la <ph name="LINK_BEGIN" />configuració del dispositiu<ph name="LINK_END" />. És possible que Google personalitzi la Cerca i altres serveis en funció del teu historial.</translation> <translation id="6237474966939441970">Aplicació per prendre notes amb el llapis òptic</translation> <translation id="623755660902014047">Mode de lectura</translation> <translation id="6238767809035845642">Text compartit d'un altre dispositiu</translation> @@ -6298,6 +6314,7 @@ <translation id="6537613839935722475">El nom pot incloure lletres, números i guionets (-)</translation> <translation id="6538098297809675636">S'ha produït un error en detectar el codi</translation> <translation id="653920215766444089">S'està cercant un dispositiu apuntador</translation> +<translation id="6539674013849300372">Protegeix-te més en línia amb una contrasenya segura. Es desarà al <ph name="GOOGLE_PASSWORD_MANAGER" /> per a <ph name="EMAIL" />.</translation> <translation id="653983593749614101">S'està reprenent...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Nota:<ph name="END_BOLD" /> activeu aquesta opció només si sabeu què esteu fent o si se us ha demanat que ho feu, ja que la recollida de dades pot reduir el rendiment.</translation> <translation id="6541638731489116978">No es permet que aquest lloc web accedeixi als sensors de moviment.</translation> @@ -6492,6 +6509,7 @@ <translation id="671226373742585927">Fes clic al botó "X" per tancar el tauler lateral</translation> <translation id="6712943853047024245">Ja has desat una contrasenya amb aquest nom d'usuari per a <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Afegeix un perfil de treball</translation> +<translation id="6713441551032149301">Mantén premuda la tecla del menú d'aplicacions per canviar entre les tecles de funció i les tecles de la fila superior del sistema</translation> <translation id="6713668088933662563">No ofereixis mai traduir d'aquests idiomes</translation> <translation id="6715803357256707211">S'ha produït un error en instal·lar l'aplicació per a Linux. Fes clic a la notificació per veure'n els detalls.</translation> <translation id="671619610707606484">Amb aquesta acció s'esborraran dades emmagatzemades pels llocs web (<ph name="TOTAL_USAGE" />)</translation> @@ -6613,6 +6631,7 @@ <translation id="6811034713472274749">Ja es pot veure la pàgina</translation> <translation id="6811151703183939603">Ferm</translation> <translation id="6811332638216701903">Nom d'amfitrió de DHCP</translation> +<translation id="6811792477922751991">Utilitza la tecla del menú d'aplicacions per canviar el comportament de les tecles de funció</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> no pot executar-se com a arrel.</translation> <translation id="6812841287760418429">Mantén els canvis</translation> <translation id="6813907279658683733">Tota la pantalla</translation> @@ -7807,6 +7826,7 @@ <translation id="7851720427268294554">Analitzador d'IPP</translation> <translation id="78526636422538552">L'opció per afegir més Comptes de Google està desactivada</translation> <translation id="7853747251428735">Més &eines</translation> +<translation id="7853999103056713222">Utilitza una contrasenya més segura</translation> <translation id="7855678561139483478">Mou la pestanya a una finestra nova</translation> <translation id="7857004848504343806">L'ordinador conté un mòdul de seguretat, que s'utilitza per implementar un gran nombre de funcions de seguretat clau a ChromeOS Flex. Visita el Centre d'ajuda de Chromebook per obtenir més informació: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Suggeriments de text</translation> @@ -8363,6 +8383,7 @@ <translation id="8325413836429495820">Sense permís per veure el porta-retalls</translation> <translation id="8326478304147373412">PKCS #7, cadena de certificats</translation> <translation id="8327386430364625757">Font matemàtica</translation> +<translation id="8327538105740918488">Pots canviar aquesta contrasenya més endavant. Es desarà al <ph name="GOOGLE_PASSWORD_MANAGER" /> per a <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Configuració dels permisos i del contingut</translation> <translation id="8330617762701840933">La llista de llocs web que redirigeixen a un navegador alternatiu.</translation> <translation id="8330689128072902965">Els contactes propers poden compartir contingut amb tu. Fes clic per canviar.</translation> @@ -8508,6 +8529,7 @@ <translation id="8449836157089738489">Obre'ls tots en un grup de pestanyes nou</translation> <translation id="8451512073679317615">Assistent</translation> <translation id="845702320058262034">No es pot establir la connexió. Comprova que el Bluetooth del telèfon estigui activat.</translation> +<translation id="8457251154056341970">No tornaràs a veure <ph name="MODULE_NAME" /> en aquesta pàgina</translation> <translation id="8457451314607652708">Importa les adreces d'interès</translation> <translation id="8458341576712814616">Drecera</translation> <translation id="8458627787104127436">Obre'ls tots (<ph name="URL_COUNT" />) en una finestra nova</translation> @@ -8580,6 +8602,7 @@ <translation id="8514955299594277296">No permetis que els llocs web desin dades al teu dispositiu (opció no recomanada)</translation> <translation id="8517759303731677493">Edita…</translation> <translation id="8519895319663397036">No es poden importar les contrasenyes. La mida del fitxer ha de ser inferior a 150 kB.</translation> +<translation id="851991974800416566">Utilitza una contrasenya segura ràpidament</translation> <translation id="8523493869875972733">Mantén els canvis</translation> <translation id="8523849605371521713">Afegida per la política</translation> <translation id="8524783101666974011">Desa targetes al Compte de Google</translation> @@ -8737,6 +8760,7 @@ <translation id="8665110742939124773">Has introduït un codi d'accés incorrecte. Torna-ho a provar.</translation> <translation id="8665180165765946056">Còpia de seguretat completada</translation> <translation id="866611985033792019">Confia en aquest certificat per identificar els usuaris de correu electrònic</translation> +<translation id="8666268818656583275">Ara les tecles de funció tindran el mateix comportament que les tecles de la fila superior</translation> <translation id="8666321716757704924">S'han tornat a concedir els permisos per a <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">Sobre la personalització d'anuncis basada en el navegador</translation> <translation id="8667261224612332309">Tens contrasenyes que es poden millorar</translation> @@ -9419,6 +9443,7 @@ <translation id="950307215746360464">Guia de configuració</translation> <translation id="951991426597076286">Rebutja</translation> <translation id="952471655966876828">El dispositiu es desconnectarà automàticament quan s'encengui o s'estigui fent servir</translation> +<translation id="952880932803612259">Permet que les aplicacions, els llocs web i els serveis del sistema utilitzin la teva ubicació. La ubicació pot utilitzar fonts com ara la Wi‑Fi, les xarxes mòbils i els sensors per calcular la ubicació del dispositiu.</translation> <translation id="953434574221655299">Amb permís per saber quan estàs utilitzant el dispositiu de manera activa</translation> <translation id="956500788634395331">Tens protecció contra les extensions potencialment perjudicials</translation> <translation id="957179356621191750">6 punts</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 0089b22f..1cbe253b 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Cau'r Tabiau i'r Dde</translation> <translation id="1166583374608765787">Adolygu diweddariad enw</translation> <translation id="1166596238782048887">Mae <ph name="TAB_TITLE" /> yn perthyn i ddesg <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Rhowch gynnig ar gyfrinair newydd</translation> <translation id="1168020859489941584">Wrthi'n agor mewn <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Newid iaith i gyd-fynd â'r cynnwys a ddewisir yn awtomatig</translation> <translation id="1169266963600477608">Rheolaethau gêm</translation> @@ -921,6 +922,7 @@ <translation id="177336675152937177">Data ap sy'n cael ei westeio</translation> <translation id="1776712937009046120">Ychwanegu defnyddiwr</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Daliwch y fysell chwilio i newid rhwng bysellau swyddogaeth a bysellau rhes uchaf y system</translation> <translation id="1778457539567749232">Marcio ei fod heb ei ddarllen</translation> <translation id="1778991607452011493">Anfon logiau dadfygio (argymhellir)</translation> <translation id="1779441632304440041">Mae'n hawdd dyfalu cyfrineiriau gwan. Gwnewch yn siŵr eich bod yn creu cyfrineiriau cryf.</translation> @@ -1363,6 +1365,7 @@ <translation id="2142582065325732898">Trowch <ph name="LINK1_BEGIN" />Chrome Sync<ph name="LINK1_END" /> ymlaen i weld tabiau Chrome diweddar. <ph name="LINK2_BEGIN" />Dysgu rhagor<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Dangos y Bar Offer yn y Sgrîn Lawn o Hyd</translation> <translation id="2143778271340628265">Ffurfweddu dirprwy weinydd yn bwrpasol</translation> +<translation id="2143808295261240440">Defnyddiwch y Cyfrinair a Argymhellir</translation> <translation id="2143915448548023856">Gosodiadau sgrîn</translation> <translation id="2144536955299248197">Dangosydd Tystysgrifau: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Datblygiad apiau Android Linux</translation> @@ -2351,6 +2354,7 @@ <translation id="2963151496262057773">Nid yw'r ategyn yn ymateb: <ph name="PLUGIN_NAME" />Hoffech chi ei atal?</translation> <translation id="2964193600955408481">Analluogi Wi-Fi</translation> <translation id="2964245677645334031">Gwelededd Rhannu Gerllaw</translation> +<translation id="2966705348606485669">Rhagor o opsiynau ar gyfer ffolder nodau tudalen <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Rheoli dewisiadau Android</translation> <translation id="2967926928600500959">Bydd cyfeiriadau URL sy'n cyfateb i'r rheolau hyn yn cael eu gorfodi i agor mewn porwr penodol.</translation> <translation id="2972581237482394796">&Ailwneud</translation> @@ -2640,6 +2644,7 @@ <translation id="3244294424315804309">Parhau i ddistewi'r sain</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - Gwall rhwydwaith</translation> <translation id="3248902735035392926">Mae diogelwch yn bwysig. Cymerwch eiliad ac <ph name="BEGIN_LINK" />edrychwch ar eich estyniadau nawr<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Cofrestrwch a mewngofnodwch yn gyflymach pan fydd eich cyfrinair yn cael ei gadw'n awtomatig i <ph name="GOOGLE_PASSWORD_MANAGER" /> ar gyfer <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Caniatáu i <ph name="SUPERVISED_USER_NAME" /> gyrchu Google Assistant â "Hei Google"</translation> <translation id="3251759466064201842"><Ddim yn Rhan o'r Dystysgrif></translation> <translation id="325238099842880997">Pennwch reolau sylfaenol digidol i helpu plant i chwarae, archwilio a gwneud gwaith ysgol gartref</translation> @@ -4135,6 +4140,7 @@ <translation id="4556194354084985730">Mewngofnodi i wefannau ac apiau yn haws gyda'ch cyfrineiriau sydd wedi'u cadw. Pan fydd wedi'i ddiffodd, gofynnir i chi gadarnhau cyn mewngofnodi.</translation> <translation id="4558426062282641716">Gofynnwyd am y caniatâd i awto-lansio</translation> <translation id="4559617833001311418">Mae'r wefan hon yn cyrchu eich synwyryddion symudiad neu olau.</translation> +<translation id="4560728518401799797">Rhagor o opsiynau ar gyfer nod tudalen <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Dim caniatadau sydd wedi newid yn ddiweddar</translation> <translation id="4562155214028662640">Ychwanegu Olion Bysedd</translation> <translation id="4563210852471260509">Yr iaith mewnbwn gychwynnol yw Tsieinëeg</translation> @@ -4418,6 +4424,7 @@ <translation id="4819323978093861656">{0,plural, =0{Wrthi'n cau nawr.}=1{Wrthi'n cau nawr mewn: 1 eiliad}two{Wrthi'n cau nawr mewn: # eiliad}few{Wrthi'n cau nawr mewn: # eiliad}many{Wrthi'n cau nawr mewn: # eiliad}other{Wrthi'n cau nawr mewn: # eiliad}}</translation> <translation id="4819607494758673676">Hysbysiadau Google Assistant</translation> <translation id="4820236583224459650">Gosod fel tocyn gweithredol</translation> +<translation id="4820795723433418303">Defnyddio bysellau swyddogaeth fel bysellau rhes uchaf</translation> <translation id="4821935166599369261">&Proffilio wedi'i Alluogi</translation> <translation id="4823484602432206655">Darllen a newid gosodiadau defnyddiwr a dyfais</translation> <translation id="4824037980212326045">Gwneud copi wrth gefn ac adfer Linux</translation> @@ -4549,6 +4556,7 @@ <translation id="4925320384394644410">Bydd eich pyrth yn ymddangos yma</translation> <translation id="49265687513387605">Methu â chastio'r sgrîn. Gwiriwch i weld a wnaethoch gadarnhau'r anogwr i ddechrau rhannu'ch sgrîn.</translation> <translation id="4927753642311223124">Dim i'w weld yma, symudwch ymlaen.</translation> +<translation id="4928629450964837566">Defnyddiwch gyfrinair mwy diogel</translation> <translation id="4929386379796360314">Cyrchfannau Argraffu</translation> <translation id="4930447554870711875">Datblygwyr</translation> <translation id="4930714375720679147">Troi Ymlaen</translation> @@ -4631,6 +4639,7 @@ <translation id="5010886807652684893">Gwedd weledol</translation> <translation id="5015344424288992913">Wrthi'n datrys y dirprwy weinydd...</translation> <translation id="5016491575926936899">Gallwch anfon negeseuon testun o'ch cyfrifiadur, rhannu eich cysylltiad rhyngrwyd, ymateb i hysbysiadau negeseuon a datgloi eich <ph name="DEVICE_TYPE" /> gyda'ch ffôn.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Rhowch Gynnig ar Gyfrinair Newydd</translation> <translation id="5017643436812738274">Gallwch lywio tudalennau gyda chyrchwr testun. Pwyswch Ctrl+Search+7 i'w ddiffodd.</translation> <translation id="5018207570537526145">Agor gwefan yr estyniad</translation> <translation id="5018526990965779848">Anfon data defnydd a diagnostig. Helpwch i wella'ch profiad Android drwy anfon data diagnostig, dyfais a defnydd apiau yn awtomatig at Google. Bydd hyn yn helpu sefydlogrwydd system ac ap a gwelliannau eraill. Bydd rhywfaint o ddata cyfanredol hefyd yn helpu apiau a phartneriaid Google, megis datblygwyr Android. Os caiff eich gosodiad Gweithgarwch ar y We ac Apiau ychwanegol ei droi ymlaen, gellir cadw'r data hyn i'ch Cyfrif Google.</translation> @@ -4699,6 +4708,7 @@ <translation id="5078638979202084724">Creu nod tudalen ar gyfer pob tab</translation> <translation id="5078796286268621944">PIN anghywir</translation> <translation id="5079010647467150187">Ychwanegu VPN integredig...</translation> +<translation id="5079699784114005398">Ar ôl eu troi ymlaen, bydd eich apiau ar gael ar unrhyw ddyfeisiau ChromeOS ar ôl i chi fewngofnodi gyda'ch Cyfrif Google. Bydd apiau gwe sydd wedi'u gosod o borwr Chrome yn cael eu cysoni hyd yn oed os yw cysoni porwr wedi'i ddiffodd.</translation> <translation id="508059534790499809">Ail-lwytho tocyn Kerberos</translation> <translation id="5081960376148623587">Dewis a ddylid rhaglwytho tudalennau</translation> <translation id="5084328598860513926">Methu â chwblhau'r llif darparu. Rhowch gynnig arall arni neu cysylltwch â pherchennog neu weinyddwr eich dyfais. Cod gwall: <ph name="ERROR_CODE" />.</translation> @@ -4774,6 +4784,7 @@ <translation id="5145464978649806571">Os byddwch yn symud i ffwrdd o'ch dyfais, bydd eich sgrîn yn cloi yn awtomatig. Pan fyddwch o flaen eich dyfais, bydd eich sgrîn yn aros yn effro yn hirach. Os yw clo sgrîn wedi'i analluogi, bydd eich dyfais yn cysgu yn lle cloi.</translation> <translation id="514575469079499857">Defnyddio'ch cyfeiriad IP i bennu'ch lleoliad (diofyn)</translation> <translation id="5146896637028965135">Llais system</translation> +<translation id="5147992672778369947">Defnyddiwch y cyfrinair a argymhellir</translation> <translation id="5148277445782867161">Mae gwasanaeth lleoliad Google yn defnyddio ffynonellau megis Wi-Fi, rhwydweithiau symudol, a synwyryddion i helpu i amcangyfrif lleoliad eich dyfais.</translation> <translation id="5150254825601720210">Enw Gweinydd SSL Tystysgrif Netscape</translation> <translation id="5151354047782775295">Crëwch ragor o le ar y disg neu mae'n bosib y bydd rhai data yn cael eu dileu yn awtomatig</translation> @@ -5060,6 +5071,7 @@ <translation id="5414566801737831689">Darllen eiconau'r gwefannau rydych yn ymweld â nhw</translation> <translation id="5414836363063783498">Wrthi'n gwirio…</translation> <translation id="5417312524372586921">Themâu porwr</translation> +<translation id="5417353542809767994">Defnyddiwch gyfrinair cryf yn gyflym</translation> <translation id="541737483547792035">Chwyddo'r sgrîn</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Gofyn am gyfrinair er mwyn datgloi dyfais ar gyfer diogelwch ychwanegol</translation> @@ -5180,6 +5192,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Gosod gyda ffôn Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Cadwch y cyfrif hwn yn fwy diogel gyda chyfrinair cryf. Bydd yn cael ei gadw i <ph name="GOOGLE_PASSWORD_MANAGER" /> ar gyfer <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Ai hon yw'r dudalen hafan yr oeddech yn ei disgwyl?</translation> <translation id="5522156646677899028">Mae'r estyniad hwn yn cynnwys gwendid diogelwch difrifol.</translation> <translation id="5522403133543437426">Peiriant chwilio sy'n cael ei ddefnyddio yn y bar cyfeiriadau.</translation> @@ -5798,6 +5811,7 @@ <translation id="6070311415473175157">Dewis ardal llun i chwilio</translation> <translation id="6071181508177083058">cadarnhewch eich cyfrinair</translation> <translation id="6071576563962215370">Methodd y system â sefydlu clo priodweddau amser gosod y ddyfais.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> o gof wedi'i gadw</translation> <translation id="6072442788591997866">Ni chaniateir <ph name="APP_NAME" /> ar y ddyfais hon. Cysylltwch â'ch gweinyddwr. Cod gwall: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Stopio recordio</translation> <translation id="6073903501322152803">Ychwanegu nodweddion hygyrchedd</translation> @@ -5845,6 +5859,7 @@ <translation id="6104068876731806426">Cyfrifon Google</translation> <translation id="6104311680260824317">Methu ag ymuno'r ddyfais i'r parth. Nid yw'r gweinydd yn cefnogi mathau amgryptio Kerberos a nodwyd. Gwiriwch "Rhagor o ddewisiadau" ar gyfer gosodiadau amgryptio.</translation> <translation id="6104796831253957966">Mae ciw yr argraffydd yn llawn</translation> +<translation id="6104929924898022309">Defnyddiwch y fysell chwilio i newid ymddygiad bysellau swyddogaeth</translation> <translation id="6106167152849320869">Os dewisoch chi hefyd i anfon data diagnostig a data defnydd yn y cam blaenorol, bydd y data hyn yn cael eu casglu ar gyfer apiau sydd wedi'u gosod.</translation> <translation id="6111972606040028426">Galluogi Google Assistant</translation> <translation id="6112294629795967147">Cyffyrddwch i newid maint</translation> @@ -5986,6 +6001,7 @@ <translation id="6234108445915742946">Mae Telerau Gwasanaeth Chrome yn newid ar 31 Mawrth</translation> <translation id="6234474535228214774">Wrthi'n aros i osod</translation> <translation id="6235208551686043831">Mae camera'r ddyfais wedi'i droi ymlaen. Rhowch eich Cod QR eSIM o flaen y camera.</translation> +<translation id="6237297174664969437">Gallwch bob amser ddewis pa ddata porwr i'w cysoni yng ngosodiadau Chrome. Yng <ph name="LINK_BEGIN" />ngosodiadau'r ddyfais<ph name="LINK_END" />, gallwch reoli cysoni ar gyfer apiau gwe sydd wedi'u gosod o borwr Chrome. Gall Google bersonoleiddio Search a gwasanaethau eraill yn seiliedig ar eich hanes.</translation> <translation id="6237474966939441970">Ap cymryd nodiadau â phwyntil ysgrifennu</translation> <translation id="623755660902014047">Modd darllen</translation> <translation id="6238767809035845642">Testun sydd wedi'i rannu o Ddyfais Arall</translation> @@ -6319,6 +6335,7 @@ <translation id="6537613839935722475">Gall yr enw ddefnyddio llythrennau, rhifau a chysylltnodau (-)</translation> <translation id="6538098297809675636">Bu gwall wrth ganfod cod</translation> <translation id="653920215766444089">Wrthi'n chwilio am ddyfais sy'n pwyntio</translation> +<translation id="6539674013849300372">Byddwch yn fwy diogel ar-lein gyda chyfrinair cryf. Bydd yn cael ei gadw i <ph name="GOOGLE_PASSWORD_MANAGER" /> ar gyfer <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Wrthi'n parhau...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Sylwer:<ph name="END_BOLD" /> Galluogi dim ond os ydych yn gwybod beth rydych yn ei wneud neu os gofynnwyd i chi wneud hynny, gan y gallai casglu data leihau perfformiad.</translation> <translation id="6541638731489116978">Rydym wedi rhwystro'r wefan hon rhag cael mynediad at eich synwyryddion symudiad.</translation> @@ -6521,6 +6538,7 @@ <translation id="671226373742585927">Cliciwch y botwm "X" i gau'r panel ochr</translation> <translation id="6712943853047024245">Rydych eisoes wedi cadw cyfrinair gyda'r enw defnyddiwr hwn ar ei gyfer <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Ychwanegu Proffil Gwaith</translation> +<translation id="6713441551032149301">Daliwch fysell y lansiwr i newid rhwng bysellau swyddogaeth a bysellau rhes uchaf y system</translation> <translation id="6713668088933662563">Peidiwch byth â chynnig cyfieithu'r ieithoedd hyn</translation> <translation id="6715803357256707211">Bu gwall wrth osod eich ap Linux. Cliciwch ar yr hysbysiad am fanylion.</translation> <translation id="671619610707606484">Bydd hyn yn clirio <ph name="TOTAL_USAGE" /> o ddata sydd wedi'u storio gan wefannau</translation> @@ -6642,6 +6660,7 @@ <translation id="6811034713472274749">Mae'r dudalen yn barod i'w gweld</translation> <translation id="6811151703183939603">Cadarn</translation> <translation id="6811332638216701903">Enw Gwesteiwr DHCP</translation> +<translation id="6811792477922751991">Defnyddiwch y fysell lansiwr i newid ymddygiad bysellau swyddogaeth</translation> <translation id="6812349420832218321">Ni ellir rhedeg <ph name="PRODUCT_NAME" /> fel gwreiddyn.</translation> <translation id="6812841287760418429">Cadw'r newidiadau</translation> <translation id="6813907279658683733">Sgrîn Gyfan</translation> @@ -7836,6 +7855,7 @@ <translation id="7851720427268294554">Dosrannwr IPP</translation> <translation id="78526636422538552">Mae ychwanegu rhagor o Gyfrifon Google wedi'i analluogi</translation> <translation id="7853747251428735">Rhagor o O&ffer</translation> +<translation id="7853999103056713222">Defnyddiwch Gyfrinair Mwy Diogel</translation> <translation id="7855678561139483478">Symud y tab i ffenestr newydd</translation> <translation id="7857004848504343806">Mae eich cyfrifiadur yn cynnwys modiwl diogel, a ddefnyddir i weithredu llawer o nodweddion diogelwch critigol yn ChromeOS Flex. Ewch i Ganolfan Gymorth Chromebook i ddysgu rhagor: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Awgrymiadau testun</translation> @@ -8390,6 +8410,7 @@ <translation id="8325413836429495820">Ni chaniateir gweld eich clipfwrdd</translation> <translation id="8326478304147373412">PKCS #7, cadwyn tystysgrifau</translation> <translation id="8327386430364625757">Ffont mathemategol</translation> +<translation id="8327538105740918488">Gallwch chi bob amser newid y cyfrinair hwn yn nes ymlaen. Bydd yn cael ei gadw i <ph name="GOOGLE_PASSWORD_MANAGER" /> ar gyfer <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Caniatadau a gosodiadau cynnwys</translation> <translation id="8330617762701840933">Y rhestr o wefannau sy'n ailgyfeirio i borwr amgen.</translation> <translation id="8330689128072902965">Gall cysylltiadau gerllaw rannu gyda chi. Cliciwch i newid.</translation> @@ -8411,6 +8432,7 @@ <translation id="8345848587667658367">Gallwch bellach weld lluniau, cyfryngau, hysbysiadau ac apiau diweddar eich ffôn</translation> <translation id="8347227221149377169">Ffeiliau i'w hargraffu</translation> <translation id="834785183489258869">Pan fyddwch yn y modd Anhysbys, ni all gwefannau ddefnyddio'ch cwcis i weld eich gweithgarwch pori ar draws gwahanol wefannau, er enghraifft, i bersonoleiddio hysbysebion. Mae'n bosib na fydd nodweddion ar rai gwefannau yn gweithio.</translation> +<translation id="8349826889576450703">lansiwr</translation> <translation id="8350789879725387295">Offer pwyntil yn y doc</translation> <translation id="8351316842353540018">Dangos dewisiadau a11y bob amser</translation> <translation id="8351419472474436977">Mae'r estyniad hwn wedi cymryd rheolaeth o'ch gosodiadau dirprwyol, sy'n golygu y gall newid, torri, neu glustfeinio ar unrhyw beth a wnewch ar-lein. Os nad ydych yn siŵr pam y digwyddodd y newid hwn, mae'n debyg nad ydych ei eisiau.</translation> @@ -8534,6 +8556,7 @@ <translation id="8449836157089738489">Agor pob un mewn grŵp tabiau newydd</translation> <translation id="8451512073679317615">cynorthwyydd</translation> <translation id="845702320058262034">Methu â chysylltu. Gwnewch yn siŵr bod Bluetooth eich ffôn wedi'i droi ymlaen.</translation> +<translation id="8457251154056341970">Ni fyddwch yn gweld <ph name="MODULE_NAME" /> ar y dudalen hon eto</translation> <translation id="8457451314607652708">Mewnforio nodau tudalen</translation> <translation id="8458341576712814616">Llwybr byr</translation> <translation id="8458627787104127436">Agor pob un (<ph name="URL_COUNT" />) mewn ffenestr newydd</translation> @@ -8606,6 +8629,7 @@ <translation id="8514955299594277296">Peidio â chaniatáu i wefannau gadw data ar eich dyfais (nid argymhellir)</translation> <translation id="8517759303731677493">Golygu…</translation> <translation id="8519895319663397036">Methu â mewnforio cyfrineiriau. Dylai maint y ffeil fod yn llai na 150 KB.</translation> +<translation id="851991974800416566">Defnyddiwch Gyfrinair Cryf yn Gyflym</translation> <translation id="8523493869875972733">Cadw'r Newidiadau</translation> <translation id="8523849605371521713">Ychwanegwyd gan bolisi</translation> <translation id="8524783101666974011">Cadw cardiau yn eich Cyfrif Google</translation> @@ -8763,6 +8787,7 @@ <translation id="8665110742939124773">Rydych wedi rhoi cod mynediad anghywir. Rhowch gynnig arall arni.</translation> <translation id="8665180165765946056">Mae gwneud copïau wrth gefn wedi'i gwblhau</translation> <translation id="866611985033792019">Ymddiried yn y dystysgrif hon i adnabod defnyddwyr e-bost</translation> +<translation id="8666268818656583275">Bydd gan fysellau F nawr yr un ymddygiad â bysellau rhes uchaf y system</translation> <translation id="8666321716757704924">Cafwyd caniatâd eto ar gyfer <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">Ynglŷn â phersonoleiddio hysbysebion ar sail Porwr</translation> <translation id="8667261224612332309">Mae gennych gyfrineiriau y gellir eu gwella</translation> @@ -9449,6 +9474,7 @@ <translation id="950307215746360464">Canllaw gosod</translation> <translation id="951991426597076286">Gwrthod</translation> <translation id="952471655966876828">Bydd y ddyfais yn cysylltu'n awtomatig pan fydd wedi'i throi ymlaen ac yn cael ei defnyddio</translation> +<translation id="952880932803612259">Caniatáu i apiau, gwefannau a gwasanaethau system ddefnyddio'ch lleoliad. Gall lleoliad ddefnyddio ffynonellau megis Wi-Fi, rhwydweithiau symudol, a synwyryddion i helpu i amcangyfrif lleoliad eich dyfais.</translation> <translation id="953434574221655299">Caniateir i wybod pan fyddwch wrthi'n defnyddio'ch dyfais</translation> <translation id="956500788634395331">Rydych y cael eich amddiffyn rhag estyniadau a allai fod yn niweidiol</translation> <translation id="957179356621191750">6-dot</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index eb8ff70..1f04359 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Close Tabs to the Right</translation> <translation id="1166583374608765787">Review name update</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> belongs to desk <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Try a new password</translation> <translation id="1168020859489941584">Opening in <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Automatically change language to match selected content</translation> <translation id="1169266963600477608">Game controls</translation> @@ -918,6 +919,7 @@ <translation id="177336675152937177">Hosted app data</translation> <translation id="1776712937009046120">Add user</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Hold the search key to change between function keys and system top-row keys</translation> <translation id="1778457539567749232">Mark as unread</translation> <translation id="1778991607452011493">Send debug logs (recommended)</translation> <translation id="1779441632304440041">Weak passwords are easy to guess. Make sure that you’re creating strong passwords.</translation> @@ -1360,6 +1362,7 @@ <translation id="2142582065325732898">Turn on <ph name="LINK1_BEGIN" />Chrome Sync<ph name="LINK1_END" /> to view recent Chrome tabs. <ph name="LINK2_BEGIN" />Learn more<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Always Show Toolbar in Full Screen</translation> <translation id="2143778271340628265">Manual proxy configuration</translation> +<translation id="2143808295261240440">Use Recommended Password</translation> <translation id="2143915448548023856">Display settings</translation> <translation id="2144536955299248197">Certificate Viewer: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android app development</translation> @@ -2348,6 +2351,7 @@ <translation id="2963151496262057773">The following plug-in is unresponsive: <ph name="PLUGIN_NAME" />Would you like to stop it?</translation> <translation id="2964193600955408481">Disable Wi-Fi</translation> <translation id="2964245677645334031">Nearby Share visibility</translation> +<translation id="2966705348606485669">More options for <ph name="FOLDER_TITLE" /> bookmark folder</translation> <translation id="2966937470348689686">Manage Android preferences</translation> <translation id="2967926928600500959">URLs matching these rules will be forced to open in a specific browser.</translation> <translation id="2972581237482394796">&Redo</translation> @@ -2637,6 +2641,7 @@ <translation id="3244294424315804309">Continue muting sound</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Network error</translation> <translation id="3248902735035392926">Safety matters. Take a moment and <ph name="BEGIN_LINK" />check your extensions now<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Sign up and sign in faster when your password is automatically saved to <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Let <ph name="SUPERVISED_USER_NAME" /> access Google Assistant with 'Hey Google'</translation> <translation id="3251759466064201842"><Not part of certificate></translation> <translation id="325238099842880997">Set digital ground rules to help children play, explore and do schoolwork at home</translation> @@ -4132,6 +4137,7 @@ <translation id="4556194354084985730">Easily sign in to sites and apps with your saved passwords. When turned off, you’ll be asked before signing in.</translation> <translation id="4558426062282641716">Auto-launch permission requested</translation> <translation id="4559617833001311418">This site is accessing your motion or light sensors.</translation> +<translation id="4560728518401799797">More options for <ph name="FOLDER_TITLE" /> bookmark</translation> <translation id="4561893854334016293">No recently changed permissions</translation> <translation id="4562155214028662640">Add Fingerprint</translation> <translation id="4563210852471260509">Initial input language is Chinese</translation> @@ -4415,6 +4421,7 @@ <translation id="4819323978093861656">{0,plural, =0{Closing now.}=1{Closing in: 1 second}other{Closing in: # seconds}}</translation> <translation id="4819607494758673676">Google Assistant notifications</translation> <translation id="4820236583224459650">Set as active ticket</translation> +<translation id="4820795723433418303">Use function keys as Chromebook top row keys</translation> <translation id="4821935166599369261">&Profiling Enabled</translation> <translation id="4823484602432206655">Read and change user and device settings</translation> <translation id="4824037980212326045">Linux backup and restore</translation> @@ -4546,6 +4553,7 @@ <translation id="4925320384394644410">Your ports will appear here</translation> <translation id="49265687513387605">Unable to cast screen. Check to see if you confirmed the prompt to start sharing your screen.</translation> <translation id="4927753642311223124">Nothing to see here, move along.</translation> +<translation id="4928629450964837566">Use a safer password</translation> <translation id="4929386379796360314">Print destinations</translation> <translation id="4930447554870711875">Developers</translation> <translation id="4930714375720679147">Turn On</translation> @@ -4628,6 +4636,7 @@ <translation id="5010886807652684893">Visual view</translation> <translation id="5015344424288992913">Resolving proxy...</translation> <translation id="5016491575926936899">You can text from your computer, share your Internet connection, reply to conversation notifications and unlock your <ph name="DEVICE_TYPE" /> with your phone.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Try a New Password</translation> <translation id="5017643436812738274">You can navigate pages with a text cursor. Press Ctrl+Search+7 to turn off.</translation> <translation id="5018207570537526145">Open extension website</translation> <translation id="5018526990965779848">Send usage and diagnostic data. Help improve your Android experience by automatically sending diagnostic, device and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If your additional Web & App Activity setting is turned on, this data may be saved to your Google Account.</translation> @@ -4696,6 +4705,7 @@ <translation id="5078638979202084724">Bookmark all tabs</translation> <translation id="5078796286268621944">Incorrect PIN</translation> <translation id="5079010647467150187">Add built-in VPN…</translation> +<translation id="5079699784114005398">Once turned on, your apps will be available on any ChromeOS devices after you sign in with your Google Account. Web apps installed from Chrome browser will be synced even if browser sync is turned off.</translation> <translation id="508059534790499809">Refresh a Kerberos ticket</translation> <translation id="5081960376148623587">Choose whether to preload pages</translation> <translation id="5084328598860513926">Provisioning flow was interrupted. Please try again or contact your device owner or administrator. Error code: <ph name="ERROR_CODE" />.</translation> @@ -4771,6 +4781,7 @@ <translation id="5145464978649806571">If you move away from your device, your screen will lock automatically. When you're in front of your device, your screen will stay awake longer. If lock screen is disabled, your device will sleep instead of lock.</translation> <translation id="514575469079499857">Use your IP address to determine location (default)</translation> <translation id="5146896637028965135">System voice</translation> +<translation id="5147992672778369947">Use recommended password</translation> <translation id="5148277445782867161">Google's location service uses sources such as Wi-Fi, mobile networks and sensors to help estimate your device’s location.</translation> <translation id="5150254825601720210">Netscape Certificate SSL Server Name</translation> <translation id="5151354047782775295">Free up disk space or select data may be automatically deleted</translation> @@ -5057,6 +5068,7 @@ <translation id="5414566801737831689">Read the icons of the websites that you visit</translation> <translation id="5414836363063783498">Verifying…</translation> <translation id="5417312524372586921">Browser themes</translation> +<translation id="5417353542809767994">Quickly use a strong password</translation> <translation id="541737483547792035">Magnify screen</translation> <translation id="5419405654816502573">Voice match</translation> <translation id="5420274697768050645">Require password to unlock device for added security</translation> @@ -5177,6 +5189,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Set up with Android phone</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Keep this account more secure with a strong password. It will be saved to <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Is this the home page that you were expecting?</translation> <translation id="5522156646677899028">This extension contains a serious security vulnerability.</translation> <translation id="5522403133543437426">Search engine used in the address bar.</translation> @@ -5795,6 +5808,7 @@ <translation id="6070311415473175157">Select image area to search</translation> <translation id="6071181508177083058">confirm password</translation> <translation id="6071576563962215370">The system failed to establish the device installation-time attributes lock.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> of memory saved</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> isn't allowed on this device. Contact your administrator. Error code: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Stop recording</translation> <translation id="6073903501322152803">Add accessibility features</translation> @@ -5842,6 +5856,7 @@ <translation id="6104068876731806426">Google Accounts</translation> <translation id="6104311680260824317">Can't join the device to the domain. The server does not support specified Kerberos encryption types. Check 'More options' for encryption settings.</translation> <translation id="6104796831253957966">Printer queue is full</translation> +<translation id="6104929924898022309">Use the search key to change the behaviour of function keys</translation> <translation id="6106167152849320869">If you also chose to send diagnostic and usage data in the previous step, this data will be collected for installed apps.</translation> <translation id="6111972606040028426">Enable Google Assistant</translation> <translation id="6112294629795967147">Touch to resize</translation> @@ -5983,6 +5998,7 @@ <translation id="6234108445915742946">Chrome's Terms of Service are changing on 31 March</translation> <translation id="6234474535228214774">Install pending</translation> <translation id="6235208551686043831">Device camera has turned on. Please place your eSIM QR code in front of the camera.</translation> +<translation id="6237297174664969437">You can always choose what browser data to sync in Chrome settings. In <ph name="LINK_BEGIN" />device settings<ph name="LINK_END" />, you can control sync for web apps installed from Chrome browser. Google may personalise Search and other services based on your history.</translation> <translation id="6237474966939441970">Stylus note-taking app</translation> <translation id="623755660902014047">Reading mode</translation> <translation id="6238767809035845642">Text shared from other device</translation> @@ -6316,6 +6332,7 @@ <translation id="6537613839935722475">The name can use letters, numbers and hyphens (-)</translation> <translation id="6538098297809675636">Error detecting code</translation> <translation id="653920215766444089">Searching for pointing device</translation> +<translation id="6539674013849300372">Stay safer online with a strong password. It will be saved to <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Resuming…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Note:<ph name="END_BOLD" /> Only enable if you know what you are doing or if you have been asked to do so, as collection of data may reduce performance.</translation> <translation id="6541638731489116978">This site has been blocked from accessing your motion sensors.</translation> @@ -6510,6 +6527,7 @@ <translation id="671226373742585927">Click the 'X' button to close the side panel</translation> <translation id="6712943853047024245">You already saved a password with this username for <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Add work profile</translation> +<translation id="6713441551032149301">Hold the launcher key to change between function keys and system top-row keys</translation> <translation id="6713668088933662563">Never offer to translate these languages</translation> <translation id="6715803357256707211">An error occurred during installation of your Linux application. Click on the notification for details.</translation> <translation id="671619610707606484">This will clear <ph name="TOTAL_USAGE" /> of data stored by sites</translation> @@ -6631,6 +6649,7 @@ <translation id="6811034713472274749">Page is ready to view</translation> <translation id="6811151703183939603">Firm</translation> <translation id="6811332638216701903">DHCP hostname</translation> +<translation id="6811792477922751991">Use the launcher key to change the behaviour of function keys</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> cannot be run as root.</translation> <translation id="6812841287760418429">Keep changes</translation> <translation id="6813907279658683733">Entire screen</translation> @@ -7825,6 +7844,7 @@ <translation id="7851720427268294554">IPP Parser</translation> <translation id="78526636422538552">Addition of more Google accounts is disabled</translation> <translation id="7853747251428735">More Too&ls</translation> +<translation id="7853999103056713222">Use a Safer Password</translation> <translation id="7855678561139483478">Move tab to new window</translation> <translation id="7857004848504343806">Your computer contains a secure module, which is used to implement many critical security features in Chrome OS Flex. Visit the Chromebook Help Centre to learn more: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Text suggestions</translation> @@ -8380,6 +8400,7 @@ <translation id="8325413836429495820">Not allowed to see your clipboard</translation> <translation id="8326478304147373412">PKCS #7, certificate chain</translation> <translation id="8327386430364625757">Mathematical font</translation> +<translation id="8327538105740918488">You can always change this password later. It will be saved to <ph name="GOOGLE_PASSWORD_MANAGER" /> for <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Permissions and content settings</translation> <translation id="8330617762701840933">The list of websites that redirect to alternative browser.</translation> <translation id="8330689128072902965">Nearby contacts can share with you. Click to change.</translation> @@ -8525,6 +8546,7 @@ <translation id="8449836157089738489">Open all in new tab group</translation> <translation id="8451512073679317615">assistant</translation> <translation id="845702320058262034">Can’t connect. Make sure that your phone’s Bluetooth is turned on.</translation> +<translation id="8457251154056341970">You won't see <ph name="MODULE_NAME" /> on this page again</translation> <translation id="8457451314607652708">Import bookmarks</translation> <translation id="8458341576712814616">Shortcut</translation> <translation id="8458627787104127436">Open all (<ph name="URL_COUNT" />) in new window</translation> @@ -8597,6 +8619,7 @@ <translation id="8514955299594277296">Don't allow sites to save data on your device (not recommended)</translation> <translation id="8517759303731677493">Edit…</translation> <translation id="8519895319663397036">Can't import passwords. The file size should be less than 150 KB.</translation> +<translation id="851991974800416566">Quickly Use a Strong Password</translation> <translation id="8523493869875972733">Keep Changes</translation> <translation id="8523849605371521713">Added by policy</translation> <translation id="8524783101666974011">Save cards in your Google Account</translation> @@ -8754,6 +8777,7 @@ <translation id="8665110742939124773">You've entered an incorrect access code. Try again.</translation> <translation id="8665180165765946056">Backup complete</translation> <translation id="866611985033792019">Trust this certificate for identifying email users</translation> +<translation id="8666268818656583275">F keys will now have the behaviour as system top-row keys</translation> <translation id="8666321716757704924">Permissions allowed again for <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">About browser-based ad personalisation</translation> <translation id="8667261224612332309">You have passwords that can be improved</translation> @@ -9436,6 +9460,7 @@ <translation id="950307215746360464">Setup guide</translation> <translation id="951991426597076286">Decline</translation> <translation id="952471655966876828">Device will connect automatically when it's turned on and is being used</translation> +<translation id="952880932803612259">Allow apps, websites and system services to use your location. Location may use sources like GPS, Wi‑Fi, mobile networks and sensors to help estimate your device’s location.</translation> <translation id="953434574221655299">Allowed to know when you're actively using your device</translation> <translation id="956500788634395331">You're protected from potentially harmful extensions</translation> <translation id="957179356621191750">6-dot</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index c456365..b7b82dd 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Cerrar pestañas a la derecha</translation> <translation id="1166583374608765787">Revisa la actualización del nombre</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> pertenece al escritorio <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Prueba una contraseña nueva</translation> <translation id="1168020859489941584">Abriendo en <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Cambiar automáticamente el idioma para que coincida con el contenido seleccionado</translation> <translation id="1169266963600477608">Controles del juego</translation> @@ -907,6 +908,7 @@ <translation id="177336675152937177">Datos de aplicaciones alojadas</translation> <translation id="1776712937009046120">Añadir usuario</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Mantén pulsada la tecla de búsqueda para cambiar entre las teclas de función y las teclas del sistema de la fila superior</translation> <translation id="1778457539567749232">Marcar como no leída</translation> <translation id="1778991607452011493">Enviar registros de depuración (recomendado)</translation> <translation id="1779441632304440041">Las contraseñas poco seguras son fáciles de adivinar. Asegúrate de que tus contraseñas sean seguras.</translation> @@ -1348,6 +1350,7 @@ <translation id="2142582065325732898">Activa la función <ph name="LINK1_BEGIN" />Sincronización de Chrome<ph name="LINK1_END" /> para ver pestañas recientes de Chrome. <ph name="LINK2_BEGIN" />Más información<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Mostrar siempre la barra de herramientas en el modo de pantalla completa</translation> <translation id="2143778271340628265">Configuración de proxy manual</translation> +<translation id="2143808295261240440">Usa una contraseña recomendada</translation> <translation id="2143915448548023856">Configuración de pantalla</translation> <translation id="2144536955299248197">Visor de certificados: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Desarrollo de aplicaciones Android en Linux</translation> @@ -2334,6 +2337,7 @@ <translation id="2963151496262057773">El complemento <ph name="PLUGIN_NAME" /> no responde. ¿Quieres detenerlo?</translation> <translation id="2964193600955408481">Inhabilitar Wi-Fi</translation> <translation id="2964245677645334031">Visibilidad de Compartir con Nearby</translation> +<translation id="2966705348606485669">Más opciones de la carpeta de marcadores <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Gestionar preferencias de Android</translation> <translation id="2967926928600500959">Las URLs que se correspondan con estas reglas serán forzadas a abrirse en un navegador concreto.</translation> <translation id="2972581237482394796">&Rehacer</translation> @@ -2623,6 +2627,7 @@ <translation id="3244294424315804309">Seguir silenciando el sonido</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" />: error de red</translation> <translation id="3248902735035392926">Tu seguridad es importante. Dedica un momento a <ph name="BEGIN_LINK" />revisar tus extensiones<ph name="END_LINK" /> ahora</translation> +<translation id="3249323165366527554">Regístrate e inicia sesión más rápido cuando tu contraseña se guarde automáticamente en el <ph name="GOOGLE_PASSWORD_MANAGER" /> de <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Permite que <ph name="SUPERVISED_USER_NAME" /> acceda al Asistente de Google diciendo "Hey Google"</translation> <translation id="3251759466064201842"><No incluido en el certificado></translation> <translation id="325238099842880997">Pon unas normas digitales básicas que ayuden a los niños a jugar, explorar y hacer sus deberes en casa</translation> @@ -4116,6 +4121,7 @@ <translation id="4556194354084985730">Inicia sesión fácilmente en sitios y aplicaciones con tus contraseñas guardadas. Si desactivas esta opción, se te pedirá la contraseña para poder iniciar sesión.</translation> <translation id="4558426062282641716">Solicitud de permiso de inicio automático</translation> <translation id="4559617833001311418">Este sitio web tiene acceso a tus sensores de luz o movimiento.</translation> +<translation id="4560728518401799797">Más opciones del marcador <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">No se ha cambiado ningún permiso recientemente</translation> <translation id="4562155214028662640">Añadir huella digital</translation> <translation id="4563210852471260509">El lenguaje de entrada inicial es el chino.</translation> @@ -4399,6 +4405,7 @@ <translation id="4819323978093861656">{0,plural, =0{Cerrando}=1{Se cerrarán en 1 segundo}other{Se cerrarán en # segundos}}</translation> <translation id="4819607494758673676">Notificaciones del Asistente de Google</translation> <translation id="4820236583224459650">Definir como ticket activo</translation> +<translation id="4820795723433418303">Usar las teclas de función como teclas de la fila superior</translation> <translation id="4821935166599369261">Perfiles &habilitados</translation> <translation id="4823484602432206655">Leer y cambiar la configuración del dispositivo y del usuario</translation> <translation id="4824037980212326045">Copia de seguridad y restauración de Linux</translation> @@ -4530,6 +4537,7 @@ <translation id="4925320384394644410">Tus puertos aparecerán aquí</translation> <translation id="49265687513387605">No se ha podido enviar la pantalla. Comprueba si has confirmado que se empiece a compartir en el mensaje correspondiente.</translation> <translation id="4927753642311223124">Aquí no hay nada que ver, circulen...</translation> +<translation id="4928629450964837566">Usa una contraseña más segura</translation> <translation id="4929386379796360314">Destinos de impresión</translation> <translation id="4930447554870711875">Desarrolladores</translation> <translation id="4930714375720679147">Activar</translation> @@ -4612,6 +4620,7 @@ <translation id="5010886807652684893">Vista visual</translation> <translation id="5015344424288992913">Resolviendo proxy...</translation> <translation id="5016491575926936899">Puedes enviar mensajes de texto desde tu ordenador, compartir tu conexión a Internet, responder a notificaciones de conversaciones y desbloquear tu <ph name="DEVICE_TYPE" /> con el teléfono.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Prueba una contraseña nueva</translation> <translation id="5017643436812738274">Puedes desplazarte por las páginas con un cursor de texto. Pulsa Ctrl + tecla de búsqueda + 7 para desactivar esta función.</translation> <translation id="5018207570537526145">Abrir sitio web de la extensión</translation> <translation id="5018526990965779848">Envía datos de uso y diagnóstico. Contribuye a mejorar tu experiencia de Android enviando automáticamente a Google datos de diagnóstico, del dispositivo y del uso de las aplicaciones. Los datos servirán para aumentar la estabilidad de las aplicaciones y del sistema y realizar otras mejoras. Parte de los datos agregados también ayudarán a las aplicaciones y a los partners de Google, como los desarrolladores de Android. Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en tu cuenta de Google.</translation> @@ -4680,6 +4689,7 @@ <translation id="5078638979202084724">Añadir todas las pestañas a marcadores</translation> <translation id="5078796286268621944">PIN incorrecto</translation> <translation id="5079010647467150187">Añadir VPN integrada...</translation> +<translation id="5079699784114005398">Una vez activada, tus aplicaciones estarán disponibles en cualquier dispositivo ChromeOS cuando inicies sesión con tu cuenta de Google. Las aplicaciones web instaladas desde el navegador Chrome se sincronizarán aunque la sincronización del navegador esté desactivada.</translation> <translation id="508059534790499809">Actualizar un ticket de Kerberos</translation> <translation id="5081960376148623587">Elige si quieres que las páginas se precarguen</translation> <translation id="5084328598860513926">Se ha interrumpido el flujo de configuración. Vuelve a intentarlo o ponte en contacto con el propietario o el administrador del dispositivo. Código de error: <ph name="ERROR_CODE" />.</translation> @@ -4755,6 +4765,7 @@ <translation id="5145464978649806571">Si te alejas de tu dispositivo, la pantalla se bloqueará automáticamente. Mientras estés enfrente del dispositivo, la pantalla se mantendrá activa durante más tiempo. Si la pantalla de bloqueo está inhabilitada, tu dispositivo se suspenderá en lugar de bloquearse.</translation> <translation id="514575469079499857">Usar dirección IP para determinar ubicación (predeterminado)</translation> <translation id="5146896637028965135">Voz del sistema</translation> +<translation id="5147992672778369947">Usa una contraseña recomendada</translation> <translation id="5148277445782867161">El servicio de ubicación de Google utiliza fuentes como las redes Wi‑Fi y sensores para determinar la ubicación de tu dispositivo.</translation> <translation id="5150254825601720210">Nombre de servidor SSL de certificado de Netscape</translation> <translation id="5151354047782775295">Libera espacio en el disco o puede que se eliminen automáticamente ciertos datos</translation> @@ -5041,6 +5052,7 @@ <translation id="5414566801737831689">Leer los iconos de los sitios web que visites</translation> <translation id="5414836363063783498">Verificando…</translation> <translation id="5417312524372586921">Temas del navegador</translation> +<translation id="5417353542809767994">Usa una contraseña segura rápidamente</translation> <translation id="541737483547792035">Ampliar pantalla</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Para reforzar la seguridad, solicita una contraseña para desbloquear el dispositivo</translation> @@ -5161,6 +5173,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" />: <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Configurar con teléfono Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Protege mejor esta cuenta con una contraseña segura. Se guardará en el <ph name="GOOGLE_PASSWORD_MANAGER" /> de <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">¿Es esta la página de inicio que esperabas?</translation> <translation id="5522156646677899028">Esta extensión tiene una vulnerabilidad de seguridad grave.</translation> <translation id="5522403133543437426">Buscador utilizado en la barra de direcciones.</translation> @@ -5779,6 +5792,7 @@ <translation id="6070311415473175157">Selecciona una zona de la imagen en la que buscar</translation> <translation id="6071181508177083058">confirmar contraseña</translation> <translation id="6071576563962215370">El sistema no ha podido establecer el bloqueo de atributos del tiempo de instalación del dispositivo.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> de memoria ahorrada</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> no está permitido en este dispositivo. Ponte en contacto con tu administrador. Código de error: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Detener grabación</translation> <translation id="6073903501322152803">Añadir funciones de accesibilidad</translation> @@ -5826,6 +5840,7 @@ <translation id="6104068876731806426">Cuentas de Google</translation> <translation id="6104311680260824317">No se puede vincular el dispositivo con el dominio. El servidor no admite los tipos de cifrado Kerberos específicos. Marca Más opciones para configurar el cifrado.</translation> <translation id="6104796831253957966">La cola de la impresora está llena</translation> +<translation id="6104929924898022309">Usar la tecla de búsqueda para cambiar el comportamiento de las teclas de función</translation> <translation id="6106167152849320869">Si también has elegido enviar datos de diagnóstico y de uso en el paso anterior, estos se recogerán para las aplicaciones instaladas.</translation> <translation id="6111972606040028426">Habilitar el Asistente de Google</translation> <translation id="6112294629795967147">Tocar para cambiar el tamaño</translation> @@ -5967,6 +5982,7 @@ <translation id="6234108445915742946">Los Términos del Servicio de Chrome cambiarán el 31 de marzo</translation> <translation id="6234474535228214774">Instalación pendiente</translation> <translation id="6235208551686043831">La cámara del dispositivo se ha encendido. Coloca el código QR de tu eSIM frente a la cámara.</translation> +<translation id="6237297174664969437">En la configuración de Chrome, puedes elegir en cualquier momento qué datos del navegador quieres sincronizar. En la <ph name="LINK_BEGIN" />configuración del dispositivo<ph name="LINK_END" />, puedes controlar la sincronización de las aplicaciones web instaladas desde el navegador Chrome. Google puede personalizar la Búsqueda y otros servicios en función de tu historial.</translation> <translation id="6237474966939441970">Aplicación para tomar notas con lápiz óptico</translation> <translation id="623755660902014047">Modo Lectura</translation> <translation id="6238767809035845642">Texto compartido desde otro dispositivo</translation> @@ -6300,6 +6316,7 @@ <translation id="6537613839935722475">El nombre puede contener letras, números y guiones (-).</translation> <translation id="6538098297809675636">No se ha podido detectar el código</translation> <translation id="653920215766444089">Buscando dispositivo señalador</translation> +<translation id="6539674013849300372">Protege tu seguridad online con una contraseña segura. Se guardará en el <ph name="GOOGLE_PASSWORD_MANAGER" /> de <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Reanudando...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Nota:<ph name="END_BOLD" /> Habilita esta opción solo si tienes conciencia de los efectos de esta acción o si se te ha pedido que lo hagas, ya que la recogida de datos puede reducir el rendimiento.</translation> <translation id="6541638731489116978">Este sitio web no tiene permiso para acceder a los sensores de movimiento.</translation> @@ -6494,6 +6511,7 @@ <translation id="671226373742585927">Haz clic en el botón X para cerrar el panel lateral</translation> <translation id="6712943853047024245">Ya has guardado una contraseña con este nombre de usuario para <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Añadir perfil de trabajo</translation> +<translation id="6713441551032149301">Mantén pulsada la tecla del menú de aplicaciones para cambiar entre las teclas de función y las teclas del sistema de la fila superior</translation> <translation id="6713668088933662563">No ofrecer nunca que se traduzcan estos idiomas</translation> <translation id="6715803357256707211">No se ha podido instalar la aplicación de Linux. Haz clic en la notificación para ver más detalles.</translation> <translation id="671619610707606484">Esta acción borrará <ph name="TOTAL_USAGE" /> de datos almacenados por sitios</translation> @@ -6615,6 +6633,7 @@ <translation id="6811034713472274749">Ya se puede ver la página</translation> <translation id="6811151703183939603">Intensa</translation> <translation id="6811332638216701903">Nombre de host de DHCP</translation> +<translation id="6811792477922751991">Usar la tecla del menú de aplicaciones para cambiar el comportamiento de las teclas de función</translation> <translation id="6812349420832218321">No se puede ejecutar <ph name="PRODUCT_NAME" /> como raíz.</translation> <translation id="6812841287760418429">Mantener cambios</translation> <translation id="6813907279658683733">Toda la pantalla</translation> @@ -7809,6 +7828,7 @@ <translation id="7851720427268294554">Analizador de IPP</translation> <translation id="78526636422538552">La opción para añadir más cuentas de Google está inhabilitada</translation> <translation id="7853747251428735">Más herramienta&s</translation> +<translation id="7853999103056713222">Usa una contraseña más segura</translation> <translation id="7855678561139483478">Mover pestaña a ventana nueva</translation> <translation id="7857004848504343806">Tu ordenador contiene un módulo de seguridad, que se utiliza para implementar un gran número de funciones clave de seguridad en ChromeOS Flex. Puedes consultar más información en el Centro de Ayuda de Chromebook: https://support.google.com/chromebook/?p=tpm</translation> <translation id="7857093393627376423">Sugerencias de texto</translation> @@ -8364,6 +8384,7 @@ <translation id="8325413836429495820">No puede ver tu portapapeles</translation> <translation id="8326478304147373412">PKCS #7, cadena de certificados</translation> <translation id="8327386430364625757">Fuente matemática</translation> +<translation id="8327538105740918488">Puedes cambiar la contraseña en cualquier momento. Se guardará en el <ph name="GOOGLE_PASSWORD_MANAGER" /> de <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Permisos y configuración de contenido</translation> <translation id="8330617762701840933">La lista de sitios web que redirigen al navegador alternativo.</translation> <translation id="8330689128072902965">Los contactos cerca de ti pueden compartir contenido contigo. Haz clic para cambiar este ajuste.</translation> @@ -8509,6 +8530,7 @@ <translation id="8449836157089738489">Abrir todas en un grupo de pestañas</translation> <translation id="8451512073679317615">asistente</translation> <translation id="845702320058262034">No hay conexión Comprueba que el Bluetooth del teléfono esté activado.</translation> +<translation id="8457251154056341970">No volverás a ver <ph name="MODULE_NAME" /> en esta página</translation> <translation id="8457451314607652708">Importar marcadores</translation> <translation id="8458341576712814616">Acceso directo</translation> <translation id="8458627787104127436">Abrir todas (<ph name="URL_COUNT" />) en una ventana nueva</translation> @@ -8581,6 +8603,7 @@ <translation id="8514955299594277296">No permitir que los sitios guarden datos en tu dispositivo (no recomendado)</translation> <translation id="8517759303731677493">Editar…</translation> <translation id="8519895319663397036">No se pueden importar las contraseñas. El tamaño del archivo debe ser inferior a 150 kB.</translation> +<translation id="851991974800416566">Usa una contraseña segura rápidamente</translation> <translation id="8523493869875972733">Mantener cambios</translation> <translation id="8523849605371521713">Añadida por política</translation> <translation id="8524783101666974011">Guardar las tarjetas en tu cuenta de Google</translation> @@ -8738,6 +8761,7 @@ <translation id="8665110742939124773">Has introducido un código de acceso incorrecto. Inténtalo de nuevo.</translation> <translation id="8665180165765946056">Copia de seguridad completada</translation> <translation id="866611985033792019">Confiar en este certificado para identificar a usuarios de correo electrónico</translation> +<translation id="8666268818656583275">Ahora las teclas de función se comportarán como las teclas del sistema de la fila superior</translation> <translation id="8666321716757704924">Se han vuelto a dar permisos a <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">Acerca de la personalización de anuncios basada en el navegador</translation> <translation id="8667261224612332309">Tienes contraseñas que se pueden mejorar</translation> @@ -9420,6 +9444,7 @@ <translation id="950307215746360464">Guía de configuración</translation> <translation id="951991426597076286">Rechazar</translation> <translation id="952471655966876828">El dispositivo se conectará automáticamente cuando se encienda y se esté usando</translation> +<translation id="952880932803612259">Permite que las aplicaciones, los sitios web y los servicios del sistema usen tu ubicación. Se pueden usar distintas fuentes (como redes Wi‑Fi, redes móviles o sensores) para estimar la ubicación de tu dispositivo.</translation> <translation id="953434574221655299">Permitir que sepan cuándo usas activamente tu dispositivo</translation> <translation id="956500788634395331">Tienes protección frente a extensiones potencialmente dañinas</translation> <translation id="957179356621191750">6 puntos</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 64d90aa..b3b98e8f 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Sulge vahelehed paremale</translation> <translation id="1166583374608765787">Vaadake nime värskendus üle</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> kuulub töölauale <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Proovige uut parooli</translation> <translation id="1168020859489941584">Avamine asukohas <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Keele automaatselt muutmine, et see ühtiks valitud sisuga</translation> <translation id="1169266963600477608">Mängu juhtnupud</translation> @@ -910,6 +911,7 @@ <translation id="177336675152937177">Hostitud rakenduste andmed</translation> <translation id="1776712937009046120">Lisa kasutaja</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Funktsiooniklahvide ja süsteemi ülemise rea klahvide vahel vahetamiseks hoidke all otsinguklahvi</translation> <translation id="1778457539567749232">Märgi mitteloetuks</translation> <translation id="1778991607452011493">Saada silumislogid (soovitatav)</translation> <translation id="1779441632304440041">Nõrku paroole on lihtne ära arvata. Veenduge, et looksite tugevad paroolid.</translation> @@ -1351,6 +1353,7 @@ <translation id="2142582065325732898">Hiljutiste Chrome'i vahelehtede vaatamiseks lülitage sisse <ph name="LINK1_BEGIN" />Chrome'i sünkroonimine<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Lisateave<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Kuva täisekraanil alati tööriistariba</translation> <translation id="2143778271340628265">Puhverserveri käsitsi konfigureerimine</translation> +<translation id="2143808295261240440">Kasutage soovitatud parooli</translation> <translation id="2143915448548023856">Ekraani seaded</translation> <translation id="2144536955299248197">Sertifikaadi vaataja: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linuxi Androidi rakenduse arendamine</translation> @@ -2339,6 +2342,7 @@ <translation id="2963151496262057773">Järgmine pistikprogramm ei reageeri: <ph name="PLUGIN_NAME" />Kas soovite selle peatada?</translation> <translation id="2964193600955408481">Keela WiFi</translation> <translation id="2964245677645334031">Läheduses jagamine – nähtavus</translation> +<translation id="2966705348606485669">Rohkem valikuid järjehoidjakausta <ph name="FOLDER_TITLE" /> jaoks</translation> <translation id="2966937470348689686">Androidi eelistuste haldamine</translation> <translation id="2967926928600500959">Nendele reeglitele vastavad URL-id sundavatakse kindlas brauseris.</translation> <translation id="2972581237482394796">&Tee uuesti</translation> @@ -2628,6 +2632,7 @@ <translation id="3244294424315804309">Jätka heli vaigistamist</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – võrguviga</translation> <translation id="3248902735035392926">Ohutus on oluline. Leidke hetk ja <ph name="BEGIN_LINK" />vaadake oma laiendused kohe üle<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Saate registreeruda ja kiiremini sisse logida, kui teie parool salvestatakse konto <ph name="EMAIL" /> jaoks teenusesse <ph name="GOOGLE_PASSWORD_MANAGER" /> automaatselt.</translation> <translation id="3251714896659475029">Lubage kasutajal <ph name="SUPERVISED_USER_NAME" /> Google'i assistendile juurde pääseda, kasutades otsetee sõna „Ok Google“</translation> <translation id="3251759466064201842"><Ei sisaldu sertifikaadis></translation> <translation id="325238099842880997">Määrake digitaalse tegevuse põhireeglid, et aidata lapsel mängida, avastada ja teha kodus koolitöid</translation> @@ -4122,6 +4127,7 @@ <translation id="4556194354084985730">Salvestatud paroolide abil saate saitidele ja rakendustesse hõlpsasti sisse logida. Kui see on välja lülitatud, küsitakse teilt enne sisselogimist parooli.</translation> <translation id="4558426062282641716">Automaatse käivitamise loa taotlus</translation> <translation id="4559617833001311418">Saidil on juurdepääs teie liikumis- või valgusanduritele.</translation> +<translation id="4560728518401799797">Rohkem valikuid kausta <ph name="FOLDER_TITLE" /> järjehoidja jaoks</translation> <translation id="4561893854334016293">Hiljuti muudetud lube pole</translation> <translation id="4562155214028662640">Lisa sõrmejälg</translation> <translation id="4563210852471260509">Esialgne sisestuskeel on hiina keel</translation> @@ -4405,6 +4411,7 @@ <translation id="4819323978093861656">{0,plural, =0{Suletakse kohe.}=1{Suletakse 1 sekundi pärast}other{Suletakse # sekundi pärast}}</translation> <translation id="4819607494758673676">Google'i assistendi märguanded</translation> <translation id="4820236583224459650">Määra aktiivseks piletiks</translation> +<translation id="4820795723433418303">Funktsiooniklahvide kasutamine ülemise rea klahvidena</translation> <translation id="4821935166599369261">&Profileerimine lubatud</translation> <translation id="4823484602432206655">Loe ja muuda kasutaja ja seadme seadeid</translation> <translation id="4824037980212326045">Linuxi varundamine ja taastamine</translation> @@ -4536,6 +4543,7 @@ <translation id="4925320384394644410">Teie pordid kuvatakse siin</translation> <translation id="49265687513387605">Ekraanikuva ei õnnestu üle kanda. Kontrollige, kas kinnitasite viiba ekraanikuva jagamise alustamiseks.</translation> <translation id="4927753642311223124">Siin pole ühtegi märguannet, liikuge edasi.</translation> +<translation id="4928629450964837566">Kasutage turvalisemat parooli</translation> <translation id="4929386379796360314">Sihtkohtade printimine</translation> <translation id="4930447554870711875">Arendajad</translation> <translation id="4930714375720679147">Lülita sisse</translation> @@ -4618,6 +4626,7 @@ <translation id="5010886807652684893">Visuaalne vaade</translation> <translation id="5015344424288992913">Puhverserveri lahendamine...</translation> <translation id="5016491575926936899">Saate tekstsõnumeid arvutist saata, internetiühendust jagada, vestluse märguannetele vastata ja telefoniga oma seadme (<ph name="DEVICE_TYPE" />) avada.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Proovige uut parooli</translation> <translation id="5017643436812738274">Lehtedel saab navigeerida tekstikursoriga. Funktsiooni väljalülitamiseks kasutage otseteed Ctrl + otsinguklahv + 7.</translation> <translation id="5018207570537526145">Ava laienduse veebisait</translation> <translation id="5018526990965779848">Kasutus- ja diagnostikaandmete saatmine. Aidake täiustada Androidi kasutuskogemust, saates Google'ile automaatselt seadme teavet ning rakenduse kasutus- ja diagnostikaandmeid. See aitab parandada süsteemi ja rakenduse stabiilsust ning muud. Teatud koondandmed on abiks ka Google'i rakendustele ja partneritele, näiteks Androidi arendajatele. Kui täiendavad veebi- ja rakendustegevused on sisse lülitatud, võidakse need andmed salvestada teie Google'i kontole.</translation> @@ -4686,6 +4695,7 @@ <translation id="5078638979202084724">Lisab kõik vahelehed järjehoidjatesse</translation> <translation id="5078796286268621944">Vale PIN-kood</translation> <translation id="5079010647467150187">Sisseehitatud VPN-i lisamine …</translation> +<translation id="5079699784114005398">Kui see on sisse lülitatud, on teie rakendused pärast Google'i kontoga sisselogimist saadaval mis tahes ChromeOS-i seadmes. Chrome'i brauserist installitud veebirakendused sünkroonitakse isegi siis, kui brauseri sünkroonimine on välja lülitatud.</translation> <translation id="508059534790499809">Kerberose pileti värskendamine</translation> <translation id="5081960376148623587">Valige, kas soovite lehti eellaadida</translation> <translation id="5084328598860513926">Ettevalmistamise voogu katkestati. Proovige uuesti või võtke ühendust seadme omaniku või administraatoriga. Veakood: <ph name="ERROR_CODE" />.</translation> @@ -4761,6 +4771,7 @@ <translation id="5145464978649806571">Kui lähete oma seadmest eemale, lukustub ekraan automaatselt. Kui olete oma seadme ees, jääb ekraanikuva avatuks. Kui lukustuskuva on keelatud, aktiveerub lukustuse asemel seadme unerežiim.</translation> <translation id="514575469079499857">Asukoha määramiseks IP-aadressi kasutamine (vaikimisi)</translation> <translation id="5146896637028965135">Süsteemi hääl</translation> +<translation id="5147992672778369947">Kasutage soovitatud parooli</translation> <translation id="5148277445782867161">Google'i asukohateenus kasutab teie seadme asukoha prognoosimiseks selliseid allikaid nagu WiFi- ja mobiilsidevõrgud ning andurid.</translation> <translation id="5150254825601720210">Netscape'i sertifikaadi SSL-serveri nimi</translation> <translation id="5151354047782775295">Vabastage kettaruumi, muidu võidakse valitud andmed automaatselt kustutada</translation> @@ -5047,6 +5058,7 @@ <translation id="5414566801737831689">Külastatavate veebisaitide ikoonide lugemine</translation> <translation id="5414836363063783498">Kinnitamine ...</translation> <translation id="5417312524372586921">Brauseri teemad</translation> +<translation id="5417353542809767994">Kasutage kiiresti tugevat parooli</translation> <translation id="541737483547792035">Ekraanikuva suurendamine</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Lisaturvalisuse jaoks küsitakse seadme avamiseks parooli</translation> @@ -5167,6 +5179,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Seadista Android-telefoniga</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Kaitske seda kontot paremine tugeva parooli abil. See salvestatakse konto <ph name="EMAIL" /> puhul teenusesse <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="5521078259930077036">Kas see on avaleht, mida ootasite?</translation> <translation id="5522156646677899028">See laiendus sisaldab tõsist turvaauku.</translation> <translation id="5522403133543437426">Aadressiribal kasutatud otsingumootor.</translation> @@ -5785,6 +5798,7 @@ <translation id="6070311415473175157">Valige pildi ala, millelt otsida</translation> <translation id="6071181508177083058">parooli kinnitamine</translation> <translation id="6071576563962215370">Süsteemil ei õnnestunud määrata seadme installiaegsete atribuutide lukustust.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> mälu on salvestatud</translation> <translation id="6072442788591997866">Rakendust <ph name="APP_NAME" /> ei lubata selles seadmes kasutada. Võtke ühendust administraatoriga. Veakood: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Peata salvestamine</translation> <translation id="6073903501322152803">Juurdepääsetavuse funktsioonide lisamine</translation> @@ -5832,6 +5846,7 @@ <translation id="6104068876731806426">Google'i kontod</translation> <translation id="6104311680260824317">Seadet ei saa domeeniga ühendada. Server ei toeta määratud Kerberose krüpteerimistüüpe. Krüpteerimisseaded leiate jaotisest „Rohkem valikuid”.</translation> <translation id="6104796831253957966">Printeri järjekord on täis</translation> +<translation id="6104929924898022309">Otsinguklahvi kasutamine funktsiooniklahvide käitumise muutmiseks</translation> <translation id="6106167152849320869">Kui valisite eelmise sammu käigus diagnostika- ja kasutusandmete saatmise, kogutakse installitud rakenduste puhul neid andmeid.</translation> <translation id="6111972606040028426">Google'i assistendi lubamine</translation> <translation id="6112294629795967147">Puudutage suuruse muutmiseks</translation> @@ -5973,6 +5988,7 @@ <translation id="6234108445915742946">Chrome'i teenusetingimused muutuvad 31. märtsil</translation> <translation id="6234474535228214774">Installimine on ootel</translation> <translation id="6235208551686043831">Seadme kaamera lülitati sisse. Asetage eSIM-i QR-kood kaamera ette.</translation> +<translation id="6237297174664969437">Saate Chrome'i seadetes alati valida, milliseid brauseriandmeid sünkroonida. Chrome'i brauserist installitud veebirakenduste sünkroonimist saate hallata <ph name="LINK_BEGIN" />Seadme seadetes<ph name="LINK_END" />. Google võib Otsingut ja muid teenuseid teie ajaloo alusel isikupärastada.</translation> <translation id="6237474966939441970">Elektronpliiatsiga märkmete tegemise rakendus</translation> <translation id="623755660902014047">Lugemisrežiim</translation> <translation id="6238767809035845642">Muust seadmest jagatud tekst</translation> @@ -6306,6 +6322,7 @@ <translation id="6537613839935722475">Nimi võib sisaldada tähemärke, numbreid ja sidekriipse (-)</translation> <translation id="6538098297809675636">Viga koodi tuvastamisel</translation> <translation id="653920215766444089">Osutamisseadme otsimine</translation> +<translation id="6539674013849300372">Tugeva parooli abil olete veebis paremini kaitstud. See salvestatakse konto <ph name="EMAIL" /> puhul teenusesse <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="653983593749614101">Jätkamine …</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Märkus.<ph name="END_BOLD" /> Lubage see ainult siis, kui teate, mida teete, või kui teil paluti seda teha, sest andmete kogumine võib toimivust vähendada.</translation> <translation id="6541638731489116978">Sellel saidil on juurdepääs teie liikumisanduritele blokeeritud.</translation> @@ -6500,6 +6517,7 @@ <translation id="671226373742585927">Klõpsake külgpaneeli sulgemiseks nupul „X”</translation> <translation id="6712943853047024245">Salvestasite selle kasutajanimega parooli juba järgmise saidi või rakenduse jaoks: <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Lisa tööprofiil</translation> +<translation id="6713441551032149301">Funktsiooniklahvide ja süsteemi ülemise rea klahvide vahel vahetamiseks hoidke all käivitajaklahvi</translation> <translation id="6713668088933662563">Ära kunagi paku nende keelte tõlkimist</translation> <translation id="6715803357256707211">Linuxi rakenduse installimisel ilmnes viga. Lisateabe saamiseks klõpsake märguandel.</translation> <translation id="671619610707606484">See kustutab <ph name="TOTAL_USAGE" /> ulatuses saitide salvestatud andmeid</translation> @@ -6621,6 +6639,7 @@ <translation id="6811034713472274749">Leht on vaatamiseks valmis</translation> <translation id="6811151703183939603">Tugev</translation> <translation id="6811332638216701903">DHCP hostinimi</translation> +<translation id="6811792477922751991">Käivitajaklahvi kasutamine funktsiooniklahvide käitumise muutmiseks</translation> <translation id="6812349420832218321">Toodet <ph name="PRODUCT_NAME" /> ei saa juurkasutajana käitada.</translation> <translation id="6812841287760418429">Säilita muudatused</translation> <translation id="6813907279658683733">Kogu ekraan</translation> @@ -7815,6 +7834,7 @@ <translation id="7851720427268294554">IPP-parser</translation> <translation id="78526636422538552">Google'i kontode lisamine on keelatud</translation> <translation id="7853747251428735">Rohkem töö&riistu</translation> +<translation id="7853999103056713222">Kasutage turvalisemat parooli</translation> <translation id="7855678561139483478">Vahelehe teisaldamine uude aknasse</translation> <translation id="7857004848504343806">Teie arvuti sisaldab turvamoodulit, mida kasutatakse paljude väga tähtsate turvafunktsioonide rakendamiseks Chrome OS Flexis. Lisateavet leiate Chromebooki abikeskusest: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Teksti soovitused</translation> @@ -8370,6 +8390,7 @@ <translation id="8325413836429495820">Pole lubatud näha teie lõikelauda</translation> <translation id="8326478304147373412">PKCS 7, sertifikaadiahel</translation> <translation id="8327386430364625757">Matemaatika font</translation> +<translation id="8327538105740918488">Saate seda parooli hiljem alati muuta. See salvestatakse konto <ph name="EMAIL" /> puhul teenusesse <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="8327676037044516220">Load ja sisu seaded</translation> <translation id="8330617762701840933">Loend veebisaitidest, mis suunatakse ümber alternatiivsesse brauserisse.</translation> <translation id="8330689128072902965">Läheduses olevad kontaktid saavad teiega jagada. Klõpsake muutmiseks.</translation> @@ -8515,6 +8536,7 @@ <translation id="8449836157089738489">Ava kõik uues vahelehegrupis</translation> <translation id="8451512073679317615">assistent</translation> <translation id="845702320058262034">Ühendust ei saa luua. Veenduge, et telefonis oleks Bluetooth sisse lülitatud.</translation> +<translation id="8457251154056341970">Te ei näe sellel lehel enam moodulit <ph name="MODULE_NAME" /></translation> <translation id="8457451314607652708">Impordi järjehoidjad</translation> <translation id="8458341576712814616">Otsetee</translation> <translation id="8458627787104127436">Ava kõik (<ph name="URL_COUNT" />) uues aknas</translation> @@ -8587,6 +8609,7 @@ <translation id="8514955299594277296">Saitidel ei lubata teie seadmesse andmeid salvestada (pole soovitatav)</translation> <translation id="8517759303731677493">Muuda …</translation> <translation id="8519895319663397036">Ei saa paroole importida. Faili suurus peab olema alla 150 kB.</translation> +<translation id="851991974800416566">Kasutage kiiresti tugevat parooli</translation> <translation id="8523493869875972733">Säilita muudatused</translation> <translation id="8523849605371521713">Reegliga lisatud</translation> <translation id="8524783101666974011">Salvestage kaardid oma Google'i kontole</translation> @@ -8744,6 +8767,7 @@ <translation id="8665110742939124773">Sisestasite vale pääsukoodi. Proovige uuesti.</translation> <translation id="8665180165765946056">Varundamine jõudis lõpule</translation> <translation id="866611985033792019">Usalda seda sertifikaati meilikasutajate tuvastamiseks</translation> +<translation id="8666268818656583275">F-klahvid käituvad nüüd samamoodi nagu teie süsteemi ülemise rea klahvid</translation> <translation id="8666321716757704924">Veebisaidile <ph name="WEBSITE" /> on uuesti load antud</translation> <translation id="8666759526542103597">Teave brauseripõhise reklaamide isikupärastamise kohta</translation> <translation id="8667261224612332309">Teil on paroole, mida saab paremaks muuta</translation> @@ -9426,6 +9450,7 @@ <translation id="950307215746360464">Seadistusjuhend</translation> <translation id="951991426597076286">Keeldu</translation> <translation id="952471655966876828">Kui seade on sisse lülitatud ja seda kasutatakse, ühendatakse seade automaatselt</translation> +<translation id="952880932803612259">Rakendustel, veebisaitidel ja süsteemiteenustel teie asukohta kasutamise lubamine. Funktsioon Asukoht võib teie seadme asukoha tuvastamiseks kasutada selliseid allikaid nagu WiFi- ja mobiilsidevõrgud ning andurid.</translation> <translation id="953434574221655299">Lubatud teada, millal oma seadet aktiivselt kasutate</translation> <translation id="956500788634395331">Olete potentsiaalselt ohtlike laienduste eest kaitstud</translation> <translation id="957179356621191750">6-punktiline</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index b599e87..7142845 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Isara ang Mga Tab na nasa Kanan</translation> <translation id="1166583374608765787">Suriin ang update sa pangalan</translation> <translation id="1166596238782048887">Kabilang ang <ph name="TAB_TITLE" /> sa desk na <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Sumubok ng bagong password</translation> <translation id="1168020859489941584">Binubuksan sa <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Awtomatikong baguhin ang wika para tumugma sa napiling content</translation> <translation id="1169266963600477608">Mga kontrol ng laro</translation> @@ -919,6 +920,7 @@ <translation id="177336675152937177">Naka-host na data ng app</translation> <translation id="1776712937009046120">Magdagdag ng user</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Pindutin nang matagal ang key sa paghahanap para magpalipat-lipat sa mga function key at mga top-row key ng system</translation> <translation id="1778457539567749232">Markahan bilang hindi pa nababasa</translation> <translation id="1778991607452011493">Magpadala ng mga log ng debug (inirerekomenda)</translation> <translation id="1779441632304440041">Madaling hulaan ang mahihinang password. Tiyaking malalakas na password ang gagawin mo.</translation> @@ -1361,6 +1363,7 @@ <translation id="2142582065325732898">I-on ang <ph name="LINK1_BEGIN" />Chrome Sync<ph name="LINK1_END" /> para matingnan ang mga kamakailang tab ng Chrome. <ph name="LINK2_BEGIN" />Matuto Pa<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Palaging Ipakita ang Toolbar sa Full Screen</translation> <translation id="2143778271340628265">Manu-manong configuration ng proxy</translation> +<translation id="2143808295261240440">Gamitin ang Inirerekomendang Password</translation> <translation id="2143915448548023856">Mga setting ng display</translation> <translation id="2144536955299248197">Viewer ng Certificate: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Pag-develop ng Android app sa Linux</translation> @@ -2349,6 +2352,7 @@ <translation id="2963151496262057773">Hindi tumutugon ang sumusunod na plugin: <ph name="PLUGIN_NAME" />Gusto mo bang ihinto ito?</translation> <translation id="2964193600955408481">Huwag paganahin ang Wi-Fi</translation> <translation id="2964245677645334031">Visibility sa Nearby Share</translation> +<translation id="2966705348606485669">Higit pang opsyon para sa folder ng bookmark na <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Pamahalaan ang mga kagustuhan sa Android</translation> <translation id="2967926928600500959">Mapipilitang magbukas sa partikular na browser ang mga URL na tumutugma sa mga panuntunang ito.</translation> <translation id="2972581237482394796">&I-redo</translation> @@ -2638,6 +2642,7 @@ <translation id="3244294424315804309">Patuloy na i-mute ang tunog</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - Error sa network</translation> <translation id="3248902735035392926">Mahalaga ang kaligtasan. Maglaan ng ilang sandali at <ph name="BEGIN_LINK" />tingnan ang iyong mga extension ngayon<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Mag-sign up at mag-sign in nang mas mabilis kapag awtomatikong na-save ang iyong password sa <ph name="GOOGLE_PASSWORD_MANAGER" /> para sa <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Payagan si <ph name="SUPERVISED_USER_NAME" /> na i-access ang Google Assistant sa pamamagitan ng “Hey Google”</translation> <translation id="3251759466064201842"><Hindi Bahagi Ng Certificate></translation> <translation id="325238099842880997">Magtakda ng mga pangunahing digital na panuntunan na makakatulong sa mga batang maglaro, mag-explore, at gumawa ng gawain sa paaralan sa bahay</translation> @@ -4133,6 +4138,7 @@ <translation id="4556194354084985730">Mag-sign in sa mga site at app nang walang kahirap-hirap gamit ang iyong mga naka-save password. Kapag naka-off ito, tatanungin ka bago mag-sign in.</translation> <translation id="4558426062282641716">Hiniling ang pahintulot sa awtomatikong paglulunsad</translation> <translation id="4559617833001311418">Ina-access ng site na ito ang iyong sensor ng paggalaw o liwanag.</translation> +<translation id="4560728518401799797">Higit pang opsyon para sa bookmark na <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Walang kamakailang binagong pahintulot</translation> <translation id="4562155214028662640">Magdagdag ng Fingerprint</translation> <translation id="4563210852471260509">Ang paunang wika sa pag-input ay Chinese</translation> @@ -4416,6 +4422,7 @@ <translation id="4819323978093861656">{0,plural, =0{Isasara na ngayon.}=1{Isasara na sa: 1 segundo}one{Isasara na sa: # segundo}other{Isasara na sa: # na segundo}}</translation> <translation id="4819607494758673676">Mga Notification ng Google Assistant</translation> <translation id="4820236583224459650">Itakda bilang aktibong ticket</translation> +<translation id="4820795723433418303">Gumamit ng mga function key bilang mga top row key</translation> <translation id="4821935166599369261">&Pinagana ang Pag-profile</translation> <translation id="4823484602432206655">Basahin at baguhin ang mga setting ng user at device</translation> <translation id="4824037980212326045">Pag-back up at pag-restore ng Linux</translation> @@ -4547,6 +4554,7 @@ <translation id="4925320384394644410">Lalabas dito ang iyong mga port</translation> <translation id="49265687513387605">Hindi ma-cast ang screen. Tingnan kung nakumpirma mo ang prompt para simulan ang pagbabahagi ng iyong screen.</translation> <translation id="4927753642311223124">Walang makikita rito, magpatuloy.</translation> +<translation id="4928629450964837566">Gumamit ng mas ligtas na password</translation> <translation id="4929386379796360314">Mga Destinasyon sa Pag-print</translation> <translation id="4930447554870711875">Mga Developer</translation> <translation id="4930714375720679147">I-on</translation> @@ -4629,6 +4637,7 @@ <translation id="5010886807652684893">Visual view</translation> <translation id="5015344424288992913">Nilulutas ang proxy...</translation> <translation id="5016491575926936899">Magagawa mong mag-text mula sa iyong computer, ibahagi ang koneksyon mo sa internet, sumagot sa mga notification sa pag-uusap, at i-unlock ang iyong <ph name="DEVICE_TYPE" /> gamit ang telepono mo.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Sumubok ng Bagong Password</translation> <translation id="5017643436812738274">Puwede kang mag-navigate sa mga page gamit ang text cursor. Pindutin ang Ctrl+Search+7 para i-off.</translation> <translation id="5018207570537526145">Buksan ang website ng extension</translation> <translation id="5018526990965779848">Magpadala ng data ng paggamit at diagnostic. Tumulong sa pagpapaganda ng iyong karanasan sa Android sa pamamagitan ng awtomatikong pagpapadala ng diagnostic na data, data ng device, at data ng paggamit sa app sa Google. Makakatulong ito sa stability ng system at ng app, at sa iba pang pagpapahusay. Makakatulong din ang ilang pinagsama-samang data sa mga app at partner ng Google, gaya ng mga developer ng Android. Kung naka-on ang iyong karagdagang setting ng Aktibidad sa Web at App, posibleng ma-save ang data na ito sa Google Account mo.</translation> @@ -4697,6 +4706,7 @@ <translation id="5078638979202084724">I-bookmark ang lahat ng mga tab</translation> <translation id="5078796286268621944">Maling PIN</translation> <translation id="5079010647467150187">Magdagdag ng built-in na VPN...</translation> +<translation id="5079699784114005398">Kapag naka-on na, magiging available sa anumang ChromeOS device ang iyong mga app pagkatapos mong mag-sign in gamit ang iyong Google Account. Isi-sync ang mga web app na na-install mula sa Chrome browser kahit na naka-off ang pag-sync sa browser.</translation> <translation id="508059534790499809">I-refresh ang ticket ng Kerberos</translation> <translation id="5081960376148623587">Piliin kung magpi-preload ng mga page</translation> <translation id="5084328598860513926">Naantala ang daloy ng pag-provision. Pakisubukan ulit o makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation> @@ -4772,6 +4782,7 @@ <translation id="5145464978649806571">Kung lalayo ka sa device mo, awtomatikong mala-lock ang iyong screen. Kapag nasa harap ka ng device mo, iilaw ang iyong screen nang mas matagal. Kung naka-disable ang lock screen, magsi-sleep ang iyong device sa halip na mag-lock.</translation> <translation id="514575469079499857">Gamitin ang iyong IP address upang matukoy ang lokasyon (default)</translation> <translation id="5146896637028965135">Boses ng system</translation> +<translation id="5147992672778369947">Gamitin ang inirerekomendang password</translation> <translation id="5148277445782867161">Ang serbisyo ng lokasyon ng Google ay gumagamit ng mga source tulad ng Wi-Fi, mga mobile network, at sensor para makatulong na tantyahin ang lokasyon ng iyong device.</translation> <translation id="5150254825601720210">Pangalan ng Server ng Netscape Certificate SSL</translation> <translation id="5151354047782775295">Magbakante ng espasyo sa disk o pumili ng data na maaaring awtomatikong i-delete</translation> @@ -5058,6 +5069,7 @@ <translation id="5414566801737831689">Basahin ang mga icon ng mga website na iyong binibisita</translation> <translation id="5414836363063783498">Vine-verify…</translation> <translation id="5417312524372586921">Mga tema ng browser</translation> +<translation id="5417353542809767994">Mabilis na gumamit ng malakas na password</translation> <translation id="541737483547792035">I-magnify ang screen</translation> <translation id="5419405654816502573">Voice match</translation> <translation id="5420274697768050645">Humiling ng password para i-unlock ang device para sa karagdagang seguridad</translation> @@ -5178,6 +5190,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">I-set up gamit ang Android phone</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Panatilihing mas secure ang account na ito gamit ang malakas na password. Mase-save ito sa <ph name="GOOGLE_PASSWORD_MANAGER" /> para sa <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Ito ba ang inaasahan mong home page?</translation> <translation id="5522156646677899028">Naglalaman ang extension na ito ng isang malubhang kahinaan sa seguridad.</translation> <translation id="5522403133543437426">Search engine na ginamit sa address bar.</translation> @@ -5796,6 +5809,7 @@ <translation id="6070311415473175157">Piliin ang bahagi ng larawan na hahanapin</translation> <translation id="6071181508177083058">kumpirmahin ang password</translation> <translation id="6071576563962215370">Hindi naitakda ng system ang lock sa mga attribute sa oras ng pag-install ng device.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> na memory ang natipid</translation> <translation id="6072442788591997866">Hindi pinapayagan ang <ph name="APP_NAME" /> sa device na ito. Makipag-uganayan sa iyong administrator. Code ng error: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Ihinto ang pag-record</translation> <translation id="6073903501322152803">Magdagdag ng mga feature ng pagiging naa-access</translation> @@ -5843,6 +5857,7 @@ <translation id="6104068876731806426">Mga Google Account</translation> <translation id="6104311680260824317">Hindi maisama ang device sa domain. Hindi sinusuportahan ng server ang mga natukoy na uri ng Kerberos na pag-encrypt. Suriin ang "Higit pang opsyon" para sa mga setting ng pag-encrypt.</translation> <translation id="6104796831253957966">Puno ang queue ng printer</translation> +<translation id="6104929924898022309">Gamitin ang key sa paghahanap para baguhin ang gawi ng mga function key</translation> <translation id="6106167152849320869">Kung pinili mo ring magpadala ng data ng diagnostic at paggamit sa nakaraang hakbang, kokolektahin ang data na ito para sa mga naka-install na app.</translation> <translation id="6111972606040028426">I-enable ang Google Assistant</translation> <translation id="6112294629795967147">Pindutin para i-resize</translation> @@ -5984,6 +5999,7 @@ <translation id="6234108445915742946">Magbabago na ang Mga Tuntunin ng Serbisyo ng Chrome sa Marso 31</translation> <translation id="6234474535228214774">Nakabinbin ang pag-install</translation> <translation id="6235208551686043831">Naka-on na ang camera ng device. Pakitapat ang QR Code ng iyong eSIM sa harap ng camera.</translation> +<translation id="6237297174664969437">Puwede mong piliin anumang oras kung anong data mula sa pagba-browse ang isi-sync sa mga setting ng Chrome. Sa <ph name="LINK_BEGIN" />mga setting ng device<ph name="LINK_END" />, puwede mong kontrolin ang pag-sync para sa mga web app na na-install mula sa Chrome browser. Puwedeng i-personalize ng Google ang Search at iba pang serbisyo batay sa iyong history.</translation> <translation id="6237474966939441970">App sa pagtatala gamit ang stylus</translation> <translation id="623755660902014047">Reading mode</translation> <translation id="6238767809035845642">Ibinahaging text mula sa Ibang Device</translation> @@ -6317,6 +6333,7 @@ <translation id="6537613839935722475">Puwedeng gumamit ng mga titik, numero, at hyphen (-) ang pangalan</translation> <translation id="6538098297809675636">Error sa pag-detect ng code</translation> <translation id="653920215766444089">Naghahanap ng device na panturo</translation> +<translation id="6539674013849300372">Manatiling mas ligtas online gamit ang isang malakas na password. Mase-save ito sa <ph name="GOOGLE_PASSWORD_MANAGER" /> para sa <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Itinutuloy...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Tandaan:<ph name="END_BOLD" /> I-enable lang kung alam mo kung ano ang iyong ginagawa o kung hiniling kang gawin ito, dahil maaaring mabawasan ng pagkolekta ng data ang pagganap.</translation> <translation id="6541638731489116978">Na-block ang site na ito sa pag-access sa iyong mga sensor ng paggalaw.</translation> @@ -6513,6 +6530,7 @@ <translation id="671226373742585927">I-click ang button na "X" para isara ang panel sa gilid</translation> <translation id="6712943853047024245">Nag-save ka na ng password na may ganitong username para sa <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Magdagdag ng Profile sa Trabaho</translation> +<translation id="6713441551032149301">Pindutin nang matagal ang launcher key para magpalipat-lipat sa mga function key at mga top-row key ng system</translation> <translation id="6713668088933662563">Huwag kailanmang mag-alok na isalin ang mga wikang ito.</translation> <translation id="6715803357256707211">Nagkaroon ng error habang ini-install ang iyong Linux application. Mag-click sa notification para sa mga detalye.</translation> <translation id="671619610707606484">Iki-clear nito ang <ph name="TOTAL_USAGE" /> ng data na na-store ng mga site</translation> @@ -6634,6 +6652,7 @@ <translation id="6811034713472274749">Maaari nang tingnan ang page</translation> <translation id="6811151703183939603">Madiin</translation> <translation id="6811332638216701903">Hostname ng DHCP</translation> +<translation id="6811792477922751991">Gamitin ang launcher key para baguhin ang gawi ng mga function key</translation> <translation id="6812349420832218321">Hindi mapatakbo ang <ph name="PRODUCT_NAME" /> bilang root.</translation> <translation id="6812841287760418429">Panatilihin ang mga pagbabago</translation> <translation id="6813907279658683733">Buong Screen</translation> @@ -7828,6 +7847,7 @@ <translation id="7851720427268294554">Pang-parse ng IPP</translation> <translation id="78526636422538552">Naka-disable ang pagdaragdag ng higit pang Google Account</translation> <translation id="7853747251428735">Higit Pang Mga Too&l</translation> +<translation id="7853999103056713222">Gumamit ng Mas Ligtas na Password</translation> <translation id="7855678561139483478">Ilipat ang tab sa bagong window</translation> <translation id="7857004848504343806">Naglalaman ng secure na module ang iyong computer, na ginagamit para magpatupad ng maraming kritikal na panseguridad na feature sa ChromeOS Flex. Bisitahin ang Help Center ng Chromebook para matuto pa: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Mga suhestyong text</translation> @@ -8383,6 +8403,7 @@ <translation id="8325413836429495820">Hindi pinapayagang tingnan ang iyong clipboard</translation> <translation id="8326478304147373412">PKCS #7, certificate chain</translation> <translation id="8327386430364625757">Mathematical na font</translation> +<translation id="8327538105740918488">Puwede mong baguhin ang password na ito anumang oras. Mase-save ito sa <ph name="GOOGLE_PASSWORD_MANAGER" /> para sa <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Mga pahintulot at setting ng content</translation> <translation id="8330617762701840933">Ang listahan ng mga website na nagre-redirect sa alternatibong browser.</translation> <translation id="8330689128072902965">Makakapagbahagi sa iyo ang mga kalapit na contact. I-click para baguhin.</translation> @@ -8529,6 +8550,7 @@ <translation id="8449836157089738489">Buksan lahat sa bagong grupo ng tab</translation> <translation id="8451512073679317615">assistant</translation> <translation id="845702320058262034">Hindi makakonekta. Tiyaking naka-on ang Bluetooth ng iyong telepono.</translation> +<translation id="8457251154056341970">Hindi mo na makikita ulit ang <ph name="MODULE_NAME" /> sa page na ito</translation> <translation id="8457451314607652708">Mag-import ng mga bookmark</translation> <translation id="8458341576712814616">Shortcut</translation> <translation id="8458627787104127436">Buksan lahat (<ph name="URL_COUNT" />) sa bagong window</translation> @@ -8601,6 +8623,7 @@ <translation id="8514955299594277296">Huwag payagan ang mga site na mag-save ng data sa iyong device (hindi inirerekomenda)</translation> <translation id="8517759303731677493">I-edit…</translation> <translation id="8519895319663397036">Hindi ma-import ang mga password. Wala pa dapat 150 KB ang laki ng file.</translation> +<translation id="851991974800416566">Mabilis na Gumamit ng Malakas na Password</translation> <translation id="8523493869875972733">Panatilihin ang Mga Pagbabago</translation> <translation id="8523849605371521713">Idinagdag ng patakaran</translation> <translation id="8524783101666974011">I-save ang mga card sa iyong Google Account</translation> @@ -8758,6 +8781,7 @@ <translation id="8665110742939124773">Naglagay ka ng maling access code. Subukan ulit.</translation> <translation id="8665180165765946056">Kumpleto na ang pag-back up</translation> <translation id="866611985033792019">Pagkatiwalaan ang certificate na ito para sa pagtukoy ng mga user ng email</translation> +<translation id="8666268818656583275">Magiging mga top-row key na ng system ang gawi ng mga F key</translation> <translation id="8666321716757704924">Pinayagan ulit ang mga pahintulot para sa <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">Tungkol sa Pag-personalize ng ad na nakabatay sa browser</translation> <translation id="8667261224612332309">May mga password ka na puwedeng mapalakas</translation> @@ -9442,6 +9466,7 @@ <translation id="950307215746360464">Gabay sa pag-set up</translation> <translation id="951991426597076286">Tanggihan</translation> <translation id="952471655966876828">Awtomatikong makokonekta ang device kapag na-on at ginagamit ito</translation> +<translation id="952880932803612259">Payagan ang mga app, website, at serbisyo ng system na gamitin ang iyong lokasyon. Posibleng gumamit ang lokasyon ng mga source tulad ng Wi‑Fi, mga mobile network, at sensor para tumulong sa pagtantya ng lokasyon ng iyong device.</translation> <translation id="953434574221655299">Pinapayagang makaalam kung aktibo mong ginagamit ang iyong device</translation> <translation id="956500788634395331">Protektado ka mula sa mga potensyal na mapaminsalang extension</translation> <translation id="957179356621191750">6-dot</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 5a0b05f..49b38288 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">જમણી બાજુનાં ટૅબ્સ બંધ કરો</translation> <translation id="1166583374608765787">અપડેટ કરેલા નામનો રિવ્યૂ કરો</translation> <translation id="1166596238782048887"><ph name="DESK_TITLE" /> ડેસ્ક <ph name="TAB_TITLE" />ની માલિકી ધરાવે છે</translation> +<translation id="1167262726334064738">કોઈ નવો પાસવર્ડ અજમાવી જુઓ</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> માં ખુલી રહ્યું છે...</translation> <translation id="116896278675803795">પસંદ કરેલા કન્ટેન્ટ સાથે મેળ કરવા માટે ઑટોમૅટિક રીતે ભાષા બદલો</translation> <translation id="1169266963600477608">ગેમના નિયંત્રણો</translation> @@ -904,6 +905,7 @@ <translation id="177336675152937177">હોસ્ટ કરેલ ઍપ્લિકેશન ડેટા</translation> <translation id="1776712937009046120">વપરાશકર્તા ઉમેરો</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">ફંક્શન કી અને સિસ્ટમની સૌથી ઉપરની પંક્તિની કી વચ્ચે બદલવા માટે શોધ કીને દબાવી રાખો</translation> <translation id="1778457539567749232">વાંચ્યા વગરનું તરીકે માર્ક કરો</translation> <translation id="1778991607452011493">ડીબગ લૉગ મોકલો (ભલામણ કરવામાં આવે છે)</translation> <translation id="1779441632304440041">નબળા પાસવર્ડ અનુમાન કરવામાં સરળ હોય છે. તમે સશક્ત પાસવર્ડ બનાવવાની ખાતરી કરો.</translation> @@ -1345,6 +1347,7 @@ <translation id="2142582065325732898">તાજેતરની Chrome ટૅબ જોવા માટે, <ph name="LINK1_BEGIN" />Chrome સિંક<ph name="LINK1_END" />ની સુવિધા ચાલુ કરો. <ph name="LINK2_BEGIN" />વધુ જાણો<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">ટુલબારને હંમેશા સંપૂર્ણ સ્ક્રીનમાં બતાવો</translation> <translation id="2143778271340628265">મેન્યુઅલ પ્રૉક્સી ગોઠવણી</translation> +<translation id="2143808295261240440">સુઝાવ આપેલા પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="2143915448548023856">પ્રદર્શન સેટિંગ્સ</translation> <translation id="2144536955299248197">પ્રમાણપત્ર દર્શક: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android ઍપ વિકસાવવાના સેટિંગ</translation> @@ -2331,6 +2334,7 @@ <translation id="2963151496262057773">નીચેનાં પ્લગ-ઇન ચાલતાં નથી: <ph name="PLUGIN_NAME" />તમે તેને રોકવા માંગશો?</translation> <translation id="2964193600955408481">Wi-Fi ને અક્ષમ કરો</translation> <translation id="2964245677645334031">'નજીકના શેર'ની દૃશ્યતા</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> બુકમાર્ક ફોલ્ડર માટે વધુ વિકલ્પો</translation> <translation id="2966937470348689686">Android પસંદગીઓનું સંચાલન કરો</translation> <translation id="2967926928600500959">આ નિયમો સાથે મેળ ખાતા URLsને કોઈ ચોક્કસ બ્રાઉઝરમાં જ ખોલવામાં આવશે.</translation> <translation id="2972581237482394796">&ફરી કરો</translation> @@ -2620,6 +2624,7 @@ <translation id="3244294424315804309">અવાજ બંધ કરવાનું ચાલુ રાખો</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - નેટવર્ક ભૂલ</translation> <translation id="3248902735035392926">સલામતી મહત્ત્વપૂર્ણ છે. થોડી ક્ષણ ફાળવીને <ph name="BEGIN_LINK" />હમણાં જ તમારા એક્સ્ટેંશન ચેક કરો<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">જ્યારે તમારો પાસવર્ડ ઑટોમૅટિક રીતે <ph name="GOOGLE_PASSWORD_MANAGER" />માં સાચવવામાં આવેલો હોય ત્યારે <ph name="EMAIL" /> માટે વધુ ઝડપથી સાઇન અપ અને સાઇન ઇન કરો.</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" />ને “Ok Google” કહીને Google Assistant ઍક્સેસ કરવા દો</translation> <translation id="3251759466064201842"><પ્રમાણપત્રનો ભાગ નથી></translation> <translation id="325238099842880997">બાળકોના ચલાવવા, શોધખોળ કરવા અને ઘરે શાળાનો અભ્યાસ કરવા માટેના મૂળભૂત ડિજિટલ નિયમો સેટ કરો</translation> @@ -4114,6 +4119,7 @@ <translation id="4556194354084985730">તમારા સાચવેલા પાસવર્ડ વડે સાઇટ અને ઍપમાં સરળતાથી સાઇન ઇન કરો. જ્યારે બંધ હોય, ત્યારે તમને સાઇન ઇન કરતા પહેલાં પૂછવામાં આવશે.</translation> <translation id="4558426062282641716">સ્વતઃલોંચ પરવાનગીની વિનંતી કરી</translation> <translation id="4559617833001311418">આ સાઇટ તમારા મોશન અથવા લાઇટ સેન્સર ઍક્સેસ કરી રહી છે.</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> બુકમાર્ક માટે વધુ વિકલ્પો</translation> <translation id="4561893854334016293">હાલમાં કોઈ પરવાનગીમાં ફેરફાર થયો નથી</translation> <translation id="4562155214028662640">ફિંગરપ્રિન્ટ ઉમેરો</translation> <translation id="4563210852471260509">પ્રારંભિક ઇનપુટ ભાષા ચીની છે</translation> @@ -4397,6 +4403,7 @@ <translation id="4819323978093861656">{0,plural, =0{હમણાં બંધ કરી રહ્યાં છીએ.}=1{આટલા સમયમાં બંધ કરી રહ્યાં છીએ: 1 સેકન્ડ}one{આટલા સમયમાં બંધ કરી રહ્યાં છીએ: # સેકન્ડ}other{આટલા સમયમાં બંધ કરી રહ્યાં છીએ: # સેકન્ડ}}</translation> <translation id="4819607494758673676">Google Assistantનાં નોટિફિકેશન</translation> <translation id="4820236583224459650">સક્રિય ટિકિટ તરીકે સેટ કરો</translation> +<translation id="4820795723433418303">ફંક્શન કીનો ઉપયોગ સૌથી ઉપરની પંક્તિની કી તરીકે કરો</translation> <translation id="4821935166599369261">&પ્રોફાઇલિંગ સક્ષમ</translation> <translation id="4823484602432206655">વપરાશકર્તા અને ડિવાઇસ સેટિંગ વાંચો અને બદલો</translation> <translation id="4824037980212326045">Linux બૅકઅપ લો અને રિસ્ટોર કરો</translation> @@ -4528,6 +4535,7 @@ <translation id="4925320384394644410">તમારા પોર્ટ અહીં દેખાશે</translation> <translation id="49265687513387605">સ્ક્રીનને કાસ્ટ કરી શકતા નથી. ચેક કરી જુઓ કે તમારી સ્ક્રીન શેર કરવાનું શરૂ કરવા માટેના સંકેતને તમે કન્ફર્મ કર્યો છે કે નહીં.</translation> <translation id="4927753642311223124">અહીં જોવા માટે કંઈ નથી, આગળ વધો.</translation> +<translation id="4928629450964837566">કોઈ વધુ સલામત પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="4929386379796360314">નિર્ધારિત સ્થાન પ્રિન્ટ કરો</translation> <translation id="4930447554870711875">ડેવલપર</translation> <translation id="4930714375720679147">ચાલુ કરો</translation> @@ -4610,6 +4618,7 @@ <translation id="5010886807652684893">વિઝ્યુઅલ વ્યૂ</translation> <translation id="5015344424288992913">પ્રૉક્સીને ઉકેલી રહ્યા છે...</translation> <translation id="5016491575926936899">તમે તમારા કમ્પ્યુટર પરથી ટેક્સ્ટ મોકલી શકો છો, તમારું ઇન્ટરનેટ કનેક્શન શેર કરી શકો છો, વાતચીતના નોટિફિકેશનનો જવાબ આપી શકો છો અને તમારી <ph name="DEVICE_TYPE" />ને તમારા ફોન વડે અનલૉક કરી શકો છો.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">કોઈ નવો પાસવર્ડ અજમાવી જુઓ</translation> <translation id="5017643436812738274">તમે ટેક્સ્ટ કર્સર વડે કોઈપણ પેજ પર નૅવિગેટ કરી શકશો. બંધ કરવા માટે, Ctrl+Search+7 દબાવો.</translation> <translation id="5018207570537526145">એક્સ્ટેંશન વેબસાઇટ ખોલો</translation> <translation id="5018526990965779848">વપરાશ અને નિદાનનો ડેટા મોકલો. Googleને નિદાન, ડિવાઇસ અને ઍપ વપરાશનો ડેટા ઑટોમૅટિક રીતે મોકલીને તમારા Android અનુભવને બહેતર બનાવવામાં સહાય કરો. આ સિસ્ટમ અને ઍપની સ્થિરતા અને અન્ય સુધારણાઓમાં સહાય કરશે. એકત્ર કરેલો કેટલોક ડેટા Google ઍપ અને ભાગીદારો, જેમ કે Android ડેવલપરને પણ સહાય કરશે. જો તમારી વધારાની વેબ અને ઍપ પ્રવૃત્તિનું સેટિંગ ચાલુ હોય, તો આ ડેટા તમારા Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે.</translation> @@ -4678,6 +4687,7 @@ <translation id="5078638979202084724">બધા ટૅબ્સ બુકમાર્ક કરો</translation> <translation id="5078796286268621944">ખોટો PIN</translation> <translation id="5079010647467150187">બિલ્ટ-ઇન VPN ઉમેરો...</translation> +<translation id="5079699784114005398">એકવાર ચાલુ કર્યા પછી, તમે તમારા Google એકાઉન્ટ વડે સાઇન ઇન કરો તે પછી કોઈપણ ChromeOS ડિવાઇસ પર તમારી ઍપ ઉપલબ્ધ રહેશે. Chrome બ્રાઉઝરમાંથી ઇન્સ્ટૉલ કરેલી વેબ ઍપ સિંક કરવામાં આવશે, પછી ભલે બ્રાઉઝરમાં સિંક કરવાની સુવિધા બંધ કરેલી હોય.</translation> <translation id="508059534790499809">Kerberosની ટિકિટ રિફ્રેશ કરો</translation> <translation id="5081960376148623587">પેજ પહેલેથી લોડ કરવા કે નહીં તે પસંદ કરો</translation> <translation id="5084328598860513926">સેટઅપનો ફ્લૉ અવરોધિત થયો હતો. કૃપા કરીને ફરીથી પ્રયાસ કરો અથવા તમારા ડિવાઇસના માલિક અથવા વ્યવસ્થાપકનો સંપર્ક કરો. ભૂલનો કોડ: <ph name="ERROR_CODE" />.</translation> @@ -4753,6 +4763,7 @@ <translation id="5145464978649806571">જો તમે તમારા ડિવાઇસથી દૂર હટી જાઓ, તો તમારી સ્ક્રીન ઑટોમૅટિક રીતે લૉક થઈ જશે. જ્યારે તમે તમારા ડિવાઇસની સામે હાજર રહો, ત્યારે તમારી સ્ક્રીન વધુ સમય માટે સક્રિય રહેશે. જો લૉક સ્ક્રીન બંધ હોય, તો તમારું ડિવાઇસ લૉક થવાને બદલે નિષ્ક્રિય થઈ જશે.</translation> <translation id="514575469079499857">સ્થાન (ડિફૉલ્ટ) નક્કી કરવા માટે તમારા IP ઍડ્રેસનો ઉપયોગ કરો</translation> <translation id="5146896637028965135">સિસ્ટમ વૉઇસ</translation> +<translation id="5147992672778369947">સુઝાવ આપેલા પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="5148277445782867161">Googleની સ્થાન સેવા, તમારા ડિવાઇસના સ્થાનનું અનુમાન લગાવવામાં સહાય માટે વાઇ-ફાઇ, મોબાઇલ નેટવર્ક અને સેન્સર જેવા સૉર્સનો ઉપયોગ કરે છે.</translation> <translation id="5150254825601720210">નેટસ્કેપ પ્રમાણપત્ર SSL સર્વર નામ</translation> <translation id="5151354047782775295">ડિસ્ક સ્થાન ખાલી કરો અથવા પસંદ કરેલ ડેટા ઑટોમૅટિક રીતે કાઢી નાખવામાં આવી શકે છે</translation> @@ -5039,6 +5050,7 @@ <translation id="5414566801737831689">તમે મુલાકાત લો છો તે વેબસાઇટ્સના આયકન્સ વાંચો</translation> <translation id="5414836363063783498">ચકાસી રહ્યું છે...</translation> <translation id="5417312524372586921">બ્રાઉઝરની થીમ</translation> +<translation id="5417353542809767994">ઝડપથી કોઈ સશક્ત પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="541737483547792035">સ્ક્રીન મોટી કરો</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">વધારાની સુરક્ષા માટે, ડિવાઇસ અનલૉક કરવા માટે પાસવર્ડ જરૂરી છે</translation> @@ -5159,6 +5171,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android ફોન વડે સેટઅપ કરો</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">કોઈ સશક્ત પાસવર્ડ વડે આ એકાઉન્ટને વધુ સુરક્ષિત રાખો. તેને <ph name="EMAIL" /> માટે <ph name="GOOGLE_PASSWORD_MANAGER" />માં સાચવવામાં આવશે.</translation> <translation id="5521078259930077036">શું આ તમારી અપેક્ષા મુજબનું હોમપેજ છે?</translation> <translation id="5522156646677899028">આ એક્સટેન્શનમાં ગંભીર સુરક્ષા ભેદ્યતા છે.</translation> <translation id="5522403133543437426">ઍડ્રેસ બારમાં ઉપયોગમાં લેવાયેલું શોધ એન્જિન.</translation> @@ -5779,6 +5792,7 @@ <translation id="6070311415473175157">શોધવા માટે છબીઓ વિસ્તાર પસંદ કરો</translation> <translation id="6071181508177083058">પાસવર્ડની પુષ્ટિ કરો</translation> <translation id="6071576563962215370">સિસ્ટમ ડિવાઇસ ઇન્સ્ટૉલેશન-સમય એટ્રિબ્યુશનનું લૉક સ્થાપિત કરવામાં નિષ્ફળ ગયું.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> મેમરી સાચવી</translation> <translation id="6072442788591997866"><ph name="APP_NAME" />ને આ ડિવાઇસ પર મંજૂરી નથી. તમારા વ્યવસ્થાપકનો સંપર્ક કરો. ભૂલનો કોડ: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">રેકોર્ડિંગ બંધ કરો</translation> <translation id="6073903501322152803">ઍક્સેસિબિલિટી સુવિધાઓ ઉમેરો</translation> @@ -5826,6 +5840,7 @@ <translation id="6104068876731806426">Google એકાઉન્ટ</translation> <translation id="6104311680260824317">ઉપકરણ ડોમેન સાથે જોડી શકાતું નથી. સર્વર આપેલ Kerberos ઍન્ક્રિપ્શન પ્રકારોનું સમર્થન કરતું નથી. ઍન્ક્રિપ્શન સેટિંગ માટે "વધુ વિકલ્પો" ચેક કરો.</translation> <translation id="6104796831253957966">પ્રિન્ટરની કતારમાં ઘણી બધી ફાઇલો છે</translation> +<translation id="6104929924898022309">ફંક્શન કીની વર્તણૂંક બદલવા માટે શોધ કીનો ઉપયોગ કરો</translation> <translation id="6106167152849320869">જો તમે પાછળના પગલાંમાં ડાયગ્નોસ્ટિક અને વપરાશનો ડેટા મોકલવાનું પણ પસંદ કર્યું હોય, તો આ ડેટા ઇન્સ્ટૉલ કરેલી ઍપ માટે એકત્રિત કરવામાં આવશે.</translation> <translation id="6111972606040028426">Google Assistant ચાલુ કરો</translation> <translation id="6112294629795967147">કદ બદલવા માટે સ્પર્શ કરો</translation> @@ -5967,6 +5982,7 @@ <translation id="6234108445915742946">Chromeની સેવાની શરતો 31 માર્ચથી બદલાઈ રહી છે</translation> <translation id="6234474535228214774">ઇન્સ્ટૉલ બાકી છે</translation> <translation id="6235208551686043831">ડિવાઇસનો કૅમેરા ચાલુ કરવામાં આવ્યો છે. કૃપા કરીને તમારો ઇ-સિમ QR કોડ કૅમેરાની સામે રાખો.</translation> +<translation id="6237297174664969437">કયો બ્રાઉઝિંગ ડેટા સિંક કરવો, તે તમે Chrome સેટિંગમાં જઈને કોઈપણ સમયે પસંદ કરી શકો છો. <ph name="LINK_BEGIN" />ડિવાઇસ સેટિંગ<ph name="LINK_END" />માં જઈને, તમે Chrome બ્રાઉઝરમાંથી ઇન્સ્ટૉલ કરેલી વેબ ઍપને સિંક કરવાની પ્રક્રિયા પર નિયંત્રણ રાખી શકો છો. Google તમારા ઇતિહાસના આધારે Search અને અન્ય સેવાઓને મનગમતી બનાવી શકે છે.</translation> <translation id="6237474966939441970">સ્ટાયલસ વડે નોંધ લેવાની ઍપના સેટિંગ</translation> <translation id="623755660902014047">વાંચન મોડ</translation> <translation id="6238767809035845642">બીજા ડિવાઇસ પરથી શેર કરવામાં આવેલી ટેક્સ્ટ</translation> @@ -6300,6 +6316,7 @@ <translation id="6537613839935722475">નામ માટે અક્ષરો, સંખ્યાઓ અને હાયફન (-)નો ઉપયોગ કરી શકાય છે</translation> <translation id="6538098297809675636">કોડની ભાળ મેળવવામાં ભૂલ આવી</translation> <translation id="653920215766444089">પૉઇન્ટિંગ ડિવાઇસ શોધી રહ્યાં છીએ</translation> +<translation id="6539674013849300372">સશક્ત પાસવર્ડ વડે ઑનલાઇન વધુ સલામત રહો. તેને <ph name="EMAIL" /> માટે <ph name="GOOGLE_PASSWORD_MANAGER" />માં સાચવવામાં આવશે.</translation> <translation id="653983593749614101">ફરી શરૂ કરી રહ્યાં છીએ...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" /> નોંધ: <ph name="END_BOLD" /> જો તમે શું કરી રહ્યાં છો તે તમે જાણતા હો અથવા જો તમને તેવું કરવા માટે કહેવામાં આવ્યું હોય તો જ ચાલુ કરો, કારણ કે ડેટાનો સંગ્રહ પ્રદર્શન પર અસર કરી શકે છે.</translation> <translation id="6541638731489116978">આ સાઇટને તમારા મોશન સેન્સરને ઍક્સેસ કરવાથી બ્લૉક કરવામાં આવી છે.</translation> @@ -6496,6 +6513,7 @@ <translation id="671226373742585927">બાજુની પૅનલ બંધ કરવા માટે "X" બટનને ક્લિક કરો</translation> <translation id="6712943853047024245">તમે પહેલાંથી આ વપરાશકર્તાના નામ માટે <ph name="WEBSITE" />નો પાસવર્ડ સાચવ્યો છે</translation> <translation id="6713233729292711163">ઑફિસની પ્રોફાઇલ ઉમેરો</translation> +<translation id="6713441551032149301">ફંક્શન કી અને સિસ્ટમની સૌથી ઉપરની પંક્તિની કી વચ્ચે બદલવા માટે લૉન્ચર કીને દબાવી રાખો</translation> <translation id="6713668088933662563">આ ભાષાઓનો અનુવાદ કરવાની ક્યારેય ઑફર કરશો નહીં</translation> <translation id="6715803357256707211">તમારી Linux ઍપ્લિકેશનના ઇન્સ્ટૉલેશન દરમિયાન ભૂલ આવી. વિગતો માટે નોટિફિકેશન પર ક્લિક કરો.</translation> <translation id="671619610707606484">આમ કરવાથી સાઇટ દ્વારા સ્ટોર કરેલો <ph name="TOTAL_USAGE" /> ડેટા સાફ કરવામાં આવશે</translation> @@ -6617,6 +6635,7 @@ <translation id="6811034713472274749">પેજ જોવા માટે તૈયાર છે</translation> <translation id="6811151703183939603">પ્રબળ</translation> <translation id="6811332638216701903">DHCP હોસ્ટનું નામ</translation> +<translation id="6811792477922751991">ફંક્શન કીની વર્તણૂંક બદલવા માટે લૉન્ચર કીનો ઉપયોગ કરો</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> એક મૂળ તરીકે ચાલી શકતું નથી.</translation> <translation id="6812841287760418429">ફેરફારો રાખો</translation> <translation id="6813907279658683733">સમગ્ર સ્ક્રીન</translation> @@ -7810,6 +7829,7 @@ <translation id="7851720427268294554">IPP વિશ્લેષક</translation> <translation id="78526636422538552">Googleના વધુ એકાઉન્ટ ઉમેરી શકાશે નહીં</translation> <translation id="7853747251428735">વધુ સા&ધનો</translation> +<translation id="7853999103056713222">કોઈ વધુ સલામત પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="7855678561139483478">ટૅબને નવી વિંડોમાં ખસેડો</translation> <translation id="7857004848504343806">તમારું કમ્પ્યુટર સુરક્ષા મૉડ્યૂલ ધરાવે છે, જેનો ઉપયોગ ChromeOS Flexમાં ઘણી મહત્ત્વપૂર્ણ સુરક્ષા સુવિધાઓ લાગુ કરવા માટે કરવામાં આવે છે. વધુ જાણવા માટે Chromebook સહાયતા કેન્દ્રની મુલાકાત લો: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">ટેક્સ્ટ સૂચનો</translation> @@ -8360,6 +8380,7 @@ <translation id="8325413836429495820">તમારું ક્લિપબોર્ડ જોવાની મંજૂરી નથી</translation> <translation id="8326478304147373412">PKCS #7, પ્રમાણપત્ર ચેન</translation> <translation id="8327386430364625757">ગણિતિક ફૉન્ટ</translation> +<translation id="8327538105740918488">પછીથી તમે કોઈપણ સમયે પાસવર્ડ બદલી શકો છો. તેને <ph name="EMAIL" /> માટે <ph name="GOOGLE_PASSWORD_MANAGER" />માં સાચવવામાં આવશે.</translation> <translation id="8327676037044516220">પરવાનગીઓ અને કન્ટેન્ટ સેટિંગ</translation> <translation id="8330617762701840933">એવી વેબસાઇટની સૂચિ કે જે વૈકલ્પિક બ્રાઉઝરમાં રીડાયરેક્ટ કરે છે.</translation> <translation id="8330689128072902965">નજીકના સંપર્કો તમારી સાથે શેર કરી શકે છે. બદલવા માટે ક્લિક કરો.</translation> @@ -8505,6 +8526,7 @@ <translation id="8449836157089738489">બધા નવી ટૅબના ગ્રૂપમાં ખોલો</translation> <translation id="8451512073679317615">સહાયક</translation> <translation id="845702320058262034">કનેક્ટ કરી શકાતું નથી. તમારા ફોનનું બ્લૂટૂથ ચાલુ હોવાની ખાતરી કરો.</translation> +<translation id="8457251154056341970">તમને આ પેજ પર ફરીથી <ph name="MODULE_NAME" /> દેખાશે નહીં</translation> <translation id="8457451314607652708">બુકમાર્ક આયાત કરો</translation> <translation id="8458341576712814616">શૉર્ટકટ</translation> <translation id="8458627787104127436">બધી (<ph name="URL_COUNT" />) URL નવી વિન્ડોમાં ખોલો</translation> @@ -8577,6 +8599,7 @@ <translation id="8514955299594277296">સાઇટને તમારા ડિવાઇસ પર ડેટા સાચવવાની મંજૂરી આપશો નહીં (સુઝાવ આપવામાં આવતો નથી)</translation> <translation id="8517759303731677493">ફેરફાર કરો…</translation> <translation id="8519895319663397036">પાસવર્ડ આયાત કરી શકતા નથી. ફાઇલનું કદ 150 KB કરતાં ઓછું હોવું જોઈએ.</translation> +<translation id="851991974800416566">ઝડપથી કોઈ સશક્ત પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="8523493869875972733">ફેરફારો રાખો</translation> <translation id="8523849605371521713">પૉલિસી દ્વારા ઉમેરાયેલું</translation> <translation id="8524783101666974011">તમારા Google એકાઉન્ટમાં કાર્ડ સાચવો</translation> @@ -8734,6 +8757,7 @@ <translation id="8665110742939124773">તમે કોઈ અયોગ્ય ઍક્સેસ કોડ દાખલ કર્યો છે. ફરી પ્રયાસ કરો.</translation> <translation id="8665180165765946056">બૅકઅપ પૂર્ણ થયું</translation> <translation id="866611985033792019">ઇમેઇલ વપરાશકર્તાઓને ઓળખવા માટે આ પ્રમાણપત્ર પર વિશ્વાસ કરો</translation> +<translation id="8666268818656583275">F કી હવે સિસ્ટમની સૌથી ઉપરની પંક્તિમાં આવેલી કી જેવી વર્તણૂક કરશે</translation> <translation id="8666321716757704924"><ph name="WEBSITE" />ને ફરી પરવાનગીઓ આપવામાં આવી</translation> <translation id="8666759526542103597">બ્રાઉઝર આધારિત રુચિ મુજબ જાહેરાત વિશેની માહિતી</translation> <translation id="8667261224612332309">તમારી પાસે એવા પાસવર્ડ છે જેને બહેતર બનાવી શકાય છે</translation> @@ -9417,6 +9441,7 @@ <translation id="950307215746360464">સેટઅપની માર્ગદર્શિકા</translation> <translation id="951991426597076286">નકારો</translation> <translation id="952471655966876828">ડિવાઇસ જ્યારે ચાલુ કરવામાં આવે અથવા ઉપયોગમાં હોય, ત્યારે તે ઑટોમૅટિક રીતે કનેક્ટ થઈ જશે</translation> +<translation id="952880932803612259">ઍપ, વેબસાઇટ અને સિસ્ટમની સેવાઓને તમારા લોકેશનનો ઉપયોગ કરવાની મંજૂરી આપો. લોકેશન સેવા તમારા ડિવાઇસનું સ્થાન નક્કી કરવામાં સહાય કરવા માટે વાઇ-ફાઇ, મોબાઇલ નેટવર્ક અને સેન્સર જેવા સૉર્સનો ઉપયોગ કરી શકે છે.</translation> <translation id="953434574221655299">તમે સક્રિય રૂપે તમારા ડિવાઇસનો ઉપયોગ ક્યારે કરો છો, તે જાણવાની મંજૂરી છે</translation> <translation id="956500788634395331">તમને નુકસાન પહોંચાડવાની સંભાવના હોય એવા એક્સ્ટેંશનથી સુરક્ષિત કર્યા છે</translation> <translation id="957179356621191750">6-ડૉટ</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index ee9cf7d..b076d38 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2355,7 +2355,7 @@ <translation id="2975761176769946178">URL wajib diisi</translation> <translation id="2976557544729462544">Beberapa perangkat mengharuskan Anda menonaktifkan perlindungan akses data agar dapat berfungsi dengan benar atau dalam performa penuh.</translation> <translation id="2976756276046118477">Filter merah-hijau (hijau lemah, deuteranomali)</translation> -<translation id="2977480621796371840">Hapus dari grup</translation> +<translation id="2977480621796371840">Keluarkan dari grup</translation> <translation id="2979639724566107830">Buka di jendela baru</translation> <translation id="2981113813906970160">Tampilkan kursor mouse besar</translation> <translation id="2981293774053328982">File ini berisi malware yang dapat membahayakan akun jaringan sosial atau pribadi Anda</translation> @@ -6801,7 +6801,7 @@ <translation id="6961327401577924850">Situs biasanya mencari perangkat Bluetooth untuk fitur seperti penyiapan atau sinkronisasi beacon hemat energi, pelacak kesehatan atau kebugaran, atau bohlam lampu smart</translation> <translation id="6963872466817251924">Penanda kursor teks</translation> <translation id="6964390816189577014">Hero</translation> -<translation id="6964760285928603117">Hapus dari Grup</translation> +<translation id="6964760285928603117">Keluarkan dari Grup</translation> <translation id="6965382102122355670">Oke</translation> <translation id="6965648386495488594">Port</translation> <translation id="6965978654500191972">Perangkat</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 43e9dca..c448935 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -525,6 +525,7 @@ <translation id="146000042969587795">このフレームにはセキュリティで保護されていないコンテンツが含まれているためブロックされました。</translation> <translation id="1461041542809785877">パフォーマンス</translation> <translation id="1461177659295855031">ブックマーク バー フォルダに移動</translation> +<translation id="1461288887896722288">管理対象アカウントにログインしました。管理対象プロファイルを新規作成すると、アカウントにリンクされている一部のリソースにアクセスできます。</translation> <translation id="146219525117638703">ONC 状態</translation> <translation id="146220085323579959">インターネットが切断されました。お使いのインターネット接続を確認してから、もう一度お試しください。</translation> <translation id="1462850958694534228">新しいアイコンを確認</translation> @@ -1871,6 +1872,7 @@ <translation id="2575407791320728464">URL が無効です。適切な形式であることを確認してください。</translation> <translation id="2575441894380764255">煩わしい広告や誤解を招く広告の表示を許可しないサイト</translation> <translation id="2575713839157415345">{YEARS,plural, =1{このデバイスは 1 年間保存され、次回はコードなしで接続できます。これは管理者によって設定されています。}other{このデバイスは {YEARS} 年間保存され、次回はコードなしで接続できます。これは管理者によって設定されています。}}</translation> +<translation id="2577446426265992344">アドレスバー以外</translation> <translation id="257779572837908839">Chromebox for meetings として設定</translation> <translation id="2579309488038515659">アクセス ポイントが有効</translation> <translation id="2579596474754516455">スクリーン リーダーで読み上げられるように、必要に応じて PDF 画像をスキャンしてテキストに変換する</translation> @@ -3202,7 +3204,7 @@ <translation id="3764753550716962406">カートの情報を使用した割引情報の検索を Google に許可しますか?</translation> <translation id="3764974059056958214">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> に <ph name="ATTACHMENTS" />を送信しています}other{<ph name="DEVICE_NAME" /> に <ph name="ATTACHMENTS" />を送信しています}}</translation> <translation id="3765246971671567135">オフライン デモモード ポリシーを読み取ることができませんでした。</translation> -<translation id="3765696567014520261">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のカスタマイズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります</translation> +<translation id="3765696567014520261">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のパーソナライズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります</translation> <translation id="3766687283066842296">スマートフォン ハブの詳細</translation> <translation id="3766811143887729231"><ph name="REFRESH_RATE" /> Hz</translation> <translation id="377050016711188788">アイスクリーム</translation> @@ -6560,6 +6562,7 @@ <translation id="6787097042755590313">その他のタブ</translation> <translation id="6787839852456839824">キーボード ショートカット</translation> <translation id="6788210894632713004">パッケージ化されていない拡張機能</translation> +<translation id="678939393857169499">新しいデスクトップ デザインを有効にする。</translation> <translation id="6789592661892473991">横に分割</translation> <translation id="6789834167207639931">復元を完了するには、次の画面で Google アカウントのパスワードをもう一度入力してください</translation> <translation id="6790428901817661496">再生</translation> @@ -6775,7 +6778,7 @@ <translation id="6965978654500191972">デバイス</translation> <translation id="6966370001499648704">セキュリティ キーとして使用するスマートフォンを管理します</translation> <translation id="6967430741871315905">デバイスが許可されているかどうか確認できません</translation> -<translation id="696780070563539690">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できません(広告のカスタマイズなどが行えません)</translation> +<translation id="696780070563539690">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できません(広告のパーソナライズなどが行えません)</translation> <translation id="6968288415730398122">画面ロックを設定するにはパスワードを入力します</translation> <translation id="6969047215179982698">ニアバイシェアをオフにする</translation> <translation id="6969216690072714773">このデバイスに関連付ける新しい情報を入力するか、既存の情報を更新します。</translation> @@ -7356,6 +7359,7 @@ <translation id="7481312909269577407">進む</translation> <translation id="7481358317100446445">準備完了</translation> <translation id="748138892655239008">証明書の基本制約</translation> +<translation id="7483145199632798061">2023 年に行われる Chrome の更新</translation> <translation id="7484645889979462775">このサイトでは保存しない</translation> <translation id="7487141338393529395">拡張スペルチェックの有効化</translation> <translation id="7487969577036436319">コンポーネントはインストールされていません</translation> @@ -8365,7 +8369,7 @@ <translation id="8342861492835240085">コレクションを選択</translation> <translation id="8345848587667658367">スマートフォンの最近の写真、メディア、通知、アプリを表示できるようになりました</translation> <translation id="8347227221149377169">印刷ジョブ</translation> -<translation id="834785183489258869">シークレット モードのとき、サイトは Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のカスタマイズなどを行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation> +<translation id="834785183489258869">シークレット モードのとき、サイトは Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のパーソナライズなどを行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation> <translation id="8349826889576450703">ランチャー</translation> <translation id="8350789879725387295">Dock のタッチペン ツール</translation> <translation id="8351316842353540018">ユーザー補助設定オプションを常に表示する</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 32f51f9..69a233c 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Қойындыларды оң жаққа жабу</translation> <translation id="1166583374608765787">Өзгертілген атауды қарау</translation> <translation id="1166596238782048887">"<ph name="TAB_TITLE" />" қойындысы "<ph name="DESK_TITLE" />" үстеліне тиесілі.</translation> +<translation id="1167262726334064738">Жаңа құпия сөзді қолданып көру</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ішінде ашылады…</translation> <translation id="116896278675803795">Таңдалған контентке сәйкестендіру үшін тілді автоматты түрде өзгерту</translation> <translation id="1169266963600477608">Ойынды басқару элементтері</translation> @@ -904,6 +905,7 @@ <translation id="177336675152937177">Орналастырылатын қолданба деректері</translation> <translation id="1776712937009046120">Пайдаланушыны енгізу</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Функция пернелері мен жүйенің жоғарғы жол пернелері арасында ауысу үшін іздеу пернесін басып тұрыңыз</translation> <translation id="1778457539567749232">Оқылмаған деп белгілеу</translation> <translation id="1778991607452011493">Түзету журналдарын жіберу (ұсынылады)</translation> <translation id="1779441632304440041">Құпия сөзіңіз оңай болса, оны табу оңай болады. Күрделі құпия сөз орнатыңыз.</translation> @@ -1345,6 +1347,7 @@ <translation id="2142582065325732898">Соңғы Chrome қойындыларын көру үшін <ph name="LINK1_BEGIN" />Chrome Sync<ph name="LINK1_END" /> функциясын іске қосыңыз. <ph name="LINK2_BEGIN" />Толығырақ<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Құралдар тақтасын әрқашан толық экранда көрсету</translation> <translation id="2143778271340628265">Прокси конфигурациясын қолмен реттеу</translation> +<translation id="2143808295261240440">Ұсынылған құпия сөзді пайдалану</translation> <translation id="2143915448548023856">Дисплей параметрлері</translation> <translation id="2144536955299248197">Сертификат көру құралы: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux жүйесінде Android қолданбаларын әзірлеу</translation> @@ -2330,6 +2333,7 @@ <translation id="2963151496262057773">Келесі плагин жауап бермейді: <ph name="PLUGIN_NAME" />Оны тоқтатқыңыз келе ме?</translation> <translation id="2964193600955408481">Wi-Fi желісін өшіру</translation> <translation id="2964245677645334031">Nearby Share функциясының көрсетілу параметрі</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> бетбелгісі қалтасының қосымша опциялары</translation> <translation id="2966937470348689686">Android параметрлерін басқару</translation> <translation id="2967926928600500959">Осы ережелерге сай келетін URL мекенжайлары белгілі бір браузерде күштеп ашылады.</translation> <translation id="2972581237482394796">&Қайта орындау</translation> @@ -2619,6 +2623,7 @@ <translation id="3244294424315804309">Дыбысын қоспау</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – желі қатесі</translation> <translation id="3248902735035392926">Қауіпсіздік маңызды. Сәл уақытыңызды бөліп, <ph name="BEGIN_LINK" />кеңейтімдерді тексеріңіз<ph name="END_LINK" />.</translation> +<translation id="3249323165366527554">Құпия сөзіңіз <ph name="EMAIL" /> аккаунты үшін <ph name="GOOGLE_PASSWORD_MANAGER" /> қызметіне автоматты түрде сақталған кезде, тіркеліп, жылдамырақ кіріңіз.</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" /> Google Assistant-ке "Ok Google" деу арқылы кіруге рұқсат беру</translation> <translation id="3251759466064201842"><Сертификаттың бөлігі емес></translation> <translation id="325238099842880997">Балалардың ойнауына, желіні шарлауына және оқу жұмыстарына көмектесу үшін цифрлық құрылғыларды пайдаланудың негізгі ережелерін белгілеңіз.</translation> @@ -4113,6 +4118,7 @@ <translation id="4556194354084985730">Сақталған құпия сөздерді пайдалана отырып, сайттар мен қолданбаларға оңай кіріңіз. Бұл функция өшірулі кезде, кірер алдында құпия сөз сұралады.</translation> <translation id="4558426062282641716">Автоматты іске қосу рұқсаты сұралды</translation> <translation id="4559617833001311418">Бұл сайт қозғалыс не жарық датчиктеріңізге кіруде.</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> бетбелгісінің қосымша опциялары</translation> <translation id="4561893854334016293">Жақында өзгертілген рұқсаттар жоқ</translation> <translation id="4562155214028662640">Саусақ ізін қосу</translation> <translation id="4563210852471260509">Қытай тіліндегі бастапқы енгізу тілі</translation> @@ -4396,6 +4402,7 @@ <translation id="4819323978093861656">{0,plural, =0{Қазір жабылады.}=1{1 секундтан кейін жабылады.}other{# секундтан кейін жабылады.}}</translation> <translation id="4819607494758673676">Google Assistant хабарландырулары</translation> <translation id="4820236583224459650">Белсенді билет ретінде орнату</translation> +<translation id="4820795723433418303">Функция пернелерін жоғарғы жол пернелері ретінде пайдалану</translation> <translation id="4821935166599369261">&Профильдеу қосылды</translation> <translation id="4823484602432206655">Пайдаланушы және құрылғы параметрлерін оқу және өзгерту</translation> <translation id="4824037980212326045">Linux қолданбалары мен файлдарының сақтық көшірмесін жасау және оларды қалпына келтіру</translation> @@ -4527,6 +4534,7 @@ <translation id="4925320384394644410">Порттар осы жерде көрсетіледі.</translation> <translation id="49265687513387605">Экранды трансляциялау мүмкін емес. Экранды бөлісу сұрауын растағаныңызға көз жеткізіңіз.</translation> <translation id="4927753642311223124">Мұнда көретін ештеңе жоқ, ары қарай өтіңіз.</translation> +<translation id="4928629450964837566">Қауіпсіз құпия сөзді пайдалану</translation> <translation id="4929386379796360314">Белгіленген жерлерді басып шығару</translation> <translation id="4930447554870711875">Әзірлеушілер</translation> <translation id="4930714375720679147">Қосу</translation> @@ -4609,6 +4617,7 @@ <translation id="5010886807652684893">Көрнекі көрініс</translation> <translation id="5015344424288992913">Прокси анықталуда…</translation> <translation id="5016491575926936899">Компьютеріңізден мәтіндік хабарлар жібере, интернет байланысын бөлісе, сөйлесу туралы хабарландыруларға жауап бере және телефон арқылы <ph name="DEVICE_TYPE" /> құрылғысының құлпын аша аласыз.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Толығырақ ақпарат<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Жаңа құпия сөзді қолданып көру</translation> <translation id="5017643436812738274">Мәтін курсорымен бір беттен екінші бетке өте аласыз. Өшіру үшін Ctrl+Search+7 пернелер тіркесімін басыңыз.</translation> <translation id="5018207570537526145">Кеңейтім вебсайтын ашу</translation> <translation id="5018526990965779848">Пайдалану және диагностика туралы деректерді жіберу. Диагностикалық деректерді, сондай-ақ құрылғы мен қолданбаларды пайдалану деректерін Google қызметіне автоматты түрде жіберу арқылы Android жүйесін пайдалану тәжірибесін жақсартуға көмектесіңіз. Олар жүйе мен қолданбаның тұрақты жұмыс істеуіне және басқа да жақсартулар енгізуге көмектеседі. Кейбір жиынтық деректер Google қолданбаларын жетілдіруге және Android әзірлеушілері сияқты серіктестердің жұмысына көмектеседі. Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосулы болса, бұл деректер сіздің Google аккаунтыңызға сақталуы мүмкін.</translation> @@ -4677,6 +4686,7 @@ <translation id="5078638979202084724">Барлық қойындыларды бетбелгілерге қосу</translation> <translation id="5078796286268621944">PIN коды дұрыс емес</translation> <translation id="5079010647467150187">Ендірілген VPN қосу…</translation> +<translation id="5079699784114005398">Қосылса, Google аккаунтыңызбен кіргеннен кейін, қолданбаларыңыз кез келген ChromeOS құрылғысында қолжетімді болады. Браузерді синхрондау өшірулі болса да, Chrome браузерінен орнатылған веб-қолданбалар синхрондалады.</translation> <translation id="508059534790499809">Kerberos билетін жаңарту</translation> <translation id="5081960376148623587">Беттердің алдын ала жүктелуін таңдау</translation> <translation id="5084328598860513926">Инициализация үзілді. Әрекетті қайталаңыз немесе құрылғының иесіне не әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation> @@ -4752,6 +4762,7 @@ <translation id="5145464978649806571">Құрылғыдан алыстасаңыз, экран автоматты түрде құлыпталады. Ал құрылғының алдында болсаңыз, ол ұйқы режиміне өтпейді. Құлып экраны өшірілсе, құрылғы құлыпталмай, ұйқы режиміне өтеді.</translation> <translation id="514575469079499857">Орналасқан жерді IP мекенжайы арқылы анықтау (әдепкі)</translation> <translation id="5146896637028965135">Жүйелік дауыс</translation> +<translation id="5147992672778369947">Ұсынылған құпия сөзді пайдалану</translation> <translation id="5148277445782867161">Google орналасқан жерді анықтау қызметі Wi-Fi, мобильдік желілер және сенсорлар сияқты дереккөздерді пайдаланып, құрылғыңыздың орнын анықтауға мүмкіндік береді.</translation> <translation id="5150254825601720210">Netscape сертификат SSL сервер атауы</translation> <translation id="5151354047782775295">Дискіде орын босатпасаңыз, кейбір деректер автоматты түрде жойылады</translation> @@ -5038,6 +5049,7 @@ <translation id="5414566801737831689">Сіз кірген веб-сайттардың белгішелерін оқу</translation> <translation id="5414836363063783498">Расталуда…</translation> <translation id="5417312524372586921">Браузер тақырыптары</translation> +<translation id="5417353542809767994">Күрделі құпия сөзді жылдам пайдалану</translation> <translation id="541737483547792035">Экранды ұлғайту</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Қосымша қауіпсіздік үшін құрылғының құлпын ашатын құпия сөзді сұрау</translation> @@ -5158,6 +5170,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android телефонымен реттеу</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Бұл аккаунтты күрделі құпия сөзбен қауіпсіз сақтаңыз. <ph name="EMAIL" /> аккаунты үшін ол мына жерде сақталады: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="5521078259930077036">Бұл сіз күткен бастапқы бет пе?</translation> <translation id="5522156646677899028">Бұл кеңейтім өте қауіпсіз.</translation> <translation id="5522403133543437426">Мекенжай жолағында пайдаланылатын іздеу жүйесі.</translation> @@ -5773,6 +5786,7 @@ <translation id="6070311415473175157">Іздеу үшін кескіннің тиісті бөлігін таңдаңыз.</translation> <translation id="6071181508177083058">құпия сөзді растау</translation> <translation id="6071576563962215370">Жүйе құрылғыны орнату уақытының атрибуттарын құлыптай алмады.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> жад босатылды</translation> <translation id="6072442788591997866">Бұл құрылғыда <ph name="APP_NAME" /> пайдалануға тыйым салынған. Әкімшіңізге хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Бейнеге түсіруді тоқтату</translation> <translation id="6073903501322152803">Арнайы мүмкіндіктерді қосу</translation> @@ -5820,6 +5834,7 @@ <translation id="6104068876731806426">Google аккаунттары</translation> <translation id="6104311680260824317">Құрылғыны доменге қосу мүмкін емес. Сервер көрсетілген Kerberos шифрлау түрлеріне қолдау көрсетпейді. Шифрлау параметрлерін "Қосымша опциялар" тармағынан қараңыз.</translation> <translation id="6104796831253957966">Принтер кезегі толы.</translation> +<translation id="6104929924898022309">Функция пернелерінің әрекетін өзгерту үшін іздеу пернесін пайдалану</translation> <translation id="6106167152849320869">Алдыңғы қадамда диагностика мен пайдалану туралы деректі жіберуді таңдасаңыз, орнатылған қолданбалар үшін осы деректер жиналады.</translation> <translation id="6111972606040028426">Google Assistant қолданбасын қосу</translation> <translation id="6112294629795967147">Өлшемін өзгерту үшін түртіңіз</translation> @@ -5961,6 +5976,7 @@ <translation id="6234108445915742946">Chrome-ның Қызмет көрсету шарттары 31 наурыздан бастап өзгереді</translation> <translation id="6234474535228214774">Орнату процесі кезекте тұр</translation> <translation id="6235208551686043831">Құрылғы камерасы қосылды. Камераңызды eSIM профилінің QR кодына дәлдеңіз.</translation> +<translation id="6237297174664969437">Синхрондайтын браузерді пайдалану деректерін кез келген уақытта Chrome параметрлерінен таңдай аласыз. <ph name="LINK_BEGIN" />Құрылғы параметрлерінде<ph name="LINK_END" /> Chrome браузерінен орнатылған веб-қолданбаларды синхрондауды басқара аласыз. Google жүйесі Search және басқа да қызметтерді тарихыңызға негіздеп жекелендіре алады.</translation> <translation id="6237474966939441970">Стилуспен жазба жазу қолданбасы</translation> <translation id="623755660902014047">Оқу режимі</translation> <translation id="6238767809035845642">Басқа құрылғыдан келген мәтін</translation> @@ -6294,6 +6310,7 @@ <translation id="6537613839935722475">Атауда әріптерді, сандарды және сызықшаларды (-) пайдалануға болады.</translation> <translation id="6538098297809675636">Кодты анықтау кезінде қате шықты</translation> <translation id="653920215766444089">Көрсетуші құрылғы ізделуде</translation> +<translation id="6539674013849300372">Күрделі құпия сөзбен онлайн қауіпсіз болыңыз. <ph name="EMAIL" /> аккаунты үшін ол мына жерде сақталады: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="653983593749614101">Жалғасуда...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Ескертпе:<ph name="END_BOLD" /> не істеп жатқаныңызды білсеңіз немесе сізден орындауды сұраған болса ғана қосыңыз, себебі деректерді жинақтау өнімділікті нашарлатуы мүмкін.</translation> <translation id="6541638731489116978">Бұл сайттың қозғалыс датчиктеріңізді пайдалануына тыйым салынды.</translation> @@ -6488,6 +6505,7 @@ <translation id="671226373742585927">Бүйірлік панельді жабу үшін "X" түймесін басыңыз</translation> <translation id="6712943853047024245"><ph name="WEBSITE" /> қызметі үшін осы пайдаланушы аты мен құпия сөз сақталып қойған.</translation> <translation id="6713233729292711163">Жұмыс профилін қосу</translation> +<translation id="6713441551032149301">Функция пернелері мен жүйенің жоғарғы жол пернелері арасында ауысу үшін іске қосу тақтасы пернесін басып тұрыңыз</translation> <translation id="6713668088933662563">Бұл тілдерді аударуды ешқашан ұсынбау</translation> <translation id="6715803357256707211">Linux қолданбасын орнату кезінде қате кетті. Толық ақпарат алу үшін хабарландыруды басыңыз.</translation> <translation id="671619610707606484">Сайттарда сақталған <ph name="TOTAL_USAGE" /> дерек өшіріледі.</translation> @@ -6609,6 +6627,7 @@ <translation id="6811034713472274749">Бетті көре беруге болады.</translation> <translation id="6811151703183939603">Қатты</translation> <translation id="6811332638216701903">DHCP хост атауы</translation> +<translation id="6811792477922751991">Функция пернелерінің әрекетін өзгерту үшін іске қосу тақтасы пернесін пайдалану</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> өнімін түбірлік ретінде іске мүмкін емес.</translation> <translation id="6812841287760418429">Өзгерістерді сақтау</translation> <translation id="6813907279658683733">Бүкіл экран</translation> @@ -7802,6 +7821,7 @@ <translation id="7851720427268294554">IPP талдау құралы</translation> <translation id="78526636422538552">Қосымша Google аккаунттарын енгізу мүмкін емес.</translation> <translation id="7853747251428735">Қосымша құрал&дар</translation> +<translation id="7853999103056713222">Қауіпсіз құпия сөзді пайдалану</translation> <translation id="7855678561139483478">Қойындыны жаңа терезеден ашу</translation> <translation id="7857004848504343806">Компьютерде қауіпсіздік модулі бар, ол ChromeOS Flex операциялық жүйесінде көптеген маңызды қауіпсіздік функцияларын ендіру үшін пайдаланылады. Толығырақ ақпарат алу үшін Chromebook Анықтамалық орталығына кіріңіз: https://support.google.com/chromebook/?p=sm.</translation> <translation id="7857093393627376423">Мәтіндік ұсыныстар</translation> @@ -8356,6 +8376,7 @@ <translation id="8325413836429495820">Буфердегі контентті көруге рұқсаты жоқтар</translation> <translation id="8326478304147373412">PKCS #7, сертификаттар тізбегі</translation> <translation id="8327386430364625757">Математикалық қаріп</translation> +<translation id="8327538105740918488">Бұл құпия сөзді кез келген уақытта өзгерте аласыз. <ph name="EMAIL" /> аккаунты үшін ол мына жерде сақталады: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="8327676037044516220">Рұқсаттар және контент параметрлері</translation> <translation id="8330617762701840933">Бағытты қосымша браузерге ауыстыратын веб-сайттар тізімі.</translation> <translation id="8330689128072902965">Маңайдағы контактілер сізбен бөлісе алады. Өзгерту үшін басыңыз.</translation> @@ -8501,6 +8522,7 @@ <translation id="8449836157089738489">Барлығын жаңа қойындылар тобында ашу</translation> <translation id="8451512073679317615">assistant</translation> <translation id="845702320058262034">Қосылу мүмкін емес. Телефоныңыздағы Bluetooth қосылып тұрғанына көз жеткізіңіз.</translation> +<translation id="8457251154056341970">Бұл бетте <ph name="MODULE_NAME" /> модулі қайта көрсетілмейді</translation> <translation id="8457451314607652708">Бетбелгілерді импорттау</translation> <translation id="8458341576712814616">Таңбаша</translation> <translation id="8458627787104127436">Барлығын (<ph name="URL_COUNT" />) жаңа терезеде ашу</translation> @@ -8573,6 +8595,7 @@ <translation id="8514955299594277296">Сайттардың құрылғыңызда деректерді сақтауына рұқсат етпеу (ұсынылмайды)</translation> <translation id="8517759303731677493">Өзгерту…</translation> <translation id="8519895319663397036">Құпия сөздерді импорттау мүмкін емес. Файлдың көлемі 150 КБ-тан аз болуы керек.</translation> +<translation id="851991974800416566">Күрделі құпия сөзді жылдам пайдалану</translation> <translation id="8523493869875972733">Өзгерістерді сақтау</translation> <translation id="8523849605371521713">Саясат арқылы қосылған</translation> <translation id="8524783101666974011">Карталарды Google аккаунтына сақтау</translation> @@ -8730,6 +8753,7 @@ <translation id="8665110742939124773">Қате рұқсат кодын енгіздіңіз. Қайталап көріңіз.</translation> <translation id="8665180165765946056">Сақтық көшірме жасау аяқталды</translation> <translation id="866611985033792019">Электрондық пошта пайдаланушыларын анықтау үшін осы сертификатқа сену</translation> +<translation id="8666268818656583275">F пернелері енді жүйенің жоғарғы жол пернелері сияқты әрекетке ие болады</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> үшін рұқсаттар қайта берілді</translation> <translation id="8666759526542103597">Жарнаманы браузерге негіздеп жекелендіру туралы ақпарат</translation> <translation id="8667261224612332309">Сізде жақсартуға болатын құпия сөздер бар.</translation> @@ -9412,6 +9436,7 @@ <translation id="950307215746360464">Реттеу нұсқаулығы</translation> <translation id="951991426597076286">Қабылдамау</translation> <translation id="952471655966876828">Құрылғы қосылған немесе пайдаланылған кезде, автоматты түрде жалғанады.</translation> +<translation id="952880932803612259">Қолданбалардың, веб-сайттардың және жүйелік қызметтердің локацияңызды пайдалануына рұқсат беріңіз. Құрылғының орналасқан жерін анықтау үшін Wi-Fi, мобильдік желілер және датчиктер пайдаланылуы мүмкін.</translation> <translation id="953434574221655299">Құрылғыңызды белсенді пайдаланатын уақытыңыз туралы білуге рұқсат берілетін сайттар</translation> <translation id="956500788634395331">Сіз зиянды кеңейтімдерден қорғалғансыз.</translation> <translation id="957179356621191750">6 нүктелі</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index ecaa7cb..06ce00c0 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">오른쪽 탭 닫기</translation> <translation id="1166583374608765787">이름 업데이트 검토</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> 탭이 <ph name="DESK_TITLE" /> 데스크로 이동했습니다</translation> +<translation id="1167262726334064738">새 비밀번호 사용해 보기</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> 후에 파일이 열립니다...</translation> <translation id="116896278675803795">선택한 콘텐츠와 일치하도록 언어를 자동으로 변경합니다.</translation> <translation id="1169266963600477608">게임 컨트롤</translation> @@ -918,6 +919,7 @@ <translation id="177336675152937177">호스팅된 앱 데이터</translation> <translation id="1776712937009046120">사용자 추가</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">검색 키를 길게 눌러 기능 키와 시스템 맨 위 키 간에 전환</translation> <translation id="1778457539567749232">읽지 않은 상태로 표시</translation> <translation id="1778991607452011493">디버그 로그 보내기(권장)</translation> <translation id="1779441632304440041">취약한 비밀번호는 추측하기 쉽습니다. 안전한 비밀번호를 설정하세요.</translation> @@ -1361,6 +1363,7 @@ <translation id="2142582065325732898">최근 사용한 Chrome 탭을 확인하려면 <ph name="LINK1_BEGIN" />Chrome 동기화<ph name="LINK1_END" />를 사용 설정하세요. <ph name="LINK2_BEGIN" />자세히 알아보기<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">전체화면에서 툴바 항상 표시</translation> <translation id="2143778271340628265">수동 프록시 설정</translation> +<translation id="2143808295261240440">권장 비밀번호 사용</translation> <translation id="2143915448548023856">디스플레이 설정</translation> <translation id="2144536955299248197">인증서 뷰어: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android 앱 개발</translation> @@ -2350,6 +2353,7 @@ <translation id="2963151496262057773">다음 플러그인에서 응답이 없습니다. <ph name="PLUGIN_NAME" />을(를) 중단하시겠습니까?</translation> <translation id="2964193600955408481">Wi-Fi 사용 안 함</translation> <translation id="2964245677645334031">Nearby Share 공개 상태</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> 북마크 폴더의 옵션 더보기</translation> <translation id="2966937470348689686">Android 환경설정 관리</translation> <translation id="2967926928600500959">이 규칙과 일치하는 URL은 강제로 특정 브라우저에서 열립니다.</translation> <translation id="2972581237482394796">다시 실행(&R)</translation> @@ -2639,6 +2643,7 @@ <translation id="3244294424315804309">계속 음소거</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - 네트워크 오류</translation> <translation id="3248902735035392926">안전은 그 무엇보다도 중요합니다. 잠시 시간을 내어 <ph name="BEGIN_LINK" />확장 프로그램을 검토<ph name="END_LINK" />해 보세요.</translation> +<translation id="3249323165366527554"><ph name="EMAIL" />의 비밀번호가 <ph name="GOOGLE_PASSWORD_MANAGER" />에 자동으로 저장되면 더 빠르게 가입하고 로그인할 수 있습니다.</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" />님이 “Hey Google”을 통해 Google 어시스턴트에 액세스하도록 허용</translation> <translation id="3251759466064201842"><인증서에 속하지 않음></translation> <translation id="325238099842880997">자녀가 집에서 놀고, 탐험하고, 학교 과제를 할 수 있도록 디지털 기기 사용 규칙을 설정하세요.</translation> @@ -4132,6 +4137,7 @@ <translation id="4556194354084985730">저장된 비밀번호로 사이트와 앱에 간편하게 로그인하세요. 사용 중지된 경우 로그인 전에 메시지가 표시됩니다.</translation> <translation id="4558426062282641716">자동 실행 권한 요청됨</translation> <translation id="4559617833001311418">사이트가 모션 센서 또는 조도 센서에 액세스 중입니다.</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> 북마크 옵션 더보기</translation> <translation id="4561893854334016293">최근 변경된 권한 없음</translation> <translation id="4562155214028662640">지문 추가</translation> <translation id="4563210852471260509">중국어를 초기 입력 언어로 설정</translation> @@ -4415,6 +4421,7 @@ <translation id="4819323978093861656">{0,plural, =0{지금 종료 중입니다.}=1{1초 후 종료됨}other{#초 후 종료됨}}</translation> <translation id="4819607494758673676">Google 어시스턴트 알림</translation> <translation id="4820236583224459650">활성 티켓으로 설정</translation> +<translation id="4820795723433418303">기능 키를 맨 위 키로 사용</translation> <translation id="4821935166599369261">프로파일링 사용(&P)</translation> <translation id="4823484602432206655">사용자와 기기 설정 확인 및 변경</translation> <translation id="4824037980212326045">Linux 백업 및 복원</translation> @@ -4546,6 +4553,7 @@ <translation id="4925320384394644410">포트가 여기에 표시됩니다</translation> <translation id="49265687513387605">화면을 전송할 수 없습니다. 화면 공유 시작 메시지를 확인했는지 알아보세요</translation> <translation id="4927753642311223124">표시할 내용이 없습니다.</translation> +<translation id="4928629450964837566">더 안전한 비밀번호 사용</translation> <translation id="4929386379796360314">인쇄 대상</translation> <translation id="4930447554870711875">개발자</translation> <translation id="4930714375720679147">사용 설정</translation> @@ -4628,6 +4636,7 @@ <translation id="5010886807652684893">시각 뷰</translation> <translation id="5015344424288992913">프록시 알아내는 중...</translation> <translation id="5016491575926936899">컴퓨터에서 문자 메시지를 보내고, 인터넷 연결을 공유하고, 대화 알림에 답장을 보내고, 휴대전화로 <ph name="DEVICE_TYPE" /> 기기의 잠금을 해제할 수 있습니다.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">새 비밀번호 사용해 보기</translation> <translation id="5017643436812738274">텍스트 커서로 페이지를 탐색할 수 있습니다. 사용 중지하려면 Ctrl+Search+7을 누르세요.</translation> <translation id="5018207570537526145">확장 프로그램 웹사이트 열기</translation> <translation id="5018526990965779848">사용 및 진단 데이터를 보냅니다. 진단, 기기, 앱 사용 데이터를 Google에 자동으로 보내 Android 사용 환경 개선에 참여합니다. 데이터는 시스템 및 앱 안정성 등을 개선하는 데 활용됩니다. 일부 수집 데이터는 Google 앱과 파트너(Android 개발자 등)에게도 도움을 줍니다. 추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 Google 계정에 저장될 수 있습니다.</translation> @@ -4696,6 +4705,7 @@ <translation id="5078638979202084724">모든 탭 북마크</translation> <translation id="5078796286268621944">잘못된 PIN</translation> <translation id="5079010647467150187">기본 제공 VPN 추가...</translation> +<translation id="5079699784114005398">이 기능을 사용 설정하면 Google 계정으로 로그인한 후 모든 ChromeOS 기기에서 앱을 사용할 수 있습니다. 브라우저 동기화가 사용 중지되어 있어도 Chrome 브라우저에서 설치된 웹 앱이 동기화됩니다.</translation> <translation id="508059534790499809">Kerberos 티켓 새로고침</translation> <translation id="5081960376148623587">페이지 미리 로드 여부 선택</translation> <translation id="5084328598860513926">프로비저닝 흐름이 중단되었습니다. 다시 시도하거나 기기 소유자 또는 관리자에게 문의하세요. 오류 코드: <ph name="ERROR_CODE" /></translation> @@ -4771,6 +4781,7 @@ <translation id="5145464978649806571">기기를 자리에 두고 일어나면 화면이 자동으로 잠깁니다. 기기 앞에 있는 동안에는 화면의 절전모드 해제 상태가 더 오래 유지됩니다. 잠금 화면을 사용하고 있지 않은 경우 기기가 잠기지 않고 절전 모드로 전환됩니다.</translation> <translation id="514575469079499857">위치 파악에 IP 주소 사용(기본값)</translation> <translation id="5146896637028965135">시스템 음성</translation> +<translation id="5147992672778369947">권장 비밀번호 사용</translation> <translation id="5148277445782867161">Google 위치 서비스는 기기 위치를 파악하는 데에 Wi-Fi, 모바일 네트워크, 센서와 같은 소스를 사용합니다.</translation> <translation id="5150254825601720210">Netscape Certificate SSL Server Name</translation> <translation id="5151354047782775295">디스크 저장 공간을 확보하지 않으면 일부 데이터가 자동으로 삭제됩니다.</translation> @@ -5057,6 +5068,7 @@ <translation id="5414566801737831689">방문하는 웹사이트의 아이콘 조회</translation> <translation id="5414836363063783498">확인 중...</translation> <translation id="5417312524372586921">브라우저 테마</translation> +<translation id="5417353542809767994">안전한 비밀번호를 빠르게 사용하기</translation> <translation id="541737483547792035">화면 확대</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">보안 강화를 위해 비밀번호로 기기를 잠금 해제하도록 설정합니다.</translation> @@ -5177,6 +5189,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android 휴대전화로 설정</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">안전한 비밀번호로 이 계정의 보안을 유지하세요. 비밀번호는 <ph name="EMAIL" />의 <ph name="GOOGLE_PASSWORD_MANAGER" />에 저장됩니다.</translation> <translation id="5521078259930077036">설정한 홈페이지가 맞습니까?</translation> <translation id="5522156646677899028">이 확장 프로그램에는 보안이 심각하게 취약한 요소가 있습니다.</translation> <translation id="5522403133543437426">주소 표시줄에서 사용되는 검색엔진입니다.</translation> @@ -5795,6 +5808,7 @@ <translation id="6070311415473175157">검색할 이미지 영역을 선택하세요.</translation> <translation id="6071181508177083058">비밀번호 확인</translation> <translation id="6071576563962215370">시스템에서 기기 설치 시간 속성 잠금을 설정하지 못했습니다.</translation> +<translation id="6071938745001252305">메모리 <ph name="MEMORY_VALUE" /> 절약됨</translation> <translation id="6072442788591997866">이 기기에서는 <ph name="APP_NAME" /> 앱이 허용되지 않습니다. 관리자에게 문의하세요. 오류 코드: <ph name="ERROR_CODE" /></translation> <translation id="6073451960410192870">녹화 중지</translation> <translation id="6073903501322152803">접근성 기능 추가</translation> @@ -5842,6 +5856,7 @@ <translation id="6104068876731806426">Google 계정</translation> <translation id="6104311680260824317">기기가 도메인에 가입하지 못했습니다. 서버가 지정된 Kerberos 암호화 유형을 지원하지 않습니다. '옵션 더보기'에서 암호화 설정을 확인하세요.</translation> <translation id="6104796831253957966">프린터 대기열이 가득 참</translation> +<translation id="6104929924898022309">검색 키를 사용하여 기능 키 동작 변경</translation> <translation id="6106167152849320869">이전 단계에서도 진단 및 사용 데이터를 전송하도록 선택한 경우 설치된 앱의 데이터가 수집됩니다.</translation> <translation id="6111972606040028426">Google 어시스턴트 사용</translation> <translation id="6112294629795967147">터치하여 크기 조정</translation> @@ -5983,6 +5998,7 @@ <translation id="6234108445915742946">3월 31일부터 Chrome의 서비스 약관이 변경됩니다</translation> <translation id="6234474535228214774">설치 대기 중</translation> <translation id="6235208551686043831">기기 카메라가 켜졌습니다. 카메라 앞에 eSIM QR 코드를 두세요.</translation> +<translation id="6237297174664969437">Chrome 설정에서 언제든지 동기화할 브라우저 데이터를 선택할 수 있습니다. <ph name="LINK_BEGIN" />기기 설정<ph name="LINK_END" />에서 Chrome 브라우저에서 설치된 웹 앱의 동기화를 제어할 수 있습니다. Google에서는 사용자의 방문 기록을 기반으로 Google 검색 및 기타 서비스를 맞춤설정할 수 있습니다.</translation> <translation id="6237474966939441970">스타일러스 메모 앱</translation> <translation id="623755660902014047">읽기 모드</translation> <translation id="6238767809035845642">다른 기기에서 공유된 텍스트</translation> @@ -6316,6 +6332,7 @@ <translation id="6537613839935722475">이름에는 문자, 숫자, 하이픈(-)을 사용할 수 있습니다.</translation> <translation id="6538098297809675636">코드를 감지하는 중 오류 발생</translation> <translation id="653920215766444089">포인팅 기기 검색 중</translation> +<translation id="6539674013849300372">안전한 비밀번호로 온라인 환경을 더 안전하게 유지하세요. 비밀번호는 <ph name="EMAIL" />의 <ph name="GOOGLE_PASSWORD_MANAGER" />에 저장됩니다.</translation> <translation id="653983593749614101">재개하는 중…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />참고:<ph name="END_BOLD" /> 데이터 수집으로 인해 성능이 감소할 수 있으므로 확신이 있는 경우 또는 요청을 받은 경우에만 사용하도록 설정합니다.</translation> <translation id="6541638731489116978">움직임 감지 센서 액세스가 차단된 사이트입니다.</translation> @@ -6510,6 +6527,7 @@ <translation id="671226373742585927">측면 패널을 닫으려면 'X' 버튼을 클릭합니다.</translation> <translation id="6712943853047024245">이미 <ph name="WEBSITE" />의 사용자 이름과 비밀번호를 저장했습니다.</translation> <translation id="6713233729292711163">직장 프로필 추가</translation> +<translation id="6713441551032149301">런처 키를 길게 눌러 기능 키와 시스템 맨 위 키 간에 전환</translation> <translation id="6713668088933662563">다음 언어 번역 제공 안 함</translation> <translation id="6715803357256707211">Linux 애플리케이션을 설치하는 중에 오류가 발생했습니다. 알림을 클릭하면 자세한 정보를 확인할 수 있습니다.</translation> <translation id="671619610707606484">사이트에서 저장한 <ph name="TOTAL_USAGE" />의 데이터가 삭제됩니다.</translation> @@ -6631,6 +6649,7 @@ <translation id="6811034713472274749">페이지를 볼 수 있음</translation> <translation id="6811151703183939603">민감도 가장 높음</translation> <translation id="6811332638216701903">DHCP 호스트 이름</translation> +<translation id="6811792477922751991">런처 키를 사용하여 기능 키 동작 변경</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" />은(는) 루트로 실행할 수 없습니다.</translation> <translation id="6812841287760418429">변경사항 유지</translation> <translation id="6813907279658683733">전체 화면</translation> @@ -7824,6 +7843,7 @@ <translation id="7851720427268294554">IPP 파서</translation> <translation id="78526636422538552">Google 계정 추가가 사용 중지되었습니다.</translation> <translation id="7853747251428735">도구 더보기(&L)</translation> +<translation id="7853999103056713222">더 안전한 비밀번호 사용</translation> <translation id="7855678561139483478">탭을 새 창으로 이동</translation> <translation id="7857004848504343806">컴퓨터에 보안 모듈이 있습니다. 이 모듈은 ChromeOS Flex에서 여러 중요한 보안 기능을 구현하는 데 사용됩니다. 자세히 알아보려면 Chromebook 고객센터의 다음 페이지를 방문하세요. https://support.google.com/chromebook/?p=sm</translation> @@ -8380,6 +8400,7 @@ <translation id="8325413836429495820">클립보드 확인이 허용되지 않음</translation> <translation id="8326478304147373412">PKCS #7, 인증서 체인</translation> <translation id="8327386430364625757">산술 글꼴</translation> +<translation id="8327538105740918488">이 비밀번호는 나중에 언제든지 변경할 수 있습니다. 비밀번호는 <ph name="EMAIL" />의 <ph name="GOOGLE_PASSWORD_MANAGER" />에 저장됩니다.</translation> <translation id="8327676037044516220">권한 및 콘텐츠 설정</translation> <translation id="8330617762701840933">대체 브라우저로 리디렉션되는 웹사이트의 목록입니다.</translation> <translation id="8330689128072902965">주변 연락처가 나와 파일을 공유할 수 있습니다. 변경하려면 클릭하세요.</translation> @@ -8525,6 +8546,7 @@ <translation id="8449836157089738489">새로운 탭 그룹에서 모두 열기</translation> <translation id="8451512073679317615">어시스턴트</translation> <translation id="845702320058262034">연결할 수 없습니다. 휴대전화의 블루투스가 켜져 있는지 확인하세요.</translation> +<translation id="8457251154056341970"><ph name="MODULE_NAME" />이(가) 이 페이지에 더 이상 표시되지 않습니다.</translation> <translation id="8457451314607652708">북마크 가져오기</translation> <translation id="8458341576712814616">바로가기</translation> <translation id="8458627787104127436">새 창에서 모두(<ph name="URL_COUNT" />개) 열기</translation> @@ -8597,6 +8619,7 @@ <translation id="8514955299594277296">사이트에서 기기에 데이터를 저장하도록 허용하지 않음(권장하지 않음)</translation> <translation id="8517759303731677493">수정…</translation> <translation id="8519895319663397036">비밀번호를 가져올 수 없습니다. 파일 크기가 150KB 미만이어야 합니다.</translation> +<translation id="851991974800416566">안전한 비밀번호를 빠르게 사용하기</translation> <translation id="8523493869875972733">변경사항 유지</translation> <translation id="8523849605371521713">정책에 의해 추가</translation> <translation id="8524783101666974011">Google 계정에 카드 추가</translation> @@ -8754,6 +8777,7 @@ <translation id="8665110742939124773">잘못된 액세스 코드를 입력했습니다. 다시 시도해 주세요.</translation> <translation id="8665180165765946056">백업 완료</translation> <translation id="866611985033792019">이메일 사용자를 식별하기 위해 이 인증서 신뢰</translation> +<translation id="8666268818656583275">이제 F 키가 시스템 맨 위 키처럼 동작합니다.</translation> <translation id="8666321716757704924"><ph name="WEBSITE" />에 대한 권한이 다시 허용됨</translation> <translation id="8666759526542103597">브라우저 기반 광고 개인 최적화 알아보기</translation> <translation id="8667261224612332309">개선할 수 있는 비밀번호가 있습니다</translation> @@ -9436,6 +9460,7 @@ <translation id="950307215746360464">설정 가이드</translation> <translation id="951991426597076286">거부</translation> <translation id="952471655966876828">기기가 켜져 있고 사용 중일 때 자동으로 연결됩니다.</translation> +<translation id="952880932803612259">앱, 웹사이트, 시스템 서비스에서 내 위치를 사용하도록 허용합니다. 기기의 위치를 추정하는 데 Wi-Fi, 모바일 네트워크, 센서 등의 데이터가 사용될 수 있습니다.</translation> <translation id="953434574221655299">현재 기기를 사용 중인지 알 수 있음</translation> <translation id="956500788634395331">잠재적으로 위험한 확장 프로그램으로부터 사용자를 보호합니다.</translation> <translation id="957179356621191750">6점</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 066f302..6467c8e 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Өтмөктөрдү оңго карай жабуу</translation> <translation id="1166583374608765787">Аталышка киргизилген өзгөртүүнү карап көрүү</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> төмөнкүгө таандык: <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Жаңы сырсөздү колдонуп көрүңүз</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> кийин ачылат…</translation> <translation id="116896278675803795">Тандалган контентке дал келтирүү үчүн тилди автоматтык түрдө өзгөртүү</translation> <translation id="1169266963600477608">Оюндун башкаруу элементтери</translation> @@ -918,6 +919,7 @@ <translation id="177336675152937177">Хост колдонмосунун дайындары</translation> <translation id="1776712937009046120">Колдонуучу кошуу</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Функция баскычтарынын жана системанын жогорку саптагы баскычтарынын арасында которулуу үчүн издөө баскычын басып туруңуз</translation> <translation id="1778457539567749232">Окула элек деп белгилөө</translation> <translation id="1778991607452011493">Мүчүлүштүктөрдү аныктоо таржымалын жөнөтүү (сунушталат)</translation> <translation id="1779441632304440041">Начар сырсөздөрдү билип алуу оңой. Татаал сырсөздөрдү түзүңүз.</translation> @@ -1360,6 +1362,7 @@ <translation id="2142582065325732898">Акыркы ачылган Chrome өтмөктөрүн көрүү үчүн <ph name="LINK1_BEGIN" />Chrome шайкештирүүнү<ph name="LINK1_END" /> күйгүзүңүз. <ph name="LINK2_BEGIN" />Кеңири маалымат<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Толук экранда куралдар тилкеси ар дайым көрүнсүн</translation> <translation id="2143778271340628265">Проксини кол менен конфигурациялоо</translation> +<translation id="2143808295261240440">Сунушталган сырсөздү колдонуңуз</translation> <translation id="2143915448548023856">Дисплей параметрлери</translation> <translation id="2144536955299248197">Тастыктамага көз чаптыргыч: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android колдонмосун иштеп чыгуу</translation> @@ -2348,6 +2351,7 @@ <translation id="2963151496262057773">Төмөнкү плагин жооп бербей жатат: <ph name="PLUGIN_NAME" />Аны токтотосузбу?</translation> <translation id="2964193600955408481">Wi-Fi'ды өчүрүү</translation> <translation id="2964245677645334031">Nearby Share функциясынын көрүнүү параметрлери</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> кыстарма папкасынын башка параметрлери</translation> <translation id="2966937470348689686">Android жеке параметрлерин башкаруу</translation> <translation id="2967926928600500959">Бул эрежелерге туура келген URL'дер белгилүү бир серепчиде мажбурланып ачылат.</translation> <translation id="2972581237482394796">&Кайталоо</translation> @@ -2637,6 +2641,7 @@ <translation id="3244294424315804309">Үнүн басууну улантуу</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Тармактагы ката</translation> <translation id="3248902735035392926">Коопсуздук маанилүү. Бир аз убакыт бөлүп, <ph name="BEGIN_LINK" />кеңейтүүлөрдү текшериңиз<ph name="END_LINK" />.</translation> +<translation id="3249323165366527554"><ph name="EMAIL" /> аккаунту үчүн сырсөзүңүз <ph name="GOOGLE_PASSWORD_MANAGER" /> кызматына автоматтык түрдө сакталганда, кызматтарга тезирээк катталып, тезирээк киресиз.</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" /> балаңызга Google Жардамчысына “Окей, Google” буйругу менен кайрылууга уруксат бериңиз</translation> <translation id="3251759466064201842"><Тастыктаманын бөлүгү эмес></translation> <translation id="325238099842880997">Балдарга ойноо, изилдөө жана мектеп программасын үйдөн окууга жардам берүү үчүн санариптик баштапкы эрежелерди жөндөңүз</translation> @@ -4132,6 +4137,7 @@ <translation id="4556194354084985730">Сырсөз сакталган колдонмолор менен сайттарга оңой киресиз. Өчүрүлсө, кирүүдөн мурда сырсөз суралат.</translation> <translation id="4558426062282641716">Авто-ишке киргизүүгө уруксат суралды</translation> <translation id="4559617833001311418">Бул сайт кыймыл же жарык сенсорлорун колдонуп жатат.</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> кыстармасынын кошумча параметрлери</translation> <translation id="4561893854334016293">Акыркы убакта уруксаттар өзгөргөн жок</translation> <translation id="4562155214028662640">Манжа изин кошуу</translation> <translation id="4563210852471260509">Баштапкы киргизүү тили – кытайча</translation> @@ -4415,6 +4421,7 @@ <translation id="4819323978093861656">{0,plural, =0{Серепчи азыр жабылат.}=1{Серепчи 1 секунддан кийин жабылат}other{Серепчи # секунддан кийин жабылат}}</translation> <translation id="4819607494758673676">Google Жардамчынын билдирмелери</translation> <translation id="4820236583224459650">Жигердүү билет катары коюу</translation> +<translation id="4820795723433418303">Функция баскычтарын жогорку саптагы баскычтар катары колдонуу</translation> <translation id="4821935166599369261">&Профилдөө иштетилди</translation> <translation id="4823484602432206655">Колдонуучунун жана түзмөктүн параметрлерин окуп, өзгөртүү</translation> <translation id="4824037980212326045">Linux'тун камдык көчүрмөсүн сактоо жана калыбына келтирүү</translation> @@ -4546,6 +4553,7 @@ <translation id="4925320384394644410">Оюкчалар ушул жерде көрүнөт</translation> <translation id="49265687513387605">Экрандагы нерселер тышкы экранга чыгарылбай жатат. Экранды бөлүшүү мүмкүнчүлүгү ырасталышы керек.</translation> <translation id="4927753642311223124">Бул жерде көрө тургандай эч нерсе жок, ары өтүңүз.</translation> +<translation id="4928629450964837566">Коопсуз сырсөздү колдонуңуз</translation> <translation id="4929386379796360314">Басып чыгара турган принтер</translation> <translation id="4930447554870711875">Иштеп чыгуучулар</translation> <translation id="4930714375720679147">Күйгүзүү</translation> @@ -4628,6 +4636,7 @@ <translation id="5010886807652684893">Визуалдык көрүнүш</translation> <translation id="5015344424288992913">Прокси чечилүүдө…</translation> <translation id="5016491575926936899">Компьютериңизден SMS жөнөтүп, Интернет байланышыңызды бөлүшүп, маек билдирмелерине жооп берип, <ph name="DEVICE_TYPE" /> түзмөгүңүздүн кулпусун телефонуңуз менен ача аласыз.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Жаңы сырсөздү колдонуп көрүңүз</translation> <translation id="5017643436812738274">Барактарды текст курсору менен көрө аласыз. Өчүрүү үчүн Ctrl+Search+7 баскычтарын басыңыз.</translation> <translation id="5018207570537526145">Кеңейтүү вебсайтын ачуу</translation> <translation id="5018526990965779848">Колдонуу жана мүчүлүштүктөрдү аныктоо маалыматын жөнөтүү. Google'га мүчүлүштүктөрдү аныктоо жана түзмөк менен колдонмолорду пайдалануу маалыматын автоматтык түрдө жөнөтүп, Android'де иштөө тажрыйбаңызды жакшыртууга жардам бериңиз. Бул маалымат тутум менен колдонмонун кыйла туруктуу иштешин камсыз кылууга жана башка нерселерди жакшыртууга көмөктөшөт. Айрым маалыматтар тобу Google колдонмолоруна жана Android'дин иштеп чыгуучулары сыяктуу өнөктөштөрүнө да жардам берет. Эгер кошумча Колдонмолор жана Интернеттеги аракеттериңиздин таржымалынын параметрлери күйгүзүлгөн болсо, бул маалымат Google аккаунтуңузга сакталышы мүмкүн.</translation> @@ -4696,6 +4705,7 @@ <translation id="5078638979202084724">Бардык өтмөктөрдү кыстарып коюу</translation> <translation id="5078796286268621944">Туура эмес PIN</translation> <translation id="5079010647467150187">Камтылган VPN'ди кошуу...</translation> +<translation id="5079699784114005398">Күйгүзүлгөндөн кийин Google аккаунтуңуз менен кирсеңиз, колдонмолоруңуз бардык ChromeOS түзмөктөрүндө жеткиликтүү болот. Chrome серепчисинен орнотулган веб колдонмолор серепчини шайкештирүү өчүк болсо да шайкештирилет.</translation> <translation id="508059534790499809">Kerberos билетин жаңыртуу</translation> <translation id="5081960376148623587">Барактарды алдын ала жүктөө керектигин тандаңыз</translation> <translation id="5084328598860513926">Шайкештирүү үзгүлтүккө учурады. Кайталап көрүңүз, болбосо, түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation> @@ -4771,6 +4781,7 @@ <translation id="5145464978649806571">Эгер түзмөгүңүздүн жанында болбосоңуз, экраны автоматтык түрдө кулпуланат. Түзмөктүн маңдайында турганыңызда экраны көпкө чейин өчпөйт. Эгер кулпу экраны өчүрүлгөн болсо, түзмөгүңүз кулпулангандын ордуна уйку режимине өтөт.</translation> <translation id="514575469079499857">Жайгашкан жерди аныктоо үчүн IP дарегиңизди колдонуңуз (демейки)</translation> <translation id="5146896637028965135">Системанын үнү</translation> +<translation id="5147992672778369947">Сунушталган сырсөздү колдонуңуз</translation> <translation id="5148277445782867161">Google'дун жайгашкан жерди аныктоо кызматы түзмөктүн жайгашкан жерин болжолдоп билүү үчүн Wi‑Fi, мобилдик тармактар жана сенсорлор сыяктуу булактарды колдонот.</translation> <translation id="5150254825601720210">Netscape Тастыктама SSL сервер аталышы</translation> <translation id="5151354047782775295">Дисктен орун бошотуңуз же автоматтык түрдө жок кылына турган дайындарды тандаңыз</translation> @@ -5057,6 +5068,7 @@ <translation id="5414566801737831689">Каралган вебсайттардын сүрөтчөлөрүн окуңуз</translation> <translation id="5414836363063783498">Текшерилүүдө…</translation> <translation id="5417312524372586921">Серепчинин темалары</translation> +<translation id="5417353542809767994">Ишенимдүү сырсөздү тез колдонуңуз</translation> <translation id="541737483547792035">Экранды чоңойтуу</translation> <translation id="5419405654816502573">Voice match</translation> <translation id="5420274697768050645">Кошумча коопсуздук максатында түзмөктү ачуу үчүн сырсөздү талап кылуу</translation> @@ -5177,6 +5189,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android телефону менен тууралоо</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Бул аккаунттун коопсуздугун ишенимдүү сырсөз менен жогорулатыңыз. Ал <ph name="EMAIL" /> аккаунту үчүн <ph name="GOOGLE_PASSWORD_MANAGER" /> кызматына сакталат.</translation> <translation id="5521078259930077036">Бул сиз күтүп жаткан башкы бетпи?</translation> <translation id="5522156646677899028">Бул кеңейтүүдө коопсуздукту бузган олуттуу көйгөй бар.</translation> <translation id="5522403133543437426">Дарек тилкесинде колдонулган издөө каражаты.</translation> @@ -5795,6 +5808,7 @@ <translation id="6070311415473175157">Издөө үчүн сүрөт аймагын тандаңыз</translation> <translation id="6071181508177083058">сырсөздү ырастоо</translation> <translation id="6071576563962215370">Система түзмөктү орнотуу убагында анын атрибуттарын кулпулай албай койду.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> эстутум үнөмдөлдү</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> колдонмосун бул түзмөктө пайдаланууга болбойт. Администраторуңуз менен байланышыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Жаздырууну токтотуу</translation> <translation id="6073903501322152803">Атайын мүмкүнчүлүктөрдү кошуу</translation> @@ -5842,6 +5856,7 @@ <translation id="6104068876731806426">Google аккаунттары</translation> <translation id="6104311680260824317">Түзмөк доменге кошулбай койду. Сервер Kerberos шифрлөөсүнүн мындай түрлөрүн колдоого албайт. Шифрлөөнүн параметрлерин көрүү үчүн "Кошумча параметрлер" бөлүмүн караңыз.</translation> <translation id="6104796831253957966">Принтерге кезек толуп калды</translation> +<translation id="6104929924898022309">Функция баскычтарынын аракетин өзгөртүү үчүн издөө баскычын колдонуңуз</translation> <translation id="6106167152849320869">Мурунку кадамда мүчүлүштүктөрдү аныктоо маалыматын жана колдонуу статистикасын жөнөтүүнү тандасаңыз, бул дайын-даректер орнотулган колдонмолор үчүн чогултулат.</translation> <translation id="6111972606040028426">Google Жардамчыны иштетүү</translation> <translation id="6112294629795967147">Өлчөмүн өзгөртүү үчүн басуу</translation> @@ -5983,6 +5998,7 @@ <translation id="6234108445915742946">Chrome’дун Тейлөө шарттары 31-марттан кийин өзгөргөнү жатат</translation> <translation id="6234474535228214774">Орнотуу күтүүдө</translation> <translation id="6235208551686043831">Түзмөктүн камерасы күйгүзүлдү. eSIM-картанын QR кодун камеранын алдына коюңуз.</translation> +<translation id="6237297174664969437">Кайсы серептөө дайындарын шайкештирүү керек экенин Chrome параметрлеринен ар дайым тандай аласыз. <ph name="LINK_BEGIN" />Түзмөктүн параметрлеринен<ph name="LINK_END" /> Chrome серепчисинен орнотулган веб колдонмолорду шайкештирүүнү көзөмөлдөй аласыз. Google таржымалыңыздын негизинде Издөөнү жана башка кызматтарды жекелештириши мүмкүн.</translation> <translation id="6237474966939441970">Стилус менен эскертме жазуучу колдонмо</translation> <translation id="623755660902014047">Окуу режими</translation> <translation id="6238767809035845642">Текст башка түзмөктөн бөлүшүлдү</translation> @@ -6316,6 +6332,7 @@ <translation id="6537613839935722475">Аталышта тамгаларды, сандарды жана дефистерди (-) колдонууга болот</translation> <translation id="6538098297809675636">Код аныкталбай койду</translation> <translation id="653920215766444089">Көрсөтүүчү түзмөктү издөө</translation> +<translation id="6539674013849300372">Ишенимдүү сырсөз менен Интернетте коопсуздугуңузду камсыздаңыз. Ал <ph name="EMAIL" /> аккаунту үчүн <ph name="GOOGLE_PASSWORD_MANAGER" /> кызматына сакталат.</translation> <translation id="653983593749614101">Улантылууда…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Эскертүү:<ph name="END_BOLD" /> Дайындар топтолгондо иш тутуму бир кыйла жай иштеп калат, эмне кылыш керек экендигин так билсеңиз же сизден ошондой аракет суралганда гана иштетиңиз.</translation> <translation id="6541638731489116978">Бул сайттын кыймыл сенсорлорун колдонуу мүмкүнчүлүгү бөгөттөлгөн.</translation> @@ -6510,6 +6527,7 @@ <translation id="671226373742585927">Капталдагы тилкени жабуу үчүн "X" баскычын басыңыз</translation> <translation id="6712943853047024245"><ph name="WEBSITE" /> үчүн ушул колдонуучунун аты менен сырсөздү сактап койгонсуз</translation> <translation id="6713233729292711163">Жумуш профилин кошуу</translation> +<translation id="6713441551032149301">Функция баскычтарынын жана системанын жогорку саптагы баскычтарынын арасында которулуу үчүн жүргүзгүч баскычын басып туруңуз</translation> <translation id="6713668088933662563">Бул тилдерди которуу эч качан сунушталбасын</translation> <translation id="6715803357256707211">Linux колдонмосун орнотуу учурунда ката кетти. Чоо-жайын билгиңиз келсе, билдирмени чыкылдатыңыз.</translation> <translation id="671619610707606484">Ушуну менен сайттар ээлеп турган <ph name="TOTAL_USAGE" /> орун бошотулат</translation> @@ -6631,6 +6649,7 @@ <translation id="6811034713472274749">Барак карап чыгууга даяр</translation> <translation id="6811151703183939603">Катуу</translation> <translation id="6811332638216701903">DHCP түйүнүнүн аталышы</translation> +<translation id="6811792477922751991">Функция баскычтарынын аракетин өзгөртүү үчүн жүргүзгүч баскычын колдонуңуз</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> өзөктүк серепчи катары иштей албайт.</translation> <translation id="6812841287760418429">Өзгөрүүлөрдү сактоо</translation> <translation id="6813907279658683733">Бүтүндөй экран</translation> @@ -7825,6 +7844,7 @@ <translation id="7851720427268294554">IPP талдоочу</translation> <translation id="78526636422538552">Кошумча Google аккаунттарын кошуу өчүрүлгөн</translation> <translation id="7853747251428735">Көбүрөөк кура&лдар</translation> +<translation id="7853999103056713222">Коопсуз сырсөздү колдонуңуз</translation> <translation id="7855678561139483478">Өтмөктү жаңы терезеге жылдыруу</translation> <translation id="7857004848504343806">Компьютериңизде коопсуз модуль камтылган. Ал ChromeOS Flex тутумундагы көптөгөн олуттуу коопсуздук функцияларын аткаруу үчүн колдонулат. Кененирээк маалымат алуу үчүн, Chromebook Жардам борборуна өтүңүз: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Текст сунуштары</translation> @@ -8379,6 +8399,7 @@ <translation id="8325413836429495820">Алмашуу буфериңизди көрө албайт</translation> <translation id="8326478304147373412">PKCS #7, тастыктама чынжыры</translation> <translation id="8327386430364625757">Математикалык арип</translation> +<translation id="8327538105740918488">Бул сырсөздү кийин каалаган убакта өзгөртүп алсаңыз болот. Ал <ph name="EMAIL" /> аккаунту үчүн <ph name="GOOGLE_PASSWORD_MANAGER" /> кызматына сакталат.</translation> <translation id="8327676037044516220">Уруксаттар жана мазмун параметрлери</translation> <translation id="8330617762701840933">Кошумча серепчиге багыттаган вебсайттардын тизмеси.</translation> <translation id="8330689128072902965">Жакын жердеги байланыштар файлдарын бөлүшө алышат. Өзгөртүү үчүн чыкылдатыңыз.</translation> @@ -8524,6 +8545,7 @@ <translation id="8449836157089738489">Баарын жаңы өтмөктөр тобунда ачуу</translation> <translation id="8451512073679317615">жардамчы</translation> <translation id="845702320058262034">Телефонго туташуу мүмкүн болбой жатат. Bluetooth күйүп турабы?</translation> +<translation id="8457251154056341970">Бул бетте <ph name="MODULE_NAME" /> көрсөтүлбөй калат</translation> <translation id="8457451314607652708">Кыстармаларды импорттоо</translation> <translation id="8458341576712814616">Ыкчам баскыч</translation> <translation id="8458627787104127436">Баарын (<ph name="URL_COUNT" />) жаңы терезеде ачуу</translation> @@ -8596,6 +8618,7 @@ <translation id="8514955299594277296">Сайттарга түзмөккө маалыматтарды сактоого уруксат берилбесин (сунушталбайт)</translation> <translation id="8517759303731677493">Түзөтүү…</translation> <translation id="8519895319663397036">Сырсөздөр өткөрүлүп алынган жок. Файлдын өлчөмү 150 Кб чейин болушу керек.</translation> +<translation id="851991974800416566">Ишенимдүү сырсөздү тез колдонуңуз</translation> <translation id="8523493869875972733">Өзгөрүүлөр сакталсын</translation> <translation id="8523849605371521713">Ишкана саясаты тарабынан кошулду</translation> <translation id="8524783101666974011">Карталарды Google аккаунтуңузга сактап коюңуз</translation> @@ -8753,6 +8776,7 @@ <translation id="8665110742939124773">Туура эмес кирүү кодун киргиздиңиз. Кайталаңыз.</translation> <translation id="8665180165765946056">Баары жүктөлдү</translation> <translation id="866611985033792019">Электрондук почта колдонуучуларын аныктай турган бул тастыктамага ишенүү</translation> +<translation id="8666268818656583275">Эми функция баскычтары системанын жогорку саптагы баскычтары сыяктуу иштейт</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> сайтына уруксаттар кайра берилди</translation> <translation id="8666759526542103597">Серепчиге негизделген жарнаманы жекелештирүү жөнүндө</translation> <translation id="8667261224612332309">Айрым сырсөздөрүңүз начар</translation> @@ -9435,6 +9459,7 @@ <translation id="950307215746360464">Жөндөө жетеги</translation> <translation id="951991426597076286">Четке кагуу</translation> <translation id="952471655966876828">Күйүп жана колдонулуп жатканда түзмөк автоматтык түрдө туташат</translation> +<translation id="952880932803612259">Колдонмолорго, вебсайттарга жана тутум кызматтарына турган жериңизди колдонууга уруксат бериңиз. Түзмөктүн жайгашкан жери Wi‑Fi, мобилдик тармактар жана сенсорлор аркылуу аныкталат.</translation> <translation id="953434574221655299">Түзмөктү активдүү колдонуп жатканыңыз тууралуу маалыматты алууга уруксат берилген</translation> <translation id="956500788634395331">Мүмкүн болгон кооптуу кеңейтүүлөрдөн корголуп турасыз</translation> <translation id="957179356621191750">6 чекиттүү</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index ac1f766e..7b321f481 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Uždaryti dešinėje esančius skirtukus</translation> <translation id="1166583374608765787">Peržiūrėkite atnaujintą pavadinimą</translation> <translation id="1166596238782048887">„<ph name="TAB_TITLE" />“ priklauso to darbalaukiui „<ph name="DESK_TITLE" />“</translation> +<translation id="1167262726334064738">Išbandykite naują slaptažodį</translation> <translation id="1168020859489941584">Atidaroma po <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Automatiškai keisti kalbą, kad atitiktų pasirinktą turinį</translation> <translation id="1169266963600477608">Žaidimų valdikliai</translation> @@ -921,6 +922,7 @@ <translation id="177336675152937177">Priglobti programų duomenys</translation> <translation id="1776712937009046120">Pridėti naudotoją</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Palaikykite paieškos klavišą, kad perjungtumėte funkcijų klavišus ir sistemos viršutinės eilutės klavišus</translation> <translation id="1778457539567749232">Pažymėti kaip neskaitytą</translation> <translation id="1778991607452011493">Siųsti derinimo žurnalus (rekomenduojama)</translation> <translation id="1779441632304440041">Nesudėtingus slaptažodžius lengva atspėti. Įsitikinkite, kad kuriate sudėtingus slaptažodžius.</translation> @@ -1363,6 +1365,7 @@ <translation id="2142582065325732898">Įjunkite <ph name="LINK1_BEGIN" />„Chrome“ sinchronizavimo funkciją<ph name="LINK1_END" />, kad peržiūrėtumėte pastaruosius „Chrome“ skirtukus. <ph name="LINK2_BEGIN" />Sužinokite daugiau<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Visada rodyti įrankių juostą viso ekrano režimu</translation> <translation id="2143778271340628265">Rankinė tarpinio serverio konfigūracija</translation> +<translation id="2143808295261240440">Naudokite rekomenduojamą slaptažodį</translation> <translation id="2143915448548023856">Pateikties nustatymai</translation> <translation id="2144536955299248197">Sertifikato skaitytojas (-a): „<ph name="CERTIFICATE_NAME" />“</translation> <translation id="2144557304298909478">„Android“ programų kūrimas „Linux“</translation> @@ -2351,6 +2354,7 @@ <translation id="2963151496262057773">Šis papildinys neatsako: „<ph name="PLUGIN_NAME" />“ Ar norite jį sustabdyti?</translation> <translation id="2964193600955408481">Neleisti „Wi-Fi“</translation> <translation id="2964245677645334031">Bendrinimo netoliese matomumas</translation> +<translation id="2966705348606485669">Daugiau žymių aplanko „<ph name="FOLDER_TITLE" />“ parinkčių</translation> <translation id="2966937470348689686">Tvarkyti „Android“ nuostatas</translation> <translation id="2967926928600500959">Šias taisykles atitnkantys URL bus priverstinai atidaromi konkrečioje naršyklėje.</translation> <translation id="2972581237482394796">&Atlikti iš naujo</translation> @@ -2640,6 +2644,7 @@ <translation id="3244294424315804309">Tęsti nutildžius garsą</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – tinklo klaida</translation> <translation id="3248902735035392926">Sauga yra svarbu. Skirkite šiek tiek laiko ir <ph name="BEGIN_LINK" />patikrinkite plėtinius<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Sparčiau prisiregistruokite ir prisijunkite <ph name="GOOGLE_PASSWORD_MANAGER" /> automatiškai išsaugant slaptažodį kaip priskirtą el. pašto adresui <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Leidimas <ph name="SUPERVISED_USER_NAME" /> pasiekti „Google“ padėjėją ištarus „Ok Google“</translation> <translation id="3251759466064201842"><Ne sertifikato dalis></translation> <translation id="325238099842880997">Nustatykite skaitmenines taisykles, kad padėtumėte vaikui žaisti, naršyti ir mokytis namuose</translation> @@ -4135,6 +4140,7 @@ <translation id="4556194354084985730">Lengvai prisijunkite prie svetainių ir programų naudodami išsaugotus slaptažodžius. Kai tai bus išjungta, prieš prisijungiant slaptažodžių bus prašoma.</translation> <translation id="4558426062282641716">Pateikta užklausa dėl leidimo automatiškai paleisti</translation> <translation id="4559617833001311418">Ši svetainė pasiekia judesio ir šviesos jutiklius.</translation> +<translation id="4560728518401799797">Daugiau žymių aplanko „<ph name="FOLDER_TITLE" />“ parinkčių</translation> <translation id="4561893854334016293">Nėra jokių neseniai pakeistų leidimų</translation> <translation id="4562155214028662640">Pridėti piršto antspaudą</translation> <translation id="4563210852471260509">Pagrindinė įvesties kalba – kinų k.</translation> @@ -4418,6 +4424,7 @@ <translation id="4819323978093861656">{0,plural, =0{Uždaroma dabar.}=1{Bus uždaryta po: vienos sekundės}one{Bus uždaryta po: # sekundės}few{Bus uždaryta po: # sekundžių}many{Bus uždaryta po: # sekundės}other{Bus uždaryta po: # sekundžių}}</translation> <translation id="4819607494758673676">„Google“ padėjėjo pranešimai</translation> <translation id="4820236583224459650">Nustatyti kaip aktyvų bilietą</translation> +<translation id="4820795723433418303">Naudoti funkcijų klavišus kaip viršutinės eilutės klavišus</translation> <translation id="4821935166599369261">&Profiliavimas įgalintas</translation> <translation id="4823484602432206655">Skaityti ir keisti naudotojo bei įrenginio nustatymus</translation> <translation id="4824037980212326045">„Linux“ atsarginės kopijos kūrimas ir atkūrimas</translation> @@ -4549,6 +4556,7 @@ <translation id="4925320384394644410">Čia bus rodomi jūsų prievadai</translation> <translation id="49265687513387605">Nepavyko perduoti ekrano vaizdo. Patikrinkite, ar patvirtinote raginimą pradėti bendrinti ekrano vaizdą.</translation> <translation id="4927753642311223124">Čia nieko nėra, slinkite toliau.</translation> +<translation id="4928629450964837566">Naudokite saugesnį slaptažodį</translation> <translation id="4929386379796360314">Spausdinimo vietos</translation> <translation id="4930447554870711875">Kūrėjai</translation> <translation id="4930714375720679147">Įjungti</translation> @@ -4631,6 +4639,7 @@ <translation id="5010886807652684893">Vizualinis rodinys</translation> <translation id="5015344424288992913">Ieškoma proxy...</translation> <translation id="5016491575926936899">Galite siųsti teksto pranešimą iš kompiuterio, bendrinti interneto ryšį, atsakyti į pokalbių pranešimus ir užrakinti „<ph name="DEVICE_TYPE" />“ telefonu.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Išbandykite naują slaptažodį</translation> <translation id="5017643436812738274">Puslapius galite naršyti naudodami teksto žymeklį. Paspauskite „Ctrl“ + paieškos klavišą + 7, kad išjungtumėte.</translation> <translation id="5018207570537526145">Atidaryti plėtinio svetainę</translation> <translation id="5018526990965779848">Siųskite naudojimo ir diagnostikos duomenis. Padėkite tobulinti „Android“ funkcijas automatiškai siųsdami „Google“ diagnostikos, įrenginio ir programų naudojimo duomenis. Tai padės pagerinti sistemos bei programos stabilumą ir teikti kitus patobulinimus. Kai kurie sukaupti duomenys taip pat bus naudingi „Google“ programoms ir partneriams, pvz., „Android“ kūrėjams. Jei papildomas Žiniatinklio ir programų veiklos nustatymas įjungtas, šie duomenys gali būti išsaugoti „Google“ paskyroje.</translation> @@ -4699,6 +4708,7 @@ <translation id="5078638979202084724">Žymėti visus skirtukus</translation> <translation id="5078796286268621944">Neteisingas PIN kodas</translation> <translation id="5079010647467150187">Pridėti įtaisytąjį VPN...</translation> +<translation id="5079699784114005398">Kai įjungta, programos bus pasiekiamos bet kuriuose „ChromeOS“ įrenginiuose, kai prisijungsite naudodami „Google“ paskyrą. Iš „Chrome“ naršyklės įdiegtos žiniatinklio programos bus sinchronizuojamos, net jei naršyklės sinchronizavimas išjungtas.</translation> <translation id="508059534790499809">Atnaujinti „Kerberos“ bilietą</translation> <translation id="5081960376148623587">Pasirinkite, ar norite iš anksto įkelti puslapius</translation> <translation id="5084328598860513926">Pertraukta aprūpinimo eiga. Bandykite dar kartą arba susisiekite su įrenginio savininku ar administratoriumi. Klaidos kodas: <ph name="ERROR_CODE" />.</translation> @@ -4774,6 +4784,7 @@ <translation id="5145464978649806571">Jei pasitrauksite nuo įrenginio, ekranas automatiškai užsirakins. Kai būsite priešais įrenginį, ekranas ilgiau neužsirakins. Išjungus užrakinimo ekraną bus įjungta įrenginio miego būsena, bet jis nebus užrakintas.</translation> <translation id="514575469079499857">Naudoti IP adresą vietovei nustatyti (numatytasis nustatymas)</translation> <translation id="5146896637028965135">Sistemos balsas</translation> +<translation id="5147992672778369947">Naudokite rekomenduojamą slaptažodį</translation> <translation id="5148277445782867161">„Google“ vietovės paslauga naudoja įvairius šaltinius, pvz., „Wi-Fi“, mobiliojo ryšio tinklus ir jutiklius, kad padėtų nustatyti įrenginio vietovę.</translation> <translation id="5150254825601720210">„Netscape“ sertifikato SSL serverio pavadinimas</translation> <translation id="5151354047782775295">Atlaisvinkite vietos diske arba pasirinkite duomenis, kuriuos galima automatiškai ištrinti</translation> @@ -5060,6 +5071,7 @@ <translation id="5414566801737831689">Skaityti lankomų svetainių piktogramas</translation> <translation id="5414836363063783498">Patvirtinama…</translation> <translation id="5417312524372586921">Naršyklės temos</translation> +<translation id="5417353542809767994">Sparčiai naudokite sudėtingą slaptažodį</translation> <translation id="541737483547792035">Ekrano didinimas</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Atrakinant įrenginį reikalauti slaptažodžio, kad būtų užtikrintas didesnis saugumas</translation> @@ -5180,6 +5192,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – „<ph name="NETWORK_DISPLAY_NAME" />“</translation> <translation id="5518949581554491184">Nustatyti naudojant „Android“ telefoną</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Apsaugokite šią paskyrą naudodami sudėtingą slaptažodį. Jį išsaugos <ph name="GOOGLE_PASSWORD_MANAGER" /> kaip priskirtą el. pašto adresui <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Ar tai pagrindinis puslapis, kurį tikėjotės išvysti?</translation> <translation id="5522156646677899028">Šiame plėtinyje aptiktas rimtas saugos pažeidžiamumas.</translation> <translation id="5522403133543437426">Adreso juostoje naudojamas paieškos variklis.</translation> @@ -5799,6 +5812,7 @@ <translation id="6070311415473175157">Pasirinkite norimą ieškoti vaizdo sritį</translation> <translation id="6071181508177083058">patvirtinkite slaptažodį</translation> <translation id="6071576563962215370">Sistemai vykdant įrenginio diegimo laiko atributų fiksavimą įvyko klaida.</translation> +<translation id="6071938745001252305">Sutaupyta atminties: <ph name="MEMORY_VALUE" /></translation> <translation id="6072442788591997866">Programa „<ph name="APP_NAME" />“ šiame įrenginyje neleidžiama. Susisiekite su administratoriumi. Klaidos kodas: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Sustabdyti įrašymą</translation> <translation id="6073903501322152803">Pridėti pritaikymo neįgaliesiems funkcijų</translation> @@ -5846,6 +5860,7 @@ <translation id="6104068876731806426">„Google“ paskyros</translation> <translation id="6104311680260824317">Nepavyko susieti įrenginio su domenu. Serveris nepalaiko nurodytų „Kerberos“ šifruotės tipų. Jei reikia šifruotės nustatymų, žr. „Daugiau parinkčių“.</translation> <translation id="6104796831253957966">Spausdintuvo eilė pilna</translation> +<translation id="6104929924898022309">Naudodami paieškos klavišą pakeiskite funkcijų klavišų veikimą</translation> <translation id="6106167152849320869">Jei atlikdami ankstesnį veiksmą taip pat pasirinkote siųsti diagnostikos ir naudojimo duomenis, bus renkami įdiegtų programų duomenys.</translation> <translation id="6111972606040028426">Įgalinti „Google“ padėjėją</translation> <translation id="6112294629795967147">Palieskite, kad pakeistumėte dydį</translation> @@ -5987,6 +6002,7 @@ <translation id="6234108445915742946">Kovo 31 d. bus pakeistos „Chrome“ paslaugų teikimo sąlygos</translation> <translation id="6234474535228214774">Laukiama, kol bus įdiegta</translation> <translation id="6235208551686043831">Įrenginio fotoaparatas įjungtas. Padėkite „eSIM“ kortelės QR kodą prieš fotoaparatą.</translation> +<translation id="6237297174664969437">„Chrome“ nustatymuose visada galite pasirinkti, kokius naršyklės duomenis sinchronizuoti. <ph name="LINK_BEGIN" />Įrenginio nustatymuose<ph name="LINK_END" /> galite valdyti žiniatinklio programų, įdiegtų iš „Chrome“ naršyklės, sinchronizavimą. „Google“ gali suasmeninti Paiešką ir kitas paslaugas pagal jūsų istoriją.</translation> <translation id="6237474966939441970">Užrašų rašymo rašikliu programa</translation> <translation id="623755660902014047">Skaitymo režimas</translation> <translation id="6238767809035845642">Tekstas, bendrinamas iš kito įrenginio</translation> @@ -6320,6 +6336,7 @@ <translation id="6537613839935722475">Pavadinimą gali sudaryti raidės, skaičiai ir brūkšneliai (-)</translation> <translation id="6538098297809675636">Bandant aptikti kodą įvyko klaida</translation> <translation id="653920215766444089">Ieškoma manipuliatoriaus</translation> +<translation id="6539674013849300372">Būkite saugesni prisijungę naudodami sudėtingą slaptažodį. Jį išsaugos <ph name="GOOGLE_PASSWORD_MANAGER" /> kaip priskirtą el. pašto adresui <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Tęsiama…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Pastaba:<ph name="END_BOLD" /> įgalinkite, tik jei žinote, ką darote, arba jei jūsų paprašė tai atlikti, nes renkant duomenis gali sumažėti našumas.</translation> <translation id="6541638731489116978">Ši svetainė užblokuota, kad nepasiektų judesio jutiklių.</translation> @@ -6520,6 +6537,7 @@ <translation id="671226373742585927">Spustelėkite mygtuką X, kad uždarytumėte šoninį skydelį</translation> <translation id="6712943853047024245">Jau išsaugojote <ph name="WEBSITE" /> slaptažodį su šiuo naudotojo vardu</translation> <translation id="6713233729292711163">Pridėti darbo profilį</translation> +<translation id="6713441551032149301">Palaikykite paleidimo priemonės klavišą, kad perjungtumėte funkcijų klavišus ir sistemos viršutinės eilutės klavišus</translation> <translation id="6713668088933662563">Niekada nesiūlyti versti šių kalbų</translation> <translation id="6715803357256707211">Įdiegiant „Linux“ programą įvyko klaida. Spustelėję pranešimą rasite išsamią informaciją.</translation> <translation id="671619610707606484">Bus išvalyta <ph name="TOTAL_USAGE" /> svetainių saugomų duomenų</translation> @@ -6641,6 +6659,7 @@ <translation id="6811034713472274749">Puslapis paruoštas peržiūrėti</translation> <translation id="6811151703183939603">Stiprus</translation> <translation id="6811332638216701903">DHCP prieglobos serverio pavadinimas</translation> +<translation id="6811792477922751991">Naudodami paleidimo priemonės klavišą pakeiskite funkcijų klavišų veikimą</translation> <translation id="6812349420832218321">„<ph name="PRODUCT_NAME" />“ negalima paleisti pagrindinio naudotojo vardu.</translation> <translation id="6812841287760418429">Palikti pakeitimus</translation> <translation id="6813907279658683733">Visas ekranas</translation> @@ -7835,6 +7854,7 @@ <translation id="7851720427268294554">IPP analizavimo įrankis</translation> <translation id="78526636422538552">Galimybė pridėti daugiau „Google“ paskyrų išjungta</translation> <translation id="7853747251428735">Daugiau įrank&ių</translation> +<translation id="7853999103056713222">Naudokite saugesnį slaptažodį</translation> <translation id="7855678561139483478">Skirtuko perkėlimas į naują langą</translation> <translation id="7857004848504343806">Jūsų kompiuteryje yra saugus modulis, kuris naudojamas „ChromeOS Flex“ įdiegiant daug svarbių saugos funkcijų. Jei norite sužinoti daugiau, apsilankykite „Chromebook“ pagalbos centre adresu https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Teksto pasiūlymai</translation> @@ -8390,6 +8410,7 @@ <translation id="8325413836429495820">Neleidžiama peržiūrėti iškarpinės</translation> <translation id="8326478304147373412">PKCS Nr. 7, sertifikato grandinė</translation> <translation id="8327386430364625757">Matematinis šriftas</translation> +<translation id="8327538105740918488">Vėliau bet kada galėsite pakeisti šį slaptažodį. Jį išsaugos <ph name="GOOGLE_PASSWORD_MANAGER" /> kaip priskirtą el. pašto adresui <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Leidimai ir turinio nustatymai</translation> <translation id="8330617762701840933">Svetainių, kurios peradresuoja į alternatyvią naršyklę, sąrašas.</translation> <translation id="8330689128072902965">Netoliese esantys kontaktai gali su jumis bendrinti. Spustelėkite ir pakeiskite.</translation> @@ -8535,6 +8556,7 @@ <translation id="8449836157089738489">Atidaryti viską naujoje skirtukų grupėje</translation> <translation id="8451512073679317615">Padėjėjas</translation> <translation id="845702320058262034">Nepavyko prisijungti. Patikrinkite, ar įjungtas telefono „Bluetooth“ ryšys.</translation> +<translation id="8457251154056341970">Daugiau nematysite <ph name="MODULE_NAME" /> šiame puslapyje</translation> <translation id="8457451314607652708">Importuoti žymes</translation> <translation id="8458341576712814616">Spartusis klavišas</translation> <translation id="8458627787104127436">Atidaryti viską (<ph name="URL_COUNT" />) naujame lange</translation> @@ -8607,6 +8629,7 @@ <translation id="8514955299594277296">Neleisti svetainėms išsaugoti duomenų įrenginyje (nerekomenduojama)</translation> <translation id="8517759303731677493">Redaguoti…</translation> <translation id="8519895319663397036">Nepavyko importuoti slaptažodžių. Failas turi būti mažesnis nei 150 KB.</translation> +<translation id="851991974800416566">Sparčiai naudokite sudėtingą slaptažodį</translation> <translation id="8523493869875972733">Palikti pakeitimus</translation> <translation id="8523849605371521713">Pridėta pagal politiką</translation> <translation id="8524783101666974011">Kortelių išsaugojimas „Google“ paskyroje</translation> @@ -8764,6 +8787,7 @@ <translation id="8665110742939124773">Įvedėte netinkamą prieigos kodą. Bandykite dar kartą.</translation> <translation id="8665180165765946056">Atsarginė kopija sukurta</translation> <translation id="866611985033792019">Pasitikėti šiuo sertifikatu nustatant el. pašto naudotojus</translation> +<translation id="8666268818656583275">Funkcijų klavišai dabar veiks kaip sistemos viršutinės eilutės klavišai</translation> <translation id="8666321716757704924">Svetainei <ph name="WEBSITE" /> vėl suteikti leidimai</translation> <translation id="8666759526542103597">Apie skelbimų suasmeninimą pagal naršyklę</translation> <translation id="8667261224612332309">Turite slaptažodžių, kuriuos galima patobulinti</translation> @@ -9449,6 +9473,7 @@ <translation id="950307215746360464">Sąrankos vadovas</translation> <translation id="951991426597076286">Atmesti</translation> <translation id="952471655966876828">Įrenginys bus automatiškai prijungtas, kai bus įjungtas ar naudojamas</translation> +<translation id="952880932803612259">Leiskite programoms, svetainėms ir sistemos paslaugoms naudoti jūsų vietovės informaciją. Vietovės paslauga gali naudoti įvairius šaltinius, pvz., „Wi-Fi“, mobiliojo ryšio tinklus ir jutiklius, kad nustatytų jūsų įrenginio vietovę.</translation> <translation id="953434574221655299">Leidžiama sužinoti, kada aktyviai naudojate įrenginį</translation> <translation id="956500788634395331">Esate apsaugoti nuo potencialiai žalingų plėtinių</translation> <translation id="957179356621191750">6 taškų</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index ed0598f..cd6830bb 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Tutup Tab di sebelah Kanan</translation> <translation id="1166583374608765787">Semak kemaskinian nama</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> milik meja <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Cuba kata laluan baharu</translation> <translation id="1168020859489941584">Dibuka dalam <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Tukar bahasa secara automatik untuk memadankan kandungan yang dipilih</translation> <translation id="1169266963600477608">Kawalan permainan</translation> @@ -918,6 +919,7 @@ <translation id="177336675152937177">Data apl yang dihoskan</translation> <translation id="1776712937009046120">Tambah pengguna</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Tahan kekunci carian untuk beralih antara kekunci fungsi dengan kekunci baris atas sistem</translation> <translation id="1778457539567749232">Tandai sebagai belum dibaca</translation> <translation id="1778991607452011493">Hantar log nyahpepijat (disyorkan)</translation> <translation id="1779441632304440041">Kata laluan yang lemah mudah diteka. Pastikan anda membuat kata laluan kukuh.</translation> @@ -1360,6 +1362,7 @@ <translation id="2142582065325732898">Hidupkan <ph name="LINK1_BEGIN" />Penyegerakan Chrome<ph name="LINK1_END" /> untuk melihat tab Chrome baru-baru ini. <ph name="LINK2_BEGIN" />Ketahui Lebih Lanjut<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Sentiasa Tunjukkan Bar Alat dalam Skrin Penuh</translation> <translation id="2143778271340628265">Konfigurasi proksi manual</translation> +<translation id="2143808295261240440">Gunakan Kata Laluan yang Disyorkan</translation> <translation id="2143915448548023856">Tetapan paparan</translation> <translation id="2144536955299248197">Pemapar Sijil: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Pembangunan apl Android Linux</translation> @@ -2348,6 +2351,7 @@ <translation id="2963151496262057773">Pemalam berikut tidak responsif: <ph name="PLUGIN_NAME" />Adakah anda ingin menghentikannya?</translation> <translation id="2964193600955408481">Lumpuhkan Wi-Fi</translation> <translation id="2964245677645334031">Keterlihatan Kongsi Berdekatan</translation> +<translation id="2966705348606485669">Lagi pilihan untuk folder penanda halaman <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Urus pilihan Android</translation> <translation id="2967926928600500959">URL yang sepadan dengan peraturan ini akan dipaksa untuk dibuka dalam penyemak imbas tertentu.</translation> <translation id="2972581237482394796">&Buat Semula</translation> @@ -2637,6 +2641,7 @@ <translation id="3244294424315804309">Teruskan meredam bunyi</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - Ralat rangkaian</translation> <translation id="3248902735035392926">Keselamatan adalah perkara penting. Luangkan masa dan <ph name="BEGIN_LINK" />semak sambungan anda<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Daftar dan log masuk dengan pantas apabila kata laluan anda disimpan secara automatik pada <ph name="GOOGLE_PASSWORD_MANAGER" /> untuk <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Benarkan <ph name="SUPERVISED_USER_NAME" /> mengakses Google Assistant dengan “Ok Google”</translation> <translation id="3251759466064201842"><Bukan Sebahagian Daripada Sijil></translation> <translation id="325238099842880997">Tetapkan peraturan asas digital untuk membantu kanak-kanak bermain, meneroka sesuatu dan membuat kerja sekolah di rumah</translation> @@ -4132,6 +4137,7 @@ <translation id="4556194354084985730">Log masuk ke laman dan apl dengan mudah menggunakan kata laluan anda yang disimpan. Apabila dimatikan, anda akan diminta untuk mengesahkan sebelum log masuk.</translation> <translation id="4558426062282641716">Kebenaran autolancar diminta</translation> <translation id="4559617833001311418">Tapak ini mengakses penderia gerakan atau cahaya anda.</translation> +<translation id="4560728518401799797">Lagi pilihan untuk penanda halaman <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Tiada kebenaran yang diubah baru-baru ini</translation> <translation id="4562155214028662640">Tambahkan Cap Jari</translation> <translation id="4563210852471260509">Bahasa input permulaan adalah bahasa Cina</translation> @@ -4415,6 +4421,7 @@ <translation id="4819323978093861656">{0,plural, =0{Menutup sekarang.}=1{Menutup dalam masa: 1 saat}other{Menutup dalam masa: # saat}}</translation> <translation id="4819607494758673676">Pemberitahuan Google Assistant</translation> <translation id="4820236583224459650">Tetapkan sebagai tiket aktif</translation> +<translation id="4820795723433418303">Gunakan kekunci fungsi sebagai kekunci baris atas</translation> <translation id="4821935166599369261">&Pemprofilan Didayakan</translation> <translation id="4823484602432206655">Baca dan tukar pengguna dan tetapan peranti</translation> <translation id="4824037980212326045">Sandaran dan pemulihan Linux</translation> @@ -4546,6 +4553,7 @@ <translation id="4925320384394644410">Port anda akan dipaparkan di sini</translation> <translation id="49265687513387605">Tidak dapat menghantar skrin. Semak untuk melihat sama ada anda telah mengesahkan gesaan untuk mula berkongsi skrin atau belum.</translation> <translation id="4927753642311223124">Tiada apa-apa untuk dilihat di sini, teruskan.</translation> +<translation id="4928629450964837566">Gunakan kata laluan yang lebih selamat</translation> <translation id="4929386379796360314">Destinasi Cetak</translation> <translation id="4930447554870711875">Pembangun</translation> <translation id="4930714375720679147">Hidupkan</translation> @@ -4628,6 +4636,7 @@ <translation id="5010886807652684893">Paparan visual</translation> <translation id="5015344424288992913">Menyelesaikan proksi...</translation> <translation id="5016491575926936899">Anda boleh menghantar mesej teks daripada komputer, berkongsi sambungan Internet, membalas pemberitahuan perbualan dan membuka kunci <ph name="DEVICE_TYPE" /> menggunakan telefon anda.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Cuba Kata Laluan Baharu</translation> <translation id="5017643436812738274">Anda boleh menukar halaman dengan kursor teks. Tekan Ctrl+Search+7 untuk mematikannya.</translation> <translation id="5018207570537526145">Buka laman web sambungan</translation> <translation id="5018526990965779848">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. Jika tetapan Aktiviti Web & Apl tambahan anda dihidupkan, data ini mungkin disimpan pada Akaun Google anda.</translation> @@ -4696,6 +4705,7 @@ <translation id="5078638979202084724">Tanda halaman semua tab</translation> <translation id="5078796286268621944">PIN salah</translation> <translation id="5079010647467150187">Tambah VPN terbina dalam...</translation> +<translation id="5079699784114005398">Setelah dihidupkan, apl anda akan tersedia pada mana-mana peranti ChromeOS apabila anda log masuk dengan Google Account anda. Apl web yang dipasang daripada penyemak imbas Chrome akan disegerakkan walaupun penyegerakkan penyemak imbas dimatikan.</translation> <translation id="508059534790499809">Muat semula tiket Kerberos</translation> <translation id="5081960376148623587">Pilih sama ada hendak mempramuatkan halaman</translation> <translation id="5084328598860513926">Aliran peruntukan terganggu. Sila cuba lagi atau hubungi pemilik atau pentadbir peranti anda. Kod ralat: <ph name="ERROR_CODE" />.</translation> @@ -4771,6 +4781,7 @@ <translation id="5145464978649806571">Jika anda menjauhi peranti anda, skrin anda akan dikunci secara automatik. Apabila anda berada di hadapan peranti, skrin anda akan tetap berjaga lebih lama. Jika skrin kunci dilumpuhkan, peranti anda akan tidur dan bukannya dikunci.</translation> <translation id="514575469079499857">Gunakan alamat IP anda untuk menentukan lokasi (lalai)</translation> <translation id="5146896637028965135">Suara sistem</translation> +<translation id="5147992672778369947">Gunakan kata laluan yang disyorkan</translation> <translation id="5148277445782867161">Perkhidmatan lokasi Google menggunakan sumber seperti Wi-Fi, rangkaian mudah alih dan penderia untuk menganggarkan lokasi peranti anda.</translation> <translation id="5150254825601720210">Nama Pelayan SSL Sijil Netscape</translation> <translation id="5151354047782775295">Kosongkan ruang cakera, jika tidak data terpilih akan dipadamkan secara automatik.</translation> @@ -5057,6 +5068,7 @@ <translation id="5414566801737831689">Baca ikon laman web yang anda lawati</translation> <translation id="5414836363063783498">Mengesahkan…</translation> <translation id="5417312524372586921">Tema penyemak imbas</translation> +<translation id="5417353542809767994">Gunakan kata laluan kukuh dengan segera</translation> <translation id="541737483547792035">Besarkan skrin</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Memerlukan kata laluan untuk membuka kunci peranti bagi keselamatan tambahan</translation> @@ -5177,6 +5189,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Sediakan dengan telefon Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Lindungi akaun ini dengan kata laluan kukuh. Kata laluan ini akan disimpan pada <ph name="GOOGLE_PASSWORD_MANAGER" /> untuk <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Adakah ini halaman utama yang anda jangkakan?</translation> <translation id="5522156646677899028">Sambungan ini mengandungi kelemahan keselamatan yang serius.</translation> <translation id="5522403133543437426">Enjin carian yang digunakan dalam bar alamat.</translation> @@ -5795,6 +5808,7 @@ <translation id="6070311415473175157">Pilih kawasan imej untuk mencari</translation> <translation id="6071181508177083058">sahkan kata laluan</translation> <translation id="6071576563962215370">Sistem gagal mewujudkan kunci atribut masa pemasangan peranti.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> memori dijimatkan</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> tidak dibenarkan pada peranti ini. Hubungi pentadbir anda. Kod ralat: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Hentikan rakaman</translation> <translation id="6073903501322152803">Tambahkan ciri kebolehaksesan</translation> @@ -5842,6 +5856,7 @@ <translation id="6104068876731806426">Akaun Google</translation> <translation id="6104311680260824317">Tidak dapat menghubungkan peranti ke domain. Pelayan tidak menyokong jenis penyulitan Kerberos yang dinyatakan. Semak "Lagi pilihan" untuk tetapan penyulitan.</translation> <translation id="6104796831253957966">Baris gilir pencetak sudah penuh</translation> +<translation id="6104929924898022309">Gunakan kekunci carian untuk mengubah gelagat kekunci fungsi</translation> <translation id="6106167152849320869">Jika anda memilih untuk menghantar data diagnostik dan penggunaan pada langkah terdahulu, data ini akan dikumpulkan untuk apl yang dipasang.</translation> <translation id="6111972606040028426">Dayakan Google Assistant</translation> <translation id="6112294629795967147">Sentuh untuk mengubah saiz</translation> @@ -5983,6 +5998,7 @@ <translation id="6234108445915742946">Syarat Perkhidmatan Chrome akan berubah pada 31 Mac</translation> <translation id="6234474535228214774">Pemasangan belum selesai</translation> <translation id="6235208551686043831">Kamera peranti telah dihidupkan. Sila letakkan Kod QR eSIM anda di hadapan kamera.</translation> +<translation id="6237297174664969437">Anda boleh memilih data penyemak imbas yang mahu disegerakkan dalam tetapan Chrome pada bila-bila masa. Dalam <ph name="LINK_BEGIN" />tetapan peranti<ph name="LINK_END" />, anda boleh mengawal penyegerakkan untuk apl web yang dipasang daripada penyemak imbas Chrome. Google mungkin memeribadikan Search dan perkhidmatan lain berdasarkan sejarah anda.</translation> <translation id="6237474966939441970">Apl pengambilan nota stilus</translation> <translation id="623755660902014047">Mod membaca</translation> <translation id="6238767809035845642">Teks yang dikongsi daripada Peranti Lain</translation> @@ -6316,6 +6332,7 @@ <translation id="6537613839935722475">Nama boleh menggunakan huruf, nombor dan tanda sempang (-)</translation> <translation id="6538098297809675636">Ralat berlaku semasa mengesan kod</translation> <translation id="653920215766444089">Mencari peranti penuding</translation> +<translation id="6539674013849300372">Kekal selamat dalam talian dengan kata laluan kukuh. Kata laluan ini akan disimpan pada <ph name="GOOGLE_PASSWORD_MANAGER" /> untuk <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Menyambung semula...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Perhatian:<ph name="END_BOLD" /> Dayakan hanya jika anda pasti akan perkara yang anda lakukan atau jika anda telah diminta melakukan sedemikian, kerana pengumpulan data boleh mengurangkan prestasi.</translation> <translation id="6541638731489116978">Tapak ini telah disekat daripada mengakses penderia gerakan anda.</translation> @@ -6510,6 +6527,7 @@ <translation id="671226373742585927">Klik butang "X" untuk menutup panel sisi</translation> <translation id="6712943853047024245">Anda telah menyimpan kata laluan dengan nama pengguna ini untuk <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Tambah Profil Kerja</translation> +<translation id="6713441551032149301">Tahan kekunci pelancar untuk beralih antara kekunci fungsi dengan kekunci baris atas sistem</translation> <translation id="6713668088933662563">Tidak sekali-kali menawarkan untuk menterjemahkan bahasa ini</translation> <translation id="6715803357256707211">Ralat telah berlaku semasa pemasangan aplikasi Linux anda. Klik pemberitahuan untuk mendapatkan butiran.</translation> <translation id="671619610707606484">Tindakan ini akan mengosongkan <ph name="TOTAL_USAGE" /> daripada data yang disimpan oleh tapak</translation> @@ -6631,6 +6649,7 @@ <translation id="6811034713472274749">Halaman sedia untuk dipaparkan</translation> <translation id="6811151703183939603">Ketat</translation> <translation id="6811332638216701903">Nama hos DHCP</translation> +<translation id="6811792477922751991">Gunakan kekunci pelancar untuk mengubah gelagat kekunci fungsi</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> tidak dapat dijalankan sebagai akar.</translation> <translation id="6812841287760418429">Simpan perubahan</translation> <translation id="6813907279658683733">Seluruh Skrin</translation> @@ -7825,6 +7844,7 @@ <translation id="7851720427268294554">Penghurai IPP</translation> <translation id="78526636422538552">Penambahan lebih banyak Akaun Google dilumpuhkan</translation> <translation id="7853747251428735">Lagi Al&atan</translation> +<translation id="7853999103056713222">Gunakan Kata Laluan yang Lebih Selamat</translation> <translation id="7855678561139483478">Alihkan tab ke tetingkap baharu</translation> <translation id="7857004848504343806">Komputer anda mengandungi modul selamat, yang digunakan untuk melaksanakan banyak ciri keselamatan penting dalam Chrome OS Flex. Lawati Pusat Bantuan Chromebook untuk mengetahui lebih lanjut: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Cadangan teks</translation> @@ -8380,6 +8400,7 @@ <translation id="8325413836429495820">Tidak dibenarkan untuk melihat papan keratan anda</translation> <translation id="8326478304147373412">PKCS #7, rantaian sijil</translation> <translation id="8327386430364625757">Fon matematik</translation> +<translation id="8327538105740918488">Anda boleh menukar kata laluan ini pada bila-bila masa. Kata laluan ini akan disimpan pada <ph name="GOOGLE_PASSWORD_MANAGER" /> untuk <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Kebenaran dan tetapan kandungan</translation> <translation id="8330617762701840933">Senarai laman web yang mengubah hala ke penyemak imbas alternatif.</translation> <translation id="8330689128072902965">Kenalan berdekatan boleh berkongsi dengan anda. Klik untuk menukar.</translation> @@ -8526,6 +8547,7 @@ <translation id="8449836157089738489">Buka semua dalam kumpulan tab baharu</translation> <translation id="8451512073679317615">assistant</translation> <translation id="845702320058262034">Tidak dapat bersambung. Pastikan Bluetooth telefon anda dihidupkan.</translation> +<translation id="8457251154056341970">Anda tidak akan melihat <ph name="MODULE_NAME" /> pada halaman ini lagi</translation> <translation id="8457451314607652708">Import penanda halaman</translation> <translation id="8458341576712814616">Pintasan</translation> <translation id="8458627787104127436">Buka semua (<ph name="URL_COUNT" />) dalam tetingkap baharu</translation> @@ -8598,6 +8620,7 @@ <translation id="8514955299594277296">Jangan benarkan laman menyimpan data pada peranti anda (tidak disyorkan)</translation> <translation id="8517759303731677493">Edit…</translation> <translation id="8519895319663397036">Tidak dapat mengimport kata laluan. Saiz fail hendaklah kurang daripada 150 KB.</translation> +<translation id="851991974800416566">Gunakan Kata Laluan Kukuh Dengan Segera</translation> <translation id="8523493869875972733">Simpan Perubahan</translation> <translation id="8523849605371521713">Ditambahkan oleh dasar</translation> <translation id="8524783101666974011">Simpan kad ke Akaun Google anda</translation> @@ -8755,6 +8778,7 @@ <translation id="8665110742939124773">Anda telah memasukkan kod akses yang salah. Cuba lagi.</translation> <translation id="8665180165765946056">Sandaran selesai</translation> <translation id="866611985033792019">Percayakan sijil ini untuk mengenal pasti pengguna e-mel</translation> +<translation id="8666268818656583275">Kini kekunci F memiliki gelagat sebagai kekunci baris atas sistem</translation> <translation id="8666321716757704924">Kebenaran dibenarkan sekali lagi untuk <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">Perihal pemeribadian iklan berasaskan penyemak imbas</translation> <translation id="8667261224612332309">Beberapa kata laluan anda boleh ditingkatkan</translation> @@ -9437,6 +9461,7 @@ <translation id="950307215746360464">Panduan persediaan</translation> <translation id="951991426597076286">Tolak</translation> <translation id="952471655966876828">Peranti akan menyambung secara automatik apabila dihidupkan atau digunakan</translation> +<translation id="952880932803612259">Benarkan apl, laman web dan perkhidmatan sistem menggunakan lokasi anda. Lokasi mungkin menggunakan sumber seperti Wi-Fi, rangkaian mudah alih dan penderia untuk menganggarkan lokasi peranti anda.</translation> <translation id="953434574221655299">Dibenarkan mengetahui waktu anda aktif menggunakan peranti</translation> <translation id="956500788634395331">Anda dilindungi daripada sambungan yang mungkin berbahaya</translation> <translation id="957179356621191750">6 titik</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 3b2b2e0a..b447e32 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">ညာဘက်ရှိ တဲဘ်များကို ပိတ်ရန်</translation> <translation id="1166583374608765787">အမည်အပ်ဒိတ် ပြန်စိစစ်ရန်</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> သည် <ph name="DESK_TITLE" /> မျက်နှာပြင်တွင် ပါဝင်သည်</translation> +<translation id="1167262726334064738">စကားဝှက်အသစ် စမ်းကြည့်နိုင်သည်</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> အကြာမှာ ဖွင့်ပေးမည်...</translation> <translation id="116896278675803795">ရွေးထားသောအကြောင်းအရာနှင့် ကိုက်ညီရန် ဘာသာစကားကို အလိုအလျောက်ပြောင်းနိုင်သည်</translation> <translation id="1169266963600477608">ဂိမ်းထိန်းချုပ်ခလုတ်များ</translation> @@ -917,6 +918,7 @@ <translation id="177336675152937177">ဟို့စ် လုပ်ခဲ့သည့် အက်ပ် ဒေတာ</translation> <translation id="1776712937009046120">အသုံးပြုသူ ပေါင်းထည့်ရန်</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">လုပ်ဆောင်ချက်ကီးများနှင့် ထိပ်ဆုံးအတန်းရှိ စနစ်ကီးများကြား ပြောင်းရန် ရှာရန်ခလုတ်ကို ဖိထားပါ</translation> <translation id="1778457539567749232">မဖတ်ရသေးဟု မှတ်သားရန်</translation> <translation id="1778991607452011493">အမှားရှာပြင်မှု မှတ်တမ်းများ ပို့ရန် (အကြံပြုထားသည်)</translation> <translation id="1779441632304440041">အားနည်းသည့် စကားဝှက်များကို အလွယ်တကူ ခန့်မှန်းနိုင်သည်။ လုံခြုံမှုမြင့်သည့် စကားဝှက်များကို သတ်မှတ်ပါ။</translation> @@ -1358,6 +1360,7 @@ <translation id="2142582065325732898">လတ်တလော Chrome တဘ်များကြည့်ရန် <ph name="LINK1_BEGIN" />Chrome စင့်ခ်<ph name="LINK1_END" /> ကို ဖွင့်ပါ။ <ph name="LINK2_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">မျက်နှာပြင်အပြည့်ဖွင့်ချိန်တွင် ကိရိယာဘားကို အမြဲပြပါ</translation> <translation id="2143778271340628265">လက်ဖြင့် ပရောက်စီ စီစဉ်ပေးခြင်း</translation> +<translation id="2143808295261240440">‘အကြံပြုထားသည့် စကားဝှက်’ သုံးနိုင်သည်</translation> <translation id="2143915448548023856">ပြကွက် ဆက်တင်များ</translation> <translation id="2144536955299248197">လက်မှတ် မြင်ကွင်း: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android အက်ပ် ရေးဆွဲမှု</translation> @@ -2346,6 +2349,7 @@ <translation id="2963151496262057773">ဖော်ပြပါ ပလတ်အင်သည် တုံ့ပြန်ခြင်း မရှိပါ- <ph name="PLUGIN_NAME" /> ၎င်းအား သင် ရပ်လိုပါသလား?</translation> <translation id="2964193600955408481">Wi-Fi ပိတ်</translation> <translation id="2964245677645334031">'အနီးတစ်ဝိုက် မျှဝေခြင်း' မြင်နိုင်မှု</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> လိပ်စာဖိုင်တွဲအတွက် နောက်ထပ်ရွေးစရာများ</translation> <translation id="2966937470348689686">Android စိတ်ကြိုက်ရွေးချယ်မှုများကို စီမံခန့်ခွဲရန်</translation> <translation id="2967926928600500959">ဤစည်းမျဉ်းများနှင့် ကိုက်ညီသော URL များကို သက်ဆိုင်ရာဘရောင်ဇာတွင် မဖြစ်မနေဖွင့်မည်။</translation> <translation id="2972581237482394796">&ပြန်လုပ်ရန်</translation> @@ -2635,6 +2639,7 @@ <translation id="3244294424315804309">အသံကို ဆက်လက်ပိတ်ထားရန်</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - ကွန်ရက်အမှားအယွင်း</translation> <translation id="3248902735035392926">လုံခြုံမှုက အရေးကြီးပါသည်။ အချိန်ခဏပေး၍ <ph name="BEGIN_LINK" />ယခုပင် သင်၏နောက်ဆက်တွဲများကို စစ်ဆေးပါ<ph name="END_LINK" /></translation> +<translation id="3249323165366527554"><ph name="EMAIL" /> အတွက် သင့်စကားဝှက်ကို <ph name="GOOGLE_PASSWORD_MANAGER" /> တွင် အလိုအလျောက်သိမ်းပါက ပိုမြန်စွာ စာရင်းသွင်းပြီး လက်မှတ်ထိုးဝင်နိုင်သည်။</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" /> အား “Ok Google” ဖြင့် Google Assistant ကို သုံးခွင့်ပေးပါ</translation> <translation id="3251759466064201842"><လက်မှတ် ထဲက အပိုင်း မဟုတ်ပါ></translation> <translation id="325238099842880997">သင့်ကလေးများ ကစားခြင်း၊ စူးစမ်းလေ့လာခြင်းနှင့် အိမ်တွင် ကျောင်းစာများလုပ်ခြင်းတို့တွင် ကူညီရန် အခြေခံဒစ်ဂျစ်တယ် စည်းမျဉ်းများ သတ်မှတ်ပါ</translation> @@ -4129,6 +4134,7 @@ <translation id="4556194354084985730">သိမ်းထားသည့် စကားဝှက်များဖြင့် ဝဘ်ဆိုက်နှင့် အက်ပ်များသို့ လွယ်ကူစွာ လက်မှတ်ထိုးဝင်နိုင်သည်။ ပိတ်ထားပါက လက်မှတ်မထိုးဝင်မီ သင့်ကိုမေးပါမည်။</translation> <translation id="4558426062282641716">အလိုအလျောက်-စတင် ခွင့် တောင်းခံခြင်း</translation> <translation id="4559617833001311418">ဤဝဘ်ဆိုက်သည် သင်၏လှုပ်ရှားမှု သို့မဟုတ် အလင်းရောင် အာရုံခံကိရိယာကို အသုံးပြုနေသည်။</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> လိပ်စာအတွက် နောက်ထပ်ရွေးစရာများ</translation> <translation id="4561893854334016293">မကြာသေးမီကပြောင်းထားသော ခွင့်ပြုချက်များ မရှိပါ</translation> <translation id="4562155214028662640">လက်ဗွေထည့်ရန်</translation> <translation id="4563210852471260509">အဦးဆုံးထည့်သွင်းရန် နည်းလမ်းမှာ တရုတ်ဖြစ်</translation> @@ -4412,6 +4418,7 @@ <translation id="4819323978093861656">{0,plural, =0{ယခု ပိတ်နေသည်။}=1{ပိတ်ပါတော့မည်- ၁ စက္ကန့်}other{ပိတ်ပါတော့မည်- # စက္ကန့်}}</translation> <translation id="4819607494758673676">Google Assistant အကြောင်းကြားချက်များ</translation> <translation id="4820236583224459650">လက်ရှိအသုံးပြုနေသည့် လက်မှတ်သတ်မှတ်ရန်</translation> +<translation id="4820795723433418303">လုပ်ဆောင်ချက်ကီးများကို ထိပ်ဆုံးအတန်းကီးများအဖြစ် သုံးရန်</translation> <translation id="4821935166599369261">&ပရိုဖိုင်ကြည့်မှု ဖွင့်ထား</translation> <translation id="4823484602432206655">သုံးစွဲသူနှင့် စက်ကိရိယာ ဆက်တင်များအား ဖတ်ပြီး ပြောင်းရန်</translation> <translation id="4824037980212326045">Linux အရန်ကူးခြင်းနှင့် ပြန်လည်ရယူခြင်း</translation> @@ -4543,6 +4550,7 @@ <translation id="4925320384394644410">သင့်ပို့တ်များကို ဤနေရာတွင် မြင်ရပါမည်</translation> <translation id="49265687513387605">ဖန်သားပြင်ကို ကာစ်လုပ်၍မရပါ။ သင့်ဖန်သားပြင် စတင်မျှဝေရန် မေးမြန်းမှုကို အတည်ပြုထားခြင်းရှိ၊ မရှိ စစ်ဆေးပါ။</translation> <translation id="4927753642311223124">ဒီမှာ ကြည့်စရာ ဘာမှ မရှိ၊ ဒီအတိုင်း ဆက်သွားရန်</translation> +<translation id="4928629450964837566">ပိုလုံခြုံသည့် စကားဝှက်ကို သုံးနိုင်သည်</translation> <translation id="4929386379796360314">ပရင့်ထုတ်ရန် နေရာများ</translation> <translation id="4930447554870711875">ဆော့ဖ်ဝဲအင်ဂျင်နီယာများ</translation> <translation id="4930714375720679147">ဖွင့်ရန်</translation> @@ -4625,6 +4633,7 @@ <translation id="5010886807652684893">ရုပ်မြင်ပြသခြင်း</translation> <translation id="5015344424288992913">ပရောက်စီ ဆုံးဖြတ်နေ...</translation> <translation id="5016491575926936899">သင်၏ဖုန်းဖြင့် ကွန်ပျူတာမှ စာတိုပို့ခြင်း၊ အင်တာနက်ချိတ်ဆက်မှု မျှဝေခြင်း၊ စကားဝိုင်းအကြောင်းကြားချက်များသို့ စာပြန်ခြင်းနှင့် သင့် <ph name="DEVICE_TYPE" /> ကို လော့ခ်ဖွင့်ခြင်းတို့ ပြုလုပ်နိုင်သည်။<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">‘စကားဝှက်အသစ်’ စမ်းကြည့်နိုင်သည်</translation> <translation id="5017643436812738274">စာရိုက်သည့်ပုံကာဆာဖြင့် စာမျက်နှာများကို ကြည့်ရှုနိုင်သည်။ ပိတ်ရန် Ctrl+Search+7 နှိပ်ပါ။</translation> <translation id="5018207570537526145">နောက်ဆက်တွဲ ဝဘ်ဆိုက် ဖွင့်ရန်</translation> <translation id="5018526990965779848">အသုံးပြုမှုနှင့် အမှားရှာဖွေမှုဒေတာ ပို့ပါ။ အမှားရှာဖွေမှု၊ စက်ပစ္စည်းနှင့်အက်ပ် အသုံးပြုမှုဒေတာများကို Google သို့ အလိုအလျောက်ပို့၍ Android အသုံးပြုမှု ပိုမိုကောင်းမွန်လာစေရန် ကူညီပါ။ ၎င်းက စနစ်နှင့် အက်ပ်တည်ငြိမ်မှု၊ အခြား တိုးတက်ပြင်ဆင်မှုများအတွက် ပံ့ပိုးပေးပါမည်။ စုစည်းထားသော ဒေတာအချို့က Google အက်ပ်နှင့် Android ဆော့ဖ်ဝဲအင်ဂျင်နီယာများကဲ့သို့ ပါတနာများကို ကူညီပေးပါမည်။ သင်၏ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သင့် Google အကောင့်သို့ သိမ်းသွားပါမည်။</translation> @@ -4693,6 +4702,7 @@ <translation id="5078638979202084724">တဲပ်များအားလုံး ဘွတ်မတ်လုပ်ရန်</translation> <translation id="5078796286268621944">မမှန်ကန်သည့် ပင်ကုဒ်</translation> <translation id="5079010647467150187">အသင့်ပါသော VPN ထည့်ခြင်း…</translation> +<translation id="5079699784114005398">ဖွင့်ပြီးသည်နှင့် သင်၏ Google Account ဖြင့် လက်မှတ်ထိုးဝင်ပြီးနောက် သင့်အက်ပ်များကို မည်သည့် ChromeOS စက်ပစ္စည်းတွင်မဆို ရနိုင်ပါမည်။ ဘရောက်ဇာ စင့်ခ်လုပ်ခြင်းကို ပိတ်ထားသော်လည်း Chrome ဘရောင်ဇာမှ ထည့်သွင်းထားသည့် ဝဘ်အက်ပ်များကို စင့်ခ်လုပ်ပါမည်။</translation> <translation id="508059534790499809">Kerberos လက်မှတ်ကို ပြန်လည်စတင်ခြင်း</translation> <translation id="5081960376148623587">စာမျက်နှာများ ကြိုဖွင့်၊ မဖွင့် ရွေးခြင်း</translation> <translation id="5084328598860513926">Provisioning အဆင့်ဆင့် ရပ်သွားသည်။ ထပ်စမ်းကြည့်ပါ သို့မဟုတ် သင့်စက်ပိုင်ရှင် သို့မဟုတ် စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။ အမှားကုဒ် - <ph name="ERROR_CODE" />။</translation> @@ -4768,6 +4778,7 @@ <translation id="5145464978649806571">သင်စက်အနီးမှ ထွက်သွားပါက ဖန်သားပြင်ကို ချက်ချင်းလော့ခ်ချပါမည်။ သင်စက်ရှေ့တွင် ရှိနေသောအခါ ဖန်သားပြင်ကို ဖွင့်လျက်သားထားပါမည်။ လော့ခ်မျက်နှာပြင် ပိတ်ထားပါက စက်ကိုလော့ခ်ချမည့်အစား ရပ်နားလိုက်ပါမည်။</translation> <translation id="514575469079499857">သင့်တည်နေရာကို သိရှိနိုင်ရန် သင်၏ IP လိပ်စာကို အသုံးပြုပါ (မူရင်း)</translation> <translation id="5146896637028965135">စနစ်၏အသံ</translation> +<translation id="5147992672778369947">အကြံပြုထားသည့် စကားဝှက် သုံးနိုင်သည်</translation> <translation id="5148277445782867161">Google ၏ တည်နေရာဝန်ဆောင်မှုသည် သင့်စက်ပစ္စည်း၏ တည်နေရာကို ခန့်မှန်းနိုင်ရန် Wi-Fi၊ မိုဘိုင်းကွန်ရက်များနှင့် အာရုံခံကိရိယာများကဲ့သို့သော အရင်းအမြစ်များကို အသုံးပြုပါသည်။</translation> <translation id="5150254825601720210">Netscape အသိမှတ်ပြုလက်မှတ် SSL ဆာဗာအမည်</translation> <translation id="5151354047782775295">နေရာလွတ်ပြုလုပ်ပါ။ သို့မဟုတ်လျှင် ဒေတာရွေးချယ်ခြင်းကို အလိုအလျောက်ဖျက်သွားပါမည်</translation> @@ -5054,6 +5065,7 @@ <translation id="5414566801737831689">သင် ဝင်ကြည့်သည့် ဝက်ဘ်ဆိုက်များ၏ အိုင်ကွန််များကို ဖတ်ရန်</translation> <translation id="5414836363063783498">စိစစ်နေ…</translation> <translation id="5417312524372586921">ဘရောင်ဇာ ပုံစံများ</translation> +<translation id="5417353542809767994">လုံခြုံမှုမြင့်သည့် စကားဝှက်ကို အမြန်သုံးနိုင်သည်</translation> <translation id="541737483547792035">ဖန်သားပြင် ချဲ့ရန်</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">ထပ်ဆောင်းလုံခြုံရေးအတွက် စက်ကိုဖွင့်ရန် စကားဝှက်လိုသည်</translation> @@ -5174,6 +5186,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android phone နှင့် စနစ်ထည့်သွင်းရန်</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">လုံခြုံမှုမြင့်သည့် စကားဝှက်ဖြင့် ဤအကောင့်ကို ပိုမိုလုံခြုံစွာထားနိုင်သည်။ ၎င်းကို <ph name="EMAIL" /> အတွက် <ph name="GOOGLE_PASSWORD_MANAGER" /> တွင် သိမ်းပါမည်။</translation> <translation id="5521078259930077036">သင် စောင့်နေခဲ့သည်မှာ ဒီပင်မ စာမျက်နှာလား?</translation> <translation id="5522156646677899028">ဒီတိုးချဲ့မှု ထဲတွင် လေးနက်သည့် လုံခြုံရေး ထိပျက်လွယ်မှု တစ်ခု ပါရှိသည်။</translation> <translation id="5522403133543437426">လိပ်စာဘားတွင် သုံးထားသည့် ရှာဖွေရေးအင်ဂျင်။</translation> @@ -5791,6 +5804,7 @@ <translation id="6070311415473175157">ရှာဖွေလိုသည့် ပုံနေရာကို မှတ်ပါ</translation> <translation id="6071181508177083058">စကားဝှက် အတည်ပြုပါ</translation> <translation id="6071576563962215370">စနစ်သည် စက်ပစ္စည်းထည့်သွင်းမှုအချိန် ရည်ညွှန်းချက်လော့ခ်ကို သတ်မှတ်၍မရပါ။</translation> +<translation id="6071938745001252305">မှတ်ဉာဏ်နေရာ <ph name="MEMORY_VALUE" /> သက်သာ သွားသည်</translation> <translation id="6072442788591997866"><ph name="APP_NAME" /> ကို ဤစက်ပေါ်တွင် ခွင့်ပြုမထားပါ။ သင့်စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။ အမှားကုဒ်- <ph name="ERROR_CODE" />။</translation> <translation id="6073451960410192870">ကူးယူမှု ရပ်ရန်</translation> <translation id="6073903501322152803">သုံးစွဲနိုင်ခြင်းဆိုင်ရာ ဝန်ဆောင်မှုများ ပေါင်းထည့်ရန်</translation> @@ -5838,6 +5852,7 @@ <translation id="6104068876731806426">Google Accounts</translation> <translation id="6104311680260824317">စက်ပစ္စည်းကို ဒိုမိန်းသို့ ချိတ်ဆက်၍မရပါ။ ဆာဗာသည် သတ်မှတ်ထားသည့် Kerberos အသွင်ဝှက်ခြင်း အမျိုးအစားများကို ပံ့ပိုးမထားပါ။ အသွင်ဝှက်ခြင်း ဆက်တင်များအတွက် "နောက်ထပ် ရွေးချယ်စရာများ" တွင် ကြည့်ပါ။</translation> <translation id="6104796831253957966">ပရင်တာ စာရင်းစဉ် ပြည့်နေသည်</translation> +<translation id="6104929924898022309">လုပ်ဆောင်ချက်ကီးများ၏ လုပ်ဆောင်ပုံပြောင်းရန်အတွက် ရှာရန်ခလုတ်ကို အသုံးပြုရန်</translation> <translation id="6106167152849320869">ယခင်အဆင့်တွင် အမှားရှာဖွေမှုနှင့် သုံးစွဲမှုဒေတာကို ပေးပို့ရန် ရွေးချယ်ထားပါက ထည့်သွင်းထားသည့် အက်ပ်များအတွက် ဤဒေတာကို စုစည်းပါမည်။</translation> <translation id="6111972606040028426">Google Assistant ဖွင့်ရန်</translation> <translation id="6112294629795967147">အရွယ်အစားပြင်ရန် ထိပါ</translation> @@ -5980,6 +5995,7 @@ <translation id="6234108445915742946">‘Chrome ၏ ဝန်ဆောင်မှုစည်းမျဉ်းများ’ ကို မတ် ၃၁ တွင် ပြောင်းပါမည်</translation> <translation id="6234474535228214774">ထည့်သွင်းမှု ဆိုင်းငံ့နေသည်</translation> <translation id="6235208551686043831">စက်ကင်မရာကို ဖွင့်လိုက်သည်။ သင့် eSIM QR ကုဒ်ကို ကင်မရာရှေ့တွင် ထားပါ။</translation> +<translation id="6237297174664969437">စင့်ခ်လုပ်ရန် ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာကို Chrome ဆက်တင်များတွင် အချိန်မရွေး ရွေးချယ်နိုင်သည်။ Chrome ဘရောက်ဇာမှ ထည့်သွင်းထားသည့် ဝဘ်အက်ပ်များအတွက် စင့်ခ်လုပ်ခြင်းကို <ph name="LINK_BEGIN" />စက်ပစ္စည်း ဆက်တင်များ<ph name="LINK_END" /> တွင် ထိန်းချုပ်နိုင်သည်။ Google က Search နှင့် အခြားဝန်ဆောင်မှုများကို သင့်မှတ်တမ်းပေါ်မူတည်၍ ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်နိုင်သည်။</translation> <translation id="6237474966939441970">စတိုင်လပ်စ် မှတ်စုရေးသည့်အက်ပ်</translation> <translation id="623755660902014047">ဖတ်ရှုမုဒ်</translation> <translation id="6238767809035845642">အခြားစက်ပစ္စည်းမှ မျှဝေထားသော စာတို</translation> @@ -6311,6 +6327,7 @@ <translation id="6537613839935722475">အမည်တွင် စာလုံးများ၊ နံပါတ်များနှင့် တုံးတိုများ (-) သုံးနိုင်သည်</translation> <translation id="6538098297809675636">ကုဒ်ရှာဖွေရာတွင် အမှားဖြစ်သွားသည်</translation> <translation id="653920215766444089">ညွှန်ပြသည့်ကိရိယာကို ရှာနေသည်</translation> +<translation id="6539674013849300372">လုံခြုံမှုမြင့်သည့် စကားဝှက်ဖြင့် အွန်လိုင်းတွင် ပိုလုံခြုံနိုင်သည်။ ၎င်းကို <ph name="EMAIL" /> အတွက် <ph name="GOOGLE_PASSWORD_MANAGER" /> တွင် သိမ်းပါမည်။</translation> <translation id="653983593749614101">ဆက်လုပ်နေသည်…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />မှတ်ချက်:<ph name="END_BOLD" /> ဒေတာစုဆောင်းခြင်းသည် စွမ်းဆောင်ရည်ကျဆင်းစေသောကြောင့် သင့်ကိုလုပ်ခိုင်းသောကြောင့် သို့မဟုတ် သင်ဘာလုပ်နေသည်ကို သိလျှင်သာ ဖွင့်ပါ။</translation> <translation id="6541638731489116978">ဤဝဘ်ဆိုက်အား သင်၏လှုပ်ရှားမှု အာရုံခံစနစ်များ အသုံးပြုခွင့်ကို တားမြစ်ထားသည်။</translation> @@ -6505,6 +6522,7 @@ <translation id="671226373742585927">ဘေးအကန့်ပိတ်ရန် ‘‘X’’ ခလုတ်နှိပ်ပါ</translation> <translation id="6712943853047024245"><ph name="WEBSITE" /> အတွက် ဤအသုံးပြုသူအမည်နှင့် စကားဝှက်ကို သိမ်းပြီးဖြစ်သည်</translation> <translation id="6713233729292711163">အလုပ်ပရိုဖိုင်ကို ထည့်ရန်</translation> +<translation id="6713441551032149301">လုပ်ဆောင်ချက်ကီးများနှင့် ထိပ်ဆုံးအတန်းရှိ စနစ်ကီးများကြား ပြောင်းရန် Launcher ကီးကို ဖိထားပါ</translation> <translation id="6713668088933662563">ဤဘာသာစကားများ ပြန်ဆိုရန် ဘယ်တော့မှ မကမ်းလှမ်းပါနှင့်</translation> <translation id="6715803357256707211">သင်၏ Linux အပလီကေးရှင်းကို ထည့်သွင်းနေစဉ် အမှားအယွင်း ဖြစ်ပေါ်ခဲ့သည်။ အသေးစိတ်အချက်အလက်များအတွက် အကြောင်းကြားချက်များပေါ်တွင် နှိပ်ပါ။</translation> <translation id="671619610707606484">ဤလုပ်ဆောင်ချက်က ဝဘ်ဆိုက်များ သိမ်းထားသည့် ဒေတာ <ph name="TOTAL_USAGE" /> ကို ရှင်းထုတ်လိုက်ပါမည်</translation> @@ -6626,6 +6644,7 @@ <translation id="6811034713472274749">စာမျက်နှာကိုကြည့်ရန် အသင့်ဖြစ်ပါပြီ</translation> <translation id="6811151703183939603">အားပြင်း</translation> <translation id="6811332638216701903">DHCP အင်တာနက်လက်ခံဝန်ဆောင်ပေးသူအမည်</translation> +<translation id="6811792477922751991">လုပ်ဆောင်ချက်ကီးများ၏ လုပ်ဆောင်ပုံပြောင်းရန်အတွက် Launcher ကီးကို အသုံးပြုရန်</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> ရင်းမြစ် အဖြစ် ဖွင့်မသုံးနိုင်ပါ။</translation> <translation id="6812841287760418429">ပြောင်းလဲမှုများ ထားရှိမည်</translation> <translation id="6813907279658683733">စခရင် တစ်ခုလုံး</translation> @@ -7820,6 +7839,7 @@ <translation id="7851720427268294554">IPP ပါဆာ</translation> <translation id="78526636422538552">နောက်ထပ် Google အကောင့်များ ထည့်ခြင်းကို ပိတ်ထားသည်</translation> <translation id="7853747251428735">ပိုမိုသော ကိရိ&ယာများ</translation> +<translation id="7853999103056713222">‘ပိုလုံခြုံသည့် စကားဝှက်’ ကိုသုံးနိုင်သည်</translation> <translation id="7855678561139483478">တဘ်ကို ဝင်းဒိုးအသစ်သို့ ရွှေ့ခြင်း</translation> <translation id="7857004848504343806">သင့်ကွန်ပျူတာတွင် ChromeOS Flex ရှိ အရေးပါသော လုံခြုံရေးဝန်ဆောင်မှုများစွာ ဆောင်ရွက်ရာတွင် အသုံးပြုသည့် လုံခြုံရေး မော်ဂျူး ပါဝင်သည်။ ပိုမိုလေ့လာရန် Chromebook ကူညီရေးဌာနကို ဝင်ကြည့်ပါ- https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">စာသား အကြံပြုချက်များ</translation> @@ -8374,6 +8394,7 @@ <translation id="8325413836429495820">သင့်ကလစ်ဘုတ်ကို ကြည့်ရန် ခွင့်ပြုမထားပါ</translation> <translation id="8326478304147373412">PKCS #7၊ လက်မှတ် ကွင်းဆက်</translation> <translation id="8327386430364625757">သင်္ချာဖောင့်</translation> +<translation id="8327538105740918488">ဤစကားဝှက်ကို နောက်ပိုင်းတွင် အချိန်မရွေး ပြောင်းနိုင်သည်။ ၎င်းကို <ph name="EMAIL" /> အတွက် <ph name="GOOGLE_PASSWORD_MANAGER" /> တွင် သိမ်းပါမည်။</translation> <translation id="8327676037044516220">ခွင့်ပြုချက်များနှင့် အကြောင်းအရာ ဆက်တင်များ</translation> <translation id="8330617762701840933">အခြား ဘရောင်ဇာသို့ တစ်ဆင့်ပြန်ညွှန်ပြသည့် ဝဘ်ဆိုက်များစာရင်း။</translation> <translation id="8330689128072902965">အနီးတစ်ဝိုက်ရှိ အဆက်အသွယ်များက သင်နှင့်မျှဝေနိုင်သည်။ ပြောင်းရန် နှိပ်ပါ။</translation> @@ -8519,6 +8540,7 @@ <translation id="8449836157089738489">အားလုံးကို တဘ်အုပ်စုအသစ်တွင် ဖွင့်ရန်</translation> <translation id="8451512073679317615">အကူအညီ</translation> <translation id="845702320058262034">ချိတ်ဆက်၍ မရပါ။ သင့်ဖုန်း၏ ဘလူးတုသ်ကို ဖွင့်ထားပါ။</translation> +<translation id="8457251154056341970">ဤစာမျက်နှာတွင် <ph name="MODULE_NAME" /> ကို ထပ်မြင်ရတော့မည်မဟုတ်ပါ</translation> <translation id="8457451314607652708">စာညှပ်များ တင်သွင်းရန်</translation> <translation id="8458341576712814616">ဖြတ်လမ်းလင့်ခ်</translation> <translation id="8458627787104127436">(<ph name="URL_COUNT" />) ခုလုံးကို ဝင်းဒိုးအသစ်တွင် ဖွင့်ရန်</translation> @@ -8591,6 +8613,7 @@ <translation id="8514955299594277296">ဝဘ်ဆိုက်များကို သင့်စက်တွင် ဒေတာသိမ်းခွင့်မပြုရန် (အကြံမပြုထားပါ)</translation> <translation id="8517759303731677493">ပြင်ဆင်ရန်…</translation> <translation id="8519895319663397036">စကားဝှက်များ ထည့်သွင်း၍မရပါ။ ဖိုင်အရွယ်အစားသည် ၁၅၀ KB အောက် ရှိသင့်သည်။</translation> +<translation id="851991974800416566">‘လုံခြုံမှုမြင့်သည့် စကားဝှက်’ ကို အမြန်သုံးနိုင်သည်</translation> <translation id="8523493869875972733">ပြောင်းလဲမှုများကို သိမ်းရန်</translation> <translation id="8523849605371521713">မူဝါဒအရ ထည့်သွင်းထားသည်</translation> <translation id="8524783101666974011">သင့် Google အကောင့်တွင် ကတ်များသိမ်းပါ</translation> @@ -8748,6 +8771,7 @@ <translation id="8665110742939124773">မမှန်ကန်သော ဝင်ခွင့်ကုဒ် ထည့်လိုက်သည်။ ထပ်စမ်းကြည့်ပါ။</translation> <translation id="8665180165765946056">အရန်သိမ်းပြီးပါပြီ</translation> <translation id="866611985033792019">အီးမေးလ်အသုံးပြုသူများ၏ အထောက်အထားအနေဖြင့် ဤအသိအမှတ်ပြုလက်မှတ်ကို ယုံကြည်ပါ</translation> +<translation id="8666268818656583275">ယခုအခါ F ကီးများသည် ထိပ်ဆုံးအတန်းကီးများကဲ့သို့ လုပ်ဆောင်ပါမည်</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> အတွက် ခွင့်ပြုချက်များ ပြန်ပေးလိုက်သည်</translation> <translation id="8666759526542103597">ဘရောင်ဇာအခြေခံ ကြော်ငြာ စိတ်ကြိုက်သတ်မှတ်ခြင်းအကြောင်း</translation> <translation id="8667261224612332309">ပိုလုံခြုံအောင်လုပ်နိုင်သော စကားဝှက်များ ရှိသည်</translation> @@ -9430,6 +9454,7 @@ <translation id="950307215746360464">စနစ်ထည့်သွင်းမှု လမ်းညွှန်</translation> <translation id="951991426597076286">ပယ်ချရန်</translation> <translation id="952471655966876828">စက်ဖွင့်ထားသောအခါ (သို့) အသုံးပြုနေသောအခါ အလိုအလျောက် ချိတ်ဆက်ပါမည်</translation> +<translation id="952880932803612259">အက်ပ်၊ ဝဘ်ဆိုက်နှင့် စနစ်ဝန်ဆောင်မှုများကို သင့်တည်နေရာ အသုံးပြုခွင့်ပေးရန်။ တည်နေရာဝန်ဆောင်မှုက သင့်စက်၏တည်နေရာ ခန့်မှန်းရာတွင် အကူအညီရယူရန် Wi-Fi၊ မိုဘိုင်းကွန်ရက်နှင့် အာရုံခံကိရိယာများကဲ့သို့ ရင်းမြစ်များကို အသုံးပြုနိုင်သည်။</translation> <translation id="953434574221655299">သင့်ကိရိယာသုံးနေချိန်ကို သိရန် ခွင့်ပြုထားသည်</translation> <translation id="956500788634395331">အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲများ၏ရန်မှ သင့်ကို ကာကွယ်ပေးထားသည်</translation> <translation id="957179356621191750">၆ ဒေါ့(တ်)</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index e1f5584..a5864175 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -200,6 +200,7 @@ <translation id="1166212789817575481">दायाँ तिरका ट्याबहरू बन्द गर्नुहोस्</translation> <translation id="1166583374608765787">परिवर्तन गरिएको नामको समीक्षा गर्नुहोस्</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> ट्याब <ph name="DESK_TITLE" /> डेस्कअन्तर्गत पर्छ</translation> +<translation id="1167262726334064738">नयाँ पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> मा खुल्दै...</translation> <translation id="116896278675803795">चयन गरिएको सामग्रीका आधारमा स्वतः भाषा बदलियोस्</translation> <translation id="1169266963600477608">गेम कन्ट्रोलहरू</translation> @@ -904,6 +905,7 @@ <translation id="177336675152937177">होस्ट गरिएको एप लगत</translation> <translation id="1776712937009046120">प्रयोगकर्ता थप्नुहोस्</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">सर्च की थिचिराख्दा फङ्सन की र माथिल्लो लहरका सिस्टम कीका बिचमा अदलबदल हुने पारियोस्</translation> <translation id="1778457539567749232">'नपढिएको' सामग्रीका रूपमा चिन्ह लगाउनुहोस्</translation> <translation id="1778991607452011493">डिबगसम्बन्धी लगहरू पठाउनुहोस् (सिफारिस गरिएको)</translation> <translation id="1779441632304440041">कमजोर पासवर्डहरू सजिलैसँग अनुमान लगाउन सकिन्छ। त्यसैले भरपर्दा पासवर्डहरू राख्न नबिर्सनुहोला।</translation> @@ -1345,6 +1347,7 @@ <translation id="2142582065325732898">Chrome मा हालसालै खोलिएका ट्याबहरू हेर्न <ph name="LINK1_BEGIN" />Chrome सिंक<ph name="LINK1_END" /> अन गर्नुहोस्। <ph name="LINK2_BEGIN" />थप जान्नुहोस्<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">पूर्ण स्क्रिनमा सधैँ उपकरणपट्टी देखाउनुहोस्</translation> <translation id="2143778271340628265">म्यानुअल प्रोक्सी कन्फिगरेसन</translation> +<translation id="2143808295261240440">सिफारिस गरिएको पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="2143915448548023856">सेटिङहरू प्रदर्शन गर्नुहोस्</translation> <translation id="2144536955299248197">प्रमाणपत्र दर्शक: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux मा Android एपको विकास</translation> @@ -2331,6 +2334,7 @@ <translation id="2963151496262057773">निम्न प्लगइनले जवाफहीन छ: <ph name="PLUGIN_NAME" /> के तपाईं यसलाई बन्द गर्न चाहनुहुन्छ?</translation> <translation id="2964193600955408481">Wi-Fi असक्षम गर्नुहोस्</translation> <translation id="2964245677645334031">नजिकैका डिभाइससँग सेयर गर्ने सुविधामा भएको पहुँचसम्बन्धी सेटिङ</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> बुकमार्क फोल्डरमा उपलब्ध थप विकल्पहरू</translation> <translation id="2966937470348689686">Android सम्बन्धी प्राथमिकताहरूको व्यवस्थापन गर्नुहोस्</translation> <translation id="2967926928600500959">यी नियमहरू अनुरूप रहेका URL कुनै निश्चित ब्राउजरमार्फत मात्रै खोलिने छ।</translation> <translation id="2972581237482394796">&फेरि गर्नुहोस्</translation> @@ -2620,6 +2624,7 @@ <translation id="3244294424315804309">आवाज म्युट गरिराख्नुहोस्</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - नेटवर्क सम्बन्धी त्रुटि</translation> <translation id="3248902735035392926">सुरक्षासम्बन्धी विषयहरू केही क्षण निकालेर <ph name="BEGIN_LINK" />अहिले नै आफ्ना एक्स्टेन्सनहरू जाँच्नुहोस्<ph name="END_LINK" /></translation> +<translation id="3249323165366527554"><ph name="EMAIL" /> को <ph name="GOOGLE_PASSWORD_MANAGER" /> मा आफ्ना पासवर्डहरू स्वतः सेभ गरी अझ छिटो साइन अप र साइन इन गर्नुहोस्।</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" /> लाई “Ok Google” भनेर Google सहायक एक्टिभेट गर्ने अनुमति दिनुहोस्</translation> <translation id="3251759466064201842"><प्रमाणपत्रको भाग होइन></translation> <translation id="325238099842880997">बालबालिकालाई घरमा खेल्न, नयाँ कुरा सिक्न र विद्यालयको कार्य गर्न सघाउन आधारभूत डिजिटल नियमहरू बनाउनुहोस्</translation> @@ -4113,6 +4118,7 @@ <translation id="4556194354084985730">आफूले सेभ गरेका पासवर्ड प्रयोग गरी साइट तथा एपहरूमा सजिलैसँग साइन इन गर्नुहोस्। यो सुविधा अफ गरिएको छ भने तपाईंले कुनै साइट वा एपमा साइन इन गर्दा तपाईंलाई पासवर्ड हाल्न लगाइने छ।</translation> <translation id="4558426062282641716">स्वत: सुरुवात अनुमति अनुरोध गरियो</translation> <translation id="4559617833001311418">यो साइटले तपाईंको चाल वा प्रकाशसम्बन्धी सेन्सरहरूमाथि पहुँच राखेको छ।</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> बुकमार्कमा उपलब्ध थप विकल्पहरू</translation> <translation id="4561893854334016293">हालै परिवर्तन गरिएको कुनै पनि अनुमति छैन</translation> <translation id="4562155214028662640">फिंगरप्रिन्ट हाल्नुहोस्</translation> <translation id="4563210852471260509">प्रारम्भिक आगत भाषा चिनियाँ हो</translation> @@ -4396,6 +4402,7 @@ <translation id="4819323978093861656">{0,plural, =0{अहिले बन्द गरिँदै छन्।}=1{निम्न समयपछि बन्द गरिन्छन्: १ सेकेन्ड}other{निम्न समयपछि बन्द गरिन्छन्: # सेकेन्ड}}</translation> <translation id="4819607494758673676">Google सहायकका सूचनाहरू</translation> <translation id="4820236583224459650">सक्रिय टिकटको रूपमा सेट गर्नुहोस्</translation> +<translation id="4820795723433418303">फङ्सन कीलाई माथिल्लो लहरका कीका रूपमा प्रयोग गरियोस्</translation> <translation id="4821935166599369261">&रूपरेखा सक्षम गरिएको छ</translation> <translation id="4823484602432206655">पढ्नुहोस् र प्रयोगकर्ता तथा यन्त्र सेटिङहरू परिवर्तन गर्नुहोस्</translation> <translation id="4824037980212326045">Linux को ब्याकअप तथा पुनर्स्थापना</translation> @@ -4527,6 +4534,7 @@ <translation id="4925320384394644410">तपाईंका पोर्टहरू यहाँ देखा पर्ने छन्</translation> <translation id="49265687513387605">स्क्रिन कास्ट गर्न सकिएन। आफ्नो स्क्रिन सेयर गर्न थाल्न आफूले प्रम्प्ट पुष्टि गरेको वा नगरेको कुरा जाँच गर्नुहोस्।</translation> <translation id="4927753642311223124">यहाँ हेर्ने कुरा केही पनि छैन, अघि बढ्नुहोस्।</translation> +<translation id="4928629450964837566">अझ सुरक्षित पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="4929386379796360314">यो प्रिन्टरमार्फत प्रिन्ट गर्नुहोस्</translation> <translation id="4930447554870711875">विकासकर्ताहरू</translation> <translation id="4930714375720679147">अन गर्नुहोस्</translation> @@ -4609,6 +4617,7 @@ <translation id="5010886807652684893">भिजुअल भ्यू</translation> <translation id="5015344424288992913">प्रोक्सी समाधान गर्दै...</translation> <translation id="5016491575926936899">तपाईं आफ्नो फोन प्रयोग गरी कम्प्युटरबाट टेक्स्ट म्यासेज पठाउन, इन्टरनेट कनेक्सन सेयर गर्न, वार्तालापका सूचनाबाटै जवाफ फर्काउन र आफ्नो <ph name="DEVICE_TYPE" /> अनलक गर्न सक्नुहुन्छ।<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">नयाँ पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="5017643436812738274">तपाईं टेक्स्ट कर्सर प्रयोग गरी पृष्ठहरूमा नेभिगेट गर्न सक्नुहुन्छ। अफ गर्न Ctrl+Search+7 थिच्नुहोस्।</translation> <translation id="5018207570537526145">विस्तारको वेबसाइट खोल्नुहोस्</translation> <translation id="5018526990965779848">प्रयोग तथा निदानसम्बन्धी डेटा पठाउनुहोस्। निदान, डिभाइस र एपको प्रयोगसम्बन्धी डेटा स्वतः Google लाई पठाएर आफ्नो Android सम्बन्धी अनुभवमा सुधार ल्याउन मद्दत गर्नुहोस्। यसले प्रणाली तथा एपको स्थिरता र अन्य कुराहरूमा सुधार ल्याउन मद्दत गर्ने छ। केही समग्र डेटाले Google का एप तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई पनि मद्दत गर्ने छन्। तपाईंको खातामा अतिरिक्त वेब तथा एपसम्बन्धी गतिविधिको सेटिङ सक्रिय गरिएको छ भने यो डेटा तपाईंको Google खातामा सुरक्षित गरिन सक्छ।</translation> @@ -4677,6 +4686,7 @@ <translation id="5078638979202084724">सबै ट्याबहरू पृष्ठमञ्जूषा गर्नुहोस्</translation> <translation id="5078796286268621944">गलत PIN</translation> <translation id="5079010647467150187">अन्तर्निर्मित VPN हाल्नुहोस्...</translation> +<translation id="5079699784114005398">तपाईंले सिंक गर्ने सुविधा अन गर्नुभयो भने तपाईं जुन जुन ChromeOS डिभाइसमा आफ्नो Google खातामार्फत साइन इन गर्नुहुन्छ ती डिभाइसहरूमा तपाईंका एपहरू उपलब्ध हुने छन्। Chrome ब्राउजरबाट इन्स्टल गरिएका वेब एपहरू भने ब्राउजर सिंक अफ गरिएको अवस्थामा पनि सिंक गरिने छन्।</translation> <translation id="508059534790499809">Kerberos को टिक पुन: ताजा गर्नुहोस्</translation> <translation id="5081960376148623587">पेजहरू प्रिलोड गर्ने वा नगर्ने भन्ने कुरा छनौट गर्नुहोस्</translation> <translation id="5084328598860513926">सेटअप गर्ने क्रममा केही समस्या आयो। कृपया फेरि प्रयास गर्नुहोस् वा आफ्नो डिभाइसका मालिक वा एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation> @@ -4752,6 +4762,7 @@ <translation id="5145464978649806571">तपाईं आफ्नो डिभाइसबाट टाढा जानुभयो भने तपाईंको डिभाइसको स्क्रिन स्वतः लक हुन्छ। तपाईं आफ्नो डिभाइसको अगाडि हुँदा तपाईंको डिभाइसको स्क्रिन अझ लामो समयसम्म अन रहने छ। लक स्क्रिन अफ गरिएका खण्डमा तपाईंको डिभाइस लक हुनुको साटो स्लिप मोडमा जाने छ।</translation> <translation id="514575469079499857">स्थान निर्धारण गर्न आफ्नो IP एड्रेस प्रयोग गरियोस् (डिफल्ट)</translation> <translation id="5146896637028965135">सिस्टम भ्वाइस</translation> +<translation id="5147992672778369947">सिफारिस गरिएको पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="5148277445782867161">Google को लोकेसन सर्भिसले तपाईंको डिभाइसको अनुमानित स्थान पत्ता लगाउन Wi-Fi, मोबाइल नेटवर्क र सेन्सरहरू जस्ता स्रोतहरूको प्रयोग गर्छ।</translation> <translation id="5150254825601720210">नेटस्केप प्रमाणपत्र SSL सर्भर नाम</translation> <translation id="5151354047782775295">डिस्कको ठाउँ खाली गर्नुहोस् नत्र छनौट गरिएको डेटा स्वतः मेटिन सक्छ</translation> @@ -5038,6 +5049,7 @@ <translation id="5414566801737831689">तपाईंले भ्रमण गर्नुहुने वेबसाइटहरूको प्रतिमा पढ्नुहोस्</translation> <translation id="5414836363063783498">प्रमाणीकरण गर्दै...</translation> <translation id="5417312524372586921">ब्राउजरका विषयवस्तुहरू</translation> +<translation id="5417353542809767994">तुरुन्तै भरपर्दो पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="541737483547792035">स्क्रिन जुम इन गर्नुहोस्</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">थप सुरक्षाका निम्ति डिभाइस अनलक गर्न पासवर्ड प्रविष्टि गर्नु पर्ने हुन्छ</translation> @@ -5158,6 +5170,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android फोनका सहायताले सेटअप गर्नुहोस्</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">भरपर्दो पासवर्ड प्रयोग गरी यो खाता सुरक्षित राख्नुहोस्। यो पासवर्ड <ph name="EMAIL" /> को <ph name="GOOGLE_PASSWORD_MANAGER" /> मा सेभ गरिने छ।</translation> <translation id="5521078259930077036">के यो तपाईंले अपेक्षा गर्नुभएको गृह पृष्ठ हो?</translation> <translation id="5522156646677899028">यो एक्सटेन्सनले गम्भीर सुरक्षा अतिसंवेदनशीलता समावेश गर्छ।</translation> <translation id="5522403133543437426">एड्रेस बारमा प्रयोग गरिएको सर्च इन्जिन।</translation> @@ -5775,6 +5788,7 @@ <translation id="6070311415473175157">Google लेन्समार्फत खोज्न फोटोको कुनै भाग चयन गर्नुहोस्</translation> <translation id="6071181508177083058">पासवर्ड पुष्टि गर्नुहोस्</translation> <translation id="6071576563962215370">प्रणालीले यन्त्रको स्थापना समयका विशेषतासम्बन्धी लक स्थापना गर्न सकेन।</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> मेमोरी बचत गरियो</translation> <translation id="6072442788591997866">यो डिभाइसमा <ph name="APP_NAME" /> चलाउन मिल्दैन। आफ्ना एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation> <translation id="6073451960410192870">रेकर्ड गर्न छाड्नुहोस्</translation> <translation id="6073903501322152803">पहुँच सम्बन्धी सुविधाहरू थप्नुहोस्</translation> @@ -5822,6 +5836,7 @@ <translation id="6104068876731806426">Google खाताहरू</translation> <translation id="6104311680260824317">यन्त्रलाई उक्त डोमेनसँग जोड्न सकिँदैन। सर्भरले तोकिएको Kerberos नामक इन्क्रिप्सनका प्रकारहरूलाई समर्थन गर्दैन। इन्क्रिप्सनसम्बन्धी सेटिङहरूका लागि "थप विकल्पहरू" जाँच गर्नुहोस्।</translation> <translation id="6104796831253957966">प्रिन्ट गर्नु पर्ने कार्यहरूको सूची भरिएको छ</translation> +<translation id="6104929924898022309">फङ्सन की थिच्दा हुने कारबाही बदल्न सर्च की प्रयोग गरियोस्</translation> <translation id="6106167152849320869">तपाईंले यसअघिको चरणमा डाइग्नोस्टिक तथा प्रयोगसम्बन्धी डेटा पठाउने विकल्प पनि छनौट गर्नुभएको छ भने इन्स्टल गरिएका एपहरूबाट यो डेटा पनि सङ्कलन गरिने छ।</translation> <translation id="6111972606040028426">Google सहायक सक्षम पार्नुहोस्</translation> <translation id="6112294629795967147">पुनः आकार मिलाउन छुनुहोस्</translation> @@ -5963,6 +5978,7 @@ <translation id="6234108445915742946">३१ मार्चदेखि Chrome को सेवाका सर्तहरू परिवर्तन हुँदै छन्</translation> <translation id="6234474535228214774">स्थापना गर्ने काम विचाराधीन छ</translation> <translation id="6235208551686043831">डिभाइसको क्यामेरा अन गरिएको छ। कृपया तपाईंको eSIM को QR कोड क्यामेराको अगाडि राख्नुहोस्।</translation> +<translation id="6237297174664969437">तपाईं जुनसुकै बेला Chrome का सेटिङमा गई कुन कुन ब्राउजिङ डेटा सिंक गर्ने भन्ने कुरा छनौट गर्न सक्नुहुन्छ। तपाईं <ph name="LINK_BEGIN" />डिभाइसका सेटिङ<ph name="LINK_END" />मा गई Chrome ब्राउजरबाट इन्स्टल गरिएका वेब एप सिंक गर्ने सुविधा नियन्त्रण गर्न सक्नुहुन्छ। Google ले तपाईंले विगतमा हेरेका वेबपेजका आधारमा Search र अन्य सेवाहरू पर्सनलाइज गर्न सक्छ।</translation> <translation id="6237474966939441970">टिपोट लिन प्रयोग हुने स्टाइलस एप</translation> <translation id="623755660902014047">रिडिङ मोड</translation> <translation id="6238767809035845642">अर्को यन्त्रबाट आदान प्रदान गरिएको टेक्स्ट म्यासेज</translation> @@ -6296,6 +6312,7 @@ <translation id="6537613839935722475">डिभाइसको नाम राख्दा अक्षर, अङ्क र हाइफन चिन्ह (-) प्रयोग गर्न मिल्छ</translation> <translation id="6538098297809675636">कोड पत्ता लगाउने क्रममा त्रुटि भयो</translation> <translation id="653920215766444089">पोइन्टिङ यन्त्र खोजिँदै छ</translation> +<translation id="6539674013849300372">भरपर्दो पासवर्ड पासवर्ड प्रयोग गरी इन्टरनेटमा अझ सुरक्षित रहनुहोस्। यो पासवर्ड <ph name="EMAIL" /> को <ph name="GOOGLE_PASSWORD_MANAGER" /> मा सेभ गरिने छ।</translation> <translation id="653983593749614101">सुचारु गरिँदै छ...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />नोट:<ph name="END_BOLD" /> तपाइँले के गरिरहनुभएको छ भनेर थाहा छ भने वा तपाइँलाई त्यसो गर्न अनुरोध गरिएको छ भने मात्रै सक्षम गर्नुहोस्, किनभने लगत सङ्कलन गर्नाले प्रस्तुतीकरण घटाउन सक्छ।</translation> <translation id="6541638731489116978">यो साइटलाई तपाईंको चालसम्बन्धी सेन्सरहरूको पहुँच राख्नबाट रोक लगाइएको छ।</translation> @@ -6490,6 +6507,7 @@ <translation id="671226373742585927">साइड प्यानल बन्द गर्न "X" बटनमा क्लिक गर्नुहोस्</translation> <translation id="6712943853047024245">तपाईंले <ph name="WEBSITE" /> मा यो युजरनेमको पासवर्ड सेभ गरिसक्नुभएको छ</translation> <translation id="6713233729292711163">कार्य प्रोफाइल हाल्नुहोस्</translation> +<translation id="6713441551032149301">लन्चर की थिचिराख्दा फङ्सन की र माथिल्लो लहरका सिस्टम कीका बिचमा अदलबदल हुने पारियोस्</translation> <translation id="6713668088933662563">यी भाषाहरूमा अनुवाद गर्ने विकल्प कहिल्यै नदेखाइयोस्</translation> <translation id="6715803357256707211">तपाईंको Linux एप स्थापना गर्ने क्रममा कुनै त्रुटि भयो। विस्तृत विवरणका लागि सूचनामा क्लिक गर्नुहोस्।</translation> <translation id="671619610707606484">यस कार्यले साइटहरूले भण्डारण गरेको <ph name="TOTAL_USAGE" /> डेटा मेटाउने छ</translation> @@ -6611,6 +6629,7 @@ <translation id="6811034713472274749">पृष्ठ हेर्नका लागि तयार छ</translation> <translation id="6811151703183939603">कडा</translation> <translation id="6811332638216701903">DHCP होस्टनेम</translation> +<translation id="6811792477922751991">फङ्सन की थिच्दा हुने कारबाही बदल्न लन्चर की प्रयोग गरियोस्</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> लाई रूटको रूपमा चलाउन सकिन्न।</translation> <translation id="6812841287760418429">परिवर्तनहरू राख्नुहोस्</translation> <translation id="6813907279658683733">सबै स्क्रिन</translation> @@ -7805,6 +7824,7 @@ <translation id="7851720427268294554">IPP पार्सर</translation> <translation id="78526636422538552">योभन्दा बढी Google खाताहरू थप्ने सुविधा असक्षम पारिएको छ</translation> <translation id="7853747251428735">थप उपकरणहरू</translation> +<translation id="7853999103056713222">अझ सुरक्षित पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="7855678561139483478">ट्याब नयाँ विन्डोमा सार्नुहोस्</translation> <translation id="7857004848504343806">तपाईंको कम्प्युटरमा सुरक्षित मोड्युल समावेश छ। ChromeOS Flex मा सुरक्षासम्बन्धी थुप्रै महत्त्वपूर्ण सुविधाहरू लागू गर्नका लागि उक्त मोड्युल प्रयोग गरिन्छ। तपाईं यसका सम्बन्धमा थप जान्न चाहनुहुन्छ भने Chromebook को मद्दत केन्द्रमा जानुहोस्: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">पाठसम्बन्धी सुझावहरू</translation> @@ -8359,6 +8379,7 @@ <translation id="8325413836429495820">तपाईंको क्लिपबोर्ड हेर्न अनुमति नदिइएका साइटहरू</translation> <translation id="8326478304147373412">PKCS # 7, प्रमाणपत्र चेन</translation> <translation id="8327386430364625757">गणितीय फन्ट</translation> +<translation id="8327538105740918488">तपाईं पछि जुनसुकै बेला यो पासवर्ड बदल्न सक्नुहुन्छ। यो पासवर्ड <ph name="EMAIL" /> को <ph name="GOOGLE_PASSWORD_MANAGER" /> मा सेभ गरिने छ।</translation> <translation id="8327676037044516220">अनुमति र सामग्रीसम्बन्धी सेटिङहरू</translation> <translation id="8330617762701840933">रिडिरेक्ट गरेर वैकल्पिक ब्राउजरमा खोलिने वेबसाइटहरूको सूची।</translation> <translation id="8330689128072902965">नजिकैका कन्ट्याक्टहरू तपाईंसँग सामग्री सेयर गर्न सक्छन्। तपाईं यी सेटिङ बदल्न चाहनुहुन्छ भने क्लिक गर्नुहोस्।</translation> @@ -8504,6 +8525,7 @@ <translation id="8449836157089738489">सबै URL नयाँ ट्याब समूहमा खोल्नुहोस्</translation> <translation id="8451512073679317615">सहायक</translation> <translation id="845702320058262034">जडान गर्न सकिएन। आफ्नो फोनको ब्लुटुथ सक्रिय गरिएको कुरा सुनिश्चित गर्नुहोस्।</translation> +<translation id="8457251154056341970">तपाईंलाई यो पेजमा <ph name="MODULE_NAME" /> फेरि देखाइने छैन</translation> <translation id="8457451314607652708">बुकमार्कहरू आयात गर्नुहोस्</translation> <translation id="8458341576712814616">सर्टकट</translation> <translation id="8458627787104127436">सबै (<ph name="URL_COUNT" />) URL नयाँ विन्डोमा खोल्नुहोस्</translation> @@ -8576,6 +8598,7 @@ <translation id="8514955299594277296">साइटहरूलाई तपाईंको डिभाइसमा जानकारी सेभ गर्ने अनुमति नदिनुहोस् (सिफारिस गरिएको छैन)</translation> <translation id="8517759303731677493">सम्पादन गर्नुहोस्…</translation> <translation id="8519895319663397036">पासवर्डहरू इम्पोर्ट गर्न सकिँदैन। फाइलको आकार १५० के.बि. भन्दा सानो हुनु पर्छ।</translation> +<translation id="851991974800416566">तुरुन्तै भरपर्दो पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="8523493869875972733">परिवर्तनहरू कायम राख्नुहोस्</translation> <translation id="8523849605371521713">नीतिद्वारा थपिएको</translation> <translation id="8524783101666974011">आफ्नो Google खातामा कार्डहरू सेभ गर्नुहोस्</translation> @@ -8733,6 +8756,7 @@ <translation id="8665110742939124773">तपाईंले गलत एक्सेस कोड हाल्नुभएको छ। फेरि प्रयास गर्नुहोस्।</translation> <translation id="8665180165765946056">ब्याकअप सम्पन्न भयो</translation> <translation id="866611985033792019">इमेल प्रयोगकर्ताहरूको पहिचान गर्न यो प्रमाणपत्रमाथि विश्वास गर्नुहोस्</translation> +<translation id="8666268818656583275">F कीले अब माथिल्लो लहरका सिस्टम कीका रूपमा काम गर्ने छन्</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> लाई फेरि अनुमति दिइएको छ</translation> <translation id="8666759526542103597">ब्राउजरमा आधारित विज्ञापनको पर्सनलाइजेसनका बारेमा जानकारी</translation> <translation id="8667261224612332309">तपाईंका केही पासवर्डहरू अझ सुरक्षित बनाउन सकिन्छ</translation> @@ -9415,6 +9439,7 @@ <translation id="950307215746360464">सेटअप गाइड</translation> <translation id="951991426597076286">अस्वीकार गर्नुहोस्</translation> <translation id="952471655966876828">डिभाइस अन गरिएको खण्डमा वा उक्त डिभाइस प्रयोग भएको बेला सो डिभाइस स्वतः कनेक्ट हुने छ</translation> +<translation id="952880932803612259">एप, वेबसाइट र सिस्टमका सेवाहरूलाई मेरो लोकेसन प्रयोग गर्न दिइयोस्। तपाईंको डिभाइसको अनुमानित लोकेसन पत्ता लगाउन लोकेसन सेवाले Wi‑Fi, मोबाइल नेटवर्क र सेन्सरलगायतका स्रोतहरू प्रयोग गर्न सक्छ।</translation> <translation id="953434574221655299">तपाईं आफ्नो यन्त्र चलाउँदै हुनुहुन्छ कि हुनुहुन्न भन्ने कुरा थाहा पाउन दिइएका साइटहरू</translation> <translation id="956500788634395331">तपाईं हानिकारक हुन सक्ने एक्स्टेन्सनहरूबाट सुरक्षित हुनुहुन्छ</translation> <translation id="957179356621191750">६ वटा डट भएको</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index e8399f6..3e8bbfa 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">ਟੈਬਸ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਬੰਦ ਕਰੋ</translation> <translation id="1166583374608765787">ਨਾਮ ਸੰਬੰਧੀ ਅੱਪਡੇਟ ਦੀ ਸਮੀਖਿਆ ਕਰੋ</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> ਡੈਸਕ <ph name="DESK_TITLE" /> ਨਾਲ ਸੰਬੰਧਿਤ ਹੈ</translation> +<translation id="1167262726334064738">ਕੋਈ ਨਵਾਂ ਪਾਸਵਰਡ ਵਰਤ ਕੇ ਦੇਖੋ</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> ਵਿੱਚ ਖੋਲ੍ਹ ਰਿਹਾ ਹੈ...</translation> <translation id="116896278675803795">ਚੁਣੀ ਗਈ ਸਮੱਗਰੀ ਨਾਲ ਮੇਲ ਕਰਨ ਲਈ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਭਾਸ਼ਾ ਬਦਲੋ</translation> <translation id="1169266963600477608">ਗੇਮ ਕੰਟਰੋਲ</translation> @@ -919,6 +920,7 @@ <translation id="177336675152937177">ਹੋਸਟ ਕੀਤਾ ਐਪ ਡਾਟਾ</translation> <translation id="1776712937009046120">ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਅਤੇ ਸਿਖਰਲੀ ਕਤਾਰ ਦੀਆਂ ਕੁੰਜੀਆਂ ਵਿਚਾਲੇ ਬਦਲੀ ਕਰਨ ਲਈ ਖੋਜ ਕੁੰਜੀ ਨੂੰ ਦਬਾ ਕੇ ਰੱਖੋ</translation> <translation id="1778457539567749232">ਨਾ-ਪੜ੍ਹੇ ਵਜੋਂ ਨਿਸ਼ਾਨਦੇਹੀ ਕਰੋ</translation> <translation id="1778991607452011493">ਡੀਬੱਗ ਲੌਗ ਭੇਜੋ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> <translation id="1779441632304440041">ਕਮਜ਼ੋਰ ਪਾਸਵਰਡਾਂ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣਾ ਆਸਾਨ ਹੁੰਦਾ ਹੈ। ਇਹ ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਬਣਾ ਰਹੇ ਹੋ।</translation> @@ -1361,6 +1363,7 @@ <translation id="2142582065325732898">ਹਾਲੀਆ Chrome ਟੈਬਾਂ ਨੂੰ ਦੇਖਣ ਲਈ <ph name="LINK1_BEGIN" />Chrome ਸਿੰਕ<ph name="LINK1_END" /> ਨੂੰ ਚਾਲੂ ਕਰੋ। <ph name="LINK2_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">ਟੂਲਬਾਰ ਨੂੰ ਹਮੇਸ਼ਾ ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਿਖਾਓ </translation> <translation id="2143778271340628265">ਮੈਨੁਅਲ ਪ੍ਰੌਕਸੀ ਸੰਰੂਪਿਤ ਕਰੋ</translation> +<translation id="2143808295261240440">ਸਿਫ਼ਾਰਸ਼ੀ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="2143915448548023856">ਸੈਟਿੰਗਾਂ ਡਿਸਪਲੇ ਕਰੋ</translation> <translation id="2144536955299248197">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਵਿਊਅਰ: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android ਐਪ ਵਿਕਾਸ</translation> @@ -2348,6 +2351,7 @@ <translation id="2963151496262057773">ਹੇਠਾਂ ਦਿੱਤਾ ਪਲੱਗਇਨ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਿਹਾ ਹੈ: <ph name="PLUGIN_NAME" />ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਰੋਕਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="2964193600955408481">Wi-Fi ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ</translation> <translation id="2964245677645334031">ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਦਿਖਣਯੋਗਤਾ</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> ਬੁੱਕਮਾਰਕ ਫੋਲਡਰ ਲਈ ਹੋਰ ਵਿਕਲਪ</translation> <translation id="2966937470348689686">Android ਤਰਜੀਹਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="2967926928600500959">ਇਨ੍ਹਾਂ ਨਿਯਮਾਂ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਾਲੇ URL ਨੂੰ ਕਿਸੇ ਖਾਸ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਜ਼ਬਰਦਸਤੀ ਖੋਲ੍ਹਿਆ ਜਾਵੇਗਾ।</translation> <translation id="2972581237482394796">&ਰੀਡੂ</translation> @@ -2637,6 +2641,7 @@ <translation id="3244294424315804309">ਧੁਨੀ ਮਿਊਟ ਕਰਨਾ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - ਨੈੱਟਵਰਕ ਗੜਬੜ</translation> <translation id="3248902735035392926">ਸੁਰੱਖਿਆ ਮਾਈਨੇ ਰੱਖਦੀ ਹੈ। <ph name="BEGIN_LINK" />ਹੁਣੇ ਆਪਣੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ<ph name="END_LINK" /> ਲਈ ਸਮਾਂ ਕੱਢੋ</translation> +<translation id="3249323165366527554"><ph name="EMAIL" /> ਦੇ ਲਈ <ph name="GOOGLE_PASSWORD_MANAGER" /> ਵਿੱਚ ਆਪਣਾ ਪਾਸਵਰਡ ਆਪਣੇ ਆਪ ਰੱਖਿਅਤ ਹੋਣ ਦੀ ਸੁਵਿਧਾ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਤੇਜ਼ੀ ਨਾਲ ਸਾਈਨ-ਅੱਪ ਅਤੇ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" /> ਨੂੰ "Ok Google" ਬੋਲ ਕੇ Google Assistant ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ</translation> <translation id="3251759466064201842"><ਸਰਟੀਫਿਕੇਟ ਦਾ ਭਾਗ ਨਹੀਂ></translation> <translation id="325238099842880997">ਘਰ ਵਿੱਚ ਬੱਚਿਆਂ ਦੇ ਖੇਡਣ, ਪੜਚੋਲ ਅਤੇ ਸਕੂਲ ਦਾ ਕੰਮ ਕਰਨ ਵਿੱਚ ਮਦਦ ਲਈ ਬੁਨਿਆਦੀ ਡਿਜੀਟਲ ਨਿਯਮ ਸੈੱਟ ਕਰੋ</translation> @@ -4132,6 +4137,7 @@ <translation id="4556194354084985730">ਆਪਣੇ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡਾਂ ਨਾਲ ਸਾਈਟਾਂ ਅਤੇ ਐਪਾਂ ਵਿੱਚ ਆਸਾਨੀ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋ। ਬੰਦ ਹੋਣ 'ਤੇ, ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪੁੱਛਿਆ ਜਾਵੇਗਾ।</translation> <translation id="4558426062282641716">ਆਟੋ-ਲਾਂਚ ਇਜਾਜ਼ਤ ਦੀ ਬੇਨਤੀ ਕੀਤੀ</translation> <translation id="4559617833001311418">ਇਹ ਸਾਈਟ ਤੁਹਾਡੇ ਮੋਸ਼ਨ ਜਾਂ ਲਾਈਟ ਸੈਂਸਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਰਹੀ ਹੈ।</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> ਬੁੱਕਮਾਰਕ ਲਈ ਹੋਰ ਵਿਕਲਪ</translation> <translation id="4561893854334016293">ਕੋਈ ਹਾਲੀਆ ਬਦਲੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨਹੀਂ</translation> <translation id="4562155214028662640">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="4563210852471260509">ਅਰੰਭਿਕ ਇਨਪੁਟ ਭਾਸ਼ਾ ਚੀਨੀ ਹੈ</translation> @@ -4415,6 +4421,7 @@ <translation id="4819323978093861656">{0,plural, =0{ਹੁਣੇ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।}=1{ਇੰਨੇ ਸਮੇਂ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ: 1 second}other{ਇੰਨੇ ਸਮੇਂ ਵਿੱਚ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ: # seconds}}</translation> <translation id="4819607494758673676">Google Assistant ਸੂਚਨਾਵਾਂ</translation> <translation id="4820236583224459650">ਕਿਰਿਆਸ਼ੀਲ ਟਿਕਟ ਵਜੋਂ ਸੈੱਟ ਕਰੋ</translation> +<translation id="4820795723433418303">ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਨੂੰ ਸਿਖਰਲੀ ਕਤਾਰ ਦੀਆਂ ਕੁੰਜੀਆਂ ਵਜੋਂ ਵਰਤੋ</translation> <translation id="4821935166599369261">&ਪ੍ਰੋਫਾਈਲਿੰਗ ਸਮਰਥਿਤ</translation> <translation id="4823484602432206655">ਵਰਤੋਂਕਾਰ ਅਤੇ ਡੀਵਾਈਸ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ ਅਤੇ ਬਦਲੋ</translation> <translation id="4824037980212326045">Linux ਬੈਕਅੱਪ ਅਤੇ ਮੁੜ-ਬਹਾਲੀ</translation> @@ -4546,6 +4553,7 @@ <translation id="4925320384394644410">ਤੁਹਾਡੇ ਪੋਰਟ ਇੱਥੇ ਦਿਖਾਈ ਦੇਣਗੇ</translation> <translation id="49265687513387605">ਡੈਸਕਟਾਪ ਨੂੰ ਕਾਸਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਇਹ ਦੇਖਣ ਲਈ ਜਾਂਚ ਕਰੋ ਕਿ ਤੁਸੀਂ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਸਾਂਝਾ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਉਤਪ੍ਰੇਰਕ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਹੈ ਜਾਂ ਨਹੀਂ।</translation> <translation id="4927753642311223124">ਇੱਥੇ ਦੇਖਣ ਲਈ ਕੁਝ ਨਹੀਂ, ਨਾਲ-ਨਾਲ ਮੂਵ ਕਰੋ।</translation> +<translation id="4928629450964837566">ਜ਼ਿਆਦਾ ਸੁਰੱਖਿਅਤ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="4929386379796360314">ਪ੍ਰਿੰਟ ਲਈ ਨਿਯਤ ਥਾਂ</translation> <translation id="4930447554870711875">ਵਿਕਾਸਕਾਰ</translation> <translation id="4930714375720679147">ਚਾਲੂ ਕਰੋ</translation> @@ -4628,6 +4636,7 @@ <translation id="5010886807652684893">ਦ੍ਰਿਸ਼ਟੀਗਤ ਦ੍ਰਿਸ਼</translation> <translation id="5015344424288992913">ਪ੍ਰੌਕਸੀ ਨੂੰ ਹੱਲ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="5016491575926936899">ਤੁਸੀਂ ਆਪਣੇ ਕੰਪਿਊਟਰ ਤੋਂ ਲਿਖਤ ਸੁਨੇਹਾ ਭੇਜ ਸਕਦੇ ਹੋ, ਆਪਣਾ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ, ਗੱਲਬਾਤ ਸੂਚਨਾਵਾਂ ਦਾ ਜਵਾਬ ਦੇ ਸਕਦੇ ਹੋ ਅਤੇ ਆਪਣੇ ਫ਼ੋਨ ਨਾਲ ਆਪਣਾ <ph name="DEVICE_TYPE" /> ਅਣਲਾਕ ਕਰ ਸਕਦੇ ਹੋ।<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">ਕੋਈ ਨਵਾਂ ਪਾਸਵਰਡ ਵਰਤ ਕੇ ਦੇਖੋ</translation> <translation id="5017643436812738274">ਤੁਸੀਂ ਲਿਖਤ ਕਰਸਰ ਦੇ ਨਾਲ ਪੰਨਿਆਂ 'ਤੇ ਨੈਵੀਗੇਟ ਕਰ ਸਕਦੇ ਹੋ। ਬੰਦ ਕਰਨ ਲਈ Ctrl+Search+7 ਦਬਾਓ।</translation> <translation id="5018207570537526145">ਐਕਸਟੈਂਸ਼ਨ ਵੈੱਬਸਾਈਟ ਖੋਲ੍ਹੋ</translation> <translation id="5018526990965779848">ਵਰਤੋਂ ਅਤੇ ਤਸ਼ਖੀਸ ਡਾਟਾ ਭੇਜੋ। Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸ, ਡੀਵਾਈਸ ਅਤੇ ਐਪ ਵਰਤੋਂ ਡਾਟਾ ਭੇਜ ਕੇ ਆਪਣੇ Android ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ। ਇਸ ਨਾਲ ਸਿਸਟਮ ਅਤੇ ਐਪ ਸਥਿਰਤਾ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਮਿਲੇਗੀ। ਕੁਝ ਏਕੀਕ੍ਰਿਤ ਜਾਣਕਾਰੀ Google ਐਪਾਂ ਅਤੇ ਪਾਰਟਨਰਾਂ, ਜਿਵੇਂ ਕਿ Android ਵਿਕਾਸਕਾਰਾਂ ਦੀ ਵੀ ਮਦਦ ਕਰੇਗੀ। ਜੇ ਤੁਹਾਡੀ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> @@ -4696,6 +4705,7 @@ <translation id="5078638979202084724">ਸਾਰੀਆਂ ਟੈਬਾਂ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ</translation> <translation id="5078796286268621944">ਗ਼ਲਤ PIN</translation> <translation id="5079010647467150187">ਅੰਦਰ-ਮੌਜੂਦ VPN ਸ਼ਾਮਲ ਕਰੋ...</translation> +<translation id="5079699784114005398">ਚਾਲੂ ਹੋਣ 'ਤੇ, ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਿਸੇ ਵੀ ChromeOS ਡੀਵਾਈਸ 'ਤੇ ਆਪਣੇ Google ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ 'ਤੇ ਤੁਹਾਡੀਆਂ ਐਪਾਂ ਉਸ ਡੀਵਾਈਸ 'ਤੇ ਉਪਲਬਧ ਹੋਣਗੀਆਂ। Chrome ਬ੍ਰਾਊਜ਼ਰ ਤੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਵੈੱਬ ਐਪਾਂ ਨੂੰ ਸਿੰਕ ਕੀਤਾ ਜਾਵੇਗਾ, ਭਾਵੇਂ ਬ੍ਰਾਊਜ਼ਰ ਸਿੰਕ ਬੰਦ ਹੋਵੇ।</translation> <translation id="508059534790499809">Kerberos ਟਿਕਟ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="5081960376148623587">ਚੁਣੋ ਕਿ ਪੰਨਿਆਂ ਨੂੰ ਪ੍ਰੀਲੋਡ ਕਰਨਾ ਹੈ ਜਾਂ ਨਹੀਂ</translation> <translation id="5084328598860513926">ਪ੍ਰੋਵੀਜ਼ਨਿੰਗ ਦੇ ਵਹਾਅ ਵਿੱਚ ਵਿਘਨ ਪੈ ਗਿਆ ਸੀ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਦੇ ਮਾਲਕ ਜਾਂ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਗੜਬੜ ਕੋਡ: <ph name="ERROR_CODE" />।</translation> @@ -4771,6 +4781,7 @@ <translation id="5145464978649806571">ਜੇ ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ ਤੋਂ ਦੂਰ ਚਲੇ ਜਾਂਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਲਾਕ ਹੋ ਜਾਵੇਗੀ। ਜਦੋਂ ਤੁਸੀਂ ਆਪਣੇ ਡੀਵਾਈਸ ਦੇ ਸਾਹਮਣੇ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਜ਼ਿਆਦਾ ਦੇਰ ਤੱਕ ਸੁਚੇਤ ਰਹੇਗੀ। ਜੇ ਲਾਕ ਸਕ੍ਰੀਨ ਬੰਦ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਲਾਕ ਹੋਣ ਦੀ ਬਜਾਏ ਸਲੀਪ ਮੋਡ ਵਿੱਚ ਚਲਾ ਜਾਵੇਗਾ।</translation> <translation id="514575469079499857">ਟਿਕਾਣੇ ਦਾ ਪਤਾ ਲਗਾਉਣ ਲਈ ਆਪਣਾ IP ਪਤਾ ਵਰਤੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)</translation> <translation id="5146896637028965135">ਸਿਸਟਮ ਦੀ ਅਵਾਜ਼</translation> +<translation id="5147992672778369947">ਸਿਫ਼ਾਰਸ਼ੀ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="5148277445782867161">Google ਦੀ ਟਿਕਾਣਾ ਸੇਵਾ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ ਵਾਈ‑ਫਾਈ, ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਅਤੇ ਸੈਂਸਰਾਂ ਵਰਗੇ ਸਰੋਤਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ।</translation> <translation id="5150254825601720210">Netscape ਪ੍ਰਮਾਣ-ਪੱਤਰ SSL ਸਰਵਰ ਨਾਮ</translation> <translation id="5151354047782775295">ਡਿਸਕ ਜਗ੍ਹਾ ਨੂੰ ਖਾਲੀ ਕਰੋ ਨਹੀਂ ਤਾਂ ਚੋਣਵਾਂ ਡਾਟਾ ਆਪਣੇ ਆਪ ਮਿਟਾਇਆ ਜਾ ਸਕਦਾ ਹੈ</translation> @@ -5057,6 +5068,7 @@ <translation id="5414566801737831689">ਉਨ੍ਹਾਂ ਵੈੱਬਸਾਈਟਾਂ ਦੇ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਪੜ੍ਹੋ ਜਿਨ੍ਹਾਂ ਜਿਨ੍ਹਾਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਤੁਸੀਂ ਜਾਂਦੇ ਹੋ</translation> <translation id="5414836363063783498">ਪ੍ਰਮਾਣਿਤ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="5417312524372586921">ਬ੍ਰਾਊਜ਼ਰ ਥੀਮ</translation> +<translation id="5417353542809767994">ਤੁਰੰਤ ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="541737483547792035">ਸਕ੍ਰੀਨ ਨੂੰ ਵੱਡਦਰਸ਼ੀ ਸ਼ੀਸ਼ੇ ਨਾਲ ਵੱਡਾ ਕਰਨਾ</translation> <translation id="5419405654816502573">Voice match</translation> <translation id="5420274697768050645">ਵਾਧੂ ਸੁਰੱਖਿਆ ਲਈ ਡੀਵਾਈਸ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਵਾਸਤੇ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ</translation> @@ -5177,6 +5189,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android ਫ਼ੋਨ ਨਾਲ ਸੈੱਟਅੱਪ ਕਰੋ</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਨਾਲ ਇਸ ਖਾਤੇ ਨੂੰ ਹੋਰ ਸੁਰੱਖਿਅਤ ਰੱਖੋ। ਇਸ ਨੂੰ <ph name="EMAIL" /> ਲਈ <ph name="GOOGLE_PASSWORD_MANAGER" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="5521078259930077036">ਕੀ ਇਹ ਉਹੀ ਹੋਮ ਪੰਨਾ ਹੈ ਜਿਸਦੀ ਤੁਸੀਂ ਆਸ ਕਰ ਰਹੇ ਸੀ?</translation> <translation id="5522156646677899028">ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸੰਬੰਧੀ ਗੰਭੀਰ ਜੋਖਮ ਹੈ।</translation> <translation id="5522403133543437426">ਪਤਾ ਬਾਰ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ ਖੋਜ ਇੰਜਣ।</translation> @@ -5795,6 +5808,7 @@ <translation id="6070311415473175157">ਖੋਜਣ ਲਈ ਚਿੱਤਰ ਦਾ ਖੇਤਰ ਚੁਣੋ</translation> <translation id="6071181508177083058">ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="6071576563962215370">ਸਿਸਟਮ ਡੀਵਾਈਸ ਸਥਾਪਨਾ-ਸਮਾਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਾਕ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ।</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> ਮੈਮੋਰੀ ਬਚਾਈ ਗਈ</translation> <translation id="6072442788591997866">ਇਸ ਡੀਵਾਈਸ 'ਤੇ <ph name="APP_NAME" /> ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਗੜਬੜ ਕੋਡ: <ph name="ERROR_CODE" />।</translation> <translation id="6073451960410192870">ਰਿਕਾਰਡਿੰਗ ਬੰਦ ਕਰੋ</translation> <translation id="6073903501322152803">ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸ਼ਾਮਲ ਕਰੋ</translation> @@ -5842,6 +5856,7 @@ <translation id="6104068876731806426">Google ਖਾਤੇ</translation> <translation id="6104311680260824317">ਡੀਵਾਈਸ ਨੂੰ ਡੋਮੇਨ ਵਿੱਚ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਸਰਵਰ ਨਿਰਧਾਰਤ Kerberos ਇਨਕ੍ਰਿਪਸ਼ਨ ਦੀਆਂ ਕਿਸਮਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦਾ। ਇਨਕ੍ਰਿਪਸ਼ਨ ਸੈਟਿੰਗਾਂ ਦੇ ਲਈ "ਹੋਰ ਵਿਕਲਪ" ਦੇਖੋ।</translation> <translation id="6104796831253957966">ਪ੍ਰਿੰਟਰ ਦੀ ਕਤਾਰ ਭਰ ਚੁੱਕੀ ਹੈ</translation> +<translation id="6104929924898022309">ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਦੇ ਵਿਹਾਰ ਨੂੰ ਬਦਲਣ ਲਈ ਖੋਜ ਕੁੰਜੀ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="6106167152849320869">ਜੇ ਤੁਸੀਂ ਪਿਛਲੇ ਪੜਾਅ 'ਤੇ ਵੀ ਤਸ਼ਖੀਸ ਅਤੇ ਵਰਤੋਂ ਡਾਟਾ ਨੂੰ ਭੇਜਣ ਦੀ ਚੋਣ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਡਾਟਾ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਲਈ ਇਕੱਤਰ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="6111972606040028426">Google Assistant ਚਾਲੂ ਕਰੋ</translation> <translation id="6112294629795967147">ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ</translation> @@ -5983,6 +5998,7 @@ <translation id="6234108445915742946">Chrome ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮ 31 ਮਾਰਚ ਨੂੰ ਬਦਲ ਰਹੇ ਹਨ</translation> <translation id="6234474535228214774">ਸਥਾਪਨਾ ਵਿਚਾਰ-ਅਧੀਨ ਹੈ</translation> <translation id="6235208551686043831">ਡੀਵਾਈਸ ਦਾ ਕੈਮਰਾ ਚਾਲੂ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਈ-ਸਿਮ QR ਕੋਡ ਕੈਮਰੇ ਦੇ ਸਾਹਮਣੇ ਰੱਖੋ।</translation> +<translation id="6237297174664969437">ਤੁਸੀਂ Chrome ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਕਿਸੇ ਵੀ ਵੇਲੇ ਇਹ ਚੁਣ ਸਕਦੇ ਹੋ ਕਿ ਕਿਹੜਾ ਬ੍ਰਾਊਜ਼ਰ ਡਾਟਾ ਸਿੰਕ ਕਰਨਾ ਹੈ। <ph name="LINK_BEGIN" />ਡੀਵਾਈਸ ਸੈਟਿੰਗਾਂ<ph name="LINK_END" /> ਵਿੱਚ, ਤੁਸੀਂ Chrome ਬ੍ਰਾਊਜ਼ਰ ਤੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਵੈੱਬ ਐਪਾਂ ਲਈ ਸਿੰਕ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹੋ। Google ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੇ ਆਧਾਰ 'ਤੇ Search ਅਤੇ ਹੋਰ ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾ ਸਕਦਾ ਹੈ।</translation> <translation id="6237474966939441970">ਸਟਾਈਲਸ ਨੋਟ-ਕਥਨ ਬਣਾਉਣ ਵਾਲੀ ਐਪ</translation> <translation id="623755660902014047">ਪੜ੍ਹਨ ਦਾ ਮੋਡ</translation> <translation id="6238767809035845642">ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ ਤੋਂ ਸਾਂਝੀ ਕੀਤੀ ਲਿਖਤ</translation> @@ -6316,6 +6332,7 @@ <translation id="6537613839935722475">ਨਾਮ ਲਈ ਅੱਖਰ, ਨੰਬਰ ਅਤੇ ਹਾਈਫਨ (-) ਵਰਤੇ ਜਾ ਸਕਦੇ ਹਨ</translation> <translation id="6538098297809675636">ਕੋਡ ਦਾ ਪਤਾ ਲਗਾਉਣ ਵੇਲੇ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="653920215766444089">ਪੁਆਇੰਟਰ ਵਾਲਾ ਡੀਵਾਈਸ ਖੋਜਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="6539674013849300372">ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਨਾਲ ਆਨਲਾਈਨ ਸੁਰੱਖਿਅਤ ਰਹੋ। ਇਸ ਨੂੰ <ph name="EMAIL" /> ਲਈ <ph name="GOOGLE_PASSWORD_MANAGER" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="653983593749614101">ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ਨੋਟ:<ph name="END_BOLD" /> ਸਿਰਫ਼ ਤਾਂ ਹੀ ਚਾਲੂ ਕਰੋ ਜੇਕਰ ਤੁਹਾਨੂੰ ਪਤਾ ਹੈ ਕਿ ਤੁਸੀਂ ਕੀ ਕਰ ਰਹੇੇ ਹੋ ਜਾਂ ਜੇਕਰ ਤੁਹਾਨੂੰ ਅਜਿਹਾ ਕਰਨ ਲਈ ਕਿਹਾ ਗਿਆ ਹੈ, ਕਿਉਂਕਿ ਡਾਟਾ ਦਾ ਇਕੱਤਰੀਕਰਨ ਕਾਰਗੁਜ਼ਾਰੀ ਘਟਾ ਸਕਦਾ ਹੈ।</translation> <translation id="6541638731489116978">ਇਸ ਸਾਈਟ ਨੂੰ ਤੁਹਾਡੇ ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ।</translation> @@ -6513,6 +6530,7 @@ <translation id="671226373742585927">ਸਾਈਡ ਪੈਨਲ ਬੰਦ ਕਰਨ ਲਈ "X" ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ</translation> <translation id="6712943853047024245">ਤੁਸੀਂ ਪਹਿਲਾਂ ਹੀ <ph name="WEBSITE" /> ਲਈ ਇਸ ਵਰਤੋਂਕਾਰ ਨਾਮ ਨਾਲ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰ ਲਿਆ ਹੈ</translation> <translation id="6713233729292711163">ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਸ਼ਾਮਲ ਕਰੋ</translation> +<translation id="6713441551032149301">ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਅਤੇ ਸਿਖਰਲੀ ਕਤਾਰ ਦੀਆਂ ਕੁੰਜੀਆਂ ਵਿਚਾਲੇ ਬਦਲੀ ਕਰਨ ਲਈ ਲਾਂਚਰ ਕੁੰਜੀ ਨੂੰ ਦਬਾ ਕੇ ਰੱਖੋ</translation> <translation id="6713668088933662563">ਕਦੇ ਵੀ ਇਨ੍ਹਾਂ ਭਾਸ਼ਾਵਾਂ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਨਾ ਕਰੋ</translation> <translation id="6715803357256707211">ਤੁਹਾਡੀ Linux ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਸਥਾਪਨਾ ਦੌਰਾਨ ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਵੇਰਵਿਆਂ ਲਈ ਸੂਚਨਾਵਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="671619610707606484">ਇੰਝ ਕਰਨ ਨਾਲ ਸਾਈਟਾਂ ਦੇ ਸਟੋਰ ਕੀਤੇ <ph name="TOTAL_USAGE" /> ਡਾਟੇ ਨੂੰ ਕਲੀਅਰ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> @@ -6634,6 +6652,7 @@ <translation id="6811034713472274749">ਦੇਖਣ ਲਈ ਪੰਨਾ ਤਿਆਰ ਹੈ</translation> <translation id="6811151703183939603">ਮਜ਼ਬੂਤ</translation> <translation id="6811332638216701903">DHCP ਹੋਸਟਨਾਮ</translation> +<translation id="6811792477922751991">ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਦੇ ਵਿਹਾਰ ਨੂੰ ਬਦਲਣ ਲਈ ਲਾਂਚਰ ਕੁੰਜੀ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> ਰੂਟ ਦੇ ਤੌਰ ਤੇ ਨਹੀਂ ਚਲਾਇਆ ਜਾ ਸਕਦਾ।</translation> <translation id="6812841287760418429">ਬਦਲਾਵ ਰੱਖੋ</translation> <translation id="6813907279658683733">ਪੂਰੀ ਸਕ੍ਰੀਨ</translation> @@ -7827,6 +7846,7 @@ <translation id="7851720427268294554">IPP ਪਾਰਸਰ</translation> <translation id="78526636422538552">ਹੋਰ Google ਖਾਤੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਵਿਕਲਪ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation> <translation id="7853747251428735">ਹੋਰ ਟੂ&ਲਸ</translation> +<translation id="7853999103056713222">ਜ਼ਿਆਦਾ ਸੁਰੱਖਿਅਤ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="7855678561139483478">ਟੈਬ ਨੂੰ ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਲਿਜਾਓ</translation> <translation id="7857004848504343806">ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਵਿੱਚ ਕੋਈ ਅਜਿਹਾ ਸੁਰੱਖਿਆ ਮਾਡਿਊਲ ਹੈ, ਜਿਸਨੂੰ ChromeOS Flex ਵਿਚਲੀਆਂ ਕਈ ਮਹੱਤਵਪੂਰਨ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ Chromebook ਦੇ ਮਦਦ ਕੇਂਦਰ 'ਤੇ ਜਾਓ: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">ਲਿਖਤ ਸੁਝਾਅ</translation> @@ -8381,6 +8401,7 @@ <translation id="8325413836429495820">ਤੁਹਾਡੇ ਕਲਿੱਪਬੋਰਡ ਨੂੰ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="8326478304147373412">PKCS #7, ਪ੍ਰਮਾਣ-ਪੱਤਰ ਚੇਨ</translation> <translation id="8327386430364625757">ਗਣਿਤਕ ਫ਼ੌਂਟ</translation> +<translation id="8327538105740918488">ਤੁਸੀਂ ਇਸ ਪਾਸਵਰਡ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਕਦੇ ਵੀ ਬਦਲ ਸਕਦੇ ਹੋ। ਇਸ ਨੂੰ <ph name="EMAIL" /> ਲਈ <ph name="GOOGLE_PASSWORD_MANAGER" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="8327676037044516220">ਇਜਾਜ਼ਤਾਂ ਅਤੇ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ</translation> <translation id="8330617762701840933">ਉਨ੍ਹਾਂ ਵੈੱਬਸਾਈਟਾਂ ਦੀ ਸੂਚੀ ਜੋ ਵਿਕਲਪਿਕ ਬ੍ਰਾਊਜ਼ਰ 'ਤੇ ਰੀਡਾਇਰੈਕਟ ਹੁੰਦੀਆਂ ਹਨ।</translation> <translation id="8330689128072902965">ਨਜ਼ਦੀਕੀ ਸੰਪਰਕ ਤੁਹਾਡੇ ਨਾਲ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹਨ। ਬਦਲਣ ਲਈ ਕਲਿੱਕ ਕਰੋ।</translation> @@ -8526,6 +8547,7 @@ <translation id="8449836157089738489">ਸਾਰਿਆਂ ਨੂੰ ਨਵੇਂ ਟੈਬ ਗਰੁੱਪ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="8451512073679317615">ਸਹਾਇਕ</translation> <translation id="845702320058262034">ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦਾ ਬਲੂਟੁੱਥ ਚਾਲੂ ਹੈ।</translation> +<translation id="8457251154056341970">ਤੁਹਾਨੂੰ ਇਸ ਪੰਨੇ 'ਤੇ <ph name="MODULE_NAME" /> ਦੁਬਾਰਾ ਨਹੀਂ ਦਿਸੇਗਾ</translation> <translation id="8457451314607652708">ਬੁੱਕਮਾਰਕ ਆਯਾਤ ਕਰੋ</translation> <translation id="8458341576712814616">ਸ਼ਾਰਟਕੱਟ</translation> <translation id="8458627787104127436">ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਸਾਰੇ (<ph name="URL_COUNT" />) ਖੋਲ੍ਹੋ</translation> @@ -8598,6 +8620,7 @@ <translation id="8514955299594277296">ਸਾਈਟਾਂ ਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਡਾਟਾ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਆਗਿਆ ਨਾ ਦਿਓ (ਸਿਫ਼ਾਰਸ਼ੀ ਨਹੀਂ)</translation> <translation id="8517759303731677493">ਸੰਪਾਦਨ ਕਰੋ…</translation> <translation id="8519895319663397036">ਪਾਸਵਰਡਾਂ ਨੂੰ ਆਯਾਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਫ਼ਾਈਲ ਦਾ ਆਕਾਰ 150 KB ਤੋਂ ਘੱਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।</translation> +<translation id="851991974800416566">ਤੁਰੰਤ ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation> <translation id="8523493869875972733">ਤਬਦੀਲੀਆਂ ਰੱਖੋ</translation> <translation id="8523849605371521713">ਨੀਤੀ ਵੱਲੋਂ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ</translation> <translation id="8524783101666974011">ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਕਾਰਡ ਰੱਖਿਅਤ ਕਰੋ</translation> @@ -8755,6 +8778,7 @@ <translation id="8665110742939124773">ਤੁਸੀਂ ਗਲਤ ਪਹੁੰਚ ਕੋਡ ਦਾਖਲ ਕੀਤਾ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="8665180165765946056">ਬੈਕਅੱਪ ਪੂਰਾ ਹੋਇਆ</translation> <translation id="866611985033792019">ਈਮੇਲ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਪਛਾਣ ਕਰਨ ਲਈ ਇਸ ਪ੍ਰਮਾਣ-ਪੱਤਰ 'ਤੇ ਭਰੋਸਾ ਕਰੋ</translation> +<translation id="8666268818656583275">ਹੁਣ F ਕੁੰਜੀਆਂ ਦਾ ਵਿਹਾਰ ਸਿਸਟਮ ਦੀ ਸਿਖਰਲੀ ਕਤਾਰ ਦੀਆਂ ਕੁੰਜੀਆਂ ਵਾਂਗ ਹੋਵੇਗਾ</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> ਲਈ ਇਜਾਜ਼ਤਾਂ ਦੀ ਦੁਬਾਰਾ ਆਗਿਆ ਦਿੱਤੀ ਗਈ</translation> <translation id="8666759526542103597">ਬ੍ਰਾਊਜ਼ਰ-ਆਧਾਰਿਤ ਵਿਗਿਆਪਨ ਵਿਅਕਤੀਗਤਕਰਨ ਬਾਰੇ</translation> <translation id="8667261224612332309">ਤੁਹਾਡੇ ਕੋਲ ਅਜਿਹੇ ਪਾਸਵਰਡ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ</translation> @@ -9438,6 +9462,7 @@ <translation id="950307215746360464">ਸੈੱਟਅੱਪ ਗਾਈਡ</translation> <translation id="951991426597076286">ਅਸਵੀਕਾਰ ਕਰੋ</translation> <translation id="952471655966876828">ਡੀਵਾਈਸ ਦੇ ਚਾਲੂ ਹੋਣ 'ਤੇ ਅਤੇ ਵਰਤੋਂ ਵਿੱਚ ਹੋਣ 'ਤੇ ਇਹ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਕਨੈਕਟ ਹੋ ਜਾਵੇਗਾ</translation> +<translation id="952880932803612259">ਐਪਾਂ, ਵੈੱਬਸਾਈਟਾਂ ਅਤੇ ਸਿਸਟਮ ਸੇਵਾਵਾਂ ਨੂੰ ਆਪਣੇ ਟਿਕਾਣੇ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ। ਟਿਕਾਣਾ ਸੇਵਾ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣ ਵਿੱਚ ਮਦਦ ਲਈ ਵਾਈ-ਫਾਈ, ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਅਤੇ ਸੈਂਸਰਾਂ ਵਰਗੇ ਸਰੋਤਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀ ਹੈ।</translation> <translation id="953434574221655299">ਤੁਹਾਡੇ ਵੱਲੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਸਰਗਰਮੀ ਨਾਲ ਵਰਤਣ ਦੇ ਸਮੇਂ ਨੂੰ ਜਾਣਨ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> <translation id="956500788634395331">ਤੁਸੀਂ ਸੰਭਾਵੀ ਤੌਰ 'ਤੇ ਨੁਕਸਾਨਦੇਹ ਐਕਸਟੈਂਸ਼ਨਾਂ ਤੋਂ ਸੁਰੱਖਿਅਤ ਹੋ</translation> <translation id="957179356621191750">6-ਬਿੰਦੂ</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index c7433d3..a50ea2b 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Закрыть вкладки справа</translation> <translation id="1166583374608765787">Проверьте новое название</translation> <translation id="1166596238782048887">Вкладка "<ph name="TAB_TITLE" />" находится на рабочем столе "<ph name="DESK_TITLE" />"</translation> +<translation id="1167262726334064738">Попробуйте новый пароль</translation> <translation id="1168020859489941584">Открытие через <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Автоматически устанавливать язык, соответствующий выбранному контенту</translation> <translation id="1169266963600477608">Настройки игры</translation> @@ -909,6 +910,7 @@ <translation id="177336675152937177">Данные размещаемых приложений</translation> <translation id="1776712937009046120">Добавить пользователя</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Удерживайте клавишу поиска, чтобы переключаться между функциональными клавишами и системными клавишами верхнего ряда</translation> <translation id="1778457539567749232">Отметить как непрочитанное</translation> <translation id="1778991607452011493">Отправить журналы отладки (рекомендуется)</translation> <translation id="1779441632304440041">Простые пароли легко подобрать. Устанавливайте надежные пароли.</translation> @@ -1350,6 +1352,7 @@ <translation id="2142582065325732898">Чтобы посмотреть недавние вкладки, включите <ph name="LINK1_BEGIN" />синхронизацию Chrome<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Подробнее…<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Всегда показывать панель инструментов в полноэкранном режиме</translation> <translation id="2143778271340628265">Настройка прокси-сервера вручную</translation> +<translation id="2143808295261240440">Используйте рекомендуемый пароль</translation> <translation id="2143915448548023856">Настройки экрана</translation> <translation id="2144536955299248197">Инструмент просмотра сертификатов: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Разработка приложений для Android в Linux</translation> @@ -2335,6 +2338,7 @@ <translation id="2963151496262057773">Плагин "<ph name="PLUGIN_NAME" />" перестал отвечать на запросы. Остановить его?</translation> <translation id="2964193600955408481">Отключить Wi-Fi</translation> <translation id="2964245677645334031">Обмен с окружением: доступ</translation> +<translation id="2966705348606485669">Настройка папки "<ph name="FOLDER_TITLE" />" с закладками</translation> <translation id="2966937470348689686">Управление настройками Android</translation> <translation id="2967926928600500959">URL, соответствующие этим правилам, будут принудительно открываться в определенном браузере.</translation> <translation id="2972581237482394796">&Повторить</translation> @@ -2624,6 +2628,7 @@ <translation id="3244294424315804309">Не включать звук</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" />: ошибка сети</translation> <translation id="3248902735035392926">Безопасность – это важно. <ph name="BEGIN_LINK" />Проверьте расширения<ph name="END_LINK" />, которые у вас установлены.</translation> +<translation id="3249323165366527554">Пароль будет автоматически сохранен для аккаунта <ph name="EMAIL" /> здесь: <ph name="GOOGLE_PASSWORD_MANAGER" />. Это позволит ускорить регистрацию и вход в сервисы.</translation> <translation id="3251714896659475029">Разрешите пользователю <ph name="SUPERVISED_USER_NAME" /> вызывать Ассистента с помощью команды "Окей, Google"</translation> <translation id="3251759466064201842"><Не является частью сертификата></translation> <translation id="325238099842880997">Задайте базовые правила, чтобы сбалансировать учебу, игры и отдых ребенка</translation> @@ -4118,6 +4123,7 @@ <translation id="4556194354084985730">Легко входите на сайты и в приложения с помощью сохраненных паролей. Если функция отключена, система будет запрашивать подтверждение при каждом входе.</translation> <translation id="4558426062282641716">Требуется разрешение на автозапуск</translation> <translation id="4559617833001311418">Этот сайт может использовать датчики движения и освещенности.</translation> +<translation id="4560728518401799797">Настройка закладки "<ph name="FOLDER_TITLE" />"</translation> <translation id="4561893854334016293">Недавних изменений в разрешениях не найдено.</translation> <translation id="4562155214028662640">Добавить отпечаток пальца</translation> <translation id="4563210852471260509">Первоначальный язык ввода – китайский</translation> @@ -4401,6 +4407,7 @@ <translation id="4819323978093861656">{0,plural, =0{Браузер закрыт.}=1{Браузер будет закрыт через 1 секунду.}one{Браузер будет закрыт через # секунду.}few{Браузер будет закрыт через # секунды.}many{Браузер будет закрыт через # секунд.}other{Браузер будет закрыт через # секунды.}}</translation> <translation id="4819607494758673676">Уведомления Google Ассистента</translation> <translation id="4820236583224459650">Выбрать в качестве активного билета</translation> +<translation id="4820795723433418303">Использовать функциональные клавиши как клавиши верхнего ряда</translation> <translation id="4821935166599369261">&Сбор данных включен</translation> <translation id="4823484602432206655">Просмотр и изменение настроек для пользователей и устройств</translation> <translation id="4824037980212326045">Резервное копирование и восстановление Linux</translation> @@ -4532,6 +4539,7 @@ <translation id="4925320384394644410">Здесь появятся порты.</translation> <translation id="49265687513387605">Не удается транслировать экран. Убедитесь, что вы открыли доступ к нему.</translation> <translation id="4927753642311223124">Оповещений нет.</translation> +<translation id="4928629450964837566">Используйте более надежный пароль</translation> <translation id="4929386379796360314">Места назначения печати</translation> <translation id="4930447554870711875">Для разработчиков</translation> <translation id="4930714375720679147">Включить</translation> @@ -4614,6 +4622,7 @@ <translation id="5010886807652684893">Расширенный вид</translation> <translation id="5015344424288992913">Определение прокси-сервера...</translation> <translation id="5016491575926936899">Вы сможете отправлять с компьютера SMS, пользоваться на нем подключением к мобильному интернету и отвечать на сообщения в чатах. Также можно будет разблокировать <ph name="DEVICE_TYPE" /> с помощью телефона.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Попробуйте новый пароль</translation> <translation id="5017643436812738274">Вы сможете использовать курсор для навигации по страницам. Чтобы отключить эту функцию, нажмите Ctrl + Поиск + 7.</translation> <translation id="5018207570537526145">Перейти на сайт разработчика</translation> <translation id="5018526990965779848">Отправка данных об использовании и диагностике. Помогите сделать Android ещё лучше – разрешите автоматически отправлять в Google диагностическую информацию, данные об использовании приложений и самого устройства. Эти сведения помогут нам повысить стабильность приложений и внести другие улучшения. Некоторые агрегированные данные пригодятся партнерам Google, например разработчикам Android. Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в вашем аккаунте.</translation> @@ -4682,6 +4691,7 @@ <translation id="5078638979202084724">Добавить все вкладки в закладки</translation> <translation id="5078796286268621944">Неверный PIN-код</translation> <translation id="5079010647467150187">Добавить встроенную VPN</translation> +<translation id="5079699784114005398">Если вы включите этот параметр, ваши приложения станут доступны на всех устройствах с ChromeOS, на которых вы вошли в свой аккаунт Google. Веб-приложения, установленные из браузера Chrome, будут синхронизированы даже если синхронизация браузера отключена.</translation> <translation id="508059534790499809">Обновить билет Kerberos</translation> <translation id="5081960376148623587">Настройка предзагрузки страниц</translation> <translation id="5084328598860513926">Подготовка к использованию была прервана. Повторите попытку или обратитесь к владельцу или администратору устройства. Код ошибки: <ph name="ERROR_CODE" />.</translation> @@ -4757,6 +4767,7 @@ <translation id="5145464978649806571">Когда вы отходите от своего устройства, его экран автоматически блокируется. Если вы перед экраном, он остается включенным дольше. Если вы не используете блокировку экрана, устройство переходит в спящий режим.</translation> <translation id="514575469079499857">Использовать для определения местоположения IP-адрес (по умолчанию)</translation> <translation id="5146896637028965135">Голос по умолчанию</translation> +<translation id="5147992672778369947">Используйте рекомендуемый пароль</translation> <translation id="5148277445782867161">Для определения местоположения устройства мы используем различные источники, например сети Wi-Fi, мобильные сети и датчики.</translation> <translation id="5150254825601720210">Имя сервера SSL-сертификатов Netscape</translation> <translation id="5151354047782775295">Освободите пространство или выберите данные для автоматического удаления.</translation> @@ -5043,6 +5054,7 @@ <translation id="5414566801737831689">Доступ к значкам посещаемых сайтов</translation> <translation id="5414836363063783498">Проверка…</translation> <translation id="5417312524372586921">Темы браузера</translation> +<translation id="5417353542809767994">Используйте надежный пароль</translation> <translation id="541737483547792035">Экранная лупа</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">В целях безопасности запрашивать пароль для разблокировки устройства</translation> @@ -5163,6 +5175,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Настроить с помощью телефона Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Защитите свои данные с помощью надежного пароля. Он будет сохранен для аккаунта <ph name="EMAIL" /> здесь: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="5521078259930077036">Другая главная страница?</translation> <translation id="5522156646677899028">В этом расширении обнаружена серьезная уязвимость, угрожающая безопасности.</translation> <translation id="5522403133543437426">Поисковая система, используемая в адресной строке.</translation> @@ -5781,6 +5794,7 @@ <translation id="6070311415473175157">Выберите область изображения для поиска</translation> <translation id="6071181508177083058">подтвердите пароль</translation> <translation id="6071576563962215370">Системе не удалось заблокировать атрибуты устройства на время установки.</translation> +<translation id="6071938745001252305">Освобождено ресурсов памяти: <ph name="MEMORY_VALUE" /></translation> <translation id="6072442788591997866">На этом устройстве запрещено использовать <ph name="APP_NAME" />. Обратитесь к администратору. Код ошибки: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Остановить запись</translation> <translation id="6073903501322152803">Добавить специальные возможности</translation> @@ -5828,6 +5842,7 @@ <translation id="6104068876731806426">Аккаунты Google</translation> <translation id="6104311680260824317">Не удалось подключить устройство к домену. Сервер не поддерживает выбранные типы шифрования Kerberos. В настройках шифрования установите флажок "Другие параметры".</translation> <translation id="6104796831253957966">Очередь печати заполнена.</translation> +<translation id="6104929924898022309">Использовать клавишу поиска, чтобы изменять назначение функциональных клавиш</translation> <translation id="6106167152849320869">Если на предыдущем шаге вы разрешили отправлять данные об использовании и диагностике, эти сведения будут собираться для установленных приложений.</translation> <translation id="6111972606040028426">Включить Google Ассистента</translation> <translation id="6112294629795967147">Коснитесь для изменения размера</translation> @@ -5969,6 +5984,7 @@ <translation id="6234108445915742946">Условия использования Chrome будут обновлены 31 марта</translation> <translation id="6234474535228214774">Ожидание установки…</translation> <translation id="6235208551686043831">Камера устройства включена. Разместите QR-код eSIM перед объективом.</translation> +<translation id="6237297174664969437">Вы всегда можете выбрать, какие данные браузера синхронизировать, в настройках Chrome. Параметры синхронизации приложений, установленных из браузера Chrome, задаются в <ph name="LINK_BEGIN" />настройках устройства<ph name="LINK_END" />. Google может использовать историю ваших действий для персонализации Поиска и других сервисов.</translation> <translation id="6237474966939441970">Приложение для создания заметок с помощью стилуса</translation> <translation id="623755660902014047">Режим чтения</translation> <translation id="6238767809035845642">Текст, полученный с другого устройства</translation> @@ -6302,6 +6318,7 @@ <translation id="6537613839935722475">Допускаются буквы, цифры и дефисы.</translation> <translation id="6538098297809675636">При распознавании кода произошла ошибка.</translation> <translation id="653920215766444089">Поиск указывающего устройства</translation> +<translation id="6539674013849300372">Надежный пароль поможет обеспечить вашу безопасность в интернете. Он будет сохранен для аккаунта <ph name="EMAIL" /> здесь: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="653983593749614101">Возобновление скачивания…</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Примечание.<ph name="END_BOLD" /> Данную функцию следует включать только при необходимости, поскольку сбор данных может замедлить работу системы.</translation> <translation id="6541638731489116978">Этому сайту закрыт доступ к датчикам движения.</translation> @@ -6502,6 +6519,7 @@ <translation id="671226373742585927">Чтобы закрыть боковую панель, нажмите на значок "X"</translation> <translation id="6712943853047024245">Для этого имени пользователя на сайте <ph name="WEBSITE" /> уже сохранен пароль.</translation> <translation id="6713233729292711163">Добавить рабочий профиль</translation> +<translation id="6713441551032149301">Удерживайте клавишу панели запуска, чтобы переключаться между функциональными клавишами и системными клавишами верхнего ряда</translation> <translation id="6713668088933662563">Никогда не предлагать перевести страницы на этих языках</translation> <translation id="6715803357256707211">При установке приложения для Linux произошла ошибка. Чтобы узнать больше, нажмите на уведомление.</translation> <translation id="671619610707606484">Будут удалены сохраненные данные сайтов (<ph name="TOTAL_USAGE" />).</translation> @@ -6623,6 +6641,7 @@ <translation id="6811034713472274749">Страница загружена</translation> <translation id="6811151703183939603">Сильный</translation> <translation id="6811332638216701903">Имя хоста DHCP</translation> +<translation id="6811792477922751991">Использовать клавишу панели запуска, чтобы изменять назначение функциональных клавиш</translation> <translation id="6812349420832218321">Нельзя запускать <ph name="PRODUCT_NAME" /> от имени суперпользователя.</translation> <translation id="6812841287760418429">Сохранить изменения</translation> <translation id="6813907279658683733">Весь экран</translation> @@ -7816,6 +7835,7 @@ <translation id="7851720427268294554">Синтаксический анализатор IPP</translation> <translation id="78526636422538552">Добавлять другие аккаунты Google нельзя.</translation> <translation id="7853747251428735">Дополнительные инструмен&ты</translation> +<translation id="7853999103056713222">Используйте более надежный пароль</translation> <translation id="7855678561139483478">Открыть вкладку в новом окне</translation> <translation id="7857004848504343806">Компьютер оснащен модулем безопасности, с помощью которого в Chrome OS Flex реализовано множество критически важных функций защиты. Более подробную информацию можно получить в Справочном центре Chromebook: https://support.google.com/chromebook/?p=sm.</translation> <translation id="7857093393627376423">Текстовые подсказки</translation> @@ -8371,6 +8391,7 @@ <translation id="8325413836429495820">Запретить сайтам просматривать буфер обмена</translation> <translation id="8326478304147373412">PKCS #7, цепочка сертификатов</translation> <translation id="8327386430364625757">Математический шрифт</translation> +<translation id="8327538105740918488">Этот пароль можно изменить в любое время. Он будет сохранен для аккаунта <ph name="EMAIL" /> здесь: <ph name="GOOGLE_PASSWORD_MANAGER" />.</translation> <translation id="8327676037044516220">Разрешения и настройки контента</translation> <translation id="8330617762701840933">Список сайтов, которые открываются в альтернативном браузере.</translation> <translation id="8330689128072902965">Контакты рядом могут обмениваться с вами данными. Нажмите, чтобы изменить.</translation> @@ -8516,6 +8537,7 @@ <translation id="8449836157089738489">Открыть все URL в новой группе вкладок</translation> <translation id="8451512073679317615">Ассистент</translation> <translation id="845702320058262034">Не удается подключиться к телефону. Убедитесь, что на нем включен Bluetooth.</translation> +<translation id="8457251154056341970">Модуль "<ph name="MODULE_NAME" />" больше не будет показываться на этой странице.</translation> <translation id="8457451314607652708">Импортировать закладки</translation> <translation id="8458341576712814616">Быстрая команда</translation> <translation id="8458627787104127436">Открыть все (<ph name="URL_COUNT" />) в новом окне</translation> @@ -8588,6 +8610,7 @@ <translation id="8514955299594277296">Запретить сайтам сохранять данные на устройстве (не рекомендуется)</translation> <translation id="8517759303731677493">Изменить…</translation> <translation id="8519895319663397036">Не удалось импортировать пароли. Размер файла должен быть меньше 150 КБ.</translation> +<translation id="851991974800416566">Используйте надежный пароль</translation> <translation id="8523493869875972733">Закрыть</translation> <translation id="8523849605371521713">Добавлено по правилу</translation> <translation id="8524783101666974011">Сохраните карты в аккаунте Google</translation> @@ -8745,6 +8768,7 @@ <translation id="8665110742939124773">Введен неверный код доступа. Повторите попытку.</translation> <translation id="8665180165765946056">Готово</translation> <translation id="866611985033792019">Доверять этому сертификату для идентификации адресов электронной почты</translation> +<translation id="8666268818656583275">Функциональные клавиши будут работать как системные клавиши верхнего ряда</translation> <translation id="8666321716757704924">Разрешения для <ph name="WEBSITE" /> снова предоставлены.</translation> <translation id="8666759526542103597">О персонализации рекламы на основе данных браузера</translation> <translation id="8667261224612332309">Некоторые пароли можно заменить на более надежные</translation> @@ -9430,6 +9454,7 @@ <translation id="950307215746360464">Мастер настройки</translation> <translation id="951991426597076286">Отклонить</translation> <translation id="952471655966876828">Устройство подключится автоматически, если его включат и будут использовать.</translation> +<translation id="952880932803612259">Разрешить приложениям, сайтам и системным сервисам использовать данные о том, где вы находитесь. Местоположение вашего устройства может определяться с помощью Wi-Fi, датчиков и мобильных сетей.</translation> <translation id="953434574221655299">Сайты, которым разрешен доступ к информации об использовании устройства</translation> <translation id="956500788634395331">Включена защита от потенциально опасных расширений.</translation> <translation id="957179356621191750">6-точечный</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 1d2ecd6..25d55393 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -204,6 +204,7 @@ <translation id="1166212789817575481">Zapri zavihke na desni</translation> <translation id="1166583374608765787">Pregled posodobitve imena</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> pripada namizju <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Preizkusite novo geslo</translation> <translation id="1168020859489941584">Odpiranje čez <ph name="TIME_REMAINING" /> ...</translation> <translation id="116896278675803795">Samodejno spreminjanje jezika, da se ujema z izbrano vsebino.</translation> <translation id="1169266963600477608">Kontrolniki za igre</translation> @@ -921,6 +922,7 @@ <translation id="177336675152937177">Podatki gostujočih aplikacij</translation> <translation id="1776712937009046120">Dodaj uporabnika</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Če želite preklopiti med funkcijskimi in sistemskimi tipkami v zgornji vrstici, pridržite tipko za iskanje</translation> <translation id="1778457539567749232">Označitev kot neprebrano</translation> <translation id="1778991607452011493">Pošiljanje dnevnikov o odpravljanju napak (priporočeno)</translation> <translation id="1779441632304440041">Šibka gesla je preprosto ugotoviti. Ustvarite zapletena gesla.</translation> @@ -1363,6 +1365,7 @@ <translation id="2142582065325732898">Vklopite <ph name="LINK1_BEGIN" />sinhronizacijo za Chrome<ph name="LINK1_END" />, če si želite ogledati nedavne Chromove zavihke. <ph name="LINK2_BEGIN" />Več o tem<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Always Show Toolbar in Full Screen</translation> <translation id="2143778271340628265">Ročna konfiguracija strežnika proxy</translation> +<translation id="2143808295261240440">Uporabite priporočeno geslo</translation> <translation id="2143915448548023856">Nastavitve zaslona</translation> <translation id="2144536955299248197">Pregledovalnik potrdila: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Razvoj aplikacij za Android v Linuxu</translation> @@ -2351,6 +2354,7 @@ <translation id="2963151496262057773">Ta vtičnik se ne odziva: <ph name="PLUGIN_NAME" />. Ali ga želite ustaviti?</translation> <translation id="2964193600955408481">Onemogoči Wi-Fi</translation> <translation id="2964245677645334031">Vidnost deljenja v bližini</translation> +<translation id="2966705348606485669">Več možnosti za mapo z zaznamki <ph name="FOLDER_TITLE" />.</translation> <translation id="2966937470348689686">Upravljanje nastavitev Androida</translation> <translation id="2967926928600500959">URL-ji, ki se ujemajo s temi pravili, bodo vsiljeno odprti v določenem brskalniku.</translation> <translation id="2972581237482394796">&Uveljavi</translation> @@ -2640,6 +2644,7 @@ <translation id="3244294424315804309">Zvok naj bo še naprej izklopljen</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – napaka omrežja</translation> <translation id="3248902735035392926">Varnost je pomembna. Vzemite si trenutek in <ph name="BEGIN_LINK" />preverite razširitve<ph name="END_LINK" />.</translation> +<translation id="3249323165366527554">Registrirajte se in se hitreje prijavite, če se geslo samodejno shrani v storitvi <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Dovolite, da otrok <ph name="SUPERVISED_USER_NAME" /> dostopa do Pomočnika Google z ukazom »Hey Google«</translation> <translation id="3251759466064201842"><Ni del potrdila></translation> <translation id="325238099842880997">Nastavite digitalna pravila, s pomočjo katerih se bodo otroci lahko igrali, bodo lahko raziskovali in doma opravili šolske obveznosti.</translation> @@ -4135,6 +4140,7 @@ <translation id="4556194354084985730">Na spletnih mestih in v aplikacijah se zlahka prijavite s shranjenimi gesli. Če je možnost izklopljena, boste morali potrditi, preden se prijavite.</translation> <translation id="4558426062282641716">Zahtevano je dovoljenje za samodejni zagon</translation> <translation id="4559617833001311418">To spletno mesto dostopa do tipal gibanja ali svetlobe.</translation> +<translation id="4560728518401799797">Več možnosti za zaznamek <ph name="FOLDER_TITLE" /></translation> <translation id="4561893854334016293">Ni nedavno spremenjenih dovoljenj</translation> <translation id="4562155214028662640">Dodaj prstni odtis</translation> <translation id="4563210852471260509">Prvotni jezik vnosa je kitajščina</translation> @@ -4418,6 +4424,7 @@ <translation id="4819323978093861656">{0,plural, =0{Zapiranje.}=1{Zapiranje čez: 1 sekundo}one{Zapiranje čez: # sekundo}two{Zapiranje čez: # sekundi}few{Zapiranje čez: # sekunde}other{Zapiranje čez: # sekund}}</translation> <translation id="4819607494758673676">Obvestila Pomočnika Google</translation> <translation id="4820236583224459650">Nastavi kot aktiven kartonček</translation> +<translation id="4820795723433418303">Uporaba funkcijskih tipk kot tipk v zgornji vrstici</translation> <translation id="4821935166599369261">&Profiliranje je omogočeno</translation> <translation id="4823484602432206655">Branje in spreminjanje nastavitev funkcij za ljudi s posebnimi potrebami</translation> <translation id="4824037980212326045">Varnostno kopiranje in obnova v Linuxu</translation> @@ -4549,6 +4556,7 @@ <translation id="4925320384394644410">Vrata bodo prikazana tukaj</translation> <translation id="49265687513387605">Vsebine zaslona ni mogoče predvajati. Preverite, ali ste potrdili poziv za začetek skupne rabe zaslona.</translation> <translation id="4927753642311223124">Tu ni ničesar, pomaknite se naprej.</translation> +<translation id="4928629450964837566">Uporabite varnejše geslo</translation> <translation id="4929386379796360314">Cilji za tiskanje</translation> <translation id="4930447554870711875">Razvijalci</translation> <translation id="4930714375720679147">Vklop</translation> @@ -4631,6 +4639,7 @@ <translation id="5010886807652684893">Vizualni pogled</translation> <translation id="5015344424288992913">Razrešujem proxy ...</translation> <translation id="5016491575926936899">Iz računalnika lahko pošiljate sporočila SMS, delite internetno povezavo, odgovarjate na obvestila v pogovorih in odklenete napravo <ph name="DEVICE_TYPE" /> s telefonom.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Preizkusite novo geslo</translation> <translation id="5017643436812738274">Po straneh se lahko premikate s kazalcem besedila. Pritisnite Ctrl + Search + 7 za izklop.</translation> <translation id="5018207570537526145">Odpri spletno mesto razširitve</translation> <translation id="5018526990965779848">Pošiljanje podatkov o uporabi in diagnostičnih podatkov. Pomagajte izboljšati izkušnjo z Androidom s samodejnim pošiljanjem diagnostičnih podatkov ter podatkov o uporabi naprave in aplikacij Googlu. Te podatke uporabljamo za izboljšanje stabilnosti sistema in izvajanja aplikacij ter drugega. Nekateri združeni podatki bodo pomagali tudi Googlovim aplikacijam in partnerjem, na primer razvijalcem za Android. Če ste vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v vašem računu Google.</translation> @@ -4699,6 +4708,7 @@ <translation id="5078638979202084724">Dodaj vse zavihke med zaznamke</translation> <translation id="5078796286268621944">Napačen PIN</translation> <translation id="5079010647467150187">Dodaj vgrajeno omrežje VPN …</translation> +<translation id="5079699784114005398">Po vklopu so aplikacije na voljo v napravah s sistemom ChromeOS, ko se prijavite z računom Google. Spletne aplikacije, nameščene iz brskalnika Chrome, bodo sinhronizirane tudi, če je sinhronizacija brskalnika izklopljena.</translation> <translation id="508059534790499809">Osvežitev kartončka za Kerberos</translation> <translation id="5081960376148623587">Izberite, ali želite vnaprej naložiti strani.</translation> <translation id="5084328598860513926">Potek omogočanja uporabe je bil prekinjen. Poskusite znova ali se obrnite na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation> @@ -4774,6 +4784,7 @@ <translation id="5145464978649806571">Če se odmaknete od naprave, se bo zaslon samodejno zaklenil. Ko ste pred napravo, se zaslon dalj časa ne bo zaklenil. Če je zaklepanje zaslona onemogočeno, se naprava ne bo zaklenila, ampak bo preklopila v stanje pripravljenosti.</translation> <translation id="514575469079499857">Uporaba naslova IP za ugotavljanje lokacije (privzeto)</translation> <translation id="5146896637028965135">Sistemski glas</translation> +<translation id="5147992672778369947">Uporabite priporočeno geslo</translation> <translation id="5148277445782867161">Googlova lokacijska storitev si pri določanju lokacije vaše naprave pomaga z viri, kot so omrežja Wi-Fi, mobilna omrežja in tipala.</translation> <translation id="5150254825601720210">Ime strežnika SLL Netscapeovega potrdila</translation> <translation id="5151354047782775295">Sprostite prostor na disku, sicer bodo nekateri podatki morda samodejno izbrisani</translation> @@ -5060,6 +5071,7 @@ <translation id="5414566801737831689">Branje ikon spletnih mest, ki jih obiščete</translation> <translation id="5414836363063783498">Preverjanje …</translation> <translation id="5417312524372586921">Teme brskalnika</translation> +<translation id="5417353542809767994">Hitro uporabite zapleteno geslo</translation> <translation id="541737483547792035">Povečanje zaslona</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Zahtevanje gesla za odklepanje naprave za dodatno varnost</translation> @@ -5180,6 +5192,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Nastavitev s telefonom Android</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Poskrbite za večjo varnost računa z zapletenim geslom. Shranjeno bo v storitvi <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Ali je to domača stran, ki ste jo pričakovali?</translation> <translation id="5522156646677899028">Ta razširitev vsebuje veliko varnostno ranljivost.</translation> <translation id="5522403133543437426">Iskalnik, uporabljen v naslovni vrstici.</translation> @@ -5800,6 +5813,7 @@ <translation id="6070311415473175157">Izberite območje na sliki za iskanje</translation> <translation id="6071181508177083058">potrditev gesla</translation> <translation id="6071576563962215370">Sistemu ni uspelo zakleniti atributov časa namestitve naprave.</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> prihranjenega pomnilnika</translation> <translation id="6072442788591997866">Aplikacija <ph name="APP_NAME" /> ni dovoljena v tej napravi. Obrnite se na skrbnika. Koda napake: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Ustavi snemanje</translation> <translation id="6073903501322152803">Dodajanje funkcij za ljudi s posebnimi potrebami</translation> @@ -5847,6 +5861,7 @@ <translation id="6104068876731806426">Google Računi</translation> <translation id="6104311680260824317">Naprave ni mogoče pridružiti domeni. Strežnik ne podpira navedenih vrst šifriranja Kerberos. Oglejte si nastavitve šifriranja v razdelku »Več možnosti«.</translation> <translation id="6104796831253957966">Čakalna vrsta tiskalnika je polna</translation> +<translation id="6104929924898022309">Spreminjanje delovanja funkcijskih tipk s tipko za iskanje</translation> <translation id="6106167152849320869">Če ste v prejšnjem koraku izbrali tudi pošiljanje diagnostičnih podatkov in podatkov o uporabi, se ti podatki zbirajo za nameščene aplikacije.</translation> <translation id="6111972606040028426">Omogočanje Pomočnika Google</translation> <translation id="6112294629795967147">Dotaknite se za spreminjanje velikosti</translation> @@ -5988,6 +6003,7 @@ <translation id="6234108445915742946">Pogoji storitve za Chrome se bodo spremenili 31. marca</translation> <translation id="6234474535228214774">Namestitev na čakanju</translation> <translation id="6235208551686043831">Fotoaparat naprave se je vklopil. Postavite kodo QR kartice eSIM predenj.</translation> +<translation id="6237297174664969437">V Chromovih nastavitvah lahko kadar koli izberete, katere podatke brskalnika želite sinhronizirati. V <ph name="LINK_BEGIN" />nastavitvah naprave<ph name="LINK_END" /> lahko nadzirate sinhronizacijo za spletne aplikacije, nameščene v brskalniku Chrome. Google lahko prilagodi Iskanje Google in druge storitve glede na vašo zgodovino.</translation> <translation id="6237474966939441970">Aplikacija za ustvarjanje zapiskov s pisalom</translation> <translation id="623755660902014047">Način za branje</translation> <translation id="6238767809035845642">Besedilo, deljeno iz druge naprave</translation> @@ -6321,6 +6337,7 @@ <translation id="6537613839935722475">Za ime se lahko uporabijo črke, številke in vezaji (-).</translation> <translation id="6538098297809675636">Napaka pri zaznavanju kode</translation> <translation id="653920215766444089">Iskanje kazalne naprave</translation> +<translation id="6539674013849300372">Poskrbite za varnost v spletu z zapletenim geslom. Shranjeno bo v storitvi <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Nadaljevanje …</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Opomba:<ph name="END_BOLD" /> Omogočite samo, če veste, kaj delate, ali če je bilo to zahtevano od vas, ker lahko zbiranje podatkov zmanjša učinkovitost delovanja.</translation> <translation id="6541638731489116978">Temu spletnemu mestu je preprečen dostop do tipal gibanja.</translation> @@ -6521,6 +6538,7 @@ <translation id="671226373742585927">Če želite zapreti stransko podokno, kliknite gumb »X«.</translation> <translation id="6712943853047024245">Geslo ste s tem uporabniškim imenom že shranili za: <ph name="WEBSITE" />.</translation> <translation id="6713233729292711163">Dodaj delovni profil</translation> +<translation id="6713441551032149301">Če želite preklopiti med funkcijskimi in sistemskimi tipkami v zgornji vrstici, pridržite tipko za zaganjalnik</translation> <translation id="6713668088933662563">Nikoli ne ponudi prevajanja teh jezikov</translation> <translation id="6715803357256707211">Med namestitvijo aplikacije za Linux je prišlo do napake. Za podrobnosti kliknite obvestilo.</translation> <translation id="671619610707606484">S tem boste izbrisali <ph name="TOTAL_USAGE" /> podatkov, ki so jih shranila spletna mesta.</translation> @@ -6642,6 +6660,7 @@ <translation id="6811034713472274749">Stran je pripravljena za ogled</translation> <translation id="6811151703183939603">Čvrsto</translation> <translation id="6811332638216701903">Ime gostitelja DHCP</translation> +<translation id="6811792477922751991">Spreminjanje delovanja funkcijskih tipk s tipko za zaganjalnik</translation> <translation id="6812349420832218321">Programa <ph name="PRODUCT_NAME" /> ni mogoče zagnati kot korenski uporabnik.</translation> <translation id="6812841287760418429">Ohrani spremembe</translation> <translation id="6813907279658683733">Celoten zaslon</translation> @@ -7836,6 +7855,7 @@ <translation id="7851720427268294554">Razčlenjevalnik IPP</translation> <translation id="78526636422538552">Dodajanje več računov Google je onemogočeno</translation> <translation id="7853747251428735">Več &orodij</translation> +<translation id="7853999103056713222">Uporabite varnejše geslo</translation> <translation id="7855678561139483478">Premik zavihka v novo okno</translation> <translation id="7857004848504343806">V računalnik je vgrajen varnostni modul, potreben za številne nujne varnostne funkcije v sistemu ChromeOS Flex. Več o njem lahko preberete v centru za pomoč za Chromebook: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Besedilni predlogi</translation> @@ -8391,6 +8411,7 @@ <translation id="8325413836429495820">Ni dovoljen ogled odložišča</translation> <translation id="8326478304147373412">PKCS #7, veriga potrdil</translation> <translation id="8327386430364625757">Matematična pisava</translation> +<translation id="8327538105740918488">To geslo lahko pozneje kadar koli spremenite. Shranjeno bo v storitvi <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Nastavitve dovoljenj in vsebine</translation> <translation id="8330617762701840933">Seznam spletnih mest, ki preusmerijo v nadomestni brskalnik.</translation> <translation id="8330689128072902965">Stiki v bližini lahko delijo z vami. Kliknite za zamenjavo.</translation> @@ -8536,6 +8557,7 @@ <translation id="8449836157089738489">Odpri vse v novi skupini zavihkov</translation> <translation id="8451512073679317615">pomočnik</translation> <translation id="845702320058262034">Povezave ni mogoče vzpostaviti. Bluetooth v telefonu mora biti vklopljen.</translation> +<translation id="8457251154056341970">Na tej strani ne bo več prikazano to: <ph name="MODULE_NAME" /></translation> <translation id="8457451314607652708">Uvozi zaznamke</translation> <translation id="8458341576712814616">Bližnjica</translation> <translation id="8458627787104127436">Odpri vse (<ph name="URL_COUNT" />) v novem oknu</translation> @@ -8608,6 +8630,7 @@ <translation id="8514955299594277296">Spletnim mestom ni dovoljeno shranjevanje podatkov v napravi (ni priporočljivo)</translation> <translation id="8517759303731677493">Uredi …</translation> <translation id="8519895319663397036">Gesel ni mogoče uvoziti. Velikost datoteke mora biti manjša od 150 KB.</translation> +<translation id="851991974800416566">Hitro uporabite zapleteno geslo</translation> <translation id="8523493869875972733">Ohranitev sprememb</translation> <translation id="8523849605371521713">Dodano s pravilnikom</translation> <translation id="8524783101666974011">Shranjevanje kartic v Google Računu</translation> @@ -8765,6 +8788,7 @@ <translation id="8665110742939124773">Vnesli ste napačno kodo za dostop. Poskusite znova.</translation> <translation id="8665180165765946056">Varnostno kopiranje je končano</translation> <translation id="866611985033792019">Zaupaj temu potrdilu za prepoznavanje uporabnikov e-pošte</translation> +<translation id="8666268818656583275">Funkcijske tipke bodo poslej delovale kot sistemske tipke v zgornji vrstici</translation> <translation id="8666321716757704924">Dovoljenja so znova omogočena za <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">O osebnem prilagajanju oglasov na podlagi dejavnosti v brskalniku</translation> <translation id="8667261224612332309">Imate gesla, ki jih je mogoče izboljšati</translation> @@ -9450,6 +9474,7 @@ <translation id="950307215746360464">Vodnik za nastavitev</translation> <translation id="951991426597076286">Zavrni</translation> <translation id="952471655966876828">Naprava samodejno vzpostavi povezavo, ko je vklopljena in je v uporabi.</translation> +<translation id="952880932803612259">Aplikacijam, spletnim mestom in sistemskim storitvam dovolite uporabo lokacije. Lokacijska storitev si pri zaznavanju lokacije naprave pomaga z viri, kot so omrežja Wi-Fi, mobilna omrežja in tipala.</translation> <translation id="953434574221655299">Dovoljeno vedeti, kdaj aktivno uporabljate napravo</translation> <translation id="956500788634395331">Zaščiteni ste pred morebiti škodljivimi razširitvami</translation> <translation id="957179356621191750">6 pik</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 4ef0700..071cfc1f 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Zatvori kartice sa desne strane</translation> <translation id="1166583374608765787">Pregledajte ažuriranje naziva</translation> <translation id="1166596238782048887">Kartica <ph name="TAB_TITLE" /> pripada radnoj površini <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Probajte novu lozinku</translation> <translation id="1168020859489941584">Otvaranje za <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Automatski promeni jezik da se podudara sa izabranim sadržajem</translation> <translation id="1169266963600477608">Kontrole igre</translation> @@ -906,6 +907,7 @@ <translation id="177336675152937177">Podaci hostovanih aplikacija</translation> <translation id="1776712937009046120">Dodaj korisnika</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Držite taster za pretragu da biste se prebacivali između funkcijskih tastera i sistemskih tastera u gornjem redu</translation> <translation id="1778457539567749232">Označi kao nepročitano</translation> <translation id="1778991607452011493">Pošalji evidencije otklanjanju grešaka (preporučeno)</translation> <translation id="1779441632304440041">Slabe lozinke lako mogu da se pogode. Obavezno napravite jake lozinke.</translation> @@ -1347,6 +1349,7 @@ <translation id="2142582065325732898">Uključite <ph name="LINK1_BEGIN" />Chrome sinhronizaciju<ph name="LINK1_END" /> da biste pregledali nedavne Chrome kartice. <ph name="LINK2_BEGIN" />Saznajte više<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Uvek prikazuj traku s alatkama u režimu celog ekrana</translation> <translation id="2143778271340628265">Ručna konfiguracija proksija</translation> +<translation id="2143808295261240440">Koristite preporučenu lozinku</translation> <translation id="2143915448548023856">Podešavanja ekrana</translation> <translation id="2144536955299248197">Prikazivač sertifikata: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Programiranje Android aplikacija za Linux</translation> @@ -2332,6 +2335,7 @@ <translation id="2963151496262057773">Sledeća dodatna komponenta se ne odaziva: <ph name="PLUGIN_NAME" /> Želite li da je zaustavite?</translation> <translation id="2964193600955408481">Onemogući WiFi</translation> <translation id="2964245677645334031">Vidljivost za Deljenje u blizini</translation> +<translation id="2966705348606485669">Više opcija za folder sa obeleživačima <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Upravljajte Android podešavanjima</translation> <translation id="2967926928600500959">URL-ovi koji se podudaraju sa ovim pravilima će se prinudno otvarati u određenom pregledaču.</translation> <translation id="2972581237482394796">&Ponovi radnju</translation> @@ -2621,6 +2625,7 @@ <translation id="3244294424315804309">Ne uključuj zvuk</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – greška na mreži</translation> <translation id="3248902735035392926">Bezbednost je važna. Odvojite malo vremena i <ph name="BEGIN_LINK" />proverite dodatke<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Registrujte se i prijavljujte brže kada se lozinka automatski sačuva u alatki <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Dozvolite da <ph name="SUPERVISED_USER_NAME" /> pristupa Google pomoćniku pomoću fraze „Hej Google“</translation> <translation id="3251759466064201842"><Nije deo sertifikata></translation> <translation id="325238099842880997">Podesite osnovna pravila u digitalnom svetu da biste pomogli deci da se igraju, istražuju i obavljaju školske zadatke kod kuće</translation> @@ -4115,6 +4120,7 @@ <translation id="4556194354084985730">Lako se prijavljujte na sajtove i u aplikacije pomoću sačuvanih lozinki. Kada je ovo isključeno, prikazivaće vam se upit pre prijavljivanja.</translation> <translation id="4558426062282641716">Traži se dozvola za automatsko pokretanje</translation> <translation id="4559617833001311418">Ovaj sajt pristupa senzorima za pokret ili svetlo.</translation> +<translation id="4560728518401799797">Još opcija za obeleživač (<ph name="FOLDER_TITLE" />)</translation> <translation id="4561893854334016293">Nema nedavno promenjenih dozvola</translation> <translation id="4562155214028662640">Dodaj digitalni otisak</translation> <translation id="4563210852471260509">Početni jezik za unos je kineski</translation> @@ -4398,6 +4404,7 @@ <translation id="4819323978093861656">{0,plural, =0{Zatvara se odmah.}=1{Zatvara se za 1 sekundu}one{Zatvara se za # sekundu}few{Zatvara se za # sekunde}other{Zatvara se za # sekundi}}</translation> <translation id="4819607494758673676">Obaveštenja Google pomoćnika</translation> <translation id="4820236583224459650">Podesi kao aktivni tiket</translation> +<translation id="4820795723433418303">Koristite funkcijske tastere kao tastere u gornjem redu</translation> <translation id="4821935166599369261">&Profilisanje je omogućeno</translation> <translation id="4823484602432206655">Čitanje i menjanje podešavanja korisnika i uređaja</translation> <translation id="4824037980212326045">Linux rezervne kopije i vraćanje</translation> @@ -4529,6 +4536,7 @@ <translation id="4925320384394644410">Portovi će se prikazivati ovde</translation> <translation id="49265687513387605">Prebacivanje ekrana nije uspelo. Proverite da li ste potvrdili upit za početak deljenja ekrana.</translation> <translation id="4927753642311223124">Nema šta da se vidi ovde. Nastavite dalje.</translation> +<translation id="4928629450964837566">Koristite bezbedniju lozinku</translation> <translation id="4929386379796360314">Odredišta za štampanje</translation> <translation id="4930447554870711875">Programeri</translation> <translation id="4930714375720679147">Uključi</translation> @@ -4611,6 +4619,7 @@ <translation id="5010886807652684893">Vizuelni prikaz</translation> <translation id="5015344424288992913">Određuje se proksi...</translation> <translation id="5016491575926936899">Možete da šaljete SMS-ove sa računara, delite internet vezu, odgovarate na obaveštenja o konverzaciji i otključate <ph name="DEVICE_TYPE" /> pomoću telefona.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Probajte novu lozinku</translation> <translation id="5017643436812738274">Možete da se krećete stranicama pomoću kursora za tekst. Pritisnite Ctrl+Search+7 da biste to isključili.</translation> <translation id="5018207570537526145">Otvori veb-sajta dodatka</translation> <translation id="5018526990965779848">Šaljite podatke o korišćenju i dijagnostičke podatke. Pomozite nam da vam pružimo bolji doživljaj Android-a tako što ćete automatski slati podatke o dijagnostici, uređaju i korišćenju aplikacija Google-u. To doprinosi održavanju stabilnosti sistema i aplikacije i drugim podešavanjima. Neki objedinjeni podaci će takođe pomoći Google aplikacijama i partnerima, poput Android programera. Ako uključite podešavanje dodatne aktivnosti na vebu i u aplikacijama, ti podaci će se možda čuvati na Google nalogu.</translation> @@ -4679,6 +4688,7 @@ <translation id="5078638979202084724">Obeležavanje svih kartica</translation> <translation id="5078796286268621944">Netačan PIN</translation> <translation id="5079010647467150187">Dodaj ugrađeni VPN…</translation> +<translation id="5079699784114005398">Posle aktiviranja aplikacije će biti dostupne na svim ChromeOS uređajima kada se prijavite pomoću Google naloga. Veb-aplikacije instalirane iz Chrome pregledača sinhronizovaće se čak i ako je sinhronizacija pregledača isključena.</translation> <translation id="508059534790499809">Osveži Kerberos tiket</translation> <translation id="5081960376148623587">Izaberite da li ćete stranice predučitavati</translation> <translation id="5084328598860513926">Tok dodele je prekinut. Probajte ponovo ili se obratite vlasniku uređaja ili administratoru. Kôd greške: <ph name="ERROR_CODE" />.</translation> @@ -4754,6 +4764,7 @@ <translation id="5145464978649806571">Ako se udaljite od uređaja, ekran će se automatski zaključati. Kada se nalazite ispred uređaja, ekran se duže neće zaključavati. Ako je zaključani ekran onemogućen, uređaj će preći u stanje spavanja umesto da se zaključa.</translation> <translation id="514575469079499857">Korišćenje IP adrese za određivanje lokacije (podrazumevano)</translation> <translation id="5146896637028965135">Sistemski glas</translation> +<translation id="5147992672778369947">Koristite preporučenu lozinku</translation> <translation id="5148277445782867161">Google usluga lokacije koristi izvore kao što su Wi‑Fi mreže, mobilne mreže i senzori da bi odredila približnu lokaciju uređaja.</translation> <translation id="5150254825601720210">Naziv SSL servera Netscape sertifikata</translation> <translation id="5151354047782775295">Oslobodite prostor na disku ili će određeni podaci možda automatski biti izbrisani</translation> @@ -5039,6 +5050,7 @@ <translation id="5414566801737831689">Čitanje ikona veb-sajtova koje posećujete</translation> <translation id="5414836363063783498">Verifikuju se...</translation> <translation id="5417312524372586921">Teme za pregledač</translation> +<translation id="5417353542809767994">Brzo upotrebite jaku lozinku</translation> <translation id="541737483547792035">Uvećaj ekran</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Zahtevajte lozinku za otključavanje uređaja radi dodatne bezbednosti</translation> @@ -5159,6 +5171,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Podesite pomoću Android telefona</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Dodatno zaštitite nalog pomoću jake lozinke. Biće sačuvana u alatki <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Je li ovo početna stranica koju ste očekivali?</translation> <translation id="5522156646677899028">Ovaj dodatak sadrži ozbiljan bezbednosni propust.</translation> <translation id="5522403133543437426">Pretraživač koji se koristi na traci za adresu.</translation> @@ -5778,6 +5791,7 @@ <translation id="6070311415473175157">Izaberite oblast slike za pretragu</translation> <translation id="6071181508177083058">potvrdite lozinku</translation> <translation id="6071576563962215370">Sistem nije uspeo da odredi zaključavanje atributa za vreme instalacije uređaja.</translation> +<translation id="6071938745001252305">Sačuvano memorije: <ph name="MEMORY_VALUE" /></translation> <translation id="6072442788591997866">Aplikacija <ph name="APP_NAME" /> nije dozvoljena na ovom uređaju. Obratite se administratoru. Kôd greške: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Zaustavi snimanje</translation> <translation id="6073903501322152803">Dodaj funkcije pristupačnosti</translation> @@ -5825,6 +5839,7 @@ <translation id="6104068876731806426">Google nalozi</translation> <translation id="6104311680260824317">Pridruživanje uređaja domenu nije uspelo. Server ne podržava navedene Kerberos tipove šifrovanja. Pogledajte podešavanja šifrovanja u odeljku „Još opcija“.</translation> <translation id="6104796831253957966">Red za čekanje na štampaču je pun</translation> +<translation id="6104929924898022309">Koristite taster za pretragu da biste promenili ponašanje funkcijskih tastera</translation> <translation id="6106167152849320869">Ako ste u prethodnom koraku odabrali i da šaljete dijagnostičke podatke i podatke o korišćenju, ti podaci će se prikupljati za instalirane aplikacije.</translation> <translation id="6111972606040028426">Omogućite Google pomoćnik</translation> <translation id="6112294629795967147">Dodirnite da biste promenili veličinu</translation> @@ -5966,6 +5981,7 @@ <translation id="6234108445915742946">Chrome uslovi korišćenja usluge se menjaju 31. marta</translation> <translation id="6234474535228214774">Instaliranje je na čekanju</translation> <translation id="6235208551686043831">Kamera uređaja je uključena. Postavite eSIM QR kôd ispred kamere.</translation> +<translation id="6237297174664969437">Uvek možete da odaberete podatke pregledanja koje ćete sinhronizovati u podešavanjima. U <ph name="LINK_BEGIN" />podešavanjima uređaja<ph name="LINK_END" /> možete da kontrolišete sinhronizaciju za veb-aplikacije instalirane iz Chrome pregledača. Google može da personalizuje Pretragu i druge usluge na osnovu istorije.</translation> <translation id="6237474966939441970">Aplikacija za pravljenje beležaka pomoću pisaljke</translation> <translation id="623755660902014047">Režim čitanja</translation> <translation id="6238767809035845642">Tekst koji se deli sa drugog uređaja</translation> @@ -6299,6 +6315,7 @@ <translation id="6537613839935722475">Ime može da sadrži slova, brojeve i crtice (-)</translation> <translation id="6538098297809675636">Greška pri otkrivanju koda</translation> <translation id="653920215766444089">Traži se pokazivački uređaj</translation> +<translation id="6539674013849300372">Povećajte bezbednost onlajn pomoću jake lozinke. Biće sačuvana u alatki <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Nastavlja se...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> Omogućite ovo samo ako znate šta radite ili ako je to neko zatražio od vas jer prikupljanje podataka može da pogorša učinak.</translation> <translation id="6541638731489116978">Ovom sajtu je zabranjeno da pristupa senzorima za pokret.</translation> @@ -6497,6 +6514,7 @@ <translation id="671226373742585927">Kliknite na dugme X da biste zatvorili bočnu tablu</translation> <translation id="6712943853047024245">Već ste sačuvali lozinku sa ovim korisničkim imenom za <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Dodaj poslovni profil</translation> +<translation id="6713441551032149301">Držite taster pokretača da biste se prebacivali između funkcijskih tastera i sistemskih tastera u gornjem redu</translation> <translation id="6713668088933662563">Nikada ne nudi prevod za ove jezike</translation> <translation id="6715803357256707211">Došlo je do greške tokom instaliranja Linux aplikacije. Kliknite na obaveštenje da biste pronašli detaljne informacije.</translation> <translation id="671619610707606484">Ovim brišete <ph name="TOTAL_USAGE" /> podataka koje čuvaju sajtovi</translation> @@ -6618,6 +6636,7 @@ <translation id="6811034713472274749">Stranica je spremna za pregled</translation> <translation id="6811151703183939603">Čvrsto</translation> <translation id="6811332638216701903">Ime DHCP hosta</translation> +<translation id="6811792477922751991">Koristite taster pokretača da biste promenili ponašanje funkcijskih tastera</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> ne može da se pokreće kao osnovni proizvod.</translation> <translation id="6812841287760418429">Zadrži promene</translation> <translation id="6813907279658683733">Ceo ekran</translation> @@ -7812,6 +7831,7 @@ <translation id="7851720427268294554">IPP raščlanjivač</translation> <translation id="78526636422538552">Dodavanje još Google naloga je onemogućeno</translation> <translation id="7853747251428735">Još a&latki</translation> +<translation id="7853999103056713222">Koristite bezbedniju lozinku</translation> <translation id="7855678561139483478">Premesti karticu u nov prozor</translation> <translation id="7857004848504343806">Računar sadrži bezbednosni modul, koji se koristi za primenu mnogih izuzetno važnih bezbednosnih funkcija u Chrome OS Flex-u. Posetite centar za pomoć za Chromebook da biste saznali više: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Tekstualni predlozi</translation> @@ -8367,6 +8387,7 @@ <translation id="8325413836429495820">Nije im dozvoljeno da vide privremenu memoriju</translation> <translation id="8326478304147373412">PKCS #7, lanac sertifikata</translation> <translation id="8327386430364625757">Matematički font</translation> +<translation id="8327538105740918488">Uvek ćete moći da promenite ovu lozinku kasnije. Biće sačuvana u alatki <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Podešavanja dozvola i sadržaja</translation> <translation id="8330617762701840933">Lista veb-sajtova koji preusmeravaju u alternativni pregledač.</translation> <translation id="8330689128072902965">Kontakti u blizini mogu da dele sadržaj sa vama. Kliknite da biste promenili.</translation> @@ -8512,6 +8533,7 @@ <translation id="8449836157089738489">Otvori sve u novoj grupi kartica</translation> <translation id="8451512073679317615">Pomoćnik</translation> <translation id="845702320058262034">Povezivanje nije uspelo. Proverite da li je Bluetooth na telefonu uključen.</translation> +<translation id="8457251154056341970">Više nećete videti <ph name="MODULE_NAME" /> na ovoj stranici</translation> <translation id="8457451314607652708">Uvezi obeleživače</translation> <translation id="8458341576712814616">Prečica</translation> <translation id="8458627787104127436">Otvori sve (<ph name="URL_COUNT" />) u novom prozoru</translation> @@ -8584,6 +8606,7 @@ <translation id="8514955299594277296">Ne dozvoljavajte sajtovima da čuvaju podatke na uređaju (ne preporučuje se)</translation> <translation id="8517759303731677493">Izmeni…</translation> <translation id="8519895319663397036">Uvoz lozinki nije uspeo. Veličina fajla mora da bude manja od 150 kB.</translation> +<translation id="851991974800416566">Brzo upotrebite jaku lozinku</translation> <translation id="8523493869875972733">Zadrži promene</translation> <translation id="8523849605371521713">Dodale su smernice</translation> <translation id="8524783101666974011">Sačuvajte kartice na Google nalogu</translation> @@ -8741,6 +8764,7 @@ <translation id="8665110742939124773">Uneli ste netačan pristupni kôd. Probajte ponovo.</translation> <translation id="8665180165765946056">Rezervna kopija je napravljena</translation> <translation id="866611985033792019">Ovaj sertifikat je pouzdan za identifikaciju korisnika imejla</translation> +<translation id="8666268818656583275">F tasteri će se sada ponašati kao sistemski tasteri u gornjem redu</translation> <translation id="8666321716757704924">Dozvole su ponovo omogućene za <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">O personalizaciji oglasa na osnovu pregledača</translation> <translation id="8667261224612332309">Imate lozinke koje mogu da se poboljšaju</translation> @@ -9425,6 +9449,7 @@ <translation id="950307215746360464">Vodič za podešavanje</translation> <translation id="951991426597076286">Odbij</translation> <translation id="952471655966876828">Veza sa uređajem će se automatski uključiti kada se uređaj uključi ili se koristi</translation> +<translation id="952880932803612259">Dozvolite aplikacijama, veb-sajtovima i sistemskim uslugama da koriste lokaciju. Lokacija može da koristi izvore kao što su WiFi, mobilne mreže i senzori da bi se lakše odredila lokacija uređaja.</translation> <translation id="953434574221655299">Imaju dozvolu da znaju kada aktivno koristite uređaj</translation> <translation id="956500788634395331">Štitimo vas od potencijalno štetnih dodataka</translation> <translation id="957179356621191750">Sa 6 tačka</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index a97afd84..c928ef3 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">Затвори картице са десне стране</translation> <translation id="1166583374608765787">Прегледајте ажурирање назива</translation> <translation id="1166596238782048887">Картица <ph name="TAB_TITLE" /> припада радној површини <ph name="DESK_TITLE" /></translation> +<translation id="1167262726334064738">Пробајте нову лозинку</translation> <translation id="1168020859489941584">Отварање за <ph name="TIME_REMAINING" />...</translation> <translation id="116896278675803795">Аутоматски промени језик да се подудара са изабраним садржајем</translation> <translation id="1169266963600477608">Контроле игре</translation> @@ -906,6 +907,7 @@ <translation id="177336675152937177">Подаци хостованих апликација</translation> <translation id="1776712937009046120">Додај корисника</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">Држите тастер за претрагу да бисте се пребацивали између функцијских тастера и системских тастера у горњем реду</translation> <translation id="1778457539567749232">Означи као непрочитано</translation> <translation id="1778991607452011493">Пошаљи евиденције отклањању грешака (препоручено)</translation> <translation id="1779441632304440041">Слабе лозинке лако могу да се погоде. Обавезно направите јаке лозинке.</translation> @@ -1347,6 +1349,7 @@ <translation id="2142582065325732898">Укључите <ph name="LINK1_BEGIN" />Chrome синхронизацију<ph name="LINK1_END" /> да бисте прегледали недавне Chrome картице. <ph name="LINK2_BEGIN" />Сазнајте више<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">Увек приказуј траку с алаткама у режиму целог екрана</translation> <translation id="2143778271340628265">Ручна конфигурација проксија</translation> +<translation id="2143808295261240440">Користите препоручену лозинку</translation> <translation id="2143915448548023856">Подешавања екрана</translation> <translation id="2144536955299248197">Приказивач сертификата: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Програмирање Android апликација за Linux</translation> @@ -2332,6 +2335,7 @@ <translation id="2963151496262057773">Следећа додатна компонента се не одазива: <ph name="PLUGIN_NAME" /> Желите ли да је зауставите?</translation> <translation id="2964193600955408481">Онемогући WiFi</translation> <translation id="2964245677645334031">Видљивост за Дељење у близини</translation> +<translation id="2966705348606485669">Више опција за фолдер са обележивачима <ph name="FOLDER_TITLE" /></translation> <translation id="2966937470348689686">Управљајте Android подешавањима</translation> <translation id="2967926928600500959">URL-ови који се подударају са овим правилима ће се принудно отварати у одређеном прегледачу.</translation> <translation id="2972581237482394796">&Понови радњу</translation> @@ -2621,6 +2625,7 @@ <translation id="3244294424315804309">Не укључуј звук</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – грешка на мрежи</translation> <translation id="3248902735035392926">Безбедност је важна. Одвојите мало времена и <ph name="BEGIN_LINK" />проверите додатке<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">Региструјте се и пријављујте брже када се лозинка аутоматски сачува у алатки <ph name="GOOGLE_PASSWORD_MANAGER" /> за <ph name="EMAIL" />.</translation> <translation id="3251714896659475029">Дозволите да <ph name="SUPERVISED_USER_NAME" /> приступа Google помоћнику помоћу фразе „Хеј Google“</translation> <translation id="3251759466064201842"><Није део сертификата></translation> <translation id="325238099842880997">Подесите основна правила у дигиталном свету да бисте помогли деци да се играју, истражују и обављају школске задатке код куће</translation> @@ -4115,6 +4120,7 @@ <translation id="4556194354084985730">Лако се пријављујте на сајтове и у апликације помоћу сачуваних лозинки. Када је ово искључено, приказиваће вам се упит пре пријављивања.</translation> <translation id="4558426062282641716">Тражи се дозвола за аутоматско покретање</translation> <translation id="4559617833001311418">Овај сајт приступа сензорима за покрет или светло.</translation> +<translation id="4560728518401799797">Још опција за обележивач (<ph name="FOLDER_TITLE" />)</translation> <translation id="4561893854334016293">Нема недавно промењених дозвола</translation> <translation id="4562155214028662640">Додај дигитални отисак</translation> <translation id="4563210852471260509">Почетни језик за унос је кинески</translation> @@ -4398,6 +4404,7 @@ <translation id="4819323978093861656">{0,plural, =0{Затвара се одмах.}=1{Затвара се за 1 секунду}one{Затвара се за # секунду}few{Затвара се за # секунде}other{Затвара се за # секунди}}</translation> <translation id="4819607494758673676">Обавештења Google помоћника</translation> <translation id="4820236583224459650">Подеси као активни тикет</translation> +<translation id="4820795723433418303">Користите функцијске тастере као тастере у горњем реду</translation> <translation id="4821935166599369261">&Профилисање је омогућено</translation> <translation id="4823484602432206655">Читање и мењање подешавања корисника и уређаја</translation> <translation id="4824037980212326045">Linux резервне копије и враћање</translation> @@ -4529,6 +4536,7 @@ <translation id="4925320384394644410">Портови ће се приказивати овде</translation> <translation id="49265687513387605">Пребацивање екрана није успело. Проверите да ли сте потврдили упит за почетак дељења екрана.</translation> <translation id="4927753642311223124">Нема шта да се види овде. Наставите даље.</translation> +<translation id="4928629450964837566">Користите безбеднију лозинку</translation> <translation id="4929386379796360314">Одредишта за штампање</translation> <translation id="4930447554870711875">Програмери</translation> <translation id="4930714375720679147">Укључи</translation> @@ -4611,6 +4619,7 @@ <translation id="5010886807652684893">Визуелни приказ</translation> <translation id="5015344424288992913">Одређује се прокси...</translation> <translation id="5016491575926936899">Можете да шаљете SMS-ове са рачунара, делите интернет везу, одговарате на обавештења о конверзацији и откључате <ph name="DEVICE_TYPE" /> помоћу телефона.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">Пробајте нову лозинку</translation> <translation id="5017643436812738274">Можете да се крећете страницама помоћу курсора за текст. Притисните Ctrl+Search+7 да бисте то искључили.</translation> <translation id="5018207570537526145">Отвори веб-сајта додатка</translation> <translation id="5018526990965779848">Шаљите податке о коришћењу и дијагностичке податке. Помозите нам да вам пружимо бољи доживљај Android-а тако што ћете аутоматски слати податке о дијагностици, уређају и коришћењу апликација Google-у. То доприноси одржавању стабилности система и апликације и другим подешавањима. Неки обједињени подаци ће такође помоћи Google апликацијама и партнерима, попут Android програмера. Ако укључите подешавање додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу.</translation> @@ -4679,6 +4688,7 @@ <translation id="5078638979202084724">Обележавање свих картица</translation> <translation id="5078796286268621944">Нетачан PIN</translation> <translation id="5079010647467150187">Додај уграђени VPN…</translation> +<translation id="5079699784114005398">После активирања апликације ће бити доступне на свим ChromeOS уређајима када се пријавите помоћу Google налога. Веб-апликације инсталиране из Chrome прегледача синхронизоваће се чак и ако је синхронизација прегледача искључена.</translation> <translation id="508059534790499809">Освежи Kerberos тикет</translation> <translation id="5081960376148623587">Изаберите да ли ћете странице предучитавати</translation> <translation id="5084328598860513926">Ток доделе је прекинут. Пробајте поново или се обратите власнику уређаја или администратору. Кôд грешке: <ph name="ERROR_CODE" />.</translation> @@ -4754,6 +4764,7 @@ <translation id="5145464978649806571">Ако се удаљите од уређаја, екран ће се аутоматски закључати. Када се налазите испред уређаја, екран се дуже неће закључавати. Ако је закључани екран онемогућен, уређај ће прећи у стање спавања уместо да се закључа.</translation> <translation id="514575469079499857">Коришћење IP адресе за одређивање локације (подразумевано)</translation> <translation id="5146896637028965135">Системски глас</translation> +<translation id="5147992672778369947">Користите препоручену лозинку</translation> <translation id="5148277445782867161">Google услуга локације користи изворе као што су Wi‑Fi мреже, мобилне мреже и сензори да би одредила приближну локацију уређаја.</translation> <translation id="5150254825601720210">Назив SSL сервера Netscape сертификата</translation> <translation id="5151354047782775295">Ослободите простор на диску или ће одређени подаци можда аутоматски бити избрисани</translation> @@ -5039,6 +5050,7 @@ <translation id="5414566801737831689">Читање икона веб-сајтова које посећујете</translation> <translation id="5414836363063783498">Верификују се...</translation> <translation id="5417312524372586921">Теме за прегледач</translation> +<translation id="5417353542809767994">Брзо употребите јаку лозинку</translation> <translation id="541737483547792035">Увећај екран</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">Захтевајте лозинку за откључавање уређаја ради додатне безбедности</translation> @@ -5159,6 +5171,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Подесите помоћу Android телефона</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">Додатно заштитите налог помоћу јаке лозинке. Биће сачувана у алатки <ph name="GOOGLE_PASSWORD_MANAGER" /> за <ph name="EMAIL" />.</translation> <translation id="5521078259930077036">Је ли ово почетна страница коју сте очекивали?</translation> <translation id="5522156646677899028">Овај додатак садржи озбиљан безбедносни пропуст.</translation> <translation id="5522403133543437426">Претраживач који се користи на траци за адресу.</translation> @@ -5778,6 +5791,7 @@ <translation id="6070311415473175157">Изаберите област слике за претрагу</translation> <translation id="6071181508177083058">потврдите лозинку</translation> <translation id="6071576563962215370">Систем није успео да одреди закључавање атрибута за време инсталације уређаја.</translation> +<translation id="6071938745001252305">Сачувано меморије: <ph name="MEMORY_VALUE" /></translation> <translation id="6072442788591997866">Апликација <ph name="APP_NAME" /> није дозвољена на овом уређају. Обратите се администратору. Кôд грешке: <ph name="ERROR_CODE" />.</translation> <translation id="6073451960410192870">Заустави снимање</translation> <translation id="6073903501322152803">Додај функције приступачности</translation> @@ -5825,6 +5839,7 @@ <translation id="6104068876731806426">Google налози</translation> <translation id="6104311680260824317">Придруживање уређаја домену није успело. Сервер не подржава наведене Kerberos типове шифровања. Погледајте подешавања шифровања у одељку „Још опција“.</translation> <translation id="6104796831253957966">Ред за чекање на штампачу је пун</translation> +<translation id="6104929924898022309">Користите тастер за претрагу да бисте променили понашање функцијских тастера</translation> <translation id="6106167152849320869">Ако сте у претходном кораку одабрали и да шаљете дијагностичке податке и податке о коришћењу, ти подаци ће се прикупљати за инсталиране апликације.</translation> <translation id="6111972606040028426">Омогућите Google помоћник</translation> <translation id="6112294629795967147">Додирните да бисте променили величину</translation> @@ -5966,6 +5981,7 @@ <translation id="6234108445915742946">Chrome услови коришћења услуге се мењају 31. марта</translation> <translation id="6234474535228214774">Инсталирање је на чекању</translation> <translation id="6235208551686043831">Камера уређаја је укључена. Поставите eSIM QR кôд испред камере.</translation> +<translation id="6237297174664969437">Увек можете да одаберете податке прегледања које ћете синхронизовати у подешавањима. У <ph name="LINK_BEGIN" />подешавањима уређаја<ph name="LINK_END" /> можете да контролишете синхронизацију за веб-апликације инсталиране из Chrome прегледача. Google може да персонализује Претрагу и друге услуге на основу историје.</translation> <translation id="6237474966939441970">Апликација за прављење бележака помоћу писаљке</translation> <translation id="623755660902014047">Режим читања</translation> <translation id="6238767809035845642">Текст који се дели са другог уређаја</translation> @@ -6299,6 +6315,7 @@ <translation id="6537613839935722475">Име може да садржи слова, бројеве и цртице (-)</translation> <translation id="6538098297809675636">Грешка при откривању кода</translation> <translation id="653920215766444089">Тражи се показивачки уређај</translation> +<translation id="6539674013849300372">Повећајте безбедност онлајн помоћу јаке лозинке. Биће сачувана у алатки <ph name="GOOGLE_PASSWORD_MANAGER" /> за <ph name="EMAIL" />.</translation> <translation id="653983593749614101">Наставља се...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Напомена:<ph name="END_BOLD" /> Омогућите ово само ако знате шта радите или ако је то неко затражио од вас јер прикупљање података може да погорша учинак.</translation> <translation id="6541638731489116978">Овом сајту је забрањено да приступа сензорима за покрет.</translation> @@ -6497,6 +6514,7 @@ <translation id="671226373742585927">Кликните на дугме X да бисте затворили бочну таблу</translation> <translation id="6712943853047024245">Већ сте сачували лозинку са овим корисничким именом за <ph name="WEBSITE" /></translation> <translation id="6713233729292711163">Додај пословни профил</translation> +<translation id="6713441551032149301">Држите тастер покретача да бисте се пребацивали између функцијских тастера и системских тастера у горњем реду</translation> <translation id="6713668088933662563">Никада не нуди превод за ове језике</translation> <translation id="6715803357256707211">Дошло је до грешке током инсталирања Linux апликације. Кликните на обавештење да бисте пронашли детаљне информације.</translation> <translation id="671619610707606484">Овим бришете <ph name="TOTAL_USAGE" /> података које чувају сајтови</translation> @@ -6618,6 +6636,7 @@ <translation id="6811034713472274749">Страница је спремна за преглед</translation> <translation id="6811151703183939603">Чврсто</translation> <translation id="6811332638216701903">Име DHCP хоста</translation> +<translation id="6811792477922751991">Користите тастер покретача да бисте променили понашање функцијских тастера</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> не може да се покреће као основни производ.</translation> <translation id="6812841287760418429">Задржи промене</translation> <translation id="6813907279658683733">Цео екран</translation> @@ -7812,6 +7831,7 @@ <translation id="7851720427268294554">IPP рашчлањивач</translation> <translation id="78526636422538552">Додавање још Google налога је онемогућено</translation> <translation id="7853747251428735">Још а&латки</translation> +<translation id="7853999103056713222">Користите безбеднију лозинку</translation> <translation id="7855678561139483478">Премести картицу у нов прозор</translation> <translation id="7857004848504343806">Рачунар садржи безбедносни модул, који се користи за примену многих изузетно важних безбедносних функција у Chrome OS Flex-у. Посетите центар за помоћ за Chromebook да бисте сазнали више: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">Текстуални предлози</translation> @@ -8367,6 +8387,7 @@ <translation id="8325413836429495820">Није им дозвољено да виде привремену меморију</translation> <translation id="8326478304147373412">PKCS #7, ланац сертификата</translation> <translation id="8327386430364625757">Математички фонт</translation> +<translation id="8327538105740918488">Увек ћете моћи да промените ову лозинку касније. Биће сачувана у алатки <ph name="GOOGLE_PASSWORD_MANAGER" /> за <ph name="EMAIL" />.</translation> <translation id="8327676037044516220">Подешавања дозвола и садржаја</translation> <translation id="8330617762701840933">Листа веб-сајтова који преусмеравају у алтернативни прегледач.</translation> <translation id="8330689128072902965">Контакти у близини могу да деле садржај са вама. Кликните да бисте променили.</translation> @@ -8512,6 +8533,7 @@ <translation id="8449836157089738489">Отвори све у новој групи картица</translation> <translation id="8451512073679317615">Помоћник</translation> <translation id="845702320058262034">Повезивање није успело. Проверите да ли је Bluetooth на телефону укључен.</translation> +<translation id="8457251154056341970">Више нећете видети <ph name="MODULE_NAME" /> на овој страници</translation> <translation id="8457451314607652708">Увези обележиваче</translation> <translation id="8458341576712814616">Пречица</translation> <translation id="8458627787104127436">Отвори све (<ph name="URL_COUNT" />) у новом прозору</translation> @@ -8584,6 +8606,7 @@ <translation id="8514955299594277296">Не дозвољавајте сајтовима да чувају податке на уређају (не препоручује се)</translation> <translation id="8517759303731677493">Измени…</translation> <translation id="8519895319663397036">Увоз лозинки није успео. Величина фајла мора да буде мања од 150 kB.</translation> +<translation id="851991974800416566">Брзо употребите јаку лозинку</translation> <translation id="8523493869875972733">Задржи промене</translation> <translation id="8523849605371521713">Додале су смернице</translation> <translation id="8524783101666974011">Сачувајте картице на Google налогу</translation> @@ -8741,6 +8764,7 @@ <translation id="8665110742939124773">Унели сте нетачан приступни кôд. Пробајте поново.</translation> <translation id="8665180165765946056">Резервна копија је направљена</translation> <translation id="866611985033792019">Овај сертификат је поуздан за идентификацију корисника имејла</translation> +<translation id="8666268818656583275">F тастери ће се сада понашати као системски тастери у горњем реду</translation> <translation id="8666321716757704924">Дозволе су поново омогућене за <ph name="WEBSITE" /></translation> <translation id="8666759526542103597">О персонализацији огласа на основу прегледача</translation> <translation id="8667261224612332309">Имате лозинке које могу да се побољшају</translation> @@ -9425,6 +9449,7 @@ <translation id="950307215746360464">Водич за подешавање</translation> <translation id="951991426597076286">Одбиј</translation> <translation id="952471655966876828">Веза са уређајем ће се аутоматски укључити када се уређај укључи или се користи</translation> +<translation id="952880932803612259">Дозволите апликацијама, веб-сајтовима и системским услугама да користе локацију. Локација може да користи изворе као што су WiFi, мобилне мреже и сензори да би се лакше одредила локација уређаја.</translation> <translation id="953434574221655299">Имају дозволу да знају када активно користите уређај</translation> <translation id="956500788634395331">Штитимо вас од потенцијално штетних додатака</translation> <translation id="957179356621191750">Са 6 тачка</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index e051565..37080b0 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -202,6 +202,7 @@ <translation id="1166212789817575481">دائیں جانب والے ٹیبز بند کریں</translation> <translation id="1166583374608765787">نام میں ہوئی اپ ڈیٹ کا جائزہ لیں</translation> <translation id="1166596238782048887"><ph name="TAB_TITLE" /> <ph name="DESK_TITLE" /> ڈیسک سے تعلق رکھتی ہے</translation> +<translation id="1167262726334064738">نیا پاس ورڈ آزمائیں</translation> <translation id="1168020859489941584"><ph name="TIME_REMAINING" /> میں کھولا جا رہا ہے…</translation> <translation id="116896278675803795">زبان کو منتخب کردہ مواد سے مماثل کرنے کے لیے خودکار طور پر تبدیل کریں</translation> <translation id="1169266963600477608">گیم کنٹرولز</translation> @@ -907,6 +908,7 @@ <translation id="177336675152937177">میزبانی کردہ ایپ کا ڈیٹا</translation> <translation id="1776712937009046120">صارف کو شامل کریں</translation> <translation id="1776883657531386793"><ph name="OID" />: <ph name="INFO" /></translation> +<translation id="177814385589420211">فنکشن کلیدوں اور سسٹم کی سرفہرست قطار کی کلیدوں کے درمیان تبدیل کرنے کے لیے تلاش کی کلید کو ہولڈ کریں</translation> <translation id="1778457539567749232">نہ پڑھا ہوا کے بطور نشان زد کریں</translation> <translation id="1778991607452011493">ڈیبگ لاگز بھیجیں (تجویز کردہ)</translation> <translation id="1779441632304440041">کمزور پاس ورڈز کا اندازہ لگانا آسان ہوتا ہے۔ مضبوط پاس ورڈز تخلیق کرنا یقینی بنائیں۔</translation> @@ -1349,6 +1351,7 @@ <translation id="2142582065325732898">حالیہ Chrome ٹیبز کو دیکھنے کے لیے <ph name="LINK1_BEGIN" />Chrome Sync<ph name="LINK1_END" /> کو آن کریں۔ <ph name="LINK2_BEGIN" />مزید جانيں<ph name="LINK2_END" /></translation> <translation id="2143765403545170146">ہمیشہ پوری اسکرین میں ٹول بار دکھائیں</translation> <translation id="2143778271340628265">دستی پراکسی کنفیگریشن</translation> +<translation id="2143808295261240440">تجویز کردہ پاس ورڈ استعمال کریں</translation> <translation id="2143915448548023856">ڈسپلے کی ترتیبات</translation> <translation id="2144536955299248197">سرٹیفکیٹ کا ناظر: <ph name="CERTIFICATE_NAME" /></translation> <translation id="2144557304298909478">Linux Android ایپ ڈیولپمنٹ</translation> @@ -2335,6 +2338,7 @@ <translation id="2963151496262057773">مندرجہ ذیل پلگ ان جواب نہیں دے رہا ہے: <ph name="PLUGIN_NAME" />کیا آپ اسے بند کرنا چاہیں گے؟</translation> <translation id="2964193600955408481">Wi-Fi کو غیر فعال کریں</translation> <translation id="2964245677645334031">قریبی آلات کے ساتھ اشتراک کی مرئیت</translation> +<translation id="2966705348606485669"><ph name="FOLDER_TITLE" /> بک مارک فولڈر کے لیے مزید اختیارات</translation> <translation id="2966937470348689686">Android کی ترجیحات کا نظم کریں</translation> <translation id="2967926928600500959">ان اصولوں سے مماثل URLs کو ایک مخصوص براؤزر میں زبردستی کھولا جائے گا۔</translation> <translation id="2972581237482394796">&واپس لائیں</translation> @@ -2624,6 +2628,7 @@ <translation id="3244294424315804309">آواز بند کرنا جاری رکھیں</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - نیٹ ورک کی خرابی</translation> <translation id="3248902735035392926">حفاظتی معاملات۔ کچھ وقت نکالیں اور ابھی <ph name="BEGIN_LINK" />اپنی ایکسٹینشنز کو چیک کریں<ph name="END_LINK" /></translation> +<translation id="3249323165366527554">جب آپ کے <ph name="EMAIL" /> کا پاس ورڈ <ph name="GOOGLE_PASSWORD_MANAGER" /> میں خودکار طور پر محفوظ ہو جائے تو سائن اپ کریں اور نسبتًا تیزی سے سائن ان کریں۔</translation> <translation id="3251714896659475029"><ph name="SUPERVISED_USER_NAME" /> کو "Ok Google" کے ساتھ Google اسسٹنٹ تک رسائی حاصل کرنے دیں</translation> <translation id="3251759466064201842"><سرٹیفکیٹ کا حصہ نہیں ہے></translation> <translation id="325238099842880997">بچوں کو گھر میں کھیلنے، دریافت کرنے اور اسکول کا کام کرنے میں مدد کے لئے ڈیجیٹل گراؤنڈ رولز سیٹ کریں</translation> @@ -4118,6 +4123,7 @@ <translation id="4556194354084985730">اپنے محفوظ کردہ پاس ورڈز کے ساتھ آسانی سے سائٹس اور ایپس میں سائن ان کریں۔ آف ہونے پر، سائن ان کرنے سے پہلے آپ سے تصدیق کے لیے کہا جائے گا۔</translation> <translation id="4558426062282641716">خودکار شروع کرنے کی اجازت طلب کی گئی</translation> <translation id="4559617833001311418">یہ سائٹ آپ کے موشن اور لائٹ سینسرز تک رسائی حاصل کر رہی ہے۔</translation> +<translation id="4560728518401799797"><ph name="FOLDER_TITLE" /> بک مارک کے لیے مزید اختیارات</translation> <translation id="4561893854334016293">حال میں کسی اجازت کو تبدیل نہیں کیا گیا</translation> <translation id="4562155214028662640">فنگر پرنٹ شامل کریں</translation> <translation id="4563210852471260509">ان پٹ کی ابتدائی زبان چینی ہے</translation> @@ -4401,6 +4407,7 @@ <translation id="4819323978093861656">{0,plural, =0{ابھی بند ہو رہا ہے۔}=1{بند ہو رہا ہے: 1 سیکنڈ}other{بند ہو رہا ہے: # سیکنڈ}}</translation> <translation id="4819607494758673676">Google اسسٹنٹ کی اطلاعات</translation> <translation id="4820236583224459650">بطور فعال ٹکٹ سیٹ کریں</translation> +<translation id="4820795723433418303">فنکشن کلیدوں کو سرفہرست قطار کی کلیدوں کے بطور استعمال کریں</translation> <translation id="4821935166599369261">&پروفائلنگ فعال ہے</translation> <translation id="4823484602432206655">صارف اور آلہ کی ترتیبات پڑھیں اور انہیں تبدیل کریں</translation> <translation id="4824037980212326045">Linux کا بیک اپ اور بحالی</translation> @@ -4532,6 +4539,7 @@ <translation id="4925320384394644410">آپ کے پورٹس یہاں دکھائی دیں گے</translation> <translation id="49265687513387605">اسکرین کاسٹ کرنے سے قاصر۔ چیک کر کے دیکھیں کہ آیا آپ نے اپنی اسکرین کا اشتراک کرنے کیلئے پرامپٹ کی توثیق کر دی ہے۔</translation> <translation id="4927753642311223124">یہاں دیکھنے کیلئے کچھ نہیں ہے، آگے بڑھیں۔</translation> +<translation id="4928629450964837566">نسبتًا محفوظ پاس ورڈ کا استعمال کریں</translation> <translation id="4929386379796360314">پرنٹ کی منزلیں</translation> <translation id="4930447554870711875">ڈویلپرز</translation> <translation id="4930714375720679147">آن کریں</translation> @@ -4614,6 +4622,7 @@ <translation id="5010886807652684893">ویژوئل منظر</translation> <translation id="5015344424288992913">پراکسی کو حل کیا جا رہا ہے…</translation> <translation id="5016491575926936899">آپ اپنے کمپیوٹر سے ٹیکسٹ بھیج، اپنے انٹرنیٹ کنکشن کا اشتراک، گفتگو کی اطلاعات کا جواب اور اپنے فون کے ساتھ اپنا <ph name="DEVICE_TYPE" /> غیر مقفل کر سکتے ہیں۔<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> +<translation id="5016983299133677671">نیا پاس ورڈ آزمائیں</translation> <translation id="5017643436812738274">آپ اپنے صفحات کو ٹیکسٹ کرسر سے نیویگیٹ کر سکتے ہیں۔ آف کرنے کے لیے Ctrl+Search+7 دبائیں۔</translation> <translation id="5018207570537526145">ایکسٹینشن ویب سائٹ کھولیں</translation> <translation id="5018526990965779848">استعمال اور ڈائیگناسٹک کا ڈیٹا بھیجیں۔ Google کو خودکار طور پر ڈائیگناسٹک، آلے اور ایپ کے استعمال کا ڈیٹا بھیج کر اپنا Android تجربہ بہتر بنانے میں مدد کریں۔ اس سے سسٹم اور ایپ کے استحکام اور دیگر بہتریوں میں مدد ملے گی۔ کچھ مجموعی ڈیٹا Google ایپس اور پارٹنرز، جیسے Android ڈیولپرز، کی مدد بھی کرے گا۔ اگر آپ کی ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو آپ کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔</translation> @@ -4682,6 +4691,7 @@ <translation id="5078638979202084724">سبھی ٹیبز کو بُک مارک کریں</translation> <translation id="5078796286268621944">غلط PIN</translation> <translation id="5079010647467150187">پہلے سے موجود VPN کو شامل کریں...</translation> +<translation id="5079699784114005398">آن ہونے کے بعد، اپنے Google اکاؤنٹ سے سائن ان کرنے پر آپ کی ایپس کسی بھی ChromeOS آلات پر دستیاب ہوں گی۔ Chrome براؤزر سے انسٹال کردہ ویب ایپس کی مطابقت پذیری ہو جائے گی چاہے براؤزر کی مطابقت پذیری آف ہی کیوں نہ ہو۔</translation> <translation id="508059534790499809">Kerberos ٹکٹ ریفریش کریں</translation> <translation id="5081960376148623587">منتخب کریں کہ آیا صفحات کو پیشگی لوڈ کیا جائے</translation> <translation id="5084328598860513926">فراہمی کے بہاؤ میں مداخلت ہو گئی۔ براہ کرم دوبارہ کوشش کریں یا اپنے آلہ کے مالک یا منتظم سے رابطہ کریں۔ خرابی کا کوڈ: <ph name="ERROR_CODE" />۔</translation> @@ -4757,6 +4767,7 @@ <translation id="5145464978649806571">اگر آپ اپنے آلے سے دور ہو جاتے ہیں تو آپ کی اسکرین خودکار طور پر مقفل ہو جائے گی۔ جب آپ اپنے آلے کے سامنے ہوں گے تو آپ کی اسکرین زیادہ دیر تک فعال رہے گی۔ اگر مقفل اسکرین غیر فعال ہوتی ہے تو آپ کا آلہ مقفل ہونے کے بجائے سلیپ وضع میں چلا جائے گا۔</translation> <translation id="514575469079499857">مقام کا تعین کرنے کے لیے اپنا IP پتہ استعمال کریں (ڈیفالٹ)</translation> <translation id="5146896637028965135">سسٹم کی آواز</translation> +<translation id="5147992672778369947">تجویز کردہ پاس ورڈ استعمال کریں</translation> <translation id="5148277445782867161">آپ کے آلہ کا مقام متعین کرنے میں مدد کرنے کے لئے Google کی مقام کی سروس Wi-Fi، موبائل نیٹ ورکس اور سینسرز جیسے ذرائع کا استعمال کرتی ہے۔</translation> <translation id="5150254825601720210">Netscape سرٹیفکیٹ SSL سرور کا نام</translation> <translation id="5151354047782775295">ڈسک کی جگہ خالی کریں یا منتخب کردہ ڈیٹا خودکار طور پر حذف ہوسکتا ہے</translation> @@ -5042,6 +5053,7 @@ <translation id="5414566801737831689">اپنی ملاحظہ کردہ سائٹس کے آئیکنز کو پڑھیں</translation> <translation id="5414836363063783498">توثیق ہو رہی ہے…</translation> <translation id="5417312524372586921">براؤزر تھیمز</translation> +<translation id="5417353542809767994">فوری طور پر ایک مضبوط پاس ورڈ کا استعمال کریں</translation> <translation id="541737483547792035">اسکرین کو بڑا کریں</translation> <translation id="5419405654816502573">Voice Match</translation> <translation id="5420274697768050645">اضافی سیکیورٹی کیلئے آلہ کو غیر مقفل کرنے کیلئے پاس ورڈ کی ضرورت ہوتی ہے</translation> @@ -5162,6 +5174,7 @@ <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation> <translation id="5518949581554491184">Android فون کے ساتھ سیٹ اپ کریں</translation> <translation id="5519195206574732858">LTE</translation> +<translation id="5519900055135507385">اس اکاؤنٹ کو کسی مضبوط پاس ورڈ کے ذریعے مزید محفوظ رکھیں۔ اسے <ph name="EMAIL" /> کے لیے <ph name="GOOGLE_PASSWORD_MANAGER" /> میں محفوظ کیا جائے گا۔</translation> <translation id="5521078259930077036">کیا یہی وہ ہوم صفحہ ہے جس کی آپ توقع کر رہے تھے؟</translation> <translation id="5522156646677899028">اس ایکسٹینشن میں ایک سنگین سیکیورٹی خطرہ شامل ہے۔</translation> <translation id="5522403133543437426">ایڈریس بار میں سرچ انجن کا استعمال کیا جاتا ہے۔</translation> @@ -5780,6 +5793,7 @@ <translation id="6070311415473175157">تلاش کرنے کے لیے تصویر کا علاقہ منتخب کریں</translation> <translation id="6071181508177083058">پاس ورڈ کی توثیق کریں</translation> <translation id="6071576563962215370">سسٹم آلہ کے انسٹالیشن کے وقت کے انتسابات کا لاک تشکیل دینے میں ناکام ہوگیا۔</translation> +<translation id="6071938745001252305"><ph name="MEMORY_VALUE" /> میموری کی بچت ہوئی</translation> <translation id="6072442788591997866">اس آلہ پر <ph name="APP_NAME" /> کی اجازت نہیں ہے۔ اپنے منتظم سے رابطہ کریں۔ خرابی کا کوڈ: <ph name="ERROR_CODE" />۔</translation> <translation id="6073451960410192870">ریکارڈنگ روکیں</translation> <translation id="6073903501322152803">ایکسیسبیلٹی کی خصوصیات شامل کریں</translation> @@ -5827,6 +5841,7 @@ <translation id="6104068876731806426">Google اکاؤنٹس</translation> <translation id="6104311680260824317">ڈومین میں آلہ کو شامل نہیں کیا جا سکا۔ سرور متعین Kerberos مرموز کاری کی اقسام کو سپورٹ نہیں کرتا ہے۔ مرموز کاری کی ترتیبات کے لیے "مزید احتیارات" چیک کریں۔</translation> <translation id="6104796831253957966">پرنٹر کی قطار فُل ہے</translation> +<translation id="6104929924898022309">فنکشن کلیدوں کے رویے کو تبدیل کرنے کے لیے تلاش کی کلید کا استعمال کریں</translation> <translation id="6106167152849320869">اگر آپ گزشتہ مرحلے میں ڈائیگناسٹک اور استعمال کا ڈیٹا بھیجنے کا بھی انتخاب کرتے ہیں تو یہ ڈیٹا انسٹال شدہ ایپس کے لیے جمع کیا جائے گا۔</translation> <translation id="6111972606040028426">Google اسسٹنٹ کو فعال کریں</translation> <translation id="6112294629795967147">سائز تبدیل کرنے کے لیے ٹچ کریں</translation> @@ -5968,6 +5983,7 @@ <translation id="6234108445915742946">Chrome کی سروس کی شرائط 31 مارچ کو بدل رہی ہیں</translation> <translation id="6234474535228214774">انسٹال زیر التوا ہے</translation> <translation id="6235208551686043831">آلہ کا کیمرا آن ہو گیا ہے۔ براہ کرم اپنے eSIM کے QR کوڈ کو کیمرے کے سامنے رکھیں۔</translation> +<translation id="6237297174664969437">آپ کسی بھی وقت یہ منتخب کر سکتے ہیں کہ براؤزر کے کون سے ڈیٹا کو Chrome کی ترتیبات میں مطابقت پذیر کرنا ہے۔ <ph name="LINK_BEGIN" />آلے کی ترتیبات<ph name="LINK_END" /> میں، آپ Chrome براؤزر سے انسٹال کردہ ویب ایپس کے لیے مطابقت پذیری کو کنٹرول کر سکتے ہیں۔ Google آپ کی سرگزشت کی بنیاد پر تلاش اور دیگر سروسز کو ذاتی نوعیت کا بنا سکتا ہے۔</translation> <translation id="6237474966939441970">اسٹائلس نوٹ لینے والی ایپ</translation> <translation id="623755660902014047">Reading Mode</translation> <translation id="6238767809035845642">دوسرے آلے سے اشتراک کردہ متن</translation> @@ -6301,6 +6317,7 @@ <translation id="6537613839935722475">نام حروف، اعداد اور ہائفنز (-) کا استعمال کر سکتا ہے</translation> <translation id="6538098297809675636">کوڈ کا پتہ لگانے میں خرابی</translation> <translation id="653920215766444089">پوائنٹنگ آلات کی تلاش کی جا رہی ہے</translation> +<translation id="6539674013849300372">مضبوط پاس ورڈ کی مدد سے آن لائن نسبتًا زیادہ محفوظ رہیں۔ اسے <ph name="EMAIL" /> کے لیے <ph name="GOOGLE_PASSWORD_MANAGER" /> میں محفوظ کیا جائے گا۔</translation> <translation id="653983593749614101">دوبارہ شروع ہو رہا ہے...</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />نوٹ:<ph name="END_BOLD" /> صرف اس وقت فعال کریں جب آپ کو معلوم ہو کہ آپ کیا کر رہے ہیں یا اگر آپ سے ایسا کرنے کو کہا گیا ہو، کیونکہ ڈیٹا جمع کرنے سے کارکردگی کم ہو سکتی ہے۔</translation> <translation id="6541638731489116978">اس سائٹ کو آپ کے موشن سینسرز تک رسائی حاصل کرنے سے مسدود کر دیا گیا ہے۔</translation> @@ -6495,6 +6512,7 @@ <translation id="671226373742585927">سائیڈ پینل کو بند کرنے کے لیے "X" بٹن پر کلک کریں</translation> <translation id="6712943853047024245">آپ نے پہلے ہی <ph name="WEBSITE" /> کے لیے اس صارف نام کے ساتھ پاس ورڈ محفوظ کیا ہے</translation> <translation id="6713233729292711163">دفتری پروفائل شامل کریں</translation> +<translation id="6713441551032149301">فنکشن کلیدوں اور سسٹم کی سر فہرست قطار کی کلیدوں کے درمیان تبدیل کرنے کے لیے لانچر کلید کو ہولڈ کریں</translation> <translation id="6713668088933662563">ان زبانوں کو ترجمہ کرنے کی کبھی بھی پیشکش نہ کریں</translation> <translation id="6715803357256707211">آپ کی Linux ایپلیکیشن کو انسٹال کرنے کے دوران ایک خرابی پیش آ گئی۔ تفصیلات کے لیے اطلاع پر کلک کریں۔</translation> <translation id="671619610707606484">اس سے سائٹس کا اسٹور کردہ <ph name="TOTAL_USAGE" /> ڈیٹا صاف ہو جائے گا</translation> @@ -6616,6 +6634,7 @@ <translation id="6811034713472274749">صفحہ دیکھے جانے کیلئے تیار ہے</translation> <translation id="6811151703183939603">مضبوط</translation> <translation id="6811332638216701903">DHCP میزبان کا نام</translation> +<translation id="6811792477922751991">فنکشن کلیدوں کے رویے کو تبدیل کرنے کے لیے لانچر کلید کا استعمال کریں</translation> <translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> کو root کے بطور نہیں چلایا جا سکتا ہے۔</translation> <translation id="6812841287760418429">تبدیلیاں برقرار رکھیں</translation> <translation id="6813907279658683733">پوری اسکرین</translation> @@ -7810,6 +7829,7 @@ <translation id="7851720427268294554">IPP پارسر</translation> <translation id="78526636422538552">مزید Google اکاؤنٹس شامل کرنے کا عمل غیر فعال ہے</translation> <translation id="7853747251428735">مزید ٹولز</translation> +<translation id="7853999103056713222">نسبتًا محفوظ پاس ورڈ کا استعمال کریں</translation> <translation id="7855678561139483478">ٹیب کو نئی ونڈو میں منتقل کریں</translation> <translation id="7857004848504343806">آپ کے کمپیوٹر میں ایک محفوظ ماڈیول شامل ہے جو سیکیورٹی کی کئی اہم خصوصیات کو ChromeOS Flex میں لاگو کرنے کیلئے استعمال ہوتا ہے۔ مزید جاننے کیلئے Chromebook کا مرکز امداد ملاحظہ کریں: https://support.google.com/chromebook/?p=sm</translation> <translation id="7857093393627376423">متنی تجاویز</translation> @@ -8364,6 +8384,7 @@ <translation id="8325413836429495820">آپ کے کلپ بورڈ کو دیکھنے کی اجازت نہیں ہے</translation> <translation id="8326478304147373412">PKCS #7، سرٹیفیکیٹ چین</translation> <translation id="8327386430364625757">ریاضی کا فونٹ</translation> +<translation id="8327538105740918488">آپ بعد میں کبھی بھی اس پاس ورڈ کو تبدیل کر سکتے ہیں۔ اسے <ph name="EMAIL" /> کے لیے <ph name="GOOGLE_PASSWORD_MANAGER" /> میں محفوظ کیا جائے گا۔</translation> <translation id="8327676037044516220">اجازتیں اور مواد کی ترتیبات</translation> <translation id="8330617762701840933">ان ویب سائٹس کی فہرست جو متبادل براؤزر پر ری ڈائریکٹ ہوتی ہیں۔</translation> <translation id="8330689128072902965">قریبی رابطے آپ کے ساتھ اشتراک کر سکتے ہیں۔ تبدیل کرنے کے لیے کلک کریں۔</translation> @@ -8509,6 +8530,7 @@ <translation id="8449836157089738489">سبھی کو نئے ٹیب گروپ میں کھولیں</translation> <translation id="8451512073679317615">اسسٹنٹ</translation> <translation id="845702320058262034">منسلک نہیں ہو سکتا۔ یقینی بنائیں کہ آپ کے فون کا بلوٹوتھ آن ہے۔</translation> +<translation id="8457251154056341970">آپ کو دوبارہ اس صفحے پر <ph name="MODULE_NAME" /> دکھائی نہیں دیں گے</translation> <translation id="8457451314607652708">بُک مارکس درآمد کریں</translation> <translation id="8458341576712814616">شارٹ کٹ</translation> <translation id="8458627787104127436">سبھی (<ph name="URL_COUNT" />) کو نئی ونڈو میں کھولیں</translation> @@ -8581,6 +8603,7 @@ <translation id="8514955299594277296">سائٹس کو اپنے آلے پر ڈیٹا محفوظ کرنے کی اجازت نہ دیں (تجویز نہیں کی جاتی ہے)</translation> <translation id="8517759303731677493">ترمیم کریں…</translation> <translation id="8519895319663397036">پاس ورڈز درآمد نہیں کر سکتے۔ فائل کا سائز 150 KB سے کم ہونا چاہیے۔</translation> +<translation id="851991974800416566">فوری طور پر ایک مضبوط پاس ورڈ کا استعمال کریں</translation> <translation id="8523493869875972733">تبدیلیاں برقرار رکھیں</translation> <translation id="8523849605371521713">پالیسی کے ذریعے شامل کیا گیا</translation> <translation id="8524783101666974011">کارڈز کو اپنے Google اکاؤنٹ میں محفوظ کریں</translation> @@ -8738,6 +8761,7 @@ <translation id="8665110742939124773">آپ نے ایک غلط رسائی کوڈ درج کیا ہے۔ دوبارہ کوشش کریں۔</translation> <translation id="8665180165765946056">بیک اپ مکمل ہو گیا</translation> <translation id="866611985033792019">ای میل صارفین کی شناخت کرنے کیلئے اس سرٹیفکیٹ پر بھروسہ کریں</translation> +<translation id="8666268818656583275">F کلیدوں کا رویہ اب سسٹم کی سرفہرست قطار کی کلیدوں جیسا ہوگا</translation> <translation id="8666321716757704924"><ph name="WEBSITE" /> کے لیے اجازتوں کو دوبارہ اجازت مل گئی</translation> <translation id="8666759526542103597">براؤزر کی بنیاد اشتہار کی ذاتی نوعیت سازی کے بارے میں</translation> <translation id="8667261224612332309">آپ کے پاس ایسے پاس ورڈز ہیں جنہیں بہتر بنایا جا سکتا ہے</translation> @@ -9420,6 +9444,7 @@ <translation id="950307215746360464">سیٹ اپ کی گائیڈ</translation> <translation id="951991426597076286">مسترد کریں</translation> <translation id="952471655966876828">آلہ کے آن ہونے اور استعمال ہونے پر یہ خودکار طور پر منسلک ہو جائے گا</translation> +<translation id="952880932803612259">ایپس، ویب سائٹس اور سسٹم سروسز کو اپنا مقام استعمال کرنے کی اجازت دیں۔ آپ کے آلہ کے مقام کا تعین کرنے میں مدد کرنے کے لیے، مقام Wi‑Fi، موبائل نیٹ ورکس اور سینسرز جیسے وسائل کا استعمال کر سکتا ہے۔</translation> <translation id="953434574221655299">آپ اپنے آلے کا فعال طور پر استعمال کب کر رہے ہیں یہ جاننے کی اجازت ہے</translation> <translation id="956500788634395331">آپ ممکنہ طور پر نقصان دہ ایکسٹینشنز سے محفوظ ہیں</translation> <translation id="957179356621191750">6 نقطہ</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index f0fb743..553ab25 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -190,7 +190,7 @@ <translation id="1155545602507378023">否,仅限此设备</translation> <translation id="1155816283571436363">正在连接到您的手机</translation> <translation id="1158080958325422608">转换为大写</translation> -<translation id="1158238185437008462">查看回忆集锦</translation> +<translation id="1158238185437008462">查看回忆</translation> <translation id="1160842321113409343">为保护您的隐私,一旦网站的保留时长超过 4 周,系统便会自动从列表中删除相应网站。您再次访问的网站可能会重新出现在列表中。如果您不希望系统(再)根据某个网站来推测您的兴趣,也可自行移除相应网站。</translation> <translation id="1161575384898972166">请登录“<ph name="TOKEN_NAME" />”,导出客户端证书。</translation> <translation id="116173250649946226">您的管理员已设置默认主题,您无法更改。</translation> @@ -395,7 +395,7 @@ <translation id="1338631221631423366">正在配对…</translation> <translation id="1338802252451106843"><ph name="ORIGIN" /> 想打开此应用。</translation> <translation id="1338950911836659113">正在删除…</translation> -<translation id="1339009753652684748">只需说“Ok Google”即可使用您的 Google 助理。为了省电,请选择“开启(推荐)”。选择这一选项后,只有当您的设备已接通电源或正在充电时,Google 助理才会做出响应。</translation> +<translation id="1339009753652684748">只需说“Hey Google”即可使用您的 Google 助理。为了省电,请选择“开启(推荐)”。选择这一选项后,只有当您的设备已接通电源或正在充电时,Google 助理才会做出响应。</translation> <translation id="13392265090583506">无障碍设置</translation> <translation id="1340527397989195812">使用“文件”应用备份设备上的媒体。</translation> <translation id="1341701348342335220">太棒了,全部完成!</translation> @@ -1545,7 +1545,7 @@ <translation id="23030561267973084">“<ph name="EXTENSION_NAME" />”请求获得更多权限。</translation> <translation id="2306794767168143227">保存到此设备上的 <ph name="BRAND" /></translation> <translation id="2307462900900812319">配置网络</translation> -<translation id="2307553512430195144">如果您同意,Google 助理将会在待机模式下等待检测“Ok Google”,并可以通过 Voice Match 识别出是<ph name="SUPERVISED_USER_NAME" />在说话。 +<translation id="2307553512430195144">如果您同意,Google 助理将会在待机模式下等待检测“Hey Google”,并可以通过 Voice Match 识别出是<ph name="SUPERVISED_USER_NAME" />在说话。 <ph name="BR" /> 借助 Voice Match,Google 助理可在您的 <ph name="DEVICE_TYPE" /> 上识别出<ph name="SUPERVISED_USER_NAME" />的语音,从而将其与他人区分开。 <ph name="BR" /> @@ -2614,7 +2614,7 @@ <translation id="3244294424315804309">继续保持静音</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - 网络错误</translation> <translation id="3248902735035392926">安全至上。请花点时间<ph name="BEGIN_LINK" />立即检查一下您的扩展程序<ph name="END_LINK" />吧</translation> -<translation id="3251714896659475029">允许<ph name="SUPERVISED_USER_NAME" />使用“Ok Google”指令启动 Google 助理</translation> +<translation id="3251714896659475029">允许<ph name="SUPERVISED_USER_NAME" />使用“Hey Google”指令启动 Google 助理</translation> <translation id="3251759466064201842"><未包含在证书中></translation> <translation id="325238099842880997">设置数字设备基本使用规则,以方便孩子在家中玩乐、探索和完成学校作业</translation> <translation id="3253448572569133955">未知帐号</translation> @@ -3622,7 +3622,7 @@ <translation id="4116704186509653070">重新打开</translation> <translation id="4117714603282104018">触控板触感反馈</translation> <translation id="4118579674665737931">请重新启动此设备,然后重试。</translation> -<translation id="412022815379960229">登录后即可开始浏览您在 Google 相册中的回忆集锦。</translation> +<translation id="412022815379960229">登录后即可开始浏览您在 Google 相册中的回忆。</translation> <translation id="4120388883569225797">无法重置此安全密钥</translation> <translation id="4120817667028078560">路径过长</translation> <translation id="4124823734405044952">您的安全密钥已重置完毕</translation> @@ -3860,7 +3860,7 @@ <translation id="4348766275249686434">收集各项错误</translation> <translation id="4349828822184870497">有用</translation> <translation id="4350230709416545141">始终禁止 <ph name="HOST" /> 使用您的位置信息</translation> -<translation id="4350782034419308508">Ok Google</translation> +<translation id="4350782034419308508">Hey Google</translation> <translation id="4351770750390404505"><ph name="BEGIN_PARAGRAPH1" />为了提供最佳体验,<ph name="DEVICE_OS" /> 会收集与设备有关的硬件数据并将其分享给 Google,以确定应提供哪些更新。您也可允许 Google 将这些数据用于其他用途,例如提供支持以及改进 <ph name="DEVICE_OS" /> 体验和服务。<ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" />您可在此设备上登录,然后访问 chrome://system 中的 CHROMEOSFLEX_HARDWARE_INFO 部分,以查看向 Google 发送的用于更新过滤机制的数据,以及您选择与 Google 分享数据的所有其他情形。<ph name="END_PARAGRAPH2" /><ph name="BEGIN_PARAGRAPH3" />如需详细了解 <ph name="DEVICE_OS" /> 可能会与 Google 分享的数据及其使用方式,请访问 g.co/flex/HWDataCollection。<ph name="END_PARAGRAPH3" /></translation> <translation id="4354073718307267720">在网站想为您的周边环境创建 3D 地图或跟踪摄像头位置时询问您</translation> <translation id="4354344420232759511">您访问的网站将显示在此处</translation> @@ -3997,7 +3997,7 @@ <translation id="4461483878391246134">添加一律不提供翻译的语言</translation> <translation id="4462159676511157176">自定义域名服务器</translation> <translation id="4465236939126352372">为“<ph name="APP_NAME" />”设置了 <ph name="TIME" />的使用时限</translation> -<translation id="4466839823729730432">在此处查看您的回忆集锦</translation> +<translation id="4466839823729730432">在此处查看您的回忆</translation> <translation id="4469324811108161144">备注最多可以包含 <ph name="CHARACTER_LIMIT" /> 个字符。</translation> <translation id="4469762931504673593"><ph name="ORIGIN" /> 可修改“<ph name="FOLDERNAME" />”内的文件</translation> <translation id="4470957202018033307">外部存储偏好设置</translation> @@ -4310,7 +4310,7 @@ <translation id="4743260470722568160"><ph name="BEGIN_LINK" />了解如何更新应用<ph name="END_LINK" /></translation> <translation id="4744268813103118742">前往网站</translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{将这个网站取消静音}other{将这些网站取消静音}}</translation> -<translation id="474609389162964566">说“Ok Google”即可启动 Google 助理</translation> +<translation id="474609389162964566">说“Hey Google”即可启动 Google 助理</translation> <translation id="4746351372139058112">信息</translation> <translation id="4748783296226936791">网站通常会连接到 HID 设备以实现某些需要使用非标准键盘、游戏控制器和其他设备的功能</translation> <translation id="4749960740855309258">打开新标签页</translation> @@ -5054,7 +5054,7 @@ <translation id="5435779377906857208">始终允许 <ph name="HOST" /> 使用您的位置信息</translation> <translation id="5436492226391861498">正在等待代理隧道的响应...</translation> <translation id="5436510242972373446">用 <ph name="SITE_NAME" /> 搜索:</translation> -<translation id="5436575196282187764">Google 相册中的回忆集锦</translation> +<translation id="5436575196282187764">Google 相册中的回忆</translation> <translation id="5439680044267106777">跳过此步骤并设置新的个人资料</translation> <translation id="544083962418256601">创建快捷方式...</translation> <translation id="5441133529460183413">从 Chrome 浏览器安装的 Web 应用</translation> @@ -5280,7 +5280,7 @@ <translation id="5632566673632479864">您的帐号 <ph name="EMAIL" /> 已无法再用作主帐号。该帐号由 <ph name="DOMAIN" /> 管理,因此您的书签、历史记录、密码及其他设置将从此设备中清除。</translation> <translation id="5633149627228920745">详细了解系统要求</translation> <translation id="563371367637259496">移动网络</translation> -<translation id="5634446357546764049">查看近期旅行等活动的回忆集锦</translation> +<translation id="5634446357546764049">查看近期旅行等活动的回忆</translation> <translation id="5635091213277904818">Chrome 会自动删除保留时长超过 30 天的网站。您再次访问的网站可能会重新出现在列表中。您也可以禁止某个网站向您展示建议的广告。</translation> <translation id="5635312199252507107">在特定网站上允许</translation> <translation id="5636012309446422">从 <ph name="PRIMARY_EMAIL" /> 中移除“<ph name="DEVICE" />”?</translation> @@ -5398,7 +5398,7 @@ <translation id="5747809636523347288">粘贴并转到 <ph name="URL" /></translation> <translation id="5748137879145720682">在拔下计算机电源线时开启</translation> <translation id="5751345516399502412">检查网络共享就绪与否</translation> -<translation id="5755022574660047665">Google 相册中的回忆集锦</translation> +<translation id="5755022574660047665">Google 相册中的回忆</translation> <translation id="5756163054456765343">帮助中心(&E)</translation> <translation id="5758631781033351321">您的阅读清单会显示在此处</translation> <translation id="5759728514498647443">您通过“<ph name="APP_NAME" />”发送以进行打印的文档可由“<ph name="APP_NAME" />”读取。</translation> @@ -5756,7 +5756,7 @@ <translation id="6059925163896151826">USB 设备</translation> <translation id="6061408389284235459">通知已发送至<ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">创建二维码</translation> -<translation id="6063847492705284550"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与<ph name="SUPERVISED_USER_NAME" />相似或拥有后者的语音录音,此人可能也能获取后者的个人信息相关结果。为了省电,您可以在<ph name="SUPERVISED_USER_NAME" />的 Google 助理设置中选择让“Ok Google”指令仅在此设备已接通电源时可用。</translation> +<translation id="6063847492705284550"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与<ph name="SUPERVISED_USER_NAME" />相似或拥有后者的语音录音,此人可能也能获取后者的个人信息相关结果。为了省电,您可以在<ph name="SUPERVISED_USER_NAME" />的 Google 助理设置中选择让“Hey Google”指令仅在此设备已接通电源时可用。</translation> <translation id="6064217302520318294">屏幕锁定</translation> <translation id="6065145031947216733">单独存储您的浏览数据?</translation> <translation id="6065289257230303064">证书主题背景目录属性</translation> @@ -6035,7 +6035,7 @@ <translation id="6308493641021088955">登录服务提供方:<ph name="EXTENSION_NAME" /></translation> <translation id="6308937455967653460">链接另存为(&K)...</translation> <translation id="6309443618838462258">您的管理员不允许使用此输入法</translation> -<translation id="630948338437014525">回忆集锦</translation> +<translation id="630948338437014525">回忆</translation> <translation id="6309510305002439352">麦克风已关闭</translation> <translation id="6310141306111263820">无法安装 eSIM 卡配置文件。如需帮助,请与您的运营商联系。</translation> <translation id="6311220991371174222">打开您的个人资料时出了点问题,无法启动 Chrome。请尝试重新启动 Chrome。</translation> @@ -6335,7 +6335,7 @@ <translation id="6584878029876017575">Microsoft 生存时间签名</translation> <translation id="6585584201072946561">自定义网络浏览器的文字大小和字体</translation> <translation id="6586099239452884121">访客浏览</translation> -<translation id="6586213706115310390">只需说“Ok Google”即可使用您的 Google 助理。</translation> +<translation id="6586213706115310390">只需说“Hey Google”即可使用您的 Google 助理。</translation> <translation id="6586451623538375658">切换鼠标主按钮</translation> <translation id="6588043302623806746">使用安全 DNS</translation> <translation id="6588047202935130957">当您浏览网页时,此处可能会列出您的兴趣</translation> @@ -6589,7 +6589,7 @@ <translation id="6808166974213191158">ChromeOS Flex 系统映像写入工具</translation> <translation id="6808193438228982088">狐狸</translation> <translation id="6809470175540814047">在无痕式窗口中打开</translation> -<translation id="6809656734323672573">如果您同意,Google 助理将会在待机模式下等待检测“Ok Google”指令,并可以通过 Voice Match 识别出是您在说话。 +<translation id="6809656734323672573">如果您同意,Google 助理将会在待机模式下等待检测“Hey Google”指令,并可以通过 Voice Match 识别出是您在说话。 <ph name="BR" /> 借助 Voice Match 功能,Google 助理能够识别出您的语音,从而将您与他人区分开。Google 助理会录制您的语音剪辑以创建专属语音模型,这个语音模型只会存储在您的设备上。系统可能会暂时将您的语音模型发送给 Google,以便更准确地识别您的语音。 <ph name="BR" /> @@ -7136,7 +7136,7 @@ <translation id="7299337219131431707">启用访客浏览</translation> <translation id="7299515639584427954">为默认应用更改受支持的链接?</translation> <translation id="7299588179200441056"><ph name="URL" /> - <ph name="FOLDER" /></translation> -<translation id="7301470816294041580">您可以这样问:“Ok Google,这是什么歌?”或“Ok Google,我的屏幕上显示的是什么?”</translation> +<translation id="7301470816294041580">您可以这样问:“Hey Google,这是什么歌?”或“Hey Google,我的屏幕上显示的是什么?”</translation> <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{这款应用可能会致使 Chrome 无法正常运行。}other{这些应用可能会致使 Chrome 无法正常运行。}}</translation> <translation id="7303281435234579599">糟糕!设置演示模式时出了点问题。</translation> <translation id="7303900363563182677">此网站已被阻止查看复制到剪贴板的文字和图片</translation> @@ -7192,7 +7192,7 @@ <translation id="7356908624372060336">网络日志</translation> <translation id="7357271391997763660">是否运行密码检查?</translation> <translation id="735745346212279324">VPN 连接已断开</translation> -<translation id="7358324924540718595">今天已隐藏回忆集锦</translation> +<translation id="7358324924540718595">今天已隐藏回忆</translation> <translation id="7358338787722390626">关闭侧边栏中的搜索工具栏。</translation> <translation id="735994578317267253">在任意 Chrome 操作系统设备上使用您的应用、设置等等</translation> <translation id="7360233684753165754">通过“<ph name="PRINTER_NAME" />”打印 <ph name="PAGE_NUMBER" /> 个页面</translation> @@ -7287,7 +7287,7 @@ <translation id="7423807071740419372"><ph name="APP_NAME" /> 需要获得相应权限才能运行</translation> <translation id="7424153922653300265">节能模式已开启</translation> <translation id="7424818322350938336">已添加网络</translation> -<translation id="7427315069950454694">今天的回忆集锦</translation> +<translation id="7427315069950454694">今天的回忆</translation> <translation id="7427348830195639090">后台网页:<ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">通过<ph name="DEVICE_NAME" />拨打电话</translation> <translation id="7429415133937917139">在屏幕顶部的 ChromeVox 面板中 @@ -7606,7 +7606,7 @@ <translation id="7690853182226561458">添加文件夹(&F)...</translation> <translation id="7691073721729883399">无法为该自助服务终端应用装载 cryptohome。</translation> <translation id="7691077781194517083">无法重置此安全密钥。错误代码为 <ph name="ERROR_CODE" />。</translation> -<translation id="7691163173018300413">“Ok Google”</translation> +<translation id="7691163173018300413">“Hey Google”</translation> <translation id="7691698019618282776">Crostini 升级</translation> <translation id="7694246789328885917">荧光笔工具</translation> <translation id="7696063401938172191">在您的“<ph name="PHONE_NAME" />”上:</translation> @@ -7789,7 +7789,7 @@ <translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />允许 Chrome 操作系统设备自动发送报告,可以帮助我们确定 Chrome 操作系统中需要优先解决的问题和优先改进的方面。这些报告可能包含的内容有:Chrome 操作系统的崩溃时间、使用的功能、通常占用的内存量、Android 应用诊断数据和使用情况数据,等等。部分汇总数据还会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />您随时可在 Chrome 操作系统设备的设置中开始或停止发送这些报告。如果您是网域管理员,则可在管理控制台中更改这一设置。<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />如果您已为自己的 Google 帐号开启“网络与应用活动记录”设置,您的 Android 数据可能会被保存到您的 Google 帐号中。您可在 account.google.com 上查看和删除您的数据以及更改您的帐号设置。<ph name="END_PARAGRAPH3" /></translation> -<translation id="7851021205959621355"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与您相似或拥有您的语音录音,此人可能也能获取您的个人信息相关结果或使用您的 Google 助理。为了省电,您可以在 Google 助理设置中选择让“Ok Google”指令仅在此设备已接通电源时可用。</translation> +<translation id="7851021205959621355"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与您相似或拥有您的语音录音,此人可能也能获取您的个人信息相关结果或使用您的 Google 助理。为了省电,您可以在 Google 助理设置中选择让“Hey Google”指令仅在此设备已接通电源时可用。</translation> <translation id="7851457902707056880">仅所有者帐号才能登录。请重新启动并使用所有者帐号登录。设备将在30秒后自动重新启动。</translation> <translation id="7851716364080026749">始终禁止使用摄像头和麦克风</translation> <translation id="7851720427268294554">IPP 解析器</translation> @@ -8447,7 +8447,7 @@ <translation id="8410775397654368139">Google Play</translation> <translation id="8412136526970428322">授予了“<ph name="PERMISSION" />”权限和另外 <ph name="COUNT" /> 项权限</translation> <translation id="8413956290606243087">您想为 Chrome 操作系统启用 ChromeVox(内置屏幕阅读器)吗?</translation> -<translation id="8414249071344507766">回忆集锦已设为隐藏两天</translation> +<translation id="8414249071344507766">回忆已设为隐藏两天</translation> <translation id="8414396119627470038">通过 <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 登录 <ph name="SITE_ETLD_PLUS_ONE" /></translation> <translation id="8414685983518053656">备注</translation> <translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />%(保护套)</translation> @@ -9390,7 +9390,7 @@ <translation id="936646668635477464">摄像头和麦克风</translation> <translation id="936801553271523408">系统诊断数据</translation> <translation id="93766956588638423">修复扩展程序</translation> -<translation id="938568644810664664">不妨试着这样问:“Ok Google,这是什么歌?”或“Ok Google,我的屏幕上显示的是什么?”</translation> +<translation id="938568644810664664">不妨试着这样问:“Hey Google,这是什么歌?”或“Hey Google,我的屏幕上显示的是什么?”</translation> <translation id="938623846785894166">不常用的文件</translation> <translation id="939401694733344652">目前这些帐号并未用于 Android 应用。如果您选择了一个帐号用于该 Android 应用,那么此帐号也可用于其他 Android 应用。您可在<ph name="LINK_BEGIN" />设置 > 帐号<ph name="LINK_END" />部分中更改 Android 应用的权限。</translation> <translation id="939598580284253335">请输入密码</translation> @@ -9454,7 +9454,7 @@ <translation id="995755448277384931">添加 IBAN</translation> <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">正在建立安全连接...</translation> -<translation id="996803490569799917">查看与亲朋好友相聚时刻的回忆集锦</translation> +<translation id="996803490569799917">查看与亲朋好友相聚时刻的回忆</translation> <translation id="997143476478634194">网站会在您访问时自动采用此设置。网站通常会传送通知,以便您知悉重大新闻或聊天消息。</translation> <translation id="99731366405731005">您需要开启 <ph name="LINK1_BEGIN" />Chrome 同步<ph name="LINK1_END" />才能使用 Wi-Fi 同步功能。<ph name="LINK2_BEGIN" />了解详情<ph name="LINK2_END" /></translation> <translation id="998747458861718449">检查(&N)</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index b50bf31..1f110b3 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1373,6 +1373,10 @@ "privacy_sandbox/privacy_sandbox_settings_delegate.h", "privacy_sandbox/privacy_sandbox_settings_factory.cc", "privacy_sandbox/privacy_sandbox_settings_factory.h", + "private_network_access/chrome_private_network_device_delegate.cc", + "private_network_access/chrome_private_network_device_delegate.h", + "private_network_access/private_network_device_chooser_controller.cc", + "private_network_access/private_network_device_chooser_controller.h", "process_resource_usage.cc", "process_resource_usage.h", "process_singleton.h", @@ -4030,6 +4034,10 @@ "preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.h", "preloading/preloading_features.cc", "preloading/preloading_features.h", + "private_network_access/chrome_private_network_device_chooser.cc", + "private_network_access/chrome_private_network_device_chooser.h", + "private_network_access/chrome_private_network_device_chooser_desktop.cc", + "private_network_access/chrome_private_network_device_chooser_desktop.h", "process_singleton_modal_dialog_lock.cc", "process_singleton_modal_dialog_lock.h", "process_singleton_startup_lock.cc", @@ -5939,10 +5947,6 @@ } } - if (is_apple) { - configs += [ "//build/config/compiler:enable_arc" ] - } - if (is_mac) { allow_circular_includes_from += [ "//chrome/browser/apps/app_shim" ] sources += [
diff --git a/chrome/browser/OWNERS b/chrome/browser/OWNERS index b23d751..a5c5f44 100644 --- a/chrome/browser/OWNERS +++ b/chrome/browser/OWNERS
@@ -36,9 +36,6 @@ per-file chrome_browser_field_trials*=file://components/variations/OWNERS -per-file chrome_device_client*=reillyg@chromium.org -per-file chrome_device_client*=rockot@google.com - per-file chrome_navigation_browsertest.cc=file://content/OWNERS per-file chrome_origin_trials_browsertest.cc=file://third_party/blink/common/origin_trials/OWNERS
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 743161e..2df782b 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -6434,11 +6434,6 @@ flag_descriptions::kNtpComprehensiveThemeRealboxDescription, kOsDesktop, FEATURE_VALUE_TYPE(ntp_features::kNtpComprehensiveThemeRealbox)}, - {"ntp-comprehensive-theming", - flag_descriptions::kNtpComprehensiveThemingName, - flag_descriptions::kNtpComprehensiveThemingDescription, kOsDesktop, - FEATURE_VALUE_TYPE(ntp_features::kNtpComprehensiveTheming)}, - {"ntp-drive-module", flag_descriptions::kNtpDriveModuleName, flag_descriptions::kNtpDriveModuleDescription, kOsDesktop, FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpDriveModule,
diff --git a/chrome/browser/app_controller_mac.h b/chrome/browser/app_controller_mac.h index 80eca9b..6b8be9d2 100644 --- a/chrome/browser/app_controller_mac.h +++ b/chrome/browser/app_controller_mac.h
@@ -21,13 +21,24 @@ #include <vector> #include "base/files/file_path.h" +#include "base/mac/scoped_nsobject.h" #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h" #include "components/prefs/pref_change_registrar.h" +class AppControllerProfileObserver; +class AppControllerNativeThemeObserver; +@class AppShimMenuController; class BookmarkMenuBridge; +class CommandUpdater; class GURL; +@class HandoffManager; class HistoryMenuBridge; +class HandoffObserver; class Profile; +@class ProfileMenuController; +class QuitWithAppsController; +class ScopedKeepAlive; +@class ShareMenuController; class TabMenuBridge; namespace ui { @@ -41,7 +52,90 @@ : NSObject <NSUserInterfaceValidations, NSMenuDelegate, NSApplicationDelegate, - ASWebAuthenticationSessionWebBrowserSessionHandling> + ASWebAuthenticationSessionWebBrowserSessionHandling> { + @private + // Manages the state of the command menu items. + std::unique_ptr<CommandUpdater> _menuState; + + // The profile last used by a Browser. It is this profile that was used to + // build the user-data specific main menu items. + raw_ptr<Profile, DanglingUntriaged> _lastProfile; + + // The ProfileObserver observes the ProfileAttrbutesStorage and gets notified + // when a profile has been deleted. + std::unique_ptr<AppControllerProfileObserver> + _profileAttributesStorageObserver; + + // The NativeThemeObserver observes system-wide theme related settings + // change. + std::unique_ptr<AppControllerNativeThemeObserver> _nativeThemeObserver; + + // Management of the bookmark menu which spans across all windows + // (and Browser*s). |profileBookmarkMenuBridgeMap_| is a cache that owns one + // pointer to a BookmarkMenuBridge for each profile. |bookmarkMenuBridge_| is + // a weak pointer that is updated to match the corresponding cache entry + // during a profile switch. + raw_ptr<BookmarkMenuBridge, DanglingUntriaged> _bookmarkMenuBridge; + std::map<base::FilePath, std::unique_ptr<BookmarkMenuBridge>> + _profileBookmarkMenuBridgeMap; + + std::unique_ptr<HistoryMenuBridge> _historyMenuBridge; + + // Controller that manages main menu items for packaged apps. + base::scoped_nsobject<AppShimMenuController> _appShimMenuController; + + // The profile menu, which appears right before the Help menu. It is only + // available when multiple profiles is enabled. + base::scoped_nsobject<ProfileMenuController> _profileMenuController; + + // Controller for the macOS system share menu. + base::scoped_nsobject<ShareMenuController> _shareMenuController; + + std::unique_ptr<TabMenuBridge> _tabMenuBridge; + + // If we're told to open URLs (in particular, via |-application:openURLs:| by + // Launch Services) before we've launched the browser, we queue them up in + // |startupUrls_| so that they can go in the first browser window/tab. + std::vector<GURL> _startupUrls; + BOOL _startupComplete; + + // Outlets for the close tab/window menu items so that we can adjust the + // commmand-key equivalent depending on the kind of window and how many + // tabs it has. + NSMenuItem* _closeTabMenuItem; + NSMenuItem* _closeWindowMenuItem; + + std::unique_ptr<PrefChangeRegistrar> _profilePrefRegistrar; + PrefChangeRegistrar _localPrefRegistrar; + + // Displays a notification when quitting while apps are running. + scoped_refptr<QuitWithAppsController> _quitWithAppsController; + + // Responsible for maintaining all state related to the Handoff feature. + base::scoped_nsobject<HandoffManager> _handoffManager; + + // Observes changes to the active web contents. + std::unique_ptr<HandoffObserver> _handoff_observer; + + // This will be true after receiving a NSWorkspaceWillPowerOffNotification. + BOOL _isPoweringOff; + + // This will be true after receiving a |-applicationWillTerminate:| event. + BOOL _isShuttingDown; + + // Request to keep the browser alive during that object's lifetime. + std::unique_ptr<ScopedKeepAlive> _keep_alive; + + // Remembers whether _lastProfile had TabRestoreService entries. This is saved + // when _lastProfile is destroyed and Chromium enters the zero-profile state. + // + // By remembering this bit, Chromium knows whether to enable or disable + // Cmd+Shift+T and the related "File > Reopen Closed Tab" entry. + BOOL _tabRestoreWasEnabled; + + // The color provider associated with the last active browser view. + raw_ptr<const ui::ColorProvider, DanglingUntriaged> _lastActiveColorProvider; +} @property(readonly, nonatomic) BOOL startupComplete; @property(readonly, nonatomic) Profile* lastProfileIfLoaded;
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index fb1a9c68..fa0edb3 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -10,7 +10,6 @@ #include <memory> #include <vector> -#include "base/apple/bridging.h" #include "base/auto_reset.h" #include "base/command_line.h" #include "base/debug/dump_without_crashing.h" @@ -124,10 +123,6 @@ #include "ui/native_theme/native_theme_observer.h" #include "url/gurl.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // True while AppController is calling chrome::NewEmptyWindow(). We need a @@ -252,6 +247,11 @@ LaunchBrowserStartup(profile); } +CFStringRef BaseBundleID_CFString() { + return base::mac::NSToCFCast( + base::SysUTF8ToNSString(base::mac::BaseBundleID())); +} + // Record the location of the application bundle (containing the main framework) // from which Chromium was loaded. This is used by app mode shims to find // Chromium. @@ -271,12 +271,11 @@ .DirName() .DirName() .DirName(); - base::ScopedCFTypeRef<CFStringRef> app_bundle_path_cfstring = - base::SysUTF8ToCFStringRef(app_bundle_path.value()); + base::ScopedCFTypeRef<CFStringRef> app_bundle_path_cfstring( + base::SysUTF8ToCFStringRef(app_bundle_path.value())); CFPreferencesSetAppValue( - base::apple::NSToCFPtrCast(app_mode::kLastRunAppBundlePathPrefsKey), - app_bundle_path_cfstring, - base::SysUTF8ToCFStringRef(base::mac::BaseBundleID())); + base::mac::NSToCFCast(app_mode::kLastRunAppBundlePathPrefsKey), + app_bundle_path_cfstring, BaseBundleID_CFString()); } bool IsProfileSignedOut(const base::FilePath& profile_path) { @@ -557,89 +556,7 @@ AppController* const app_controller_; // Weak; owns us. }; -@implementation AppController { - // Manages the state of the command menu items. - std::unique_ptr<CommandUpdater> _menuState; - - // The profile last used by a Browser. It is this profile that was used to - // build the user-data specific main menu items. - raw_ptr<Profile, DanglingUntriaged> _lastProfile; - - // The ProfileObserver observes the ProfileAttributesStorage and gets notified - // when a profile has been deleted. - std::unique_ptr<AppControllerProfileObserver> - _profileAttributesStorageObserver; - - // The NativeThemeObserver observes system-wide theme related settings - // change. - std::unique_ptr<AppControllerNativeThemeObserver> _nativeThemeObserver; - - // Management of the bookmark menu which spans across all windows - // (and Browser*s). |profileBookmarkMenuBridgeMap_| is a cache that owns one - // pointer to a BookmarkMenuBridge for each profile. |bookmarkMenuBridge_| is - // a weak pointer that is updated to match the corresponding cache entry - // during a profile switch. - raw_ptr<BookmarkMenuBridge, DanglingUntriaged> _bookmarkMenuBridge; - std::map<base::FilePath, std::unique_ptr<BookmarkMenuBridge>> - _profileBookmarkMenuBridgeMap; - - std::unique_ptr<HistoryMenuBridge> _historyMenuBridge; - - // Controller that manages main menu items for packaged apps. - AppShimMenuController* __strong _appShimMenuController; - - // The profile menu, which appears right before the Help menu. It is only - // available when multiple profiles is enabled. - ProfileMenuController* __strong _profileMenuController; - - // Controller for the macOS system share menu. - ShareMenuController* __strong _shareMenuController; - - std::unique_ptr<TabMenuBridge> _tabMenuBridge; - - // If we're told to open URLs (in particular, via |-application:openURLs:| by - // Launch Services) before we've launched the browser, we queue them up in - // |startupUrls_| so that they can go in the first browser window/tab. - std::vector<GURL> _startupUrls; - BOOL _startupComplete; - - // Outlets for the close tab/window menu items so that we can adjust the - // command-key equivalent depending on the kind of window and how many - // tabs it has. - NSMenuItem* _closeTabMenuItem; - NSMenuItem* _closeWindowMenuItem; - - std::unique_ptr<PrefChangeRegistrar> _profilePrefRegistrar; - PrefChangeRegistrar _localPrefRegistrar; - - // Displays a notification when quitting while apps are running. - scoped_refptr<QuitWithAppsController> _quitWithAppsController; - - // Responsible for maintaining all state related to the Handoff feature. - HandoffManager* __strong _handoffManager; - - // Observes changes to the active web contents. - std::unique_ptr<HandoffObserver> _handoff_observer; - - // This will be true after receiving a NSWorkspaceWillPowerOffNotification. - BOOL _isPoweringOff; - - // This will be true after receiving a |-applicationWillTerminate:| event. - BOOL _isShuttingDown; - - // Request to keep the browser alive during that object's lifetime. - std::unique_ptr<ScopedKeepAlive> _keep_alive; - - // Remembers whether _lastProfile had TabRestoreService entries. This is saved - // when _lastProfile is destroyed and Chromium enters the zero-profile state. - // - // By remembering this bit, Chromium knows whether to enable or disable - // Cmd+Shift+T and the related "File > Reopen Closed Tab" entry. - BOOL _tabRestoreWasEnabled; - - // The color provider associated with the last active browser view. - raw_ptr<const ui::ColorProvider, DanglingUntriaged> _lastActiveColorProvider; -} +@implementation AppController @synthesize startupComplete = _startupComplete; @@ -663,6 +580,7 @@ - (void)dealloc { [[_closeTabMenuItem menu] setDelegate:nil]; [NSMenu cr_setMenuItemForKeyEquivalentEventPreSearchBlock:nil]; + [super dealloc]; } // This method is called very early in application startup (ie, before @@ -826,7 +744,7 @@ _profileAttributesStorageObserver.reset(); [self unregisterEventHandlers]; - _appShimMenuController = nil; + _appShimMenuController.reset(); _profileBookmarkMenuBridgeMap.clear(); } @@ -932,8 +850,8 @@ CFPropertyListRef plist = CFPreferencesCopyAppValue(checkInterval, app); if (!plist) { const float fiveHoursInSeconds = 5.0 * 60.0 * 60.0; - CFPreferencesSetAppValue( - checkInterval, base::apple::NSToCFPtrCast(@(fiveHoursInSeconds)), app); + NSNumber* value = [NSNumber numberWithFloat:fiveHoursInSeconds]; + CFPreferencesSetAppValue(checkInterval, value, app); CFPreferencesAppSynchronize(app); } #endif @@ -1350,9 +1268,9 @@ // Asynchronously load profile first if needed. app_controller_mac::RunInLastProfileSafely( - base::BindOnce(^(Profile* profile) { + base::BindOnce(base::RetainBlock(^(Profile* profile) { [self executeCommand:sender withProfile:profile]; - }), + })), app_controller_mac::kShowProfilePickerOnFailure); } @@ -1571,12 +1489,12 @@ // The controller will unhide the menu if necessary. [profileMenu setHidden:YES]; - _profileMenuController = - [[ProfileMenuController alloc] initWithMainMenuItem:profileMenu]; + _profileMenuController.reset( + [[ProfileMenuController alloc] initWithMainMenuItem:profileMenu]); } - (void)initShareMenu { - _shareMenuController = [[ShareMenuController alloc] init]; + _shareMenuController.reset([[ShareMenuController alloc] init]); NSMenu* mainMenu = [NSApp mainMenu]; NSMenu* fileMenu = [[mainMenu itemWithTag:IDC_FILE_MENU] submenu]; NSString* shareMenuTitle = l10n_util::GetNSString(IDS_SHARE_MAC); @@ -1675,9 +1593,9 @@ - (IBAction)showPreferences:(id)sender { // Asynchronously load profile first if needed. app_controller_mac::RunInLastProfileSafely( - base::BindOnce(^(Profile* profile) { + base::BindOnce(base::RetainBlock(^(Profile* profile) { [self showPreferencesForProfile:profile]; - }), + })), app_controller_mac::kShowProfilePickerOnFailure); } @@ -1696,9 +1614,9 @@ - (IBAction)orderFrontStandardAboutPanel:(id)sender { // Asynchronously load profile first if needed. app_controller_mac::RunInLastProfileSafely( - base::BindOnce(^(Profile* profile) { + base::BindOnce(base::RetainBlock(^(Profile* profile) { [self orderFrontStandardAboutPanelForProfile:profile]; - }), + })), app_controller_mac::kShowProfilePickerOnFailure); } @@ -1727,7 +1645,7 @@ } - (NSMenu*)applicationDockMenu:(NSApplication*)sender { - NSMenu* dockMenu = [[NSMenu alloc] initWithTitle:@""]; + NSMenu* dockMenu = [[[NSMenu alloc] initWithTitle: @""] autorelease]; BOOL profilesAdded = [_profileMenuController insertItemsIntoMenu:dockMenu atOffset:0 @@ -1787,7 +1705,7 @@ - (void)initAppShimMenuController { if (!_appShimMenuController) - _appShimMenuController = [[AppShimMenuController alloc] init]; + _appShimMenuController.reset([[AppShimMenuController alloc] init]); } - (void)setLastProfile:(Profile*)profile { @@ -1995,7 +1913,7 @@ - (void)updateHandoffManager:(content::WebContents*)webContents { if (!_handoffManager) - _handoffManager = [[HandoffManager alloc] init]; + _handoffManager.reset([[HandoffManager alloc] init]); if ([self isHandoffEligible:webContents]) { [self updateHandoffManagerWithURL:webContents->GetVisibleURL() @@ -2048,7 +1966,8 @@ app_controller_mac::RunInLastProfileSafely( base::BindOnce(&BeginHandlingWebAuthenticationSessionRequestWithProfile, - request), + base::scoped_nsobject<ASWebAuthenticationSessionRequest>( + request, base::scoped_policy::RETAIN)), app_controller_mac::kShowProfilePickerOnFailure); }); }
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index bbe81c3..c201f01 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -2227,6 +2227,59 @@ SSLTestHelper(); } +// Ensure that when a guest is created and navigated to a URL that triggers an +// SSL interstitial, and then the "Back to safety" button is activated on the +// interstitial, the guest doesn't crash trying to load the NTP (the usual +// known-safe page used to navigate back from such interstitials when there's +// no other page in history to go to). See https://crbug.com/1444221. +IN_PROC_BROWSER_TEST_P(WebViewSSLErrorTest, NavigateBackFromSSLError) { + if (!UseInterstitials()) { + GTEST_SKIP(); + } + + // Starts a HTTPS server so we can load a page with a SSL error inside a + // guest. + net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); + https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); + https_server.ServeFilesFromSourceDirectory(GetChromeTestDataDir()); + ASSERT_TRUE(https_server.Start()); + + LoadAndLaunchPlatformApp("web_view/ssl", "EmbedderLoaded"); + + const auto failure_url = https_server.GetURL( + "/extensions/platform_apps/web_view/ssl/https_page.html"); + EXPECT_TRUE(content::ExecJs( + GetFirstAppWindowWebContents(), + content::JsReplace("var w = document.createElement('webview');" + "w.src = $1;" + "document.body.appendChild(w);", + failure_url))); + GetGuestViewManager()->WaitForSingleGuestRenderFrameHostCreated(); + + // The navigation should fail and show an interstitial in the guest. + auto* guest = GetGuestViewManager()->GetLastGuestViewCreated(); + EXPECT_FALSE(WaitForLoadStop(guest->web_contents())); + ASSERT_TRUE(guest->GetGuestMainFrame()->IsErrorDocument()); + ASSERT_TRUE(IsShowingInterstitial(guest->web_contents())); + + // Simulate invoking the "Back to safety" button. This should dismiss the + // interstitial and navigate the guest to a known safe URL that can always + // load in a guest (in this case, about:blank). + security_interstitials::SecurityInterstitialTabHelper* helper = + security_interstitials::SecurityInterstitialTabHelper::FromWebContents( + guest->web_contents()); + ASSERT_TRUE(helper); + auto* interstitial = + helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting(); + ASSERT_TRUE(interstitial); + interstitial->CommandReceived(base::NumberToString( + security_interstitials::SecurityInterstitialCommand::CMD_DONT_PROCEED)); + + EXPECT_TRUE(WaitForLoadStop(guest->web_contents())); + ASSERT_FALSE(guest->GetGuestMainFrame()->IsErrorDocument()); + ASSERT_FALSE(IsShowingInterstitial(guest->web_contents())); +} + // Test makes sure that the error document is registered in the // `RenderWidgetHostInputEventRouter` when inside a `<webview>`. // Flaky on Win dbg: crbug.com/779973 @@ -2418,6 +2471,37 @@ ASSERT_FALSE(IsShowingInterstitial(GetFirstAppWindowWebContents())); } +// Verify that guests cannot be navigated to disallowed URLs, such as +// chrome:// URLs, directly via the content/public API. The enforcement for +// this typically happens in the embedder layer, catching cases where the +// embedder navigates a guest, but Chrome features could bypass that +// enforcement by directly navigating guests. This test verifies that if that +// were to happen, //content would still gracefully disallow attempts to load +// disallowed URLs in guests without crashing. +IN_PROC_BROWSER_TEST_F(WebViewTest, CannotNavigateGuestToChromeURL) { + ASSERT_TRUE(StartEmbeddedTestServer()); + + // Load an app with a <webview> guest that starts at a data: URL. + LoadAppWithGuest("web_view/simple"); + + auto* guest = GetGuestViewManager()->GetLastGuestViewCreated(); + auto* guest_main_frame = guest->GetGuestMainFrame(); + GURL original_url = guest_main_frame->GetLastCommittedURL(); + + // Try to navigate <webview> to a chrome: URL directly. + GURL chrome_url(chrome::kChromeUINewTabURL); + content::TestFrameNavigationObserver observer(guest_main_frame); + guest->GetController().LoadURL(chrome_url, content::Referrer(), + ui::PAGE_TRANSITION_AUTO_TOPLEVEL, + std::string()); + + // The navigation should be aborted, and the last committed URL should + // remain unchanged. + EXPECT_FALSE(observer.navigation_started()); + EXPECT_EQ(original_url, guest_main_frame->GetLastCommittedURL()); + EXPECT_NE(chrome_url, guest_main_frame->GetLastCommittedURL()); +} + IN_PROC_BROWSER_TEST_F(WebViewTest, ShimSrcAttribute) { ASSERT_TRUE(RunExtensionTest("platform_apps/web_view/src_attribute", {.launch_as_platform_app = true}))
diff --git a/chrome/browser/apps/intent_helper/mac_intent_picker_helpers.mm b/chrome/browser/apps/intent_helper/mac_intent_picker_helpers.mm index 167328d..1c129ff 100644 --- a/chrome/browser/apps/intent_helper/mac_intent_picker_helpers.mm +++ b/chrome/browser/apps/intent_helper/mac_intent_picker_helpers.mm
@@ -16,10 +16,6 @@ #include "net/base/mac/url_conversions.h" #include "ui/base/models/image_model.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace apps { namespace { @@ -79,7 +75,8 @@ if (!nsurl) return absl::nullopt; - SFUniversalLink* link = [[SFUniversalLink alloc] initWithWebpageURL:nsurl]; + SFUniversalLink* link = + [[[SFUniversalLink alloc] initWithWebpageURL:nsurl] autorelease]; if (link) return AppInfoForAppUrl(link.applicationURL);
diff --git a/chrome/browser/ash/crosapi/browser_loader.cc b/chrome/browser/ash/crosapi/browser_loader.cc index efc5022..13dcb1f 100644 --- a/chrome/browser/ash/crosapi/browser_loader.cc +++ b/chrome/browser/ash/crosapi/browser_loader.cc
@@ -112,8 +112,6 @@ base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( ash::switches::kLacrosChromePath); if (!lacros_chrome_path.empty()) { - // TODO(cbug.com/1429137): LacrosSelection::kStateful is not appropriate - // here. We should introduce unknown state and set it here. OnLoadComplete(std::move(callback), LacrosSelection::kDeployedLocally, base::Version(), lacros_chrome_path); return;
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc index 740642f..fc4b644 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -2664,8 +2664,7 @@ } *output = content::EvalJs( web_contents, - base::StrCat({"test.swaTestMessageListener(", *data, ")"}), - content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) + base::StrCat({"test.swaTestMessageListener(", *data, ")"})) .ExtractString(); return; } @@ -3705,17 +3704,14 @@ content::WebContents* web_contents) { CHECK(web_contents); - ASSERT_EQ(true, content::EvalJs(web_contents, "test.swaLoadTestUtils()", - content::EXECUTE_SCRIPT_USE_MANUAL_REPLY)); + ASSERT_EQ(true, content::EvalJs(web_contents, "test.swaLoadTestUtils()")); } std::string FileManagerBrowserTestBase::GetSwaAppId( content::WebContents* web_contents) { CHECK(web_contents); - return content::EvalJs(web_contents, "test.getSwaAppId()", - content::EXECUTE_SCRIPT_USE_MANUAL_REPLY) - .ExtractString(); + return content::EvalJs(web_contents, "test.getSwaAppId()").ExtractString(); } std::vector<content::WebContents*>
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn index eb88892..04353a9 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn
@@ -8,6 +8,7 @@ source_set("connectivity") { deps = [ + "proto", "//base", "//chrome/browser:browser_process", "//chrome/browser/ash/login/oobe_quick_start:oobe_quick_start_pref_names", @@ -31,6 +32,8 @@ "fast_pair_advertiser.h", "fido_assertion_info.cc", "fido_assertion_info.h", + "handshake_helpers.cc", + "handshake_helpers.h", "random_session_id.cc", "random_session_id.h", "target_device_connection_broker.cc",
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc index ecc8345..c1f93ba 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.cc
@@ -12,6 +12,7 @@ #include "base/time/time.h" #include "base/values.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/fido_assertion_info.h" +#include "chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/random_session_id.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "chrome/browser/ash/login/oobe_quick_start/logging/logging.h" @@ -22,7 +23,6 @@ #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom-forward.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom-shared.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom.h" -#include "crypto/random.h" namespace ash::quick_start { @@ -41,31 +41,21 @@ mojo::SharedRemote<mojom::QuickStartDecoder> quick_start_decoder, ConnectionClosedCallback on_connection_closed, ConnectionAuthenticatedCallback on_connection_authenticated) { - auto nonce_generator = std::make_unique<NonceGenerator>(); return std::make_unique<Connection>( nearby_connection, session_context, std::move(quick_start_decoder), - std::move(nonce_generator), std::move(on_connection_closed), - std::move(on_connection_authenticated)); -} - -Connection::Nonce Connection::NonceGenerator::Generate() { - Nonce nonce; - crypto::RandBytes(nonce); - return nonce; + std::move(on_connection_closed), std::move(on_connection_authenticated)); } Connection::Connection( NearbyConnection* nearby_connection, Connection::SessionContext session_context, mojo::SharedRemote<mojom::QuickStartDecoder> quick_start_decoder, - std::unique_ptr<NonceGenerator> nonce_generator, ConnectionClosedCallback on_connection_closed, ConnectionAuthenticatedCallback on_connection_authenticated) : nearby_connection_(nearby_connection), random_session_id_(session_context.session_id), shared_secret_(session_context.shared_secret), secondary_shared_secret_(session_context.secondary_shared_secret), - nonce_generator_(std::move(nonce_generator)), on_connection_closed_(std::move(on_connection_closed)), on_connection_authenticated_(std::move(on_connection_authenticated)), decoder_(std::move(quick_start_decoder)) { @@ -162,8 +152,13 @@ requests::BuildGetInfoRequestMessage(), std::move(request_assertion))); + auto bootstrap_configurations_response = + base::BindOnce(&Connection::OnBootstrapConfigurationsResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(get_info)); + // Call into SetBootstrapOptions, starting the chain of callbacks. - SendMessage(requests::BuildBootstrapOptionsRequest(), std::move(get_info)); + SendMessage(requests::BuildBootstrapOptionsRequest(), + std::move(bootstrap_configurations_response)); } void Connection::OnNotifySourceOfUpdateResponse( @@ -242,6 +237,21 @@ std::move(callback).Run(assertion_info); } +void Connection::OnBootstrapConfigurationsResponse( + BootstrapConfigurationsCallback callback, + absl::optional<std::vector<uint8_t>> response_bytes) { + if (!response_bytes.has_value()) { + return; + } + + // TODO(b/280306851): Finish parsing response and save cryptauth_device_id. + DecodeData<mojom::BootstrapConfigurations>( + &mojom::QuickStartDecoder::DecodeBootstrapConfigurations, + base::DoNothing(), std::move(response_bytes)); + + std::move(callback).Run(absl::nullopt); +} + void Connection::SendMessage(std::unique_ptr<QuickStartMessage> message, ConnectionResponseCallback callback) { SendPayload(*message->GenerateEncodedMessage()); @@ -250,9 +260,8 @@ void Connection::InitiateHandshake(const std::string& authentication_token, HandshakeSuccessCallback callback) { - Connection::Nonce nonce = nonce_generator_->Generate(); - nearby_connection_->Write(requests::BuildTargetDeviceHandshakeMessage( - authentication_token, shared_secret_, nonce)); + nearby_connection_->Write( + handshake::BuildHandshakeMessage(authentication_token, shared_secret_)); // TODO(b/234655072): Read response from phone and run callback. }
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h index 4ec90cd..95f6a635 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection.h
@@ -35,7 +35,6 @@ : public TargetDeviceConnectionBroker::AuthenticatedConnection { public: using SharedSecret = TargetDeviceConnectionBroker::SharedSecret; - using Nonce = std::array<uint8_t, 12>; using HandshakeSuccessCallback = base::OnceCallback<void(bool)>; using ConnectionAuthenticatedCallback = base::OnceCallback<void( base::WeakPtr<TargetDeviceConnectionBroker::AuthenticatedConnection>)>; @@ -71,20 +70,9 @@ ConnectionAuthenticatedCallback on_connection_authenticated); }; - class NonceGenerator { - public: - NonceGenerator() = default; - NonceGenerator(const NonceGenerator&) = delete; - NonceGenerator& operator=(const NonceGenerator&) = delete; - virtual ~NonceGenerator() = default; - - virtual Nonce Generate(); - }; - Connection(NearbyConnection* nearby_connection, SessionContext session_context, mojo::SharedRemote<mojom::QuickStartDecoder> quick_start_decoder, - std::unique_ptr<NonceGenerator> nonce_generator, ConnectionClosedCallback on_connection_closed, ConnectionAuthenticatedCallback on_connection_authenticated); @@ -120,6 +108,8 @@ base::OnceCallback<void(absl::optional<std::vector<uint8_t>>)>; using PayloadResponseCallback = base::OnceCallback<void(absl::optional<std::vector<uint8_t>>)>; + using BootstrapConfigurationsCallback = + base::OnceCallback<void(absl::optional<std::vector<uint8_t>>)>; // TargetDeviceConnectionBroker::AuthenticatedConnection: void RequestWifiCredentials(int32_t session_id, @@ -151,6 +141,10 @@ RequestAccountTransferAssertionCallback callback, ::ash::quick_start::mojom::GetAssertionResponsePtr response); + void OnBootstrapConfigurationsResponse( + BootstrapConfigurationsCallback callback, + absl::optional<std::vector<uint8_t>> response_bytes); + void SendMessage(std::unique_ptr<QuickStartMessage> message, ConnectionResponseCallback callback); @@ -191,7 +185,6 @@ SharedSecret shared_secret_; SharedSecret secondary_shared_secret_; State connection_state_ = State::kOpen; - std::unique_ptr<NonceGenerator> nonce_generator_; ConnectionClosedCallback on_connection_closed_; bool authenticated_ = false; ConnectionAuthenticatedCallback on_connection_authenticated_;
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc index 649c9bdd..0be5fd8 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/connection_unittest.cc
@@ -17,6 +17,7 @@ #include "base/timer/mock_timer.h" #include "base/values.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/fido_assertion_info.h" +#include "chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/random_session_id.h" #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "chrome/browser/nearby_sharing/fake_nearby_connection.h" @@ -70,27 +71,10 @@ 0xab, 0xa0, 0xe3, 0xfc, 0xd3, 0x5a, 0x04, 0x01, 0x63, 0xf6, 0xf5, 0xeb, 0x40, 0x7f, 0x4b, 0xac, 0xe4, 0xd1, 0xbf, 0x20, 0x19}; -// 12 random bytes to use as the nonce. -constexpr std::array<uint8_t, 12> kNonce = {0x60, 0x3e, 0x87, 0x69, 0xa3, 0x55, - 0xd3, 0x49, 0xbd, 0x0a, 0x63, 0xed}; - -// A serialized auth message produced with |kAuthToken|, |kSharedSecret|, and -// |kNonce|. Uses the "Target" role. -constexpr std::array<uint8_t, 50> kTargetDeviceAuthMessage = { - 0x08, 0x01, 0x12, 0x2e, 0x0a, 0x0c, 0x60, 0x3e, 0x87, 0x69, - 0xa3, 0x55, 0xd3, 0x49, 0xbd, 0x0a, 0x63, 0xed, 0x12, 0x1e, - 0x44, 0x28, 0x93, 0x04, 0xd3, 0xc0, 0x03, 0x50, 0xc9, 0x9d, - 0x4f, 0x8d, 0x01, 0xaa, 0xcf, 0xc6, 0x43, 0x41, 0xa2, 0xcf, - 0x4a, 0x91, 0x6e, 0x49, 0x14, 0x9d, 0x2e, 0xea, 0x9a, 0xf6}; - // 6 random bytes to use as the RandomSessionId. constexpr std::array<uint8_t, 6> kRandomSessionId = {0x6b, 0xb3, 0x85, 0x27, 0xbb, 0x28}; -class ConstantNonceGenerator : public Connection::NonceGenerator { - Connection::Nonce Generate() override { return kNonce; } -}; - constexpr base::TimeDelta kNotifySourceOfUpdateResponseTimeout = base::Seconds(3); @@ -115,7 +99,6 @@ nearby_connection, session_context_, mojo::SharedRemote<ash::quick_start::mojom::QuickStartDecoder>( fake_quick_start_decoder_->GetRemote()), - std::make_unique<ConstantNonceGenerator>(), /*on_connection_closed=*/base::DoNothing(), /*on_connection_authenticated=*/ base::BindLambdaForTesting( @@ -264,6 +247,11 @@ EXPECT_EQ(*bootstrap_options.FindInt(kDeviceTypeKey), kDeviceTypeChrome); // Emulate a BootstrapConfigurations response. + std::vector<uint8_t> cryptauth_device_id = {0x01, 0x02, 0x03}; + std::string expected_cryptauth_device_id(cryptauth_device_id.begin(), + cryptauth_device_id.end()); + fake_quick_start_decoder_->SetBootstrapConfigurationsResponse( + expected_cryptauth_device_id, absl::nullopt); fake_nearby_connection_->AppendReadableData(kTestBytes); // OnBootstrapOptionsResponse should trigger a write of FIDO GetInfo @@ -424,7 +412,6 @@ fake_nearby_connection_.get(), session_context_, mojo::SharedRemote<ash::quick_start::mojom::QuickStartDecoder>( fake_quick_start_decoder_->GetRemote()), - std::make_unique<ConstantNonceGenerator>(), /*on_connection_closed=*/future.GetCallback(), /*on_connection_authenticated=*/base::DoNothing()); @@ -448,7 +435,6 @@ fake_nearby_connection_.get(), session_context_, mojo::SharedRemote<ash::quick_start::mojom::QuickStartDecoder>( fake_quick_start_decoder_->GetRemote()), - std::make_unique<ConstantNonceGenerator>(), /*on_connection_closed=*/future.GetCallback(), /*on_connection_authenticated=*/base::DoNothing()); @@ -466,12 +452,9 @@ TEST_F(ConnectionTest, InitiateHandshake) { connection_->InitiateHandshake(kAuthToken, base::DoNothing()); - std::vector<uint8_t> written_payload = - fake_nearby_connection_->GetWrittenData(); - ASSERT_EQ(kTargetDeviceAuthMessage.size(), written_payload.size()); - for (size_t i = 0; i < kTargetDeviceAuthMessage.size(); i++) { - EXPECT_EQ(kTargetDeviceAuthMessage[i], written_payload[i]); - } + + // TODO(b/234655072): Test that the correct info is written to the + // NearbyConnection once handshake parsing is implemented. } TEST_F(ConnectionTest, TestUserVerificationRequested_ReturnsResult) {
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc index c303829b..4413e06a 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/fake_connection.cc
@@ -32,7 +32,6 @@ : Connection(nearby_connection, session_context, std::move(quick_start_decoder), - std::make_unique<Connection::NonceGenerator>(), std::move(on_connection_closed), std::move(on_connection_authenticated)) {}
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.cc new file mode 100644 index 0000000..f5b13ae --- /dev/null +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.cc
@@ -0,0 +1,65 @@ +// 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 "chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.h" + +#include "base/containers/span.h" +#include "chrome/browser/ash/login/oobe_quick_start/connectivity/proto/aes_gcm_authentication_message.pb.h" +#include "crypto/aead.h" +#include "crypto/random.h" + +namespace ash::quick_start::handshake { + +namespace { + +std::vector<uint8_t> EncryptPayload( + const proto::V1Message::AuthenticationPayload& payload, + base::span<const uint8_t> secret, + base::span<const uint8_t> nonce) { + std::string payload_bytes; + payload.SerializeToString(&payload_bytes); + + crypto::Aead aead(crypto::Aead::AES_256_GCM); + aead.Init(secret); + return aead.Seal( + std::vector<uint8_t>(payload_bytes.begin(), payload_bytes.end()), nonce, + /*additional_data=*/base::span<uint8_t>()); +} + +} // namespace + +std::vector<uint8_t> BuildHandshakeMessage( + const std::string& auth_token, + std::array<uint8_t, 32> secret, + absl::optional<std::array<uint8_t, 12>> nonce, + DeviceRole role) { + std::array<uint8_t, 12> nonce_bytes; + if (nonce) { + nonce_bytes = *nonce; + } else { + crypto::RandBytes(nonce_bytes); + } + + proto::V1Message::AuthenticationPayload auth_payload; + auth_payload.set_role(static_cast<int32_t>(role)); + auth_payload.set_auth_string(auth_token); + + std::vector<uint8_t> encrypted_payload = + EncryptPayload(auth_payload, secret, nonce_bytes); + + proto::AesGcmAuthenticationMessage auth_message; + auth_message.set_version(proto::AesGcmAuthenticationMessage::V1); + proto::V1Message* v1_message = auth_message.mutable_v1(); + v1_message->set_nonce(std::string(nonce_bytes.begin(), nonce_bytes.end())); + v1_message->set_payload( + std::string(encrypted_payload.begin(), encrypted_payload.end())); + + std::string auth_message_serialized; + auth_message.SerializeToString(&auth_message_serialized); + + return std::vector<uint8_t>(auth_message_serialized.begin(), + auth_message_serialized.end()); +} + +} // namespace ash::quick_start::handshake
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.h b/chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.h new file mode 100644 index 0000000..0cb5e59 --- /dev/null +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/handshake_helpers.h
@@ -0,0 +1,33 @@ +// 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 CHROME_BROWSER_ASH_LOGIN_OOBE_QUICK_START_CONNECTIVITY_HANDSHAKE_HELPERS_H_ +#define CHROME_BROWSER_ASH_LOGIN_OOBE_QUICK_START_CONNECTIVITY_HANDSHAKE_HELPERS_H_ + +#include <array> + +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace ash::quick_start::handshake { + +// The role for the device producing a handshake message. Values come from +// this enum: +// http://google3/java/com/google/android/gms/smartdevice/d2d/proto/aes_gcm_authentication_message.proto;l=26;rcl=489093041 +enum class DeviceRole { + kTarget = 1, + kSource = 2, +}; + +// Build and serialize an AesGcmAuthenticationMessage proto. If |nonce| and +// |role| are not provided, then a new random nonce and the target device role +// will be used. +std::vector<uint8_t> BuildHandshakeMessage( + const std::string& auth_token, + std::array<uint8_t, 32> secret, + absl::optional<std::array<uint8_t, 12>> nonce = absl::nullopt, + DeviceRole role = DeviceRole::kTarget); + +} // namespace ash::quick_start::handshake + +#endif // CHROME_BROWSER_ASH_LOGIN_OOBE_QUICK_START_CONNECTIVITY_HANDSHAKE_HELPERS_H_
diff --git a/chromeos/ash/components/quick_start/proto/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/connectivity/proto/BUILD.gn similarity index 100% rename from chromeos/ash/components/quick_start/proto/BUILD.gn rename to chrome/browser/ash/login/oobe_quick_start/connectivity/proto/BUILD.gn
diff --git a/chromeos/ash/components/quick_start/proto/aes_gcm_authentication_message.proto b/chrome/browser/ash/login/oobe_quick_start/connectivity/proto/aes_gcm_authentication_message.proto similarity index 96% rename from chromeos/ash/components/quick_start/proto/aes_gcm_authentication_message.proto rename to chrome/browser/ash/login/oobe_quick_start/connectivity/proto/aes_gcm_authentication_message.proto index 8e174ce4..e026c82 100644 --- a/chromeos/ash/components/quick_start/proto/aes_gcm_authentication_message.proto +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/proto/aes_gcm_authentication_message.proto
@@ -3,7 +3,7 @@ syntax = "proto2"; -package quick_start.proto; +package ash.quick_start.proto; option optimize_for = LITE_RUNTIME;
diff --git a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.cc b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.cc index e9d4157..be46bf6ac 100644 --- a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.cc +++ b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.cc
@@ -179,9 +179,9 @@ arc::ConfigureUpstartJobs(std::move(jobs), std::move(callback)); } -void OnArcVmDataMigratorStartedForGetAndroidDataSize( +void OnArcVmDataMigratorStartedForGetAndroidDataInfo( const std::string& username, - chromeos::DBusMethodCallback<int64_t> callback, + ArcVmDataMigratorClient::GetAndroidDataInfoCallback callback, bool result) { if (!result) { LOG(ERROR) << "Failed to start arcvm_data_migrator"; @@ -189,16 +189,17 @@ return; } - arc::data_migrator::GetAndroidDataSizeRequest request; + arc::data_migrator::GetAndroidDataInfoRequest request; request.set_username(username); - ArcVmDataMigratorClient::Get()->GetAndroidDataSize(std::move(request), + ArcVmDataMigratorClient::Get()->GetAndroidDataInfo(std::move(request), std::move(callback)); } -void GetAndroidDataSize(const std::string& username, - chromeos::DBusMethodCallback<int64_t> callback) { +void GetAndroidDataInfo( + const std::string& username, + ArcVmDataMigratorClient::GetAndroidDataInfoCallback callback) { StartArcVmDataMigrator( - username, base::BindOnce(&OnArcVmDataMigratorStartedForGetAndroidDataSize, + username, base::BindOnce(&OnArcVmDataMigratorStartedForGetAndroidDataInfo, username, std::move(callback))); } @@ -401,32 +402,40 @@ const uint64_t free_disk_space = reply.value(); VLOG(1) << "Free disk space is " << free_disk_space; - GetAndroidDataSize( + GetAndroidDataInfo( GetChromeOsUsername(profile_), - base::BindOnce(&ArcVmDataMigrationScreen::OnGetAndroidDataSizeResponse, + base::BindOnce(&ArcVmDataMigrationScreen::OnGetAndroidDataInfoResponse, weak_ptr_factory_.GetWeakPtr(), free_disk_space)); } -void ArcVmDataMigrationScreen::OnGetAndroidDataSizeResponse( +void ArcVmDataMigrationScreen::OnGetAndroidDataInfoResponse( uint64_t free_disk_space, - absl::optional<int64_t> response) { + absl::optional<arc::data_migrator::GetAndroidDataInfoResponse> response) { if (!response.has_value()) { LOG(ERROR) << "Failed to get the size of Android /data"; HandleSetupFailure( - ArcVmDataMigrationScreenSetupFailure::kGetAndroidDataSizeFailure); + ArcVmDataMigrationScreenSetupFailure::kGetAndroidDataInfoFailure); return; } - const uint64_t android_data_size = response.value(); - VLOG(1) << "Size of Android /data is " << android_data_size; + const uint64_t android_data_size_dest = + response.value().total_allocated_space_dest(); + const uint64_t android_data_size_src = + response.value().total_allocated_space_src(); + VLOG(1) << "Size of disk space allocated for pre-migration Android /data is " + << android_data_size_src; + VLOG(1) << "Estimated size of disk space allocated for migrated " + << "Android /data is " << android_data_size_dest; disk_size_ = arc::GetDesiredDiskImageSizeForArcVmDataMigrationInBytes( - android_data_size, free_disk_space); + android_data_size_dest, free_disk_space); VLOG(1) << "Desired disk size for the migration is " << disk_size_; + // TODO(b/280248293): Fix calculation of required free disk space using + // `android_data_size_src`. const uint64_t required_free_disk_space = arc::GetRequiredFreeDiskSpaceForArcVmDataMigrationInBytes( - android_data_size, free_disk_space); + android_data_size_dest, free_disk_space); VLOG(1) << "Required free disk space for the migration is " << required_free_disk_space; bool has_enough_free_disk_space = free_disk_space >= required_free_disk_space;
diff --git a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.h b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.h index b8aaad9..e983db7 100644 --- a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.h +++ b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen.h
@@ -36,7 +36,7 @@ kStopVmFailure = 1, kStopUpstartJobsFailure = 2, kGetFreeDiskSpaceFailure = 3, - kGetAndroidDataSizeFailure = 4, + kGetAndroidDataInfoFailure = 4, kCreateDiskImageDBusFailure = 5, kCreateDiskImageGeneralFailure = 6, kArcVmDataMigratorStartFailure = 7, @@ -79,8 +79,9 @@ void OnGetFreeDiskSpace(absl::optional<int64_t> reply); - void OnGetAndroidDataSizeResponse(uint64_t free_disk_space, - absl::optional<int64_t> response); + void OnGetAndroidDataInfoResponse( + uint64_t free_disk_space, + absl::optional<arc::data_migrator::GetAndroidDataInfoResponse> response); void CheckBatteryState();
diff --git a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc index 86d1b0e4..37a2407 100644 --- a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc +++ b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc
@@ -194,8 +194,10 @@ // Set the default states. They can be overwritten by individual test cases. arc::SetArcVmDataMigrationStatus(profile_->GetPrefs(), arc::ArcVmDataMigrationStatus::kConfirmed); - FakeArcVmDataMigratorClient::Get()->set_android_data_size( - kDefaultAndroidDataSize); + arc::data_migrator::GetAndroidDataInfoResponse response; + response.set_total_allocated_space_dest(kDefaultAndroidDataSize); + FakeArcVmDataMigratorClient::Get()->set_get_android_data_info_response( + response); SetFreeDiskSpace(/*enough=*/true); SetBatteryState(/*enough=*/true, /*connected=*/true); @@ -484,7 +486,8 @@ } TEST_F(ArcVmDataMigrationScreenTest, GetAndroidDataSizeFailureIsFatal) { - FakeArcVmDataMigratorClient::Get()->set_android_data_size(absl::nullopt); + FakeArcVmDataMigratorClient::Get()->set_get_android_data_info_response( + absl::nullopt); screen_->Show(wizard_context_.get()); task_environment()->RunUntilIdle();
diff --git a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc index 0c81478..16f2d052 100644 --- a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc +++ b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
@@ -866,6 +866,9 @@ EXPECT_TRUE(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)); syncer::SyncUserSettings* settings = GetSyncUserSettings(); + histogram_tester_.ExpectUniqueSample( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.SyncEverything", true, 1); + EXPECT_TRUE(settings->IsSyncAllOsTypesEnabled()); } @@ -912,6 +915,9 @@ WaitForScreenExit(); EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NEXT); + histogram_tester_.ExpectUniqueSample( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.SyncEverything", false, 1); + // Expect all data types are disabled for minor users when initialized. Profile* profile = ProfileManager::GetPrimaryUserProfile(); auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); @@ -1003,6 +1009,19 @@ WaitForScreenExit(); EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NEXT); + histogram_tester_.ExpectUniqueSample( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncWallpaper", + is_wallpaper_synced && is_settings_synced, 1); + histogram_tester_.ExpectUniqueSample( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncApps", + is_app_synced, 1); + histogram_tester_.ExpectUniqueSample( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncSettings", + is_settings_synced, 1); + histogram_tester_.ExpectUniqueSample( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncWifi", + is_wifi_synced, 1); + // Expect all data types are disabled for minor users when initialized. Profile* profile = ProfileManager::GetPrimaryUserProfile(); auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc index 6ad1d5f..f517542 100644 --- a/chrome/browser/ash/login/screens/sync_consent_screen.cc +++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -546,6 +546,9 @@ syncer::SyncService* sync_service = GetSyncService(profile_); syncer::SyncUserSettings* sync_settings = sync_service->GetUserSettings(); + base::UmaHistogramBoolean( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.SyncEverything", true); + syncer::UserSelectableOsTypeSet os_empty_set; sync_settings->SetSelectedOsTypes(/*sync_all_os_types=*/true, os_empty_set); @@ -573,6 +576,9 @@ syncer::SyncService* sync_service = GetSyncService(profile_); syncer::SyncUserSettings* sync_settings = sync_service->GetUserSettings(); + base::UmaHistogramBoolean( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.SyncEverything", false); + sync_settings->SetSelectedOsTypes(/*sync_all_os_types=*/false, os_sync_set); bool wallpaper_synced = osSyncItemsStatus.FindBool(kOsWallpaper).value(); @@ -580,6 +586,19 @@ if (wallpaper_synced) { DCHECK(osSyncItemsStatus.FindBool(kOsPreferences).value()); } + + base::UmaHistogramBoolean( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncWallpaper", + wallpaper_synced); + base::UmaHistogramBoolean( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncApps", + osSyncItemsStatus.FindBool(kOsApps).value()); + base::UmaHistogramBoolean( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncSettings", + osSyncItemsStatus.FindBool(kOsPreferences).value()); + base::UmaHistogramBoolean( + "OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.SyncWifi", + osSyncItemsStatus.FindBool(kOsWifiConfigurations).value()); profile_->GetPrefs()->SetBoolean(settings::prefs::kSyncOsWallpaper, wallpaper_synced);
diff --git a/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc b/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc index 9fac166c..e52db164 100644 --- a/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc +++ b/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc
@@ -20,6 +20,7 @@ #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/location.h" +#include "base/logging.h" #include "base/notreached.h" #include "base/ranges/algorithm.h" #include "base/strings/string_number_conversions.h" @@ -206,6 +207,9 @@ void CloudExternalDataManagerBase::Backend::OnMetadataUpdated( std::unique_ptr<Metadata> metadata) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // TODO(b/282186756): temporary log + LOG(WARNING) << "External data references updated"; + metadata_set_ = true; Metadata old_metadata; metadata_.swap(old_metadata); @@ -260,6 +264,8 @@ const MetadataKey& key, ExternalDataFetcher::FetchCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // TODO(b/282186756): temporary log + LOG(WARNING) << "Start fetching external data for policy " << key.policy; Metadata::const_iterator metadata = metadata_.find(key); if (metadata == metadata_.end()) { @@ -348,6 +354,8 @@ std::unique_ptr<std::string> data, const base::FilePath& file_path) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // TODO(b/282186756): temporary log + LOG(WARNING) << "Posting a task to run the callback with external data"; callback_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(callback), std::move(data), file_path)); @@ -503,6 +511,9 @@ const std::string& field_name, ExternalDataFetcher::FetchCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // TODO(b/282186756): temporary log + LOG(WARNING) << "Posting a task to start fetching external data for policy " + << policy; backend_task_runner_->PostTask( FROM_HERE, base::BindOnce(&Backend::Fetch, base::Unretained(backend_.get()),
diff --git a/chrome/browser/ash/telemetry_extension/events/BUILD.gn b/chrome/browser/ash/telemetry_extension/events/BUILD.gn index ab55e41..d334b3c 100644 --- a/chrome/browser/ash/telemetry_extension/events/BUILD.gn +++ b/chrome/browser/ash/telemetry_extension/events/BUILD.gn
@@ -17,6 +17,7 @@ ] deps = [ + "//ash/system/diagnostics/mojom", "//base", "//chromeos/ash/services/cros_healthd/public/cpp", "//chromeos/ash/services/cros_healthd/public/mojom", @@ -33,12 +34,14 @@ ] deps = [ ":events", + "//ash/system/diagnostics/mojom", "//base", "//base/test:test_support", "//chromeos/ash/components/mojo_service_manager", "//chromeos/ash/services/cros_healthd/public/cpp", "//chromeos/ash/services/cros_healthd/public/mojom", "//chromeos/crosapi/mojom", + "//testing/gmock", "//testing/gtest", ] }
diff --git a/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.cc b/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.cc index a79eb1a..105a1407 100644 --- a/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.cc +++ b/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.cc
@@ -4,15 +4,50 @@ #include "chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.h" +#include <utility> +#include <vector> + +#include "ash/system/diagnostics/mojom/input.mojom.h" #include "base/notreached.h" #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_events.mojom.h" +#include "chromeos/crosapi/mojom/nullable_primitives.mojom.h" #include "chromeos/crosapi/mojom/telemetry_event_service.mojom.h" #include "chromeos/crosapi/mojom/telemetry_extension_exception.mojom.h" +#include "chromeos/crosapi/mojom/telemetry_keyboard_event.mojom.h" namespace ash::converters { namespace unchecked { +crosapi::mojom::TelemetryKeyboardInfoPtr UncheckedConvertPtr( + diagnostics::mojom::KeyboardInfoPtr input) { + auto result = crosapi::mojom::TelemetryKeyboardInfo::New(); + result->id = crosapi::mojom::UInt32Value::New(input->id); + result->connection_type = Convert(input->connection_type); + result->name = input->name; + result->physical_layout = Convert(input->physical_layout); + result->mechanical_layout = Convert(input->mechanical_layout); + result->region_code = input->region_code; + result->number_pad_present = Convert(input->number_pad_present); + result->top_row_keys = + Convert<diagnostics::mojom::TopRowKey, + crosapi::mojom::TelemetryKeyboardTopRowKey>(input->top_row_keys); + result->top_right_key = Convert(input->top_right_key); + result->has_assistant_key = + crosapi::mojom::BoolValue::New(input->has_assistant_key); + return result; +} + +crosapi::mojom::TelemetryKeyboardDiagnosticEventInfoPtr UncheckedConvertPtr( + diagnostics::mojom::KeyboardDiagnosticEventInfoPtr input) { + auto result = crosapi::mojom::TelemetryKeyboardDiagnosticEventInfo::New(); + result->keyboard_info = ConvertStructPtr(std::move(input->keyboard_info)); + result->tested_keys = std::move(input->tested_keys); + result->tested_top_row_keys = std::move(input->tested_top_row_keys); + + return result; +} + crosapi::mojom::TelemetryAudioJackEventInfoPtr UncheckedConvertPtr( cros_healthd::mojom::AudioJackEventInfoPtr input) { return crosapi::mojom::TelemetryAudioJackEventInfo::New( @@ -64,6 +99,11 @@ kPowerEventInfo: return crosapi::mojom::TelemetryEventInfo::NewPowerEventInfo( ConvertStructPtr(std::move(input->get_power_event_info()))); + case cros_healthd::mojom::internal::EventInfo_Data::EventInfo_Tag:: + kKeyboardDiagnosticEventInfo: + return crosapi::mojom::TelemetryEventInfo::NewKeyboardDiagnosticEventInfo( + ConvertStructPtr( + std::move(input->get_keyboard_diagnostic_event_info()))); default: LOG(WARNING) << "Got event for unsupported category"; return nullptr; @@ -121,6 +161,149 @@ } // namespace unchecked +crosapi::mojom::TelemetryKeyboardConnectionType Convert( + diagnostics::mojom::ConnectionType input) { + switch (input) { + case diagnostics::mojom::ConnectionType::kUnmappedEnumField: + return crosapi::mojom::TelemetryKeyboardConnectionType:: + kUnmappedEnumField; + case diagnostics::mojom::ConnectionType::kInternal: + return crosapi::mojom::TelemetryKeyboardConnectionType::kInternal; + case diagnostics::mojom::ConnectionType::kUsb: + return crosapi::mojom::TelemetryKeyboardConnectionType::kUsb; + case diagnostics::mojom::ConnectionType::kBluetooth: + return crosapi::mojom::TelemetryKeyboardConnectionType::kBluetooth; + case diagnostics::mojom::ConnectionType::kUnknown: + return crosapi::mojom::TelemetryKeyboardConnectionType::kUnknown; + } + NOTREACHED(); +} + +crosapi::mojom::TelemetryKeyboardPhysicalLayout Convert( + diagnostics::mojom::PhysicalLayout input) { + switch (input) { + case diagnostics::mojom::PhysicalLayout::kUnmappedEnumField: + return crosapi::mojom::TelemetryKeyboardPhysicalLayout:: + kUnmappedEnumField; + case diagnostics::mojom::PhysicalLayout::kUnknown: + return crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnknown; + case diagnostics::mojom::PhysicalLayout::kChromeOS: + return crosapi::mojom::TelemetryKeyboardPhysicalLayout::kChromeOS; + case diagnostics::mojom::PhysicalLayout::kChromeOSDellEnterpriseWilco: + return crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnknown; + case diagnostics::mojom::PhysicalLayout::kChromeOSDellEnterpriseDrallion: + return crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnknown; + } + NOTREACHED(); +} + +crosapi::mojom::TelemetryKeyboardMechanicalLayout Convert( + diagnostics::mojom::MechanicalLayout input) { + switch (input) { + case diagnostics::mojom::MechanicalLayout::kUnmappedEnumField: + return crosapi::mojom::TelemetryKeyboardMechanicalLayout:: + kUnmappedEnumField; + case diagnostics::mojom::MechanicalLayout::kUnknown: + return crosapi::mojom::TelemetryKeyboardMechanicalLayout::kUnknown; + case diagnostics::mojom::MechanicalLayout::kAnsi: + return crosapi::mojom::TelemetryKeyboardMechanicalLayout::kAnsi; + case diagnostics::mojom::MechanicalLayout::kIso: + return crosapi::mojom::TelemetryKeyboardMechanicalLayout::kIso; + case diagnostics::mojom::MechanicalLayout::kJis: + return crosapi::mojom::TelemetryKeyboardMechanicalLayout::kJis; + } + NOTREACHED(); +} + +crosapi::mojom::TelemetryKeyboardNumberPadPresence Convert( + diagnostics::mojom::NumberPadPresence input) { + switch (input) { + case diagnostics::mojom::NumberPadPresence::kUnmappedEnumField: + return crosapi::mojom::TelemetryKeyboardNumberPadPresence:: + kUnmappedEnumField; + case diagnostics::mojom::NumberPadPresence::kUnknown: + return crosapi::mojom::TelemetryKeyboardNumberPadPresence::kUnknown; + case diagnostics::mojom::NumberPadPresence::kPresent: + return crosapi::mojom::TelemetryKeyboardNumberPadPresence::kPresent; + case diagnostics::mojom::NumberPadPresence::kNotPresent: + return crosapi::mojom::TelemetryKeyboardNumberPadPresence::kNotPresent; + } + NOTREACHED(); +} + +crosapi::mojom::TelemetryKeyboardTopRowKey Convert( + diagnostics::mojom::TopRowKey input) { + switch (input) { + case diagnostics::mojom::TopRowKey::kUnmappedEnumField: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kUnmappedEnumField; + case diagnostics::mojom::TopRowKey::kNone: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kNone; + case diagnostics::mojom::TopRowKey::kUnknown: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kUnknown; + case diagnostics::mojom::TopRowKey::kBack: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kBack; + case diagnostics::mojom::TopRowKey::kForward: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kForward; + case diagnostics::mojom::TopRowKey::kRefresh: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kRefresh; + case diagnostics::mojom::TopRowKey::kFullscreen: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kFullscreen; + case diagnostics::mojom::TopRowKey::kOverview: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kOverview; + case diagnostics::mojom::TopRowKey::kScreenshot: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenshot; + case diagnostics::mojom::TopRowKey::kScreenBrightnessDown: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenBrightnessDown; + case diagnostics::mojom::TopRowKey::kScreenBrightnessUp: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenBrightnessUp; + case diagnostics::mojom::TopRowKey::kPrivacyScreenToggle: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kPrivacyScreenToggle; + case diagnostics::mojom::TopRowKey::kMicrophoneMute: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kMicrophoneMute; + case diagnostics::mojom::TopRowKey::kVolumeMute: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kVolumeMute; + case diagnostics::mojom::TopRowKey::kVolumeDown: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kVolumeDown; + case diagnostics::mojom::TopRowKey::kVolumeUp: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kVolumeUp; + case diagnostics::mojom::TopRowKey::kKeyboardBacklightToggle: + return crosapi::mojom::TelemetryKeyboardTopRowKey:: + kKeyboardBacklightToggle; + case diagnostics::mojom::TopRowKey::kKeyboardBacklightDown: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kKeyboardBacklightDown; + case diagnostics::mojom::TopRowKey::kKeyboardBacklightUp: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kKeyboardBacklightUp; + case diagnostics::mojom::TopRowKey::kNextTrack: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kNextTrack; + case diagnostics::mojom::TopRowKey::kPreviousTrack: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kPreviousTrack; + case diagnostics::mojom::TopRowKey::kPlayPause: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kPlayPause; + case diagnostics::mojom::TopRowKey::kScreenMirror: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenMirror; + case diagnostics::mojom::TopRowKey::kDelete: + return crosapi::mojom::TelemetryKeyboardTopRowKey::kDelete; + } + NOTREACHED(); +} + +crosapi::mojom::TelemetryKeyboardTopRightKey Convert( + diagnostics::mojom::TopRightKey input) { + switch (input) { + case diagnostics::mojom::TopRightKey::kUnmappedEnumField: + return crosapi::mojom::TelemetryKeyboardTopRightKey::kUnmappedEnumField; + case diagnostics::mojom::TopRightKey::kUnknown: + return crosapi::mojom::TelemetryKeyboardTopRightKey::kUnknown; + case diagnostics::mojom::TopRightKey::kPower: + return crosapi::mojom::TelemetryKeyboardTopRightKey::kPower; + case diagnostics::mojom::TopRightKey::kLock: + return crosapi::mojom::TelemetryKeyboardTopRightKey::kLock; + case diagnostics::mojom::TopRightKey::kControlPanel: + return crosapi::mojom::TelemetryKeyboardTopRightKey::kControlPanel; + } + NOTREACHED(); +} + crosapi::mojom::TelemetryAudioJackEventInfo::State Convert( cros_healthd::mojom::AudioJackEventInfo::State input) { switch (input) { @@ -240,6 +423,8 @@ return cros_healthd::mojom::EventCategoryEnum::kSdCard; case crosapi::mojom::TelemetryEventCategoryEnum::kPower: return cros_healthd::mojom::EventCategoryEnum::kPower; + case crosapi::mojom::TelemetryEventCategoryEnum::kKeyboardDiagnostic: + return cros_healthd::mojom::EventCategoryEnum::kKeyboardDiagnostic; } NOTREACHED(); }
diff --git a/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.h b/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.h index e1e16711..fab7532 100644 --- a/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.h +++ b/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters.h
@@ -5,10 +5,15 @@ #ifndef CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_EVENTS_TELEMETRY_EVENT_SERVICE_CONVERTERS_H_ #define CHROME_BROWSER_ASH_TELEMETRY_EXTENSION_EVENTS_TELEMETRY_EVENT_SERVICE_CONVERTERS_H_ +#include <type_traits> +#include <vector> + +#include "ash/system/diagnostics/mojom/input.mojom.h" #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_events.mojom.h" #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_exception.mojom.h" #include "chromeos/crosapi/mojom/telemetry_event_service.mojom.h" #include "chromeos/crosapi/mojom/telemetry_extension_exception.mojom.h" +#include "chromeos/crosapi/mojom/telemetry_keyboard_event.mojom.h" namespace ash::converters { @@ -20,6 +25,12 @@ crosapi::mojom::TelemetryAudioJackEventInfoPtr UncheckedConvertPtr( cros_healthd::mojom::AudioJackEventInfoPtr input); +crosapi::mojom::TelemetryKeyboardInfoPtr UncheckedConvertPtr( + diagnostics::mojom::KeyboardInfoPtr input); + +crosapi::mojom::TelemetryKeyboardDiagnosticEventInfoPtr UncheckedConvertPtr( + diagnostics::mojom::KeyboardDiagnosticEventInfoPtr input); + crosapi::mojom::TelemetryLidEventInfoPtr UncheckedConvertPtr( cros_healthd::mojom::LidEventInfoPtr input); @@ -58,6 +69,24 @@ crosapi::mojom::TelemetryAudioJackEventInfo::DeviceType Convert( cros_healthd::mojom::AudioJackEventInfo::DeviceType input); +crosapi::mojom::TelemetryKeyboardConnectionType Convert( + diagnostics::mojom::ConnectionType input); + +crosapi::mojom::TelemetryKeyboardPhysicalLayout Convert( + diagnostics::mojom::PhysicalLayout input); + +crosapi::mojom::TelemetryKeyboardMechanicalLayout Convert( + diagnostics::mojom::MechanicalLayout input); + +crosapi::mojom::TelemetryKeyboardNumberPadPresence Convert( + diagnostics::mojom::NumberPadPresence input); + +crosapi::mojom::TelemetryKeyboardTopRowKey Convert( + diagnostics::mojom::TopRowKey input); + +crosapi::mojom::TelemetryKeyboardTopRightKey Convert( + diagnostics::mojom::TopRightKey input); + crosapi::mojom::TelemetryLidEventInfo::State Convert( cros_healthd::mojom::LidEventInfo::State input); @@ -76,6 +105,17 @@ cros_healthd::mojom::EventCategoryEnum Convert( crosapi::mojom::TelemetryEventCategoryEnum input); +template <class InputT, + class OutputT, + std::enable_if_t<std::is_enum_v<InputT>, bool> = true> +std::vector<OutputT> Convert(std::vector<InputT> input) { + std::vector<OutputT> result; + for (auto elem : input) { + result.push_back(Convert(elem)); + } + return result; +} + template <class InputT> auto ConvertStructPtr(InputT input) { return (!input.is_null()) ? unchecked::UncheckedConvertPtr(std::move(input))
diff --git a/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters_unittest.cc b/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters_unittest.cc index 5056e0c..ac42571f 100644 --- a/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters_unittest.cc +++ b/chrome/browser/ash/telemetry_extension/events/telemetry_event_service_converters_unittest.cc
@@ -9,10 +9,13 @@ #include <string> #include <vector> +#include "ash/system/diagnostics/mojom/input.mojom.h" #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_events.mojom.h" #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_exception.mojom.h" #include "chromeos/crosapi/mojom/telemetry_event_service.mojom.h" #include "chromeos/crosapi/mojom/telemetry_extension_exception.mojom.h" +#include "chromeos/crosapi/mojom/telemetry_keyboard_event.mojom.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash::converters { @@ -24,6 +27,170 @@ EXPECT_TRUE(ConvertStructPtr(cros_healthd::mojom::EventInfoPtr()).is_null()); } +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardConnectionType) { + EXPECT_EQ( + Convert(diagnostics::mojom::ConnectionType::kUnmappedEnumField), + crosapi::mojom::TelemetryKeyboardConnectionType::kUnmappedEnumField); + + EXPECT_EQ(Convert(diagnostics::mojom::ConnectionType::kInternal), + crosapi::mojom::TelemetryKeyboardConnectionType::kInternal); + + EXPECT_EQ(Convert(diagnostics::mojom::ConnectionType::kUsb), + crosapi::mojom::TelemetryKeyboardConnectionType::kUsb); + + EXPECT_EQ(Convert(diagnostics::mojom::ConnectionType::kBluetooth), + crosapi::mojom::TelemetryKeyboardConnectionType::kBluetooth); + + EXPECT_EQ(Convert(diagnostics::mojom::ConnectionType::kUnknown), + crosapi::mojom::TelemetryKeyboardConnectionType::kUnknown); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardPhysicalLayout) { + EXPECT_EQ( + Convert(diagnostics::mojom::PhysicalLayout::kUnmappedEnumField), + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnmappedEnumField); + + EXPECT_EQ(Convert(diagnostics::mojom::PhysicalLayout::kUnknown), + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnknown); + + EXPECT_EQ(Convert(diagnostics::mojom::PhysicalLayout::kChromeOS), + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kChromeOS); + + EXPECT_EQ( + Convert(diagnostics::mojom::PhysicalLayout::kChromeOSDellEnterpriseWilco), + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnknown); + + EXPECT_EQ( + Convert( + diagnostics::mojom::PhysicalLayout::kChromeOSDellEnterpriseDrallion), + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kUnknown); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardMechanicalLayout) { + EXPECT_EQ( + Convert(diagnostics::mojom::MechanicalLayout::kUnmappedEnumField), + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kUnmappedEnumField); + + EXPECT_EQ(Convert(diagnostics::mojom::MechanicalLayout::kUnknown), + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kUnknown); + + EXPECT_EQ(Convert(diagnostics::mojom::MechanicalLayout::kAnsi), + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kAnsi); + + EXPECT_EQ(Convert(diagnostics::mojom::MechanicalLayout::kIso), + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kIso); + + EXPECT_EQ(Convert(diagnostics::mojom::MechanicalLayout::kJis), + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kJis); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardNumberPadPresence) { + EXPECT_EQ( + Convert(diagnostics::mojom::NumberPadPresence::kUnmappedEnumField), + crosapi::mojom::TelemetryKeyboardNumberPadPresence::kUnmappedEnumField); + + EXPECT_EQ(Convert(diagnostics::mojom::NumberPadPresence::kUnknown), + crosapi::mojom::TelemetryKeyboardNumberPadPresence::kUnknown); + + EXPECT_EQ(Convert(diagnostics::mojom::NumberPadPresence::kPresent), + crosapi::mojom::TelemetryKeyboardNumberPadPresence::kPresent); + + EXPECT_EQ(Convert(diagnostics::mojom::NumberPadPresence::kNotPresent), + crosapi::mojom::TelemetryKeyboardNumberPadPresence::kNotPresent); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardTopRowKey) { + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kUnmappedEnumField), + crosapi::mojom::TelemetryKeyboardTopRowKey::kUnmappedEnumField); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kNone), + crosapi::mojom::TelemetryKeyboardTopRowKey::kNone); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kUnknown), + crosapi::mojom::TelemetryKeyboardTopRowKey::kUnknown); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kBack), + crosapi::mojom::TelemetryKeyboardTopRowKey::kBack); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kForward), + crosapi::mojom::TelemetryKeyboardTopRowKey::kForward); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kRefresh), + crosapi::mojom::TelemetryKeyboardTopRowKey::kRefresh); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kFullscreen), + crosapi::mojom::TelemetryKeyboardTopRowKey::kFullscreen); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kOverview), + crosapi::mojom::TelemetryKeyboardTopRowKey::kOverview); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kScreenshot), + crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenshot); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kScreenBrightnessDown), + crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenBrightnessDown); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kScreenBrightnessUp), + crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenBrightnessUp); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kPrivacyScreenToggle), + crosapi::mojom::TelemetryKeyboardTopRowKey::kPrivacyScreenToggle); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kMicrophoneMute), + crosapi::mojom::TelemetryKeyboardTopRowKey::kMicrophoneMute); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kVolumeMute), + crosapi::mojom::TelemetryKeyboardTopRowKey::kVolumeMute); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kVolumeDown), + crosapi::mojom::TelemetryKeyboardTopRowKey::kVolumeDown); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kVolumeUp), + crosapi::mojom::TelemetryKeyboardTopRowKey::kVolumeUp); + + EXPECT_EQ( + Convert(diagnostics::mojom::TopRowKey::kKeyboardBacklightToggle), + crosapi::mojom::TelemetryKeyboardTopRowKey::kKeyboardBacklightToggle); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kKeyboardBacklightDown), + crosapi::mojom::TelemetryKeyboardTopRowKey::kKeyboardBacklightDown); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kKeyboardBacklightUp), + crosapi::mojom::TelemetryKeyboardTopRowKey::kKeyboardBacklightUp); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kNextTrack), + crosapi::mojom::TelemetryKeyboardTopRowKey::kNextTrack); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kPreviousTrack), + crosapi::mojom::TelemetryKeyboardTopRowKey::kPreviousTrack); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kPlayPause), + crosapi::mojom::TelemetryKeyboardTopRowKey::kPlayPause); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kScreenMirror), + crosapi::mojom::TelemetryKeyboardTopRowKey::kScreenMirror); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRowKey::kDelete), + crosapi::mojom::TelemetryKeyboardTopRowKey::kDelete); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardTopRightKey) { + EXPECT_EQ(Convert(diagnostics::mojom::TopRightKey::kUnmappedEnumField), + crosapi::mojom::TelemetryKeyboardTopRightKey::kUnmappedEnumField); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRightKey::kUnknown), + crosapi::mojom::TelemetryKeyboardTopRightKey::kUnknown); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRightKey::kPower), + crosapi::mojom::TelemetryKeyboardTopRightKey::kPower); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRightKey::kLock), + crosapi::mojom::TelemetryKeyboardTopRightKey::kLock); + + EXPECT_EQ(Convert(diagnostics::mojom::TopRightKey::kControlPanel), + crosapi::mojom::TelemetryKeyboardTopRightKey::kControlPanel); +} + TEST(TelemetryEventServiceConvertersTest, ConvertTelemetryAudioJackEventInfo_State) { EXPECT_EQ( @@ -148,6 +315,140 @@ EXPECT_EQ(Convert(crosapi::mojom::TelemetryEventCategoryEnum::kPower), cros_healthd::mojom::EventCategoryEnum::kPower); + + EXPECT_EQ( + Convert(crosapi::mojom::TelemetryEventCategoryEnum::kKeyboardDiagnostic), + cros_healthd::mojom::EventCategoryEnum::kKeyboardDiagnostic); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardInfo) { + constexpr uint32_t kId = 1; + constexpr char kName[] = "TESTNAME"; + constexpr char kRegionCode[] = "de"; + + auto input = diagnostics::mojom::KeyboardInfo::New(); + input->id = kId; + input->connection_type = diagnostics::mojom::ConnectionType::kBluetooth; + input->name = kName; + input->physical_layout = diagnostics::mojom::PhysicalLayout::kChromeOS; + input->mechanical_layout = diagnostics::mojom::MechanicalLayout::kAnsi; + input->region_code = kRegionCode; + input->number_pad_present = diagnostics::mojom::NumberPadPresence::kPresent; + input->top_row_keys = {diagnostics::mojom::TopRowKey::kBack, + diagnostics::mojom::TopRowKey::kForward}; + input->top_right_key = diagnostics::mojom::TopRightKey::kPower; + input->has_assistant_key = true; + + auto result = ConvertStructPtr(std::move(input)); + + ASSERT_TRUE(result); + + ASSERT_FALSE(result->id.is_null()); + EXPECT_EQ(result->id->value, kId); + + EXPECT_EQ(result->connection_type, + crosapi::mojom::TelemetryKeyboardConnectionType::kBluetooth); + + ASSERT_TRUE(result->name); + EXPECT_EQ(*result->name, kName); + + EXPECT_EQ(result->physical_layout, + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kChromeOS); + EXPECT_EQ(result->mechanical_layout, + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kAnsi); + + ASSERT_TRUE(result->region_code); + EXPECT_EQ(*result->region_code, kRegionCode); + + EXPECT_EQ(result->number_pad_present, + crosapi::mojom::TelemetryKeyboardNumberPadPresence::kPresent); + + ASSERT_TRUE(result->top_row_keys); + ASSERT_EQ(result->top_row_keys->size(), 2UL); + EXPECT_THAT(*result->top_row_keys, + testing::ElementsAre( + crosapi::mojom::TelemetryKeyboardTopRowKey::kBack, + crosapi::mojom::TelemetryKeyboardTopRowKey::kForward)); + + EXPECT_EQ(result->top_right_key, + crosapi::mojom::TelemetryKeyboardTopRightKey::kPower); + + ASSERT_FALSE(result->has_assistant_key.is_null()); + EXPECT_TRUE(result->has_assistant_key->value); +} + +TEST(TelemetryEventServiceConvertersTest, ConvertKeyboardDiagnosticEventInfo) { + constexpr uint32_t kId = 1; + constexpr char kName[] = "TESTNAME"; + constexpr char kRegionCode[] = "de"; + + std::vector<uint32_t> kTestedKeys = {1, 2, 3, 4, 5, 6}; + std::vector<uint32_t> kTestedTopRowKeys = {7, 8, 9, 10, 11, 12}; + + auto keyboard = diagnostics::mojom::KeyboardInfo::New(); + keyboard->id = kId; + keyboard->connection_type = diagnostics::mojom::ConnectionType::kBluetooth; + keyboard->name = kName; + keyboard->physical_layout = diagnostics::mojom::PhysicalLayout::kChromeOS; + keyboard->mechanical_layout = diagnostics::mojom::MechanicalLayout::kAnsi; + keyboard->region_code = kRegionCode; + keyboard->number_pad_present = + diagnostics::mojom::NumberPadPresence::kPresent; + keyboard->top_row_keys = {diagnostics::mojom::TopRowKey::kBack, + diagnostics::mojom::TopRowKey::kForward}; + keyboard->top_right_key = diagnostics::mojom::TopRightKey::kPower; + keyboard->has_assistant_key = true; + + auto input = diagnostics::mojom::KeyboardDiagnosticEventInfo::New(); + input->keyboard_info = std::move(keyboard); + input->tested_keys = kTestedKeys; + input->tested_top_row_keys = kTestedTopRowKeys; + + auto result = ConvertStructPtr(std::move(input)); + + ASSERT_TRUE(result); + + auto keyboard_info_result = std::move(result->keyboard_info); + ASSERT_TRUE(keyboard_info_result); + + ASSERT_FALSE(keyboard_info_result->id.is_null()); + EXPECT_EQ(keyboard_info_result->id->value, kId); + + EXPECT_EQ(keyboard_info_result->connection_type, + crosapi::mojom::TelemetryKeyboardConnectionType::kBluetooth); + + ASSERT_TRUE(keyboard_info_result->name); + EXPECT_EQ(*keyboard_info_result->name, kName); + + EXPECT_EQ(keyboard_info_result->physical_layout, + crosapi::mojom::TelemetryKeyboardPhysicalLayout::kChromeOS); + EXPECT_EQ(keyboard_info_result->mechanical_layout, + crosapi::mojom::TelemetryKeyboardMechanicalLayout::kAnsi); + + ASSERT_TRUE(keyboard_info_result->region_code); + EXPECT_EQ(*keyboard_info_result->region_code, kRegionCode); + + EXPECT_EQ(keyboard_info_result->number_pad_present, + crosapi::mojom::TelemetryKeyboardNumberPadPresence::kPresent); + + ASSERT_TRUE(keyboard_info_result->top_row_keys); + ASSERT_EQ(keyboard_info_result->top_row_keys->size(), 2UL); + EXPECT_THAT(*keyboard_info_result->top_row_keys, + testing::ElementsAre( + crosapi::mojom::TelemetryKeyboardTopRowKey::kBack, + crosapi::mojom::TelemetryKeyboardTopRowKey::kForward)); + + EXPECT_EQ(keyboard_info_result->top_right_key, + crosapi::mojom::TelemetryKeyboardTopRightKey::kPower); + + ASSERT_FALSE(keyboard_info_result->has_assistant_key.is_null()); + EXPECT_TRUE(keyboard_info_result->has_assistant_key->value); + + ASSERT_TRUE(result->tested_keys); + EXPECT_EQ(*result->tested_keys, kTestedKeys); + + ASSERT_TRUE(result->tested_top_row_keys); + EXPECT_EQ(*result->tested_top_row_keys, kTestedTopRowKeys); } TEST(TelemetryEventServiceConvertersTest,
diff --git a/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums.cc b/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums.cc index 3d50fe04..d798440 100644 --- a/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums.cc +++ b/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums.cc
@@ -6,9 +6,13 @@ #include <utility> +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/ambient/ambient_backend_controller.h" #include "ash/public/cpp/ambient/common/ambient_settings.h" +#include "base/strings/utf_string_conversions.h" #include "chromeos/strings/grit/chromeos_strings.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/chromeos/devicetype_utils.h" #include "url/gurl.h" namespace ash::personalization_app { @@ -38,8 +42,19 @@ album->id = video_album_info.id.data(); album->checked = currently_selected_video == video_album_info.video; album->title = l10n_util::GetStringUTF8(video_album_info.title_resource_id); - album->description = l10n_util::GetStringUTF8( - IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION); + // Product name does not need to be translated. + auto product_name = + l10n_util::GetStringUTF16(ui::GetChromeOSDeviceTypeResourceId()); + // TODO(b/270597524): Switch to `IsTimeOfDayScreenSaverEnabled` once + // `kFeatureManagementTimeOfDayScreenSaver` is used. + if (base::FeatureList::IsEnabled( + features::kFeatureManagementTimeOfDayScreenSaver)) { + product_name = base::UTF8ToUTF16( + AmbientBackendController::Get()->GetTimeOfDayProductName()); + } + album->description = l10n_util::GetStringFUTF8( + IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION, + product_name); album->url = GURL(video_album_info.url); album->topic_source = AmbientModeTopicSource::kVideo; output.emplace_back(std::move(album));
diff --git a/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums_unittest.cc index 4a65e9d..0159fdf 100644 --- a/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums_unittest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/ambient_video_albums_unittest.cc
@@ -28,11 +28,9 @@ AppendAmbientVideoAlbums(AmbientVideo::kNewMexico, albums); EXPECT_THAT(albums, UnorderedElementsAre( - Pointee(FieldsAre(kCloudsAlbumId, false, "Cloud Flow", - "Chromebook exclusive", _, + Pointee(FieldsAre(kCloudsAlbumId, false, "Cloud Flow", _, _, AmbientModeTopicSource::kVideo, _)), - Pointee(FieldsAre(kNewMexicoAlbumId, true, "Earth Flow", - "Chromebook exclusive", _, + Pointee(FieldsAre(kNewMexicoAlbumId, true, "Earth Flow", _, _, AmbientModeTopicSource::kVideo, _)))); albums.clear();
diff --git a/chrome/browser/browser_process_platform_part_mac.mm b/chrome/browser/browser_process_platform_part_mac.mm index cbabe7a..1f4e227 100644 --- a/chrome/browser/browser_process_platform_part_mac.mm +++ b/chrome/browser/browser_process_platform_part_mac.mm
@@ -15,13 +15,11 @@ #include "chrome/browser/chrome_browser_application_mac.h" #include "services/device/public/cpp/geolocation/system_geolocation_source_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif +BrowserProcessPlatformPart::BrowserProcessPlatformPart() { +} -BrowserProcessPlatformPart::BrowserProcessPlatformPart() = default; - -BrowserProcessPlatformPart::~BrowserProcessPlatformPart() = default; +BrowserProcessPlatformPart::~BrowserProcessPlatformPart() { +} void BrowserProcessPlatformPart::BeginStartTearDown() { if (app_shim_manager_) @@ -57,7 +55,7 @@ void BrowserProcessPlatformPart::PreMainMessageLoopRun() { // Create two AppShimManager::Delegates -- one for extensions-based apps - // (which will be deprecated in 2020), and one for web apps (PWAs and + // (which will be deprecatedin 2020), and one for web apps (PWAs and // bookmark apps). The WebAppShimManagerDelegate will defer to the // ExtensionAppShimManagerDelegate passed to it for extension-based apps. // When extension-based apps are deprecated, the
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index d437115..2b68cc3 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -798,17 +798,18 @@ host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::REVOKED_UNUSED_SITE_PERMISSIONS, delete_begin_, delete_end_, website_settings_filter); -#endif host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( - ContentSettingsType::NOTIFICATION_INTERACTIONS, delete_begin_, - delete_end_, website_settings_filter); - host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::PRIVATE_NETWORK_GUARD, delete_begin_, delete_end_, website_settings_filter); host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::PRIVATE_NETWORK_CHOOSER_DATA, delete_begin_, delete_end_, website_settings_filter); +#endif + + host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( + ContentSettingsType::NOTIFICATION_INTERACTIONS, delete_begin_, + delete_end_, website_settings_filter); PermissionDecisionAutoBlockerFactory::GetForProfile(profile_) ->RemoveEmbargoAndResetCounts(filter);
diff --git a/chrome/browser/chrome_browser_application_mac.h b/chrome/browser/chrome_browser_application_mac.h index 6493272..640eec5e 100644 --- a/chrome/browser/chrome_browser_application_mac.h +++ b/chrome/browser/chrome_browser_application_mac.h
@@ -13,8 +13,11 @@ #import "base/mac/scoped_sending_event.h" #import "base/message_loop/message_pump_mac.h" -@interface BrowserCrApplication - : NSApplication <CrAppProtocol, CrAppControlProtocol> +@interface BrowserCrApplication : NSApplication<CrAppProtocol, + CrAppControlProtocol> { + @private + BOOL _handlingSendEvent; +} // Our implementation of |-terminate:| only attempts to terminate the // application, i.e., begins a process which may lead to termination. This
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm index e3800e12..69231a86 100644 --- a/chrome/browser/chrome_browser_application_mac.mm +++ b/chrome/browser/chrome_browser_application_mac.mm
@@ -24,10 +24,6 @@ #include "content/public/browser/native_event_processor_observer_mac.h" #include "ui/base/cocoa/accessibility_focus_overrider.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace chrome_browser_application_mac { void RegisterBrowserCrApp() { @@ -42,7 +38,7 @@ void InitializeHeadlessMode() { // In headless mode the browser window exists but is always hidden, so there // is no point in showing dock icon and menu bar. - NSApp.activationPolicy = NSApplicationActivationPolicyAccessory; + [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory]; } void Terminate() { @@ -121,14 +117,13 @@ } // namespace -@interface BrowserCrApplication () <NativeEventProcessor> -@end - -@implementation BrowserCrApplication { +@interface BrowserCrApplication ()<NativeEventProcessor> { base::ObserverList<content::NativeEventProcessorObserver>::Unchecked _observers; - BOOL _handlingSendEvent; } +@end + +@implementation BrowserCrApplication + (void)initialize { // Turn all deallocated Objective-C objects into zombies, keeping @@ -345,13 +340,13 @@ } base::mac::ScopedSendingEvent sendingEventScoper; content::ScopedNotifyNativeEventProcessorObserver scopedObserverNotifier( - &self->_observers, event); + &_observers, event); // Mac Eisu and Kana keydown events are by default swallowed by sendEvent // and sent directly to IME, which prevents ui keydown events from firing. // These events need to be sent to [NSApp keyWindow] for handling. - if (event.type == NSEventTypeKeyDown && - (event.keyCode == kVK_JIS_Eisu || event.keyCode == kVK_JIS_Kana)) { - [NSApp.keyWindow sendEvent:event]; + if ([event type] == NSEventTypeKeyDown && + ([event keyCode] == kVK_JIS_Eisu || [event keyCode] == kVK_JIS_Kana)) { + [[NSApp keyWindow] sendEvent:event]; } else { [super sendEvent:event]; } @@ -359,8 +354,7 @@ } - (void)accessibilitySetValue:(id)value forAttribute:(NSString*)attribute { - // This is an undocumented attribute that's set when VoiceOver is turned - // on/off. + // This is an undocument attribute that's set when VoiceOver is turned on/off. if ([attribute isEqualToString:@"AXEnhancedUserInterface"]) { content::BrowserAccessibilityState* accessibility_state = content::BrowserAccessibilityState::GetInstance();
diff --git a/chrome/browser/chrome_browser_main_mac.mm b/chrome/browser/chrome_browser_main_mac.mm index a380891f..789d147f 100644 --- a/chrome/browser/chrome_browser_main_mac.mm +++ b/chrome/browser/chrome_browser_main_mac.mm
@@ -12,6 +12,7 @@ #include "base/functional/bind.h" #import "base/mac/foundation_util.h" #include "base/mac/mac_util.h" +#include "base/mac/scoped_nsobject.h" #include "base/metrics/histogram_functions.h" #include "base/path_service.h" #include "base/strings/sys_string_conversions.h" @@ -49,10 +50,6 @@ #include "ui/base/resource/resource_handle.h" #include "ui/native_theme/native_theme_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // ChromeBrowserMainPartsMac --------------------------------------------------- ChromeBrowserMainPartsMac::ChromeBrowserMainPartsMac(bool is_integration_test,
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/events/event_observation_crosapi.cc b/chrome/browser/chromeos/extensions/telemetry/api/events/event_observation_crosapi.cc index 77ed1a80..f61dea8b 100644 --- a/chrome/browser/chromeos/extensions/telemetry/api/events/event_observation_crosapi.cc +++ b/chrome/browser/chromeos/extensions/telemetry/api/events/event_observation_crosapi.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/logging.h" +#include "base/notreached.h" #include "base/values.h" #include "chrome/browser/chromeos/extensions/telemetry/api/events/events_api_converters.h" #include "chrome/common/chromeos/extensions/api/events.h" @@ -102,6 +103,11 @@ browser_context_); break; } + case crosapi::internal::TelemetryEventInfo_Data::TelemetryEventInfo_Tag:: + kKeyboardDiagnosticEventInfo: { + NOTIMPLEMENTED(); + break; + } } extensions::EventRouter::Get(browser_context_)
diff --git a/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc b/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc index 13207a96..f42074f 100644 --- a/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc +++ b/chrome/browser/chromeos/kcer_nss/kcer_nss_unittest.cc
@@ -46,6 +46,15 @@ stream << static_cast<int>(val); return stream; } +std::ostream& operator<<(std::ostream& stream, PublicKey val) { + stream << "{\n"; + stream << " token: " << val.GetToken() << "\n"; + stream << " pkcs11_id: " << base::Base64Encode(val.GetPkcs11Id().value()) + << "\n"; + stream << " spki: " << base::Base64Encode(val.GetSpki().value()) << "\n"; + stream << "}\n"; + return stream; +} namespace { @@ -373,8 +382,15 @@ kcer->ImportX509Cert(Token::kUser, /*cert=*/cert_builder->GetX509Certificate(), import_x509_cert_waiter.GetCallback()); + base::test::TestFuture<base::expected<void, Error>> + remove_key_and_certs_waiter; + kcer->RemoveKeyAndCerts(PrivateKeyHandle(PublicKeySpki()), + remove_key_and_certs_waiter.GetCallback()); base::test::TestFuture<base::expected<void, Error>> remove_cert_waiter; kcer->RemoveCert(fake_cert, remove_cert_waiter.GetCallback()); + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser}, list_keys_waiter.GetCallback()); base::test::TestFuture<std::vector<scoped_refptr<const Cert>>, base::flat_map<Token, Error>> list_certs_waiter; @@ -431,9 +447,15 @@ ASSERT_FALSE(import_x509_cert_waiter.Get().has_value()); EXPECT_EQ(import_x509_cert_waiter.Get().error(), Error::kTokenInitializationFailed); + ASSERT_FALSE(remove_key_and_certs_waiter.Get().has_value()); + EXPECT_EQ(remove_key_and_certs_waiter.Get().error(), + Error::kTokenInitializationFailed); ASSERT_FALSE(remove_cert_waiter.Get().has_value()); EXPECT_EQ(remove_cert_waiter.Get().error(), Error::kTokenInitializationFailed); + ASSERT_FALSE(list_keys_waiter.Get<1>().empty()); + EXPECT_EQ(list_keys_waiter.Get<1>().at(Token::kUser), + Error::kTokenInitializationFailed); ASSERT_FALSE(list_certs_waiter.Get<1>().empty()); EXPECT_EQ(list_certs_waiter.Get<1>().at(Token::kUser), Error::kTokenInitializationFailed); @@ -465,6 +487,133 @@ Error::kTokenInitializationFailed); } +TEST_F(KcerNssTest, ListKeys) { + TokenHolder user_token(Token::kUser); + user_token.Initialize(); + TokenHolder device_token(Token::kDevice); + device_token.Initialize(); + + std::unique_ptr<Kcer> kcer = internal::CreateKcer( + IOTaskRunner(), user_token.GetWeakPtr(), device_token.GetWeakPtr()); + + std::vector<PublicKey> all_expected_keys; + std::vector<PublicKey> user_expected_keys; + std::vector<PublicKey> device_expected_keys; + + // Initially there should be no keys. + { + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser, Token::kDevice}, + list_keys_waiter.GetCallback()); + + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_THAT(list_keys_waiter.Get<std::vector<PublicKey>>(), + testing::UnorderedElementsAreArray(all_expected_keys)); + } + + // Generate a key. + { + base::test::TestFuture<base::expected<PublicKey, Error>> + generate_key_waiter; + kcer->GenerateRsaKey(Token::kUser, /*modulus_length_bits=*/2048, + /*hardware_backed=*/true, + generate_key_waiter.GetCallback()); + ASSERT_TRUE(generate_key_waiter.Get().has_value()); + user_expected_keys.push_back(generate_key_waiter.Get().value()); + all_expected_keys.push_back(generate_key_waiter.Take().value()); + } + + // The new key should be found. + { + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser, Token::kDevice}, + list_keys_waiter.GetCallback()); + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_THAT(list_keys_waiter.Get<std::vector<PublicKey>>(), + testing::UnorderedElementsAreArray(all_expected_keys)); + } + + // Generate a key on a different token. + { + base::test::TestFuture<base::expected<PublicKey, Error>> + generate_key_waiter; + kcer->GenerateRsaKey(Token::kDevice, /*modulus_length_bits=*/2048, + /*hardware_backed=*/true, + generate_key_waiter.GetCallback()); + ASSERT_TRUE(generate_key_waiter.Get().has_value()); + device_expected_keys.push_back(generate_key_waiter.Get().value()); + all_expected_keys.push_back(generate_key_waiter.Take().value()); + } + + // Keys from both tokens should be found. + { + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser, Token::kDevice}, + list_keys_waiter.GetCallback()); + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_THAT(list_keys_waiter.Get<std::vector<PublicKey>>(), + testing::UnorderedElementsAreArray(all_expected_keys)); + } + + // Generate a key of a different type on user token. + { + base::test::TestFuture<base::expected<PublicKey, Error>> + generate_key_waiter; + kcer->GenerateEcKey(Token::kUser, EllipticCurve::kP256, + /*hardware_backed=*/true, + generate_key_waiter.GetCallback()); + ASSERT_TRUE(generate_key_waiter.Get().has_value()); + user_expected_keys.push_back(generate_key_waiter.Get().value()); + all_expected_keys.push_back(generate_key_waiter.Take().value()); + } + + // Generate a key of a different type on device token. + { + base::test::TestFuture<base::expected<PublicKey, Error>> + generate_key_waiter; + kcer->GenerateEcKey(Token::kDevice, EllipticCurve::kP256, + /*hardware_backed=*/true, + generate_key_waiter.GetCallback()); + ASSERT_TRUE(generate_key_waiter.Get().has_value()); + device_expected_keys.push_back(generate_key_waiter.Get().value()); + all_expected_keys.push_back(generate_key_waiter.Take().value()); + } + + // Keys of both types from both tokens should be found. + { + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser, Token::kDevice}, + list_keys_waiter.GetCallback()); + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_THAT(list_keys_waiter.Get<std::vector<PublicKey>>(), + testing::UnorderedElementsAreArray(all_expected_keys)); + } + + // Keys of both types only from the user token should be found. + { + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser}, list_keys_waiter.GetCallback()); + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_THAT(list_keys_waiter.Get<std::vector<PublicKey>>(), + testing::UnorderedElementsAreArray(user_expected_keys)); + } + + // Keys of both types only from the device token should be found. + { + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kDevice}, list_keys_waiter.GetCallback()); + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_THAT(list_keys_waiter.Get<std::vector<PublicKey>>(), + testing::UnorderedElementsAreArray(device_expected_keys)); + } +} + // Test that Kcer::Sign() works correctly for RSA keys with different signing // schemes. // TODO(miersh): Expand crypto::SignatureVerifier to work with more signature @@ -977,6 +1126,93 @@ } } +TEST_P(KcerNssAllKeyTypesTest, RemoveKeyAndCertsWithManyCerts) { + TokenHolder user_token(Token::kUser); + user_token.Initialize(); + + std::unique_ptr<Kcer> kcer = internal::CreateKcer( + IOTaskRunner(), user_token.GetWeakPtr(), /*device_token=*/nullptr); + + // Generate new key. + base::test::TestFuture<base::expected<PublicKey, Error>> generate_waiter; + switch (GetParam()) { + case KeyType::kRsa: + kcer->GenerateRsaKey(Token::kUser, /*modulus_length_bits=*/2048, + /*hardware_backed=*/true, + generate_waiter.GetCallback()); + break; + case KeyType::kEcc: + kcer->GenerateEcKey(Token::kUser, EllipticCurve::kP256, + /*hardware_backed=*/true, + generate_waiter.GetCallback()); + break; + } + ASSERT_TRUE(generate_waiter.Get().has_value()); + const PublicKey& public_key = generate_waiter.Get().value(); + + // Import three certs, ids should be random, so they will be different. + { + std::unique_ptr<net::CertBuilder> issuer = MakeCertIssuer(); + std::unique_ptr<net::CertBuilder> cert_builder = + MakeCertBuilder(issuer.get(), public_key.GetSpki().value()); + // Import a cert. + base::test::TestFuture<base::expected<void, Error>> import_waiter; + kcer->ImportX509Cert(Token::kUser, cert_builder->GetX509Certificate(), + import_waiter.GetCallback()); + EXPECT_TRUE(import_waiter.Get().has_value()); + } + { + std::unique_ptr<net::CertBuilder> issuer = MakeCertIssuer(); + std::unique_ptr<net::CertBuilder> cert_builder = + MakeCertBuilder(issuer.get(), public_key.GetSpki().value()); + // Import a cert. + base::test::TestFuture<base::expected<void, Error>> import_waiter; + kcer->ImportX509Cert(Token::kUser, cert_builder->GetX509Certificate(), + import_waiter.GetCallback()); + EXPECT_TRUE(import_waiter.Get().has_value()); + } + { + std::unique_ptr<net::CertBuilder> issuer = MakeCertIssuer(); + std::unique_ptr<net::CertBuilder> cert_builder = + MakeCertBuilder(issuer.get(), public_key.GetSpki().value()); + // Import a cert. + base::test::TestFuture<base::expected<void, Error>> import_waiter; + kcer->ImportX509Cert(Token::kUser, cert_builder->GetX509Certificate(), + import_waiter.GetCallback()); + EXPECT_TRUE(import_waiter.Get().has_value()); + } + + // Check that the imported cert can be found. + base::test::TestFuture<std::vector<scoped_refptr<const Cert>>, + base::flat_map<Token, Error>> + certs_waiter; + kcer->ListCerts({Token::kUser}, certs_waiter.GetCallback()); + EXPECT_TRUE(certs_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_EQ(certs_waiter.Get<std::vector<scoped_refptr<const Cert>>>().size(), + 3u); + + base::test::TestFuture<base::expected<void, Error>> remove_waiter; + kcer->RemoveKeyAndCerts(PrivateKeyHandle(public_key), + remove_waiter.GetCallback()); + EXPECT_TRUE(remove_waiter.Get().has_value()); + + // Check that the imported cert cannot be found anymore. + base::test::TestFuture<std::vector<scoped_refptr<const Cert>>, + base::flat_map<Token, Error>> + certs_waiter_2; + kcer->ListCerts({Token::kUser}, certs_waiter_2.GetCallback()); + EXPECT_TRUE(certs_waiter_2.Get<1>().empty()); // Error map is empty. + EXPECT_TRUE( + certs_waiter_2.Get<std::vector<scoped_refptr<const Cert>>>().empty()); + + // Check that the generated key cannot be found anymore. + base::test::TestFuture<std::vector<PublicKey>, base::flat_map<Token, Error>> + list_keys_waiter; + kcer->ListKeys({Token::kUser}, list_keys_waiter.GetCallback()); + ASSERT_TRUE(list_keys_waiter.Get<1>().empty()); // Error map is empty. + EXPECT_TRUE(list_keys_waiter.Get<std::vector<PublicKey>>().empty()); +} + // Test that all methods work together as expected. Simulate a potential // lifecycle of a key and related objects. TEST_P(KcerNssAllKeyTypesTest, AllMethodsTogether) {
diff --git a/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc b/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc index 827760a..92fab787e 100644 --- a/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc +++ b/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.cc
@@ -57,9 +57,9 @@ unblocker.RunAndReset(); } -// Returns a vector containing bytes from `value` or an empty vector if -// `value` is nullptr. -std::vector<uint8_t> SECItemToBytes(crypto::ScopedSECItem value) { +// Returns a vector containing bytes from `value` or an empty vector if `value` +// is nullptr. +std::vector<uint8_t> SECItemToBytes(const crypto::ScopedSECItem& value) { return value ? std::vector<uint8_t>(value->data, value->data + value->len) : std::vector<uint8_t>(); } @@ -74,6 +74,21 @@ PK11_DeleteTokenPublicKey(/*pubKey=*/public_key.release()); } +base::expected<crypto::ScopedSECKEYPrivateKey, Error> +GetSECKEYPrivateKeyByPkcs11Id(const crypto::ScopedPK11Slot& slot, + const std::vector<uint8_t>& pkcs11_id) { + SECItem sec_key_id; + sec_key_id.data = const_cast<uint8_t*>(pkcs11_id.data()); + sec_key_id.len = pkcs11_id.size(); + + crypto::ScopedSECKEYPrivateKey private_key( + PK11_FindKeyByKeyID(slot.get(), &sec_key_id, /*wincx=*/nullptr)); + if (!private_key) { + return base::unexpected(Error::kKeyNotFound); + } + return private_key; +} + // Returns ScopedSECKEYPrivateKey if the key was found. // Returns Error::kKeyNotFound if the key was not found. // Returns some other error in case of other problems. @@ -90,31 +105,7 @@ return base::unexpected(Error::kFailedToGetKeyId); } - SECItem sec_key_id; - sec_key_id.data = pkcs11_id.data(); - sec_key_id.len = pkcs11_id.size(); - - crypto::ScopedSECKEYPrivateKey private_key( - PK11_FindKeyByKeyID(slot.get(), &sec_key_id, /*wincx=*/nullptr)); - if (!private_key) { - return base::unexpected(Error::kKeyNotFound); - } - return private_key; -} - -void DoesPrivateKeyExistOnWorkerThread(crypto::ScopedPK11Slot slot, - PrivateKeyHandle key, - Kcer::DoesKeyExistCallback callback) { - base::expected<crypto::ScopedSECKEYPrivateKey, Error> private_key = - GetSECKEYPrivateKey(slot, key); - if (private_key.has_value()) { - return std::move(callback).Run(true); - } - if ((private_key.error() == Error::kKeyNotFound) || - (private_key.error() == Error::kTokenIsNotAvailable)) { - return std::move(callback).Run(false); - } - return std::move(callback).Run(base::unexpected(private_key.error())); + return GetSECKEYPrivateKeyByPkcs11Id(slot, pkcs11_id); } void GenerateRsaKeyOnWorkerThread(Token token, @@ -241,9 +232,11 @@ PublicKeySpki(SECItemToBytes(std::move(public_key_der))))); } -void ImportCertOnWorkerThread(crypto::ScopedPK11Slot slot, - CertDer cert_der, - Kcer::Kcer::StatusCallback callback) { +void ImportCertOnWorkerThread( + crypto::ScopedPK11Slot slot, + CertDer cert_der, + base::OnceCallback<void(bool /*did_modify*/, + base::expected<void, Error> /*result*/)> callback) { net::ScopedCERTCertificateList certs = net::x509_util::CreateCERTCertificateListFromBytes( reinterpret_cast<char*>(cert_der->data()), cert_der->size(), @@ -251,17 +244,88 @@ if (certs.empty() || (certs.size() != 1)) { return std::move(callback).Run( - base::unexpected(Error::kInvalidCertificate)); + /*did_modify=*/false, base::unexpected(Error::kInvalidCertificate)); } if (int res = net::x509_util::ImportUserCert(certs[0].get()); res != net::OK) { LOG(ERROR) << "Failed to import certificate, error: " << res; return std::move(callback).Run( + /*did_modify=*/false, base::unexpected(Error::kFailedToImportCertificate)); } - return std::move(callback).Run({}); + return std::move(callback).Run(/*did_modify=*/true, {}); +} + +// Returns true if |public_key| is relevant as a "platform key" that should be +// visible to chrome extensions / subsystems. +bool ShouldIncludePublicKey(SECKEYPublicKey* public_key) { + crypto::ScopedSECItem cka_id(SECITEM_AllocItem(/*arena=*/nullptr, + /*item=*/nullptr, + /*len=*/0)); + if (PK11_ReadRawAttribute( + /*objType=*/PK11_TypePubKey, public_key, CKA_ID, cka_id.get()) != + SECSuccess) { + return false; + } + + base::StringPiece cka_id_str(reinterpret_cast<char*>(cka_id->data), + cka_id->len); + + // Only keys generated/stored by extensions/Chrome should be visible to + // extensions. Oemcrypto stores its key in the TPM, but that should not + // be exposed. Look at exposing additional attributes or changing the slot + // that Oemcrypto stores keys, so that it can be done based on properties + // of the key. See https://crbug/com/1136396 + if (cka_id_str == "arc-oemcrypto") { + VLOG(0) << "Filtered out arc-oemcrypto public key."; + return false; + } + return true; +} + +void ListKeysOnWorkerThread(Token token, + crypto::ScopedPK11Slot slot, + KcerToken::TokenListKeysCallback callback) { + std::vector<PublicKey> result; + + crypto::ScopedSECKEYPublicKeyList public_keys( + PK11_ListPublicKeysInSlot(slot.get(), /*nickname=*/nullptr)); + if (!public_keys) { + return std::move(callback).Run(std::move(result)); + } + + for (SECKEYPublicKeyListNode* node = PUBKEY_LIST_HEAD(public_keys); + !PUBKEY_LIST_END(node, public_keys); node = PUBKEY_LIST_NEXT(node)) { + if (!ShouldIncludePublicKey(node->key)) { + continue; + } + + Pkcs11Id pkcs11_id( + SECItemToBytes(crypto::MakeNssIdFromPublicKey(node->key))); + + base::expected<crypto::ScopedSECKEYPrivateKey, Error> private_key = + GetSECKEYPrivateKeyByPkcs11Id(slot, pkcs11_id.value()); + if (!private_key.has_value()) { + // Do not list key pairs without private keys, they might be left behind + // when NSS fails to delete a public key. + continue; + } + + crypto::ScopedSECItem public_key_der( + SECKEY_EncodeDERSubjectPublicKeyInfo(node->key)); + if (!public_key_der || (public_key_der->len == 0)) { + LOG(WARNING) << "Could not encode subject public key info."; + continue; + } + + result.emplace_back( + token, std::move(pkcs11_id), + PublicKeySpki(SECItemToBytes(std::move(public_key_der)))); + } + + std::move(callback).Run(std::move(result)); } void ListCertsOnWorkerThread( @@ -279,26 +343,101 @@ std::move(callback).Run(std::move(result)); } -void RemoveCertOnWorkerThread(crypto::ScopedPK11Slot slot, - scoped_refptr<const Cert> cert, - Kcer::StatusCallback callback) { +void RemoveKeyAndCertsOnWorkerThread( + crypto::ScopedPK11Slot slot, + PrivateKeyHandle key, + base::OnceCallback<void(bool /*did_modify*/, + base::expected<void, Error> /*result*/)> callback) { + base::expected<crypto::ScopedSECKEYPrivateKey, Error> private_key = + GetSECKEYPrivateKey(slot, key); + if (!private_key.has_value()) { + return std::move(callback).Run(/*did_modify=*/false, + base::unexpected(private_key.error())); + } + crypto::ScopedSECKEYPrivateKey& sec_private_key = private_key.value(); + + // There can be multiple certs that need to be deleted. The loop continues + // until no more certs are found or too many errors received. + int errors_allowed = 5; + int certs_removed = 0; + while (errors_allowed > 0) { + net::ScopedCERTCertificate cert( + PK11_GetCertFromPrivateKey(sec_private_key.get())); + if (!cert) { + break; + } + + if (SEC_DeletePermCertificate(cert.get()) != SECSuccess) { + --errors_allowed; + continue; + } + ++certs_removed; + } + if (errors_allowed == 0) { + return std::move(callback).Run( + /*did_modify=*/(certs_removed > 0), + base::unexpected(Error::kFailedToRemoveCertificate)); + } + + crypto::ScopedSECKEYPublicKey public_key( + SECKEY_ConvertToPublicKey(sec_private_key.get())); + + if (PK11_DeleteTokenPrivateKey(/*privKey=*/sec_private_key.release(), + /*force=*/false) != SECSuccess) { + return std::move(callback).Run( + /*did_modify=*/(certs_removed > 0), + base::unexpected(Error::kFailedToRemovePrivateKey)); + } + + // TODO(crbug.com/1096051): NSS tends to fail the deletion of the public key, + // ignore the result for now and make sure it works properly in the non-NSS + // version of Kcer. + PK11_DeleteTokenPublicKey(/*privKey=*/public_key.release()); + + // Success. + return std::move(callback).Run( + /*did_modify=*/(certs_removed > 0), {}); +} + +void RemoveCertOnWorkerThread( + crypto::ScopedPK11Slot slot, + scoped_refptr<const Cert> cert, + base::OnceCallback<void(bool /*did_modify*/, + base::expected<void, Error> /*result*/)> callback) { net::ScopedCERTCertificate nss_cert = net::x509_util::CreateCERTCertificateFromX509Certificate( cert->GetX509Cert().get()); if (!nss_cert) { return std::move(callback).Run( - base::unexpected(Error::kInvalidCertificate)); + /*did_modify=*/false, base::unexpected(Error::kInvalidCertificate)); } if (SEC_DeletePermCertificate(nss_cert.get()) != SECSuccess) { return std::move(callback).Run( + /*did_modify=*/false, base::unexpected(Error::kFailedToRemoveCertificate)); } - // TODO(miersh): Currently the method returns "success" even when - // SEC_DeletePermCertificate doesn't find the certificate. This is + + // TODO(miersh): Currently RemoveCertOnWorkerThread() returns "success" even + // when SEC_DeletePermCertificate doesn't find the certificate. This is // acceptable for a "remove" method, but it might be useful to change it // after NSS is not used for Kcer. - std::move(callback).Run({}); + std::move(callback).Run(/*did_modify=*/true, {}); +} + +void DoesPrivateKeyExistOnWorkerThread(crypto::ScopedPK11Slot slot, + PrivateKeyHandle key, + Kcer::DoesKeyExistCallback callback) { + base::expected<crypto::ScopedSECKEYPrivateKey, Error> private_key = + GetSECKEYPrivateKey(slot, key); + if (private_key.has_value()) { + return std::move(callback).Run(true); + } + if ((private_key.error() == Error::kKeyNotFound) || + (private_key.error() == Error::kTokenIsNotAvailable)) { + return std::move(callback).Run(false); + } + return std::move(callback).Run(base::unexpected(private_key.error())); } bool DoesKeySupportSigningScheme( @@ -954,7 +1093,30 @@ void KcerTokenImplNss::RemoveKeyAndCerts(PrivateKeyHandle key, Kcer::StatusCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - // TODO(244408716): Implement. + + if (UNLIKELY(state_ == State::kInitializationFailed)) { + return HandleInitializationFailed(std::move(callback)); + } + if (is_blocked_) { + return task_queue_.push(base::BindOnce( + &KcerTokenImplNss::RemoveKeyAndCerts, weak_factory_.GetWeakPtr(), + std::move(key), std::move(callback))); + } + + // Block task queue, attach queue unblocking and notification sending to the + // callback. + auto wrapped_callback = base::BindPostTask( + content::GetIOThreadTaskRunner({}), + base::BindOnce(&KcerTokenImplNss::OnCertsModified, + weak_factory_.GetWeakPtr(), + std::move(callback).Then(BlockQueueGetUnblocker()))); + + base::ThreadPool::PostTask( + FROM_HERE, + {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + base::BindOnce(&RemoveKeyAndCertsOnWorkerThread, + crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot_.get())), + std::move(key), std::move(wrapped_callback))); } void KcerTokenImplNss::RemoveCert(scoped_refptr<const Cert> cert, @@ -987,7 +1149,24 @@ void KcerTokenImplNss::ListKeys(TokenListKeysCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - // TODO(244408716): Implement. + + if (UNLIKELY(state_ == State::kInitializationFailed)) { + return HandleInitializationFailed(std::move(callback)); + } else if (is_blocked_) { + return task_queue_.push(base::BindOnce(&KcerTokenImplNss::ListKeys, + weak_factory_.GetWeakPtr(), + std::move(callback))); + } + + // Block task queue, attach unblocking task to the callback. + auto unblocking_callback = std::move(callback).Then(BlockQueueGetUnblocker()); + + base::ThreadPool::PostTask( + FROM_HERE, + {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, + base::BindOnce(&ListKeysOnWorkerThread, token_, + crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot_.get())), + std::move(unblocking_callback))); } void KcerTokenImplNss::ListCerts(TokenListCertsCallback callback) { @@ -1209,11 +1388,14 @@ std::move(unblocking_callback))); } +// `did_modify` indicates whether a modification was actually made (which should +// trigger a notification). void KcerTokenImplNss::OnCertsModified(Kcer::StatusCallback callback, + bool did_modify, base::expected<void, Error> result) { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (result.has_value()) { + if (did_modify) { net::CertDatabase::GetInstance()->NotifyObserversCertDBChanged(); } // The Notify... above will post a task to invalidate the cache. Calling the
diff --git a/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.h b/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.h index dca805c..32df4df 100644 --- a/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.h +++ b/chrome/browser/chromeos/kcer_nss/kcer_token_impl_nss.h
@@ -132,9 +132,13 @@ void HandleInitializationFailed( base::OnceCallback<void(base::expected<T, Error>)> callback); - // Sends a notification about changed certs (if needed) and forwards the - // result. + // Used by operations that may modify the set of certificates on the token. If + // `did_modify` is true, dispatches a notification that the certificate store + // changed. Then forwards `result` to `callback`. Note that `did_modify` may + // be true even if `result` contains an error, because some operations can be + // partially successful. void OnCertsModified(Kcer::StatusCallback callback, + bool did_modify, base::expected<void, Error> result); // These methods return PKCS#11 attribute IDs that should be passed to NSS,
diff --git a/chrome/browser/companion/core/companion_metrics_logger.cc b/chrome/browser/companion/core/companion_metrics_logger.cc index 30421a9..d811bb9 100644 --- a/chrome/browser/companion/core/companion_metrics_logger.cc +++ b/chrome/browser/companion/core/companion_metrics_logger.cc
@@ -175,6 +175,11 @@ last_ph_feedback_ = ph_feedback; } +void CompanionMetricsLogger::OnExpsOptInStatusAvailable( + bool is_exps_opted_in) const { + base::UmaHistogramBoolean("Companion.IsUserOptedInToExps", is_exps_opted_in); +} + void CompanionMetricsLogger::FlushStats() { ukm::builders::Companion_PageView ukm_builder(ukm_source_id_);
diff --git a/chrome/browser/companion/core/companion_metrics_logger.h b/chrome/browser/companion/core/companion_metrics_logger.h index 16b235894..816695eb 100644 --- a/chrome/browser/companion/core/companion_metrics_logger.h +++ b/chrome/browser/companion/core/companion_metrics_logger.h
@@ -115,6 +115,9 @@ // Logging method corresponding to `OnPhFeedback` in companion.mojom. void OnPhFeedback(PhFeedback ph_feedback); + // Logging method recording the status of whether user is opted-in to exps. + void OnExpsOptInStatusAvailable(bool is_exps_opted_in) const; + private: // Meant to be called at destruction. Flushes the UKM metrics. void FlushStats();
diff --git a/chrome/browser/companion/core/promo_handler.cc b/chrome/browser/companion/core/promo_handler.cc index 1fcb45b..de8362b 100644 --- a/chrome/browser/companion/core/promo_handler.cc +++ b/chrome/browser/companion/core/promo_handler.cc
@@ -34,25 +34,30 @@ void PromoHandler::OnPromoAction(PromoType promo_type, PromoAction promo_action) { - if (promo_type == PromoType::kSignin) { - OnSigninPromo(promo_action); - } else if (promo_type == PromoType::kMsbb) { - OnMsbbPromo(promo_action); - } else if (promo_type == PromoType::kExps) { - OnExpsPromo(promo_action); + switch (promo_type) { + case PromoType::kSignin: + OnSigninPromo(promo_action); + return; + case PromoType::kMsbb: + OnMsbbPromo(promo_action); + return; + case PromoType::kExps: + OnExpsPromo(promo_action); + return; } } void PromoHandler::OnSigninPromo(PromoAction promo_action) { - if (promo_action == PromoAction::kRejected) { - IncrementPref(kSigninPromoDeclinedCountPref); + switch (promo_action) { + case PromoAction::kRejected: + IncrementPref(kSigninPromoDeclinedCountPref); + return; + case PromoAction::kShown: + return; + case PromoAction::kAccepted: + signin_delegate_->StartSigninFlow(); + return; } - - if (promo_action != PromoAction::kAccepted) { - return; - } - - signin_delegate_->StartSigninFlow(); } void PromoHandler::OnMsbbPromo(PromoAction promo_action) {
diff --git a/chrome/browser/component_updater/updater_state_mac.mm b/chrome/browser/component_updater/updater_state_mac.mm index cbbde041..25debc2 100644 --- a/chrome/browser/component_updater/updater_state_mac.mm +++ b/chrome/browser/component_updater/updater_state_mac.mm
@@ -6,18 +6,14 @@ #import <Foundation/Foundation.h> -#include "base/apple/bridging.h" #include "base/enterprise_util.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/mac/foundation_util.h" +#include "base/mac/scoped_nsobject.h" #include "base/strings/sys_string_conversions.h" #include "base/version.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace component_updater { namespace { @@ -26,18 +22,22 @@ FILE_PATH_LITERAL("Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/" "Contents/Info.plist"); -// Gets a value from the updater settings. +// Gets a value from the updater settings. Returns a retained object. +// T should be a toll-free Foundation framework type. See Apple's +// documentation for toll-free bridging. template <class T> -T* GetUpdaterSettingsValue(NSString* value_name) { - id plist_type = CFBridgingRelease( - CFPreferencesCopyAppValue(base::apple::NSToCFPtrCast(value_name), - CFSTR("com.google.Keystone.Agent"))); - - return base::mac::ObjCCastStrict<T>(plist_type); +base::scoped_nsobject<T> GetUpdaterSettingsValue(NSString* value_name) { + CFStringRef app_id = CFSTR("com.google.Keystone.Agent"); + base::ScopedCFTypeRef<CFPropertyListRef> plist( + CFPreferencesCopyAppValue(base::mac::NSToCFCast(value_name), app_id)); + return base::scoped_nsobject<T>( + base::mac::ObjCCastStrict<T>(static_cast<id>(plist.get())), + base::scoped_policy::RETAIN); } base::Time GetUpdaterSettingsTime(NSString* value_name) { - NSDate* date = GetUpdaterSettingsValue<NSDate>(value_name); + base::scoped_nsobject<NSDate> date = + GetUpdaterSettingsValue<NSDate>(value_name); base::Time result = base::Time::FromCFAbsoluteTime([date timeIntervalSinceReferenceDate]); @@ -61,8 +61,8 @@ return base::Version(); } CFStringRef version = base::mac::GetValueFromDictionary<CFStringRef>( - base::apple::NSToCFPtrCast(all_keys), kCFBundleVersionKey); - if (version == nullptr) { + base::mac::NSToCFCast(all_keys), kCFBundleVersionKey); + if (version == NULL) { return base::Version(); } return base::Version(base::SysCFStringRefToUTF8(version)); @@ -114,8 +114,9 @@ bool UpdaterState::IsAutoupdateCheckEnabled() { // Auto-update check period override (in seconds). // Applies only to older versions of Keystone. - NSNumber* timeInterval = GetUpdaterSettingsValue<NSNumber>(@"checkInterval"); - if (!timeInterval) { + base::scoped_nsobject<NSNumber> timeInterval = + GetUpdaterSettingsValue<NSNumber>(@"checkInterval"); + if (!timeInterval.get()) { return true; } int value = [timeInterval intValue];
diff --git a/chrome/browser/device_reauth/mac/authenticator_mac.mm b/chrome/browser/device_reauth/mac/authenticator_mac.mm index c42c74a8..e1815b8e 100644 --- a/chrome/browser/device_reauth/mac/authenticator_mac.mm +++ b/chrome/browser/device_reauth/mac/authenticator_mac.mm
@@ -7,18 +7,15 @@ #import <LocalAuthentication/LAContext.h> #include "base/functional/callback.h" +#include "base/mac/scoped_nsobject.h" #include "chrome/browser/password_manager/password_manager_util_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - AuthenticatorMac::AuthenticatorMac() = default; AuthenticatorMac::~AuthenticatorMac() = default; bool AuthenticatorMac::CheckIfBiometricsAvailable() { - LAContext* context = [[LAContext alloc] init]; + base::scoped_nsobject<LAContext> context([[LAContext alloc] init]); return [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]; @@ -27,4 +24,4 @@ bool AuthenticatorMac::AuthenticateUserWithNonBiometrics( const std::u16string& message) { return password_manager_util_mac::AuthenticateUser(message); -} +} \ No newline at end of file
diff --git a/chrome/browser/device_reauth/mac/device_authenticator_mac.mm b/chrome/browser/device_reauth/mac/device_authenticator_mac.mm index e9fc8920..f8ae9b4 100644 --- a/chrome/browser/device_reauth/mac/device_authenticator_mac.mm +++ b/chrome/browser/device_reauth/mac/device_authenticator_mac.mm
@@ -19,10 +19,6 @@ #include "device/fido/mac/touch_id_context.h" #include "ui/base/l10n/l10n_util.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - DeviceAuthenticatorMac::DeviceAuthenticatorMac( std::unique_ptr<AuthenticatorMacInterface> authenticator) : authenticator_(std::move(authenticator)) {}
diff --git a/chrome/browser/download/download_item_model_unittest.cc b/chrome/browser/download/download_item_model_unittest.cc index fc4ea9e6..ab79d34 100644 --- a/chrome/browser/download/download_item_model_unittest.cc +++ b/chrome/browser/download/download_item_model_unittest.cc
@@ -749,7 +749,7 @@ .WillByDefault(Return(test_case.danger_type)); DownloadUIModel::BubbleUIInfo bubble_ui_info = model().GetBubbleUIInfo(/*is_download_bubble_v2=*/true); - EXPECT_EQ(bubble_ui_info.has_checkbox, test_case.has_checkbox); + EXPECT_EQ(bubble_ui_info.HasCheckbox(), test_case.has_checkbox); EXPECT_EQ(bubble_ui_info.primary_button_command, test_case.primary_button_command); std::vector<DownloadCommands::Command> subpage_commands; @@ -817,7 +817,7 @@ .WillByDefault(Return(test_case.danger_type)); DownloadUIModel::BubbleUIInfo bubble_ui_info = model().GetBubbleUIInfo(/*is_download_bubble_v2=*/false); - EXPECT_EQ(bubble_ui_info.has_checkbox, test_case.has_checkbox); + EXPECT_EQ(bubble_ui_info.HasCheckbox(), test_case.has_checkbox); EXPECT_EQ(bubble_ui_info.primary_button_command, test_case.primary_button_command); std::vector<DownloadCommands::Command> subpage_commands;
diff --git a/chrome/browser/download/download_status_updater_mac.mm b/chrome/browser/download/download_status_updater_mac.mm index e204fb43..e2d2091 100644 --- a/chrome/browser/download/download_status_updater_mac.mm +++ b/chrome/browser/download/download_status_updater_mac.mm
@@ -15,10 +15,6 @@ #include "components/download/public/common/download_item.h" #import "net/base/mac/url_conversions.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { const char kCrNSProgressUserDataKey[] = "CrNSProgressUserData"; @@ -27,16 +23,16 @@ public: CrNSProgressUserData(NSProgress* progress, const base::FilePath& target) : target_(target) { - progress_ = progress; + progress_.reset(progress, base::scoped_policy::RETAIN); } - ~CrNSProgressUserData() override { [progress_ unpublish]; } + ~CrNSProgressUserData() override { [progress_.get() unpublish]; } - NSProgress* progress() const { return progress_; } + NSProgress* progress() const { return progress_.get(); } base::FilePath target() const { return target_; } void setTarget(const base::FilePath& target) { target_ = target; } private: - NSProgress* __strong progress_; + base::scoped_nsobject<NSProgress> progress_; base::FilePath target_; }; @@ -153,12 +149,12 @@ base::mac::FilePathToNSString(download->GetTargetFilePath()); if (download->GetState() == download::DownloadItem::COMPLETE) { // Bounce the dock icon. - [NSDistributedNotificationCenter.defaultCenter + [[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"com.apple.DownloadFileFinished" object:download_path]; } // Notify the Finder. - [NSWorkspace.sharedWorkspace noteFileSystemChanged:download_path]; + [[NSWorkspace sharedWorkspace] noteFileSystemChanged:download_path]; } }
diff --git a/chrome/browser/download/download_ui_model.cc b/chrome/browser/download/download_ui_model.cc index 2ad1919..e74adb8 100644 --- a/chrome/browser/download/download_ui_model.cc +++ b/chrome/browser/download/download_ui_model.cc
@@ -739,7 +739,7 @@ DownloadUIModel::BubbleUIInfo::BubbleUIInfo(const BubbleUIInfo& rhs) = default; DownloadUIModel::BubbleUIInfo& DownloadUIModel::BubbleUIInfo::AddSubpageSummary( const std::u16string& summary) { - has_subpage = true; + CHECK(!summary.empty()); // An empty summary is interpreted as no subpage warning_summary = summary; return *this; } @@ -766,7 +766,7 @@ } DownloadUIModel::BubbleUIInfo& DownloadUIModel::BubbleUIInfo::AddCheckbox( const std::u16string& label) { - has_checkbox = true; + CHECK(!label.empty()); // An empty summary is interpreted as no checkbox checkbox_label = label; return *this; } @@ -810,6 +810,13 @@ return secondary_text_color.value_or(secondary_color); } +bool DownloadUIModel::BubbleUIInfo::HasSubpage() const { + return !warning_summary.empty(); +} +bool DownloadUIModel::BubbleUIInfo::HasCheckbox() const { + return !checkbox_label.empty(); +} + DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForInterrupted( FailState fail_state) const { // Only handle danger types that are terminated in the interrupted state in
diff --git a/chrome/browser/download/download_ui_model.h b/chrome/browser/download/download_ui_model.h index 9135a15..a72db25 100644 --- a/chrome/browser/download/download_ui_model.h +++ b/chrome/browser/download/download_ui_model.h
@@ -150,11 +150,9 @@ raw_ptr<const gfx::VectorIcon> icon_model_override = nullptr; // Subpage summary of the download warning - bool has_subpage = false; std::u16string warning_summary; // Label for the checkbox, empty if no checkbox is needed - bool has_checkbox = false; std::u16string checkbox_label; // The command for the primary button @@ -189,6 +187,8 @@ const std::u16string& label, const gfx::VectorIcon* icon); ui::ColorId GetColorForSecondaryText() const; + bool HasSubpage() const; + bool HasCheckbox() const; }; #endif
diff --git a/chrome/browser/download/drag_download_item_mac.mm b/chrome/browser/download/drag_download_item_mac.mm index 2d60be06..4a9f2a9 100644 --- a/chrome/browser/download/drag_download_item_mac.mm +++ b/chrome/browser/download/drag_download_item_mac.mm
@@ -11,10 +11,6 @@ #include "ui/gfx/image/image.h" #include "ui/views/widget/widget.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // Cocoa intends a smart dragging source, while `DragDownloadItem()` is a simple // "start dragging this" fire-and-forget. This is a generic source just good // enough to satisfy AppKit. @@ -59,7 +55,7 @@ NSURL* file_url = base::mac::FilePathToNSURL(download->GetTargetFilePath()); NSDraggingItem* file_item = - [[NSDraggingItem alloc] initWithPasteboardWriter:file_url]; + [[[NSDraggingItem alloc] initWithPasteboardWriter:file_url] autorelease]; if (icon) { NSImage* file_image = icon->ToNSImage(); NSSize image_size = file_image.size;
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher_mac.mm b/chrome/browser/enterprise/signals/device_info_fetcher_mac.mm index a04c1f6b0..47c36bd 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher_mac.mm +++ b/chrome/browser/enterprise/signals/device_info_fetcher_mac.mm
@@ -18,10 +18,6 @@ #include "base/system/sys_info.h" #include "net/base/network_interfaces.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace enterprise_signals { namespace {
diff --git a/chrome/browser/extensions/api/identity/web_auth_flow.cc b/chrome/browser/extensions/api/identity/web_auth_flow.cc index 7b1fcca..4052b31 100644 --- a/chrome/browser/extensions/api/identity/web_auth_flow.cc +++ b/chrome/browser/extensions/api/identity/web_auth_flow.cc
@@ -22,8 +22,10 @@ #include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "chrome/common/chrome_features.h" #include "chrome/common/extensions/api/identity_private.h" @@ -292,6 +294,27 @@ return using_auth_with_browser_tab_ && !web_contents_; } +bool WebAuthFlow::DisplayAuthPageInPopupWindow() { + if (Browser::GetCreationStatusForProfile(profile_) != + Browser::CreationStatus::kOk) { + return false; + } + + Browser::CreateParams browser_params(Browser::TYPE_POPUP, profile_, + /*user_gesture=*/true); + browser_params.omit_from_session_restore = true; + browser_params.should_trigger_session_restore = false; + + Browser* browser = Browser::Create(browser_params); + browser->tab_strip_model()->AddWebContents( + std::move(web_contents_), /*index=*/0, + ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, + AddTabTypes::ADD_ACTIVE); + + browser->window()->Show(); + return true; +} + void WebAuthFlow::BeforeUrlLoaded(const GURL& url) { if (delegate_ && IsObservingProviderWebContents()) { delegate_->OnAuthFlowURLChange(url); @@ -326,12 +349,11 @@ break; } case features::WebAuthFlowInBrowserTabMode::kPopupWindow: { - // Displays the auth page in a browser popup window. - NavigateParams params(profile_, GURL(), - ui::PageTransition::PAGE_TRANSITION_FIRST); - params.contents_to_insert = std::move(web_contents_); - params.disposition = WindowOpenDisposition::NEW_POPUP; - Navigate(¶ms); + bool is_auth_page_displayed = DisplayAuthPageInPopupWindow(); + if (!is_auth_page_displayed) { + delegate_->OnAuthFlowFailure(WebAuthFlow::Failure::LOAD_FAILED); + return; + } break; } }
diff --git a/chrome/browser/extensions/api/identity/web_auth_flow.h b/chrome/browser/extensions/api/identity/web_auth_flow.h index 9e98bb2..256e870 100644 --- a/chrome/browser/extensions/api/identity/web_auth_flow.h +++ b/chrome/browser/extensions/api/identity/web_auth_flow.h
@@ -177,6 +177,8 @@ bool IsObservingProviderWebContents() const; + bool DisplayAuthPageInPopupWindow(); + void DisplayInfoBar(); void CloseInfoBar();
diff --git a/chrome/browser/extensions/api/identity/web_auth_flow_browsertest.cc b/chrome/browser/extensions/api/identity/web_auth_flow_browsertest.cc index 55a2394..6819f1d 100644 --- a/chrome/browser/extensions/api/identity/web_auth_flow_browsertest.cc +++ b/chrome/browser/extensions/api/identity/web_auth_flow_browsertest.cc
@@ -12,8 +12,10 @@ #include "base/test/test_mock_time_task_runner.h" #include "base/time/time.h" #include "chrome/browser/extensions/api/identity/web_auth_flow_info_bar_delegate.h" +#include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h" +#include "chrome/browser/sessions/session_restore.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/common/chrome_features.h" @@ -587,7 +589,7 @@ class WebAuthFlowWithBrowserTabBrowserTest : public WebAuthFlowBrowserTest { public: WebAuthFlowWithBrowserTabBrowserTest() { - // By default the feature param is {{"browser_tab_mode", "new_tab"}}. + // By default the feature param is {{"browser_tab_mode", "popup_window"}}. scoped_feature_list_.InitAndEnableFeature( features::kWebAuthFlowInBrowserTab); } @@ -605,7 +607,7 @@ // These two tests are combined into one in order not to re-test the tab // creation twice. IN_PROC_BROWSER_TEST_F(WebAuthFlowWithBrowserTabBrowserTest, - InteractiveNewTabCreatedWithAuthURL_ThenCloseTab) { + InteractivePopupWindowCreatedWithAuthURL_ThenCloseTab) { const GURL auth_url = embedded_test_server()->GetURL("/title1.html"); content::TestNavigationObserver navigation_observer(auth_url); navigation_observer.StartWatchingNewWebContents(); @@ -620,8 +622,9 @@ navigation_observer.Wait(); Browser* popup_browser = chrome::FindBrowserWithWebContents(web_contents()); - TabStripModel* tabs = popup_browser->tab_strip_model(); + EXPECT_EQ(popup_browser->type(), Browser::Type::TYPE_POPUP); EXPECT_NE(browser(), popup_browser); + TabStripModel* tabs = popup_browser->tab_strip_model(); EXPECT_EQ(tabs->GetActiveWebContents()->GetLastCommittedURL(), auth_url); // Check info bar exists and displays proper message with extension name. @@ -643,7 +646,7 @@ IN_PROC_BROWSER_TEST_F( WebAuthFlowWithBrowserTabBrowserTest, - InteractiveNewTabCreatedWithAuthURL_ThenChangeURLBeforeAuthResult) { + InteractivePopupWindowCreatedWithAuthURL_ThenChangeURLBeforeAuthResult) { const GURL auth_url = embedded_test_server()->GetURL("/title1.html"); content::TestNavigationObserver navigation_observer(auth_url); navigation_observer.StartWatchingNewWebContents(); @@ -667,8 +670,9 @@ ASSERT_TRUE(auth_info_bar); Browser* popup_browser = chrome::FindBrowserWithWebContents(web_contents()); - TabStripModel* tabs = popup_browser->tab_strip_model(); + EXPECT_EQ(popup_browser->type(), Browser::Type::TYPE_POPUP); EXPECT_NE(browser(), popup_browser); + TabStripModel* tabs = popup_browser->tab_strip_model(); GURL new_url = embedded_test_server()->GetURL("a.com", "/new.html"); EXPECT_CALL(mock(), @@ -688,8 +692,9 @@ EXPECT_FALSE(auth_info_bar); } -IN_PROC_BROWSER_TEST_F(WebAuthFlowWithBrowserTabBrowserTest, - InteractiveNoBrowser_WebAuthCreatesBrowserWithTab) { +IN_PROC_BROWSER_TEST_F( + WebAuthFlowWithBrowserTabBrowserTest, + InteractiveNoBrowser_WebAuthCreatesBrowserWithPopupWindow) { Profile* profile = browser()->profile(); // Simulates an extension being opened, in order for the profile not to be // added for destruction. @@ -712,6 +717,48 @@ Browser* new_browser = chrome::FindBrowserWithProfile(profile); EXPECT_TRUE(new_browser); + EXPECT_EQ(new_browser->type(), Browser::Type::TYPE_POPUP); + EXPECT_EQ(new_browser->tab_strip_model() + ->GetActiveWebContents() + ->GetLastCommittedURL(), + auth_url); +} + +// This is a regression test for crbug/1445824, makes sure the opened popup +// window does not trigger Session restore. +IN_PROC_BROWSER_TEST_F(WebAuthFlowWithBrowserTabBrowserTest, + InteractiveNoBrowser_NotActivatingSessionRestore) { + Profile* profile = browser()->profile(); + + // Enable SessionRestore to last used pages. + SessionStartupPref startup_pref(SessionStartupPref::LAST); + SessionStartupPref::SetStartupPref(profile, startup_pref); + + // Simulates an extension being opened, with no active browser. + ScopedProfileKeepAlive profile_keep_alive( + profile, ProfileKeepAliveOrigin::kBackgroundMode); + ScopedKeepAlive keep_alive{KeepAliveOrigin::BROWSER, + KeepAliveRestartOption::DISABLED}; + CloseBrowserSynchronously(browser()); + ASSERT_FALSE(chrome::FindBrowserWithProfile(profile)); + + const GURL auth_url = embedded_test_server()->GetURL("/title1.html"); + content::TestNavigationObserver navigation_observer(auth_url); + navigation_observer.StartWatchingNewWebContents(); + + EXPECT_CALL(mock(), OnAuthFlowURLChange(auth_url)); + StartWebAuthFlow(auth_url, WebAuthFlow::Partition::LAUNCH_WEB_AUTH_FLOW, + WebAuthFlow::Mode::INTERACTIVE, profile); + navigation_observer.Wait(); + + // Makes sure only one browser is created and profile is not trying to restore + // previous tabs. + EXPECT_FALSE(SessionRestore::IsRestoring(profile)); + EXPECT_EQ(chrome::FindAllBrowsersWithProfile(profile).size(), 1u); + + Browser* new_browser = chrome::FindBrowserWithProfile(profile); + EXPECT_TRUE(new_browser); + EXPECT_EQ(new_browser->type(), Browser::Type::TYPE_POPUP); EXPECT_EQ(new_browser->tab_strip_model() ->GetActiveWebContents() ->GetLastCommittedURL(), @@ -763,20 +810,7 @@ EXPECT_FALSE(infobar_delegate); } -class WebAuthFlowWithBrowserTabInPopupWindowBrowserTest - : public WebAuthFlowBrowserTest { - public: - WebAuthFlowWithBrowserTabInPopupWindowBrowserTest() { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kWebAuthFlowInBrowserTab, - {{"browser_tab_mode", "popup_window"}}); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(WebAuthFlowWithBrowserTabInPopupWindowBrowserTest, +IN_PROC_BROWSER_TEST_F(WebAuthFlowWithBrowserTabBrowserTest, PopupWindowOpened_ThenCloseWindow) { size_t initial_browser_count = chrome::GetTotalBrowserCount();
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc index 25854509..997ff7c 100644 --- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc +++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -751,50 +751,4 @@ ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionTest("webnavigation/fencedFrames")) << message_; } - -// Tests that the actual url of a fenced frame navaigation is visible to the -// extensions -IN_PROC_BROWSER_TEST_F(WebNavigationApiFencedFrameTest, MappedURL) { - ASSERT_TRUE(StartEmbeddedTestServer()); - - GURL main_url = embedded_test_server()->GetURL( - "a.test", - "/extensions/api_test/webnavigation/fencedFramesMappedURL/main.html"); - content::RenderFrameHost* rfh = - ui_test_utils::NavigateToURL(browser(), main_url); - ASSERT_FALSE(rfh->IsErrorDocument()); - - const char* kScript = R"( - var ff = document.createElement('fencedframe'); - document.body.appendChild(ff); - )"; - EXPECT_TRUE(content::ExecJs(rfh, kScript)); - - ExtensionTestMessageListener background_page_read("ready", - ReplyBehavior::kWillReply); - const Extension* extension = - LoadExtension(test_data_dir_.AppendASCII("webnavigation") - .AppendASCII("fencedFramesMappedURL")); - ASSERT_TRUE(extension); - ASSERT_TRUE(background_page_read.WaitUntilSatisfied()); - background_page_read.Reply("mparch"); - background_page_read.Reset(); - ASSERT_TRUE(background_page_read.WaitUntilSatisfied()); - background_page_read.Reply(""); - - GURL frame_url = embedded_test_server()->GetURL( - "b.test", - "/extensions/api_test/webnavigation/fencedFramesMappedURL/frame.html"); - - GURL urn_uuid = content::test::CreateFencedFrameURLMapping(rfh, frame_url); - - ResultCatcher catcher; - EXPECT_TRUE(content::ExecJs( - rfh, content::JsReplace("ff.config = new FencedFrameConfig($1);", - urn_uuid.spec()))); - ASSERT_TRUE(catcher.GetNextResult()) << message_; - - // The parent still sees the urn_uuid as the fenced frame src. - EXPECT_EQ(urn_uuid.spec(), content::EvalJs(rfh, "ff.config.url")); -} } // namespace extensions
diff --git a/chrome/browser/feed/android/feed_reliability_logging_bridge.cc b/chrome/browser/feed/android/feed_reliability_logging_bridge.cc index 925b8c20..476d37fe 100644 --- a/chrome/browser/feed/android/feed_reliability_logging_bridge.cc +++ b/chrome/browser/feed/android/feed_reliability_logging_bridge.cc
@@ -216,11 +216,6 @@ base::android::AttachCurrentThread(), java_ref_); } -void FeedReliabilityLoggingBridge::LogLoadMoreIndicatorShown() { - Java_FeedReliabilityLoggingBridge_logLoadMoreIndicatorShown( - base::android::AttachCurrentThread(), java_ref_); -} - void FeedReliabilityLoggingBridge::LogLoadMoreActionUploadRequestStarted() { Java_FeedReliabilityLoggingBridge_logLoadMoreActionUploadRequestStarted( base::android::AttachCurrentThread(), java_ref_);
diff --git a/chrome/browser/feed/android/feed_reliability_logging_bridge.h b/chrome/browser/feed/android/feed_reliability_logging_bridge.h index 85d65f7..a5f9ee2 100644 --- a/chrome/browser/feed/android/feed_reliability_logging_bridge.h +++ b/chrome/browser/feed/android/feed_reliability_logging_bridge.h
@@ -56,7 +56,6 @@ void LogLaunchFinishedAfterStreamUpdate( feedwire::DiscoverLaunchResult result) override; void LogLoadMoreStarted() override; - void LogLoadMoreIndicatorShown() override; void LogLoadMoreActionUploadRequestStarted() override; void LogLoadMoreRequestSent() override; void LogLoadMoreResponseReceived(int64_t server_receive_timestamp_ns,
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLogger.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLogger.java index 4fb881e0..aec9055 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLogger.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLogger.java
@@ -128,6 +128,13 @@ } } + /** Call this when the loading indicator for load-more is shown. */ + public void onPaginationIndicatorShown() { + if (mUserInteractionLogger != null) { + mUserInteractionLogger.onPaginationIndicatorShown(); + } + } + // UrlFocusChangeListener @Override
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java index 425ba2a7..6bacff8 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java
@@ -152,13 +152,6 @@ } @CalledByNative - public void logLoadMoreIndicatorShown() { - if (mUserInteractionLogger != null) { - mUserInteractionLogger.onPaginationIndicatorShown(); - } - } - - @CalledByNative public void logLoadMoreActionUploadRequestStarted() { if (mUserInteractionLogger != null) { mUserInteractionLogger.onPaginationActionUploadRequestStarted();
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java index 676e540..b91c934 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java
@@ -45,8 +45,9 @@ } private final Activity mActivity; - // Whether to watch a slice view to get notified for barely visible change. - private final boolean mWatchForBarelyVisibleChange; + // Whether to watch a slice view to get notified for user-interaction reliability related + // UI changes. + private final boolean mWatchForUserInteractionReliabilityReport; @Nullable private RecyclerView mRootView; @Nullable @@ -58,6 +59,8 @@ // The set of content keys already reported as barely visible (5% threshold), which is used to // determine if a slice has entered the view port. private HashSet<String> mContentKeysBarelyVisible = new HashSet<>(); + // The set of content keys for load-more indicators already reported as visible (5% threshold). + private HashSet<String> mLoadMoreIndicatorContentKeys = new HashSet<>(); private boolean mFeedContentVisible; @Nullable private Observer mObserver; @@ -85,16 +88,18 @@ void reportViewFirstBarelyVisible(View view); // Called the first time a slice view is rendered. void reportViewFirstRendered(View view); + // Called the first time a loading indicator for load-more is 5% visible. + void reportLoadMoreIndicatorVisible(); } public FeedSliceViewTracker(@NonNull RecyclerView rootView, @NonNull Activity activity, @NonNull FeedListContentManager contentManager, @Nullable ListLayoutHelper layoutHelper, - boolean watchForBarelyVisibleChange, @NonNull Observer observer) { + boolean watchForUserInteractionReliabilityReport, @NonNull Observer observer) { mActivity = activity; mRootView = rootView; mContentManager = contentManager; mLayoutHelper = layoutHelper; - mWatchForBarelyVisibleChange = watchForBarelyVisibleChange; + mWatchForUserInteractionReliabilityReport = watchForUserInteractionReliabilityReport; mObserver = observer; } @@ -189,11 +194,21 @@ for (int i = firstPosition; i <= lastPosition && i < mContentManager.getItemCount() && i >= 0; ++i) { String contentKey = mContentManager.getContent(i).getKey(); - // Feed content slices come with a 'c/' prefix. Ignore everything else. - if (!contentKey.startsWith("c/")) continue; View childView = mRootView.getLayoutManager().findViewByPosition(i); if (childView == null) continue; + // Loading spinner slices come with a fixed prefix and a different ID after it. + if (mWatchForUserInteractionReliabilityReport + && contentKey.startsWith("load-more-spinner") + && !mLoadMoreIndicatorContentKeys.contains(contentKey) + && isViewVisible(childView, VISIBLE_CHANGE_LOG_THRESHOLD)) { + mLoadMoreIndicatorContentKeys.add(contentKey); + mObserver.reportLoadMoreIndicatorVisible(); + } + + // Feed content slices come with a 'c/' prefix. Ignore everything else. + if (!contentKey.startsWith("c/")) continue; + if (!mFeedContentVisible) { mFeedContentVisible = true; mObserver.feedContentVisible(); @@ -234,7 +249,8 @@ mObserver.sliceVisible(contentKey); } - if (mWatchForBarelyVisibleChange && !mContentKeysBarelyVisible.contains(contentKey) + if (mWatchForUserInteractionReliabilityReport + && !mContentKeysBarelyVisible.contains(contentKey) && isViewVisible(childView, VISIBLE_CHANGE_LOG_THRESHOLD)) { mObserver.reportViewFirstBarelyVisible(childView); // There is not a system way to measure the render latency. Here we mimic how
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTrackerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTrackerTest.java index 91ea3887..3ad92a56 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTrackerTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTrackerTest.java
@@ -98,7 +98,7 @@ doReturn(mWindow).when(mActivity).getWindow(); doReturn(mDecorView).when(mWindow).getDecorView(); mTracker = Mockito.spy(new FeedSliceViewTracker(mParentView, mActivity, mContentManager, - mLayoutHelper, /* watchForBarelyVisibleChange= */ true, mObserver)); + mLayoutHelper, /* mWatchForUserInteractionReliabilityReport= */ true, mObserver)); } @After @@ -538,6 +538,46 @@ verify(mObserver, times(1)).reportViewFirstRendered(any()); } + @Test + @SmallTest + public void testReportLoadMoreIndicatorVisible() { + mContentManager.addContents(0, + Arrays.asList(new FeedListContentManager.FeedContent[] { + new FeedListContentManager.NativeViewContent( + 0, "load-more-spinner1", mChildA), + new FeedListContentManager.NativeViewContent( + 1, "load-more-spinner2", mChildB), + })); + doReturn(0).when(mLayoutHelper).findFirstVisibleItemPosition(); + doReturn(1).when(mLayoutHelper).findLastVisibleItemPosition(); + doReturn(mChildA).when(mLayoutManager).findViewByPosition(eq(0)); + doReturn(mChildB).when(mLayoutManager).findViewByPosition(eq(1)); + + mockViewportRect(0, 0, 500, 500); + mockViewDimensions(mChildA, 100, 100); + mockViewDimensions(mChildB, 100, 100); + + // No report when less than 5% visible. + mockGetChildVisibleRect(mChildA, 0, 0, 100, 4); + mTracker.onPreDraw(); + verify(mObserver, times(0)).reportLoadMoreIndicatorVisible(); + + // Report when 5% visible. + mockGetChildVisibleRect(mChildA, 0, 0, 100, 5); + mTracker.onPreDraw(); + verify(mObserver, times(1)).reportLoadMoreIndicatorVisible(); + + // No more report when more visible. + mockGetChildVisibleRect(mChildA, 0, 0, 100, 10); + mTracker.onPreDraw(); + verify(mObserver, times(1)).reportLoadMoreIndicatorVisible(); + + // Report for another indicator. + mockGetChildVisibleRect(mChildB, 0, 0, 100, 5); + mTracker.onPreDraw(); + verify(mObserver, times(2)).reportLoadMoreIndicatorVisible(); + } + void mockViewDimensions(View view, int width, int height) { when(view.getWidth()).thenReturn(width); when(view.getHeight()).thenReturn(height);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java index 82c48c18..dc25dc53 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
@@ -779,7 +779,7 @@ mScrollStateToRestore = savedInstanceState; manager.setHandlers(mHandlersMap); mSliceViewTracker = new FeedSliceViewTracker(rootView, mActivity, manager, - renderer.getListLayoutHelper(), /* watchForBarelyVisibleChange= */ + renderer.getListLayoutHelper(), /* watchForUserInteractionReliabilityReport= */ (mReliabilityLogger != null && mReliabilityLogger.getUserInteractionLogger() != null), new FeedStream.ViewTrackerObserver()); @@ -1360,6 +1360,12 @@ mReliabilityLogger.onViewFirstRendered(view); } } + @Override + public void reportLoadMoreIndicatorVisible() { + if (mReliabilityLogger != null) { + mReliabilityLogger.onPaginationIndicatorShown(); + } + } } /**
diff --git a/chrome/browser/file_select_helper_mac.mm b/chrome/browser/file_select_helper_mac.mm index 800875c..6192599f 100644 --- a/chrome/browser/file_select_helper_mac.mm +++ b/chrome/browser/file_select_helper_mac.mm
@@ -17,10 +17,6 @@ #include "third_party/zlib/google/zip.h" #include "ui/shell_dialogs/selected_file_info.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { base::StringPiece AsStringPiece(NSString* str) {
diff --git a/chrome/browser/first_run/first_run_internal_mac.mm b/chrome/browser/first_run/first_run_internal_mac.mm index fe8cf46..2479263 100644 --- a/chrome/browser/first_run/first_run_internal_mac.mm +++ b/chrome/browser/first_run/first_run_internal_mac.mm
@@ -6,14 +6,12 @@ #include "chrome/browser/mac/initial_prefs.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace first_run::internal { +namespace first_run { +namespace internal { base::FilePath InitialPrefsPath() { return initial_prefs::InitialPrefsPath(); } -} // namespace first_run::internal +} // namespace internal +} // namespace first_run
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 0e218df..a2c2ab0a 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -5276,12 +5276,7 @@ { "name": "ntp-comprehensive-theme-realbox", "owners": [ "romanarora", "tiborg", "tluk" ], - "expiry_milestone": 116 - }, - { - "name": "ntp-comprehensive-theming", - "owners": [ "romanarora", "tiborg", "tluk" ], - "expiry_milestone": 116 + "expiry_milestone": 118 }, { "name": "ntp-desktop-lens",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 7d91aca..2c0169495 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4559,10 +4559,6 @@ const char kNtpComprehensiveThemeRealboxDescription[] = "Applies theme based colors to the NTP Realbox element"; -const char kNtpComprehensiveThemingName[] = "NTP Comprehensive Theming"; -const char kNtpComprehensiveThemingDescription[] = - "Applies theme based colors across various NTP elements"; - const char kNtpDesktopLensName[] = "NTP Desktop Lens Entrypoint"; const char kNtpDesktopLensDescription[] = "Shows a Lens entrypoint and upload dialog in desktop NTP when enabled.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 001810a..978092c 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2605,9 +2605,6 @@ extern const char kNtpComprehensiveThemeRealboxName[]; extern const char kNtpComprehensiveThemeRealboxDescription[]; -extern const char kNtpComprehensiveThemingName[]; -extern const char kNtpComprehensiveThemingDescription[]; - extern const char kNtpDesktopLensName[]; extern const char kNtpDesktopLensDescription[];
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 28ea868..5734f1c5 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -529,6 +529,7 @@ new CachedFlag(DELAY_TEMP_STRIP_REMOVAL, true); public static final CachedFlag sDiscoverMultiColumn = new CachedFlag(FEED_MULTI_COLUMN, true); public static final CachedFlag sEarlyLibraryLoad = new CachedFlag(EARLY_LIBRARY_LOAD, true); + public static final CachedFlag sEmptyStates = new CachedFlag(EMPTY_STATES, true); public static final CachedFlag sExperimentsForAgsa = new CachedFlag(EXPERIMENTS_FOR_AGSA, true); public static final CachedFlag sFeedLoadingPlaceholder = new CachedFlag(FEED_LOADING_PLACEHOLDER, false); @@ -627,6 +628,7 @@ sDelayTempStripRemoval, sDiscoverMultiColumn, sEarlyLibraryLoad, + sEmptyStates, sFeedLoadingPlaceholder, sFoldableJankFix, sHideNonDisplayableAccountEmail,
diff --git a/chrome/browser/fullscreen_mac.mm b/chrome/browser/fullscreen_mac.mm index d57d4c7f..cc0b862 100644 --- a/chrome/browser/fullscreen_mac.mm +++ b/chrome/browser/fullscreen_mac.mm
@@ -8,13 +8,9 @@ #include "base/command_line.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - bool IsFullScreenMode() { NSApplicationPresentationOptions options = - NSApp.currentSystemPresentationOptions; + [NSApp currentSystemPresentationOptions]; bool dock_hidden = (options & NSApplicationPresentationHideDock) || (options & NSApplicationPresentationAutoHideDock);
diff --git a/chrome/browser/global_keyboard_shortcuts_mac.mm b/chrome/browser/global_keyboard_shortcuts_mac.mm index 268856f..6c62ab97 100644 --- a/chrome/browser/global_keyboard_shortcuts_mac.mm +++ b/chrome/browser/global_keyboard_shortcuts_mac.mm
@@ -24,10 +24,6 @@ #include "ui/events/event_constants.h" #include "ui/events/keycodes/keyboard_code_conversion_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // Returns a ui::Accelerator given a KeyboardShortcutData.
diff --git a/chrome/browser/icon_loader_mac.mm b/chrome/browser/icon_loader_mac.mm index f6acf136..ec9c7f75 100644 --- a/chrome/browser/icon_loader_mac.mm +++ b/chrome/browser/icon_loader_mac.mm
@@ -18,10 +18,6 @@ #include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia_util_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - // static IconLoader::IconGroup IconLoader::GroupForFilepath( const base::FilePath& file_path) {
diff --git a/chrome/browser/lifetime/application_lifetime_mac.mm b/chrome/browser/lifetime/application_lifetime_mac.mm index 32838ac..8548934 100644 --- a/chrome/browser/lifetime/application_lifetime_mac.mm +++ b/chrome/browser/lifetime/application_lifetime_mac.mm
@@ -13,10 +13,6 @@ #include "chrome/browser/lifetime/browser_shutdown.h" #include "ui/views/widget/widget.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace chrome { // At this point, the user is trying to quit (or the system is forcing the
diff --git a/chrome/browser/local_discovery/service_discovery_client_mac.h b/chrome/browser/local_discovery/service_discovery_client_mac.h index fccf17f..613bae8e 100644 --- a/chrome/browser/local_discovery/service_discovery_client_mac.h +++ b/chrome/browser/local_discovery/service_discovery_client_mac.h
@@ -6,18 +6,14 @@ #define CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MAC_H_ #import <Foundation/Foundation.h> - #include <memory> #include <string> +#include "base/mac/scoped_nsobject.h" #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "chrome/browser/local_discovery/service_discovery_shared_client.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace base { class Thread; } @@ -90,7 +86,7 @@ // |browser_| lives on the |service_discovery_runner_|, though it is // initialized on the object creator's sequence. It is released by move()ing // it to StopServiceBrowser(). - NetServiceBrowser* __strong browser_; + base::scoped_nsobject<NetServiceBrowser> browser_; base::WeakPtrFactory<ServiceWatcherImplMac> weak_factory_{this}; }; @@ -125,7 +121,7 @@ // |resolver_| lives on the |service_discovery_runner_|, though it is // initialized on the object creator's sequence. It is released by move()ing // it to StopServiceResolver(). - NetServiceResolver* __strong resolver_; + base::scoped_nsobject<NetServiceResolver> resolver_; base::WeakPtrFactory<ServiceResolverImplMac> weak_factory_{this}; };
diff --git a/chrome/browser/local_discovery/service_discovery_client_mac.mm b/chrome/browser/local_discovery/service_discovery_client_mac.mm index 7c9b737d..c360135 100644 --- a/chrome/browser/local_discovery/service_discovery_client_mac.mm +++ b/chrome/browser/local_discovery/service_discovery_client_mac.mm
@@ -22,10 +22,6 @@ #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - using local_discovery::ServiceWatcher; using local_discovery::ServiceResolver; using local_discovery::ServiceDescription; @@ -81,19 +77,19 @@ // counted, the strong references passed to these functions ensure the object // remains alive until for the duration of the operation. -void StartServiceBrowser(NetServiceBrowser* browser) { +void StartServiceBrowser(base::scoped_nsobject<NetServiceBrowser> browser) { [browser discoverServices]; } -void StopServiceBrowser(NetServiceBrowser* browser) { +void StopServiceBrowser(base::scoped_nsobject<NetServiceBrowser> browser) { [browser stop]; } -void StartServiceResolver(NetServiceResolver* resolver) { +void StartServiceResolver(base::scoped_nsobject<NetServiceResolver> resolver) { [resolver resolveService]; } -void StopServiceResolver(NetServiceResolver* resolver) { +void StopServiceResolver(base::scoped_nsobject<NetServiceResolver> resolver) { [resolver stop]; } @@ -105,9 +101,9 @@ // <name>._<type>._<sub>._<protocol2>._<protocol1>.<domain>. bool ExtractServiceInfo(const std::string& service, bool is_service_name, - NSString** instance, - NSString** type, - NSString** domain) { + base::scoped_nsobject<NSString>* instance, + base::scoped_nsobject<NSString>* type, + base::scoped_nsobject<NSString>* domain) { if (service.empty()) return false; @@ -116,22 +112,26 @@ return false; if (!is_service_name) { - *type = base::SysUTF8ToNSString(service.substr(0, last_period) + "."); + type->reset(base::SysUTF8ToNSString(service.substr(0, last_period) + "."), + base::scoped_policy::RETAIN); } else { // Find third last period that delimits type and instance name. size_t type_period = last_period; for (int i = 0; i < 2; ++i) { type_period = service.find_last_of('.', type_period - 1); - if (type_period == std::string::npos) { + if (type_period == std::string::npos) return false; - } } - *instance = base::SysUTF8ToNSString(service.substr(0, type_period)); - *type = base::SysUTF8ToNSString( - service.substr(type_period + 1, last_period - type_period)); + instance->reset(base::SysUTF8ToNSString(service.substr(0, type_period)), + base::scoped_policy::RETAIN); + type->reset( + base::SysUTF8ToNSString( + service.substr(type_period + 1, last_period - type_period)), + base::scoped_policy::RETAIN); } - *domain = base::SysUTF8ToNSString(service.substr(last_period + 1) + "."); + domain->reset(base::SysUTF8ToNSString(service.substr(last_period + 1) + "."), + base::scoped_policy::RETAIN); return [*domain length] > 0 && [*type length] > 0 && @@ -139,24 +139,23 @@ } void ParseTxtRecord(NSData* record, std::vector<std::string>* output) { - if (record.length <= 1) { + if ([record length] <= 1) return; - } - VLOG(1) << "ParseTxtRecord: " << record.length; + VLOG(1) << "ParseTxtRecord: " << [record length]; - const uint8_t* bytes = reinterpret_cast<const uint8_t*>(record.bytes); - size_t size = record.length; + const uint8_t* bytes = reinterpret_cast<const uint8_t*>([record bytes]); + size_t size = [record length]; size_t offset = 0; while (offset < size) { uint8_t record_size = bytes[offset++]; if (offset > size - record_size) break; - NSString* txt_record = + base::scoped_nsobject<NSString> txt_record( [[NSString alloc] initWithBytes:&bytes[offset] length:record_size - encoding:NSUTF8StringEncoding]; + encoding:NSUTF8StringEncoding]); if (txt_record) { std::string txt_record_string = base::SysNSStringToUTF8(txt_record); VLOG(1) << "TxtRecord: " << txt_record_string; @@ -234,20 +233,24 @@ DCHECK(!started_); VLOG(1) << "ServiceWatcherImplMac::Start"; - browser_ = [[NetServiceBrowser alloc] + browser_.reset([[NetServiceBrowser alloc] initWithServiceType:service_type_ callback:base::BindRepeating( &ServiceWatcherImplMac::OnServicesUpdate, weak_factory_.GetWeakPtr()) - callbackRunner:base::SingleThreadTaskRunner::GetCurrentDefault()]; + callbackRunner:base::SingleThreadTaskRunner::GetCurrentDefault()]); started_ = true; } void ServiceWatcherImplMac::DiscoverNewServices() { DCHECK(started_); VLOG(1) << "ServiceWatcherImplMac::DiscoverNewServices"; + // Provide an additional reference on the browser_, in case |this| + // gets deleted and releases its reference. service_discovery_runner_->PostTask( - FROM_HERE, base::BindOnce(&StartServiceBrowser, browser_)); + FROM_HERE, base::BindOnce(&StartServiceBrowser, + base::scoped_nsobject<NetServiceBrowser>( + [browser_ retain]))); } void ServiceWatcherImplMac::SetActivelyRefreshServices( @@ -283,14 +286,18 @@ void ServiceResolverImplMac::StartResolving() { VLOG(1) << "Resolving service " << service_name_; - resolver_ = [[NetServiceResolver alloc] + resolver_.reset([[NetServiceResolver alloc] initWithServiceName:service_name_ resolvedCallback:base::BindOnce( &ServiceResolverImplMac::OnResolveComplete, weak_factory_.GetWeakPtr()) - callbackRunner:base::SingleThreadTaskRunner::GetCurrentDefault()]; + callbackRunner:base::SingleThreadTaskRunner::GetCurrentDefault()]); + // Provide an additional reference on the resolver_, in case |this| + // gets deleted and releases its reference. service_discovery_runner_->PostTask( - FROM_HERE, base::BindOnce(&StartServiceResolver, resolver_)); + FROM_HERE, base::BindOnce(&StartServiceResolver, + base::scoped_nsobject<NetServiceResolver>( + [resolver_ retain]))); } std::string ServiceResolverImplMac::GetName() const { @@ -343,8 +350,8 @@ ServiceWatcher::UpdatedCallback _callback; scoped_refptr<base::SingleThreadTaskRunner> _callbackRunner; - NSNetServiceBrowser* __strong _browser; - NSMutableArray<NSNetService*>* __strong _services; + base::scoped_nsobject<NSNetServiceBrowser> _browser; + base::scoped_nsobject<NSMutableArray<NSNetService*>> _services; } - (instancetype)initWithServiceType:(const std::string&)serviceType @@ -358,24 +365,23 @@ _callback = std::move(callback); _callbackRunner = callbackRunner; - _services = [[NSMutableArray alloc] initWithCapacity:1]; + _services.reset([[NSMutableArray alloc] initWithCapacity:1]); } return self; } - (void)dealloc { [self stop]; + [super dealloc]; } - (void)discoverServices { if (!_browser) { - _browser = [[NSNetServiceBrowser alloc] init]; + _browser.reset([[NSNetServiceBrowser alloc] init]); [_browser setDelegate:self]; } - NSString* instance; - NSString* type; - NSString* domain; + base::scoped_nsobject<NSString> instance, type, domain; if (!local_discovery::ExtractServiceInfo(_serviceType, false, &instance, &type, &domain)) { return; @@ -396,17 +402,17 @@ // attempts to clear the pointer to itself in an NSNetServiceBrowser that's // already gone. // https://crbug.com/657495, https://openradar.appspot.com/28943305 - _browser.delegate = nil; + [_browser setDelegate:nil]; // Ensure the delegate clears all references to itself, which it had added as // discovered services were reported to it. - for (NSNetService* netService in _services) { + for (NSNetService* netService in _services.get()) { [netService stopMonitoring]; [netService setDelegate:nil]; } [_services removeAllObjects]; - _browser = nil; + _browser.reset(); } - (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser @@ -462,7 +468,7 @@ scoped_refptr<base::SingleThreadTaskRunner> _callbackRunner; ServiceDescription _serviceDescription; - NSNetService* __strong _service; + base::scoped_nsobject<NSNetService> _service; } - (instancetype) @@ -480,12 +486,11 @@ - (void)dealloc { [self stop]; + [super dealloc]; } - (void)resolveService { - NSString* instance; - NSString* type; - NSString* domain; + base::scoped_nsobject<NSString> instance, type, domain; if (!local_discovery::ExtractServiceInfo(_serviceName, true, &instance, &type, &domain)) { [self updateServiceDescription:ServiceResolver::STATUS_KNOWN_NONEXISTENT]; @@ -496,9 +501,9 @@ << ", instance: " << instance << ", type: " << type << ", domain: " << domain; - _service = [[NSNetService alloc] initWithDomain:domain - type:type - name:instance]; + _service.reset([[NSNetService alloc] initWithDomain:domain + type:type + name:instance]); [_service setDelegate:self]; [_service resolveWithTimeout:local_discovery::kResolveTimeout]; } @@ -511,8 +516,8 @@ // attempts to clear the pointer to itself in an NSNetService that's already // gone. // https://crbug.com/657495, https://openradar.appspot.com/28943305 - _service.delegate = nil; - _service = nil; + [_service setDelegate:nil]; + _service.reset(); } - (void)netServiceDidResolveAddress:(NSNetService*)sender { @@ -536,7 +541,7 @@ } _serviceDescription.service_name = _serviceName; - ParseNetService(_service, _serviceDescription); + ParseNetService(_service.get(), _serviceDescription); if (_serviceDescription.address.host().empty()) { VLOG(1) << "Service IP is not resolved: " << _serviceName;
diff --git a/chrome/browser/local_discovery/service_discovery_client_mac_factory.mm b/chrome/browser/local_discovery/service_discovery_client_mac_factory.mm index 00c6f3c6..ff89251f 100644 --- a/chrome/browser/local_discovery/service_discovery_client_mac_factory.mm +++ b/chrome/browser/local_discovery/service_discovery_client_mac_factory.mm
@@ -6,10 +6,6 @@ #include "chrome/browser/local_discovery/service_discovery_client_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace local_discovery { // static
diff --git a/chrome/browser/local_discovery/service_discovery_client_mac_unittest.mm b/chrome/browser/local_discovery/service_discovery_client_mac_unittest.mm index 430634b..2e938db 100644 --- a/chrome/browser/local_discovery/service_discovery_client_mac_unittest.mm +++ b/chrome/browser/local_discovery/service_discovery_client_mac_unittest.mm
@@ -8,6 +8,7 @@ #include "base/containers/contains.h" #include "base/functional/bind.h" #include "base/functional/callback.h" +#include "base/mac/scoped_nsobject.h" #include "base/run_loop.h" #include "base/threading/thread.h" #include "chrome/browser/local_discovery/service_discovery_client.h" @@ -18,14 +19,10 @@ #include "net/base/sockaddr_storage.h" #include "testing/gtest_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @interface TestNSNetService : NSNetService { @private - NSData* __strong _data; - NSArray* __strong _addresses; + base::scoped_nsobject<NSData> _data; + base::scoped_nsobject<NSArray> _addresses; } - (instancetype)initWithData:(NSData*)data; - (void)setAddresses:(NSArray*)addresses; @@ -35,13 +32,13 @@ - (instancetype)initWithData:(NSData*)data { if ((self = [super initWithDomain:@"" type:@"_tcp." name:@"Test.123"])) { - _data = data; + _data.reset([data retain]); } return self; } - (void)setAddresses:(NSArray*)addresses { - _addresses = [addresses copy]; + _addresses.reset([addresses copy]); } - (NSArray*)addresses { @@ -147,9 +144,9 @@ TEST_F(ServiceDiscoveryClientMacTest, ParseServiceRecord) { const uint8_t record_bytes[] = {2, 'a', 'b', 3, 'd', '=', 'e'}; - TestNSNetService* test_service = [[TestNSNetService alloc] + base::scoped_nsobject<TestNSNetService> test_service([[TestNSNetService alloc] initWithData:[NSData dataWithBytes:record_bytes - length:std::size(record_bytes)]]; + length:std::size(record_bytes)]]); const std::string kIp = "2001:4860:4860::8844"; const uint16_t kPort = 4321; @@ -164,7 +161,7 @@ [test_service setAddresses:addresses]; ServiceDescription description; - ParseNetService(test_service, description); + ParseNetService(test_service.get(), description); const std::vector<std::string>& metadata = description.metadata; EXPECT_EQ(2u, metadata.size());
diff --git a/chrome/browser/mac/auth_session_request.h b/chrome/browser/mac/auth_session_request.h index 698f0b4..8294a91 100644 --- a/chrome/browser/mac/auth_session_request.h +++ b/chrome/browser/mac/auth_session_request.h
@@ -17,9 +17,7 @@ #if defined(__OBJC__) -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif +#import "base/mac/scoped_nsobject.h" @class ASWebAuthenticationSessionRequest; @@ -89,7 +87,7 @@ raw_ptr<Browser> browser_ = nullptr; // The request being serviced. - ASWebAuthenticationSessionRequest* __strong request_; + base::scoped_nsobject<ASWebAuthenticationSessionRequest> request_; // The scheme being watched for, canonicalized. std::string scheme_;
diff --git a/chrome/browser/mac/auth_session_request.mm b/chrome/browser/mac/auth_session_request.mm index 814f1316..c1d8c450 100644 --- a/chrome/browser/mac/auth_session_request.mm +++ b/chrome/browser/mac/auth_session_request.mm
@@ -26,10 +26,6 @@ #include "net/base/mac/url_conversions.h" #include "url/url_canon.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // A navigation throttle that calls a closure when a navigation to a specified @@ -91,7 +87,7 @@ } // namespace AuthSessionRequest::~AuthSessionRequest() { - std::string uuid = base::SysNSStringToUTF8(request_.UUID.UUIDString); + std::string uuid = base::SysNSStringToUTF8(request_.get().UUID.UUIDString); auto iter = GetMap().find(uuid); if (iter == GetMap().end()) @@ -215,7 +211,7 @@ : content::WebContentsObserver(web_contents), content::WebContentsUserData<AuthSessionRequest>(*web_contents), browser_(browser), - request_(request), + request_(request, base::scoped_policy::RETAIN), scheme_(scheme) { std::string uuid = base::SysNSStringToUTF8(request.UUID.UUIDString); GetMap()[uuid] = this;
diff --git a/chrome/browser/mac/auth_session_request_unittest.mm b/chrome/browser/mac/auth_session_request_unittest.mm index 6de4efb..424b3d70 100644 --- a/chrome/browser/mac/auth_session_request_unittest.mm +++ b/chrome/browser/mac/auth_session_request_unittest.mm
@@ -6,10 +6,6 @@ #include "testing/gtest/include/gtest/gtest.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - TEST(AuthSessionRequestTest, SchemeCanonicalization) { if (@available(macOS 10.15, *)) { EXPECT_EQ("abcdefg", AuthSessionRequest::CanonicalizeScheme("abcdefg"));
diff --git a/chrome/browser/mac/bluetooth_utility.mm b/chrome/browser/mac/bluetooth_utility.mm index ee56a06..5cfc2c7 100644 --- a/chrome/browser/mac/bluetooth_utility.mm +++ b/chrome/browser/mac/bluetooth_utility.mm
@@ -8,15 +8,10 @@ #import <IOBluetooth/IOBluetooth.h> #include <IOKit/IOKitLib.h> -#include "base/apple/bridging.h" #include "base/mac/foundation_util.h" #include "base/mac/mac_util.h" #include "base/mac/scoped_ioobject.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace bluetooth_utility { BluetoothAvailability GetBluetoothAvailability() { @@ -38,13 +33,14 @@ while (device.reset(IOIteratorNext(scoped_iter.get())), device) { bluetooth_available = true; - base::ScopedCFTypeRef<CFMutableDictionaryRef> dict; - kr = IORegistryEntryCreateCFProperties(device, dict.InitializeInto(), - kCFAllocatorDefault, kNilOptions); + CFMutableDictionaryRef dict; + kr = IORegistryEntryCreateCFProperties( + device, &dict, kCFAllocatorDefault, kNilOptions); if (kr != KERN_SUCCESS) continue; + base::ScopedCFTypeRef<CFMutableDictionaryRef> scoped_dict(dict); - NSDictionary* objc_dict = base::apple::CFToNSPtrCast(dict.get()); + NSDictionary* objc_dict = base::mac::CFToNSCast(scoped_dict.get()); NSNumber* lmp_version = base::mac::ObjCCast<NSNumber>(objc_dict[@"LMPVersion"]); if (!lmp_version)
diff --git a/chrome/browser/mac/chrome_browser_main_extra_parts_mac.mm b/chrome/browser/mac/chrome_browser_main_extra_parts_mac.mm index 95e64392b..6bb5ccb 100644 --- a/chrome/browser/mac/chrome_browser_main_extra_parts_mac.mm +++ b/chrome/browser/mac/chrome_browser_main_extra_parts_mac.mm
@@ -6,10 +6,6 @@ #include "ui/display/screen.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - ChromeBrowserMainExtraPartsMac::ChromeBrowserMainExtraPartsMac() = default; ChromeBrowserMainExtraPartsMac::~ChromeBrowserMainExtraPartsMac() = default;
diff --git a/chrome/browser/mac/dock.mm b/chrome/browser/mac/dock.mm index 74e06d8..c35de6b 100644 --- a/chrome/browser/mac/dock.mm +++ b/chrome/browser/mac/dock.mm
@@ -11,7 +11,6 @@ #include <tuple> -#include "base/apple/bridging.h" #include "base/apple/bundle_locations.h" #include "base/logging.h" #include "base/mac/foundation_util.h" @@ -19,10 +18,6 @@ #include "base/mac/scoped_cftyperef.h" #include "build/branding_buildflags.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - extern "C" { // Undocumented private internal CFURL functions. The Dock uses these to @@ -55,14 +50,19 @@ // Foundation data types and returns an autoreleased NSDictionary. NSDictionary* DockFileDataDictionaryForURL(NSURL* url) { base::ScopedCFTypeRef<CFPropertyListRef> property_list( - _CFURLCopyPropertyListRepresentation(base::apple::NSToCFPtrCast(url))); + _CFURLCopyPropertyListRepresentation(base::mac::NSToCFCast(url))); CFDictionaryRef dictionary = base::mac::CFCast<CFDictionaryRef>(property_list); if (!dictionary) return nil; - return base::apple::CFToNSOwnershipCast( - (CFDictionaryRef)property_list.release()); + // It would be desirable to pipe the released object from the ScopedCFTypeRef + // directly into autorelease, as URLFromDockFileDataDictionary does below. + // However, this can't be done because CFPropertyListRef isn't bridgeable. + // Therefore, separate the release of the ownership of the ScopedCFTypeRef + // and the autorelease on the next line. + std::ignore = property_list.release(); + return [base::mac::CFToNSCast(dictionary) autorelease]; } // A wrapper around _CFURLCreateFromPropertyListRepresentation that operates @@ -70,11 +70,11 @@ NSURL* URLFromDockFileDataDictionary(NSDictionary* dictionary) { base::ScopedCFTypeRef<CFURLRef> url( _CFURLCreateFromPropertyListRepresentation( - kCFAllocatorDefault, base::apple::NSToCFPtrCast(dictionary))); + kCFAllocatorDefault, base::mac::NSToCFCast(dictionary))); if (!url) return nil; - return base::apple::CFToNSOwnershipCast(url.release()); + return [base::mac::CFToNSCast(url.release()) autorelease]; } // Returns an array parallel to |persistent_apps| containing only the
diff --git a/chrome/browser/mac/exception_processor.h b/chrome/browser/mac/exception_processor.h index fa7366a3..3abf195e 100644 --- a/chrome/browser/mac/exception_processor.h +++ b/chrome/browser/mac/exception_processor.h
@@ -29,7 +29,7 @@ // specifically, or |kUnknownNSException| if unknown. size_t BinForException(NSException* exception); -// Use UMA to track exception occurrence. +// Use UMA to track exception occurance. void RecordExceptionWithUma(NSException* exception); } // namespace chrome
diff --git a/chrome/browser/mac/exception_processor.mm b/chrome/browser/mac/exception_processor.mm index 0acdccaf..d25d272d 100644 --- a/chrome/browser/mac/exception_processor.mm +++ b/chrome/browser/mac/exception_processor.mm
@@ -19,10 +19,6 @@ #include "base/strings/sys_string_conversions.h" #include "components/crash/core/common/crash_key.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace chrome { // Maximum number of known named exceptions we'll support. There is
diff --git a/chrome/browser/mac/initial_prefs.mm b/chrome/browser/mac/initial_prefs.mm index 695f8bc2..e032fa2 100644 --- a/chrome/browser/mac/initial_prefs.mm +++ b/chrome/browser/mac/initial_prefs.mm
@@ -11,10 +11,6 @@ #include "chrome/common/chrome_paths_internal.h" #include "components/version_info/version_info.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/browser/mac/install_from_dmg.mm b/chrome/browser/mac/install_from_dmg.mm index bdc7f73..f9fcfaed 100644 --- a/chrome/browser/mac/install_from_dmg.mm +++ b/chrome/browser/mac/install_from_dmg.mm
@@ -19,7 +19,6 @@ #include <algorithm> -#include "base/apple/bridging.h" #include "base/apple/bundle_locations.h" #include "base/auto_reset.h" #include "base/command_line.h" @@ -48,10 +47,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // Given an io_service_t (expected to be of class IOMedia), walks the ancestor @@ -291,7 +286,7 @@ NSString* yes = l10n_util::GetNSStringWithFixup(IDS_INSTALL_FROM_DMG_YES); NSString* no = l10n_util::GetNSStringWithFixup(IDS_INSTALL_FROM_DMG_NO); - NSAlert* alert = [[NSAlert alloc] init]; + NSAlert* alert = [[[NSAlert alloc] init] autorelease]; alert.alertStyle = NSAlertStyleInformational; alert.messageText = title; @@ -323,7 +318,7 @@ IDS_INSTALL_FROM_DMG_AUTHENTICATION_PROMPT, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); return base::mac::AuthorizationCreateToRunAsRoot( - base::apple::NSToCFPtrCast(prompt)); + base::mac::NSToCFCast(prompt)); } // Invokes the installer program at `installer_path` to copy `source_path` to @@ -426,7 +421,7 @@ IDS_INSTALL_FROM_DMG_ERROR, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); NSString* ok = l10n_util::GetNSStringWithFixup(IDS_OK); - NSAlert* alert = [[NSAlert alloc] init]; + NSAlert* alert = [[[NSAlert alloc] init] autorelease]; alert.alertStyle = NSAlertStyleWarning; alert.messageText = title;
diff --git a/chrome/browser/mac/nsprocessinfo_additions.mm b/chrome/browser/mac/nsprocessinfo_additions.mm index 06eb26ef..88b823ab 100644 --- a/chrome/browser/mac/nsprocessinfo_additions.mm +++ b/chrome/browser/mac/nsprocessinfo_additions.mm
@@ -8,10 +8,6 @@ @implementation NSProcessInfo(ChromeAdditions) -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - - (BOOL)cr_isMainBrowserOrTestProcess { NSString* processTypeString = [NSString stringWithFormat:@"--%s=", switches::kProcessType];
diff --git a/chrome/browser/mac/relauncher.mm b/chrome/browser/mac/relauncher.mm index 1f82edc4..b96deee 100644 --- a/chrome/browser/mac/relauncher.mm +++ b/chrome/browser/mac/relauncher.mm
@@ -37,10 +37,6 @@ #include "content/public/common/content_switches.h" #include "content/public/common/main_function_params.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace mac_relauncher { namespace {
diff --git a/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm b/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm index d9c0ffb..4ec8d0b 100644 --- a/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm +++ b/chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm
@@ -22,10 +22,6 @@ #include "media/base/media_switches.h" #include "ui/base/cocoa/permissions_utils.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace system_media_permissions { namespace {
diff --git a/chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.mm b/chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.mm index c8ab96a8..ed2f1fd 100644 --- a/chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.mm +++ b/chrome/browser/media/webrtc/system_media_capture_permissions_stats_mac.mm
@@ -10,10 +10,6 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace system_media_permissions { namespace {
diff --git a/chrome/browser/media/webrtc/window_icon_util_mac.mm b/chrome/browser/media/webrtc/window_icon_util_mac.mm index b075efd..434b016 100644 --- a/chrome/browser/media/webrtc/window_icon_util_mac.mm +++ b/chrome/browser/media/webrtc/window_icon_util_mac.mm
@@ -11,10 +11,6 @@ #include "third_party/libyuv/include/libyuv/convert_argb.h" #include "third_party/skia/include/core/SkBitmap.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - gfx::ImageSkia GetWindowIcon(content::DesktopMediaID id) { DCHECK(id.type == content::DesktopMediaID::TYPE_WINDOW);
diff --git a/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm b/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm index 0822e14..a154b2a 100644 --- a/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm +++ b/chrome/browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm
@@ -10,6 +10,7 @@ #include <memory> #include "base/functional/bind.h" +#include "base/mac/scoped_nsobject.h" #include "base/memory/raw_ptr.h" #include "components/services/filesystem/public/mojom/types.mojom.h" #include "components/storage_monitor/image_capture_device.h" @@ -18,10 +19,6 @@ #include "content/public/browser/browser_thread.h" #include "storage/browser/file_system/async_file_util.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { int kReadDirectoryTimeLimitSeconds = 20; @@ -71,7 +68,7 @@ virtual void ResetDelegate(); private: - ImageCaptureDevice* __strong camera_device_; + base::scoped_nsobject<ImageCaptureDevice> camera_device_; // Weak pointer raw_ptr<MTPDeviceDelegateImplMac> delegate_; @@ -79,8 +76,9 @@ void MTPDeviceDelegateImplMac::DeviceListener::OpenCameraSession( const std::string& device_id) { - camera_device_ = - storage_monitor::ImageCaptureDeviceManager::deviceForUUID(device_id); + camera_device_.reset( + [storage_monitor::ImageCaptureDeviceManager::deviceForUUID(device_id) + retain]); [camera_device_ setListener:AsWeakPtr()]; [camera_device_ open]; } @@ -119,7 +117,7 @@ void MTPDeviceDelegateImplMac::DeviceListener::DeviceRemoved() { [camera_device_ close]; - camera_device_ = nil; + camera_device_.reset(); if (delegate_) delegate_->NoMoreItems(); } @@ -149,7 +147,8 @@ base::Unretained(camera_interface_.get()), device_id_)); } -MTPDeviceDelegateImplMac::~MTPDeviceDelegateImplMac() = default; +MTPDeviceDelegateImplMac::~MTPDeviceDelegateImplMac() { +} namespace {
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm index b78408f0..26d7bdd 100644 --- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm +++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm
@@ -8,10 +8,6 @@ #include "base/metrics/histogram_macros.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // The possible values of the setting "Screens Have Separate Spaces".
diff --git a/chrome/browser/metrics/power/coalition_resource_usage_provider_mac.mm b/chrome/browser/metrics/power/coalition_resource_usage_provider_mac.mm index fd701c1b..7e94565 100644 --- a/chrome/browser/metrics/power/coalition_resource_usage_provider_mac.mm +++ b/chrome/browser/metrics/power/coalition_resource_usage_provider_mac.mm
@@ -9,10 +9,6 @@ #include "components/power_metrics/mach_time_mac.h" #include "components/power_metrics/resource_coalition_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // Details about whether it's possible to get coalition resource usage data on
diff --git a/chrome/browser/metrics/power/power_metrics_provider_mac.mm b/chrome/browser/metrics/power/power_metrics_provider_mac.mm index 9258814..02a289c 100644 --- a/chrome/browser/metrics/power/power_metrics_provider_mac.mm +++ b/chrome/browser/metrics/power/power_metrics_provider_mac.mm
@@ -22,10 +22,6 @@ #include "base/timer/timer.h" #include "components/power_metrics/smc_mac.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { constexpr base::TimeDelta kStartupPowerMetricsCollectionDuration = base::Seconds(30);
diff --git a/chrome/browser/metrics/shutdown_watcher_helper.cc b/chrome/browser/metrics/shutdown_watcher_helper.cc index db97771..5dbc2e0a 100644 --- a/chrome/browser/metrics/shutdown_watcher_helper.cc +++ b/chrome/browser/metrics/shutdown_watcher_helper.cc
@@ -4,14 +4,45 @@ #include "chrome/browser/metrics/shutdown_watcher_helper.h" +#include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/metrics/thread_watcher_report_hang.h" #include "chrome/common/channel_info.h" #include "components/version_info/channel.h" +// TODO(crbug.com/1444937): This code is not related to the metrics +// infrastructure and should be moved to a new home. + // ShutdownWatcherHelper is not available on Android. #if !BUILDFLAG(IS_ANDROID) +namespace { +base::TimeDelta GetPerChannelTimeout(base::TimeDelta duration) { + base::TimeDelta actual_duration = duration; + + // TODO(crbug.com/1444937): These timeouts were set based on historical + // values, but should be revisited. See discussion in + // https://crrev.com/c/4527815/comments/baea15f7_98f5a0e9 + // + // In particular, `Arm` is called with a 5 minute timeout, which translates + // to an extremely long 100 minute shutdown timeout on stable. This is long + // enough that we effectively are not looking for shutdown hangs on stable at + // all. + version_info::Channel channel = chrome::GetChannel(); + if (channel == version_info::Channel::STABLE) { + actual_duration *= 20; + } else if (channel == version_info::Channel::BETA) { + actual_duration *= 10; + } else if (channel == version_info::Channel::DEV) { + actual_duration *= 4; + } else { + actual_duration *= 2; + } + + return actual_duration; +} +} // namespace + ShutdownWatcherHelper::ShutdownWatcherHelper() = default; ShutdownWatcherHelper::~ShutdownWatcherHelper() { @@ -21,7 +52,8 @@ void ShutdownWatcherHelper::Arm(const base::TimeDelta& duration) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(!shutdown_watchdog_); - shutdown_watchdog_.emplace(duration, "Shutdown watchdog thread", true, this); + shutdown_watchdog_.emplace(GetPerChannelTimeout(duration), + "Shutdown watchdog thread", true, this); shutdown_watchdog_->Arm(); }
diff --git a/chrome/browser/password_manager/android/pwd_migration/BUILD.gn b/chrome/browser/password_manager/android/pwd_migration/BUILD.gn index 131d30b..815022ec 100644 --- a/chrome/browser/password_manager/android/pwd_migration/BUILD.gn +++ b/chrome/browser/password_manager/android/pwd_migration/BUILD.gn
@@ -35,7 +35,6 @@ "//chrome/browser/password_manager/android:password_manager_resource_provider_java", "//chrome/browser/ui/android/strings:ui_strings_grd", "//components/browser_ui/bottomsheet/android:java", - "//components/browser_ui/widget/android:java", "//components/version_info/android:version_constants_java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_appcompat_appcompat_java", @@ -49,8 +48,6 @@ "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java", "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningIntroFragment.java", "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java", - "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java", - "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java", "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java", "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningView.java", "java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewBinder.java", @@ -116,14 +113,10 @@ } android_resources("java_resources") { - deps = [ - "//components/browser_ui/widget/android:java_resources", - "//ui/android:ui_java_resources", - ] + deps = [ "//ui/android:ui_java_resources" ] sources = [ "java/res/layout/pwd_migration_warning.xml", "java/res/layout/pwd_migration_warning_intro_fragment.xml", - "java/res/layout/pwd_migration_warning_options.xml", "java/res/values/dimens.xml", ] }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_intro_fragment.xml b/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_intro_fragment.xml index 69bea78..c537287 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_intro_fragment.xml +++ b/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_intro_fragment.xml
@@ -14,8 +14,8 @@ android:id="@+id/migration_warning_sheet_subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" android:layout_marginBottom="@dimen/pwd_migration_warning_margin" + android:layout_gravity="center_horizontal" android:textAppearance="@style/TextAppearance.TextMedium.Secondary"/> <org.chromium.ui.widget.ButtonCompat @@ -23,9 +23,9 @@ android:id="@+id/acknowledge_password_migration_button" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:layout_marginBottom="@dimen/pwd_migration_warning_button_spacing" + android:layout_marginBottom="12dp" android:minHeight="@dimen/pwd_migration_warning_button_height" + android:layout_gravity="center_horizontal" android:ellipsize="end" android:singleLine="true" android:text="@string/password_migration_warning_acknowledge" @@ -36,9 +36,9 @@ android:id="@+id/password_migration_more_options_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" android:layout_marginBottom="@dimen/pwd_migration_warning_margin" android:minHeight="@dimen/pwd_migration_warning_button_height" + android:layout_gravity="center_horizontal" android:ellipsize="end" android:singleLine="true" android:text="@string/password_migration_warning_other_options"
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_options.xml b/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_options.xml deleted file mode 100644 index 6080126..0000000 --- a/chrome/browser/password_manager/android/pwd_migration/java/res/layout/pwd_migration_warning_options.xml +++ /dev/null
@@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -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. ---> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:orientation="vertical" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal"> - - <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout - android:id="@+id/radio_button_layout" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/pwd_migration_warning_margin"> - - <org.chromium.components.browser_ui.widget.RadioButtonWithDescription - android:id="@+id/radio_sign_in_or_sync" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:primaryText="@string/password_migration_warning_turn_on_sync" - app:descriptionText="@string/password_migration_warning_turn_on_sync_subtitle" /> - - <org.chromium.components.browser_ui.widget.RadioButtonWithDescription - android:id="@+id/radio_password_export" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - app:primaryText="@string/password_migration_warning_password_export" /> - </org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout> - - <org.chromium.ui.widget.ButtonCompat - android:descendantFocusability="blocksDescendants" - android:id="@+id/password_migration_next_button" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:layout_marginBottom="@dimen/pwd_migration_warning_button_spacing" - android:minHeight="@dimen/pwd_migration_warning_button_height" - android:ellipsize="end" - android:singleLine="true" - android:text="@string/password_migration_warning_next" - style="@style/FilledButton.Flat"/> - - <org.chromium.ui.widget.ButtonCompat - android:descendantFocusability="blocksDescendants" - android:id="@+id/password_migration_cancel_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:layout_marginBottom="@dimen/pwd_migration_warning_margin" - android:minHeight="@dimen/pwd_migration_warning_button_height" - android:ellipsize="end" - android:singleLine="true" - android:text="@string/password_migration_warning_cancel" - style="@style/TextButton"/> -</LinearLayout>
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/res/values/dimens.xml b/chrome/browser/password_manager/android/pwd_migration/java/res/values/dimens.xml index cbaa6ed..f32d911f 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/res/values/dimens.xml +++ b/chrome/browser/password_manager/android/pwd_migration/java/res/values/dimens.xml
@@ -9,5 +9,4 @@ <dimen name="pwd_migration_warning_margin">24dp</dimen> <dimen name="pwd_migration_warning_button_height">48dp</dimen> <dimen name="pwd_migration_warning_icon_size">32dp</dimen> - <dimen name="pwd_migration_warning_button_spacing">12dp</dimen> </resources>
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java index 3695d89..b71b7c6 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningCoordinator.java
@@ -8,7 +8,6 @@ import androidx.annotation.Nullable; -import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -20,15 +19,14 @@ public PasswordMigrationWarningCoordinator( @Nullable Context context, BottomSheetController sheetController) { - PropertyModel model = PasswordMigrationWarningProperties.createDefaultModel( - mMediator::onDismissed, mMediator); - mMediator.initialize(model); + mMediator.initialize( + PasswordMigrationWarningProperties.createDefaultModel(mMediator::onDismissed)); setUpModelChangeProcessors( - model, new PasswordMigrationWarningView(context, sheetController)); + mMediator.getModel(), new PasswordMigrationWarningView(context, sheetController)); } public void showWarning() { - mMediator.showWarning(ScreenType.INTRO_SCREEN); + mMediator.showWarning(); } static void setUpModelChangeProcessors(PropertyModel model, PasswordMigrationWarningView view) {
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningIntroFragment.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningIntroFragment.java index 3a19d1a..f3467829 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningIntroFragment.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningIntroFragment.java
@@ -7,37 +7,40 @@ import android.content.Context; import android.os.Bundle; import android.view.View; -import android.widget.Button; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import org.chromium.components.version_info.VersionInfo; import org.chromium.ui.widget.TextViewWithLeading; /** This fragment contains the UI for the first page of the password migration warning. */ public class PasswordMigrationWarningIntroFragment extends Fragment { private Context mContext; - private Runnable mAcknowledgeCallback; - private Runnable mMoreOptionsCallback; - private String mChannelString; - public PasswordMigrationWarningIntroFragment(Context context, Runnable acknowledgeCallback, - Runnable moreOptionsCallback, String channelString) { + public PasswordMigrationWarningIntroFragment(Context context) { super(R.layout.pwd_migration_warning_intro_fragment); mContext = context; - mAcknowledgeCallback = acknowledgeCallback; - mMoreOptionsCallback = moreOptionsCallback; - mChannelString = channelString; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { TextViewWithLeading subtitleView = view.findViewById(R.id.migration_warning_sheet_subtitle); subtitleView.setText(mContext.getString(R.string.password_migration_warning_subtitle) - .replace("%1$s", mChannelString)); - Button acknowledgeButton = view.findViewById(R.id.acknowledge_password_migration_button); - Button moreOptionsButton = view.findViewById(R.id.password_migration_more_options_button); - acknowledgeButton.setOnClickListener((unusedView) -> mAcknowledgeCallback.run()); - moreOptionsButton.setOnClickListener((unusedView) -> mMoreOptionsCallback.run()); + .replace("%1$s", getChannelString())); + } + + private String getChannelString() { + if (VersionInfo.isCanaryBuild()) { + return "Canary"; + } + if (VersionInfo.isDevBuild()) { + return "Dev"; + } + if (VersionInfo.isBetaBuild()) { + return "Beta"; + } + assert !VersionInfo.isStableBuild(); + return ""; } }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java index 9eac7db..67f9297 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java
@@ -4,11 +4,8 @@ package org.chromium.chrome.browser.pwd_migration; -import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.CURRENT_SCREEN; import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE; -import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType; -import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason; import org.chromium.ui.modelutil.PropertyModel; @@ -16,15 +13,14 @@ * Contains the logic for the local passwords migration warning. It sets the state of the model and * reacts to events. */ -class PasswordMigrationWarningMediator implements PasswordMigrationWarningOnClickHandler { +class PasswordMigrationWarningMediator { private PropertyModel mModel; void initialize(PropertyModel model) { mModel = model; } - void showWarning(int screenType) { - mModel.set(CURRENT_SCREEN, screenType); + void showWarning() { mModel.set(VISIBLE, true); } @@ -33,23 +29,7 @@ mModel.set(VISIBLE, false); } - @Override - public void onAcknowledge(BottomSheetController bottomSheetController) { - bottomSheetController.collapseSheet(true); - } - - @Override - public void onMoreOptions() { - mModel.set(CURRENT_SCREEN, ScreenType.OPTIONS_SCREEN); - } - - @Override - public void onNext() { - // TODO(crbug.com/1445065): Launch the password Export flow. - } - - @Override - public void onCancel(BottomSheetController bottomSheetController) { - bottomSheetController.collapseSheet(true); + PropertyModel getModel() { + return mModel; } }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java index e3aaefd..d7d4838 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java
@@ -4,13 +4,10 @@ package org.chromium.chrome.browser.pwd_migration; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.verify; -import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.CURRENT_SCREEN; import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.DISMISS_HANDLER; import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE; @@ -27,7 +24,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Batch; -import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType; import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason; @@ -46,7 +42,6 @@ public TestRule mProcessor = new Features.JUnitProcessor(); private PasswordMigrationWarningMediator mMediator = new PasswordMigrationWarningMediator(); - private PropertyModel mModel; @Mock private BottomSheetController mBottomSheetController; @@ -54,50 +49,35 @@ @Before public void setUp() { MockitoAnnotations.initMocks(this); - mModel = PasswordMigrationWarningProperties.createDefaultModel( - mMediator::onDismissed, mMediator); - mMediator.initialize(mModel); + mMediator.initialize( + PasswordMigrationWarningProperties.createDefaultModel(mMediator::onDismissed)); } @Test public void testShowWarningChangesVisibility() { - mModel.set(VISIBLE, false); - mMediator.showWarning(ScreenType.INTRO_SCREEN); - assertTrue(mModel.get(VISIBLE)); + PropertyModel model = mMediator.getModel(); + assertFalse(model.get(VISIBLE)); + mMediator.showWarning(); + assertTrue(model.get(VISIBLE)); } @Test - public void testOnDismissedHidesTheSheet() { - mMediator.showWarning(ScreenType.INTRO_SCREEN); + public void testOnDismissedChangesVisibility() { + PropertyModel model = mMediator.getModel(); + mMediator.showWarning(); + assertTrue(model.get(VISIBLE)); mMediator.onDismissed(StateChangeReason.NONE); - assertFalse(mModel.get(VISIBLE)); + assertFalse(model.get(VISIBLE)); } @Test - public void testDismissHandlerHidesTheSheet() { - assertNotNull(mModel.get(DISMISS_HANDLER)); - mMediator.showWarning(ScreenType.INTRO_SCREEN); - mModel.get(DISMISS_HANDLER).onResult(StateChangeReason.NONE); - assertFalse(mModel.get(VISIBLE)); - } - - @Test - public void testOnMoreOptionsChangesTheModel() { - mMediator.showWarning(ScreenType.INTRO_SCREEN); - assertEquals(mModel.get(CURRENT_SCREEN), ScreenType.INTRO_SCREEN); - mMediator.onMoreOptions(); - assertEquals(mModel.get(CURRENT_SCREEN), ScreenType.OPTIONS_SCREEN); - } - - @Test - public void testOnAcknowledgeCollapsesTheSheet() { - mMediator.onAcknowledge(mBottomSheetController); - verify(mBottomSheetController).collapseSheet(true); - } - - @Test - public void testOnCancelCollapsesTheSheet() { - mMediator.onCancel(mBottomSheetController); - verify(mBottomSheetController).collapseSheet(true); + public void testDismissHandlerChangesVisibility() { + PropertyModel model = mMediator.getModel(); + assertNotNull(model.get(DISMISS_HANDLER)); + assertFalse(model.get(VISIBLE)); + mMediator.showWarning(); + assertTrue(model.get(VISIBLE)); + model.get(DISMISS_HANDLER).onResult(StateChangeReason.NONE); + assertFalse(model.get(VISIBLE)); } }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java deleted file mode 100644 index e726d766..0000000 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java +++ /dev/null
@@ -1,41 +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. - -package org.chromium.chrome.browser.pwd_migration; - -import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; - -/** - * Contains the logic for the on click listeners of all the buttons on the - * password migration warning sheet. - */ -interface PasswordMigrationWarningOnClickHandler { - /** - * Closes the sheet and marks that the user acknowledged the notice by - * clicking on the "Got it" button. - * - * @param bottomSheetController used to close the sheet. - */ - void onAcknowledge(BottomSheetController bottomSheetController); - - /** - * Shows a screen with more options when the "More options" button is - * clicked. - */ - void onMoreOptions(); - - /** - * Starts the sign-in/sync flow or the export flow depending on the user - * choice in the screen with more options. - */ - void onNext(); - - /** - * Closes the sheet when the "Cancel" button is clicked, but doesn't mark - * that the user acknowledged the notice. - * - * @param bottomSheetController used to close the sheet. - */ - void onCancel(BottomSheetController bottomSheetController); -}
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java deleted file mode 100644 index 4cf115d..0000000 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java +++ /dev/null
@@ -1,54 +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. -package org.chromium.chrome.browser.pwd_migration; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; - -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import org.chromium.components.browser_ui.widget.RadioButtonWithDescription; - -/** - * This fragment contains the UI for the second page of the password migration - * warning. The page shows alternative options for users who didn't acknowledge - * the upcoming merge of passwords for different Chrome channels. The offered - * alternatives are to export the passwords or to start syncing passwords. - */ -public class PasswordMigrationWarningOptionsFragment extends Fragment { - private Context mContext; - private boolean mShouldSignIn = true; - private Runnable mNextCallback; - private Runnable mCancelCallback; - private String mChannelString; - - public PasswordMigrationWarningOptionsFragment( - Context context, Runnable nextCallback, Runnable cancelCallback, String channelString) { - super(R.layout.pwd_migration_warning_options); - mContext = context; - mNextCallback = nextCallback; - mCancelCallback = cancelCallback; - mChannelString = channelString; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - RadioButtonWithDescription signInOrSyncButton = - view.findViewById(R.id.radio_sign_in_or_sync); - RadioButtonWithDescription passwordExportButton = - view.findViewById(R.id.radio_password_export); - Button nextButton = view.findViewById(R.id.password_migration_next_button); - Button cancelButton = view.findViewById(R.id.password_migration_cancel_button); - - signInOrSyncButton.setChecked(true); - passwordExportButton.setDescriptionText( - mContext.getString(R.string.password_migration_warning_password_export_subtitle) - .replace("%1$s", mChannelString)); - nextButton.setOnClickListener((unusedView) -> mNextCallback.run()); - cancelButton.setOnClickListener((unusedView) -> mCancelCallback.run()); - } -}
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java index 9baf042..7e9d2f90 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java
@@ -4,44 +4,22 @@ package org.chromium.chrome.browser.pwd_migration; -import androidx.annotation.IntDef; - import org.chromium.base.Callback; import org.chromium.ui.modelutil.PropertyModel; -import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey; -import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; -import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; /** * Properties defined here reflect the visible state of the local passwords migration warning. */ class PasswordMigrationWarningProperties { - /** - * The different screens that can be shown on the sheet. - */ - @IntDef({ScreenType.INTRO_SCREEN, ScreenType.OPTIONS_SCREEN}) - @Retention(RetentionPolicy.SOURCE) - public @interface ScreenType { - int INTRO_SCREEN = 0; - int OPTIONS_SCREEN = 1; - } + static final PropertyModel.WritableBooleanPropertyKey VISIBLE = + new PropertyModel.WritableBooleanPropertyKey("visible"); + static final PropertyModel.ReadableObjectPropertyKey<Callback<Integer>> DISMISS_HANDLER = + new PropertyModel.ReadableObjectPropertyKey<>("dismiss_handler"); - static final WritableBooleanPropertyKey VISIBLE = new WritableBooleanPropertyKey("visible"); - static final ReadableObjectPropertyKey<Callback<Integer>> DISMISS_HANDLER = - new ReadableObjectPropertyKey<>("dismiss_handler"); - static final ReadableObjectPropertyKey<PasswordMigrationWarningOnClickHandler> - ON_CLICK_HANDLER = new ReadableObjectPropertyKey<>("on_click_handler"); - public static final WritableIntPropertyKey CURRENT_SCREEN = - new WritableIntPropertyKey("current_screen"); - - static PropertyModel createDefaultModel(Callback<Integer> dismissHandler, - PasswordMigrationWarningOnClickHandler onClickHandler) { - return new PropertyModel.Builder(VISIBLE, DISMISS_HANDLER, ON_CLICK_HANDLER, CURRENT_SCREEN) + static PropertyModel createDefaultModel(Callback<Integer> dismissHandler) { + return new PropertyModel.Builder(VISIBLE, DISMISS_HANDLER) + .with(VISIBLE, false) .with(DISMISS_HANDLER, dismissHandler) - .with(ON_CLICK_HANDLER, onClickHandler) .build(); }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningRenderTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningRenderTest.java index 1e79378..bf392bc 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningRenderTest.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningRenderTest.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.pwd_migration; -import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.CURRENT_SCREEN; import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE; import static org.chromium.content_public.browser.test.util.TestThreadUtils.runOnUiThreadBlocking; import static org.chromium.ui.base.LocalizationUtils.setRtlForTesting; @@ -31,7 +30,6 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils; -import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ChromeRenderTestRule; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; @@ -59,8 +57,6 @@ @Mock private Callback<Integer> mDismissCallback; - @Mock - private PasswordMigrationWarningOnClickHandler mOnClickHandler; private BottomSheetController mBottomSheetController; private PasswordMigrationWarningView mView; @@ -71,7 +67,7 @@ @Rule public final ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(2) + .setRevision(1) .setBugComponent(Component.UI_BROWSER_AUTOFILL) .build(); @@ -90,8 +86,7 @@ .getRootUiCoordinatorForTesting() .getBottomSheetController(); runOnUiThreadBlocking(() -> { - mModel = PasswordMigrationWarningProperties.createDefaultModel( - mDismissCallback, mOnClickHandler); + mModel = PasswordMigrationWarningProperties.createDefaultModel(mDismissCallback); mView = new PasswordMigrationWarningView( mActivityTestRule.getActivity(), mBottomSheetController); PropertyModelChangeProcessor.create(mModel, mView, @@ -116,7 +111,6 @@ @MediumTest @Feature({"RenderTest"}) public void testShowsPasswordMigrationWwarningFirstPage() throws Exception { - runOnUiThreadBlocking(() -> mModel.set(CURRENT_SCREEN, ScreenType.INTRO_SCREEN)); runOnUiThreadBlocking(() -> mModel.set(VISIBLE, true)); BottomSheetTestSupport.waitForOpen(mBottomSheetController); @@ -125,20 +119,4 @@ mActivityTestRule.getActivity().findViewById(R.id.pwd_migration_warning_sheet); mRenderTestRule.render(bottomSheetView, "pwd_migration_warning_first_page"); } - - @Test - @MediumTest - @Feature({"RenderTest"}) - public void testShowsPasswordMigrationWarningSecondPageWithNoUserSignedIn() throws Exception { - runOnUiThreadBlocking(() -> mModel.set(CURRENT_SCREEN, ScreenType.OPTIONS_SCREEN)); - runOnUiThreadBlocking(() -> mModel.set(VISIBLE, true)); - - BottomSheetTestSupport.waitForOpen(mBottomSheetController); - - View bottomSheetView = - mActivityTestRule.getActivity().findViewById(R.id.pwd_migration_warning_sheet); - - mRenderTestRule.render( - bottomSheetView, "pwd_migration_warning_second_page_no_user_signed_in"); - } }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningView.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningView.java index b09b07c..fb312989 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningView.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningView.java
@@ -17,12 +17,10 @@ import org.chromium.base.Callback; import org.chromium.chrome.browser.password_manager.PasswordManagerResourceProviderFactory; -import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver; import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver; -import org.chromium.components.version_info.VersionInfo; /** * This class is responsible for rendering the bottom sheet that shows the passwords @@ -31,10 +29,9 @@ class PasswordMigrationWarningView implements BottomSheetContent { private final BottomSheetController mBottomSheetController; private Callback<Integer> mDismissHandler; - private PasswordMigrationWarningOnClickHandler mOnClickHandler; private FragmentManager mFragmentManager; + private PasswordMigrationWarningIntroFragment mIntroFragment; private final RelativeLayout mContentView; - private Context mContext; private final BottomSheetObserver mBottomSheetObserver = new EmptyBottomSheetObserver() { @Override @@ -56,7 +53,6 @@ }; PasswordMigrationWarningView(Context context, BottomSheetController bottomSheetController) { - mContext = context; mBottomSheetController = bottomSheetController; mContentView = (RelativeLayout) LayoutInflater.from(context).inflate( R.layout.pwd_migration_warning, null); @@ -64,17 +60,15 @@ mContentView.findViewById(R.id.touch_to_fill_sheet_header_image); sheetHeaderImage.setImageDrawable(AppCompatResources.getDrawable( context, PasswordManagerResourceProviderFactory.create().getPasswordManagerIcon())); + mFragmentManager = ((AppCompatActivity) context).getSupportFragmentManager(); + mIntroFragment = new PasswordMigrationWarningIntroFragment(context); } void setDismissHandler(Callback<Integer> dismissHandler) { mDismissHandler = dismissHandler; } - void setOnClickHandler(PasswordMigrationWarningOnClickHandler onClickHandler) { - mOnClickHandler = onClickHandler; - } - boolean setVisible(boolean isVisible) { if (!isVisible) { mBottomSheetController.hideContent(this, true); @@ -85,47 +79,14 @@ mBottomSheetController.removeObserver(mBottomSheetObserver); return false; } + mFragmentManager.beginTransaction() + .setReorderingAllowed(true) + .add(R.id.fragment_container_view, mIntroFragment, + "PasswordMigrationWarningFragment") + .commit(); return true; } - void setScreen(int screenType) { - if (screenType == ScreenType.INTRO_SCREEN) { - PasswordMigrationWarningIntroFragment introFragment = - new PasswordMigrationWarningIntroFragment(mContext, - () - -> mOnClickHandler.onAcknowledge(mBottomSheetController), - () -> mOnClickHandler.onMoreOptions(), getChannelString()); - mFragmentManager.beginTransaction() - .setReorderingAllowed(true) - .replace(R.id.fragment_container_view, introFragment) - .commit(); - } else if (screenType == ScreenType.OPTIONS_SCREEN) { - PasswordMigrationWarningOptionsFragment optionsFragment = - new PasswordMigrationWarningOptionsFragment(mContext, mOnClickHandler::onNext, - () - -> mOnClickHandler.onCancel(mBottomSheetController), - getChannelString()); - mFragmentManager.beginTransaction() - .setReorderingAllowed(true) - .replace(R.id.fragment_container_view, optionsFragment) - .commit(); - } - } - - private String getChannelString() { - if (VersionInfo.isCanaryBuild()) { - return "Canary"; - } - if (VersionInfo.isDevBuild()) { - return "Dev"; - } - if (VersionInfo.isBetaBuild()) { - return "Beta"; - } - assert !VersionInfo.isStableBuild(); - return ""; - } - @Nullable @Override public View getContentView() {
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewBinder.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewBinder.java index 7ed2a51..ba17aa65 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewBinder.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewBinder.java
@@ -4,9 +4,7 @@ package org.chromium.chrome.browser.pwd_migration; -import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.CURRENT_SCREEN; import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.DISMISS_HANDLER; -import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ON_CLICK_HANDLER; import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; @@ -30,15 +28,10 @@ view.setDismissHandler(model.get(DISMISS_HANDLER)); } else if (propertyKey == VISIBLE) { boolean visibilityChangeSuccessful = view.setVisible(model.get(VISIBLE)); - // TODO(crbug.com/1446996): Move this logic out of the view binder. if (!visibilityChangeSuccessful && model.get(VISIBLE)) { assert model.get(DISMISS_HANDLER) != null; model.get(DISMISS_HANDLER).onResult(BottomSheetController.StateChangeReason.NONE); } - } else if (propertyKey == CURRENT_SCREEN) { - view.setScreen(model.get(CURRENT_SCREEN)); - } else if (propertyKey == ON_CLICK_HANDLER) { - view.setOnClickHandler(model.get(ON_CLICK_HANDLER)); } else { assert false : "Unhandled update to property:" + propertyKey; }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java index 57272f2..66a8f12a 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java
@@ -49,8 +49,6 @@ @Mock private Callback<Integer> mDismissCallback; - @Mock - private PasswordMigrationWarningOnClickHandler mOnClickHandler; private BottomSheetController mBottomSheetController; private PasswordMigrationWarningView mView; @@ -64,8 +62,7 @@ .getRootUiCoordinatorForTesting() .getBottomSheetController(); runOnUiThreadBlocking(() -> { - mModel = PasswordMigrationWarningProperties.createDefaultModel( - mDismissCallback, mOnClickHandler); + mModel = PasswordMigrationWarningProperties.createDefaultModel(mDismissCallback); mView = new PasswordMigrationWarningView( mActivityTestRule.getActivity(), mBottomSheetController); PropertyModelChangeProcessor.create(mModel, mView,
diff --git a/chrome/browser/password_manager/password_manager_util_mac.mm b/chrome/browser/password_manager/password_manager_util_mac.mm index abe2af7..8e687ea1 100644 --- a/chrome/browser/password_manager/password_manager_util_mac.mm +++ b/chrome/browser/password_manager/password_manager_util_mac.mm
@@ -18,10 +18,6 @@ #include "chrome/grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { NSString* UserAuthenticationRightName() { @@ -74,14 +70,14 @@ AuthorizationItem right_items[] = {{rightName.UTF8String, 0, nullptr, 0}}; AuthorizationRights rights = {std::size(right_items), right_items}; - base::ScopedCFTypeRef<CFStringRef> prompt = - base::SysUTF16ToCFStringRef(prompt_string); + NSString* prompt = base::SysUTF16ToNSString(prompt_string); // Pass kAuthorizationFlagDestroyRights to prevent the OS from saving the // authorization and not prompting the user when future requests are made. base::mac::ScopedAuthorizationRef authorization = base::mac::GetAuthorizationRightsWithPrompt( - &rights, prompt, kAuthorizationFlagDestroyRights); + &rights, base::mac::NSToCFCast(prompt), + kAuthorizationFlagDestroyRights); return static_cast<bool>(authorization); }
diff --git a/chrome/browser/platform_util_mac.mm b/chrome/browser/platform_util_mac.mm index 57eac7e0..64e04dad 100644 --- a/chrome/browser/platform_util_mac.mm +++ b/chrome/browser/platform_util_mac.mm
@@ -20,10 +20,6 @@ #include "ui/views/widget/widget.h" #include "url/gurl.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace platform_util { void ShowItemInFolder(Profile* profile, const base::FilePath& full_path) {
diff --git a/chrome/browser/policy/browser_dm_token_storage_mac.mm b/chrome/browser/policy/browser_dm_token_storage_mac.mm index ade8520..7cc153b 100644 --- a/chrome/browser/policy/browser_dm_token_storage_mac.mm +++ b/chrome/browser/policy/browser_dm_token_storage_mac.mm
@@ -29,10 +29,6 @@ #include "chrome/common/chrome_paths.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace policy { namespace {
diff --git a/chrome/browser/prefs/chrome_pref_service_factory.cc b/chrome/browser/prefs/chrome_pref_service_factory.cc index f1271ed7..229154d 100644 --- a/chrome/browser/prefs/chrome_pref_service_factory.cc +++ b/chrome/browser/prefs/chrome_pref_service_factory.cc
@@ -56,6 +56,7 @@ #include "components/search_engines/search_engines_pref_names.h" #include "components/signin/public/base/signin_pref_names.h" #include "components/supervised_user/core/common/buildflags.h" +#include "components/sync/base/features.h" #include "components/sync/base/model_type.h" #include "components/sync/base/pref_names.h" #include "components/sync_preferences/pref_model_associator.h" @@ -426,6 +427,20 @@ supervised_user_settings, std::move(user_pref_store), std::move(extension_prefs), std::move(standalone_browser_prefs), async, connector); + + if (base::FeatureList::IsEnabled(syncer::kEnablePreferencesAccountStorage) && + base::FeatureList::IsEnabled( + syncer::kSyncEnablePersistentStorageForAccountPreferences)) { + // Note: Only mobile platforms are targeted as part of the experiment, + // which do not require preference protection. Hence pref filters and + // ProfilePrefStoreManager::CreateProfilePrefStore() can be avoided. + factory.SetAccountPrefStore(base::MakeRefCounted<JsonPrefStore>( + /*pref_filename=*/profile_path.Append( + chrome::kAccountPreferencesFilename), + /*pref_filter=*/nullptr, + /*file_task_runner=*/io_task_runner)); + } + return factory.CreateSyncable(std::move(pref_registry)); }
diff --git a/chrome/browser/private_network_access/COMMON_METADATA b/chrome/browser/private_network_access/COMMON_METADATA new file mode 100644 index 0000000..ad794157 --- /dev/null +++ b/chrome/browser/private_network_access/COMMON_METADATA
@@ -0,0 +1,4 @@ +monorail: { + component: "Blink>SecurityFeature>CORS>PrivateNetworkAccess" +} +team_email: "chrome-security-owp@chromium.org"
diff --git a/chrome/browser/private_network_access/DIR_METADATA b/chrome/browser/private_network_access/DIR_METADATA new file mode 100644 index 0000000..552f886f --- /dev/null +++ b/chrome/browser/private_network_access/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//chrome/browser/private_network_access/COMMON_METADATA"
diff --git a/chrome/browser/private_network_access/OWNERS b/chrome/browser/private_network_access/OWNERS new file mode 100644 index 0000000..4ff31da4 --- /dev/null +++ b/chrome/browser/private_network_access/OWNERS
@@ -0,0 +1,4 @@ +lyf@chromium.org +titouan@chromium.org +phao@chromium.org +clamy@chromium.org
diff --git a/chrome/browser/private_network_access/chrome_private_network_device_chooser.cc b/chrome/browser/private_network_access/chrome_private_network_device_chooser.cc new file mode 100644 index 0000000..9be3d19 --- /dev/null +++ b/chrome/browser/private_network_access/chrome_private_network_device_chooser.cc
@@ -0,0 +1,10 @@ +// 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 "chrome/browser/private_network_access/chrome_private_network_device_chooser.h" + +ChromePrivateNetworkDeviceChooser::ChromePrivateNetworkDeviceChooser() = + default; +ChromePrivateNetworkDeviceChooser::~ChromePrivateNetworkDeviceChooser() = + default;
diff --git a/chrome/browser/private_network_access/chrome_private_network_device_chooser.h b/chrome/browser/private_network_access/chrome_private_network_device_chooser.h new file mode 100644 index 0000000..99f9489 --- /dev/null +++ b/chrome/browser/private_network_access/chrome_private_network_device_chooser.h
@@ -0,0 +1,45 @@ +// 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 CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_CHOOSER_H_ +#define CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_CHOOSER_H_ + +#include <string> + +#include "base/functional/callback.h" + +namespace content { +enum class PrivateNetworkDeviceChooserEvent { + kDeniedPermission, + kCancelled, + kSelected, +}; +class RenderFrameHost; +} // namespace content + +class PrivateNetworkDeviceChooserController; + +// Token representing a private network device chooser prompt. Destroying this +// object should cancel the prompt. +class ChromePrivateNetworkDeviceChooser { + public: + ChromePrivateNetworkDeviceChooser(const ChromePrivateNetworkDeviceChooser&) = + delete; + ChromePrivateNetworkDeviceChooser& operator=( + const ChromePrivateNetworkDeviceChooser&) = delete; + virtual ~ChromePrivateNetworkDeviceChooser(); + + using EventHandler = + base::RepeatingCallback<void(content::PrivateNetworkDeviceChooserEvent, + const std::string& device_id)>; + + protected: + ChromePrivateNetworkDeviceChooser(); + + void ShowChooser( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<PrivateNetworkDeviceChooserController> controller); +}; + +#endif // CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_CHOOSER_H_
diff --git a/chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.cc b/chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.cc new file mode 100644 index 0000000..2c7fe4ac --- /dev/null +++ b/chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.cc
@@ -0,0 +1,36 @@ +// 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 "chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.h" + +#include <utility> + +#include "build/build_config.h" +#include "chrome/browser/private_network_access/private_network_device_chooser_controller.h" +#include "chrome/browser/ui/browser_dialogs.h" +#include "content/public/browser/render_frame_host.h" + +ChromePrivateNetworkDeviceChooserDesktop:: + ChromePrivateNetworkDeviceChooserDesktop() = default; + +ChromePrivateNetworkDeviceChooserDesktop:: + ~ChromePrivateNetworkDeviceChooserDesktop() = default; + +std::unique_ptr<ChromePrivateNetworkDeviceChooserDesktop> +ChromePrivateNetworkDeviceChooserDesktop::Create( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<PrivateNetworkDeviceChooserController> controller) { + std::unique_ptr<ChromePrivateNetworkDeviceChooserDesktop> chooser; + chooser = std::make_unique<ChromePrivateNetworkDeviceChooserDesktop>(); + chooser->ShowChooser(render_frame_host, std::move(controller)); + return chooser; +} + +void ChromePrivateNetworkDeviceChooserDesktop::ShowChooser( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<PrivateNetworkDeviceChooserController> controller) { + DCHECK(render_frame_host); + closure_runner_.ReplaceClosure(chrome::ShowDeviceChooserDialog( + render_frame_host, std::move(controller))); +}
diff --git a/chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.h b/chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.h new file mode 100644 index 0000000..7d05bfc --- /dev/null +++ b/chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.h
@@ -0,0 +1,43 @@ +// 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 CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_CHOOSER_DESKTOP_H_ +#define CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_CHOOSER_DESKTOP_H_ + +#include <memory> +#include <string> + +#include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" +#include "chrome/browser/private_network_access/chrome_private_network_device_chooser.h" + +namespace content { +class RenderFrameHost; +} + +class PrivateNetworkDeviceChooserController; + +// ChromePrivateNetworkDeviceChooserDesktop is a permission chooser prompt for +// desktop devices. Permission chooser prompt for private network access only +// shows up after pricate network access preflight response and have one device +// to show at a time. +class ChromePrivateNetworkDeviceChooserDesktop + : public ChromePrivateNetworkDeviceChooser { + public: + ChromePrivateNetworkDeviceChooserDesktop(); + ~ChromePrivateNetworkDeviceChooserDesktop() override; + + static std::unique_ptr<ChromePrivateNetworkDeviceChooserDesktop> Create( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<PrivateNetworkDeviceChooserController> controller); + + void ShowChooser( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<PrivateNetworkDeviceChooserController> controller); + + private: + base::ScopedClosureRunner closure_runner_; +}; + +#endif // CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_CHOOSER_DESKTOP_H_
diff --git a/chrome/browser/private_network_access/chrome_private_network_device_delegate.cc b/chrome/browser/private_network_access/chrome_private_network_device_delegate.cc new file mode 100644 index 0000000..10e49c9 --- /dev/null +++ b/chrome/browser/private_network_access/chrome_private_network_device_delegate.cc
@@ -0,0 +1,44 @@ +// 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 "chrome/browser/private_network_access/chrome_private_network_device_delegate.h" + +#include "base/observer_list.h" +#include "base/observer_list_types.h" +#include "base/scoped_observation.h" +#include "chrome/browser/private_network_access/chrome_private_network_device_chooser_desktop.h" +#include "chrome/browser/private_network_access/private_network_device_chooser_controller.h" +#include "content/public/browser/render_frame_host.h" + +ChromePrivateNetworkDeviceDelegate::ChromePrivateNetworkDeviceDelegate() = + default; +ChromePrivateNetworkDeviceDelegate::~ChromePrivateNetworkDeviceDelegate() = + default; + +std::unique_ptr<ChromePrivateNetworkDeviceChooser> +ChromePrivateNetworkDeviceDelegate::RunChooser( + content::RenderFrameHost& frame, + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device, + const ChromePrivateNetworkDeviceChooser::EventHandler& event_handler) { + auto controller = std::make_unique<PrivateNetworkDeviceChooserController>( + &frame, std::move(device), std::move(event_handler)); +#if BUILDFLAG(IS_ANDROID) + return nullptr; +#else + return ChromePrivateNetworkDeviceChooserDesktop::Create( + &frame, std::move(controller)); +#endif // BUILDFLAG(IS_ANDROID) +} + +void ChromePrivateNetworkDeviceDelegate::AddObserver( + content::BrowserContext* browser_context, + Observer* observer) { + observer_list_.AddObserver(observer); +} + +void ChromePrivateNetworkDeviceDelegate::RemoveObserver( + content::BrowserContext* browser_context, + Observer* observer) { + observer_list_.RemoveObserver(observer); +}
diff --git a/chrome/browser/private_network_access/chrome_private_network_device_delegate.h b/chrome/browser/private_network_access/chrome_private_network_device_delegate.h new file mode 100644 index 0000000..f9cafe9 --- /dev/null +++ b/chrome/browser/private_network_access/chrome_private_network_device_delegate.h
@@ -0,0 +1,67 @@ +// 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 CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_DELEGATE_H_ +#define CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_CHROME_PRIVATE_NETWORK_DEVICE_DELEGATE_H_ + +#include "base/containers/contains.h" +#include "base/containers/cxx20_erase.h" +#include "base/observer_list.h" +#include "base/observer_list_types.h" +#include "base/scoped_observation.h" +#include "chrome/browser/private_network_access/chrome_private_network_device_chooser.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "third_party/blink/public/mojom/private_network_device/private_network_device.mojom.h" + +namespace url { +class Origin; +} + +namespace content { +class BrowserContext; +class RenderFrameHost; +} // namespace content + +// Interface to support Private Network permission APIs. +class ChromePrivateNetworkDeviceDelegate { + public: + class Observer : public base::CheckedObserver { + public: + virtual void OnDeviceManagerConnectionError() = 0; + virtual void OnPermissionRevoked(const url::Origin& origin) = 0; + }; + + ChromePrivateNetworkDeviceDelegate(); + ChromePrivateNetworkDeviceDelegate(ChromePrivateNetworkDeviceDelegate&) = + delete; + ChromePrivateNetworkDeviceDelegate(ChromePrivateNetworkDeviceDelegate&&) = + delete; + ChromePrivateNetworkDeviceDelegate& operator=( + ChromePrivateNetworkDeviceDelegate&) = delete; + ChromePrivateNetworkDeviceDelegate& operator=( + ChromePrivateNetworkDeviceDelegate&&) = delete; + ~ChromePrivateNetworkDeviceDelegate(); + + // Shows a chooser for the user. `callback` will be run when the prompt is + // closed. Deleting the returned object will cancel the prompt. + std::unique_ptr<ChromePrivateNetworkDeviceChooser> RunChooser( + content::RenderFrameHost& frame, + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device, + const ChromePrivateNetworkDeviceChooser::EventHandler& event_handler); + + // Functions to manage the set of Observer instances registered to this + // object. + void AddObserver(content::BrowserContext* browser_context, + Observer* observer); + void RemoveObserver(content::BrowserContext* browser_context, + Observer* observer); + + private: + base::ObserverList<ChromePrivateNetworkDeviceDelegate::Observer, + /*check_empty=*/true> + observer_list_; +}; + +#endif // CHROME_BROWSER_PRIVATE_NETWORK_DEVICE_DELEGATE_H_
diff --git a/chrome/browser/private_network_access/private_network_device_chooser_controller.cc b/chrome/browser/private_network_access/private_network_device_chooser_controller.cc new file mode 100644 index 0000000..d6919e2 --- /dev/null +++ b/chrome/browser/private_network_access/private_network_device_chooser_controller.cc
@@ -0,0 +1,90 @@ +// 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 "chrome/browser/private_network_access/private_network_device_chooser_controller.h" + +#include <stddef.h> +#include <utility> + +#include "base/functional/bind.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" +#include "chrome/browser/chooser_controller/title_util.h" +#include "chrome/browser/net/referrer.h" +#include "chrome/browser/private_network_access/chrome_private_network_device_chooser.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/url_constants.h" +#include "chrome/grit/generated_resources.h" +#include "components/strings/grit/components_strings.h" +#include "content/public/browser/global_routing_id.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "ui/base/l10n/l10n_util.h" +#include "url/gurl.h" + +using content::RenderFrameHost; +using content::WebContents; + +PrivateNetworkDeviceChooserController::PrivateNetworkDeviceChooserController( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device, + const ChromePrivateNetworkDeviceChooser::EventHandler& event_handler) + : ChooserController( + CreateChooserTitle(render_frame_host, + IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_PROMPT_ORIGIN)), + device_(std::move(device)), + event_handler_(std::move(event_handler)) { + RenderFrameHost* main_frame = render_frame_host->GetMainFrame(); + origin_ = main_frame->GetLastCommittedOrigin(); +} + +PrivateNetworkDeviceChooserController:: + ~PrivateNetworkDeviceChooserController() = default; + +std::u16string PrivateNetworkDeviceChooserController::GetOkButtonLabel() const { + return l10n_util::GetStringUTF16( + IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONNECT_BUTTON_TEXT); +} + +std::u16string PrivateNetworkDeviceChooserController::GetNoOptionsText() const { + return l10n_util::GetStringUTF16(IDS_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT); +} + +std::pair<std::u16string, std::u16string> +PrivateNetworkDeviceChooserController::GetThrobberLabelAndTooltip() const { + return { + l10n_util::GetStringUTF16(IDS_DEVICE_PERMISSIONS_DIALOG_LOADING_LABEL), + l10n_util::GetStringUTF16( + IDS_DEVICE_PERMISSIONS_DIALOG_LOADING_LABEL_TOOLTIP)}; +} +size_t PrivateNetworkDeviceChooserController::NumOptions() const { + return device_ ? 1 : 0; +} + +std::u16string PrivateNetworkDeviceChooserController::GetOption( + size_t index) const { + // PNA permission prompt only allows one device at once. + DCHECK(index == 0); + return l10n_util::GetStringFUTF16(IDS_DEVICE_CHOOSER_DEVICE_NAME_WITH_ID, + base::UTF8ToUTF16(device_->name), + base::UTF8ToUTF16(device_->id)); +} + +void PrivateNetworkDeviceChooserController::Select( + const std::vector<size_t>& indices) {} + +void PrivateNetworkDeviceChooserController::ReplaceDeviceForTesting( + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device) { + device_ = std::move(device); + if (view()) { + view()->OnOptionAdded(0); + } +} + +void PrivateNetworkDeviceChooserController::OpenHelpCenterUrl() const {} + +void PrivateNetworkDeviceChooserController::Cancel() {} + +void PrivateNetworkDeviceChooserController::Close() {}
diff --git a/chrome/browser/private_network_access/private_network_device_chooser_controller.h b/chrome/browser/private_network_access/private_network_device_chooser_controller.h new file mode 100644 index 0000000..9de611d --- /dev/null +++ b/chrome/browser/private_network_access/private_network_device_chooser_controller.h
@@ -0,0 +1,69 @@ +// 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 CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONTROLLER_H_ +#define CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONTROLLER_H_ + +#include <string> +#include <unordered_map> +#include <utility> +#include <vector> + +#include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/scoped_observation.h" +#include "chrome/browser/private_network_access/chrome_private_network_device_chooser.h" +#include "components/permissions/chooser_controller.h" +#include "third_party/blink/public/mojom/private_network_device/private_network_device.mojom.h" +#include "url/origin.h" + +namespace content { +class RenderFrameHost; +} + +// PrivateNetworkDeviceChooserController creates a chooser for Private Network +// Device. +class PrivateNetworkDeviceChooserController + : public permissions::ChooserController { + public: + PrivateNetworkDeviceChooserController( + content::RenderFrameHost* render_frame_host, + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device, + const ChromePrivateNetworkDeviceChooser::EventHandler& event_handler); + + PrivateNetworkDeviceChooserController( + const PrivateNetworkDeviceChooserController&) = delete; + PrivateNetworkDeviceChooserController& operator=( + const PrivateNetworkDeviceChooserController&) = delete; + + ~PrivateNetworkDeviceChooserController() override; + + // Permission::ChooserController: + std::u16string GetOkButtonLabel() const override; + std::u16string GetNoOptionsText() const override; + std::pair<std::u16string, std::u16string> GetThrobberLabelAndTooltip() + const override; + size_t NumOptions() const override; + std::u16string GetOption(size_t index) const override; + void Select(const std::vector<size_t>& indices) override; + void OpenHelpCenterUrl() const override; + void Cancel() override; + void Close() override; + + void ReplaceDeviceForTesting( + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device); + + private: + bool DisplayDevice(const blink::mojom::PrivateNetworkDevice& device) const; + + url::Origin origin_; + + std::unique_ptr<blink::mojom::PrivateNetworkDevice> device_; + const ChromePrivateNetworkDeviceChooser::EventHandler& event_handler_; + + base::WeakPtrFactory<PrivateNetworkDeviceChooserController> weak_factory_{ + this}; +}; + +#endif // CHROME_BROWSER_PRIVATE_NETWORK_ACCESS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONTROLLER_H_
diff --git a/chrome/browser/private_network_access/private_network_device_chooser_controller_unittest.cc b/chrome/browser/private_network_access/private_network_device_chooser_controller_unittest.cc new file mode 100644 index 0000000..862ea5f --- /dev/null +++ b/chrome/browser/private_network_access/private_network_device_chooser_controller_unittest.cc
@@ -0,0 +1,95 @@ +// 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 <utility> + +#include "base/memory/ref_counted.h" +#include "base/run_loop.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/browser/private_network_access/private_network_device_chooser_controller.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "chrome/test/base/testing_profile.h" +#include "components/permissions/mock_chooser_controller_view.h" +#include "content/public/test/web_contents_tester.h" +#include "net/base/ip_address.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/private_network_device/private_network_device.mojom.h" +#include "url/gurl.h" + +using testing::NiceMock; + +namespace { +const char kDefaultTestUrl[] = "https://www.google.com/"; +} // namespace + +class PrivateNetworkDeviceChooserControllerTest + : public ChromeRenderViewHostTestHarness { + public: + PrivateNetworkDeviceChooserControllerTest() = default; + PrivateNetworkDeviceChooserControllerTest( + const PrivateNetworkDeviceChooserControllerTest&) = delete; + PrivateNetworkDeviceChooserControllerTest& operator=( + const PrivateNetworkDeviceChooserControllerTest&) = delete; + + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + + ChromePrivateNetworkDeviceChooser::EventHandler event_handler; + content::WebContentsTester* web_contents_tester = + content::WebContentsTester::For(web_contents()); + web_contents_tester->NavigateAndCommit(GURL(kDefaultTestUrl)); + + private_network_device_chooser_controller_ = + std::make_unique<PrivateNetworkDeviceChooserController>( + main_rfh(), std::make_unique<blink::mojom::PrivateNetworkDevice>(), + std::move(event_handler)); + mock_chooser_view_ = + std::make_unique<NiceMock<permissions::MockChooserControllerView>>(); + private_network_device_chooser_controller_->set_view( + mock_chooser_view_.get()); + base::RunLoop().RunUntilIdle(); + } + + protected: + void CreateAndAddFakePrivateNetworkDevice(const std::string& id, + const std::string& name, + const net::IPAddress& ip_address) { + private_network_device_chooser_controller_->ReplaceDeviceForTesting( + std::make_unique<blink::mojom::PrivateNetworkDevice>(id, name, + ip_address)); + } + + std::unique_ptr<PrivateNetworkDeviceChooserController> + private_network_device_chooser_controller_; + std::unique_ptr<permissions::MockChooserControllerView> mock_chooser_view_; +}; + +// The new added device will overwrite the device list because PNA chooser only +// have one device at a time. +TEST_F(PrivateNetworkDeviceChooserControllerTest, AddDevice) { + EXPECT_CALL(*mock_chooser_view_, OnOptionAdded(0)).Times(3); + CreateAndAddFakePrivateNetworkDevice("a", "001", + net::IPAddress(192, 168, 1, 1)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, private_network_device_chooser_controller_->NumOptions()); + EXPECT_EQ(u"001 (a)", + private_network_device_chooser_controller_->GetOption(0)); + + CreateAndAddFakePrivateNetworkDevice("b", "002", + net::IPAddress(192, 168, 0, 1)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, private_network_device_chooser_controller_->NumOptions()); + EXPECT_EQ(u"002 (b)", + private_network_device_chooser_controller_->GetOption(0)); + + CreateAndAddFakePrivateNetworkDevice("c", "003", + net::IPAddress(127, 0, 0, 1)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, private_network_device_chooser_controller_->NumOptions()); + EXPECT_EQ(u"003 (c)", + private_network_device_chooser_controller_->GetOption(0)); +}
diff --git a/chrome/browser/process_singleton_mac.mm b/chrome/browser/process_singleton_mac.mm index c92f894b..aba9d654 100644 --- a/chrome/browser/process_singleton_mac.mm +++ b/chrome/browser/process_singleton_mac.mm
@@ -9,10 +9,6 @@ #include "base/mac/scoped_aedesc.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { // Extracts the URL from |event| and forwards it to an already-running Chromium
diff --git a/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_delegate.mm b/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_delegate.mm index 4ce94104..bfd77ff3 100644 --- a/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_delegate.mm +++ b/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_delegate.mm
@@ -7,6 +7,7 @@ #include <cmath> #include "base/auto_reset.h" +#include "base/mac/scoped_nsobject.h" #include "base/strings/sys_string_conversions.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/profiles/profile.h" @@ -30,10 +31,6 @@ #include "mojo/public/cpp/bindings/remote.h" #include "services/service_manager/public/cpp/interface_provider.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - @interface ChromeRenderWidgetHostViewMacDelegate () <HistorySwiperDelegate> @property(readonly) content::WebContents* webContents; @@ -48,7 +45,7 @@ int32_t _widgetRoutingId; // Responsible for 2-finger swipes history navigation. - HistorySwiper* __strong _historySwiper; + base::scoped_nsobject<HistorySwiper> _historySwiper; // A boolean set to true while resigning first responder status, to avoid // infinite recursion in the case of reentrance. @@ -61,13 +58,14 @@ if (self) { _widgetProcessId = renderWidgetHost->GetProcess()->GetID(); _widgetRoutingId = renderWidgetHost->GetRoutingID(); - _historySwiper = [[HistorySwiper alloc] initWithDelegate:self]; + _historySwiper.reset([[HistorySwiper alloc] initWithDelegate:self]); } return self; } - (void)dealloc { [_historySwiper setDelegate:nil]; + [super dealloc]; } - (content::WebContents*)webContents {
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb index de695d6..2899eca1 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb
@@ -216,7 +216,7 @@ <translation id="2438712309510062123">Suggérer</translation> <translation id="2450814015951372393">Case à cocher</translation> <translation id="2450992626945324272">aller à la phrase suivante</translation> -<translation id="2461822463642141190">Consommation actuelle</translation> +<translation id="2461822463642141190">Actuellement</translation> <translation id="2462626033734746142">Groupe de cases d'option</translation> <translation id="2467741090055146971">désélectionner</translation> <translation id="2471138580042810658">Titre 6</translation>
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/multi_step_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/multi_step_behavior.js index cd254a2..58a139b 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/multi_step_behavior.js +++ b/chrome/browser/resources/chromeos/login/components/behaviors/multi_step_behavior.js
@@ -141,6 +141,7 @@ this.hideUIStep_(this.uiStep); } this.uiStep = step; + this.shadowRoot.host.setAttribute('multistep', step); this.showUIStep_(this.uiStep); },
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_icons.html b/chrome/browser/resources/chromeos/login/components/oobe_icons.html index 5a763b8..379b9ef 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_icons.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_icons.html
@@ -11,6 +11,21 @@ <path d="M6.66669 13.825L10.7872 10L6.66669 6.175L7.93524 5L13.3334 10L7.93524 15L6.66669 13.825Z"> </path> </g> + <g id="quick-start-android-device" fill-rule="evenodd"> + <path clip-rule="evenodd" + d="M10 0.01L2 0C0.9 0 0 0.9 0 2V16C0 17.1 0.9 18 2 18H10C11.1 18 12 17.1 12 16V2C12 0.9 11.1 0.01 10 0.01ZM10 16H2V15H10V16ZM10 13H2V5H10V13ZM2 3V2H10V3H2Z" + fill="#1A73E8"> + </g> + <g id="quick-start-wifi" viewBox="0 0 28 24" fill-rule="evenodd"> + <path clip-rule="evenodd" + d="M27.3327 6.82473C27.7768 6.25416 27.6543 5.41959 27.0693 5.00669C25.0427 3.57653 20.3461 0.800049 14.0004 0.800049C7.65585 0.800049 2.95812 3.57653 0.931461 5.00669C0.34652 5.41959 0.22395 6.25416 0.668116 6.82473L13.0526 22.7316C13.538 23.356 14.4591 23.356 14.9445 22.7329L27.3327 6.82473Z" + fill="#1A73E8"> + </g> + <g id="quick-start-wifi-grey" fill-rule="evenodd"> + <path clip-rule="evenodd" + d="M1 9.00001L3 11C7.97 6.03001 16.03 6.03001 21 11L23 9.00001C16.93 2.93001 7.08 2.93001 1 9.00001ZM9 17L12 20L15 17C13.35 15.34 10.66 15.34 9 17ZM7 15L5 13C8.87 9.14001 15.14 9.14001 19 13L17 15C14.24 12.24 9.76 12.24 7 15Z" + fill="#616161"> + </g> <g id="hid-touchscreen" fill="none"> <path fill-rule="evenodd" clip-rule="evenodd" d="M4 6.288C4 8.343 5.22 10.125 7 11v1.071c-1.166-.379-2.162-.571-3-.571a1 1 0 00-.832.445l-1 1.5a1 1 0 00.08 1.213l3.5 4A1 1 0 006.5 19h7a1 1 0 00.894-.553l2.5-5A.999.999 0 0017 13c0-.734-.408-1.244-1.257-1.911a91.893 91.893 0 00-1.999-1.437A5.145 5.145 0 0015 6.288C15 3.368 12.538 1 9.5 1S4 3.368 4 6.288zm8 2.356V6.5a2.5 2.5 0 00-5 0V11 8.644a3.29 3.29 0 01-1-2.356C6 4.43 7.567 2.923 9.5 2.923S13 4.43 13 6.288a3.29 3.29 0 01-1 2.356zM9 13.5a1 1 0 01-1.371.928c-1.269-.507-2.312-.803-3.115-.896l-.257.386L6.954 17h5.928l2.006-4.012a4.803 4.803 0 00-.38-.327c-.285-.223-1.718-1.235-2.323-1.661H10V6.5a.5.5 0 00-1 0v7z" fill="#5F6368"> </path>
diff --git a/chrome/browser/resources/chromeos/login/oobe.css b/chrome/browser/resources/chromeos/login/oobe.css index 5da8de0..259900f 100644 --- a/chrome/browser/resources/chromeos/login/oobe.css +++ b/chrome/browser/resources/chromeos/login/oobe.css
@@ -231,10 +231,10 @@ :root.simon-enabled[dir=rtl] #oobe.connect #welcome-backdrop { transform: scaleX(-100%); } -:root.simon-enabled #oobe.connect #welcome-backdrop { +:root.simon-enabled #oobe.connect #welcome-backdrop:has(~[multistep=greeting]) { display: block; } -:root.simon-enabled #oobe.connect #inner-container { +:root.simon-enabled #oobe.connect #inner-container:has([multistep=greeting]) { background-color: transparent; }
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html index ccdbf0c..aba47b8 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html
@@ -212,14 +212,16 @@ > </oobe-icon-button> </div> - <div id="bottomButtons"> - <oobe-text-button + <div id="bottomButtons" class="layout horizontal"> + <oobe-icon-button id="quickStart" on-click="onQuickStartClicked_" hidden="[[!isQuickStartEnabled]]" text-key="welcomeScreenQuickStart" + icon1x="oobe-20:quick-start-android-device" + icon2x="oobe-20:quick-start-android-device" > - </oobe-text-button> + </oobe-icon-button> <oobe-text-button id="getStarted" inverse
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts index 02f832d..cdb1c27f 100644 --- a/chrome/browser/resources/side_panel/read_anything/app.ts +++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -164,6 +164,13 @@ chrome.readAnything.onSelectionChange( anchorNodeId, anchorOffset, focusNodeId, focusOffset); }; + + // Pass copy commands to main page. Copy commands will not work if they are + // disabled on the main page. + document.oncopy = () => { + chrome.readAnything.onCopy(); + return false; + }; } private buildSubtree_(nodeId: number): Node {
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts index d4faa26c..8748c6e 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
@@ -64,6 +64,10 @@ // element is added to the document. function onConnected(): void; + // Called when a user tries to copy text from reading mode with keyboard + // shortcuts. + function onCopy(): void; + // Called when a user clicks a link. NodeID is an AXNodeID which identifies // the link's corresponding AXNode in the main pane. function onLinkClicked(nodeId: number): void;
diff --git a/chrome/browser/shell_integration_mac.mm b/chrome/browser/shell_integration_mac.mm index 4932c27..7bb33b1e 100644 --- a/chrome/browser/shell_integration_mac.mm +++ b/chrome/browser/shell_integration_mac.mm
@@ -7,7 +7,6 @@ #include <AppKit/AppKit.h> #include <UniformTypeIdentifiers/UniformTypeIdentifiers.h> -#include "base/apple/bridging.h" #include "base/apple/bundle_locations.h" #include "base/mac/foundation_util.h" #include "base/mac/mac_util.h" @@ -18,10 +17,6 @@ #include "components/version_info/version_info.h" #import "net/base/mac/url_conversions.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace shell_integration { namespace { @@ -72,7 +67,7 @@ // We really do want the outer bundle here, not the main bundle since // setting a shortcut to Chrome as the default browser doesn't make sense. CFStringRef identifier = - base::apple::NSToCFPtrCast(base::apple::OuterBundle().bundleIdentifier); + base::mac::NSToCFCast(base::apple::OuterBundle().bundleIdentifier); if (!identifier) { return false; } @@ -145,9 +140,8 @@ } NSString* scheme_ns = base::SysUTF8ToNSString(scheme); - OSStatus return_code = - LSSetDefaultHandlerForURLScheme(base::apple::NSToCFPtrCast(scheme_ns), - base::apple::NSToCFPtrCast(identifier)); + OSStatus return_code = LSSetDefaultHandlerForURLScheme( + base::mac::NSToCFCast(scheme_ns), base::mac::NSToCFCast(identifier)); return return_code == noErr; } } @@ -180,8 +174,9 @@ app_urls = [NSWorkspace.sharedWorkspace URLsForApplicationsToOpenURL:ns_url]; } else { - app_urls = base::apple::CFToNSOwnershipCast(LSCopyApplicationURLsForURL( - base::apple::NSToCFPtrCast(ns_url), kLSRolesAll)); + CFArrayRef urls = + LSCopyApplicationURLsForURL(base::mac::NSToCFCast(ns_url), kLSRolesAll); + app_urls = [base::mac::CFToNSCast(urls) autorelease]; } if (app_urls.count == 0) { @@ -200,8 +195,8 @@ NSURL* ns_item_url = net::NSURLWithGURL(url); NSURL* ns_app_url = base::mac::FilePathToNSURL(app_path); Boolean result = FALSE; - LSCanURLAcceptURL(base::apple::NSToCFPtrCast(ns_item_url), - base::apple::NSToCFPtrCast(ns_app_url), kLSRolesAll, + LSCanURLAcceptURL(base::mac::NSToCFCast(ns_item_url), + base::mac::NSToCFCast(ns_app_url), kLSRolesAll, kLSAcceptDefault, &result); return result; }
diff --git a/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager.cc b/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager.cc index 290d20d..cebaed5 100644 --- a/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager.cc +++ b/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager.cc
@@ -10,12 +10,10 @@ #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/install_prompt_permissions.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/supervised_user/supervised_user_browser_utils.h" #include "chrome/browser/supervised_user/supervised_user_extensions_metrics_recorder.h" -#include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/browser/ui/webui/ash/parent_access/parent_access_dialog.h" #include "chrome/browser/ui/webui/ash/parent_access/parent_access_ui.mojom.h" -#include "components/supervised_user/core/browser/supervised_user_service.h" -#include "components/user_manager/user_manager.h" #include "content/public/browser/browser_context.h" #include "extensions/browser/supervised_user_extensions_delegate.h" #include "extensions/common/extension.h" @@ -24,14 +22,6 @@ #include "ui/gfx/image/image_skia.h" namespace { - -std::u16string GetActiveUserFirstName() { - // TODO(b/250924204): Support fetching active user name in LaCrOS. - user_manager::UserManager* manager = user_manager::UserManager::Get(); - const user_manager::User* user = manager->GetActiveUser(); - return user->GetGivenName(); -} - extensions::TestExtensionApprovalsManagerObserver* test_observer = nullptr; } // namespace @@ -49,11 +39,14 @@ const gfx::ImageSkia& icon, ExtensionInstallMode extension_install_mode, SupervisedUserExtensionsDelegate::ExtensionApprovalDoneCallback callback) { + Profile* profile = Profile::FromBrowserContext(context); + CHECK(profile); + // Load permission strings. InstallPromptPermissions prompt_permissions; std::unique_ptr<const PermissionSet> permissions_to_display = util::GetInstallPromptPermissionSetForExtension( - &extension, Profile::FromBrowserContext(context), + &extension, profile, // Matches behavior of regular extension install prompt because this // prompt is never used for delegated permissions, which is the only // time optional permissions are shown. @@ -77,7 +70,9 @@ parent_access_ui::mojom::FlowTypeParams::NewExtensionApprovalsParams( parent_access_ui::mojom::ExtensionApprovalsParams::New( base::UTF8ToUTF16(extension.name()), icon_bitmap, - GetActiveUserFirstName(), std::move(permissions))), + base::UTF8ToUTF16( + supervised_user::GetAccountGivenName(*profile)), + std::move(permissions))), /* is_disabled= */ extension_install_mode == ExtensionInstallMode::kInstallationDenied);
diff --git a/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager_unittest.cc b/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager_unittest.cc index 81e0ad0..b862bbc3 100644 --- a/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager_unittest.cc +++ b/chrome/browser/supervised_user/chromeos/parent_access_extension_approvals_manager_unittest.cc
@@ -10,14 +10,14 @@ #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/supervised_user/supervised_user_test_util.h" #include "chrome/browser/ui/webui/ash/parent_access/parent_access_dialog.h" #include "chrome/browser/ui/webui/ash/parent_access/parent_access_ui.mojom.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" -#include "chrome/test/base/testing_profile_manager.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/supervised_user/core/common/supervised_user_constants.h" #include "content/public/test/browser_task_environment.h" #include "extensions/browser/extension_util.h" @@ -29,8 +29,7 @@ namespace { constexpr char kTestProfileName[] = "child@gmail.com"; -constexpr char16_t kTestProfileName16[] = u"child@gmail.com"; -constexpr char kTestGaiaId[] = "1234567890"; +constexpr char kTestGivenName[] = "Tester"; constexpr char16_t kTestGivenName16[] = u"Tester"; constexpr char kTestExtensionName[] = "extension"; constexpr char16_t kTestExtensionName16[] = u"extension"; @@ -72,6 +71,7 @@ void SetUp() override { CreateSupervisedUser(); + approvals_manager_ = std::make_unique<extensions::ParentAccessExtensionApprovalsManager>(); dialog_provider_ = static_cast<FakeParentAccessDialogProvider*>( @@ -80,43 +80,41 @@ } protected: - ash::FakeChromeUserManager* GetFakeUserManager() const { - return static_cast<ash::FakeChromeUserManager*>( - user_manager::UserManager::Get()); - } - void CreateSupervisedUser() { - profile_manager_ = std::make_unique<TestingProfileManager>( - TestingBrowserProcess::GetGlobal()); - ASSERT_TRUE(profile_manager_->SetUp()); - profile_ = profile_manager_->CreateTestingProfile( - kTestProfileName, {}, kTestProfileName16, 0, - IdentityTestEnvironmentProfileAdaptor:: - GetIdentityTestEnvironmentFactories(), - /*is_supervised_profile=*/true); - supervised_user_test_util::AddCustodians(profile_); - AddUserToUserManager(); + TestingProfile::Builder builder; + builder.SetIsSupervisedProfile(); + profile_ = IdentityTestEnvironmentProfileAdaptor:: + CreateProfileForIdentityTestEnvironment(builder); + + identity_test_env_profile_adaptor_ = + std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get()); + + AccountInfo account_info = + GetIdentityTestEnv()->MakePrimaryAccountAvailable( + kTestProfileName, signin::ConsentLevel::kSignin); + supervised_user_test_util::PopulateAccountInfoWithName(account_info, + kTestGivenName); + GetIdentityTestEnv()->UpdateAccountInfoForAccount(account_info); + + supervised_user_test_util::AddCustodians(profile()); } - void AddUserToUserManager() { - AccountId account_id = - AccountId::FromUserEmailGaiaId(kTestProfileName, kTestGaiaId); - GetFakeUserManager()->AddUser(account_id); - GetFakeUserManager()->LoginUser(account_id); - GetFakeUserManager()->SwitchActiveUser(account_id); - GetFakeUserManager()->UpdateUserAccountData( - account_id, user_manager::UserManager::UserAccountData( - /*display_name=*/std::u16string(), - /*given_name=*/kTestGivenName16, - /*locale=*/std::string())); + signin::IdentityTestEnvironment* GetIdentityTestEnv() { + return identity_test_env_profile_adaptor_->identity_test_env(); } + Profile* profile() { return profile_.get(); } + content::BrowserTaskEnvironment task_environment_; + std::unique_ptr<extensions::ParentAccessExtensionApprovalsManager> approvals_manager_; - raw_ptr<TestingProfile> profile_; - std::unique_ptr<TestingProfileManager> profile_manager_; + std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> + identity_test_env_profile_adaptor_; + std::unique_ptr<TestingProfile> profile_; + raw_ptr<FakeParentAccessDialogProvider> dialog_provider_ = nullptr; + base::test::ScopedFeatureList scoped_feature_list_; }; @@ -124,7 +122,7 @@ scoped_refptr<const extensions::Extension> extension = extensions::ExtensionBuilder(kTestExtensionName).Build(); approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::DoNothing()); @@ -160,7 +158,7 @@ scoped_refptr<const extensions::Extension> extension = extensions::ExtensionBuilder(kTestExtensionName).Build(); approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationDenied, base::DoNothing()); @@ -181,7 +179,7 @@ extensions::ExtensionBuilder(kTestExtensionName).Build(); base::RunLoop run_loop; approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::BindOnce( @@ -206,7 +204,7 @@ extensions::ExtensionBuilder(kTestExtensionName).Build(); base::RunLoop run_loop; approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::BindOnce( @@ -231,7 +229,7 @@ extensions::ExtensionBuilder(kTestExtensionName).Build(); base::RunLoop run_loop; approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::BindOnce( @@ -256,7 +254,7 @@ extensions::ExtensionBuilder(kTestExtensionName).Build(); base::RunLoop run_loop; approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::BindOnce( @@ -281,7 +279,7 @@ extensions::ExtensionBuilder(kTestExtensionName).Build(); base::RunLoop run_loop; approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::BindOnce( @@ -308,7 +306,7 @@ extensions::ExtensionBuilder(kTestExtensionName).Build(); base::RunLoop run_loop; approvals_manager_->ShowParentAccessDialog( - *extension, profile_, extensions::util::GetDefaultExtensionIcon(), + *extension, profile(), extensions::util::GetDefaultExtensionIcon(), extensions::ParentAccessExtensionApprovalsManager::ExtensionInstallMode:: kInstallationPermitted, base::BindOnce(
diff --git a/chrome/browser/supervised_user/supervised_user_browser_utils.cc b/chrome/browser/supervised_user/supervised_user_browser_utils.cc index badfe29..a80aedf3 100644 --- a/chrome/browser/supervised_user/supervised_user_browser_utils.cc +++ b/chrome/browser/supervised_user/supervised_user_browser_utils.cc
@@ -8,12 +8,18 @@ #include "base/check.h" #include "base/feature_list.h" #include "base/strings/string_util.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_selections.h" +#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/common/url_constants.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/identity_manager/account_info.h" +#include "components/signin/public/identity_manager/identity_manager.h" #include "components/supervised_user/core/common/features.h" #include "components/url_matcher/url_util.h" #include "extensions/buildflags/buildflags.h" #include "extensions/common/extension_urls.h" +#include "google_apis/gaia/core_account_id.h" #include "url/url_constants.h" namespace supervised_user { @@ -85,4 +91,16 @@ .Build(); } +std::string GetAccountGivenName(Profile& profile) { + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(&profile); + CHECK(identity_manager); + + const CoreAccountInfo core_info = + identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin); + const AccountInfo account_info = + identity_manager->FindExtendedAccountInfo(core_info); + return account_info.given_name; +} + } // namespace supervised_user
diff --git a/chrome/browser/supervised_user/supervised_user_browser_utils.h b/chrome/browser/supervised_user/supervised_user_browser_utils.h index afa565b5..2cf6cb9 100644 --- a/chrome/browser/supervised_user/supervised_user_browser_utils.h +++ b/chrome/browser/supervised_user/supervised_user_browser_utils.h
@@ -6,10 +6,13 @@ #ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_BROWSER_UTILS_H_ #define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_BROWSER_UTILS_H_ +#include <string> + #include "content/public/browser/web_contents.h" #include "url/gurl.h" class ProfileSelections; +class Profile; namespace supervised_user { @@ -28,6 +31,9 @@ // `supervised_user::kUpdateSupervisedUserFactoryCreation` feature is enabled. ProfileSelections BuildProfileSelectionsLegacy(); +// Returns given name of the primary account associated with the profile. +std::string GetAccountGivenName(Profile& profile); + } // namespace supervised_user #endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_BROWSER_UTILS_H_
diff --git a/chrome/browser/supervised_user/supervised_user_browser_utils_unittest.cc b/chrome/browser/supervised_user/supervised_user_browser_utils_unittest.cc new file mode 100644 index 0000000..1cdd407 --- /dev/null +++ b/chrome/browser/supervised_user/supervised_user_browser_utils_unittest.cc
@@ -0,0 +1,66 @@ +// 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 "chrome/browser/supervised_user/supervised_user_browser_utils.h" + +#include <memory> +#include <string> + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" +#include "chrome/browser/supervised_user/supervised_user_test_util.h" +#include "chrome/test/base/testing_profile.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/identity_manager/account_info.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { +constexpr char kChildEmail[] = "name@gmail.com"; +constexpr char kChildGivenName[] = "Name"; +} // namespace + +class SupervisedUserBrowserUtilsTest : public ::testing::Test { + public: + SupervisedUserBrowserUtilsTest(); + + signin::IdentityTestEnvironment* GetIdentityTestEnv(); + + Profile* profile() { return profile_.get(); } + + private: + content::BrowserTaskEnvironment task_environment_; + + std::unique_ptr<TestingProfile> profile_; + std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> + identity_test_env_profile_adaptor_; +}; + +SupervisedUserBrowserUtilsTest::SupervisedUserBrowserUtilsTest() { + TestingProfile::Builder builder; + builder.SetIsSupervisedProfile(); + profile_ = IdentityTestEnvironmentProfileAdaptor:: + CreateProfileForIdentityTestEnvironment(builder); + + identity_test_env_profile_adaptor_ = + std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get()); + + AccountInfo account_info = GetIdentityTestEnv()->MakePrimaryAccountAvailable( + kChildEmail, signin::ConsentLevel::kSignin); + supervised_user_test_util::PopulateAccountInfoWithName(account_info, + kChildGivenName); + GetIdentityTestEnv()->UpdateAccountInfoForAccount(account_info); +} + +signin::IdentityTestEnvironment* +SupervisedUserBrowserUtilsTest::GetIdentityTestEnv() { + return identity_test_env_profile_adaptor_->identity_test_env(); +} + +TEST_F(SupervisedUserBrowserUtilsTest, GetAccountGivenName) { + ASSERT_NE(nullptr, profile()); + EXPECT_EQ(kChildGivenName, supervised_user::GetAccountGivenName(*profile())); +}
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc index 9f97aac..2eaf250 100644 --- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc +++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -5,13 +5,16 @@ #include "chrome/browser/supervised_user/supervised_user_navigation_observer.h" #include <memory> +#include <string> #include <utility> +#include "base/check.h" #include "base/containers/contains.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/utf_string_conversions.h" #include "chrome/browser/favicon/large_icon_service_factory.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -318,12 +321,14 @@ const OnInterstitialResultCallback& callback) { Profile* profile = Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + CHECK(profile); auto web_content_handler = CreateWebContentHandler( web_contents(), url, profile, frame_id, navigation_id); CHECK(web_content_handler); std::unique_ptr<supervised_user::SupervisedUserInterstitial> interstitial = supervised_user::SupervisedUserInterstitial::Create( std::move(web_content_handler), *supervised_user_service_, url, + base::UTF8ToUTF16(supervised_user::GetAccountGivenName(*profile)), reason); supervised_user_interstitials_[frame_id] = std::move(interstitial);
diff --git a/chrome/browser/supervised_user/supervised_user_test_util.cc b/chrome/browser/supervised_user/supervised_user_test_util.cc index 8ddbfb3..7556940 100644 --- a/chrome/browser/supervised_user/supervised_user_test_util.cc +++ b/chrome/browser/supervised_user/supervised_user_test_util.cc
@@ -4,10 +4,14 @@ #include "chrome/browser/supervised_user/supervised_user_test_util.h" +#include <string> + +#include "base/check.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_key.h" #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" #include "components/prefs/pref_service.h" +#include "components/signin/public/identity_manager/account_info.h" #include "components/supervised_user/core/browser/supervised_user_settings_service.h" #include "components/supervised_user/core/common/pref_names.h" #include "components/supervised_user/core/common/supervised_user_constants.h" @@ -43,4 +47,15 @@ prefs::kSupervisedUserExtensionsMayRequestPermissions, enabled); } +void PopulateAccountInfoWithName(AccountInfo& info, + const std::string& given_name) { + info.given_name = given_name; + info.full_name = "fullname"; + info.hosted_domain = "example.com"; + info.locale = "en"; + info.picture_url = "https://example.com"; + + CHECK(info.IsValid()); +} + } // namespace supervised_user_test_util
diff --git a/chrome/browser/supervised_user/supervised_user_test_util.h b/chrome/browser/supervised_user/supervised_user_test_util.h index 23630123..c6e9bc5 100644 --- a/chrome/browser/supervised_user/supervised_user_test_util.h +++ b/chrome/browser/supervised_user/supervised_user_test_util.h
@@ -5,6 +5,9 @@ #ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_TEST_UTIL_H_ #define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_TEST_UTIL_H_ +#include <string> + +struct AccountInfo; class Profile; namespace supervised_user_test_util { @@ -16,6 +19,11 @@ void SetSupervisedUserExtensionsMayRequestPermissionsPref(Profile* profile, bool enabled); +// Populates account info with a `given_name` and other fake data needed for a +// valid `AccountInfo` structure. +void PopulateAccountInfoWithName(AccountInfo& info, + const std::string& given_name); + } // namespace supervised_user_test_util #endif // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_TEST_UTIL_H_
diff --git a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc index bc28856..3b6cd84d 100644 --- a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
@@ -5,6 +5,7 @@ #include <map> #include "base/files/file_util.h" +#include "base/json/json_reader.h" #include "base/path_service.h" #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" @@ -401,6 +402,196 @@ .Wait()); } +// TODO(crbug.com/1416480): Consider making other fixtures parameterized with +// `kSyncEnablePersistentStorageForAccountPreferences` flag enabled and disabled +// both. +class SingleClientPreferencesWithPersistentAccountStorageSyncTest + : public SingleClientPreferencesWithAccountStorageSyncTest { + public: + SingleClientPreferencesWithPersistentAccountStorageSyncTest() + : feature_list_( + syncer::kSyncEnablePersistentStorageForAccountPreferences) {} + + bool DoesAccountPreferencesFileExist() const { + base::ScopedAllowBlockingForTesting allow_blocking; + base::FilePath file_path = + GetProfile(0)->GetPath().Append(chrome::kAccountPreferencesFilename); + return base::PathExists(file_path); + } + + absl::optional<base::Value> GetAccountPreferencesFileContent() const { + base::ScopedAllowBlockingForTesting allow_blocking; + + base::FilePath file_path = + GetProfile(0)->GetPath().Append(chrome::kAccountPreferencesFilename); + std::string json_content; + EXPECT_TRUE(base::ReadFileToString(file_path, &json_content)); + return base::JSONReader::Read(json_content); + } + + void CommitToDiskAndWait() const { + base::RunLoop loop; + GetPrefs(0)->CommitPendingWrite(loop.QuitClosure()); + loop.Run(); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_F( + SingleClientPreferencesWithPersistentAccountStorageSyncTest, + ShouldCleanupAccountPreferencesFileOnDisable) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + // Register `sync_preferences::kSyncablePrefForTesting`. + GetRegistry(GetProfile(0)) + ->RegisterStringPref(sync_preferences::kSyncablePrefForTesting, "", + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + preferences_helper::ChangeStringPref( + 0, sync_preferences::kSyncablePrefForTesting, "local value"); + + InjectPreferenceToFakeServer(syncer::PREFERENCES, + sync_preferences::kSyncablePrefForTesting, + base::Value("account value")); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + // Fake server value is synced to the account store and overrides local value. + ASSERT_EQ(GetPrefs(0)->GetString(sync_preferences::kSyncablePrefForTesting), + "account value"); + + CommitToDiskAndWait(); + ASSERT_TRUE(DoesAccountPreferencesFileExist()); + + // Verify file content, `kSyncablePrefForTesting` is present. + absl::optional<base::Value> file_content = GetAccountPreferencesFileContent(); + ASSERT_TRUE(file_content.has_value() && file_content->is_dict()); + + std::string* value = file_content->GetDict().FindString( + sync_preferences::kSyncablePrefForTesting); + ASSERT_TRUE(value); + EXPECT_EQ(*value, "account value"); + + // Disable syncing preferences. This should lead to clearing of account prefs + // file. + ASSERT_TRUE(GetClient(0)->DisableSyncForType( + syncer::UserSelectableType::kPreferences)); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + ASSERT_EQ(GetPrefs(0)->GetString(sync_preferences::kSyncablePrefForTesting), + "local value"); + + CommitToDiskAndWait(); + + // Account prefs have been removed from the file. + file_content = GetAccountPreferencesFileContent(); + ASSERT_TRUE(file_content.has_value() && file_content->is_dict()); + EXPECT_TRUE(file_content->GetDict().empty()); +} + +#if !BUILDFLAG(IS_CHROMEOS) + +IN_PROC_BROWSER_TEST_F( + SingleClientPreferencesWithPersistentAccountStorageSyncTest, + ShouldCleanupAccountPreferencesFileOnSignout) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + // Register `sync_preferences::kSyncablePrefForTesting`. + GetRegistry(GetProfile(0)) + ->RegisterStringPref(sync_preferences::kSyncablePrefForTesting, "", + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + preferences_helper::ChangeStringPref( + 0, sync_preferences::kSyncablePrefForTesting, "local value"); + + InjectPreferenceToFakeServer(syncer::PREFERENCES, + sync_preferences::kSyncablePrefForTesting, + base::Value("account value")); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + // Fake server value is synced to the account store and overrides local value. + ASSERT_EQ(GetPrefs(0)->GetString(sync_preferences::kSyncablePrefForTesting), + "account value"); + + CommitToDiskAndWait(); + ASSERT_TRUE(DoesAccountPreferencesFileExist()); + + // Verify file content, `kSyncablePrefForTesting` is present. + absl::optional<base::Value> file_content = GetAccountPreferencesFileContent(); + ASSERT_TRUE(file_content.has_value() && file_content->is_dict()); + + std::string* value = file_content->GetDict().FindString( + sync_preferences::kSyncablePrefForTesting); + ASSERT_TRUE(value); + EXPECT_EQ(*value, "account value"); + + // Signout. This should lead to clearing of account prefs file. + GetClient(0)->SignOutPrimaryAccount(); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + ASSERT_EQ(GetPrefs(0)->GetString(sync_preferences::kSyncablePrefForTesting), + "local value"); + + CommitToDiskAndWait(); + + // Account prefs have been removed from the file. + file_content = GetAccountPreferencesFileContent(); + ASSERT_TRUE(file_content.has_value() && file_content->is_dict()); + EXPECT_TRUE(file_content->GetDict().empty()); +} + +#endif // !BUILDFLAG(IS_CHROMEOS) + +// TODO(crbug.com/1416480): Disabled until after the getters in +// DualLayerUserPrefStore have been fixed to handle pre-existing values. +IN_PROC_BROWSER_TEST_F(SingleClientPreferencesWithAccountStorageSyncTest, + DISABLED_PRE_ShouldLoadAccountPreferencesFromFile) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + // Register `sync_preferences::kSyncablePrefForTesting`. + GetRegistry(GetProfile(0)) + ->RegisterStringPref(sync_preferences::kSyncablePrefForTesting, "", + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + preferences_helper::ChangeStringPref( + 0, sync_preferences::kSyncablePrefForTesting, "local value"); + + InjectPreferenceToFakeServer(syncer::PREFERENCES, + sync_preferences::kSyncablePrefForTesting, + base::Value("account value")); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + // Fake server value is synced to the account store and overrides local value. + ASSERT_EQ(GetPrefs(0)->GetString(sync_preferences::kSyncablePrefForTesting), + "account value"); +} + +// TODO(crbug.com/1416480): Disabled until after the getters in +// DualLayerUserPrefStore have been fixed to handle pre-existing values. +IN_PROC_BROWSER_TEST_F(SingleClientPreferencesWithAccountStorageSyncTest, + DISABLED_ShouldLoadAccountPreferencesFromFile) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + // Register `sync_preferences::kSyncablePrefForTesting`. + GetRegistry(GetProfile(0)) + ->RegisterStringPref(sync_preferences::kSyncablePrefForTesting, "", + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + EXPECT_EQ(GetPrefs(0)->GetString(sync_preferences::kSyncablePrefForTesting), + "account value"); +} + using SingleClientPreferencesWithAccountStorageMergeSyncTest = SingleClientPreferencesWithAccountStorageSyncTest;
diff --git a/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc b/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc index 7dee188..60878cb3 100644 --- a/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc
@@ -409,6 +409,10 @@ EXPECT_TRUE(AutofillProfileChecker(0, 1, /*expected_count=*/1U).Wait()); } +// Tests that values exceeding `AutofillTable::kMaxDataLength` are truncated. +// TODO(crbug.com/1443393): As of the unified table layout, values are already +// truncated in AutofillTable. No special logic on the Sync-side is necessary. +// Clean this up. IN_PROC_BROWSER_TEST_F(TwoClientAutofillProfileSyncTest, ExceedsMaxLength) { ASSERT_TRUE(SetupSync()); @@ -427,9 +431,17 @@ UpdateProfile(0, GetAllAutoFillProfiles(0)[0]->guid(), AutofillType(autofill::ADDRESS_HOME_LINE1), exceeds_max_length_string); + // The values stored on clients 0 are already truncated. + AutofillProfile* profile = GetAllAutoFillProfiles(0)[0]; + for (const auto type : + {autofill::NAME_FIRST, autofill::NAME_LAST, autofill::EMAIL_ADDRESS, + autofill::ADDRESS_HOME_LINE1}) { + EXPECT_EQ(profile->GetRawInfo(type).size(), AutofillTable::kMaxDataLength); + } ASSERT_TRUE(AwaitQuiescence()); - EXPECT_FALSE(ProfilesMatch(0, 1)); + // Both clients store the truncated values. + EXPECT_TRUE(ProfilesMatch(0, 1)); } // Test credit cards don't sync.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabState.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabState.java index 884db59..85f9c11 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabState.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabState.java
@@ -14,8 +14,8 @@ * Object that contains the state of a tab, including its navigation history. */ public class TabState { - /** Special value for mTimestampMillis. */ - private static final long TIMESTAMP_NOT_SET = -1; + /** Special value for timestamp related attributes. */ + public static final long TIMESTAMP_NOT_SET = -1; /** A theme color that indicates an unspecified state. */ public static final int UNSPECIFIED_THEME_COLOR = Color.TRANSPARENT; @@ -42,6 +42,8 @@ /** Tab level Request Desktop Site setting. */ public @TabUserAgent int userAgent; + public long lastNavigationCommittedTimestampMillis = TIMESTAMP_NOT_SET; + public boolean isIncognito() { return isIncognito; }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java index bc361cc..d9224c3 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
@@ -76,7 +76,8 @@ : flatBuffer.openerAppId(), flatBuffer.contentStateVersion(), flatBuffer.themeColor(), getLaunchType(flatBuffer.launchTypeAtCreation()), - getTabUserAgentType(flatBuffer.userAgent())); + getTabUserAgentType(flatBuffer.userAgent()), + flatBuffer.lastNavigationCommittedTimestampMillis()); } catch (Exception e) { // TODO(crbug.com/1294613) Add in some metrics recording how often this // happens. @@ -103,6 +104,7 @@ private int mParentId; private int mRootId; private long mTimestampMillis; + private long mLastNavigationCommittedTimestampMillis = INVALID_TIMESTAMP; /** * Navigation state of the WebContents as returned by nativeGetContentsStateAsByteBuffer(), * stored to be inflated on demand using unfreezeContents(). If this is not null, there is no @@ -151,7 +153,8 @@ CriticalPersistedTabData(Tab tab, String url, String title, int parentId, int rootId, long timestampMillis, WebContentsState webContentsState, int contentStateVersion, String openerAppId, int themeColor, - @Nullable @TabLaunchType Integer launchTypeAtCreation, @TabUserAgent int userAgent) { + @Nullable @TabLaunchType Integer launchTypeAtCreation, @TabUserAgent int userAgent, + long lastNavigationCommittedTimestampMillis) { this(tab); mUrl = url == null || url.isEmpty() ? GURL.emptyGURL() : new GURL(url); mTitle = title; @@ -164,6 +167,7 @@ mThemeColor = themeColor; mTabLaunchTypeAtCreation = launchTypeAtCreation; mUserAgent = userAgent; + mLastNavigationCommittedTimestampMillis = lastNavigationCommittedTimestampMillis; } /** @@ -194,7 +198,7 @@ serialized.getRootId(), serialized.getTimestampMillis(), serialized.getWebContentsState(), serialized.getWebContentsStateVersion(), serialized.getOpenerAppId(), serialized.getThemeColor(), serialized.getLaunchType(), - serialized.getUserAgent()); + serialized.getUserAgent(), serialized.getLastNavigationCommittedTimestampMillis()); } /** @@ -269,7 +273,7 @@ // CriticalPersistedTabData is initialized with default values CriticalPersistedTabData criticalPersistedTabData = new CriticalPersistedTabData(tab, "", "", Tab.INVALID_TAB_ID, tab.getId(), INVALID_TIMESTAMP, null, -1, "", - UNSPECIFIED_THEME_COLOR, null, TabUserAgent.DEFAULT); + UNSPECIFIED_THEME_COLOR, null, TabUserAgent.DEFAULT, INVALID_TIMESTAMP); criticalPersistedTabData.save(); return criticalPersistedTabData; } @@ -287,6 +291,8 @@ mParentId = deserialized.parentId(); mRootId = deserialized.rootId(); mTimestampMillis = deserialized.timestampMillis(); + mLastNavigationCommittedTimestampMillis = + deserialized.lastNavigationCommittedTimestampMillis(); ByteBuffer webContentsState = deserialized.webContentsStateBytesAsByteBuffer(); mWebContentsState = new WebContentsState(webContentsState == null ? ByteBuffer.allocateDirect(0) @@ -506,6 +512,7 @@ private int mThemeColorSnapshot; private int mLaunchTypeSnapshot; private int mUserAgentTypeSnapshot; + private long mLastNavigationCommittedTimestampMillisSnapshot; private boolean mPreSerialized; @Override @@ -540,6 +547,8 @@ CriticalPersistedTabDataFlatBuffer.addLaunchTypeAtCreation( fbb, mLaunchTypeSnapshot); CriticalPersistedTabDataFlatBuffer.addUserAgent(fbb, mUserAgentTypeSnapshot); + CriticalPersistedTabDataFlatBuffer.addLastNavigationCommittedTimestampMillis( + fbb, mLastNavigationCommittedTimestampMillisSnapshot); int r = CriticalPersistedTabDataFlatBuffer .endCriticalPersistedTabDataFlatBuffer(fbb); fbb.finish(r); @@ -568,6 +577,8 @@ mThemeColorSnapshot = mThemeColor; mLaunchTypeSnapshot = getLaunchType(mTabLaunchTypeAtCreation); mUserAgentTypeSnapshot = getUserAgentType(mUserAgent); + mLastNavigationCommittedTimestampMillisSnapshot = + mLastNavigationCommittedTimestampMillis; } mPreSerialized = true; } @@ -732,6 +743,28 @@ } /** + * @return timestamp in milliseconds when the tab was last interacted. + */ + public long getLastNavigationCommittedTimestampMillis() { + return mLastNavigationCommittedTimestampMillis; + } + + /** + * Set the last hidden timestamp. + * + * @param lastNavigationCommittedTimestampMillis The timestamp when the tab was last interacted. + */ + public void setLastNavigationCommittedTimestampMillis( + long lastNavigationCommittedTimestampMillis) { + if (mLastNavigationCommittedTimestampMillis == lastNavigationCommittedTimestampMillis) { + return; + } + + mLastNavigationCommittedTimestampMillis = lastNavigationCommittedTimestampMillis; + save(); + } + + /** * @return content state bytes for the {@link Tab} */ public WebContentsState getWebContentsState() {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData.java index e437b15..2b2f0c5 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/SerializedCriticalPersistedTabData.java
@@ -24,6 +24,7 @@ private final int mThemeColor; private final @Nullable @TabLaunchType Integer mLaunchTypeAtCreation; private final @TabUserAgent int mUserAgent; + private final long mLastNavigationCommittedTimestampMillis; /** * @param parentId parent identifier for a {@link Tab} @@ -37,11 +38,13 @@ * @param themeColor theme color of the {@link Tab} * @param launchTypeAtCreation the way the {@link Tab} was launched * @param userAgent user agent for the {@link Tab} + * @param lastNavigationCommittedTimestampMillis time of the last committed navigation in the + * {@link Tab} */ protected SerializedCriticalPersistedTabData(int parentId, int rootId, long timestampMillis, WebContentsState webContentsState, String openerAppId, int webContentsStateVersion, int themeColor, @Nullable @TabLaunchType Integer launchTypeAtCreation, - @TabUserAgent int userAgent) { + @TabUserAgent int userAgent, long lastNavigationCommittedTimestampMillis) { mParentId = parentId; mRootId = rootId; mTimestampMillis = timestampMillis; @@ -51,6 +54,7 @@ mThemeColor = themeColor; mLaunchTypeAtCreation = launchTypeAtCreation; mUserAgent = userAgent; + mLastNavigationCommittedTimestampMillis = lastNavigationCommittedTimestampMillis; } protected int getParentId() { @@ -96,4 +100,8 @@ protected @TabUserAgent int getUserAgent() { return mUserAgent; } + + protected long getLastNavigationCommittedTimestampMillis() { + return mLastNavigationCommittedTimestampMillis; + } }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs index 5810c6b..8524a35 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/flatbuffer/critical_persisted_tab_data.fbs
@@ -52,6 +52,7 @@ USER_AGENT_UNKNOWN = 5, } +// Before making any modification here, make a copy of this file and save it to |critical_persisted_tab_tab_test_vi| where vi is the newer version and write a test to verify backwards compatability of that table with the new change. table CriticalPersistedTabDataFlatBuffer { // Parent Tab identifier. parent_id:int; @@ -79,4 +80,7 @@ // User Agent. user_agent:UserAgentType=DEFAULT; + + // Timestamp of the last committed navigation done in the Tab. + last_navigation_committed_timestamp_millis:long; }
diff --git a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java index 907c5a6..fd94df5 100644 --- a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java +++ b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java
@@ -245,6 +245,15 @@ "Failed to read tab user agent from tab state. " + "Assuming user agent is TabUserAgent.UNSET"); } + try { + tabState.lastNavigationCommittedTimestampMillis = stream.readLong(); + } catch (EOFException eof) { + tabState.lastNavigationCommittedTimestampMillis = TabState.TIMESTAMP_NOT_SET; + Log.w(TAG, + "Failed to read last navigation committed timestamp from tab state." + + " Assuming last navigation committed timestamp is" + + " TabState.TIMESTAMP_NOT_SET"); + } return tabState; } finally { stream.close(); @@ -309,6 +318,7 @@ state.tabLaunchTypeAtCreation != null ? state.tabLaunchTypeAtCreation : -1); dataOutputStream.writeInt(state.rootId); dataOutputStream.writeInt(state.userAgent); + dataOutputStream.writeLong(state.lastNavigationCommittedTimestampMillis); RecordHistogram.recordTimesHistogram( "Tabs.TabState.SaveTime", SystemClock.elapsedRealtime() - startTime); } catch (FileNotFoundException e) {
diff --git a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManagerUnitTest.java b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManagerUnitTest.java index c9d33a4..4710a4fee 100644 --- a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManagerUnitTest.java +++ b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManagerUnitTest.java
@@ -73,6 +73,7 @@ state.tabLaunchTypeAtCreation = LAUNCH_TYPE_AT_CREATION; state.rootId = ROOT_ID; state.userAgent = USER_AGENT; + state.lastNavigationCommittedTimestampMillis = TIMESTAMP; } finally { StreamUtil.closeQuietly(fileInputStream); } @@ -89,6 +90,7 @@ assertEquals(ROOT_ID, state.rootId); assertEquals(CONTENTS_STATE_BYTES.length, state.contentsState.buffer().remaining()); assertEquals(USER_AGENT, state.userAgent); + assertEquals(TIMESTAMP, state.lastNavigationCommittedTimestampMillis); byte[] bytesFromFile = new byte[CONTENTS_STATE_BYTES.length]; state.contentsState.buffer().get(bytesFromFile);
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index fa7bab0d..288ea50 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -76,6 +76,7 @@ "java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownScrollListener.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/PreWarmingRecycledViewPool.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionCommonProperties.java", + "java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDivider.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHost.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListProperties.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinder.java", @@ -421,6 +422,7 @@ "java/src/org/chromium/chrome/browser/omnibox/suggestions/FaviconFetcherUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/PreWarmingRecycledViewPoolTest.java", + "java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/action/HistoryClustersActionUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxActionDelegateImplUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxActionFactoryImplUnitTest.java",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java index 788aefb..891f5dec8 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownCommonProperties.java
@@ -23,7 +23,8 @@ /** The bottom margin of the suggestion. */ public static final WritableIntPropertyKey BOTTOM_MARGIN = new WritableIntPropertyKey(); /** Whether a divider should be shown at the bottom of the suggestion. */ + public static final WritableBooleanPropertyKey SHOW_DIVIDER = new WritableBooleanPropertyKey(); - public static final PropertyKey[] ALL_KEYS = new PropertyKey[] { - BG_TOP_CORNER_ROUNDED, BG_BOTTOM_CORNER_ROUNDED, TOP_MARGIN, BOTTOM_MARGIN}; + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {BG_TOP_CORNER_ROUNDED, + BG_BOTTOM_CORNER_ROUNDED, SHOW_DIVIDER, TOP_MARGIN, BOTTOM_MARGIN}; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java index ab75e82..9b7e40f 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java
@@ -111,11 +111,14 @@ ? SuggestionCommonProperties.FormFactor.TABLET : SuggestionCommonProperties.FormFactor.PHONE; DropdownItemViewInfo previousItem = null; + boolean useSmallestMargins = OmniboxFeatures.shouldShowSmallestMargins(); int groupTopMargin = OmniboxResourceProvider.getSuggestionGroupTopMargin(mContext); int groupBottomMargin = mContext.getResources().getDimensionPixelSize( R.dimen.omnibox_suggestion_group_vertical_smallest_margin); - int suggestionVerticalMargin = mContext.getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_vertical_margin); + int suggestionVerticalMargin = useSmallestMargins + ? 0 + : mContext.getResources().getDimensionPixelSize( + R.dimen.omnibox_suggestion_vertical_margin); GroupSection previousSection = null; GroupSection currentSection; @@ -156,6 +159,7 @@ previousItem.model.set( DropdownCommonProperties.BG_BOTTOM_CORNER_ROUNDED, applyRounding); previousItem.model.set(DropdownCommonProperties.BOTTOM_MARGIN, bottomMargin); + previousItem.model.set(DropdownCommonProperties.SHOW_DIVIDER, !applyRounding); } previousItem = item; @@ -164,8 +168,7 @@ previousItemWasHeader = item.processor.getViewTypeId() == OmniboxSuggestionUiType.HEADER && shouldShowModernizeVisualUpdate - && (OmniboxFeatures.shouldShowSmallestMargins() - || OmniboxFeatures.shouldShowSmallerMargins()); + && (useSmallestMargins || OmniboxFeatures.shouldShowSmallerMargins()); suggestionsList.add(item); }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java index 71afecac..6473f6e 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManagerUnitTest.java
@@ -398,8 +398,7 @@ R.dimen.omnibox_suggestion_group_vertical_smallest_margin); int postHeaderTopSpacing = mContext.getResources().getDimensionPixelSize( R.dimen.omnibox_suggestion_group_vertical_margin); - int suggestionVerticalSpacing = mContext.getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_vertical_margin); + int suggestionVerticalSpacing = 0; final int groupIdNoHeader = 1; final int groupIdWithHeader = 2;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownAdapter.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownAdapter.java index 86b096f..4e3242d6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownAdapter.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownAdapter.java
@@ -15,6 +15,7 @@ import org.chromium.base.TraceEvent; import org.chromium.base.metrics.TimingMetric; +import org.chromium.chrome.browser.omnibox.OmniboxFeatures; import org.chromium.chrome.browser.omnibox.OmniboxMetrics; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; @@ -36,6 +37,9 @@ super.onAttachedToRecyclerView(view); mLayoutManager = view.getLayoutManager(); mSelectedItem = RecyclerView.NO_POSITION; + if (OmniboxFeatures.shouldShowSmallestMargins()) { + view.addItemDecoration(new SuggestionHorizontalDivider(view.getContext())); + } } /* package */ void recordSessionMetrics() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDivider.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDivider.java new file mode 100644 index 0000000..0cf0180 --- /dev/null +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDivider.java
@@ -0,0 +1,59 @@ +// 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. + +package org.chromium.chrome.browser.omnibox.suggestions; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.Region.Op; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.ItemDecoration; +import androidx.recyclerview.widget.RecyclerView.State; + +import org.chromium.chrome.browser.omnibox.R; +import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; +import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter.ViewHolder; + +/** + * Horizontal divider item decoration that clips the bottom of items with a rect of height 1dp. + * Only clips for items with an associated property model with DropdownCommonProperties.SHOW_DIVIDER + * == true. + */ +public class SuggestionHorizontalDivider extends ItemDecoration { + private final Rect mBounds = new Rect(); + private final int mHeight; + + public SuggestionHorizontalDivider(@NonNull Context context) { + mHeight = context.getResources().getDimensionPixelSize(R.dimen.divider_height); + } + + @Override + public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull State state) { + int childCount = parent.getChildCount(); + + for (int i = 0; i < childCount; ++i) { + View child = parent.getChildAt(i); + if (!shouldDrawDivider(child, parent)) continue; + parent.getDecoratedBoundsWithMargins(child, mBounds); + canvas.clipRect(mBounds.left, mBounds.bottom - mHeight, mBounds.right, mBounds.bottom, + Op.DIFFERENCE); + } + } + + @VisibleForTesting + boolean shouldDrawDivider(@NonNull View view, @NonNull RecyclerView parent) { + RecyclerView.ViewHolder viewHolder = parent.getChildViewHolder(view); + if (!(viewHolder instanceof SimpleRecyclerViewAdapter.ViewHolder)) { + return false; + } + SimpleRecyclerViewAdapter.ViewHolder simpleRecyclerViewHolder = + (ViewHolder) parent.getChildViewHolder(view); + return simpleRecyclerViewHolder.model.get(DropdownCommonProperties.SHOW_DIVIDER); + } +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java new file mode 100644 index 0000000..ad57ac4b --- /dev/null +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java
@@ -0,0 +1,110 @@ +// 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. + +package org.chromium.chrome.browser.omnibox.suggestions; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.verify; + +import android.app.Activity; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.Region.Op; +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; +import androidx.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.R; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; + +/** + * Tests for {@link SuggestionHorizontalDivider}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class SuggestionHorizontalDividerTest { + public @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); + @Mock + private RecyclerView mRecyclerView; + @Mock + private View mChildViewWithDivider; + @Mock + private View mChildViewWithNoDivider; + @Mock + private RecyclerView.State mState; + @Mock + private SimpleRecyclerViewAdapter.ViewHolder mShowDividerViewHolder; + @Mock + private SimpleRecyclerViewAdapter.ViewHolder mNoDividerViewHolder; + @Mock + private Canvas mCanvas; + + private PropertyModel mShowDividerModel = + new PropertyModel.Builder(DropdownCommonProperties.ALL_KEYS) + .with(DropdownCommonProperties.SHOW_DIVIDER, true) + .build(); + private PropertyModel mNoDividerModel = + new PropertyModel.Builder(DropdownCommonProperties.ALL_KEYS) + .with(DropdownCommonProperties.SHOW_DIVIDER, false) + .build(); + + private Activity mActivity; + private SuggestionHorizontalDivider mDecoration; + + @Before + public void setUp() { + mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + mActivity.setTheme(R.style.Theme_BrowserUI); + mDecoration = new SuggestionHorizontalDivider(mActivity); + mShowDividerViewHolder.model = mShowDividerModel; + mNoDividerViewHolder.model = mNoDividerModel; + + doReturn(mShowDividerViewHolder) + .when(mRecyclerView) + .getChildViewHolder(mChildViewWithDivider); + doReturn(mNoDividerViewHolder) + .when(mRecyclerView) + .getChildViewHolder(mChildViewWithNoDivider); + doReturn(2).when(mRecyclerView).getChildCount(); + doReturn(mChildViewWithDivider).when(mRecyclerView).getChildAt(0); + doReturn(mChildViewWithNoDivider).when(mRecyclerView).getChildAt(1); + } + + @Test + @SmallTest + public void testShouldDraw() { + Assert.assertTrue(mDecoration.shouldDrawDivider(mChildViewWithDivider, mRecyclerView)); + Assert.assertFalse(mDecoration.shouldDrawDivider(mChildViewWithNoDivider, mRecyclerView)); + } + + @Test + @SmallTest + public void testDraw() { + doAnswer((invocation -> { + ((Rect) invocation.getArgument(1)).set(0, 0, 100, 30); + return null; + })) + .when(mRecyclerView) + .getDecoratedBoundsWithMargins(any(View.class), any(Rect.class)); + + mDecoration.onDraw(mCanvas, mRecyclerView, mState); + verify(mCanvas).clipRect(0, 29, 100, 30, Op.DIFFERENCE); + } +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewTest.java index b0887c5..1c14abe 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewTest.java
@@ -515,13 +515,11 @@ contentView.setMinimumHeight(CONTENT_VIEW_REPORTED_HEIGHT_PX); BaseSuggestionViewForTest suggestionViewForTest = new BaseSuggestionViewForTest(contentView); - int marginPx = mActivity.getResources().getDimensionPixelSize( - org.chromium.chrome.browser.omnibox.R.dimen.omnibox_suggestion_vertical_margin); Assert.assertEquals(mDecorationIconWidthPx, suggestionViewForTest.mDecorationIconWidthPx); - Assert.assertEquals(mSemicompactSuggestionViewHeight - marginPx, - suggestionViewForTest.mContentHeightPx); - Assert.assertEquals(mCompactSuggestionViewHeight - marginPx, - suggestionViewForTest.mCompactContentHeightPx); + Assert.assertEquals( + mSemicompactSuggestionViewHeight, suggestionViewForTest.mContentHeightPx); + Assert.assertEquals( + mCompactSuggestionViewHeight, suggestionViewForTest.mCompactContentHeightPx); } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java index 19e5533..93562d2 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayout.java
@@ -148,22 +148,10 @@ mActionButtonWidthPx = getResources().getDimensionPixelSize( R.dimen.omnibox_suggestion_action_button_width); - - if (OmniboxFeatures.shouldShowSmallestMargins()) { - int marginPx = getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_vertical_margin); - mCompactContentHeightPx = getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_compact_content_height) - - marginPx; - mContentHeightPx = - getResources().getDimensionPixelSize(R.dimen.omnibox_suggestion_content_height) - - marginPx; - } else { - mCompactContentHeightPx = getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_compact_content_height); - mContentHeightPx = - getResources().getDimensionPixelSize(R.dimen.omnibox_suggestion_content_height); - } + mCompactContentHeightPx = getResources().getDimensionPixelSize( + R.dimen.omnibox_suggestion_compact_content_height); + mContentHeightPx = + getResources().getDimensionPixelSize(R.dimen.omnibox_suggestion_content_height); mContentPaddingPx = getResources().getDimensionPixelSize(R.dimen.omnibox_suggestion_content_padding);
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index f3aba28c..dc89261 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -747,24 +747,7 @@ <message name="IDS_PASSWORD_MIGRATION_WARNING_OTHER_OPTIONS" desc="The text on the button that leads to other options in the password migration warning sheet."> Other options </message> - <message name="IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC" desc="The text that describes the option to start syncing that is offered in the password migration warning sheet."> - Save the passwords on this device in your Google Account by turning on sync - </message> - <message name="IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC_SUBTITLE" desc="The subtitle that appears under the option to turn on sync in the password migration warning sheet if the user is not signed in."> - You’ll be asked to sign in to your Google Account - </message> - <message name="IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT" desc="The text that describes the option to export the passwords that is offered in the password migration warning sheet."> - Export & delete passwords saved to this device - </message> - <message name="IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT_SUBTITLE" desc="The subtitle that explaint the password export option in the password migration warning sheet."> - All passwords will be downloaded on your device and removed from Chrome <ph name="CHROME_CHANNEL">%1$s<ex>Dev</ex></ph> - </message> - <message name="IDS_PASSWORD_MIGRATION_WARNING_NEXT" desc="The text for the next button in the password migration warning sheet. It starts one of the flows offered on the sheet."> - Next - </message> - <message name="IDS_PASSWORD_MIGRATION_WARNING_CANCEL" desc="The text for the cancel button in the password migration warning sheet. It closes the sheet"> - Cancel - </message> + <!-- Lock Screen Fragment --> <message name="IDS_LOCKSCREEN_DESCRIPTION_COPY" desc="When a user attempts to copy a password for a particular website into clipboard in Chrome's settings, Chrome launches a lock screen to verify the user's identity and displays the following explanation."> @@ -862,8 +845,8 @@ <message name="IDS_CONTEXTUAL_SEARCH_SEE_BETTER_RESULTS_SUMMARY" desc="Summary for the see better results switch in Contextual Search preference."> By including more of a page’s text, you might see better results </message> - <message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for 'Do Not Track' preference"> - “Do Not Track” + <message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for the 'Do Not Track' preference. Please leave the 'Do Not Track' part in English according to the glossary."> + Send a “Do Not Track” request </message> <message name="IDS_DO_NOT_TRACK_DESCRIPTION" desc="Description for 'Do Not Track' preference"> Enabling “Do Not Track” means that a request will be included with your browsing traffic. Any effect depends on whether a website responds to the request, and how the request is interpreted. @@ -4067,6 +4050,12 @@ Incognito mode </message> + <message name="IDS_TABSWITCHER_NO_TABS_EMPTY_STATE" desc="Text appearing on an empty tab switcher that indicates that tabs opened will appear here."> + You’ll find your tabs here + </message> + <message name="IDS_TABSWITCHER_NO_TABS_OPEN_TO_VISIT_DIFFERENT_PAGES" desc="Text appearing on an empty tab switcher that indicates that users can open tabs here to visit different pages."> + Open tabs to visit different pages at the same time + </message> <message name="IDS_ACCESSIBILITY_TOOLBAR_BTN_TABSWITCHER_TOGGLE_DEFAULT" desc="Placeholder content description for the button that enters or leaves the tab switcher."> Switch or close tabs </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DO_NOT_TRACK_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DO_NOT_TRACK_TITLE.png.sha1 new file mode 100644 index 0000000..c205862 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DO_NOT_TRACK_TITLE.png.sha1
@@ -0,0 +1 @@ +f447776567feda521bdddafbbae2b095b5432794 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_CANCEL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_CANCEL.png.sha1 deleted file mode 100644 index 9b9ac1e..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_CANCEL.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d45ee4610ee415649d0636e8f6cc38a5feacc2b0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_NEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_NEXT.png.sha1 deleted file mode 100644 index 9b9ac1e..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_NEXT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d45ee4610ee415649d0636e8f6cc38a5feacc2b0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT.png.sha1 deleted file mode 100644 index 9b9ac1e..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d45ee4610ee415649d0636e8f6cc38a5feacc2b0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT_SUBTITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT_SUBTITLE.png.sha1 deleted file mode 100644 index 9b9ac1e..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_PASSWORD_EXPORT_SUBTITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d45ee4610ee415649d0636e8f6cc38a5feacc2b0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC.png.sha1 deleted file mode 100644 index 9b9ac1e..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d45ee4610ee415649d0636e8f6cc38a5feacc2b0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC_SUBTITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC_SUBTITLE.png.sha1 deleted file mode 100644 index 9b9ac1e..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PASSWORD_MIGRATION_WARNING_TURN_ON_SYNC_SUBTITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -d45ee4610ee415649d0636e8f6cc38a5feacc2b0 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TABSWITCHER_NO_TABS_EMPTY_STATE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TABSWITCHER_NO_TABS_EMPTY_STATE.png.sha1 new file mode 100644 index 0000000..2b70fb4 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TABSWITCHER_NO_TABS_EMPTY_STATE.png.sha1
@@ -0,0 +1 @@ +41ca5b064f646b79720ff99dbfff8cac553a98ab \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TABSWITCHER_NO_TABS_OPEN_TO_VISIT_DIFFERENT_PAGES.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TABSWITCHER_NO_TABS_OPEN_TO_VISIT_DIFFERENT_PAGES.png.sha1 new file mode 100644 index 0000000..2b70fb4 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_TABSWITCHER_NO_TABS_OPEN_TO_VISIT_DIFFERENT_PAGES.png.sha1
@@ -0,0 +1 @@ +41ca5b064f646b79720ff99dbfff8cac553a98ab \ No newline at end of file
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 26ae778..9c1f9b0 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
@@ -112,7 +112,7 @@ <translation id="1514552811327923157">تم فتح إشعار "مبادرة حماية الخصوصية" بطول الشاشة.</translation> <translation id="1521774566618522728">نشط اليوم</translation> <translation id="1544826120773021464">لإدارة إعدادات حسابك على Google، يُرجى النقر على الزر "إدارة الحساب".</translation> -<translation id="1549000191223877751">الانتقال إلى نافذة أخرى</translation> +<translation id="1549000191223877751">النقل إلى نافذة أخرى</translation> <translation id="1553358976309200471">تحديث Chrome</translation> <translation id="1554532453982918912">المساعدة في تحسين متصفّح Chrome لغيرك من المستخدمين</translation> <translation id="1558391695376153246">إغلاق علامات تبويب التصفح المتخفي</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 79b7f43..5fc478ff 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Obre en una pestanya d'un grup</translation> <translation id="1103142993930332957">Vols ajudar a millorar Chrome?</translation> <translation id="1105960400813249514">Captura de pantalla</translation> +<translation id="1108214977745280468">Estadístiques de la pàgina</translation> <translation id="1108938384783527433">Sincronització de l'historial</translation> <translation id="1110914759170138831">El text marcat s'ha escurçat</translation> <translation id="1111673857033749125">Les adreces d'interès desades als altres dispositius es mostraran aquí.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" />: s'ha enviat des del dispositiu <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Aquest codi QR no és un URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Si més endavant suprimeixes el bloqueig del perfil, la informació desada s'esborrarà.</translation> <translation id="1320912611264252795">Carpetes del flux per desar l'adreça d'interès obert a alçada completa</translation> <translation id="1327257854815634930">L'historial de navegació està obert</translation> <translation id="1331212799747679585">No es pot actualitzar Chrome. Més opcions</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Per continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirà el teu nom, la teva adreça electrònica i la teva foto de perfil amb aquest lloc web. Consulta la <ph name="BEGIN_LINK1" />política de privadesa<ph name="END_LINK1" /> del lloc web.</translation> <translation id="200114059308480249">Vols incloure el text del voltant a les cerques de Google?</translation> <translation id="2009341475524975924">Per mesurar el rendiment d'un anunci, es poden compartir tipus de dades limitats entre llocs web, com ara l'hora del dia en què se t'ha mostrat.</translation> +<translation id="201060170519281460">El bloqueig de perfil protegeix la informació al cotxe, incloses les contrasenyes sincronitzades, els pagaments i més.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fitxer}other{# fitxers}}</translation> <translation id="2021896219286479412">Controls de pantalla completa</translation> <translation id="2038563949887743358">Activa Mostra com a ordinador</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Veuràs l'estat de l'inici de sessió a <ph name="SITE_NAME" />, les dades de navegació i les dades del lloc web a Chrome</translation> <translation id="2510106555128151389">S'està instal·lant <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Per trobar més opcions de configuració relacionades amb la privadesa, la seguretat i la recollida de dades, consulta <ph name="BEGIN_LINK" />Sincronització i serveis de Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Full de mida completa</translation> <translation id="2517472476991765520">Escaneja</translation> <translation id="2523184218357549926">Envia a Google els URL de les pàgines que visites</translation> <translation id="2527209463677295330">Si inclous més text d'una pàgina, pots obtenir millors resultats</translation> @@ -281,6 +285,7 @@ Els testimonis d'estat privat milloren la privadesa al web i no poden utilitzar-se per esbrinar qui ets.</translation> <translation id="2581165646603367611">Amb aquesta acció, se suprimiran les galetes, la memòria cau i altres dades de llocs que Chrome no consideri importants.</translation> <translation id="2587052924345400782">Versió nova disponible</translation> +<translation id="2589302627584222634">Crea un bloqueig de perfil</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Inicia la sessió per gestionar les teves preferències</translation> <translation id="260403163289591229">Seguint</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">No permetis</translation> <translation id="4036177530563778041">Continua fàcilment des d'on ho hagis deixat</translation> <translation id="4042941173059740150">Continua a <ph name="SITE_ETLD_PLUS_ONE" /> amb <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Full inferior</translation> <translation id="4045764304651014138">Dades d'ús</translation> <translation id="405399507749852140">Si el preu baixa en qualsevol lloc web, rebràs una alerta</translation> <translation id="4056223980640387499">Sèpia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Guia de privadesa <ph name="BEGIN_NEW" />Novetat<ph name="END_NEW" /></translation> <translation id="5648166631817621825">7 darrers dies</translation> <translation id="5655963694829536461">Cerca a les baixades</translation> +<translation id="5657871969392618475">La teva informació està protegida amb un bloqueig de perfil</translation> <translation id="5659593005791499971">Adreça electrònica</translation> <translation id="5665379678064389456">Crea un esdeveniment a <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome no pot cercar actualitzacions</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Atura descripcions d'imatges</translation> <translation id="5966233851250124270">Chrome recordarà la teva elecció</translation> <translation id="5979084224081478209">Comprova les contrasenyes</translation> +<translation id="5985186846584605773">Crea un bloqueig de perfil per al cotxe</translation> <translation id="5995726099713306770">Vols tornar a baixar la pàgina?</translation> <translation id="6000066717592683814">Continua amb Google</translation> <translation id="6000203700195075278">Torna a seguir</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome està actualitzat</translation> <translation id="7105047059074518658">Inicia la sessió per navegar millor en tots els dispositius</translation> <translation id="7106762743910369165">La teva organització gestiona el navegador</translation> +<translation id="7116420572655804716">Per sincronitzar la teva informació i protegir les teves dades al cotxe, has de crear un bloqueig de perfil a la configuració de seguretat. Hauràs d'utilitzar un codi o una contrasenya cada vegada que pugis al cotxe.</translation> <translation id="7116588989735740310">Per tornar als llocs que has visitat en altres dispositius, sincronitza les pestanyes i l'historial</translation> <translation id="7130504491556983216">Aquí es mostrarà una llista d'interessos a mesura que naveguis pel web</translation> <translation id="7138678301420049075">Altres</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Els teus dispositius<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Reprèn</translation> <translation id="8209050860603202033">Obre la imatge</translation> +<translation id="8215740705341534369">Full lateral</translation> <translation id="8218622182176210845">Gestiona el compte</translation> <translation id="8221401890884589479">Pots bloquejar els llocs web que no t'interessen. Chrome també suprimeix automàticament els llocs web de la llista que tenen més de 30 dies. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Menú de la targeta del tauler</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Inici</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introduïu la frase de contrasenya</translation> +<translation id="950679278154734362">Per sincronitzar la teva informació i protegir les teves dades al cotxe, has de crear un bloqueig de perfil. Hauràs d'utilitzar un codi o una contrasenya cada vegada que pugis al cotxe.</translation> <translation id="95817756606698420">Chrome pot utilitzar <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> per fer cerques a la Xina. Per canviar-ho, ves a <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Instal·la aquesta aplicació</translation> <translation id="96681097142096641">Vols mostrar la pàgina simplificada?</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 2268be6..6c9ba43 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Agor mewn tab a grŵp newydd</translation> <translation id="1103142993930332957">Helpwch i wella Chrome?</translation> <translation id="1105960400813249514">Tynnu Sgrinlun</translation> +<translation id="1108214977745280468">Gweld mewnwelediadau tudalen</translation> <translation id="1108938384783527433">Cysoni hanes</translation> <translation id="1110914759170138831">Byrhawyd yr amlygu</translation> <translation id="1111673857033749125">Bydd nodau tudalen sydd wedi'u cadw ar eich dyfeisiau eraill yn ymddangos yma.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - Anfonwyd o <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Nid yw'r Cod QR hwn yn URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Bydd eich gwybodaeth sydd wedi'i chadw yn cael ei dileu os byddwch yn tynnu clo proffil yn ddiweddarach.</translation> <translation id="1320912611264252795">Llif cadw nodau tudalen wedi'i hagor ar uchder llawn</translation> <translation id="1327257854815634930">Agorir hanes llywio</translation> <translation id="1331212799747679585">Ni all Chrome ddiweddaru. Rhagor o ddewisiadau</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">I barhau, bydd <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> yn rhannu eich enw, eich e-bost, eich cyfeiriad, a'ch llun proffil gyda'r wefan. Gweld <ph name="BEGIN_LINK1" />polisi preifatrwydd<ph name="END_LINK1" /> y wefan hon.</translation> <translation id="200114059308480249">Cynnwys testun o'i amgylch mewn chwiliadau Google?</translation> <translation id="2009341475524975924">I fesur perfformiad hysbyseb, gellir rhannu mathau cyfyngedig o ddata rhwng gwefannau, megis yr amser o'r dydd y dangoswyd hysbyseb i chi.</translation> +<translation id="201060170519281460">Mae clo eich proffil yn cadw'ch gwybodaeth yn ddiogel yn y car, gan gynnwys cyfrineiriau sydd wedi'u cysoni, taliadau a rhagor.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Ffeil}zero{# Ffeil}two{# Ffeil}few{# Ffeil}many{# Ffeil}other{# Ffeil}}</translation> <translation id="2021896219286479412">Rheolyddion gwefan sgrîn lawn</translation> <translation id="2038563949887743358">Troi Gofyn am wefan bwrdd gwaith ymlaen</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Byddwch yn gweld eich statws mewngofnodi, pori data, a data gwefan <ph name="SITE_NAME" /> yn Chrome</translation> <translation id="2510106555128151389">Wrthi'n gosod <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Am ragor o osodiadau sy'n ymwneud â phreifatrwydd, diogelwch a chasglu data, gweler <ph name="BEGIN_LINK" />Cysoni a gwasanaethau Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Dalen maint llawn</translation> <translation id="2517472476991765520">Sganio</translation> <translation id="2523184218357549926">Yn anfon URL o dudalennau rydych yn ymweld â nhw at Google</translation> <translation id="2527209463677295330">Drwy gynnwys mwy o destun tudalen, gallech weld canlyniadau gwell</translation> @@ -281,6 +285,7 @@ Mae tocynnau ymddiriedaeth yn gwella eich preifatrwydd ar y we ac ni ellir eu defnyddio i ddarganfod pwy ydych chi.</translation> <translation id="2581165646603367611">Bydd hyn yn clirio cwcis, storfa, a data eraill o wefannau nad yw Chrome yn credu sy'n bwysig.</translation> <translation id="2587052924345400782">Mae fersiwn mwy newydd ar gael</translation> +<translation id="2589302627584222634">Creu clo proffil</translation> <translation id="2593272815202181319">Lled sefydlog</translation> <translation id="2603212228005142861">Mewngofnodwch i reoli'ch dewisiadau</translation> <translation id="260403163289591229">Yn dilyn</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Peidio â chaniatáu</translation> <translation id="4036177530563778041">Parhau lle y gwnaethoch adael yn hawdd</translation> <translation id="4042941173059740150">Parhau at <ph name="SITE_ETLD_PLUS_ONE" /> gyda <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Dalen waelod</translation> <translation id="4045764304651014138">Data defnydd</translation> <translation id="405399507749852140">Cael hysbysiadau os bydd y pris yn gostwng ar unrhyw wefan</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Canllaw Preifatrwydd <ph name="BEGIN_NEW" />Newydd<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Saith diwrnod diwethaf</translation> <translation id="5655963694829536461">Chwilio eich lawrlwythiadau</translation> +<translation id="5657871969392618475">Mae eich gwybodaeth wedi'i diogelu gyda chlo proffil</translation> <translation id="5659593005791499971">E-bost</translation> <translation id="5665379678064389456">Creu digwyddiad yn <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Ni all Chrome wirio am ddiweddariadau</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Stopio disgrifio lluniau</translation> <translation id="5966233851250124270">Bydd Chrome yn cofio eich dewis</translation> <translation id="5979084224081478209">Gwirio cyfrineiriau</translation> +<translation id="5985186846584605773">Creu clo proffil ar gyfer eich car</translation> <translation id="5995726099713306770">Lawrlwytho'r dudalen eto?</translation> <translation id="6000066717592683814">Cadw Google</translation> <translation id="6000203700195075278">Ail-ddilyn</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Mae Chrome yn gyfoes</translation> <translation id="7105047059074518658">Mewngofnodwch i bori'n haws ar draws dyfeisiau</translation> <translation id="7106762743910369165">Rheolir eich porwr gan eich sefydliad</translation> +<translation id="7116420572655804716">I gysoni'ch gwybodaeth a chadw'ch data'n ddiogel yn y car, rhaid i chi greu clo proffil yn eich gosodiadau diogelwch. Byddwn yn defnyddio cod neu gyfrinair bob tro y byddwch yn mynd i mewn i'r car.</translation> <translation id="7116588989735740310">I fynd nôl i wefannau rydych wedi ymweld â nhw ar ddyfeisiau eraill, cysonwch eich tabiau a'ch hanes</translation> <translation id="7130504491556983216">Bydd rhestr o ddiddordebau yn ymddangos yma wrth i chi bori'r we</translation> <translation id="7138678301420049075">Arall</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Eich dyfeisiau<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Parhau</translation> <translation id="8209050860603202033">Agor llun</translation> +<translation id="8215740705341534369">Dalen ochr</translation> <translation id="8218622182176210845">Rheoli'ch cyfrif</translation> <translation id="8221401890884589479">Gallwch rwystro gwefannau nad ydych eu heisiau. Mae Chrome hefyd yn dileu gwefannau yn awtomatig o'r rhestr sy'n hŷn na 30 diwrnod. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Dewislen cerdyn y ffrwd</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Cartref</translation> <translation id="938850635132480979">Gwall: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Rhowch gyfrinymadrodd</translation> +<translation id="950679278154734362">I gysoni'ch gwybodaeth a chadw'ch data'n ddiogel yn y car, rhaid i chi greu clo proffil. Byddwn yn defnyddio cod neu gyfrinair bob tro y byddwch yn mynd i mewn i'r car.</translation> <translation id="95817756606698420">Gall Chrome ddefnyddio <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> ar gyfer chwilio yn Tsieina. Gallwch newid hyn yn y <ph name="BEGIN_LINK" />Gosodiadau<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Gosod yr ap hwn</translation> <translation id="96681097142096641">Gweld tudalen sydd wedi'i symleiddio?</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 0880761..f2c7c663 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Open in new tab in group</translation> <translation id="1103142993930332957">Help improve Chrome?</translation> <translation id="1105960400813249514">Screen Capture</translation> +<translation id="1108214977745280468">View page insights</translation> <translation id="1108938384783527433">History sync</translation> <translation id="1110914759170138831">Highlight was shortened</translation> <translation id="1111673857033749125">Bookmarks saved on your other devices will appear here.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – Sent from <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">This QR code is not a URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylised_highlight_</translation> +<translation id="131655401280401879">Your saved info will be erased if you remove profile lock later.</translation> <translation id="1320912611264252795">Bookmark save flow folders opened at full height</translation> <translation id="1327257854815634930">Navigation history is opened</translation> <translation id="1331212799747679585">Chrome can’t update. More options</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">To continue, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> will share your name, email address and profile picture with this site. See this site's <ph name="BEGIN_LINK1" />privacy policy<ph name="END_LINK1" />.</translation> <translation id="200114059308480249">Include surrounding text in Google searches?</translation> <translation id="2009341475524975924">To measure the performance of an ad, limited types of data can be shared among sites, such as the time of day that an ad was shown to you.</translation> +<translation id="201060170519281460">Your profile lock keeps your info secure in the car, including synced passwords, payments and more.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# File}other{# Files}}</translation> <translation id="2021896219286479412">Full screen site controls</translation> <translation id="2038563949887743358">Turn on Request desktop site</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">You'll see your <ph name="SITE_NAME" /> sign-in status, browsing data and site data in Chrome</translation> <translation id="2510106555128151389">Installing <ph name="WEBAPK_NAME" />…</translation> <translation id="2513403576141822879">For more settings that relate to privacy, security and data collection, see <ph name="BEGIN_LINK" />Sync and Google services<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Full-size sheet</translation> <translation id="2517472476991765520">Scan</translation> <translation id="2523184218357549926">Sends URLs of pages that you visit to Google</translation> <translation id="2527209463677295330">By including more of a page’s text, you might see better results</translation> @@ -281,6 +285,7 @@ Private state tokens improve privacy on the web and can’t be used to find out who you are.</translation> <translation id="2581165646603367611">This will clear cookies, cache and other data of sites Chrome doesn't think is important.</translation> <translation id="2587052924345400782">Newer version is available</translation> +<translation id="2589302627584222634">Create a profile lock</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Sign in to manage your preferences</translation> <translation id="260403163289591229">Following</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Don't allow</translation> <translation id="4036177530563778041">Easily continue where you left off</translation> <translation id="4042941173059740150">Continue to <ph name="SITE_ETLD_PLUS_ONE" /> with <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Bottom sheet</translation> <translation id="4045764304651014138">Usage data</translation> <translation id="405399507749852140">Get alerts if the price drops on any site</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Privacy Guide <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Last 7 days</translation> <translation id="5655963694829536461">Search your downloads</translation> +<translation id="5657871969392618475">Your info is secured with a profile lock</translation> <translation id="5659593005791499971">Email</translation> <translation id="5665379678064389456">Create event in <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome can’t check for updates</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Stop image descriptions</translation> <translation id="5966233851250124270">Chrome will remember your choice</translation> <translation id="5979084224081478209">Check passwords</translation> +<translation id="5985186846584605773">Create a profile lock for your car</translation> <translation id="5995726099713306770">Download page again?</translation> <translation id="6000066717592683814">Keep Google</translation> <translation id="6000203700195075278">Refollow</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome is up to date</translation> <translation id="7105047059074518658">Sign in to browse across devices more easily.</translation> <translation id="7106762743910369165">Your browser is managed by your organisation</translation> +<translation id="7116420572655804716">To sync your info and keep your data secure in the car, you must create a profile lock in your security settings. You’ll use a code or password every time you enter the car.</translation> <translation id="7116588989735740310">To get back to the sites that you’ve visited on other devices, sync your tabs and history</translation> <translation id="7130504491556983216">A list of interests will appear here as you browse the web</translation> <translation id="7138678301420049075">Other</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Your devices<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Resume</translation> <translation id="8209050860603202033">Open image</translation> +<translation id="8215740705341534369">Side sheet</translation> <translation id="8218622182176210845">Manage your account</translation> <translation id="8221401890884589479">You can block sites that you don't want. Chrome also auto-deletes sites that are older than 30 days from the list. <ph name="BEGIN_LINK" />Learn more<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Feed card menu</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Home</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Enter passphrase</translation> +<translation id="950679278154734362">To sync your info and keep your data secure in the car, you must create a profile lock. You’ll use a code or password every time you enter the car.</translation> <translation id="95817756606698420">Chrome can use <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> for search in China. You can change this in <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Install this app</translation> <translation id="96681097142096641">View simplified page?</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 b3a579e..455edb15 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Abrir en pestaña nueva en grupo</translation> <translation id="1103142993930332957">¿Quieres ayudar a mejorar Chrome?</translation> <translation id="1105960400813249514">Captura de pantalla</translation> +<translation id="1108214977745280468">Ver métricas de la página</translation> <translation id="1108938384783527433">Sincronización del historial</translation> <translation id="1110914759170138831">Se ha recortado el texto destacado</translation> <translation id="1111673857033749125">Aquí aparecen los marcadores que hayas guardado en otros dispositivos.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - Enviado desde <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Este código QR no es una URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Si quitas el bloqueo de perfil más adelante, se borrará la información guardada.</translation> <translation id="1320912611264252795">Flujo para guardar marcador abierto a altura completa</translation> <translation id="1327257854815634930">El historial de navegación está abierto</translation> <translation id="1331212799747679585">No se ha podido actualizar Chrome. Más opciones</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá tu nombre, dirección de correo e imagen de perfil con este sitio. Consulta la <ph name="BEGIN_LINK1" />política de privacidad<ph name="END_LINK1" /> de este sitio.</translation> <translation id="200114059308480249">¿Incluir texto cercano en las búsquedas de Google?</translation> <translation id="2009341475524975924">Para medir el rendimiento de los anuncios, se pueden compartir tipos de datos limitados entre los sitios, como la hora del día en la que se te mostró un anuncio.</translation> +<translation id="201060170519281460">El bloqueo de perfil protege tu información en el coche, como las contraseñas sincronizadas o los pagos.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# archivo}other{# archivos}}</translation> <translation id="2021896219286479412">Controles de pantalla completa</translation> <translation id="2038563949887743358">Activar opción para ver como ordenador</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Verás tu estado de inicio de sesión, datos de navegación y datos del sitio de <ph name="SITE_NAME" /> en Chrome.</translation> <translation id="2510106555128151389">Instalando <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Para ver más opciones relacionadas con la privacidad, la seguridad y la recogida de datos, accede a <ph name="BEGIN_LINK" />Sincronización y servicios de Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Hoja de tamaño completo</translation> <translation id="2517472476991765520">Escanear</translation> <translation id="2523184218357549926">Envía las URL de las páginas que visitas a Google</translation> <translation id="2527209463677295330">Al incluir más texto de una página, es posible que obtengas mejores resultados</translation> @@ -281,6 +285,7 @@ Los tokens de confianza mejoran la privacidad en la Web y no se pueden usar para averiguar quién eres.</translation> <translation id="2581165646603367611">Se borrarán las cookies, la caché y otros datos de los sitios que Chrome no considere importantes.</translation> <translation id="2587052924345400782">Hay una nueva versión disponible</translation> +<translation id="2589302627584222634">Crear un bloqueo de perfil</translation> <translation id="2593272815202181319">Monoespaciado</translation> <translation id="2603212228005142861">Inicia sesión para gestionar tus preferencias</translation> <translation id="260403163289591229">Siguiendo</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">No permitir</translation> <translation id="4036177530563778041">Continúa fácilmente donde lo dejaste</translation> <translation id="4042941173059740150">Sigue usando <ph name="SITE_ETLD_PLUS_ONE" /> con <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Hoja inferior</translation> <translation id="4045764304651014138">Datos de uso</translation> <translation id="405399507749852140">Recibe alertas si el precio baja en algún sitio</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Guía de privacidad <ph name="BEGIN_NEW" />Nuevo<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Últimos 7 días</translation> <translation id="5655963694829536461">Busca en las descargas</translation> +<translation id="5657871969392618475">Tu información está protegida con un bloqueo de perfil</translation> <translation id="5659593005791499971">Correo</translation> <translation id="5665379678064389456">Crear evento en <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome no puede comprobar si hay actualizaciones</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Detener descripciones de imágenes</translation> <translation id="5966233851250124270">Chrome recordará tu elección</translation> <translation id="5979084224081478209">Comprobar contraseñas</translation> +<translation id="5985186846584605773">Crear un bloqueo del perfil para el coche</translation> <translation id="5995726099713306770">¿Volver a descargar esta página?</translation> <translation id="6000066717592683814">Mantener Google como motor de búsqueda predeterminado</translation> <translation id="6000203700195075278">Volver a seguir</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome está actualizado</translation> <translation id="7105047059074518658">Inicia sesión para navegar más fácilmente en varios dispositivos</translation> <translation id="7106762743910369165">Tu organización es la encargada de gestionar tu navegador</translation> +<translation id="7116420572655804716">Para sincronizar tu información y mantener tus datos seguros en el coche, debes crear un bloqueo de perfil en la configuración de seguridad. Tendrás que introducir un código o una contraseña cada vez que entres en el coche.</translation> <translation id="7116588989735740310">Para volver a los sitios que has visitado en otros dispositivos, sincroniza tus pestañas y tu historial</translation> <translation id="7130504491556983216">La lista de intereses aparecerá aquí a medida que navegues por la Web</translation> <translation id="7138678301420049075">Otro</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Tus dispositivos<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Reanudar</translation> <translation id="8209050860603202033">Abrir imagen</translation> +<translation id="8215740705341534369">Hoja lateral</translation> <translation id="8218622182176210845">Gestionar tu cuenta</translation> <translation id="8221401890884589479">Puedes bloquear los sitios que no quieras. Chrome también elimina automáticamente los sitios de la lista si tienen una antigüedad superior a 30 días. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Menú de la tarjeta del feed</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Página principal</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introducir frase de contraseña</translation> +<translation id="950679278154734362">Para sincronizar tu información y mantener tus datos seguros en el coche, debes crear un bloqueo de perfil. Tendrás que introducir un código o una contraseña cada vez que entres en el coche.</translation> <translation id="95817756606698420">Chrome puede utilizar <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> para hacer búsquedas en China. Puedes cambiar esta opción en <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Instalar esta aplicación</translation> <translation id="96681097142096641">¿Ver página simplificada?</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 a7ed5248..d1689b47 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Ava rühmas uuel vahelehel</translation> <translation id="1103142993930332957">Kas soovite aidata Chrome'i täiustada?</translation> <translation id="1105960400813249514">Kuva jäädvustamine</translation> +<translation id="1108214977745280468">Kuva lehe statistika</translation> <translation id="1108938384783527433">Ajaloo sünkroonimine</translation> <translation id="1110914759170138831">Esiletõstu lühendati</translation> <translation id="1111673857033749125">Siin kuvatakse teie teistes seadmetes salvestatud järjehoidjad.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – saadetud seadmest <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">See QR-kood ei ole URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Kui profiililuku hiljem eemaldate, kustutatakse teie salvestatud teave.</translation> <translation id="1320912611264252795">Järjehoidja salvestamise voo kaustad on avatud täiskõrgusel</translation> <translation id="1327257854815634930">Navigeerimisajalugu on avatud</translation> <translation id="1331212799747679585">Chrome'i ei saa värskendada. Rohkem valikuid</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Jätkamiseks jagab <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> selle saidiga teie nime, e-posti aadressi ja profiilipilti. Vaadake selle saidi <ph name="BEGIN_LINK1" />privaatsuseeskirju<ph name="END_LINK1" />.</translation> <translation id="200114059308480249">Kas kaasata ümbritsev tekst Google'i otsingutesse?</translation> <translation id="2009341475524975924">Reklaami toimivuse mõõtmiseks võidakse saitide vahel jagada piiratud tüüpi andmeid, näiteks kellaaega, mil teile reklaami esitati.</translation> +<translation id="201060170519281460">Teie profiililukk kaitseb autos teie teavet, sh sünkroonitud paroole, makseid ja palju muud.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fail}other{# faili}}</translation> <translation id="2021896219286479412">Saidi juhtelemendid täisekraanil</translation> <translation id="2038563949887743358">Valiku Taotle arvutisaiti sisselülitamine</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Näete Chrome'is oma saidi <ph name="SITE_NAME" /> sisselogimise olekut, sirvimisandmeid ja saidi andmeid</translation> <translation id="2510106555128151389">Rakenduse <ph name="WEBAPK_NAME" /> installimine …</translation> <translation id="2513403576141822879">Privaatsuse, turvalisuse ning andmete kogumisega seotud lisaseadete nägemiseks avage valik <ph name="BEGIN_LINK" />Sünkroonimine ja Google'i teenused<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Täissuuruses leht</translation> <translation id="2517472476991765520">Kontrolli</translation> <translation id="2523184218357549926">Saadab Google'ile teie külastatud lehtede URL-id</translation> <translation id="2527209463677295330">Kaasates rohkem lehe teksti võite näha paremaid tulemusi</translation> @@ -281,6 +285,7 @@ Privaatse oleku märgid täiustavad veebis privaatsust ja neid ei saa kasutada teie isiku tuvastamiseks.</translation> <translation id="2581165646603367611">See tühjendab vahemälu, kustutab küpsised ja muud andmed, mis pärinevad Chrome'i arvates ebatähtsatelt saitidelt.</translation> <translation id="2587052924345400782">Saadaval on uuem versioon</translation> +<translation id="2589302627584222634">Profiililuku loomine</translation> <translation id="2593272815202181319">Püsisammkiri</translation> <translation id="2603212228005142861">Eelistuse haldamiseks sisselogimine</translation> <translation id="260403163289591229">Jälgitav</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Ära luba</translation> <translation id="4036177530563778041">Jätkake hõlpsalt sealt, kus pooleli jäite</translation> <translation id="4042941173059740150">Minge saidile <ph name="SITE_ETLD_PLUS_ONE" /> kontoga <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Alumine leht</translation> <translation id="4045764304651014138">Kasutusandmed</translation> <translation id="405399507749852140">Teile saadetakse märguanne, kui hind mõnel saidil langeb</translation> <translation id="4056223980640387499">Seepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Privaatsusjuhend <ph name="BEGIN_NEW" />Uus<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Viimased seitse päeva</translation> <translation id="5655963694829536461">Otsige oma allalaadimiste hulgast</translation> +<translation id="5657871969392618475">Teie teave on profiililukuga kaitstud</translation> <translation id="5659593005791499971">E-post</translation> <translation id="5665379678064389456">Looge sündmus rakenduses <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome ei saa värskendusi otsida</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Piltide kirjelduste peatam.</translation> <translation id="5966233851250124270">Chrome jätab teie valiku meelde</translation> <translation id="5979084224081478209">Kontrolli paroole</translation> +<translation id="5985186846584605773">Looge oma auto jaoks profiililukk</translation> <translation id="5995726099713306770">Kas soovite lehe uuesti alla laadida?</translation> <translation id="6000066717592683814">Säilita Google</translation> <translation id="6000203700195075278">Jälgi uuesti</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome on ajakohane</translation> <translation id="7105047059074518658">Logige sisse, et mitmes seadmes sirvimine lihtsamaks muuta</translation> <translation id="7106762743910369165">Teie brauserit haldab teie organisatsioon</translation> +<translation id="7116420572655804716">Autos teabe sünkroonimiseks ja andmete kaitsmiseks peate turvaseadetes looma profiililuku. Kasutate koodi või parooli iga kord, kui autosse sisenete.</translation> <translation id="7116588989735740310">Teistes seadmetes külastatud saitidele naasmiseks sünkroonige vahelehed ja ajalugu.</translation> <translation id="7130504491556983216">Siin kuvatakse huvide loend, kui veebi sirvite</translation> <translation id="7138678301420049075">Muu</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Teie seadmed<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Taasta</translation> <translation id="8209050860603202033">Ava kujutis</translation> +<translation id="8215740705341534369">Külgmine leht</translation> <translation id="8218622182176210845">Konto haldamine</translation> <translation id="8221401890884589479">Saate blokeerida saidid, millel te ei soovi lubada andmeid salvestada. Chrome kustutab loendist automaatselt ka saidid, mis on vanemad kui 30 päeva. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Voo kaardimenüü</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Kodu</translation> <translation id="938850635132480979">Viga: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Sisesta parool</translation> +<translation id="950679278154734362">Autos teabe sünkroonimiseks ja andmete kaitsmiseks peate looma profiililuku. Kasutate koodi või parooli iga kord, kui autosse sisenete.</translation> <translation id="95817756606698420">Chrome saab Hiinas otsimiseks kasutada teenust <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" />. Seda saate muuta menüüs <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Installige see rakendus</translation> <translation id="96681097142096641">Kas kuvada lihtsustatud leht?</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 fcd6500fb..333e0164 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Buksan sa bagong tab sa grupo</translation> <translation id="1103142993930332957">Tumulong na pahusayin ang Chrome?</translation> <translation id="1105960400813249514">Screen Capture</translation> +<translation id="1108214977745280468">Tingnan ang insight ng page</translation> <translation id="1108938384783527433">Pag-sync ng history</translation> <translation id="1110914759170138831">Pinaikli ang highlight</translation> <translation id="1111673857033749125">Dito lalabas ang mga naka-save na bookmark sa iba mo pang mga device.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - Ipinadala mula sa <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Hindi URL ang QR Code na ito: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Mabubura ang iyong naka-save na impormasyon kung aalisin mo ang lock ng profile kalaunan.</translation> <translation id="1320912611264252795">Nakabukas nang buo ang mga folder ng proseso ng pag-save ng bookmark</translation> <translation id="1327257854815634930">Nakabukas ang history ng pag-navigate</translation> <translation id="1331212799747679585">Hindi ma-update ang Chrome. Higit pang opsyon</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Para magpatuloy, ibabahagi ng <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ang iyong pangalan, email address, at larawan sa profile sa site na ito. Tingnan ang <ph name="BEGIN_LINK1" />patakaran sa privacy<ph name="END_LINK1" /> ng site na ito.</translation> <translation id="200114059308480249">Isama ang katabing text sa mga paghahanap sa Google?</translation> <translation id="2009341475524975924">Para masukat ang performance ng ad, puwedeng ma-share ang mga limitadong uri ng data sa mga site, gaya ng oras sa isang araw kung kailan ipinakita sa iyo ang isang ad.</translation> +<translation id="201060170519281460">Pinapanatiling secure ng iyong lock ng profile ang impormasyon mo sa kotse, kasama na ang mga naka-sync na password, pagbabayad, at higit pa.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# File}one{# File}other{# na File}}</translation> <translation id="2021896219286479412">Control ng full screen sa site</translation> <translation id="2038563949887743358">I-on ang Hilingin ang site sa desktop</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Makikita mo sa Chrome ang iyong status ng pag-sign in sa <ph name="SITE_NAME" />, data mula sa pag-browse, at data ng site</translation> <translation id="2510106555128151389">Ini-install ang <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Para sa higit pang setting na nauugnay sa privacy, seguridad, at pangongolekta ng data, tingnan ang <ph name="BEGIN_LINK" />Pag-sync at mga serbisyo ng Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Full-size sheet</translation> <translation id="2517472476991765520">I-scan</translation> <translation id="2523184218357549926">Ipinapadala sa Google ang mga URL ng mga page na binibisita mo</translation> <translation id="2527209463677295330">Kapag nagsama ka ng mas maraming text ng isang page, posibleng makakita ka ng mas magagandang resulta</translation> @@ -281,6 +285,7 @@ Pinapahusay ng mga private state token ang privacy sa web at hindi magagamit ang mga ito para malaman kung sino ka.</translation> <translation id="2581165646603367611">Iki-clear nito ang cookies, cache at iba pang data ng mga site na sa tingin ng Chrome ay hindi mahalaga.</translation> <translation id="2587052924345400782">May available na mas bagong bersyon</translation> +<translation id="2589302627584222634">Gumawa ng lock ng profile</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Mag-sign in para pamahalaan ang iyong mga preference</translation> <translation id="260403163289591229">Sinusubaybayan</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Huwag payagan</translation> <translation id="4036177530563778041">Walang kahirap-hirap na magpatuloy kung saan ka huminto</translation> <translation id="4042941173059740150">Magpatuloy sa <ph name="SITE_ETLD_PLUS_ONE" /> gamit ang <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Bottom sheet</translation> <translation id="4045764304651014138">Data ng paggamit</translation> <translation id="405399507749852140">Makatanggap ng mga alerto kapag bumaba ang presyo sa alinmang site</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Gabay sa Privacy <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Nakalipas na 7 araw</translation> <translation id="5655963694829536461">Maghanap sa iyong mga download</translation> +<translation id="5657871969392618475">Naka-secure ang iyong impormasyon gamit ang isang lock ng profile</translation> <translation id="5659593005791499971">Email</translation> <translation id="5665379678064389456">Gumawa ng event sa <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Hindi matingnan ng Chrome kung may mga update</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Ihinto ang desc ng larawan</translation> <translation id="5966233851250124270">Matatandaan ng Chrome ang iyong napili</translation> <translation id="5979084224081478209">Suriin ang mga password</translation> +<translation id="5985186846584605773">Gumawa ng lock ng profile para sa iyong kotse</translation> <translation id="5995726099713306770">I-download ulit ang page?</translation> <translation id="6000066717592683814">Panatilihin ang Google</translation> <translation id="6000203700195075278">Subaybayan ulit</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Updated ang Chrome</translation> <translation id="7105047059074518658">Mag-sign in para mag-browse nang mas madali sa lahat ng device</translation> <translation id="7106762743910369165">Pinapamahalaan ng iyong organisasyon ang browser mo</translation> +<translation id="7116420572655804716">Para ma-sync ang iyong impormasyon at mapanatiling secure ang data mo sa kotse, dapat kang gumawa ng lock ng profile sa iyong mga setting ng seguridad. Gagamit ka ng code o password sa tuwing papasok ka sa kotse.</translation> <translation id="7116588989735740310">Para makabalik sa mga site na binisita mo sa iba pang device, i-sync ang iyong mga tab at history</translation> <translation id="7130504491556983216">May lalabas na listahan ng mga interes dito habang nagba-browse ka sa web</translation> <translation id="7138678301420049075">Iba pa</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Ang iyong mga device<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Resume</translation> <translation id="8209050860603202033">Buksan ang larawan</translation> +<translation id="8215740705341534369">Side sheet</translation> <translation id="8218622182176210845">Pamahalaan ang iyong account</translation> <translation id="8221401890884589479">Puwede kang mag-block ng mga site na ayaw mo. Awtomatiko ring ide-delete ng Chrome ang mga site sa listahang mahigit 30 araw na. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Menu ng feed card</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Home</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ilagay ang passphrase</translation> +<translation id="950679278154734362">Para ma-sync ang iyong impormasyon at mapanatiling secure ang data mo sa kotse, dapat kang gumawa ng lock ng profile. Gagamit ka ng code o password sa tuwing papasok ka sa kotse.</translation> <translation id="95817756606698420">Maaaring gamitin ng Chrome ang <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> para sa paghahanap sa China. Maaari mo itong baguhin sa <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation> <translation id="962979164594783469">I-install ang app na ito</translation> <translation id="96681097142096641">Tingnan ang pinasimpleng page?</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 563abd3..97aabb46 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
@@ -248,7 +248,7 @@ <translation id="2439153523196674349">Aperçu de <ph name="SITE_NAME" /></translation> <translation id="2450083983707403292">Souhaitez-vous relancer le téléchargement du fichier <ph name="FILE_NAME" /> ?</translation> <translation id="2453860139492968684">Terminer</translation> -<translation id="2461822463642141190">Consommation actuelle</translation> +<translation id="2461822463642141190">Actuellement</translation> <translation id="2472163211318554013">Connectez-vous pour profiter pleinement de Chrome</translation> <translation id="247737702124049222">Les descriptions d'images sont activées</translation> <translation id="2482878487686419369">Notifications</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 379f00cd..78975ede 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">ગ્રૂપમાં નવા ટૅબમાં ખોલો</translation> <translation id="1103142993930332957">Chromeને બહેતર બનાવવામાં સહાય કરશો?</translation> <translation id="1105960400813249514">સ્ક્રીન કૅપ્ચર</translation> +<translation id="1108214977745280468">પેજની જાણકારી જુઓ</translation> <translation id="1108938384783527433">ઇતિહાસ સિંક કરો</translation> <translation id="1110914759170138831">હાઇલાઇટ ટૂંકી કરવામાં આવી</translation> <translation id="1111673857033749125">તમારા અન્ય ડિવાઇસ પર સાચવેલા બુકમાર્ક અહીં દેખાશે.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> પરથી મોકલેલ</translation> <translation id="1311657260431405215">આ QR કોડ કોઈ URL નથી: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">જો તમે પછીથી પ્રોફાઇલ લૉક કાઢી નાખશો, તો તમારી સાચવેલી માહિતી કાઢી નાખવામાં આવશે.</translation> <translation id="1320912611264252795">બુકમાર્ક સાચવવાના ફ્લોના ફોલ્ડરો સંપૂર્ણ ઊંચાઈએ ખુલ્લા છે</translation> <translation id="1327257854815634930">નૅવિગેશન ઇતિહાસ ખુલ્લો છે</translation> <translation id="1331212799747679585">Chrome અપડેટ કરી શકાતું નથી. વધુ વિકલ્પો</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">આગળ વધવા માટે, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> તમારું નામ, ઇમેઇલ ઍડ્રેસ અને પ્રોફાઇલ ફોટો આ સાઇટ સાથે શેર કરશે. આ સાઇટની <ph name="BEGIN_LINK1" />પ્રાઇવસી પૉલિસી<ph name="END_LINK1" /> જુઓ.</translation> <translation id="200114059308480249">શું Google Searchમાં શોધવા માટે આજુબાજુની ટેક્સ્ટ શામેલ કરીએ?</translation> <translation id="2009341475524975924">કોઈ જાહેરાતનું પર્ફોર્મન્સ માપવા માટે, વિવિધ સાઇટ વચ્ચે મર્યાદિત ડેટા શેર કરવામાં આવી શકે છે, જેમ કે દિવસ દરમિયાન તમને કયા સમયે કોઈ જાહેરાત બતાવવામાં આવી.</translation> +<translation id="201060170519281460">તમારું પ્રોફાઇલ લૉક તમારી માહિતી કારમાં સુરક્ષિત રાખે છે, જેમાં સિંક કરેલા પાસવર્ડ, ચુકવણીઓ અને બીજી ઘણી માહિતી શામેલ છે.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ફાઇલ}one{# ફાઇલ}other{# ફાઇલ}}</translation> <translation id="2021896219286479412">પૂર્ણ સ્ક્રીન સાઇટ નિયંત્રણો</translation> <translation id="2038563949887743358">વિનંતી ડેસ્કટૉપ સાઇટ ચાલુ કરો</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">તમને Chromeમાં તમારું <ph name="SITE_NAME" />નું સાઇન ઇન સ્ટેટસ, બ્રાઉઝિંગ ડેટા અને સાઇટ ડેટા દેખાશે</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> ઇન્સ્ટૉલ કરી રહ્યાં છીએ...</translation> <translation id="2513403576141822879">ગોપનીયતા, સુરક્ષા, અને ડેટા સંગ્રહથી સંબંધિત વધુ સેટિંગ માટે, <ph name="BEGIN_LINK" />સિંક અને Google સેવાઓ<ph name="END_LINK" /> જુઓ</translation> +<translation id="2517113738956581680">પૂર્ણ કદની શીટ</translation> <translation id="2517472476991765520">સ્કૅન કરો</translation> <translation id="2523184218357549926">તમે મુલાકાત લો તે પેજના URLs Googleને મોકલે છે</translation> <translation id="2527209463677295330">પેજની વધુ ટેક્સ્ટને શામેલ કરીને, તમે કદાચ બહેતર પરિણામો જોઈ શકશો</translation> @@ -281,6 +285,7 @@ ખાનગી સ્ટેટસ દર્શાવતા ટોકન વેબ પર પ્રાઇવસીને બહેતર બનાવે છે અને તમે કોણ છો તે જાણવા માટે તેનો ઉપયોગ કરી શકાતો નથી.</translation> <translation id="2581165646603367611">આ કુકી, કૅશ અને Chromeને લાગતું હોય કે આ મહત્વનું નથી એવા સાઇટના બીજા ડેટાને સાફ કરશે.</translation> <translation id="2587052924345400782">નવું વર્ઝન ઉપલબ્ધ છે</translation> +<translation id="2589302627584222634">પ્રોફાઇલ લૉક બનાવો</translation> <translation id="2593272815202181319">મોનોસ્પેસ</translation> <translation id="2603212228005142861">તમારી પસંદગીઓ મેનેજ કરવા માટે, સાઇન ઇન કરો</translation> <translation id="260403163289591229">ફૉલો કરી રહ્યાં છો</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">મંજૂરી આપશો નહીં</translation> <translation id="4036177530563778041">તમે જ્યાંથી છોડ્યું હોય, ત્યાંથી સરળતાથી શરુ કરી શકો છો</translation> <translation id="4042941173059740150"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> વડે <ph name="SITE_ETLD_PLUS_ONE" /> પર ચાલુ રાખો</translation> +<translation id="4044708993631234325">બોટમ શીટ</translation> <translation id="4045764304651014138">વપરાશનો ડેટા</translation> <translation id="405399507749852140">જો કોઈપણ સાઇટ પર કિંમતમાં ઘટાડો થાય, તો અલર્ટ મેળવો</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">પ્રાઇવસી સંબંધિત માર્ગદર્શિકા <ph name="BEGIN_NEW" />નવી<ph name="END_NEW" /></translation> <translation id="5648166631817621825">છેલ્લા 7 દિવસ</translation> <translation id="5655963694829536461">તમારા ડાઉનલોડમાં શોધો</translation> +<translation id="5657871969392618475">તમારી માહિતી પ્રોફાઇલ લૉક વડે સુરક્ષિત છે</translation> <translation id="5659593005791499971">ઇમેઇલ</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> માં ઇવેન્ટ બનાવો</translation> <translation id="5683547024293500885">Chrome અપડેટ ચેક કરી શકતું નથી</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">છબીના વર્ણનો મેળવવાનું બંધ કરો</translation> <translation id="5966233851250124270">Chrome તમારી પસંદગી યાદ રાખશે</translation> <translation id="5979084224081478209">પાસવર્ડ ચેક કરો</translation> +<translation id="5985186846584605773">તમારી કાર માટે પ્રોફાઇલ લૉક બનાવો</translation> <translation id="5995726099713306770">શું આ પેજ ફરીથી ડાઉનલોડ કરીએ?</translation> <translation id="6000066717592683814">Google રાખો</translation> <translation id="6000203700195075278">ફરીથી ફૉલો કરો</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome અપ ટૂ ડેટ છે</translation> <translation id="7105047059074518658">તમામ ડિવાઇસ પર વધુ સરળતાથી બ્રાઉઝ કરવા માટે સાઇન ઇન કરો</translation> <translation id="7106762743910369165">તમારી સંસ્થા દ્વારા તમારું બ્રાઉઝર મેનેજ કરવામાં આવે છે</translation> +<translation id="7116420572655804716">તમારી માહિતી સિંક કરવા અને કારમાં તમારો ડેટા સુરક્ષિત રાખવા, તમારે તમારા સિક્યુરિટી સેટિંગમાં પ્રોફાઇલ લૉક બનાવવું આવશ્યક છે. દરેક વખતે કારમાં દાખલ થતી વખતે તમારે કોડ કે પાસવર્ડનો ઉપયોગ કરવાનો રહેશે.</translation> <translation id="7116588989735740310">અન્ય ડિવાઇસ પર તમે મુલાકાત લીધેલી સાઇટ પર પાછા જવા માટે, તમારા ટૅબ અને ઇતિહાસ સિંક કરો</translation> <translation id="7130504491556983216">જ્યારે તમે વેબ બ્રાઉઝ કરશો, ત્યારે રુચિઓની સૂચિ અહીં દેખાશે</translation> <translation id="7138678301420049075">અન્ય</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />તમારા ડિવાઇસ<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">રિઝ્યુમે</translation> <translation id="8209050860603202033">છબી ખોલો</translation> +<translation id="8215740705341534369">સાઇડ શીટ</translation> <translation id="8218622182176210845">તમારું એકાઉન્ટ મેનેજ કરો</translation> <translation id="8221401890884589479">તમને ન જોઈતી સાઇટ તમે બ્લૉક કરી શકો છો. Chrome સૂચિમાંથી 30 દિવસથી જૂની સાઇટને પણ ઑટોમૅટિક રીતે ડિલીટ કરે છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="8223642481677794647">ફીડ કાર્ડ મેનૂ</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">હોમ</translation> <translation id="938850635132480979">ભૂલ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">પાસફ્રેઝ દાખલ કરો</translation> +<translation id="950679278154734362">તમારી માહિતી સિંક કરવા અને કારમાં તમારો ડેટા સુરક્ષિત રાખવા, તમારે પ્રોફાઇલ લૉક બનાવવું આવશ્યક છે. દરેક વખતે કારમાં દાખલ થતી વખતે તમારે કોડ કે પાસવર્ડનો ઉપયોગ કરવાનો રહેશે.</translation> <translation id="95817756606698420">Chrome, ચાઇનામાં શોધ માટે <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" />નો ઉપયોગ કરી શકે છે. તમે આને <ph name="BEGIN_LINK" />સેટિંગ<ph name="END_LINK" />માં બદલી શકો છો.</translation> <translation id="962979164594783469">આ ઍપ ઇન્સ્ટૉલ કરો</translation> <translation id="96681097142096641">શું સરળ કરેલું પેજ જોવું છે?</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 72e5082a..fda61ad 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
@@ -575,6 +575,7 @@ <translation id="4188221736490993796">降順で並べ替え</translation> <translation id="4195643157523330669">新しいタブで開く</translation> <translation id="4196597275619698563">カードを作成</translation> +<translation id="4197828496439691735">{NUM_TABS,plural, =1{このデバイスの 1 個のタブ}other{このデバイスの # 個のタブ}}</translation> <translation id="4198423547019359126">ダウンロードの保存先はありません</translation> <translation id="4202218894997543208">ブロックしたトピック</translation> <translation id="4214315110991671325">Cookie を許可すると、Chrome がプリロードの際に Cookie を使用します。</translation> @@ -589,6 +590,7 @@ <translation id="4262915912852657291"><ph name="BEGIN_BOLD" />使用されるデータ:<ph name="END_BOLD" /> 閲覧履歴(このデバイスで Chrome を使用してアクセスしたサイトの記録)。</translation> <translation id="4269820728363426813">リンクアドレスをコピー</translation> <translation id="4283102315569707115">デフォルトで PC 版サイトをリクエストしますか?</translation> +<translation id="4285846616383034558">Cookie、キャッシュ、その他のサイトデータ</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Android の設定で画面ロックをオンにする<ph name="END_LINK" /></translation> <translation id="4296252229500326964">新しいシークレット タブ</translation> <translation id="4298388696830689168">リンク済みのサイト</translation> @@ -679,6 +681,7 @@ <translation id="4763480195061959176">動画</translation> <translation id="4766313118839197559">パスワードは、このデバイスのパスワード マネージャーに保存されます</translation> <translation id="4766678251456904326">デバイスへのアカウントの追加</translation> +<translation id="4767947714785277816">広告の測定という新しい広告プライバシー機能をリリースします。Chrome では、広告の効果測定に役立てるため、広告が表示されたときに、ごく少量の限定的な情報のみがサイトやアプリと共有されます。</translation> <translation id="4769095993849849966">新しいファイル名</translation> <translation id="4778653490315793244">コンテンツはまだありません</translation> <translation id="4787736314074622408"><ph name="ITEM_TITLE" />を削除しますか?</translation> @@ -914,6 +917,7 @@ <translation id="6011308810877101166">検索候補の関連性を高める</translation> <translation id="6026538407078977628">フルスクリーンで拡大表示</translation> <translation id="6030719887161080597">サイトが広告のパフォーマンスを測定するために使用する情報を管理する</translation> +<translation id="6034146297924778597">過去 15 分の履歴が削除されます。</translation> <translation id="6039379616847168523">次のタブに移動する</translation> <translation id="6040143037577758943">閉じる</translation> <translation id="604124094241169006">自動設定</translation> @@ -1188,7 +1192,7 @@ <translation id="7431991332293347422">検索などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="7435356471928173109">管理者によってオフにされています</translation> <translation id="7437998757836447326">Chrome からログアウト</translation> -<translation id="7443901082822119557">シークレット モードのとき、サイトは、Cookie を使用して、別のサイトでのあなたの閲覧アクティビティを確認することができません。広告をカスタマイズできないなど、一部サイトの機能が使用できなくなる可能性もあります。</translation> +<translation id="7443901082822119557">シークレット モードのとき、サイトは、Cookie を使用して、別のサイトでのあなたの閲覧アクティビティを確認することができません。広告をパーソナライズできないなど、一部サイトの機能が使用できなくなる可能性もあります。</translation> <translation id="7453467225369441013">ほとんどのサイトからログアウトします。Google アカウントへのログイン状態は維持されます。</translation> <translation id="7453810262525006706">サイドビューに折りたたむ</translation> <translation id="7454641608352164238">空き容量が不足しています</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 0f8a149..1a95a71 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Топтағы жаңа қойындыдан ашу</translation> <translation id="1103142993930332957">Chrome браузерін жақсартуға көмектесесіз бе?</translation> <translation id="1105960400813249514">Экранды жазып алу</translation> +<translation id="1108214977745280468">Бет статистикасын көру</translation> <translation id="1108938384783527433">Тарихты синхрондау</translation> <translation id="1110914759170138831">Ерекшелеу қысқартылды.</translation> <translation id="1111673857033749125">Басқа құрылғыларда сақталған бетбелгілер осы жерде шығады.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – <ph name="DEVICE_NAME" /> құрылғысынан жіберілген.</translation> <translation id="1311657260431405215">Бұл QR коды URL мекенжайы емес: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Профиль құлпын кейінірек өшірсеңіз, сақталған ақпаратыңыз жойылады.</translation> <translation id="1320912611264252795">Бетбелгілерді сақтау ағыны толық ашылған.</translation> <translation id="1327257854815634930">Навигация тарихы ашылды.</translation> <translation id="1331212799747679585">Chrome браузерін жаңарту мүмкін емес. Басқа опциялар</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Жалғастыру үшін <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөніңізді, электрондық мекенжайыңызды және профиль суретіңізді осы сайтпен бөліседі. Бұл сайттың <ph name="BEGIN_LINK1" />Құпиялық саясатын<ph name="END_LINK1" /> көріңіз.</translation> <translation id="200114059308480249">Google іздеу сұрауларында көбірек мәтін қамтылсын ба?</translation> <translation id="2009341475524975924">Жарнаманың өнімділігін өлшеу үшін, сізге жарнама көрсетілген күн уақыты сияқты деректердің шектеулі түрлерін сайттар арасында бөлісуге болады.</translation> +<translation id="201060170519281460">Профиль құлпы ақпаратыңызды (оның ішінде синхрондалған құпия сөздерді, төлемдерді және т.б.) көлікте қауіпсіз сақтайды.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}other{# файл}}</translation> <translation id="2021896219286479412">Толық экран режимін басқару</translation> <translation id="2038563949887743358">Жұмыс үстелі сайтын сұрау: қосу</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918"><ph name="SITE_NAME" /> сайтына кіру күйін, браузерді пайдалану деректерін және Chrome-дағы сайт деректерін көресіз.</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> орнатылып жатыр…</translation> <translation id="2513403576141822879">Құпиялық, қауіпсіздік және дерек жинағына қатысты басқа да параметрлерді <ph name="BEGIN_LINK" />Синхрондау және Google қызметтері<ph name="END_LINK" /> бөлімінен қараңыз</translation> +<translation id="2517113738956581680">Толық өлшемді парақ</translation> <translation id="2517472476991765520">Іздеу</translation> <translation id="2523184218357549926">Кірген беттердің URL мекенжайларын Google-ға жібереді</translation> <translation id="2527209463677295330">Беттегі мәтінді көбірек қамту арқылы дәлірек нәтижелер көресіз.</translation> @@ -281,6 +285,7 @@ Жеке күй токендері интернеттегі құпиялықты жақсартады. Олар кім екеніңізді анықтау үшін пайдаланылмайды.</translation> <translation id="2581165646603367611">Сookie файлдары, кэш және маңызды емес деп саналатын сайттың басқа деректері өшіріледі.</translation> <translation id="2587052924345400782">Жаңа нұсқасы қолжетімді</translation> +<translation id="2589302627584222634">Профиль құлпын жасау</translation> <translation id="2593272815202181319">Моноенді</translation> <translation id="2603212228005142861">Параметрлерді басқару үшін аккаунтқа кіріңіз.</translation> <translation id="260403163289591229">Жазылғансыз</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Рұқсат бермеу</translation> <translation id="4036177530563778041">Тоқтаған жерден оңай жалғастыру</translation> <translation id="4042941173059740150"><ph name="SITE_ETLD_PLUS_ONE" /> сайтына <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> көмегімен өту</translation> +<translation id="4044708993631234325">Төменгі парақша</translation> <translation id="4045764304651014138">Пайдаланылуы туралы дерек</translation> <translation id="405399507749852140">Қандай да бір сайтта баға төмендесе, сізге хабарланады.</translation> <translation id="4056223980640387499">Сепия</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Құпиялық нұсқаулығы <ph name="BEGIN_NEW" />Жаңа<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Соңғы 7 күн</translation> <translation id="5655963694829536461">Жүктеп алынған файлдардан іздеу</translation> +<translation id="5657871969392618475">Ақпаратыңыз профиль құлпы арқылы қорғалған</translation> <translation id="5659593005791499971">Электрондық пошта</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> қолданбасында оқиға жасау</translation> <translation id="5683547024293500885">Chrome жаңа нұсқалардың бар-жоғын тексере алмайды.</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Сурет сипаттамаларын алмау</translation> <translation id="5966233851250124270">Chrome таңдауыңызды есте сақтайды</translation> <translation id="5979084224081478209">Құпия сөздерді тексеру</translation> +<translation id="5985186846584605773">Көлігіңіз үшін профиль құлпын жасау</translation> <translation id="5995726099713306770">Бет қайта жүктеп алынсын ба?</translation> <translation id="6000066717592683814">Google қызметін әдепкісінше пайдалану</translation> <translation id="6000203700195075278">Қайта жазылу</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome жаңартылған.</translation> <translation id="7105047059074518658">Құрылғыларды оңай қолдану үшін аккаунтқа кіріңіз.</translation> <translation id="7106762743910369165">Браузеріңізді ұйым басқарады.</translation> +<translation id="7116420572655804716">Ақпаратты синхрондау және деректеріңізді көлікте қауіпсіз сақтау үшін қауіпсіздік параметрлерінде профиль құлпын жасауыңыз қажет. Көлікке отырған сайын кодты немесе құпия сөзді пайдалана аласыз.</translation> <translation id="7116588989735740310">Басқа құрылғыларда кірген сайттарға оралу үшін қойындылар мен тарихты синхрондаңыз</translation> <translation id="7130504491556983216">Интернетті шолу кезінде табылған қызығушылықтар тізімі осы жерге шығады.</translation> <translation id="7138678301420049075">Басқа</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Құрылғыларыңыз<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Жалғастыру</translation> <translation id="8209050860603202033">Кескінді ашу</translation> +<translation id="8215740705341534369">Бүйірлік парақ</translation> <translation id="8218622182176210845">Аккаунтты басқару</translation> <translation id="8221401890884589479">Сіз қаламайтын сайттарды бөгей аласыз. Сонымен қатар Chrome браузері тізімнен 30 күннен асқан сайттарды автоматты жояды. <ph name="BEGIN_LINK" />Толық ақпарат<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Фид картасы мәзірі</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Негізгі бет</translation> <translation id="938850635132480979">Қате: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Құпия фразаны енгізу</translation> +<translation id="950679278154734362">Ақпаратты синхрондау және деректеріңізді көлікте қауіпсіз сақтау үшін профиль құлпын жасауыңыз қажет. Көлікке отырған сайын кодты немесе құпия сөзді пайдалана аласыз.</translation> <translation id="95817756606698420">Chrome браузері <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> жүйесін Қытайда іздеу үшін пайдалана алады. Мұны <ph name="BEGIN_LINK" />Параметрлер<ph name="END_LINK" /> бөлімінен өзгертуге болады.</translation> <translation id="962979164594783469">Осы қолданбаны орнату</translation> <translation id="96681097142096641">Жеңілдетілген бетті көру керек пе?</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 951f32c..a9b1fd4 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">새 탭을 그룹에서 열기</translation> <translation id="1103142993930332957">Chrome을 개선하는 데 도움을 주시겠어요?</translation> <translation id="1105960400813249514">화면 캡처</translation> +<translation id="1108214977745280468">페이지 통계 보기</translation> <translation id="1108938384783527433">방문 기록 동기화</translation> <translation id="1110914759170138831">강조표시가 잘렸습니다.</translation> <translation id="1111673857033749125">다른 기기에서 저장한 북마크가 여기에 표시됩니다.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" />에서 전송</translation> <translation id="1311657260431405215">이 QR 코드(<ph name="QRCODEVALUE" />)는 URL이 아닙니다.</translation> <translation id="1316212908214730110">Chrome_스타일_지정된_하이라이트_</translation> +<translation id="131655401280401879">나중에 프로필 잠금을 삭제하면 저장된 정보가 삭제됩니다.</translation> <translation id="1320912611264252795">북마크 저장 흐름 폴더가 전체 높이로 열림</translation> <translation id="1327257854815634930">탐색 기록 열림</translation> <translation id="1331212799747679585">Chrome을 업데이트할 수 없습니다. 옵션 더보기</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">계속하려면 <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />에서 내 이름, 이메일 주소, 프로필 사진을 이 사이트와 공유해야 합니다. 이 사이트의 <ph name="BEGIN_LINK1" />개인정보처리방침<ph name="END_LINK1" />을 확인하세요.</translation> <translation id="200114059308480249">Google 검색어에 주변 텍스트를 포함하시겠습니까?</translation> <translation id="2009341475524975924">광고 실적을 측정하기 위해 광고가 표시된 시간과 같이 제한된 유형의 데이터가 사이트 간에 공유될 수 있습니다.</translation> +<translation id="201060170519281460">프로필 잠금을 사용하면 동기화된 비밀번호, 결제 등 정보를 자동차에서 안전하게 보호할 수 있습니다.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{파일 #개}other{파일 #개}}</translation> <translation id="2021896219286479412">전체화면 사이트 컨트롤</translation> <translation id="2038563949887743358">데스크톱 버전으로 보기 사용 설정</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Chrome에서 <ph name="SITE_NAME" /> 로그인 상태, 인터넷 사용 기록, 사이트 데이터를 볼 수 있습니다.</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> 설치 중...</translation> <translation id="2513403576141822879">개인 정보 보호, 보안, 데이터 수집에 관한 설정을 더 보려면 <ph name="BEGIN_LINK" />동기화 및 Google 서비스<ph name="END_LINK" />를 참조하세요.</translation> +<translation id="2517113738956581680">전체 크기 시트</translation> <translation id="2517472476991765520">스캔</translation> <translation id="2523184218357549926">방문한 페이지의 URL을 Google에 전송</translation> <translation id="2527209463677295330">페이지 텍스트를 더 많이 포함하면 더 나은 검색결과를 확인할 수 있습니다.</translation> @@ -281,6 +285,7 @@ 비공개 상태 토큰은 웹의 개인 정보 보호를 개선하나, 나를 식별하는 데 사용될 수는 없습니다.</translation> <translation id="2581165646603367611">이를 통해 쿠키, 캐시 및 Chrome에서 중요하다고 간주하지 않는 사이트의 기타 데이터가 삭제됩니다.</translation> <translation id="2587052924345400782">최신 버전 사용 가능</translation> +<translation id="2589302627584222634">프로필 잠금 만들기</translation> <translation id="2593272815202181319">고정 너비</translation> <translation id="2603212228005142861">환경설정을 관리하려면 로그인하세요</translation> <translation id="260403163289591229">팔로우 중</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">허용 안함</translation> <translation id="4036177530563778041">중단한 위치에서 계속하기</translation> <translation id="4042941173059740150"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />(으)로 <ph name="SITE_ETLD_PLUS_ONE" /> 계속하기</translation> +<translation id="4044708993631234325">하단 시트</translation> <translation id="4045764304651014138">사용 데이터</translation> <translation id="405399507749852140">사이트에서 가격이 인하되면 알림이 전송됩니다</translation> <translation id="4056223980640387499">세피아</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">개인 정보 보호 가이드 <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="5648166631817621825">지난 7일</translation> <translation id="5655963694829536461">다운로드 항목 검색</translation> +<translation id="5657871969392618475">프로필 잠금으로 정보 보호됨</translation> <translation id="5659593005791499971">이메일</translation> <translation id="5665379678064389456"><ph name="APP_NAME" />에 일정 만들기</translation> <translation id="5683547024293500885">Chrome에서 업데이트를 확인할 수 없음</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">이미지 설명 중지</translation> <translation id="5966233851250124270">선택사항이 Chrome에 저장됩니다</translation> <translation id="5979084224081478209">비밀번호 확인</translation> +<translation id="5985186846584605773">자동차용 프로필 잠금 만들기</translation> <translation id="5995726099713306770">페이지를 다시 다운로드하시겠습니까?</translation> <translation id="6000066717592683814">계속 Google 사용</translation> <translation id="6000203700195075278">다시 팔로우</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome이 최신 버전입니다.</translation> <translation id="7105047059074518658">로그인하여 여러 기기에서 쉽게 인터넷을 사용하세요</translation> <translation id="7106762743910369165">조직에서 관리하는 브라우저입니다.</translation> +<translation id="7116420572655804716">자동차에서 정보를 동기화하고 데이터를 안전하게 유지하려면 보안 설정에서 프로필 잠금을 만들어야 합니다. 차량에 탑승할 때마다 코드나 비밀번호를 사용하게 됩니다.</translation> <translation id="7116588989735740310">다른 기기에서 내가 방문한 사이트로 돌아가려면 탭과 방문 기록을 동기화하세요</translation> <translation id="7130504491556983216">웹을 탐색하면 여기에 내 관심분야 목록이 표시됩니다.</translation> <translation id="7138678301420049075">기타</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />내 기기<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">다시 시작</translation> <translation id="8209050860603202033">이미지 열기</translation> +<translation id="8215740705341534369">측면 시트</translation> <translation id="8218622182176210845">계정 관리</translation> <translation id="8221401890884589479">원치 않는 사이트를 차단할 수 있습니다. 또한 Chrome에서는 30일이 지난 사이트도 목록에서 자동 삭제합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="8223642481677794647">피드 카드 메뉴</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">홈</translation> <translation id="938850635132480979">오류: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">암호 입력</translation> +<translation id="950679278154734362">자동차에서 정보를 동기화하고 데이터를 안전하게 유지하려면 프로필 잠금을 만들어야 합니다. 차량에 탑승할 때마다 코드나 비밀번호를 사용하게 됩니다.</translation> <translation id="95817756606698420">중국에서 검색할 때 Chrome에서 <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" />를 사용할 수 있습니다. <ph name="BEGIN_LINK" />설정<ph name="END_LINK" />에서 변경할 수 있습니다.</translation> <translation id="962979164594783469">앱 설치</translation> <translation id="96681097142096641">간소화된 페이지를 보시겠습니까?</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 2eed88f..fdae09a 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Топтогу жаңы өтмөктө ачуу</translation> <translation id="1103142993930332957">Chrome'ду жакшыртууга жардам бере аласызбы?</translation> <translation id="1105960400813249514">Экранды тартып алуу</translation> +<translation id="1108214977745280468">Барак статистикасын көрүү</translation> <translation id="1108938384783527433">Таржымалды шайкештирүү</translation> <translation id="1110914759170138831">Кызыктуу көз ирмемдер кыскартылды</translation> <translation id="1111673857033749125">Башка түзмөктөрүңүздө сакталган кыстармалар ушул жерден көрүнөт.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – <ph name="DEVICE_NAME" /> түзмөгүнөн жөнөтүлдү</translation> <translation id="1311657260431405215">Бул QR коду URL эмес: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Эгер кийин профилдин кулпусун өчүрсөңүз, сакталган маалыматыңыз тазаланат.</translation> <translation id="1320912611264252795">Тематикасына жараша сакталган кыстармалар толук экранда ачылды</translation> <translation id="1327257854815634930">Чабыттоо таржымалы ачылды</translation> <translation id="1331212799747679585">Chrome жаңырбай жатат. Кошумча параметрлер</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңызды жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт. Бул сайттын <ph name="BEGIN_LINK1" />купуялык саясатын<ph name="END_LINK1" /> көрүңүз.</translation> <translation id="200114059308480249">Google'да издегенде көбүрөөк текст камтылсынбы?</translation> <translation id="2009341475524975924">Жарнаманын майнаптуулугун талдоо үчүн сайттар бири-бири менен жарнаманын кайсы убакытта көрсөтүлгөнү сыяктуу белгилүү бир маалыматтын түрлөрүн бөлүшүүсү мүмкүн.</translation> +<translation id="201060170519281460">Профилди кулпулоо функциясы унааңызда маалыматыңыздын, ошондой эле шайкештирилген сырсөздөр, төлөмдөр жана башка нерселердин коопсуздугун камсыздайт.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}other{# файл}}</translation> <translation id="2021896219286479412">Сайтты толук экран режиминде көзөмөлдөө</translation> <translation id="2038563949887743358">Иш тактасынын сайтындагы суроо-талапты күйгүзүү</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Chrome'до <ph name="SITE_NAME" /> сайтына кирүү статусуңузду, серептөө дайындарын жана сайттын маалыматын көрөсүз</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> орнотулууда…</translation> <translation id="2513403576141822879">Купуялыкка, коопсуздукка жана дайындарды чогултууга байланыштуу дагы башка параметрлерди көрүү үчүн <ph name="BEGIN_LINK" />Шайкештирүү жана Google кызматтары<ph name="END_LINK" /> бөлүмүнө өтүңүз</translation> +<translation id="2517113738956581680">Толук экран</translation> <translation id="2517472476991765520">Скандоо</translation> <translation id="2523184218357549926">Баш баккан барактарыңыздын URL'дерин Google'га жөнөтөт</translation> <translation id="2527209463677295330">Барактагы көбүрөөк текст камтылса, жакшыраак натыйжалар көрсөтүлүшү мүмкүн</translation> @@ -277,6 +281,7 @@ <translation id="2580436639406015883">Спамдарга жана шылуундарга каршы жеке абал токендери колдонулат. Алардын жардамы менен сайттар шылуундар менен күрөшүп, боттор менен адамдарды айырмалай алат. Сайт жасаган аракеттериңизге жараша, өзгөчө, аккаунтуңузга көп кирсеңиз, серепчиңизге жеке абал токенин бериши мүмкүн. Сиз кирген сайттар жеке абал токениңиз аркылуу сиздин бот эмес, адам экениңизди оңой аныктай алышат. Мындай токендер Интернеттеги купуялыгыңызды жакшыраак коргоп, ким экениңизди аныктаганга мүмкүнчүлүк бербейт.</translation> <translation id="2581165646603367611">Ушуну менен Chrome үчүн анча маанилүү болбогон кукилер, кэш жана сайттын башка нерселери тазаланат.</translation> <translation id="2587052924345400782">Жаңыраак версиясы бар</translation> +<translation id="2589302627584222634">Профилдин кулпусун түзүү</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Параметрлерди башкаруу үчүн аккаунтуңузга кириңиз</translation> <translation id="260403163289591229">Жазылгансыз</translation> @@ -538,6 +543,7 @@ <translation id="4035877632587724847">Тыюу салуу</translation> <translation id="4036177530563778041">Токтогон жериңизден оңой улантыңыз</translation> <translation id="4042941173059740150"><ph name="SITE_ETLD_PLUS_ONE" /> сайтына <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аккаунту менен өтүңүз</translation> +<translation id="4044708993631234325">Ылдыйкы экран</translation> <translation id="4045764304651014138">Колдонуу статистикасы</translation> <translation id="405399507749852140">Кандайдыр бир сайтта баасы төмөндөсө, эскертүүлөрдү алыңыз</translation> <translation id="4056223980640387499">Sepia</translation> @@ -838,6 +844,7 @@ <translation id="564667659802381754">Купуялык жетектемеси <ph name="BEGIN_NEW" />Жаңы<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Акыркы 7 күн</translation> <translation id="5655963694829536461">Жүктөп алган нерселериңизди издеңиз</translation> +<translation id="5657871969392618475">Маалыматыңыз профилди кулпулоо функциясы менен корголгон</translation> <translation id="5659593005791499971">Электрондук почта</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> колдонмосунан иш-чара түзүңүз</translation> <translation id="5683547024293500885">Chrome жаңыртууларды текшере алган жок</translation> @@ -901,6 +908,7 @@ <translation id="5964869237734432770">Сүрөттөмөлөрдү албоо</translation> <translation id="5966233851250124270">Chrome тандооңузду эстеп калат</translation> <translation id="5979084224081478209">Сырсөздөрдү текшерүү</translation> +<translation id="5985186846584605773">Унааңыз үчүн профилдин кулпусун түзүңүз</translation> <translation id="5995726099713306770">Барак кайрадан жүктөлүп алынсынбы?</translation> <translation id="6000066717592683814">Google калсын</translation> <translation id="6000203700195075278">Кайра жазылуу</translation> @@ -1129,6 +1137,7 @@ <translation id="7088681679121566888">Chrome жаңыртылды</translation> <translation id="7105047059074518658">Түзмөктөрдү оңой колдонуу үчүн аккаунтуңузга кириңиз</translation> <translation id="7106762743910369165">Серепчиңиз уюмуңуз тарабынан башкарылат</translation> +<translation id="7116420572655804716">Маалыматыңызды шайкештирүү жана унааңызда маалыматыңыздын коопсуздугун камсыздоо үчүн коопсуздук параметрлеринен профилдин кулпусун түзүшүңүз керек. Унаага кирген сайын код же сырсөздү колдоносуз.</translation> <translation id="7116588989735740310">Көргөн сайттарга башка түзмөктөрдө кайтуу үчүн өтмөктөр менен таржымалды шайкештириңиз</translation> <translation id="7130504491556983216">Кызыккан нерселердин тизмеси Интернеттеги аракеттериңизге жараша көрсөтүлөт</translation> <translation id="7138678301420049075">Башка</translation> @@ -1350,6 +1359,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Түзмөктөрүңүз<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Улантуу</translation> <translation id="8209050860603202033">Сүрөттү ачуу</translation> +<translation id="8215740705341534369">Капталдагы экран</translation> <translation id="8218622182176210845">Аккаунтуңузду башкарыңыз</translation> <translation id="8221401890884589479">Каалаган сайтты бөгөттөй аласыз. Chrome тизмеге 30 күн мурун кошулган сайттарды автоматтык түрдө жок кылып турат. <ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Түрмөктөгү меню</translation> @@ -1552,6 +1562,7 @@ <translation id="932327136139879170">Башкы</translation> <translation id="938850635132480979">Ката: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Купуя сөз айкашын киргизиңиз</translation> +<translation id="950679278154734362">Маалыматыңызды шайкештирүү жана унааңызда маалыматыңыздын коопсуздугун камсыздоо үчүн профилдин кулпусун түзүшүңүз керек. Унаага кирген сайын код же сырсөздү колдоносуз.</translation> <translation id="95817756606698420">Chrome Кытай жергесинде издөө үчүн <ph name="BEGIN_BOLD" />Sogou'ду<ph name="END_BOLD" /> колдоно алат. Аны <ph name="BEGIN_LINK" />Параметрлерден<ph name="END_LINK" /> өзгөртүп койсоңуз болот.</translation> <translation id="962979164594783469">Бул колдонмону орнотуу</translation> <translation id="96681097142096641">Жөнөкөйлөтүлгөн баракты көрөсүзбү?</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 9a178d4..5ded663 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Atidar. naujame grup. skirtuke</translation> <translation id="1103142993930332957">Norite padėti tobulinti „Chrome“?</translation> <translation id="1105960400813249514">Ekrano fiksavimas</translation> +<translation id="1108214977745280468">Žr. puslapio įžvalgas</translation> <translation id="1108938384783527433">Istorijos sinchronizavimas</translation> <translation id="1110914759170138831">Paryškinimas sutrumpintas</translation> <translation id="1111673857033749125">Čia bus rodomos kituose įrenginiuose išsaugotos žymės.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – išsiųsta iš „<ph name="DEVICE_NAME" />“</translation> <translation id="1311657260431405215">Šis QR kodas nėra URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Jūsų išsaugota informacija bus ištrinta, jei vėliau pašalinsite profilio užraktą.</translation> <translation id="1320912611264252795">Žymių išsaugojimo srautas atidarytas per visą ekrano aukštį</translation> <translation id="1327257854815634930">Naršymo istorija atidaryta</translation> <translation id="1331212799747679585">Nepavyksta atnaujinti „Chrome“. Daugiau parinkčių.</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Kad būtų galima tęsti, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> bendrins jūsų vardą ir pavardę, el. pašto adresą, adresą ir profilio nuotrauką su šia svetaine. Žr. šios svetainės <ph name="BEGIN_LINK1" />privatumo politiką<ph name="END_LINK1" />.</translation> <translation id="200114059308480249">Įtraukti aplinkinį tekstą į „Google“ paieškas?</translation> <translation id="2009341475524975924">Kad būtų galima įvertinti skelbimo našumą, svetainėse gali būti bendrinami riboto tipo duomenys, pvz., paros metas, kada skelbimas buvo rodomas.</translation> +<translation id="201060170519281460">Taikant profilio užraktą apsaugoma jūsų informacija automobilyje, įskaitant sinchronizuotus slaptažodžius, mokėjimus ir kt.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# failas}one{# failas}few{# failai}many{# failo}other{# failų}}</translation> <translation id="2021896219286479412">Viso ekrano svetainės valdikliai</translation> <translation id="2038563949887743358">Įjungti stalinio kompiuterio svetainės užklausą</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Matysite <ph name="SITE_NAME" /> prisijungimo būseną, naršymo duomenis ir svetainės duomenis sistemoje „Chrome“</translation> <translation id="2510106555128151389">Įdiegiama „<ph name="WEBAPK_NAME" />“...</translation> <translation id="2513403576141822879">Daugiau nustatymų, susijusių su privatumu, sauga ir duomenų rinkimu, žr. skiltyje <ph name="BEGIN_LINK" />„Sinchronizavimas ir „Google“ paslaugos“<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Viso dydžio lapas</translation> <translation id="2517472476991765520">Nuskaityti</translation> <translation id="2523184218357549926">Siunčiami „Google“ puslapių, kuriuose lankotės, URL</translation> <translation id="2527209463677295330">Įtraukus daugiau puslapio teksto, gali būti rodomi geresni rezultatai</translation> @@ -281,6 +285,7 @@ Privatūs prieigos raktai pagerina privatumą žiniatinklyje ir negali būti naudojami jūsų tapatybei atskleisti.</translation> <translation id="2581165646603367611">Bus išvalyti slapukai, talpykla ir kiti svetainių duomenys, kurių „Chrome“ nelaiko svarbiais.</translation> <translation id="2587052924345400782">Pasiekiama naujesnė versija</translation> +<translation id="2589302627584222634">Kurti profilio užraktą</translation> <translation id="2593272815202181319">Lygiaplotis</translation> <translation id="2603212228005142861">Prisijunkite, kad galėtumėte tvarkyti nuostatas</translation> <translation id="260403163289591229">Stebima</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Neleisti</translation> <translation id="4036177530563778041">Lengvai tęskite ten, kur baigėte</translation> <translation id="4042941173059740150">Eikite į „<ph name="SITE_ETLD_PLUS_ONE" />“ su „<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />“</translation> +<translation id="4044708993631234325">Apatinis lapas</translation> <translation id="4045764304651014138">Naudojimo duomenys</translation> <translation id="405399507749852140">Gaukite įspėjimus, jei kaina bus sumažinta bet kurioje svetainėje</translation> <translation id="4056223980640387499">Sepija</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Privatumo vadovas <ph name="BEGIN_NEW" />Nauja<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Pastarosios 7 dienos</translation> <translation id="5655963694829536461">Ieškokite atsisiųstų elementų</translation> +<translation id="5657871969392618475">Jūsų informacija apsaugota profilio užraktu</translation> <translation id="5659593005791499971">El. paštas</translation> <translation id="5665379678064389456">Sukurti įvykį naudojant „<ph name="APP_NAME" />“</translation> <translation id="5683547024293500885">„Chrome“ negali tikrinti, ar yra naujinių</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Stabdyti vaizdų aprašus</translation> <translation id="5966233851250124270">„Chrome“ prisimins jūsų pasirinkimą</translation> <translation id="5979084224081478209">Patikrinti slaptažodžius</translation> +<translation id="5985186846584605773">Automobilio profilio užrakto kūrimas</translation> <translation id="5995726099713306770">Atsisiųsti puslapį dar kartą?</translation> <translation id="6000066717592683814">Palikti „Google“</translation> <translation id="6000203700195075278">Stebėti iš naujo</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">„Chrome“ atnaujinta</translation> <translation id="7105047059074518658">Prisijunkite, kad galėtumėte lengviau naršyti skirtingais įrenginiais</translation> <translation id="7106762743910369165">Jūsų naršyklę tvarko jūsų organizacija</translation> +<translation id="7116420572655804716">Jei norite sinchronizuoti informaciją ir apsaugoti duomenis automobilyje, turite sukurti profilio užraktą saugos nustatymuose. Kiekvieną kartą, kai įsėsite į automobilį, turėsite naudoti kodą arba slaptažodį.</translation> <translation id="7116588989735740310">Grįžkite į svetaines, kuriose lankėtės kitais įrenginiais, sinchronizuodami skirtukus ir istoriją</translation> <translation id="7130504491556983216">Pomėgių sąrašas bus rodomas čia jums naršant žiniatinklyje</translation> <translation id="7138678301420049075">Kitas</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Jūsų įrenginiai<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Atnaujinti</translation> <translation id="8209050860603202033">Atidaryti vaizdą</translation> +<translation id="8215740705341534369">Šoninis lapas</translation> <translation id="8218622182176210845">Paskyros tvarkymas</translation> <translation id="8221401890884589479">Galite užblokuoti nepageidaujamas svetaines. „Chrome“ taip pat iš sąrašo automatiškai ištrina senesnes nei trisdešimt dienų svetaines. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Sklaidos kanalo kortelės meniu</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Kontaktinė namų informacija</translation> <translation id="938850635132480979">Klaida: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Įvesti slaptafrazę</translation> +<translation id="950679278154734362">Jei norite sinchronizuoti informaciją ir apsaugoti duomenis automobilyje, turite sukurti profilio užraktą. Kiekvieną kartą, kai įsėsite į automobilį, turėsite naudoti kodą arba slaptažodį.</translation> <translation id="95817756606698420">„Chrome“ gali naudoti <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" />, kai paieškos atliekamos Kinijoje. Šį nustatymą galite pakeisti skiltyje <ph name="BEGIN_LINK" />„Nustatymai“<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Įdiegti šią programą</translation> <translation id="96681097142096641">Peržiūrėti supaprastintą puslapį?</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 59ad2767..25d528b0 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Buka dlm tab baru dlm kumpulan</translation> <translation id="1103142993930332957">Bantu kami menambah baik Chrome?</translation> <translation id="1105960400813249514">Tangkapan Skrin</translation> +<translation id="1108214977745280468">Lihat cerapan halaman</translation> <translation id="1108938384783527433">Penyegerakan sejarah</translation> <translation id="1110914759170138831">Serlahan dipendekkan</translation> <translation id="1111673857033749125">Penanda halaman yang disimpan pada peranti anda yang lain akan dipaparkan di sini.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - Dihantar daripada <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Kod QR ini bukan URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">serlahan_digayakan_chrome_</translation> +<translation id="131655401280401879">Maklumat anda yang disimpan akan dipadamkan jika anda mengalih keluar kunci profil kemudian.</translation> <translation id="1320912611264252795">Folder aliran penyimpanan penanda halaman dibuka pada ketinggian penuh</translation> <translation id="1327257854815634930">Sejarah navigasi dibuka</translation> <translation id="1331212799747679585">Chrome tidak dapat dikemas kini. Lagi pilihan</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Untuk meneruskan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan berkongsi nama, alamat e-mel dan gambar profil anda dengan laman ini. Lihat <ph name="BEGIN_LINK1" />dasar privasi<ph name="END_LINK1" /> laman ini.</translation> <translation id="200114059308480249">Sertakan teks sekitar dalam carian Google?</translation> <translation id="2009341475524975924">Untuk mengukur prestasi iklan, jenis data terhad boleh dikongsi antara laman, seperti masa hari iklan dipaparkan kepada anda.</translation> +<translation id="201060170519281460">Kunci profil anda melindungi maklumat anda di dalam kereta, termasuk kata laluan yang disegerakkan, pembayaran dan pelbagai lagi.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Fail}other{# Fail}}</translation> <translation id="2021896219286479412">Kawalan tapak skrin penuh</translation> <translation id="2038563949887743358">Hidupkan Minta tapak desktop</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Anda akan melihat status log masuk <ph name="SITE_NAME" />, data semakan imbas dan data tapak anda dalam Chrome</translation> <translation id="2510106555128151389">Memasang <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Untuk mendapatkan lebih banyak tetapan yang berkaitan dengan privasi, keselamatan dan pengumpulan data, lihat <ph name="BEGIN_LINK" />Penyegerakan dan perkhidmatan Google<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Helaian saiz penuh</translation> <translation id="2517472476991765520">Imbas</translation> <translation id="2523184218357549926">Menghantar URL halaman yang anda lawati kepada Google</translation> <translation id="2527209463677295330">Dengan menyertakan lebih banyak teks halaman, anda mungkin melihat hasil yang lebih baik</translation> @@ -281,6 +285,7 @@ Token keadaan sulit meningkatkan privasi pada web dan tidak boleh digunakan untuk mengetahui identiti anda.</translation> <translation id="2581165646603367611">Tindakan ini akan menghapuskan kuki, cache dan data tapak yang lain yang Chrome anggap tidak penting.</translation> <translation id="2587052924345400782">Versi lebih baharu tersedia</translation> +<translation id="2589302627584222634">Buat kunci profil</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Log masuk untuk mengurus keutamaan anda</translation> <translation id="260403163289591229">Mengikuti</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Jangan benarkan</translation> <translation id="4036177530563778041">Teruskan dari tempat anda berhenti dengan mudah</translation> <translation id="4042941173059740150">Terus kepada <ph name="SITE_ETLD_PLUS_ONE" /> dengan <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Helaian bawah</translation> <translation id="4045764304651014138">Data penggunaan</translation> <translation id="405399507749852140">Dapatkan makluman sekiranya harga jatuh pada mana-mana laman</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Panduan Privasi <ph name="BEGIN_NEW" />Baharu<ph name="END_NEW" /></translation> <translation id="5648166631817621825">7 hari lalu</translation> <translation id="5655963694829536461">Cari muat turun anda</translation> +<translation id="5657871969392618475">Maklumat anda dilindungi dengan kunci profil</translation> <translation id="5659593005791499971">E-mel</translation> <translation id="5665379678064389456">Buat acara dalam <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome tidak dapat menyemak kemas kini</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Hentikan perihalan imej</translation> <translation id="5966233851250124270">Chrome akan mengingati pilihan anda</translation> <translation id="5979084224081478209">Semak kata laluan</translation> +<translation id="5985186846584605773">Buat kunci profil untuk kereta anda</translation> <translation id="5995726099713306770">Muat turun halaman sekali lagi?</translation> <translation id="6000066717592683814">Kekalkan Google</translation> <translation id="6000203700195075278">Ikuti semula</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome sudah dikemas kini</translation> <translation id="7105047059074518658">Log masuk untuk menyemak imbas dengan lebih mudah di seluruh peranti</translation> <translation id="7106762743910369165">Penyemak imbas anda diurus oleh organisasi anda</translation> +<translation id="7116420572655804716">Untuk menyegerakkan maklumat anda dan melindungi data anda di dalam kereta, anda perlu membuat kunci profil dalam tetapan keselamatan anda. Anda akan menggunakan kod dan kata laluan setiap kali anda memasuki kereta.</translation> <translation id="7116588989735740310">Untuk kembali kepada laman yang telah anda lawati pada peranti lain, segerakkan tab dan sejarah anda</translation> <translation id="7130504491556983216">Senarai minat akan dipaparkan di sini semasa anda menyemak imbas web</translation> <translation id="7138678301420049075">Lain-lain</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Peranti anda<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Sambung semula</translation> <translation id="8209050860603202033">Buka imej</translation> +<translation id="8215740705341534369">Helaian sisi</translation> <translation id="8218622182176210845">Urus akaun anda</translation> <translation id="8221401890884589479">Anda boleh menyekat laman yang anda tidak mahu. Chrome juga memadamkan laman yang disimpan melebihi 30 hari daripada senarai secara automatik. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Menu kad suapan</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Laman Utama</translation> <translation id="938850635132480979">Ralat: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Masukkan frasa laluan</translation> +<translation id="950679278154734362">Untuk menyegerakkan maklumat anda dan melindungi data anda di dalam kereta, anda perlu membuat kunci profil. Anda akan menggunakan kod dan kata laluan setiap kali anda memasuki kereta.</translation> <translation id="95817756606698420">Chrome boleh menggunakan <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> untuk melakukan carian di China. Anda boleh menukarnya dalam <ph name="BEGIN_LINK" />Tetapan<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Pasang apl ini</translation> <translation id="96681097142096641">Lihat paparan mudah?</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 6e58eae4..20d9bc70 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">အုပ်စုရှိ တဘ်အသစ်တွင် ဖွင့်ပါ</translation> <translation id="1103142993930332957">Chrome ပိုကောင်းစေရန် ကူညီမလား။</translation> <translation id="1105960400813249514">ဖန်သားပြင် ပုံဖမ်းခြင်း</translation> +<translation id="1108214977745280468">စာမျက်နှာ၏သိကောင်းစရာ ကြည့်ရန်</translation> <translation id="1108938384783527433">မှတ်တမ်းစင့်ခ်လုပ်ခြင်း</translation> <translation id="1110914759170138831">မြင်သာအောင်လုပ်ထားသော စာသားကို အတိုချုံ့လိုက်သည်</translation> <translation id="1111673857033749125">သင်၏ အခြားစက်ပစ္စည်းများပေါ်တွင် သိမ်းဆည်းထားသည့် ဝဘ်လိပ်စာများ ဤနေရာတွင် ပေါ်ပါမည်။</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> မှ ပို့ထားသည်</translation> <translation id="1311657260431405215">ဤ 'QR ကုဒ်' သည် URL မဟုတ်ပါ- <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">ပရိုဖိုင်လော့ခ်ကို နောက်ပိုင်းတွင် ဖယ်ရှားပါက သိမ်းထားသော အချက်အလက်များကို ဖျက်ပါမည်။</translation> <translation id="1320912611264252795">လိပ်စာသိမ်းရန် လုပ်ငန်းစဉ်ကို မြင်ကွင်းအပြည့်ဖွင့်ထားသည်</translation> <translation id="1327257854815634930">လမ်းညွှန်မှု မှတ်တမ်း ဖွင့်ထားသည်</translation> <translation id="1331212799747679585">Chrome ကို အပ်ဒိတ်လုပ်၍မရပါ။ နောက်ထပ်ရွေးချယ်စရာများ</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">ရှေ့ဆက်ရန် <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> က သင့်အမည်၊ အီးမေးလ်လိပ်စာနှင့် ပရိုဖိုင်ပုံကို ဤဝဘ်ဆိုက်အား မျှဝေမည်။ ဤဝဘ်ဆိုက်၏ <ph name="BEGIN_LINK1" />ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒ<ph name="END_LINK1" /> ကို ကြည့်ပါ။</translation> <translation id="200114059308480249">Google ရှာဖွေမှုများတွင် ဝန်းကျင်ရှိစာသားကို ထည့်သွင်းမလား။</translation> <translation id="2009341475524975924">ကြော်ငြာစွမ်းဆောင်ရည်ကို တိုင်းတာရန် တစ်နေ့တာတွင် သင့်အား ကြော်ငြာပြသည့်အချိန်ကဲ့သို့ ကန့်သတ်ဒေတာအမျိုးအစားများကို ဝဘ်ဆိုက်များအကြား မျှဝေနိုင်သည်။</translation> +<translation id="201060170519281460">သင်၏ပရိုဖိုင်လော့ခ်သည် စင့်ခ်လုပ်ထားသော စကားဝှက်များ၊ ငွေပေးချေမှု စသည်တို့အပါအဝင် ကားထဲတွင် သင့်အချက်အလက်များကို လုံခြုံစေသည်။</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ဖိုင်}other{# ဖိုင်}}</translation> <translation id="2021896219286479412">မျက်နှာပြင်အပြည့် ထိန်းချုပ်မှု</translation> <translation id="2038563949887743358">ဆိုဒ်ကြီး တောင်းဆိုမှု ဖွင့်မည်</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">သင်၏ <ph name="SITE_NAME" /> လက်မှတ်ထိုးဝင်မှု အခြေအနေ၊ ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာနှင့် ဝဘ်ဆိုက်ဒေတာများကို Chrome တွင် မြင်ရပါမည်</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> ထည့်သွင်းနေသည်...</translation> <translation id="2513403576141822879">ကိုယ်ရေးအချက်အလက်လုံခြုံမှု၊ လုံခြုံရေးနှင့် ဒေတာစုဆောင်းမှုတို့နှင့် ဆက်စပ်နေသည့် နောက်ထပ် ဆက်တင်များအတွက် <ph name="BEGIN_LINK" />စင့်ခ်လုပ်ခြင်းနှင့် Google ဝန်ဆောင်မှုများ<ph name="END_LINK" /> ကို ကြည့်ပါ</translation> +<translation id="2517113738956581680">စာမျက်နှာ အရွယ်အစားအပြည့်</translation> <translation id="2517472476991765520">ရှာဖွေရန်</translation> <translation id="2523184218357549926">သင်ကြည့်ရှုသည့် စာမျက်နှာများ၏ URL များကို Google သို့ ပို့သည်</translation> <translation id="2527209463677295330">စာမျက်နှာ၏စာသားများ ပိုမိုပါဝင်ပါက ပိုကောင်းသောရလဒ်များ တွေ့ရနိုင်သည်</translation> @@ -281,6 +285,7 @@ သီးသန့်အခြေအနေ တိုကင်များသည် ဝဘ်ပေါ်တွင် ကိုယ်ရေးအချက်အလက်လုံခြုံမှု ပိုကောင်းမွန်စေပြီး သင်မည်သူဖြစ်ကြောင်း ရှာဖွေရာတွင် အသုံးမပြုနိုင်ပါ။</translation> <translation id="2581165646603367611">၎င်းသည် Chrome က အရေးကြီးသည်ဟု မယူဆသည့် ကွတ်ကီးများ၊ ယာယီမှတ်ဉာဏ်များနှင့် ဆိုက်များ၏ အခြားဒေတာများကို ရှင်းလင်းလိုက်ပါမည်။</translation> <translation id="2587052924345400782">ပိုသစ်သော ဗားရှင်း ရှိပါသည်</translation> +<translation id="2589302627584222634">ပရိုဖိုင်လော့ခ် ပြုလုပ်မည်</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">သင့်သတ်မှတ်ချက်များကို စီမံရန် လက်မှတ်ထိုးဝင်ပါ</translation> <translation id="260403163289591229">လိုက်ကြည့်နေသည်များ</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">ခွင့်မပြုပါ</translation> <translation id="4036177530563778041">သင်ထားခဲ့သည့်နေရာမှ လွယ်ကူစွာ ရှေ့ဆက်နိုင်သည်</translation> <translation id="4042941173059740150"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ဖြင့် <ph name="SITE_ETLD_PLUS_ONE" /> ကို ရှေ့ဆက်ပါ</translation> +<translation id="4044708993631234325">အောက်ခြေအပိုဆောင်း စာမျက်နှာ</translation> <translation id="4045764304651014138">သုံးစွဲမှုဒေတာ</translation> <translation id="405399507749852140">ဝဘ်ဆိုက်တစ်ခုခုတွင် ဈေးကျသွားပါက သတိပေးချက်များ ရယူနိုင်သည်</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">ကိုယ်ရေးအချက်အလက်လုံခြုံမှုလမ်းညွှန် <ph name="BEGIN_NEW" />အသစ်<ph name="END_NEW" /></translation> <translation id="5648166631817621825">ပြီးခဲ့သည့် ၇ ရက်</translation> <translation id="5655963694829536461">ဒေါင်းလုဒ်များကို ရှာဖွေပါ</translation> +<translation id="5657871969392618475">ပရိုဖိုင်လော့ခ်ချခြင်းဖြင့် သင့်အချက်အလက် လုံခြုံပါသည်</translation> <translation id="5659593005791499971">အီးမေးလ်</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> တွင် အစီအစဉ် ပြုလုပ်ပါ</translation> <translation id="5683547024293500885">Chrome က သင့်အပ်ဒိတ်များကို စစ်ဆေး၍မရပါ</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">ပုံရှင်းလင်းချက်များ ရပ်ရန်</translation> <translation id="5966233851250124270">သင့်ရွေးချယ်မှုကို Chrome က မှတ်ထားပါမည်</translation> <translation id="5979084224081478209">စကားဝှက်များ စစ်ဆေးရန်</translation> +<translation id="5985186846584605773">သင့်ကားအတွက် ပရိုဖိုင်လော့ခ် ပြုလုပ်ပါ</translation> <translation id="5995726099713306770">စာမျက်နှာကို ထပ်မံဒေါင်းလုဒ်လုပ်လိုပါသလား။</translation> <translation id="6000066717592683814">Google ကို ဆက်သုံးရန်</translation> <translation id="6000203700195075278">ပြန်လည်လိုက်ကြည့်ရန်</translation> @@ -1136,6 +1144,7 @@ <translation id="7088681679121566888">Chrome က အပ်ဒိတ်ဖြစ်နေပြီ</translation> <translation id="7105047059074518658">စက်များကြား လွယ်ကူစွာကြည့်ရှုနိုင်ရန် လက်မှတ်ထိုးဝင်ပါ</translation> <translation id="7106762743910369165">သင့်ဘရောင်ဇာကို သင့်အဖွဲ့အစည်းက စီမံခန့်ခွဲသည်</translation> +<translation id="7116420572655804716">အချက်အလက်များကို စင့်ခ်လုပ်ပြီး သင့်ဒေတာကို ကားထဲတွင် လုံခြုံအောင်ထားရန် လုံခြုံရေးဆက်တင်များတွင် ပရိုဖိုင်လော့ခ်တစ်ခု ပြုလုပ်ရမည်။ ကားထဲသို့ဝင်တိုင်း ကုဒ် (သို့) စကားဝှက်ကို အသုံးပြုရမည်။</translation> <translation id="7116588989735740310">အခြားစက်တွင် ဝင်ကြည့်ထားသည့် ဝဘ်ဆိုက်များသို့ ပြန်သွားရန် တဘ်နှင့် မှတ်တမ်းများကို စင့်ခ်လုပ်ပါ</translation> <translation id="7130504491556983216">ဝဘ်ကြည့်ရှုတိုင်း ဤနေရာတွင် စိတ်ဝင်စားမှုစာရင်း ပေါ်လာမည်</translation> <translation id="7138678301420049075">အခြား</translation> @@ -1357,6 +1366,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />သင့်စက်ပစ္စည်းများ<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">ပြန်ဆက်ရန်</translation> <translation id="8209050860603202033">ပုံဖွင့်</translation> +<translation id="8215740705341534369">အရန်စာမျက်နှာ</translation> <translation id="8218622182176210845">သင့်အကောင့်ကို စီမံခန့်ခွဲခြင်း</translation> <translation id="8221401890884589479">သင်မလိုလားသည့် ဝဘ်ဆိုက်များကို ပိတ်ထားနိုင်သည်။ ရက် ၃၀ ကျော်ပြီဖြစ်သော ဝဘ်ဆိုက်များကိုလည်း Chrome က အလိုအလျောက်ဖျက်သည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="8223642481677794647">ဖိဒ်ကတ်မီနူး</translation> @@ -1559,6 +1569,7 @@ <translation id="932327136139879170">ပင်မ</translation> <translation id="938850635132480979">အမှား- <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">စကားစုဝှက်ကို ရိုက်ထည့်ရန်</translation> +<translation id="950679278154734362">သင့်အချက်အလက်များကို စင့်ခ်လုပ်ပြီး သင့်ဒေတာကို ကားထဲတွင် လုံခြုံအောင်ထားရန် ပရိုဖိုင်လော့ခ်တစ်ခု ပြုလုပ်ရမည်။ ကားထဲသို့ဝင်တိုင်း ကုဒ် (သို့) စကားဝှက်ကို အသုံးပြုရမည်။</translation> <translation id="95817756606698420">Chrome သည် တရုတ်ပြည်တွင် ရှာဖွေရန် <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> ကို အသုံးပြုနိုင်ပါသည်။ ၎င်းကို <ph name="BEGIN_LINK" />ဆက်တင်များ<ph name="END_LINK" /> ထဲတွင် ပြောင်းလဲနိုင်သည်။</translation> <translation id="962979164594783469">ဤအက်ပ်ကို ထည့်သွင်းရန်</translation> <translation id="96681097142096641">ရိုးရှင်းအောင်ပြုထားသော စာမျက်နှာကို ကြည့်မလား။</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 696edc9..0ce1970 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">समूहमा नयाँ ट्याबमा खोल्नुहोस्</translation> <translation id="1103142993930332957">Chrome को गुणस्तर सुधार्न सघाउने हो?</translation> <translation id="1105960400813249514">स्क्रिन क्याप्चर</translation> +<translation id="1108214977745280468">यो पेजको विश्लेषणात्मक डेटा हेर्नुहोस्</translation> <translation id="1108938384783527433">ब्राउजिङ इतिहास सिंक गरियोस्</translation> <translation id="1110914759170138831">हाइलाइट गरिएको पाठ छोट्याइएको छ</translation> <translation id="1111673857033749125">तपाईँका अन्य डिभाइसमा सुरक्षित गरिएका पुस्तक चिन्हहरू यहाँ देखिनेछन्।</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> बाट पठाइएको</translation> <translation id="1311657260431405215">यो QR कोड कुनै URL होइन: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">तपाईंले पछि प्रोफाइल लक हटाउनुभयो भने सेभ गरिएको तपाईंको जानकारी मेटाइने छ।</translation> <translation id="1320912611264252795">बुकमार्क सेभ गर्ने फ्लोका फोल्डरहरू स्क्रिनको पूरा भाग ओगट्ने गरी खोलिएको छ</translation> <translation id="1327257854815634930">नेभिगेसनको इतिहास खोलियो</translation> <translation id="1331212799747679585">Chrome अद्यावधिक गर्न सकिँदैन। थप विकल्पहरू</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ले जारी राख्ने प्रयोजनका लागि यो साइटसँग तपाईंको नाम, इमेल ठेगाना र प्रोफाइल फोटो सेयर गर्ने छ। यो साइटको <ph name="BEGIN_LINK1" />गोपनीयता नीति<ph name="END_LINK1" /> हेर्नुहोस्।</translation> <translation id="200114059308480249">Google मा कुनै शब्द वा वाक्यांशका बारेमा थप जानकारी खोज्दा सो शब्द वा वाक्यांश वरपरका पाठहरू पनि समावेश गर्ने हो?</translation> <translation id="2009341475524975924">कुनै विज्ञापनको पर्फर्मेन्स मापन गर्ने प्रयोजनका लागि साइटहरूसँग तपाईंलाई कुनै विज्ञापन दिनको कुन बेला देखाइएको थियो भन्नेलगायतका सीमित प्रकारका जानकारी सेयर गरिन सक्छ।</translation> +<translation id="201060170519281460">तपाईंको प्रोफाइल लकले सिंक गरिएका पासवर्ड र भुक्तानीलगायतका तपाईंका अन्य जानकारी कारमा सुरक्षित राख्छ।</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# फाइल}other{# फाइलहरू}}</translation> <translation id="2021896219286479412">पूर्ण स्क्रिनको साइटका नियन्त्रणहरू</translation> <translation id="2038563949887743358">अनुरोध डेस्कटप साइट खोल्नुहोस्</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">तपाईं Chrome मा आफ्नो <ph name="SITE_NAME" /> को साइन इनसम्बन्धी अवस्था, ब्राउजिङ डेटा र साइट डेटा देख्नु हुने छ</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> इन्स्टल गरिँदै छ...</translation> <translation id="2513403576141822879">गोपनीयता, सुरक्षा र डेटाको सङ्कलनसँग सम्बन्धित थप सेटिङहरूका लागि <ph name="BEGIN_LINK" />सिंक तथा वैयक्तीकरण<ph name="END_LINK" /> नामक खण्ड हेर्नुहोस्</translation> +<translation id="2517113738956581680">पूर्ण आकारको पाना</translation> <translation id="2517472476991765520">स्क्यान गर्नुहोस्</translation> <translation id="2523184218357549926">तपाईं जाने पृष्ठका URL हरू Google मा पठाउँछ</translation> <translation id="2527209463677295330">तपाईंले पेजमा भएका थप पाठहरू समावेश गर्नुभयो भने तपाईं अझ सान्दर्भिक परिणामहरू देख्न सक्नुहुन्छ</translation> @@ -281,6 +285,7 @@ प्राइभेट स्टेट टोकनहरूले वेबमा गोपनीयताको अवस्था सुधार्छन् र तपाईंको पहिचान पत्ता लगाउने प्रयोजनका लागि ती टोकन प्रयोग गर्न पाइँदैन।</translation> <translation id="2581165646603367611">यसले कुकी, क्यास र साइटहरूको Chrome लाई महत्वपूर्ण नलाग्ने अन्य डेटा हटाउने छ।</translation> <translation id="2587052924345400782">नयाँ संस्करण उपलब्ध छ</translation> +<translation id="2589302627584222634">प्रोफाइल लक बनाउनुहोस्</translation> <translation id="2593272815202181319">मोनोस्पेस</translation> <translation id="2603212228005142861">आफ्ना प्राथमिकताहरू व्यवस्थापन गर्न साइन इन गर्नुहोस्</translation> <translation id="260403163289591229">फलो गरिएका</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">अनुमति नदिनुहोस्</translation> <translation id="4036177530563778041">आफूले छाडेकै ठाउँबाट सजिलैसँग जारी राख्नुहोस्</translation> <translation id="4042941173059740150"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> प्रयोग गरी <ph name="SITE_ETLD_PLUS_ONE" /> मा साइन इन गर्नुहोस्</translation> +<translation id="4044708993631234325">पुछारको पाना</translation> <translation id="4045764304651014138">प्रयोगसम्बन्धी डेटा</translation> <translation id="405399507749852140">कुनै साइटमा मूल्य घटेका खण्डमा अलर्ट प्राप्त गर्नुहोस्</translation> <translation id="4056223980640387499">सेपिया</translation> @@ -845,6 +851,7 @@ <translation id="564667659802381754">गोपनीयतासम्बन्धी गाइड <ph name="BEGIN_NEW" />नयाँ<ph name="END_NEW" /></translation> <translation id="5648166631817621825">पछिल्ला ७ दिन</translation> <translation id="5655963694829536461">आफ्ना डाउनलोडहरू खोज्नुहोस्</translation> +<translation id="5657871969392618475">तपाईंको जानकारी प्रोफाइल लकका सहायताले सुरक्षित राखिएको छ</translation> <translation id="5659593005791499971">इमेल</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> मा घटना सिर्जना गर्नुहोस्</translation> <translation id="5683547024293500885">Chrome ले अपडेट उपलब्ध छन् कि छैनन् भन्ने कुरा जाँच गर्न सकेन</translation> @@ -908,6 +915,7 @@ <translation id="5964869237734432770">फोटो विवरण पाउन छाड्नुहोस्</translation> <translation id="5966233851250124270">Chrome ले तपाईंले छनौट गरेको सेटिङ याद राख्ने छ</translation> <translation id="5979084224081478209">पासवर्डहरूको जाँच गर्नुहोस्</translation> +<translation id="5985186846584605773">आफ्नो कारमा प्रोफाइल लक बनाउनुहोस्</translation> <translation id="5995726099713306770">यो पेज फेरि डाउनलोड गर्ने हो?</translation> <translation id="6000066717592683814">Google लाई डिफल्ट खोज इञ्जिनका रूपमा कायम राख्नुहोस्</translation> <translation id="6000203700195075278">पुनः फलो गर्नुहोस्</translation> @@ -1136,6 +1144,7 @@ <translation id="7088681679121566888">Chrome अपडेट छ</translation> <translation id="7105047059074518658">तपाईं विभिन्न डिभाइसमा सजिलै ब्राउज गर्न चाहनुहुन्छ भने साइन इन गर्नुहोस्</translation> <translation id="7106762743910369165">तपाईंको संगठनले तपाईंको ब्राउजर व्यवस्थापन गर्छ</translation> +<translation id="7116420572655804716">कारमा आफ्नो जानकारी सिंक गर्न र उक्त डेटा सुरक्षित राख्न तपाईंले अनिवार्य रूपमा आफ्ना सुरक्षा सेटिङमा गई प्रोफाइल लक बनाउनु पर्छ। तपाईंले हरेक पटक कारमा छिर्दा कोड वा पासवर्ड प्रयोग गर्नु पर्ने हुन्छ।</translation> <translation id="7116588989735740310">आफूले अन्य डिभाइसमा खोलेका साइटहरू फेरि खोल्न आफ्ना ट्याब र हिस्ट्री सिंक गर्नुहोस्</translation> <translation id="7130504491556983216">तपाईंले वेब ब्राउज गरेपछि रुचिहरूको सूची यहाँ देखिने छ</translation> <translation id="7138678301420049075">अन्य</translation> @@ -1357,6 +1366,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />तपाईंका डिभाइसहरू<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">रिजुमी</translation> <translation id="8209050860603202033">छवि खोल्नुहोस्</translation> +<translation id="8215740705341534369">छेउको पाना</translation> <translation id="8218622182176210845">आफ्नो खाताको व्यवस्थापन गर्नुहोस्</translation> <translation id="8221401890884589479">तपाईं आफूलाई नचाहिने साइटहरू ब्लक गर्न सक्नुहुन्छ। साथै Chrome ले पनि उक्त सूचीमा भएका ३० दिनभन्दा पुराना साइटहरू स्वतः मेटाउँछ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="8223642481677794647">फिड कार्ड मेनु</translation> @@ -1559,6 +1569,7 @@ <translation id="932327136139879170">गृहपृष्ठ</translation> <translation id="938850635132480979">त्रुटि: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">पासफ्रेज प्रविष्टि गर्नुहोस्</translation> +<translation id="950679278154734362">कारमा आफ्नो जानकारी सिंक गर्न र उक्त डेटा सुरक्षित राख्न तपाईंले अनिवार्य रूपमा प्रोफाइल लक बनाउनु पर्छ। तपाईंले हरेक पटक कारमा छिर्दा कोड वा पासवर्ड प्रयोग गर्नु पर्ने हुन्छ।</translation> <translation id="95817756606698420">Chrome ले चीनमा खोज गर्नका लागि <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> को प्रयोग गर्न सक्छ। तपाईं <ph name="BEGIN_LINK" />सेटिङहरू<ph name="END_LINK" />मा गई यसलाई बदल्न सक्नुहुन्छ।</translation> <translation id="962979164594783469">यो एप इन्स्टल गर्नुहोस्</translation> <translation id="96681097142096641">सरलीकृत पेज हेर्ने हो?</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 34644884..051e25f1a 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">ਗਰੁੱਪ 'ਚ ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="1103142993930332957">ਕੀ Chrome ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="1105960400813249514">ਸਕ੍ਰੀਨ ਕੈਪਚਰ</translation> +<translation id="1108214977745280468">ਪੰਨੇ ਦੀਆਂ ਅੰਦਰੂਨੀ-ਝਾਤਾਂ ਦੇਖੋ</translation> <translation id="1108938384783527433">ਇਤਿਹਾਸ ਸਿੰਕ</translation> <translation id="1110914759170138831">ਹਾਈਲਾਈਟ ਨੂੰ ਛੋਟਾ ਕੀਤਾ ਗਿਆ</translation> <translation id="1111673857033749125">ਤੁਹਾਡੀਆਂ ਹੋਰ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤੇ ਬੁੱਕਮਾਰਕ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੇ।</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> ਵੱਲੋਂ ਭੇਜੀ ਗਈ</translation> <translation id="1311657260431405215">ਇਹ QR Code ਕੋਈ URL ਨਹੀਂ ਹੈ: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">ਜੇ ਤੁਸੀਂ ਬਾਅਦ ਵਿੱਚ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਹਟਾ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੀ ਰੱਖਿਅਤ ਕੀਤੀ ਜਾਣਕਾਰੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ।</translation> <translation id="1320912611264252795">ਬੁੱਕਮਾਰਕ ਰੱਖਿਅਤ ਕਰਨ ਸੰਬੰਧੀ ਪ੍ਰਵਾਹ ਵਾਲਾ ਫੋਲਡਰ ਪੂਰੀ ਉਚਾਈ ਤੱਕ ਖੋਲ੍ਹਿਆ ਗਿਆ ਹੈ</translation> <translation id="1327257854815634930">ਨੈਵੀਗੇਸ਼ਨ ਇਤਿਹਾਸ ਖੁੱਲ੍ਹਾ ਹੋਇਆ ਹੈ</translation> <translation id="1331212799747679585">Chrome ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਹੋਰ ਵਿਕਲਪ</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">ਜਾਰੀ ਰੱਖਣ ਲਈ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ਤੁਹਾਡੇ ਨਾਮ, ਈਮੇਲ ਪਤੇ ਅਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਨੂੰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਕਰੇਗਾ। ਇਸ ਸਾਈਟ ਦੀ <ph name="BEGIN_LINK1" />ਪਰਦੇਦਾਰੀ ਨੀਤੀ<ph name="END_LINK1" /> ਦੇਖੋ।</translation> <translation id="200114059308480249">ਕੀ Google ਖੋਜਾਂ ਵਿੱਚ ਆਲੇ-ਦੁਆਲੇ ਦੀ ਲਿਖਤ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ?</translation> <translation id="2009341475524975924">ਕਿਸੇ ਵਿਗਿਆਪਨ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਦਾ ਮੁਲਾਂਕਣ ਕਰਨ ਲਈ, ਸਾਈਟਾਂ ਵਿਚਕਾਰ ਸੀਮਤ ਕਿਸਮ ਦਾ ਡਾਟਾ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਦਿਨ ਦਾ ਉਹ ਸਮਾਂ ਜਦੋਂ ਤੁਹਾਨੂੰ ਵਿਗਿਆਪਨ ਦਿਖਾਇਆ ਗਿਆ ਸੀ।</translation> +<translation id="201060170519281460">ਤੁਹਾਡਾ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਕਾਰ ਵਿੱਚ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਸਿੰਕ ਕੀਤੇ ਪਾਸਵਰਡ, ਭੁਗਤਾਨ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਸ਼ਾਮਲ ਹੈ।</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ਫ਼ਾਈਲ}one{# ਫ਼ਾਈਲ}other{# ਫ਼ਾਈਲਾਂ}}</translation> <translation id="2021896219286479412">ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੇ ਸਾਈਟ ਕੰਟਰੋਲ</translation> <translation id="2038563949887743358">ਬੇਨਤੀ ਡੈਸਕਟਾਪ ਸਾਈਟ ਚਾਲੂ ਕਰੋ</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">ਤੁਸੀਂ Chrome ਵਿੱਚ ਆਪਣੀ <ph name="SITE_NAME" /> ਸਾਈਨ-ਇਨ ਸਥਿਤੀ, ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਅਤੇ ਸਾਈਟ ਡਾਟਾ ਦੇਖੋਗੇ</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="2513403576141822879">ਪਰਦੇਦਾਰੀ, ਸੁਰੱਖਿਆ ਅਤੇ ਡਾਟਾ ਇਕੱਤਰ ਕਰਨ ਸੰਬੰਧੀ ਹੋਰ ਸੈਟਿੰਗਾਂ ਲਈ, <ph name="BEGIN_LINK" />ਸਿੰਕ ਅਤੇ Google ਸੇਵਾਵਾਂ<ph name="END_LINK" /> ਦੇਖੋ</translation> +<translation id="2517113738956581680">ਪੂਰੇ-ਆਕਾਰ ਦੀ ਸ਼ੀਟ</translation> <translation id="2517472476991765520">ਸਕੈਨ ਕਰੋ</translation> <translation id="2523184218357549926">Google ਨੂੰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਜਾਣ ਵਾਲੇ ਪੰਨਿਆਂ ਦੇ URL ਭੇਜਦੀ ਹੈ</translation> <translation id="2527209463677295330">ਕਿਸੇ ਪੰਨੇ ਦੀ ਹੋਰ ਲਿਖਤ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਕੇ, ਸ਼ਾਇਦ ਤੁਹਾਨੂੰ ਬਿਹਤਰ ਨਤੀਜੇ ਦਿਖਾਈ ਦੇਣ</translation> @@ -281,6 +285,7 @@ ਨਿੱਜੀ ਸਥਿਤੀ ਦੇ ਟੋਕਨ ਵੈੱਬ 'ਤੇ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦੇ ਹਨ ਅਤੇ ਉਨ੍ਹਾਂ ਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਬਾਰੇ ਪਤਾ ਲਗਾਉਣ ਲਈ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</translation> <translation id="2581165646603367611">ਇਹ ਉਹਨਾਂ ਸਾਈਟਾਂ ਦੀਆਂ ਕੁਕੀਜ਼, ਕੈਸ਼ੇ, ਅਤੇ ਹੋਰ ਡਾਟੇ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗਾ ਜੋ Chrome ਅਨੁਸਾਰ ਮਹੱਤਵਪੂਰਨ ਨਹੀਂ ਹਨ।</translation> <translation id="2587052924345400782">ਨਵਾਂ ਵਰਜਨ ਉਪਲਬਧ ਹੈ</translation> +<translation id="2589302627584222634">ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਓ</translation> <translation id="2593272815202181319">ਮੋਨੋਸਪੇਸ</translation> <translation id="2603212228005142861">ਆਪਣੀਆਂ ਤਰਜੀਹਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="260403163289591229">ਅਨੁਸਰਣ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">ਆਗਿਆ ਨਾ ਦਿਓ</translation> <translation id="4036177530563778041">ਜਿੱਥੇ ਤੁਸੀਂ ਛੱਡਿਆ ਸੀ ਉੱਥੋਂ ਹੀ ਆਸਾਨੀ ਨਾਲ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="4042941173059740150"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ਨਾਲ <ph name="SITE_ETLD_PLUS_ONE" /> 'ਤੇ ਜਾਰੀ ਰੱਖੋ</translation> +<translation id="4044708993631234325">ਹੇਠਲੀ ਸ਼ੀਟ</translation> <translation id="4045764304651014138">ਵਰਤੋਂ ਡਾਟਾ</translation> <translation id="405399507749852140">ਕਿਸੇ ਵੀ ਸਾਈਟ 'ਤੇ ਕੀਮਤਾਂ ਘਟਣ 'ਤੇ ਸੁਚੇਤਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="4056223980640387499">Sepia</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">ਪਰਦੇਦਾਰੀ ਗਾਈਡ <ph name="BEGIN_NEW" />ਨਵੀਂ<ph name="END_NEW" /></translation> <translation id="5648166631817621825">ਪਿਛਲੇ 7 ਦਿਨ</translation> <translation id="5655963694829536461">ਆਪਣੇ ਡਾਊਨਲੋਡ ਖੋਜੋ</translation> +<translation id="5657871969392618475">ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਨੂੰ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਦੀ ਮਦਦ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="5659593005791499971">ਈਮੇਲ</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> ਵਿੱਚ ਵਰਤਾਰਾ ਬਣਾਓ</translation> <translation id="5683547024293500885">Chrome ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">ਚਿੱਤਰ ਦੇ ਵਰਣਨ ਬੰਦ ਕਰੋ</translation> <translation id="5966233851250124270">Chrome ਤੁਹਾਡੀ ਚੋਣ ਨੂੰ ਯਾਦ ਰੱਖੇਗਾ</translation> <translation id="5979084224081478209">ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> +<translation id="5985186846584605773">ਆਪਣੀ ਕਾਰ ਲਈ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਓ</translation> <translation id="5995726099713306770">ਕੀ ਪੰਨਾ ਦੁਬਾਰਾ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ?</translation> <translation id="6000066717592683814">Google ਰੱਖੋ</translation> <translation id="6000203700195075278">ਮੁੜ-ਅਨੁਸਰਣ ਕਰੋ</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome ਅੱਪ-ਟੂ-ਡੇਟ ਹੈ</translation> <translation id="7105047059074518658">ਡੀਵਾਈਸਾਂ 'ਤੇ ਵਧੇਰੇ ਆਸਾਨੀ ਨਾਲ ਬ੍ਰਾਊਜ਼ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="7106762743910369165">ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> +<translation id="7116420572655804716">ਆਪਣੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰਨ ਅਤੇ ਕਾਰ ਵਿੱਚ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਤੁਹਾਡਾ ਆਪਣੀਆਂ ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਉਣਾ ਲਾਜ਼ਮੀ ਹੈ। ਤੁਸੀਂ ਹਰ ਵਾਰ ਕਾਰ ਵਿੱਚ ਦਾਖਲ ਹੋਣ 'ਤੇ ਇੱਕ ਕੋਡ ਜਾਂ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋਗੇ।</translation> <translation id="7116588989735740310">ਜੋ ਸਾਈਟਾਂ ਤੁਸੀਂ ਹੋਰ ਡੀਵਾਈਸਾਂ ਤੋਂ ਦੇਖੀਆਂ ਹਨ ਉਨ੍ਹਾਂ 'ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ, ਆਪਣੀਆਂ ਟੈਬਾਂ ਅਤੇ ਇਤਿਹਾਸ ਸਿੰਕ ਕਰੋ</translation> <translation id="7130504491556983216">ਵੈੱਬ 'ਤੇ ਬ੍ਰਾਊਜ਼ ਕਰਦੇ ਹੋਏ ਦਿਲਚਸਪੀਆਂ ਦੀ ਸੂਚੀ ਇੱਥੇ ਦਿਸੇਗੀ</translation> <translation id="7138678301420049075">ਹੋਰ</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />ਤੁਹਾਡੇ ਡੀਵਾਈਸ<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ</translation> <translation id="8209050860603202033">ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation> +<translation id="8215740705341534369">ਸਾਈਡ ਸ਼ੀਟ</translation> <translation id="8218622182176210845">ਆਪਣੇ ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="8221401890884589479">ਤੁਹਾਨੂੰ ਜੋ ਸਾਈਟਾਂ ਨਹੀਂ ਚਾਹੀਦੀਆਂ, ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ ਬਲਾਕ ਕਰ ਸਕਦੇ ਹੋ। Chrome 30 ਦਿਨਾਂ ਤੋਂ ਵੱਧ ਪੁਰਾਣੀਆਂ ਸਾਈਟਾਂ ਨੂੰ ਵੀ ਸੂਚੀ ਤੋਂ ਸਵੈਚਲਿਤ-ਮਿਟਾਉਂਦਾ ਹੈ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="8223642481677794647">ਫ਼ੀਡ ਕਾਰਡ ਮੀਨੂ</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">ਹੋਮ</translation> <translation id="938850635132480979">ਗੜਬੜ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ਪਾਸਫਰੇਜ਼ ਦਾਖਲ ਕਰੋ</translation> +<translation id="950679278154734362">ਆਪਣੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰਨ ਅਤੇ ਕਾਰ ਵਿੱਚ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਤੁਹਾਡਾ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਉਣਾ ਲਾਜ਼ਮੀ ਹੈ। ਤੁਸੀਂ ਹਰ ਵਾਰ ਕਾਰ ਵਿੱਚ ਦਾਖਲ ਹੋਣ 'ਤੇ ਇੱਕ ਕੋਡ ਜਾਂ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋਗੇ।</translation> <translation id="95817756606698420">Chrome ਚੀਨ ਵਿੱਚ ਖੋਜ ਲਈ <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ <ph name="BEGIN_LINK" />ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚੋਂ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="962979164594783469">ਇਹ ਐਪ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="96681097142096641">ਕੀ ਸਰਲ ਬਣਾਏ ਪੰਨੇ ਨੂੰ ਦੇਖਣਾ ਹੈ?</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 6161dcd..2e683df7 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Открыть в новой вкладке группы</translation> <translation id="1103142993930332957">Помогите улучшить Chrome</translation> <translation id="1105960400813249514">Демонстрация экрана</translation> +<translation id="1108214977745280468">Открыть статистику страницы</translation> <translation id="1108938384783527433">Синхронизация истории</translation> <translation id="1110914759170138831">Выделенный текст сокращен.</translation> <translation id="1111673857033749125">Здесь появятся закладки, сохраненные на других устройствах.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290">Домен: <ph name="DOMAIN" />. Отправлено с устройства "<ph name="DEVICE_NAME" />".</translation> <translation id="1311657260431405215">В этом QR-коде нет URL: <ph name="QRCODEVALUE" />.</translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Если вы отключите блокировку профиля, все сохраненные данные будут удалены.</translation> <translation id="1320912611264252795">Страница сохранения закладки, открытая на весь экран</translation> <translation id="1327257854815634930">История переходов открыта</translation> <translation id="1331212799747679585">Не удалось обновить Chrome. Другие настройки</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Чтобы продолжить, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> передаст ваше имя, адрес электронной почты и фото профиля на этот сайт. Ознакомьтесь с его <ph name="BEGIN_LINK1" />политикой конфиденциальности<ph name="END_LINK1" />.</translation> <translation id="200114059308480249">Учитывать контекст в поиске Google?</translation> <translation id="2009341475524975924">Для оценки эффективности рекламы сайты могут обмениваться некоторыми типами данных, например информацией о времени суток, когда вам было показано объявление.</translation> +<translation id="201060170519281460">Блокировка профиля защищает ваши данные в автомобиле, включая пароли, транзакции и другие сведения.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}one{# файл}few{# файла}many{# файлов}other{# файла}}</translation> <translation id="2021896219286479412">Настройки полноэкранного режима</translation> <translation id="2038563949887743358">Включить полную версию сайта</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Вы увидите статус входа на сайт <ph name="SITE_NAME" />, а также данные о работе в браузере и данные сайтов в Chrome.</translation> <translation id="2510106555128151389">Установка приложения "<ph name="WEBAPK_NAME" />"…</translation> <translation id="2513403576141822879">Остальные настройки конфиденциальности, безопасности и сбора данных вы можете найти в разделе <ph name="BEGIN_LINK" />Синхронизация сервисов Google<ph name="END_LINK" />.</translation> +<translation id="2517113738956581680">Полноразмерный экран</translation> <translation id="2517472476991765520">Сканировать</translation> <translation id="2523184218357549926">Отправлять URL посещенных страниц в Google</translation> <translation id="2527209463677295330">Благодаря этой функции результаты могут стать точнее</translation> @@ -281,6 +285,7 @@ Токены доверия помогают обеспечивать конфиденциальность в интернете и не позволяют определять личность пользователей.</translation> <translation id="2581165646603367611">Будет очищен кеш, а также удалены файлы cookie и другие данные, которые система сочтет маловажными.</translation> <translation id="2587052924345400782">Доступна новая версия</translation> +<translation id="2589302627584222634">Настроить блокировку профиля</translation> <translation id="2593272815202181319">Моноширинный</translation> <translation id="2603212228005142861">Войдите в аккаунт, чтобы задать настройки</translation> <translation id="260403163289591229">Вы подписаны</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Запретить</translation> <translation id="4036177530563778041">Легко продолжайте с того места, где остановились.</translation> <translation id="4042941173059740150">Продолжите на <ph name="SITE_ETLD_PLUS_ONE" /> с аккаунтом <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Нижний экран</translation> <translation id="4045764304651014138">Данные об использовании</translation> <translation id="405399507749852140">Если на одном из сайтов цена снизится, вы получите уведомление.</translation> <translation id="4056223980640387499">Сепия</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Руководство по конфиденциальности <ph name="BEGIN_NEW" />Новинка<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Последние 7 дней</translation> <translation id="5655963694829536461">Поиск в загрузках</translation> +<translation id="5657871969392618475">Ваши данные защищены с помощью блокировки профиля</translation> <translation id="5659593005791499971">Эл. почта</translation> <translation id="5665379678064389456">Создать мероприятие в приложении "<ph name="APP_NAME" />"</translation> <translation id="5683547024293500885">Не удалось проверить наличие обновлений в Chrome.</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Не генерировать описания</translation> <translation id="5966233851250124270">Chrome запомнит ваш выбор</translation> <translation id="5979084224081478209">Проверить пароли</translation> +<translation id="5985186846584605773">Настройте блокировку профиля для автомобиля</translation> <translation id="5995726099713306770">Снова скачать страницу?</translation> <translation id="6000066717592683814">Использовать Google</translation> <translation id="6000203700195075278">Снова подписаться</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">У вас установлена последняя версия Chrome.</translation> <translation id="7105047059074518658">Чтобы работать с Chrome на разных устройствах было проще, войдите в аккаунт</translation> <translation id="7106762743910369165">Этим браузером управляет ваша организация.</translation> +<translation id="7116420572655804716">Чтобы синхронизировать данные и обеспечить их защиту в автомобиле, необходимо включить блокировку профиля в настройках безопасности. Вам потребуется вводить PIN-код или пароль каждый раз, когда вы садитесь в автомобиль.</translation> <translation id="7116588989735740310">Чтобы легко возвращаться к сайтам, просмотренным на других устройствах, включите синхронизацию вкладок и истории.</translation> <translation id="7130504491556983216">Когда вы начнете посещать сайты, здесь появится список ваших интересов.</translation> <translation id="7138678301420049075">Другое</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Ваши устройства<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Возобновить</translation> <translation id="8209050860603202033">Открыть изображение</translation> +<translation id="8215740705341534369">Боковая панель</translation> <translation id="8218622182176210845">Управление аккаунтом</translation> <translation id="8221401890884589479">Вы можете заблокировать ненужные сайты. Chrome также автоматически удаляет из списка сайты, добавленные более 30 дней назад. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Меню карточки из ленты</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Главная страница</translation> <translation id="938850635132480979">Ошибка <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Введите кодовую фразу</translation> +<translation id="950679278154734362">Чтобы синхронизировать данные и обеспечить их защиту в автомобиле, необходимо настроить блокировку профиля. Вам потребуется вводить PIN-код или пароль каждый раз, когда вы садитесь в автомобиль.</translation> <translation id="95817756606698420">В Китае Chrome может использовать для поиска <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" />. Это можно изменить в <ph name="BEGIN_LINK" />Настройках<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Установить приложение</translation> <translation id="96681097142096641">Посмотреть страницу в упрощенном виде?</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 835f6a24..19f5b14 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Odpri nov zavihek v skupini</translation> <translation id="1103142993930332957">Želite pomagati izboljšati Chrome?</translation> <translation id="1105960400813249514">Zajemanje slike</translation> +<translation id="1108214977745280468">Podrobni podatki o strani</translation> <translation id="1108938384783527433">Sinhronizacija zgodovine</translation> <translation id="1110914759170138831">Označeno besedilo je bilo skrajšano.</translation> <translation id="1111673857033749125">Tu bodo prikazani zaznamki, shranjeni v drugih napravah.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – poslano iz naprave <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Ta koda QR ni URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Shranjeni podatki bodo izbrisani, če pozneje odstranite zaklepanje profila.</translation> <translation id="1320912611264252795">Mape v postopku shranjevanja zaznamka, odprte pri polni višini</translation> <translation id="1327257854815634930">Zgodovina krmarjenja je odprta</translation> <translation id="1331212799747679585">Posodobitev Chroma ni mogoča. Več možnosti.</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Če želite nadaljevati, bo ponudnik <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> delil vaše ime, e-poštni naslov in profilno sliko s tem spletnim mestom. Oglejte si <ph name="BEGIN_LINK1" />pravilnik o zasebnosti<ph name="END_LINK1" /> tega spletnega mesta.</translation> <translation id="200114059308480249">Želite vključiti sobesedilo v iskanja v Googlu?</translation> <translation id="2009341475524975924">Zaradi merjenja uspešnosti oglasa se s spletnimi mesti lahko delijo omejene vrste podatkov, kot je ura v dnevu, ko je bil oglas prikazan.</translation> +<translation id="201060170519281460">Z zaklepanjem profila poskrbite za varnost podatkov v avtomobilu, vključno s sinhroniziranimi gesli, plačili in drugim.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# datoteka}one{# datoteka}two{# datoteki}few{# datoteke}other{# datotek}}</translation> <translation id="2021896219286479412">Kontrol. za mesto v celo. načinu</translation> <translation id="2038563949887743358">Vklop možnosti »Zahteva za namizno spletno mesto«</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">Prikazano bo stanje prijave na spletnem mestu <ph name="SITE_NAME" />, podatki brskanja in podatki spletnega mesta v Chromu.</translation> <translation id="2510106555128151389">Nameščanje aplikacije <ph name="WEBAPK_NAME" /> …</translation> <translation id="2513403576141822879">Če vas zanima več nastavitev, povezanih z zasebnostjo, varnostjo in zbiranjem podatkov, si oglejte razdelek <ph name="BEGIN_LINK" />Sinhronizacija in Googlove storitve<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">List polne velikosti</translation> <translation id="2517472476991765520">Optično preberi</translation> <translation id="2523184218357549926">Googlu pošlje URL-je strani, ki jih obiščete</translation> <translation id="2527209463677295330">Če vključite več besedila na strani, bodo morda prikazani boljši rezultati.</translation> @@ -281,6 +285,7 @@ Zasebni žetoni stanja izboljšujejo zaupanje v spletu in jih ni mogoče uporabiti za osebno prepoznavo.</translation> <translation id="2581165646603367611">S tem bodo izbrisani piškotki, predpomnilnik in drugi podatki spletnih mest, ki se Chromu ne zdijo pomembni.</translation> <translation id="2587052924345400782">Na voljo je nov. različica</translation> +<translation id="2589302627584222634">Ustvari zaklepanja profila</translation> <translation id="2593272815202181319">Stalna širina</translation> <translation id="2603212228005142861">Če želite upravljati nastavitve, se prijavite</translation> <translation id="260403163289591229">Spremljano</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Ne dovoli</translation> <translation id="4036177530563778041">Preprosto nadaljujte, kjer ste končali</translation> <translation id="4042941173059740150">Naprej na <ph name="SITE_ETLD_PLUS_ONE" /> z računom pri ponudniku <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">List na dnu zaslona</translation> <translation id="4045764304651014138">Podatki o uporabi</translation> <translation id="405399507749852140">Prejmite opozorila, če se cena zniža na katerem koli spletnem mestu.</translation> <translation id="4056223980640387499">Sepija</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Vodnik po zasebnosti <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Zadnjih 7 dni</translation> <translation id="5655963694829536461">Poiščite prenose</translation> +<translation id="5657871969392618475">Vaši podatki so zavarovani z zaklepanjem profila</translation> <translation id="5659593005791499971">E-pošta</translation> <translation id="5665379678064389456">Ustvarite dogodek v aplikaciji <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome ne more preveriti, ali so na voljo posodobitve</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Ustavi prenos opisov slik</translation> <translation id="5966233851250124270">Chrome si bo zapomnil vašo izbiro</translation> <translation id="5979084224081478209">Preveri gesla</translation> +<translation id="5985186846584605773">Ustvarjanje zaklepanja profila za avtomobil</translation> <translation id="5995726099713306770">Ali želite znova prenesti stran?</translation> <translation id="6000066717592683814">Ohrani Google</translation> <translation id="6000203700195075278">Znova spremljaj</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome je posodobljen</translation> <translation id="7105047059074518658">Prijavite se za preprostejše brskanje v napravah</translation> <translation id="7106762743910369165">Vaš brskalnik upravlja organizacija</translation> +<translation id="7116420572655804716">Če želite sinhronizirati podatke in poskrbeti za varnost podatkov v avtomobilu, morate v varnostnih nastavitvah ustvariti zaklepanje profila. Pri vsakem vstopu v avtomobil boste uporabili kodo ali geslo.</translation> <translation id="7116588989735740310">Za vrnitev na spletna mesta, obiskana v drugih napravah, sinhronizirajte zavihke in zgodovino.</translation> <translation id="7130504491556983216">Tukaj bo prikazan seznam zanimanj, ko brskate po spletu.</translation> <translation id="7138678301420049075">Drugo</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Vaše naprave<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Nadaljuj</translation> <translation id="8209050860603202033">Odpri sliko</translation> +<translation id="8215740705341534369">Stranski list</translation> <translation id="8218622182176210845">Upravljanje računa</translation> <translation id="8221401890884589479">Spletna mesta, ki jih ne želite, lahko blokirate. Chrome prav tako s seznama samodejno izbriše spletna mesta, starejša od 30 dni. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Meni kartice vira</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Domov</translation> <translation id="938850635132480979">Napaka: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Vnesite geslo</translation> +<translation id="950679278154734362">Če želite sinhronizirati podatke in poskrbeti za varnost podatkov v avtomobilu, morate ustvariti zaklepanje profila. Pri vsakem vstopu v avtomobil boste uporabili kodo ali geslo.</translation> <translation id="95817756606698420">Chrome lahko za iskanje na Kitajskem uporablja <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" />. To je mogoče spremeniti v <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Namestite to aplikacijo</translation> <translation id="96681097142096641">Si želite ogledati poenostavljeno stran?</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 7ee6bbd..1293d77 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Otvori u novoj kartici u grupi</translation> <translation id="1103142993930332957">Želite li da nam pomognete da poboljšamo Chrome?</translation> <translation id="1105960400813249514">Snimanje ekrana</translation> +<translation id="1108214977745280468">Prikaži uvid u stranicu</translation> <translation id="1108938384783527433">Sinhronizacija istorije</translation> <translation id="1110914759170138831">Istaknuta stavka je skraćena</translation> <translation id="1111673857033749125">Obeleživači sačuvani na drugim uređajima će se prikazati ovde.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – poslato je sa uređaja <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Ovaj QR kôd nije URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Sačuvane informacije će biti izbrisane ako kasnije uklonite zaključavanje profila.</translation> <translation id="1320912611264252795">Folderi toka čuvanja obeleživača su otvoreni do polovine ekrana</translation> <translation id="1327257854815634930">Istorija navigacije je otvorena</translation> <translation id="1331212799747679585">Chrome ne može da se ažurira. Još opcija</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Da biste nastavili, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> će deliti vaše ime, imejl adresu i sliku profila sa ovim sajtom. Pogledajte <ph name="BEGIN_LINK1" />politiku privatnosti<ph name="END_LINK1" /> ovog sajta.</translation> <translation id="200114059308480249">Želite da uvrstite okolni tekst u Google pretrage?</translation> <translation id="2009341475524975924">Da biste merili učinak oglasa, ograničeni tipovi podataka, kao što je doba dana kada vam je neki oglas prikazan, mogu da se dele između sajtova.</translation> +<translation id="201060170519281460">Zaključavanje profila štiti podatke u automobilu, uključujući sinhronizovane lozinke, plaćanja i drugo.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# datoteka}one{# datoteka}few{# datoteke}other{# datoteka}}</translation> <translation id="2021896219286479412">Kontrole sajta na celom ekranu</translation> <translation id="2038563949887743358">Uključi zahtevanje verzije sajta za računare</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">U Chrome-u ćete videti da li ste prijavljeni, podatke pregledanja i podatke o sajtu za <ph name="SITE_NAME" /></translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> se instalira...</translation> <translation id="2513403576141822879">Više podešavanja u vezi sa privatnošću, bezbednošću i prikupljanjem podataka potražite u odeljku <ph name="BEGIN_LINK" />Sinhronizacija i Google usluge<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Tabela u punoj veličini</translation> <translation id="2517472476991765520">Skeniraj</translation> <translation id="2523184218357549926">URL-ovi stranica koje posećujete se šalju Google-u</translation> <translation id="2527209463677295330">Ako uvrstite veći deo teksta stranice, možete da dobijete bolje rezultate</translation> @@ -281,6 +285,7 @@ Privatni tokeni za stanje poboljšavaju privatnost na vebu i ne mogu da se koriste za otkrivanje identiteta.</translation> <translation id="2581165646603367611">Ovim ćete obrisati kolačiće, keš i druge podatke sajtova koje Chrome ne smatra važnim.</translation> <translation id="2587052924345400782">Dostupna je novija verzija</translation> +<translation id="2589302627584222634">Primeni zaključavanje profila</translation> <translation id="2593272815202181319">Fiksne širine</translation> <translation id="2603212228005142861">Prijavite se da biste upravljali podešavanjima</translation> <translation id="260403163289591229">Pratite</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Ne dozvoli</translation> <translation id="4036177530563778041">Lako nastavite tamo gde ste stali</translation> <translation id="4042941173059740150">Nastavite na <ph name="SITE_ETLD_PLUS_ONE" /> uz <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Donja tabela</translation> <translation id="4045764304651014138">Podaci o korišćenju</translation> <translation id="405399507749852140">Dobijajte obaveštenja kada se cena snizi na bilo kom sajtu</translation> <translation id="4056223980640387499">Sepija</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Vodič za privatnost <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Poslednjih 7 dana</translation> <translation id="5655963694829536461">Pretražite preuzimanja</translation> +<translation id="5657871969392618475">Informacije su zaštićene zaključavanjem profila</translation> <translation id="5659593005791499971">Imejl</translation> <translation id="5665379678064389456">Napravite događaj u aplikaciji <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome ne može da traži ažuriranja</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Zaustavi opise slika</translation> <translation id="5966233851250124270">Chrome će zapamtiti izbor</translation> <translation id="5979084224081478209">Proveri lozinke</translation> +<translation id="5985186846584605773">Primenite zaključavanje profila za automobil</translation> <translation id="5995726099713306770">Želite da preuzmete stranicu ponovo?</translation> <translation id="6000066717592683814">Zadrži Google</translation> <translation id="6000203700195075278">Ponovo prati</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome je ažuriran</translation> <translation id="7105047059074518658">Prijavite se da biste lakše pregledali na svim uređajima</translation> <translation id="7106762743910369165">Organizacija upravlja pregledačem</translation> +<translation id="7116420572655804716">Da biste sinhronizovali informacije i zaštitili podatke u automobilu, morate da primenite zaključavanje profila u bezbednosnim podešavanjima. Koristićete kôd ili lozinku svaki put kad uđete u automobil.</translation> <translation id="7116588989735740310">Da biste se vratili na sajtove posećene na drugim uređajima, sinhronizujte kartice i istoriju</translation> <translation id="7130504491556983216">Lista interesovanja će se prikazati ovde dok pregledate veb</translation> <translation id="7138678301420049075">Drugo</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Uređaji<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Nastavi</translation> <translation id="8209050860603202033">Otvori sliku</translation> +<translation id="8215740705341534369">Bočna tabela</translation> <translation id="8218622182176210845">Upravljajte nalogom</translation> <translation id="8221401890884589479">Možete da blokirate sajtove koje ne želite. Chrome takođe automatski sa liste briše sajtove koji su stariji od 30 dana. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Meni kartice fida</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Početna</translation> <translation id="938850635132480979">Greška: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Unesite pristupnu frazu</translation> +<translation id="950679278154734362">Da biste sinhronizovali informacije i zaštitili podatke u automobilu, morate da primenite zaključavanje profila. Koristićete kôd ili lozinku svaki put kad uđete u automobil.</translation> <translation id="95817756606698420">Chrome može da koristi <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> za pretragu u Kini. Ovo možete da promenite u <ph name="BEGIN_LINK" />Podešavanjima<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Instalirajte ovu aplikaciju</translation> <translation id="96681097142096641">Želite da vidite pojednostavljenu stranicu?</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 2b388b80..1295420 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">Отвори у новој картици у групи</translation> <translation id="1103142993930332957">Желите ли да нам помогнете да побољшамо Chrome?</translation> <translation id="1105960400813249514">Снимање екрана</translation> +<translation id="1108214977745280468">Прикажи увид у страницу</translation> <translation id="1108938384783527433">Синхронизација историје</translation> <translation id="1110914759170138831">Истакнута ставка је скраћена</translation> <translation id="1111673857033749125">Обележивачи сачувани на другим уређајима ће се приказати овде.</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> – послато је са уређаја <ph name="DEVICE_NAME" /></translation> <translation id="1311657260431405215">Овај QR кôд није URL: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">Сачуване информације ће бити избрисане ако касније уклоните закључавање профила.</translation> <translation id="1320912611264252795">Фолдери тока чувања обележивача су отворени до половине екрана</translation> <translation id="1327257854815634930">Историја навигације је отворена</translation> <translation id="1331212799747679585">Chrome не може да се ажурира. Још опција</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">Да бисте наставили, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ће делити ваше име, имејл адресу и слику профила са овим сајтом. Погледајте <ph name="BEGIN_LINK1" />политику приватности<ph name="END_LINK1" /> овог сајта.</translation> <translation id="200114059308480249">Желите да уврстите околни текст у Google претраге?</translation> <translation id="2009341475524975924">Да бисте мерили учинак огласа, ограничени типови података, као што је доба дана када вам је неки оглас приказан, могу да се деле између сајтова.</translation> +<translation id="201060170519281460">Закључавање профила штити податке у аутомобилу, укључујући синхронизоване лозинке, плаћања и друго.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# датотека}one{# датотека}few{# датотеке}other{# датотека}}</translation> <translation id="2021896219286479412">Контроле сајта на целом екрану</translation> <translation id="2038563949887743358">Укључи захтевање верзије сајта за рачунаре</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">У Chrome-у ћете видети да ли сте пријављени, податке прегледања и податке о сајту за <ph name="SITE_NAME" /></translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> се инсталира...</translation> <translation id="2513403576141822879">Више подешавања у вези са приватношћу, безбедношћу и прикупљањем података потражите у одељку <ph name="BEGIN_LINK" />Синхронизација и Google услуге<ph name="END_LINK" /></translation> +<translation id="2517113738956581680">Табела у пуној величини</translation> <translation id="2517472476991765520">Скенирај</translation> <translation id="2523184218357549926">URL-ови страница које посећујете се шаљу Google-у</translation> <translation id="2527209463677295330">Ако уврстите већи део текста странице, можете да добијете боље резултате</translation> @@ -281,6 +285,7 @@ Приватни токени за стање побољшавају приватност на вебу и не могу да се користе за откривање идентитета.</translation> <translation id="2581165646603367611">Овим ћете обрисати колачиће, кеш и друге податке сајтова које Chrome не сматра важним.</translation> <translation id="2587052924345400782">Доступна је новија верзија</translation> +<translation id="2589302627584222634">Примени закључавање профила</translation> <translation id="2593272815202181319">Фиксне ширине</translation> <translation id="2603212228005142861">Пријавите се да бисте управљали подешавањима</translation> <translation id="260403163289591229">Пратите</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">Не дозволи</translation> <translation id="4036177530563778041">Лако наставите тамо где сте стали</translation> <translation id="4042941173059740150">Наставите на <ph name="SITE_ETLD_PLUS_ONE" /> уз <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation> +<translation id="4044708993631234325">Доња табела</translation> <translation id="4045764304651014138">Подаци о коришћењу</translation> <translation id="405399507749852140">Добијајте обавештења када се цена снизи на било ком сајту</translation> <translation id="4056223980640387499">Сепија</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">Водич за приватност <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="5648166631817621825">Последњих 7 дана</translation> <translation id="5655963694829536461">Претражите преузимања</translation> +<translation id="5657871969392618475">Информације су заштићене закључавањем профила</translation> <translation id="5659593005791499971">Имејл</translation> <translation id="5665379678064389456">Направите догађај у апликацији <ph name="APP_NAME" /></translation> <translation id="5683547024293500885">Chrome не може да тражи ажурирања</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">Заустави описе слика</translation> <translation id="5966233851250124270">Chrome ће запамтити избор</translation> <translation id="5979084224081478209">Провери лозинке</translation> +<translation id="5985186846584605773">Примените закључавање профила за аутомобил</translation> <translation id="5995726099713306770">Желите да преузмете страницу поново?</translation> <translation id="6000066717592683814">Задржи Google</translation> <translation id="6000203700195075278">Поново прати</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome је ажуриран</translation> <translation id="7105047059074518658">Пријавите се да бисте лакше прегледали на свим уређајима</translation> <translation id="7106762743910369165">Организација управља прегледачем</translation> +<translation id="7116420572655804716">Да бисте синхронизовали информације и заштитили податке у аутомобилу, морате да примените закључавање профила у безбедносним подешавањима. Користићете кôд или лозинку сваки пут кад уђете у аутомобил.</translation> <translation id="7116588989735740310">Да бисте се вратили на сајтове посећене на другим уређајима, синхронизујте картице и историју</translation> <translation id="7130504491556983216">Листа интересовања ће се приказати овде док прегледате веб</translation> <translation id="7138678301420049075">Друго</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Уређаји<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">Настави</translation> <translation id="8209050860603202033">Отвори слику</translation> +<translation id="8215740705341534369">Бочна табела</translation> <translation id="8218622182176210845">Управљајте налогом</translation> <translation id="8221401890884589479">Можете да блокирате сајтове које не желите. Chrome такође аутоматски са листе брише сајтове који су старији од 30 дана. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> <translation id="8223642481677794647">Мени картице фида</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">Почетна</translation> <translation id="938850635132480979">Грешка: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Унесите приступну фразу</translation> +<translation id="950679278154734362">Да бисте синхронизовали информације и заштитили податке у аутомобилу, морате да примените закључавање профила. Користићете кôд или лозинку сваки пут кад уђете у аутомобил.</translation> <translation id="95817756606698420">Chrome може да користи <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> за претрагу у Кини. Ово можете да промените у <ph name="BEGIN_LINK" />Подешавањима<ph name="END_LINK" />.</translation> <translation id="962979164594783469">Инсталирајте ову апликацију</translation> <translation id="96681097142096641">Желите да видите поједностављену страницу?</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 060f670..4093ffaa 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
@@ -17,6 +17,7 @@ <translation id="1100066534610197918">گروپ میں نئے ٹیب میں کھولیں</translation> <translation id="1103142993930332957">Chrome کو بہتر بنانے میں مدد کریں؟</translation> <translation id="1105960400813249514">اسکرین کیپچر</translation> +<translation id="1108214977745280468">صفحے کی بصیرتیں دیکھیں</translation> <translation id="1108938384783527433">سرگزشت سِنک کریں</translation> <translation id="1110914759170138831">ہائی لائٹ چھوٹی کی گئی</translation> <translation id="1111673857033749125">آپ کے دیگر آلات پر محفوظ کردہ بُک مارکس یہاں ظاہر ہوں گے۔</translation> @@ -66,6 +67,7 @@ <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> سے ارسال کردہ</translation> <translation id="1311657260431405215">یہ QR کوڈ URL نہیں ہے: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> +<translation id="131655401280401879">پروفائل لاک کو بعد میں ہٹانے پر آپ کی محفوظ کردہ معلومات کو مٹا دیا جائے گا۔</translation> <translation id="1320912611264252795">بُک مارک محفوظ کرنے کے فلو فولڈرز پوری اونچائی پر کھلے ہوئے ہیں</translation> <translation id="1327257854815634930">نیویگیشن کی سرگزشت کھلی ہوئی ہے</translation> <translation id="1331212799747679585">Chrome کو اپ ڈیٹ نہیں کیا جا سکتا ہے۔ مزید اختیارات</translation> @@ -180,6 +182,7 @@ <translation id="1995884366040846621">جاری رکھنے کے لیے، <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> اس سائٹ کے ساتھ آپ کے نام، ای میل پتہ اور پروفائل کی تصویر کا اشتراک کرے گا۔ اس سائٹ کی <ph name="BEGIN_LINK1" />راز داری کی پالیسی<ph name="END_LINK1" /> دیکھیں۔</translation> <translation id="200114059308480249">Google تلاشیوں میں آس پاس کا متن شامل کریں؟</translation> <translation id="2009341475524975924">کسی اشتہار کی کارکردگی کی پیمائش کرنے کے لیے، سائٹس کے درمیان ڈیٹا کی محدود اقسام کا اشتراک کیا جا سکتا ہے، جیسے کہ دن کا وہ وقت جب آپ کو اشتہار دکھایا گیا تھا۔</translation> +<translation id="201060170519281460">آپ کی پروفائل لاک آپ کی معلومات کو کار میں محفوظ رکھتا ہے، جس میں مطابقت پذیر پاس ورڈز، ادائیگیاں اور بہت کچھ شامل ہیں۔</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# فائل}other{# فائلیں}}</translation> <translation id="2021896219286479412">پوری اسکرین کے سائٹ کنٹرولز</translation> <translation id="2038563949887743358">ڈیسک ٹاپ سائٹ کی درخواست کو آن کریں</translation> @@ -257,6 +260,7 @@ <translation id="250020030759455918">آپ Chrome میں اپنا <ph name="SITE_NAME" /> سائن ان اسٹیٹس، براؤزنگ ڈیٹا اور سائٹ کا ڈیٹا دیکھیں گے</translation> <translation id="2510106555128151389"><ph name="WEBAPK_NAME" /> انسٹال ہو رہی ہے...</translation> <translation id="2513403576141822879">راز داری، سیکیورٹی اور ڈیٹا کی جمع آوری سے متعلق مزید ترتیبات کے لیے، <ph name="BEGIN_LINK" />مطابقت پذیری اور Google سروسز<ph name="END_LINK" /> دیکھیں</translation> +<translation id="2517113738956581680">فُل سائز کی شیٹ</translation> <translation id="2517472476991765520">اسکین کریں</translation> <translation id="2523184218357549926">Google کو ان صفحات کے URLs بھیجتی ہے جنہیں آپ ملاحظہ کرتے ہیں</translation> <translation id="2527209463677295330">صفحے کے مزید متن کو شامل کرنے سے، آپ بہتر نتائج دیکھ سکتے ہیں</translation> @@ -281,6 +285,7 @@ پرائیویٹ اسٹیٹ ٹوکنز ویب پر رازداری کو بہتر بناتے ہیں اور آپ کون ہیں یہ معلوم کرنے کے لیے استعمال نہیں کیے جا سکتے۔</translation> <translation id="2581165646603367611">یہ سائٹس کی کوکیز، کیش اور اس دیگر ڈیٹا کو صاف کر دے گی جسے Chrome اہم نہیں خیال کرتا ہے۔</translation> <translation id="2587052924345400782">جدید تر ورژن دستیاب ہے</translation> +<translation id="2589302627584222634">پروفائل لاک تخلیق کریں</translation> <translation id="2593272815202181319">مونو اسپیس</translation> <translation id="2603212228005142861">اپنی ترجیحات کا نظم کرنے کے لیے سائن ان کریں</translation> <translation id="260403163289591229">پیروی ہو رہی ہے</translation> @@ -542,6 +547,7 @@ <translation id="4035877632587724847">اجازت نہ دیں</translation> <translation id="4036177530563778041">آسانی سے وہیں سے شروع کریں جہاں سے چھوڑا تھا</translation> <translation id="4042941173059740150"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> کے ساتھ <ph name="SITE_ETLD_PLUS_ONE" /> کو جاری رکھیں</translation> +<translation id="4044708993631234325">نیچے کی شیٹ</translation> <translation id="4045764304651014138">استعمال کا ڈیٹا</translation> <translation id="405399507749852140">کسی بھی سائٹ پر قیمت میں گراوٹ ہونے پر الرٹس حاصل کریں</translation> <translation id="4056223980640387499">سیپیا</translation> @@ -846,6 +852,7 @@ <translation id="564667659802381754">رازداری کی گائیڈ <ph name="BEGIN_NEW" />نئی<ph name="END_NEW" /></translation> <translation id="5648166631817621825">آخری 7 دن</translation> <translation id="5655963694829536461">اپنے ڈاؤن لوڈز تلاش کریں</translation> +<translation id="5657871969392618475">پروفائل لاک آپ کی معلومات کو محفوظ رکھتا ہے</translation> <translation id="5659593005791499971">ای میل</translation> <translation id="5665379678064389456"><ph name="APP_NAME" /> میں ایونٹ بنائیں</translation> <translation id="5683547024293500885">Chrome اپ ڈیٹس چیک نہیں کر سکتا ہے</translation> @@ -909,6 +916,7 @@ <translation id="5964869237734432770">تصویری تفصیلات کو روکیں</translation> <translation id="5966233851250124270">Chrome آپ کے انتخاب کو یاد رکھے گا</translation> <translation id="5979084224081478209">پاس ورڈز چیک کریں</translation> +<translation id="5985186846584605773">اپنی کار کے لیے پروفائل لاک تخلیق کریں</translation> <translation id="5995726099713306770">صفحے کو دوبارہ لوڈ کریں؟</translation> <translation id="6000066717592683814">Google کو رکھیں</translation> <translation id="6000203700195075278">دوبارہ پیروی کریں</translation> @@ -1137,6 +1145,7 @@ <translation id="7088681679121566888">Chrome اپ ٹو ڈیٹ ہے</translation> <translation id="7105047059074518658">تمام آلات پر آسانی سے براؤز کرنے کے لیے سائن ان کریں</translation> <translation id="7106762743910369165">آپ کا براؤزر آپ کی تنظیم کے زیر انتظام ہے</translation> +<translation id="7116420572655804716">اپنی معلومات کی مطابقت پذیری کرنے اور کار میں اپنے ڈیٹا کو محفوظ رکھنے کے لیے، آپ کو اپنی سیکیورٹی کی ترتیبات میں پروفائل لاک تخلیق کرنا ہوگا۔ جب بھی آپ کار میں داخل ہوں گے آپ کو کوڈ یا پاس ورڈ استعمال کرنا ہوگا۔</translation> <translation id="7116588989735740310">ان سائٹس پر واپس جانے کیلئے جنہیں آپ نے دوسرے آلات پر ملاحظہ کیے ہیں، اپنے ٹیبز اور سرگزشت سِنک کریں</translation> <translation id="7130504491556983216">آپ کے ویب براؤز کرتے ہی دلچسپیوں کی ایک فہرست یہاں ظاہر ہوگی</translation> <translation id="7138678301420049075">دوسرا</translation> @@ -1358,6 +1367,7 @@ <translation id="8193953846147532858"><ph name="BEGIN_LINK" />آپ کے آلات<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8200772114523450471">دوبارہ شروع کریں</translation> <translation id="8209050860603202033">تصویر کھولیں</translation> +<translation id="8215740705341534369">سائیڈ شیٹ</translation> <translation id="8218622182176210845">اپنے اکاؤنٹ کا نظم کریں</translation> <translation id="8221401890884589479">آپ جن سائٹس کو نہیں چاہتے ہیں انہیں مسدود کر سکتے ہیں۔ Chrome فہرست کی 30 دن سے زیادہ پرانی سائٹس کو بھی خودکار طور پر حذف کر دیتا ہے۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="8223642481677794647">فیڈ کارڈ مینیو</translation> @@ -1560,6 +1570,7 @@ <translation id="932327136139879170">ھوم</translation> <translation id="938850635132480979">خرابی: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">پاس فریز درج کریں</translation> +<translation id="950679278154734362">اپنی معلومات کو مطابقت پذیر بنانے اور کار میں اپنے ڈیٹا کو محفوظ رکھنے کے لیے، آپ کو ایک پروفائل لاک تخلیق کرنا ہوگا۔ جب بھی آپ کار میں داخل ہوں گے آپ کو کوڈ یا پاس ورڈ استعمال کرنا ہوگا۔</translation> <translation id="95817756606698420">Chrome چین میں تلاش کرنے کیلئے <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> کا استعمال کر سکتا ہے۔ آپ اسے <ph name="BEGIN_LINK" />ترتیبات<ph name="END_LINK" /> میں تبدیل کر سکتے ہیں۔</translation> <translation id="962979164594783469">یہ ایپ انسٹال کریں</translation> <translation id="96681097142096641">آسان کردہ صفحہ ملاحظہ کریں؟</translation>
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm b/chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm index baee907f..6a38d3b 100644 --- a/chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm +++ b/chrome/browser/ui/cocoa/applescript/window_applescript_browsertest.mm
@@ -125,11 +125,11 @@ IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, InsertAndDeleteTabs) { WindowAppleScript* window = [[WindowAppleScript alloc] initWithBrowser:browser()]; - TabAppleScript* aTab; + base::scoped_nsobject<TabAppleScript> aTab; NSUInteger count; for (NSUInteger i = 0; i < 5; ++i) { for (NSUInteger j = 0; j < 3; ++j) { - aTab = [[TabAppleScript alloc] init]; + aTab.reset([[TabAppleScript alloc] init]); [window insertInTabs:aTab]; } count = 3 * i + 4;
diff --git a/chrome/browser/ui/color/linux/native_chrome_color_mixer_linux.cc b/chrome/browser/ui/color/linux/native_chrome_color_mixer_linux.cc index c3edf28..c8ae7f3 100644 --- a/chrome/browser/ui/color/linux/native_chrome_color_mixer_linux.cc +++ b/chrome/browser/ui/color/linux/native_chrome_color_mixer_linux.cc
@@ -111,10 +111,4 @@ high_contrast); mixer[kColorToolbarTopSeparatorFrameInactive] = { kColorToolbarTopSeparatorFrameActive}; - - // Explicitly override certain colors for the NTP to those corresponding to - // the light theme. See crbug.com/998903. This logic will be removed once the - // NewTabPage comprehensive theming experiment has completed. - if (!base::FeatureList::IsEnabled(ntp_features::kNtpComprehensiveTheming)) - AddWebThemeNewTabPageColors(mixer, false); }
diff --git a/chrome/browser/ui/color/new_tab_page_color_mixer.cc b/chrome/browser/ui/color/new_tab_page_color_mixer.cc index 88e0e53..eaafd6e 100644 --- a/chrome/browser/ui/color/new_tab_page_color_mixer.cc +++ b/chrome/browser/ui/color/new_tab_page_color_mixer.cc
@@ -21,6 +21,9 @@ namespace { +constexpr float kNtpElementLuminosityChangeForLightBackgroundParam = 0.1f; +constexpr float kNtpElementLuminosityChangeForDarkBackgroundParam = 0.2f; + ui::ColorTransform GetContrastingColorTransform( ui::ColorTransform input_transform, absl::optional<float> luminosity_change = absl::nullopt) { @@ -30,10 +33,8 @@ const SkColor color = input_transform.Run(input_color, mixer); const float default_luminosity_change = color_utils::IsDark(color) - ? ntp_features::kNtpElementLuminosityChangeForDarkBackgroundParam - .Get() - : ntp_features::kNtpElementLuminosityChangeForLightBackgroundParam - .Get(); + ? kNtpElementLuminosityChangeForDarkBackgroundParam + : kNtpElementLuminosityChangeForLightBackgroundParam; return GetContrastingColor( color, luminosity_change.value_or(default_luminosity_change)); }; @@ -338,8 +339,7 @@ AddWebThemeNewTabPageColors(mixer, dark_mode); - if (base::FeatureList::IsEnabled(ntp_features::kNtpComprehensiveTheming) && - key.custom_theme && + if (key.custom_theme && key.custom_theme->get_theme_type() == ThemeType::kAutogenerated) { AddGeneratedThemeComprehensiveColors(mixer); } else {
diff --git a/chrome/browser/ui/color/new_tab_page_color_mixer_unittest.cc b/chrome/browser/ui/color/new_tab_page_color_mixer_unittest.cc index a267d65..778ffb7 100644 --- a/chrome/browser/ui/color/new_tab_page_color_mixer_unittest.cc +++ b/chrome/browser/ui/color/new_tab_page_color_mixer_unittest.cc
@@ -44,9 +44,6 @@ } TEST(NewTabPageColorMixer, CustomColorComprehensiveThemeColors) { - base::test::ScopedFeatureList features; - features.InitWithFeatures({{ntp_features::kNtpComprehensiveTheming}}, {}); - ui::ColorProvider provider; ui::ColorMixer& mixer = provider.AddMixer(); mixer[kColorToolbar] = {gfx::kGoogleGreen300}; @@ -62,9 +59,7 @@ EXPECT_EQ(provider.GetColor(kColorToolbar), gfx::kGoogleGreen300); EXPECT_EQ(provider.GetColor(kColorNewTabPageBackground), gfx::kGoogleGreen300); - SkColor contrasting_color = GetContrastingColor( - gfx::kGoogleGreen300, - ntp_features::kNtpElementLuminosityChangeForLightBackgroundParam.Get()); + SkColor contrasting_color = GetContrastingColor(gfx::kGoogleGreen300, 0.1f); EXPECT_EQ(provider.GetColor(kColorNewTabPageButtonBackground), contrasting_color); EXPECT_EQ(provider.GetColor(kColorNewTabPageMostVisitedTileBackground), @@ -73,8 +68,7 @@ TEST(NewTabPageColorMixer, CustomColorComprehensiveThemeRealboxColors) { base::test::ScopedFeatureList features; - features.InitWithFeatures({{ntp_features::kNtpComprehensiveTheming}, - {ntp_features::kNtpComprehensiveThemeRealbox}}, + features.InitWithFeatures({{ntp_features::kNtpComprehensiveThemeRealbox}}, {}); ui::ColorProvider provider; @@ -92,18 +86,13 @@ EXPECT_EQ(provider.GetColor(kColorToolbar), gfx::kGoogleGreen600); EXPECT_EQ(provider.GetColor(kColorNewTabPageBackground), gfx::kGoogleGreen600); - SkColor contrasting_color = GetContrastingColor( - gfx::kGoogleGreen600, - ntp_features::kNtpElementLuminosityChangeForDarkBackgroundParam.Get()); + SkColor contrasting_color = GetContrastingColor(gfx::kGoogleGreen600, 0.2f); EXPECT_EQ(provider.GetColor(kColorNewTabPageButtonBackground), contrasting_color); EXPECT_EQ(provider.GetColor(kColorRealboxBackground), contrasting_color); } TEST(NewTabPageColorMixer, DefaultColorComprehensiveThemeColor) { - base::test::ScopedFeatureList features; - features.InitWithFeatures({{ntp_features::kNtpComprehensiveTheming}}, {}); - constexpr SkColor kSampleToolbarColor = SK_ColorWHITE; ui::ColorProvider provider; ui::ColorMixer& mixer = provider.AddMixer();
diff --git a/chrome/browser/ui/views/chrome_layout_provider.cc b/chrome/browser/ui/views/chrome_layout_provider.cc index 54c5b1c..6109922 100644 --- a/chrome/browser/ui/views/chrome_layout_provider.cc +++ b/chrome/browser/ui/views/chrome_layout_provider.cc
@@ -165,7 +165,7 @@ case DISTANCE_SIDE_PANEL_HEADER_BUTTON_MINIMUM_SIZE: return 20; case DISTANCE_SIDE_PANEL_HEADER_INTERIOR_MARGIN_HORIZONTAL: - return 8; + return 4; } NOTREACHED_NORETURN(); }
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc index c061a754..e211190 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
@@ -659,7 +659,7 @@ return; } bubble_controller_->RecordDownloadBubbleInteraction(); - if (ui_info_.has_subpage) { + if (ui_info_.HasSubpage()) { DownloadItemWarningData::AddWarningActionEvent( model_->GetDownloadItem(), DownloadItemWarningData::WarningSurface::BUBBLE_MAINPAGE, @@ -708,7 +708,7 @@ main_button->SetVisible(true); } - subpage_icon_->SetVisible(ui_info_.has_subpage); + subpage_icon_->SetVisible(ui_info_.HasSubpage()); } void DownloadBubbleRowView::UpdateProgressBar() { @@ -738,7 +738,7 @@ primary_label_->SetText(model_->GetFileNameToReportUser().LossyDisplayName()); UpdateStatusText(); - if (ui_info_.has_subpage) { + if (ui_info_.HasSubpage()) { transparent_button_->SetAccessibleName(l10n_util::GetStringFUTF16( IDS_DOWNLOAD_BUBBLE_MAIN_BUTTON_SUBPAGE, primary_label_->GetText(), secondary_label_->GetText()));
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc index bbcf455..77c991a3 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc
@@ -157,8 +157,8 @@ GetLayoutInsets(DOWNLOAD_ICON).width() - icon_label_spacing; styled_label_->SizeToFit(min_label_width); - checkbox_->SetVisible(ui_info.has_checkbox); - if (ui_info.has_checkbox) { + checkbox_->SetVisible(ui_info.HasCheckbox()); + if (ui_info.HasCheckbox()) { base::UmaHistogramEnumeration(kSubpageActionHistogram, DownloadBubbleSubpageAction::kShownCheckbox); checkbox_->SetChecked(false); @@ -316,14 +316,14 @@ if (ui_info.subpage_buttons.size() > 0) { bubble_delegate_->SetButtons(ui::DIALOG_BUTTON_OK); UpdateButton(ui_info.subpage_buttons[0], /*is_secondary_button=*/false, - ui_info.has_checkbox); + ui_info.HasCheckbox()); } if (ui_info.subpage_buttons.size() > 1) { bubble_delegate_->SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL); UpdateButton(ui_info.subpage_buttons[1], /*is_secondary_button=*/true, - ui_info.has_checkbox); + ui_info.HasCheckbox()); } }
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_security_view_unittest.cc b/chrome/browser/ui/views/download/bubble/download_bubble_security_view_unittest.cc index 4319282..5dfbd01b 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_security_view_unittest.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_security_view_unittest.cc
@@ -135,7 +135,7 @@ // Two buttons, one prominent row_view_->SetUIInfoForTesting( DownloadUIModel::BubbleUIInfo() - .AddSubpageSummary(std::u16string()) + .AddSubpageSummary(u"fake summary") .AddIconAndColor(views::kInfoIcon, ui::kColorAlertHighSeverity) .AddPrimaryButton(DownloadCommands::Command::KEEP) // OK button @@ -153,7 +153,7 @@ // Two buttons, none prominent DownloadUIModel::BubbleUIInfo info = DownloadUIModel::BubbleUIInfo() - .AddSubpageSummary(std::u16string()) + .AddSubpageSummary(u"fake summary") .AddIconAndColor(views::kInfoIcon, ui::kColorAlertHighSeverity) .AddPrimaryButton(DownloadCommands::Command::KEEP) // OK button @@ -173,7 +173,7 @@ // One button, none prominent info = DownloadUIModel::BubbleUIInfo() - .AddSubpageSummary(std::u16string()) + .AddSubpageSummary(u"fake summary") .AddIconAndColor(views::kInfoIcon, ui::kColorAlertHighSeverity) .AddPrimaryButton(DownloadCommands::Command::KEEP) // OK button @@ -189,7 +189,7 @@ // No buttons, none prominent row_view_->SetUIInfoForTesting( DownloadUIModel::BubbleUIInfo() - .AddSubpageSummary(std::u16string()) + .AddSubpageSummary(u"fake summary") .AddIconAndColor(views::kInfoIcon, ui::kColorAlertHighSeverity) .AddPrimaryButton(DownloadCommands::Command::KEEP));
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc index 5475e68b..e98797f 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
@@ -89,83 +89,140 @@ } // namespace -class RequestsAccessSection : public views::BoxLayoutView { +// View that contains a special message inside the extensions menu main page +// depending on its state. +class MessageSection : public views::BoxLayoutView { public: - explicit RequestsAccessSection( + explicit MessageSection( base::RepeatingCallback<void(const extensions::ExtensionId&)> allow_callback); - RequestsAccessSection(const RequestsAccessSection&) = delete; - const RequestsAccessSection& operator=(const RequestsAccessSection&) = delete; - ~RequestsAccessSection() override = default; + MessageSection(const MessageSection&) = delete; + const MessageSection& operator=(const MessageSection&) = delete; + ~MessageSection() override = default; + + // Updates the views contents and visibility given `state`. At most only one + // of the "containers" will be visible per `state`. + void Update(ExtensionsMenuMainPageView::MessageSectionState state); // Adds an entry in `extensions_container_` for the extension with `id`, // `name` and `icon` at `index`. If the extension is already present, it // updates the entry. Shows the sections if it's the first extension entry. + // Note that `state_` must be `kUserCustomizedAccess`. void AddOrUpdateExtension(const extensions::ExtensionId& id, const std::u16string& name, const ui::ImageModel& icon, int index); // Removes the entry corresponding to `id`, if existent. Hides the section if - // no extension entries are remaining. + // no extension entries are remaining. Note that `state_` must be + // `kUserCustomizedAccess`. void RemoveExtension(const extensions::ExtensionId& id); - // Removes all extension entries. - void ClearExtensions(); - // Accessors used by tests: + views::Label* GetTextContainerForTesting() { return text_container_; } + views::View* GetRequestsAccessContainerForTesting() { + return requests_access_container_; + } std::vector<extensions::ExtensionId> GetExtensionsForTesting(); views::View* GetExtensionEntryForTesting( const extensions::ExtensionId& extension_id); private: - // Container for the entries for all the extensions requesting access.. - raw_ptr<views::View> extensions_container_; + static constexpr int kExtensionItemsContainerIndex = 1; + static constexpr int kExtensionItemIconIndex = 0; + static constexpr int kExtensionItemLabelIndex = 1; - // A collection of all the extension entries + // Removes all extension entries. + void ClearExtensions(); + + // The current state of the section. + ExtensionsMenuMainPageView::MessageSectionState state_; + + // Text container. + raw_ptr<views::Label> text_container_; + + // Request access container + raw_ptr<views::View> requests_access_container_; + // A collection of all the extension entries in the request access container. std::map<extensions::ExtensionId, views::View*> extension_entries_; - // Callback for the allow button. + // Callback for the allow button for the extension entries. base::RepeatingCallback<void(const extensions::ExtensionId&)> allow_callback_; }; -BEGIN_VIEW_BUILDER(/* No Export */, RequestsAccessSection, views::BoxLayoutView) +BEGIN_VIEW_BUILDER(/* No Export */, MessageSection, views::BoxLayoutView) END_VIEW_BUILDER -DEFINE_VIEW_BUILDER(/* No Export */, RequestsAccessSection) +DEFINE_VIEW_BUILDER(/* No Export */, MessageSection) -RequestsAccessSection::RequestsAccessSection( +MessageSection::MessageSection( base::RepeatingCallback<void(const extensions::ExtensionId&)> allow_callback) : allow_callback_(std::move(allow_callback)) { - views::Builder<RequestsAccessSection>(this) + views::Builder<MessageSection>(this) .SetOrientation(views::BoxLayout::Orientation::kVertical) - .SetVisible(false) // TODO(crbug.com/1390952): After adding margins, compute radius from a // variable or create a const variable. .SetBackground(views::CreateThemedRoundedRectBackground( kColorExtensionsMenuHighlightedBackground, 4)) .AddChildren( - // Header explaining the section. + // Text container. views::Builder<views::Label>() - .SetText(l10n_util::GetStringUTF16( - IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE)) + .CopyAddressTo(&text_container_) + .SetVisible(false) .SetTextContext(ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL) - .SetTextStyle(views::style::STYLE_EMPHASIZED) - .SetHorizontalAlignment(gfx::ALIGN_LEFT), - // Empty container for the extensions requesting access. Items will be - // populated later. + .SetHorizontalAlignment(gfx::ALIGN_CENTER), + // Requests access container. views::Builder<views::BoxLayoutView>() + .CopyAddressTo(&requests_access_container_) + .SetVisible(false) .SetOrientation(views::BoxLayout::Orientation::kVertical) - .CopyAddressTo(&extensions_container_)) + .AddChildren( + // Header. + views::Builder<views::Label>() + .SetText(l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_TITLE)) + .SetTextContext( + ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL) + .SetTextStyle(views::style::STYLE_EMPHASIZED) + .SetHorizontalAlignment(gfx::ALIGN_LEFT), + // Empty container for the extensions requesting access. + views::Builder<views::BoxLayoutView>().SetOrientation( + views::BoxLayout::Orientation::kVertical))) .BuildChildren(); } -void RequestsAccessSection::AddOrUpdateExtension( - const extensions::ExtensionId& id, - const std::u16string& name, - const ui::ImageModel& icon, - int index) { +void MessageSection::Update( + ExtensionsMenuMainPageView::MessageSectionState state) { + state_ = state; + switch (state_) { + case ExtensionsMenuMainPageView::MessageSectionState::kRestrictedAccess: + text_container_->SetText(l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_MESSAGE_SECTION_RESTRICTED_ACCESS_TEXT)); + text_container_->SetVisible(true); + requests_access_container_->SetVisible(false); + ClearExtensions(); + break; + case ExtensionsMenuMainPageView::MessageSectionState::kUserCustomizedAccess: + text_container_->SetVisible(false); + requests_access_container_->SetVisible(!extension_entries_.empty()); + break; + case ExtensionsMenuMainPageView::MessageSectionState::kUserBlockedAcces: + text_container_->SetText(l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT)); + text_container_->SetVisible(true); + requests_access_container_->SetVisible(false); + ClearExtensions(); + } +} + +void MessageSection::AddOrUpdateExtension(const extensions::ExtensionId& id, + const std::u16string& name, + const ui::ImageModel& icon, + int index) { + CHECK_EQ( + state_, + ExtensionsMenuMainPageView::MessageSectionState::kUserCustomizedAccess); auto extension_iter = extension_entries_.find(id); if (extension_iter == extension_entries_.end()) { @@ -182,38 +239,46 @@ IDS_EXTENSIONS_MENU_REQUESTS_ACCESS_SECTION_ALLOW_BUTTON_TEXT))) .Build(); extension_entries_.insert({id, item.get()}); - extensions_container_->AddChildViewAt(std::move(item), index); + requests_access_container_->children()[1]->AddChildViewAt(std::move(item), + index); - SetVisible(!extension_entries_.empty()); + requests_access_container_->SetVisible(!extension_entries_.empty()); } else { // Update extension entry. std::vector<View*> extension_items = extension_iter->second->children(); - views::AsViewClass<views::ImageView>(extension_items[0])->SetImage(icon); - views::AsViewClass<views::Label>(extension_items[1])->SetText(name); - extensions_container_->ReorderChildView(extension_iter->second, index); + views::AsViewClass<views::ImageView>( + extension_items[kExtensionItemIconIndex]) + ->SetImage(icon); + views::AsViewClass<views::Label>(extension_items[kExtensionItemLabelIndex]) + ->SetText(name); + requests_access_container_->children()[kExtensionItemsContainerIndex] + ->ReorderChildView(extension_iter->second, index); } } -void RequestsAccessSection::RemoveExtension(const extensions::ExtensionId& id) { +void MessageSection::RemoveExtension(const extensions::ExtensionId& id) { + CHECK_EQ( + state_, + ExtensionsMenuMainPageView::MessageSectionState::kUserCustomizedAccess); auto extension_iter = extension_entries_.find(id); if (extension_iter == extension_entries_.end()) { return; } - extensions_container_->RemoveChildViewT(extension_iter->second); + requests_access_container_->children()[kExtensionItemsContainerIndex] + ->RemoveChildViewT(extension_iter->second); extension_entries_.erase(extension_iter); - SetVisible(!extension_entries_.empty()); + requests_access_container_->SetVisible(!extension_entries_.empty()); } -void RequestsAccessSection::ClearExtensions() { - SetVisible(false); - extensions_container_->RemoveAllChildViews(); +void MessageSection::ClearExtensions() { + requests_access_container_->children()[kExtensionItemsContainerIndex] + ->RemoveAllChildViews(); extension_entries_.clear(); } -std::vector<extensions::ExtensionId> -RequestsAccessSection::GetExtensionsForTesting() { +std::vector<extensions::ExtensionId> MessageSection::GetExtensionsForTesting() { std::vector<extensions::ExtensionId> extensions; extensions.reserve(extension_entries_.size()); for (auto entry : extension_entries_) { @@ -222,7 +287,7 @@ return extensions; } -views::View* RequestsAccessSection::GetExtensionEntryForTesting( +views::View* MessageSection::GetExtensionEntryForTesting( const extensions::ExtensionId& extension_id) { auto iter = extension_entries_.find(extension_id); return iter == extension_entries_.end() ? nullptr : iter->second; @@ -334,14 +399,14 @@ views::Builder<views::BoxLayoutView>() .SetOrientation(views::BoxLayout::Orientation::kVertical) .AddChildren( - // Request access section. - views::Builder<RequestsAccessSection>( - std::make_unique<RequestsAccessSection>( + // Message section. + views::Builder<MessageSection>( + std::make_unique<MessageSection>( base::BindRepeating( &ExtensionsMenuHandler:: OnAllowExtensionClicked, base::Unretained(menu_handler_)))) - .CopyAddressTo(&requests_access_section_), + .CopyAddressTo(&message_section_), // Menu items section. views::Builder<views::BoxLayoutView>() .CopyAddressTo(&menu_items_) @@ -409,21 +474,22 @@ GetSiteSettingToggleText(is_site_settings_toggle_on)); } +void ExtensionsMenuMainPageView::UpdateMessageSection( + MessageSectionState state) { + message_section_->Update(state); +} + void ExtensionsMenuMainPageView::AddOrUpdateExtensionRequestingAccess( const extensions::ExtensionId& id, const std::u16string& name, const ui::ImageModel& icon, int index) { - requests_access_section_->AddOrUpdateExtension(id, name, icon, index); + message_section_->AddOrUpdateExtension(id, name, icon, index); } void ExtensionsMenuMainPageView::RemoveExtensionRequestingAccess( const extensions::ExtensionId& id) { - requests_access_section_->RemoveExtension(id); -} - -void ExtensionsMenuMainPageView::ClearExtensionsRequestingAccess() { - requests_access_section_->ClearExtensions(); + message_section_->RemoveExtension(id); } std::vector<ExtensionMenuItemView*> ExtensionsMenuMainPageView::GetMenuItems() @@ -435,15 +501,23 @@ return menu_item_views; } +views::Label* ExtensionsMenuMainPageView::GetTextContainerForTesting() { + return message_section_->GetTextContainerForTesting(); +} +views::View* +ExtensionsMenuMainPageView::GetRequestsAccessContainerForTesting() { + return message_section_->GetRequestsAccessContainerForTesting(); +} + std::vector<extensions::ExtensionId> ExtensionsMenuMainPageView::GetExtensionsRequestingAccessForTesting() { - return requests_access_section_->GetExtensionsForTesting(); // IN-TEST + return message_section_->GetExtensionsForTesting(); // IN-TEST } views::View* ExtensionsMenuMainPageView::GetExtensionRequestingAccessEntryForTesting( const extensions::ExtensionId& extension_id) { - return requests_access_section_->GetExtensionEntryForTesting( + return message_section_->GetExtensionEntryForTesting( extension_id); // IN-TEST }
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h index f10502a..af96e7e 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h
@@ -30,13 +30,22 @@ class ToolbarActionsModel; class ExtensionMenuItemView; class ExtensionActionViewController; -class RequestsAccessSection; +class MessageSection; // The main view of the extensions menu. class ExtensionsMenuMainPageView : public views::View { public: METADATA_HEADER(ExtensionsMenuMainPageView); + enum class MessageSectionState { + // Site is restricted to all extensions. + kRestrictedAccess, + // User can customize each extension's access to the site. + kUserCustomizedAccess, + // User blocked all extensions access to the site. + kUserBlockedAcces, + }; + explicit ExtensionsMenuMainPageView(Browser* browser, ExtensionsMenuHandler* menu_handler); ~ExtensionsMenuMainPageView() override = default; @@ -69,6 +78,9 @@ bool is_site_settings_toggle_visible, bool is_site_settings_toggle_on); + // Updates the message section given `state`. + void UpdateMessageSection(MessageSectionState state); + // Adds or updates the extension entry in the `requests_access_section_` with // the given information. void AddOrUpdateExtensionRequestingAccess(const extensions::ExtensionId& id, @@ -80,9 +92,6 @@ // if existent. void RemoveExtensionRequestingAccess(const extensions::ExtensionId& id); - // Clears all the entries in the `requests_access_section_`. - void ClearExtensionsRequestingAccess(); - void OnToggleButtonPressed(); // Accessors used by tests: @@ -90,6 +99,8 @@ views::ToggleButton* GetSiteSettingsToggleForTesting() { return site_settings_toggle_; } + views::Label* GetTextContainerForTesting(); + views::View* GetRequestsAccessContainerForTesting(); std::vector<extensions::ExtensionId> GetExtensionsRequestingAccessForTesting(); views::View* GetExtensionRequestingAccessEntryForTesting( @@ -105,8 +116,8 @@ raw_ptr<views::Label> subheader_subtitle_; raw_ptr<views::ToggleButton> site_settings_toggle_; - // Requests access section. - raw_ptr<RequestsAccessSection> requests_access_section_; + // Message section. + raw_ptr<MessageSection> message_section_; // Menu items section. // The view containing the menu items. This is separated for easy insertion
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_interactive_uitest.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_interactive_uitest.cc index 7848732..e07c7d4 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_interactive_uitest.cc
@@ -14,11 +14,13 @@ #include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_interactive_uitest.h" +#include "chrome/grit/generated_resources.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" #include "extensions/common/extension_features.h" #include "extensions/test/permissions_manager_waiter.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/views/controls/button/toggle_button.h" namespace { @@ -44,13 +46,21 @@ // Asserts there is exactly one menu item and then returns it. ExtensionMenuItemView* GetOnlyMenuItem(); - // Returns the extension ids in the request access section. If it's empty, - // the section is not visible. + // Returns the extension ids in the message section. If it's empty, + // the section displaying the extensions requesting site access is not + // visible. std::vector<extensions::ExtensionId> GetExtensionsInRequestAccessSection(); // Returns the extension ids in the request access button in the toolbar. std::vector<extensions::ExtensionId> GetExtensionsInRequestAccessButton(); + // Returns whether the text container in the message section is visible. + bool IsTextContainerInMessageSectionVisible(); + + // Returns whether the requests access container in the message section is + // visible. + bool IsRequestsAccessContainerInMessageSectionVisible(); + void ClickSiteSettingToggle(); ExtensionsMenuMainPageView* main_page(); @@ -89,8 +99,12 @@ ExtensionsMenuMainPageViewInteractiveUITest:: GetExtensionsInRequestAccessSection() { ExtensionsMenuMainPageView* page = main_page(); - return page ? page->GetExtensionsRequestingAccessForTesting() - : std::vector<std::string>(); + // No extensions are shown in the main page is not visible or if requests + // access container is hidden. + if (!page || !page->GetRequestsAccessContainerForTesting()->GetVisible()) { + return std::vector<std::string>(); + } + return page->GetExtensionsRequestingAccessForTesting(); } std::vector<extensions::ExtensionId> @@ -102,6 +116,22 @@ ->GetExtensionIdsForTesting(); } +// Returns whether the text container in the message section is visible. +bool ExtensionsMenuMainPageViewInteractiveUITest:: + IsTextContainerInMessageSectionVisible() { + ExtensionsMenuMainPageView* page = main_page(); + return page ? page->GetTextContainerForTesting()->GetVisible() : false; +} + +// Returns whether the requests access container in the message section is +// visible. +bool ExtensionsMenuMainPageViewInteractiveUITest:: + IsRequestsAccessContainerInMessageSectionVisible() { + ExtensionsMenuMainPageView* page = main_page(); + return page ? page->GetRequestsAccessContainerForTesting()->GetVisible() + : false; +} + void ExtensionsMenuMainPageViewInteractiveUITest::ClickSiteSettingToggle() { DCHECK(main_page()); @@ -167,25 +197,38 @@ ShowUi(""); - // By default, extension should have injected since site has "customize by - // extension" site setting (toggle button on). + // When user can customize site access by extension and the extension has + // granted access (by default): + // - extension is injected. + // - message section is hidden, meaning text container and requests access + // section are both hidden. auto* permissions_manager = PermissionsManager::Get(browser()->profile()); EXPECT_EQ(permissions_manager->GetUserSiteSetting(origin), PermissionsManager::UserSiteSetting::kCustomizeByExtension); EXPECT_TRUE(main_page()->GetSiteSettingsToggleForTesting()->GetIsOn()); EXPECT_TRUE(DidInjectScript(web_contents)); + EXPECT_FALSE(IsTextContainerInMessageSectionVisible()); + EXPECT_FALSE(IsRequestsAccessContainerInMessageSectionVisible()); - // Toggling the button OFF changes site setting to "block all - // extensions". However, since extension was already injected in the site, it - // remains injected. + // Toggling the button OFF changes to user blocked all extensions: + // - since extension was already injected in the site, it remains injected. + // - text container is visible with user blocked access message. + // TODO(crbug.com/1390952): We sbould show a message that user needs to reload + // the page to see the changes. ClickSiteSettingToggle(); EXPECT_EQ(permissions_manager->GetUserSiteSetting(origin), PermissionsManager::UserSiteSetting::kBlockAllExtensions); EXPECT_FALSE(main_page()->GetSiteSettingsToggleForTesting()->GetIsOn()); EXPECT_TRUE(DidInjectScript(web_contents)); + EXPECT_TRUE(IsTextContainerInMessageSectionVisible()); + EXPECT_EQ(main_page()->GetTextContainerForTesting()->GetText(), + l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT)); + EXPECT_FALSE(IsRequestsAccessContainerInMessageSectionVisible()); - // Refreshing the page causes the site setting to take effect and the - // extension is not injected. + // Refreshing the page causes the site setting to take effect: + // - extension is not injected. + // - text container is visible with user blocked access message. { content::TestNavigationObserver observer(web_contents); chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); @@ -197,18 +240,29 @@ EXPECT_FALSE(main_page()->GetSiteSettingsToggleForTesting()->GetIsOn()); EXPECT_FALSE( DidInjectScript(browser()->tab_strip_model()->GetActiveWebContents())); + EXPECT_TRUE(IsTextContainerInMessageSectionVisible()); + EXPECT_EQ(main_page()->GetTextContainerForTesting()->GetText(), + l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT)); + EXPECT_FALSE(IsRequestsAccessContainerInMessageSectionVisible()); // Toggling the button ON changes site setting to "customize by - // extension". Extension is still not injected because there was no page - // refresh. + // extension": + // - extension is still not injected because there was no page + // refresh. + // - ClickSiteSettingToggle(); EXPECT_EQ(permissions_manager->GetUserSiteSetting(origin), PermissionsManager::UserSiteSetting::kCustomizeByExtension); EXPECT_TRUE(main_page()->GetSiteSettingsToggleForTesting()->GetIsOn()); EXPECT_FALSE(DidInjectScript(web_contents)); + EXPECT_FALSE(IsTextContainerInMessageSectionVisible()); + EXPECT_FALSE(IsRequestsAccessContainerInMessageSectionVisible()); - // Refreshing the page causes the site setting to take effect and the - // extension is injected. + // Refreshing the page causes the site setting to take effect + // - extension is injected. + // - message section is hidden, meaning text container and requests access + // section are both hidden. { content::TestNavigationObserver observer(web_contents); chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); @@ -220,11 +274,13 @@ EXPECT_TRUE(main_page()->GetSiteSettingsToggleForTesting()->GetIsOn()); EXPECT_TRUE( DidInjectScript(browser()->tab_strip_model()->GetActiveWebContents())); + EXPECT_FALSE(IsTextContainerInMessageSectionVisible()); + EXPECT_FALSE(IsRequestsAccessContainerInMessageSectionVisible()); } // Test that running an extension's action, when site permission were withheld, // sets the extension's site access toggle on. It also tests that the menu's -// request access section and the toolbar's request access button are properly +// message section and the toolbar's request access button are properly // updated with the extension requesting access. IN_PROC_BROWSER_TEST_F(ExtensionsMenuMainPageViewInteractiveUITest, SiteAccessToggle_RunAction) { @@ -252,10 +308,13 @@ // When extension has withheld site access: // - site access toggle is visible and off. - // - request access section includes extension. + // - message section only shows request access container and includes + // extension. // - request access button, in the toolbar, includes extension. EXPECT_TRUE(menu_item->site_access_toggle_for_testing()->GetVisible()); EXPECT_FALSE(menu_item->site_access_toggle_for_testing()->GetIsOn()); + EXPECT_FALSE(IsTextContainerInMessageSectionVisible()); + EXPECT_TRUE(IsRequestsAccessContainerInMessageSectionVisible()); EXPECT_THAT(GetExtensionsInRequestAccessSection(), testing::ElementsAre(extension_id)); EXPECT_THAT(GetExtensionsInRequestAccessButton(), @@ -263,18 +322,19 @@ // When extension has granted site access, after toggling ON site access: // - site access toggle is visible and on - // - request access section does not include extension. + // - message section does not include extension and is hidden // - request access button, in the toolbar, does not include extension. ClickButton(menu_item->primary_action_button_for_testing()); EXPECT_TRUE(menu_item->site_access_toggle_for_testing()->GetVisible()); EXPECT_TRUE(menu_item->site_access_toggle_for_testing()->GetIsOn()); - + EXPECT_FALSE(IsTextContainerInMessageSectionVisible()); + EXPECT_FALSE(IsRequestsAccessContainerInMessageSectionVisible()); EXPECT_TRUE(GetExtensionsInRequestAccessSection().empty()); EXPECT_TRUE(GetExtensionsInRequestAccessButton().empty()); // When navigating back to the original site: // - site access toggle is visible and off. - // - request access section includes extension. + // - message section includes extension. // - request access button, in the toolbar, includes extension. // Note that we don't revoke permissions when navigation is to the same origin // (e.g refreshing the page). Thus, we navigate to other site and then back to @@ -286,7 +346,8 @@ menu_item = GetOnlyMenuItem(); EXPECT_TRUE(menu_item->site_access_toggle_for_testing()->GetVisible()); EXPECT_FALSE(menu_item->site_access_toggle_for_testing()->GetIsOn()); - + EXPECT_FALSE(IsTextContainerInMessageSectionVisible()); + EXPECT_TRUE(IsRequestsAccessContainerInMessageSectionVisible()); EXPECT_THAT(GetExtensionsInRequestAccessSection(), testing::ElementsAre(extension_id)); EXPECT_THAT(GetExtensionsInRequestAccessButton(), @@ -295,7 +356,7 @@ // When extension has withheld site access but cannot show requests in // toolbar: // - site access toggle is visible and off. - // - request access section includes extension. + // - message section includes extension. // - request access button, in the toolbar, does not include extension. SitePermissionsHelper(profile()).SetShowAccessRequestsInToolbar(extension_id, false);
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc index 4b6e5010..77074958 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
@@ -965,19 +965,85 @@ menu_items()[1]->site_permissions_button_for_testing()->GetVisible()); } -// Test that request access section is populated with extensions that have -// withheld permission to the current site and the user can change their site +// Tests that the message section only displays the text container when the +// site restricts access to all extensions. +TEST_F(ExtensionsMenuMainPageViewUnitTest, MessageSection_RestrictedAccess) { + InstallExtensionWithHostPermissions("Extension", {"<all_urls>"}); + + const GURL restricted_url("chrome://extensions"); + web_contents_tester()->NavigateAndCommit(restricted_url); + ShowMenu(); + + // Only the text container is displayed with restricted site message, when + // site restricts access to all extensions. + views::Label* text_container = main_page()->GetTextContainerForTesting(); + EXPECT_TRUE(text_container->GetVisible()); + EXPECT_EQ(text_container->GetText(), + l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_MESSAGE_SECTION_RESTRICTED_ACCESS_TEXT)); + EXPECT_FALSE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); +} + +// Tests that the message section only displays the text container when the +// user has blocked all extensions on the site. +TEST_F(ExtensionsMenuMainPageViewUnitTest, MessageSection_UserBlockedAccess) { + InstallExtensionWithHostPermissions("Extension", {"<all_urls>"}); + + const GURL url("http://www.example.com"); + web_contents_tester()->NavigateAndCommit(url); + + // Block all extensions on `url`. + UpdateUserSiteSetting( + PermissionsManager::UserSiteSetting::kBlockAllExtensions, url); + ASSERT_EQ(GetUserSiteSetting(url), + PermissionsManager::UserSiteSetting::kBlockAllExtensions); + + ShowMenu(); + + // Only the text container is displayed with user blocked site message, when + // all the extensions are blocked on this site. + views::Label* text_container = main_page()->GetTextContainerForTesting(); + EXPECT_TRUE(text_container->GetVisible()); + EXPECT_EQ(text_container->GetText(), + l10n_util::GetStringUTF16( + IDS_EXTENSIONS_MENU_MESSAGE_SECTION_USER_BLOCKED_ACCESS_TEXT)); + EXPECT_FALSE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); +} + +// Tests that all the containers in the message section are hidden when the user +// can customize the extensions site access but no extension is requesting site // access. -TEST_F(ExtensionsMenuMainPageViewUnitTest, RequestsAccessSection) { - // Install extensions that cannot request site access in the menu because they - // don't request host permissions, or because they are granted host +TEST_F(ExtensionsMenuMainPageViewUnitTest, + MessageSection_UserCustomizedAccess_NoExtensions) { + // Install extensions that cannot request site access in the menu because + // they don't request host permissions, or because they are granted host // permissions by enterprise. InstallExtensionWithHostPermissions("Extension", {}); InstallEnterpriseExtension("Enterprise extension", /*host_permissions=*/{"<all_urls>"}); - // Install two extension that requests host permissions. By default site - // access will be granted. + const GURL url("http://www.example.com"); + web_contents_tester()->NavigateAndCommit(url); + ShowMenu(); + + // Message section is hidden when user can customize the site access of each + // extension, but no extension is requesting site access. + ASSERT_EQ(GetUserSiteSetting(url), + PermissionsManager::UserSiteSetting::kCustomizeByExtension); + + EXPECT_FALSE(main_page()->GetTextContainerForTesting()->GetVisible()); + EXPECT_FALSE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); +} + +// Test that the message section only displays the requests access container +// when the user can customize the extensions site access and at least 1+ +// extensios are requesting site access. +TEST_F(ExtensionsMenuMainPageViewUnitTest, + MessageSection_UserCustomizedAccess_Extensions) { + // Install two extension that requests host permissions. auto extension_A = InstallExtensionWithHostPermissions("Extension A", {"<all_urls>"}); auto extension_B = @@ -986,44 +1052,46 @@ const GURL url("http://www.example.com"); web_contents_tester()->NavigateAndCommit(url); - ShowMenu(); - - // Requests access section is empty because: - // - extension with no host permissions cannot be granted site access - // - enterprise extensions are always granted access (if requested) - // - extensions with host permissions have granted access by default because - // site setting is "customize by extension" and each extension is granted - // access. + // By default, user can customize the site access of each extension and site + // access will be granted ASSERT_EQ(GetUserSiteSetting(url), PermissionsManager::UserSiteSetting::kCustomizeByExtension); + + ShowMenu(); + + // Message section is hidden when user can customize site access but all + // extensions have granted access. + EXPECT_FALSE(main_page()->GetTextContainerForTesting()->GetVisible()); + EXPECT_FALSE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); EXPECT_TRUE(GetExtensionsInRequestAccessSection().empty()); - // Request access section includes extension A when its site access - // is withheld. + // Message section shows request access container with extension A + // when its site access is withheld. WithholdHostPermissions(extension_A.get()); LayoutMenuIfNecessary(); + EXPECT_FALSE(main_page()->GetTextContainerForTesting()->GetVisible()); + EXPECT_TRUE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); EXPECT_THAT(GetExtensionsInRequestAccessSection(), testing::ElementsAre(extension_A->id())); - // Requests access section includes extension A if its site access is still - // withheld when there any of the installed extensions is updated. Extension B - // is not included because it has granted site access. + // Message section shows requests access container with extension A if its + // site access is still withheld when any other extension is updated. + // Extension B is not included because it has granted site access. UpdateUserSiteAccess(*extension_B.get(), browser()->tab_strip_model()->GetActiveWebContents(), extensions::PermissionsManager::UserSiteAccess::kOnSite); LayoutMenuIfNecessary(); + EXPECT_FALSE(main_page()->GetTextContainerForTesting()->GetVisible()); + EXPECT_TRUE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); EXPECT_THAT(GetExtensionsInRequestAccessSection(), testing::ElementsAre(extension_A->id())); - - // Requests access section is hidden when user has blocked all extension on - // the site. - UpdateUserSiteSetting( - PermissionsManager::UserSiteSetting::kBlockAllExtensions, url); - EXPECT_TRUE(GetExtensionsInRequestAccessSection().empty()); } TEST_F(ExtensionsMenuMainPageViewUnitTest, - RequestsAccessSection_AllowExtension) { + MessageSection_UserCustomizedAccess_AllowExtension) { auto extension = InstallExtensionWithHostPermissions("Extension", {"<all_urls>"}); WithholdHostPermissions(extension.get()); @@ -1039,10 +1107,12 @@ auto* permissions = PermissionsManager::Get(profile()); // When extension is requesting site access: - // - request access section (menu) includes extension. + // - message section (menu) includes extension and is visible. // - request access button (toolbar) includes extension. // - action has not been run. // - site access is "on click". + EXPECT_TRUE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); EXPECT_THAT(GetExtensionsInRequestAccessSection(), testing::ElementsAre(extension->id())); EXPECT_THAT(GetExtensionsInRequestAccessButton(), @@ -1064,11 +1134,13 @@ LayoutMenuIfNecessary(); // When extension is granted site access via 'allow' button: - // - request access section (menu) does not include extension + // - message section (menu) does not include extension and is hidden // - request access button (toolbar) does not include extension // - action has been run // - site access is still "on click" since clicking the button grants one // time access + EXPECT_FALSE( + main_page()->GetRequestsAccessContainerForTesting()->GetVisible()); EXPECT_TRUE(GetExtensionsInRequestAccessSection().empty()); EXPECT_TRUE(GetExtensionsInRequestAccessButton().empty()); EXPECT_EQ(user_action_tester.GetActionCount(kActivatedUserAction), 1);
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc index c013bd7..c67040f8 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
@@ -247,6 +247,26 @@ : ExtensionMenuItemView::SiteAccessToggleState::kOff; } +// Returns the state for the message section in the menu. +ExtensionsMenuMainPageView::MessageSectionState GetMessageSectionState( + Profile& profile, + const ToolbarActionsModel& toolbar_model, + content::WebContents& web_contents) { + if (toolbar_model.IsRestrictedUrl(web_contents.GetLastCommittedURL())) { + return ExtensionsMenuMainPageView::MessageSectionState::kRestrictedAccess; + } + + PermissionsManager::UserSiteSetting site_setting = + PermissionsManager::Get(&profile)->GetUserSiteSetting( + web_contents.GetPrimaryMainFrame()->GetLastCommittedOrigin()); + if (site_setting == + PermissionsManager::UserSiteSetting::kBlockAllExtensions) { + return ExtensionsMenuMainPageView::MessageSectionState::kUserBlockedAcces; + } + + return ExtensionsMenuMainPageView::MessageSectionState::kUserCustomizedAccess; +} + } // namespace ExtensionsMenuViewController::ExtensionsMenuViewController( @@ -429,17 +449,14 @@ main_page->UpdateSubheader(current_site, is_site_settings_toggle_visible, is_site_settings_toggle_on); - // Update request access section. - auto site_setting = - PermissionsManager::Get(browser_->profile()) - ->GetUserSiteSetting( - web_contents->GetPrimaryMainFrame()->GetLastCommittedOrigin()); - if (site_setting == - PermissionsManager::UserSiteSetting::kBlockAllExtensions) { - // Extensions cannot request access if user blocked all extensions on this - // site. - main_page->ClearExtensionsRequestingAccess(); - } else { + // Update message section. + ExtensionsMenuMainPageView::MessageSectionState message_section_state = + GetMessageSectionState(*browser_->profile(), *toolbar_model_, + *web_contents); + main_page->UpdateMessageSection(message_section_state); + + if (message_section_state == + ExtensionsMenuMainPageView::MessageSectionState::kUserCustomizedAccess) { int index = 0; std::vector<std::string> extension_ids = SortExtensionsByName(*toolbar_model_); @@ -450,7 +467,7 @@ web_contents); if (site_interaction == SitePermissionsHelper::SiteInteraction::kWithheld) { - // Add or update the extension entry in the request access section when + // Add or update the extension entry in the message section when // the extension is requesting access. ToolbarActionViewController* action_controller = extensions_container_->GetActionForId(extension_id); @@ -549,7 +566,7 @@ int index = FindIndex(*toolbar_model_, action_id); InsertMenuItemMainPage(main_page, action_id, index); - // TODO(crbug.com/1390952): Update requests access section once + // TODO(crbug.com/1390952): Update message section once // such section is implemented (if the extension added requests // site access, it needs to be added to such section). bubble_delegate_->SizeToContents(); @@ -574,7 +591,7 @@ DCHECK(main_page); main_page->RemoveMenuItem(action_id); - // TODO(crbug.com/1390952): Update requests access section (if the extension + // TODO(crbug.com/1390952): Update message section (if the extension // removed was in the section, it needs to be removed). bubble_delegate_->SizeToContents(); }
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm index 1b48e12c..7ef6c47 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm
@@ -4,7 +4,6 @@ #include <AppKit/AppKit.h> -#include "base/allocator/partition_allocator/pointers/raw_ptr.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller_mac.h" #include <vector> @@ -131,9 +130,8 @@ // Used as a convenience to access // NativeWidgetMacNSWindowHost::GetNSWindowMojo(). - // Dangling in ImmersiveModeControllerMacBrowserTest.ToggleFullscreen. - raw_ptr<remote_cocoa::mojom::NativeWidgetNSWindow, DanglingUntriaged> - ns_window_mojo_ = nullptr; // weak + raw_ptr<remote_cocoa::mojom::NativeWidgetNSWindow> ns_window_mojo_ = + nullptr; // weak // Used to hold the widget id for the tab hosting widget. This will be passed // to the remote_cocoa immersive mode controller where the tab strip will be
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc index 4eebef58..d410b82 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
@@ -628,10 +628,11 @@ ChromeLayoutProvider::Get(); // Set the interior margins of the header on the left and right sides. - header->SetInteriorMargin(gfx::Insets::VH( - 0, chrome_layout_provider->GetDistanceMetric( - ChromeDistanceMetric:: - DISTANCE_SIDE_PANEL_HEADER_INTERIOR_MARGIN_HORIZONTAL))); + const int horizontal_margin = chrome_layout_provider->GetDistanceMetric( + ChromeDistanceMetric:: + DISTANCE_SIDE_PANEL_HEADER_INTERIOR_MARGIN_HORIZONTAL); + header->SetInteriorMargin( + gfx::Insets::TLBR(0, horizontal_margin, 0, horizontal_margin * 2)); // Set alignments for horizontal (main) and vertical (cross) axes. header->SetMainAxisAlignment(views::LayoutAlignment::kStart); header->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
diff --git a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc index 26837bc..26ce1cb 100644 --- a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc +++ b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/supervised_user/supervised_user_browser_utils.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/browser/ui/supervised_user/parent_permission_dialog.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" @@ -26,7 +27,6 @@ #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/scope_set.h" #include "components/supervised_user/core/browser/supervised_user_service.h" -#include "components/user_manager/user_manager.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/extension_util.h" @@ -321,18 +321,6 @@ return reprompt_after_incorrect_credential_; } -std::u16string ParentPermissionDialogView::GetActiveUserFirstName() const { -#if BUILDFLAG(IS_CHROMEOS_ASH) - user_manager::UserManager* manager = user_manager::UserManager::Get(); - const user_manager::User* user = manager->GetActiveUser(); - return user->GetGivenName(); -#else - // TODO(https://crbug.com/1218633): Implement support for parent approved - // extensions in LaCrOS. - return std::u16string(); -#endif -} - void ParentPermissionDialogView::AddedToWidget() { ChromeLayoutProvider* provider = ChromeLayoutProvider::Get(); constexpr int icon_size = extension_misc::EXTENSION_ICON_SMALL; @@ -459,7 +447,9 @@ } std::u16string permission_header_label = l10n_util::GetStringFUTF16( IDS_PARENT_PERMISSION_PROMPT_CHILD_WANTS_TO_INSTALL_LABEL, - GetActiveUserFirstName(), extension_type); + base::UTF8ToUTF16( + supervised_user::GetAccountGivenName(*params_->profile)), + extension_type); views::Label* permissions_header = new views::Label( permission_header_label, views::style::CONTEXT_DIALOG_BODY_TEXT); @@ -772,7 +762,6 @@ ADD_PROPERTY_METADATA(std::u16string, ParentPermissionCredential) ADD_READONLY_PROPERTY_METADATA(bool, InvalidCredentialReceived) ADD_PROPERTY_METADATA(bool, RepromptAfterIncorrectCredential) -ADD_READONLY_PROPERTY_METADATA(std::u16string, ActiveUserFirstName) END_METADATA class ParentPermissionDialogImpl : public ParentPermissionDialog,
diff --git a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.h b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.h index 1118fb2e..91b3d80 100644 --- a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.h +++ b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_SUPERVISED_USER_PARENT_PERMISSION_DIALOG_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_SUPERVISED_USER_PARENT_PERMISSION_DIALOG_VIEW_H_ +#include <string> #include <vector> #include "base/memory/raw_ptr.h" @@ -82,8 +83,6 @@ bool GetRepromptAfterIncorrectCredential() const; private: - std::u16string GetActiveUserFirstName() const; - // views::View: void AddedToWidget() override; void OnThemeChanged() override;
diff --git a/chrome/browser/ui/webui/ash/login/quick_start_screen_handler.cc b/chrome/browser/ui/webui/ash/login/quick_start_screen_handler.cc index bf48117..0613cc8 100644 --- a/chrome/browser/ui/webui/ash/login/quick_start_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/quick_start_screen_handler.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/ui/webui/ash/login/quick_start_screen_handler.h" #include "base/values.h" +#include "chrome/grit/generated_resources.h" +#include "components/login/localized_values_builder.h" namespace ash { @@ -48,6 +50,30 @@ } void QuickStartScreenHandler::DeclareLocalizedValues( - ::login::LocalizedValuesBuilder* builder) {} + ::login::LocalizedValuesBuilder* builder) { + builder->Add("quickStartSetupTitle", IDS_LOGIN_QUICK_START_SETUP_TITLE); + builder->Add("quickStartSetupSubtitleQrCode", + IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_QR_CODE); + builder->Add("quickStartSetupSubtitlePinCode", + IDS_LOGIN_QUICK_START_SETUP_SUBTITLE_PIN_CODE); + builder->Add("quickStartWifiTransferTitle", + IDS_LOGIN_QUICK_START_WIFI_TRANSFER_TITLE); + builder->Add("quickStartWifiTransferSubtitle", + IDS_LOGIN_QUICK_START_WIFI_TRANSFER_SUBTITLE); + builder->Add("quickStartNetworkNeededSubtitle", + IDS_LOGIN_QUICK_START_NETWORK_NEEDED_SUBTITLE); + builder->Add("quickStartStartAfterResumeTitle", + IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_TITLE); + builder->Add("quickStartStartAfterResumeSubtitle", + IDS_LOGIN_QUICK_START_RESUME_AFTER_REBOOT_SUBTITLE); + builder->Add("quickStartAccountTransferTitle", + IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_TITLE); + builder->Add("quickStartAccountTransferSubtitle", + IDS_LOGIN_QUICK_START_ACCOUNT_TRANSFER_STEP_SUBTITLE); + builder->Add("quickStartSetupFromSigninTitle", + IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_TITLE); + builder->Add("quickStartSetupFromSigninSubtitle", + IDS_LOGIN_QUICK_START_SETUP_FROM_SIGNIN_SCREEN_SUBTITLE); +} } // namespace ash
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc index 5887cc2..5ece1860 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -140,10 +140,8 @@ text_color = color_provider.GetColor(kColorNewTabPageTextUnthemed); theme->logo_color = color_provider.GetColor(kColorNewTabPageLogoUnthemedLight); - most_visited->background_color = color_provider.GetColor( - base::FeatureList::IsEnabled(ntp_features::kNtpComprehensiveTheming) - ? kColorNewTabPageMostVisitedTileBackground - : kColorNewTabPageMostVisitedTileBackgroundUnthemed); + most_visited->background_color = + color_provider.GetColor(kColorNewTabPageMostVisitedTileBackground); } else if (theme_provider->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) { text_color = color_provider.GetColor( remove_scrim ? kColorNewTabPageTextUnthemed : kColorNewTabPageText); @@ -173,7 +171,6 @@ theme->text_color = text_color; theme->is_dark = !color_utils::IsDark(text_color); theme->theme_realbox_icons = - base::FeatureList::IsEnabled(ntp_features::kNtpComprehensiveTheming) && base::FeatureList::IsEnabled( ntp_features::kNtpComprehensiveThemeRealbox) && theme_service->UsingAutogeneratedTheme() &&
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc index e31f1e33..cfd4a0b 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
@@ -366,7 +366,7 @@ class NewTabPageHandlerThemeTest : public NewTabPageHandlerTest, - public ::testing::WithParamInterface<std::tuple<bool, bool, bool>> { + public ::testing::WithParamInterface<std::tuple<bool, bool>> { public: NewTabPageHandlerThemeTest() { std::vector<base::test::FeatureRef> enabled_features; @@ -378,12 +378,6 @@ disabled_features.push_back(ntp_features::kNtpRemoveScrim); } - if (ComprehensiveTheme()) { - enabled_features.push_back(ntp_features::kNtpComprehensiveTheming); - } else { - disabled_features.push_back(ntp_features::kNtpComprehensiveTheming); - } - if (CustomizeChromeSidePanel()) { enabled_features.push_back(ntp_features::kCustomizeChromeSidePanel); } else { @@ -395,8 +389,7 @@ } bool RemoveScrim() const { return std::get<0>(GetParam()); } - bool ComprehensiveTheme() const { return std::get<1>(GetParam()); } - bool CustomizeChromeSidePanel() const { return std::get<2>(GetParam()); } + bool CustomizeChromeSidePanel() const { return std::get<1>(GetParam()); } private: base::test::ScopedFeatureList feature_list_; @@ -560,11 +553,7 @@ EXPECT_FALSE(theme->background_image->scrim_display.has_value()); } - if (ComprehensiveTheme()) { - EXPECT_EQ(SkColorSetRGB(0, 0, 4), theme->most_visited->background_color); - } else { - EXPECT_EQ(SkColorSetRGB(0, 0, 5), theme->most_visited->background_color); - } + EXPECT_EQ(SkColorSetRGB(0, 0, 4), theme->most_visited->background_color); } TEST_P(NewTabPageHandlerThemeTest, SetDailyRefresh) { @@ -673,7 +662,6 @@ INSTANTIATE_TEST_SUITE_P(All, NewTabPageHandlerThemeTest, ::testing::Combine(::testing::Bool(), - ::testing::Bool(), ::testing::Bool())); TEST_F(NewTabPageHandlerTest, Histograms) {
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc index 34152c76..bc78b28 100644 --- a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
@@ -201,6 +201,7 @@ } void CompanionPageHandler::OnExpsOptInStatusAvailable(bool is_exps_opted_in) { + metrics_logger_->OnExpsOptInStatusAvailable(is_exps_opted_in); auto* pref_service = GetProfile()->GetPrefs(); pref_service->SetBoolean(kExpsOptInStatusGrantedPref, is_exps_opted_in); // Update default value for pref indicating whether companion should be
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc index b1442368..1741dda 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc
@@ -88,6 +88,10 @@ // read_anything::mojom::UntrustedPageHandler: /////////////////////////////////////////////////////////////////////////////// +void ReadAnythingPageHandler::OnCopy() { + web_contents()->Copy(); +} + void ReadAnythingPageHandler::OnLinkClicked(const ui::AXTreeID& target_tree_id, ui::AXNodeID target_node_id) { ui::AXActionData action_data;
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h index 6634055..26d9fab7e 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h
@@ -57,6 +57,7 @@ void TreeRemoved(ui::AXTreeID ax_tree_id) override; // read_anything::mojom::UntrustedPageHandler: + void OnCopy() override; void OnLinkClicked(const ui::AXTreeID& target_tree_id, ui::AXNodeID target_node_id) override; void OnSelectionChange(const ui::AXTreeID& target_tree_id,
diff --git a/chrome/browser/upgrade_detector/get_installed_version_mac.mm b/chrome/browser/upgrade_detector/get_installed_version_mac.mm index 1f01c077..3b97fdd 100644 --- a/chrome/browser/upgrade_detector/get_installed_version_mac.mm +++ b/chrome/browser/upgrade_detector/get_installed_version_mac.mm
@@ -14,10 +14,6 @@ #include "chrome/browser/updater/browser_updater_client_util.h" #include "chrome/common/chrome_features.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - namespace { InstalledAndCriticalVersion GetInstalledVersionSynchronous() {
diff --git a/chrome/browser/webauthn/cablev2_devices.cc b/chrome/browser/webauthn/cablev2_devices.cc index 71b04f9..4bbb5dc 100644 --- a/chrome/browser/webauthn/cablev2_devices.cc +++ b/chrome/browser/webauthn/cablev2_devices.cc
@@ -86,6 +86,7 @@ const char kPairingPrefSecret[] = "secret"; const char kPairingPrefPublicKey[] = "pub_key"; const char kPairingPrefTime[] = "time"; +const char kPairingPrefNewImpl[] = "new_impl"; // NameForDisplay removes line-breaking characters from `raw_name` to ensure // that the transport-selection UI isn't too badly broken by nonsense names. @@ -170,6 +171,8 @@ continue; } + const absl::optional<bool> is_new_impl = dict.FindBool(kPairingPrefNewImpl); + out_pairing->from_new_implementation = is_new_impl && *is_new_impl; out_pairing->name = NameForDisplay(out_pairing->name); ret.emplace_back(std::move(out_pairing)); } @@ -359,6 +362,30 @@ base::Base64Encode(pairing->peer_public_key_x962); DeletePairingByPublicKey(*update, public_key_base64); + // As an exception to the above rule, we allow a new pairing to replace a + // previous one with the same name if the new pairing is from the new + // implementation and the old one isn't. When we transition the implementation + // on Android to the new implementation, it's not feasible to port the + // identity key across. Rather than have duplicate pairings, we allow this + // replacement once. + // + // TODO(crbug.com/1442040): remove once the transition is firmly complete. + // Probably by May 2024. + const std::string& claimed_name = pairing->name; + if (pairing->from_new_implementation) { + update->EraseIf([&claimed_name](const auto& value) { + if (!value.is_dict()) { + return false; + } + const absl::optional<bool> pref_new_impl = + value.GetDict().FindBool(kPairingPrefNewImpl); + const std::string* const pref_name = + value.GetDict().FindString(kPairingPrefName); + return pref_name && *pref_name == claimed_name && + (!pref_new_impl || !*pref_new_impl); + }); + } + base::Value::Dict dict; dict.Set(kPairingPrefPublicKey, std::move(public_key_base64)); dict.Set(kPairingPrefTunnelServer, pairing->tunnel_server_domain); @@ -371,6 +398,9 @@ dict.Set(kPairingPrefContactId, base::Base64Encode(pairing->contact_id)); dict.Set(kPairingPrefId, base::Base64Encode(pairing->id)); dict.Set(kPairingPrefSecret, base::Base64Encode(pairing->secret)); + if (pairing->from_new_implementation) { + dict.Set(kPairingPrefNewImpl, true); + } base::Time::Exploded now; base::Time::Now().UTCExplode(&now);
diff --git a/chrome/browser/webauthn/cablev2_devices_unittest.cc b/chrome/browser/webauthn/cablev2_devices_unittest.cc index 562bf7c..2f55b86 100644 --- a/chrome/browser/webauthn/cablev2_devices_unittest.cc +++ b/chrome/browser/webauthn/cablev2_devices_unittest.cc
@@ -191,6 +191,7 @@ ret->secret = {11, 12, 13, 14, 15}; ret->peer_public_key_x962 = {16, 17, 18, 19, 20}; ret->name = "Pairing"; + ret->from_new_implementation = true; return ret; } @@ -212,6 +213,7 @@ EXPECT_EQ(found->peer_public_key_x962, expected->peer_public_key_x962); EXPECT_EQ(found->name, expected->name); EXPECT_EQ(found->from_sync_deviceinfo, expected->from_sync_deviceinfo); + EXPECT_EQ(found->from_new_implementation, expected->from_new_implementation); } TEST_F(CableV2DevicesProfileTest, Delete) { @@ -263,6 +265,41 @@ EXPECT_EQ(known_devices->linked_devices[3]->name, "collision (3)"); } +TEST_F(CableV2DevicesProfileTest, NameOverride) { + // A pairing from the old implementation can be overridden, by name, by the + // new implementation. + for (const bool old_impl_first : {true, false}) { + TestingProfile profile; + std::unique_ptr<Pairing> old_pairing = LinkedDevice("name", kPubKey1); + std::unique_ptr<Pairing> new_pairing = LinkedDevice("name", kPubKey2); + old_pairing->from_new_implementation = false; + new_pairing->from_new_implementation = true; + + if (old_impl_first) { + cablev2::AddPairing(&profile, std::move(old_pairing)); + } + cablev2::AddPairing(&profile, std::move(new_pairing)); + if (!old_impl_first) { + cablev2::AddPairing(&profile, std::move(old_pairing)); + } + + std::unique_ptr<KnownDevices> known_devices = + KnownDevices::FromProfile(&profile); + + EXPECT_EQ(known_devices->synced_devices.size(), 0u); + + if (old_impl_first) { + ASSERT_EQ(known_devices->linked_devices.size(), 1u); + EXPECT_EQ(known_devices->linked_devices[0]->peer_public_key_x962[0], + kPubKey2); + } else { + ASSERT_EQ(known_devices->linked_devices.size(), 2u); + EXPECT_NE(known_devices->linked_devices[0]->name, + known_devices->linked_devices[1]->name); + } + } +} + TEST_F(CableV2DevicesProfileTest, Rename) { TestingProfile profile; PrefService* const prefs = profile.GetPrefs();
diff --git a/chrome/browser/webshare/mac/sharing_service_operation.mm b/chrome/browser/webshare/mac/sharing_service_operation.mm index b812df5..d359dcb4 100644 --- a/chrome/browser/webshare/mac/sharing_service_operation.mm +++ b/chrome/browser/webshare/mac/sharing_service_operation.mm
@@ -10,6 +10,7 @@ #include "base/functional/bind.h" #include "base/i18n/file_util_icu.h" +#include "base/mac/scoped_nsobject.h" #include "base/no_destructor.h" #include "base/rand_util.h" #include "base/strings/string_util.h" @@ -30,10 +31,6 @@ #include "storage/browser/blob/blob_storage_context.h" #include "url/gurl.h" -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - using content::BrowserContext; using content::StoragePartition;
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt index 9ea2e4c..7894c3f1 100644 --- a/chrome/build/lacros64.pgo.txt +++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@ -chrome-chromeos-amd64-generic-main-1684741965-9877198816133fde5c1e2b04561d5ea49365a2fb.profdata +chrome-chromeos-amd64-generic-main-1684771016-cef77c2da2e2a8c83b2e481a14bc0279d2c53d91.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 5de9e90..aaaa435 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1684735120-799141dec94dd382138ddf3e4c43c10acc18afac.profdata +chrome-linux-main-1684756679-91c8e02c36e56ab670db38eaa961c6f1837f056e.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 379d6bc0..163176a 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1684749276-3baf89d503def7b008db9225d5ba5149e86f5300.profdata +chrome-mac-arm-main-1684771016-e1e8cfcec1f4df2b28ffce3196f1b391b42a471b.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index d0a491d..c10d7ecf 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1684735120-b681ef3f762e90652c2a427d586e72382e8dca3a.profdata +chrome-mac-main-1684756679-2cfc165e8e2ec9c3dda199c2b638b23ef2090d44.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 2c228ca..0818a97 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1684745810-e281aa73a34471fde8607f6aed8c228e9efbc681.profdata +chrome-win32-main-1684756679-c8cf4c7c9fba95e3900211a854aed10336e4decc.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 698d92a6..1b0dd465 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1684745810-b231356e5ab799996dbf86d8f839a83a4ffcd54b.profdata +chrome-win64-main-1684767520-21f05820a3110d0ee3c595f54884a31b4dd24d7f.profdata
diff --git a/chrome/common/accessibility/read_anything.mojom b/chrome/common/accessibility/read_anything.mojom index 684e6c4..11f97ea 100644 --- a/chrome/common/accessibility/read_anything.mojom +++ b/chrome/common/accessibility/read_anything.mojom
@@ -69,6 +69,15 @@ // Browser-side handler for requests from untrusted WebUI page. interface UntrustedPageHandler { + // Informs the browser controller that a user tried to copy text from the + // WebUI. If the main page allows copy commands, then the current selection + // on the main page will be copied to the user's clipboard. Note that even + // though selections on the main page and WebUI are in sync, the resulting + // content in the user's clipboard may not exactly match what is selected in + // the WebUI. This is because the main page selection may contain images, + // captions, etc that are not shown in reading mode's simplified view. + OnCopy(); + // Informs the browser controller that a link was clicked in the WebUI. The // browser controller responds by performing a click action on the link in // the target tree, which is in the main frame of the currently active web
diff --git a/chrome/common/chrome_constants.cc b/chrome/common/chrome_constants.cc index 0edfaa40..66f1ee9 100644 --- a/chrome/common/chrome_constants.cc +++ b/chrome/common/chrome_constants.cc
@@ -108,6 +108,8 @@ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) // filenames +const base::FilePath::CharType kAccountPreferencesFilename[] = + FPL("AccountPreferences"); const base::FilePath::CharType kCacheDirname[] = FPL("Cache"); const base::FilePath::CharType kCookieFilename[] = FPL("Cookies"); const base::FilePath::CharType kCRLSetFilename[] =
diff --git a/chrome/common/chrome_constants.h b/chrome/common/chrome_constants.h index d799323..0263fd0 100644 --- a/chrome/common/chrome_constants.h +++ b/chrome/common/chrome_constants.h
@@ -47,6 +47,7 @@ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) // filenames +extern const base::FilePath::CharType kAccountPreferencesFilename[]; extern const base::FilePath::CharType kCacheDirname[]; extern const base::FilePath::CharType kCookieFilename[]; extern const base::FilePath::CharType kCRLSetFilename[];
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc index c2f236b2..24db0cc 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.cc +++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -571,6 +571,7 @@ .SetMethod("shouldBold", &ReadAnythingAppController::ShouldBold) .SetMethod("isOverline", &ReadAnythingAppController::IsOverline) .SetMethod("onConnected", &ReadAnythingAppController::OnConnected) + .SetMethod("onCopy", &ReadAnythingAppController::OnCopy) .SetMethod("onLinkClicked", &ReadAnythingAppController::OnLinkClicked) .SetMethod("isSelectable", &ReadAnythingAppController::isSelectable) .SetMethod("onSelectionChange", @@ -747,6 +748,10 @@ std::move(page_handler_factory_receiver)); } +void ReadAnythingAppController::OnCopy() const { + page_handler_->OnCopy(); +} + void ReadAnythingAppController::OnLinkClicked(ui::AXNodeID ax_node_id) const { DCHECK_NE(model_.active_tree_id(), ui::AXTreeIDUnknown()); // Prevent link clicks while distillation is in progress, as it means that the
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h index c5e6f2e..39a1243d 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller.h +++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -58,8 +58,7 @@ // class ReadAnythingAppController : public gin::Wrappable<ReadAnythingAppController>, - public read_anything::mojom::UntrustedPage, - public ui::AXTreeObserver { + public read_anything::mojom::UntrustedPage { public: static gin::WrapperInfo kWrapperInfo; @@ -117,6 +116,7 @@ bool ShouldBold(ui::AXNodeID ax_node_id) const; bool IsOverline(ui::AXNodeID ax_node_id) const; void OnConnected(); + void OnCopy() const; void OnLinkClicked(ui::AXNodeID ax_node_id) const; void OnSelectionChange(ui::AXNodeID anchor_node_id, int anchor_offset,
diff --git a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc index f535b74..6ec7122 100644 --- a/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc +++ b/chrome/renderer/accessibility/read_anything_app_controller_browsertest.cc
@@ -44,6 +44,7 @@ ui::AXNodeID focus_node_id, int focus_offset), (override)); + MOCK_METHOD(void, OnCopy, (), (override)); mojo::PendingRemote<read_anything::mojom::UntrustedPageHandler> BindNewPipeAndPassRemote() {
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc index fb3811e7..6e95f97d 100644 --- a/chrome/renderer/accessibility/read_anything_app_model.cc +++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -56,6 +56,8 @@ DCHECK_NE(active_tree_id_, ui::AXTreeIDUnknown()); DCHECK(ContainsTree(active_tree_id_)); + requires_post_process_selection_ = false; + // If the previous selection was inside the distilled content, that means we // are currently displaying the distilled content in Read Anything. We may not // need to redraw the distilled content if the user's new selection is inside
diff --git a/chrome/renderer/accessibility/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything_app_model.h index 9063c78..25cc93f 100644 --- a/chrome/renderer/accessibility/read_anything_app_model.h +++ b/chrome/renderer/accessibility/read_anything_app_model.h
@@ -32,6 +32,9 @@ bool requires_post_process_selection() { return requires_post_process_selection_; } + void set_requires_post_process_selection(bool value) { + requires_post_process_selection_ = value; + } // TODO(b/1266555): Ensure there is proper test coverage for all methods. // Theme
diff --git a/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc b/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc index d26b3ccc..eb71cdf 100644 --- a/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc +++ b/chrome/renderer/accessibility/read_anything_app_model_browsertest.cc
@@ -171,6 +171,13 @@ void ProcessSelection() { model_->PostProcessSelection(); } + bool RequiresPostProcessSelection() { + return model_->requires_post_process_selection(); + } + void SetRequiresPostProcessSelection(bool requires_post_process_selection) { + model_->set_requires_distillation(requires_post_process_selection); + } + ui::AXTreeID tree_id_; private: @@ -734,8 +741,10 @@ update.tree_data.sel_focus_offset = 0; update.tree_data.sel_is_backward = false; AccessibilityEventReceived({update}); + SetRequiresPostProcessSelection(true); ProcessSelection(); + ASSERT_FALSE(RequiresPostProcessSelection()); ASSERT_TRUE(HasSelection()); ASSERT_TRUE(SelectionNodeIdsContains(1));
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc index e08fc72..331b56c 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc
@@ -208,9 +208,9 @@ return ParseGetAssertionResponse(std::move(decoded_values.second.value())); } -mojom::BootstrapConfigurationsPtr -QuickStartDecoder::DoDecodeBootstrapConfigurations( - const std::vector<uint8_t>& data) { +void QuickStartDecoder::DoDecodeBootstrapConfigurations( + const std::vector<uint8_t>& data, + DecodeBootstrapConfigurationsCallback callback) { std::unique_ptr<QuickStartMessage> message = QuickStartMessage::ReadMessage( data, QuickStartMessageType::kBootstrapConfigurations); @@ -219,22 +219,29 @@ if (!device_details) { LOG(ERROR) << "DeviceDetails cannot be found within BootstrapConfigurations."; - return nullptr; + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + return; } std::string* cryptauth_device_id_ptr = device_details->FindString(kCryptauthDeviceIdKey); if (!cryptauth_device_id_ptr) { LOG(WARNING) << "CryptauthDeviceId for the Android Device could not be found."; - return mojom::BootstrapConfigurations::New(/*cryptauth_device_id=*/""); + std::move(callback).Run( + mojom::BootstrapConfigurations::New(/*cryptauth_device_id=*/""), + absl::nullopt); + return; } - return mojom::BootstrapConfigurations::New(*cryptauth_device_id_ptr); + std::move(callback).Run( + mojom::BootstrapConfigurations::New(*cryptauth_device_id_ptr), + absl::nullopt); } void QuickStartDecoder::DecodeBootstrapConfigurations( const std::vector<uint8_t>& data, DecodeBootstrapConfigurationsCallback callback) { - std::move(callback).Run(DoDecodeBootstrapConfigurations(data)); + DoDecodeBootstrapConfigurations(data, std::move(callback)); } void QuickStartDecoder::DecodeWifiCredentialsResponse(
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h index e1a3d460..c7d1026 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h
@@ -57,8 +57,9 @@ private: friend class QuickStartDecoderTest; - mojom::BootstrapConfigurationsPtr DoDecodeBootstrapConfigurations( - const std::vector<uint8_t>& data); + void DoDecodeBootstrapConfigurations( + const std::vector<uint8_t>& data, + DecodeBootstrapConfigurationsCallback callback); mojom::GetAssertionResponsePtr DoDecodeGetAssertionResponse( const std::vector<uint8_t>& data); void DoDecodeWifiCredentialsResponse(
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc index 269ade15..3b391b9 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc
@@ -116,9 +116,10 @@ return decoder_->DoDecodeGetAssertionResponse(data); } - mojom::BootstrapConfigurationsPtr DoDecodeBootstrapConfigurations( - const std::vector<uint8_t>& data) { - return decoder_->DoDecodeBootstrapConfigurations(data); + void DoDecodeBootstrapConfigurations( + const std::vector<uint8_t>& data, + QuickStartDecoder::DecodeBootstrapConfigurationsCallback callback) { + return decoder_->DoDecodeBootstrapConfigurations(data, std::move(callback)); } void DoDecodeWifiCredentialsResponse( @@ -298,18 +299,34 @@ TEST_F(QuickStartDecoderTest, DecodeBootstrapConfigurations_EmptyMessagePayload) { QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); - mojom::BootstrapConfigurationsPtr response = - DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message)); - EXPECT_FALSE(response); + + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message), + future.GetCallback()); + + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } TEST_F(QuickStartDecoderTest, DecodeBootstrapConfigurations_EmptyBootstrapConfigurations) { QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); - mojom::BootstrapConfigurationsPtr response = - DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message)); - EXPECT_FALSE(response); + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message), + future.GetCallback()); + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } TEST_F(QuickStartDecoderTest, @@ -319,10 +336,17 @@ QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); message.GetPayload()->Set(kDeviceDetailsKey, std::move(device_details)); - mojom::BootstrapConfigurationsPtr response = - DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message)); - EXPECT_TRUE(response); - EXPECT_EQ(response->cryptauth_device_id, ""); + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message), + future.GetCallback()); + + EXPECT_FALSE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<0>()->cryptauth_device_id, ""); + EXPECT_EQ(future.Get<1>(), absl::nullopt); } TEST_F(QuickStartDecoderTest, @@ -333,10 +357,17 @@ QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); message.GetPayload()->Set(kDeviceDetailsKey, std::move(device_details)); - mojom::BootstrapConfigurationsPtr response = - DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message)); - EXPECT_TRUE(response); - EXPECT_EQ(response->cryptauth_device_id, ""); + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message), + future.GetCallback()); + + EXPECT_FALSE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<0>()->cryptauth_device_id, ""); + EXPECT_EQ(future.Get<1>(), absl::nullopt); } TEST_F(QuickStartDecoderTest, @@ -347,10 +378,16 @@ QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); message.GetPayload()->Set(kDeviceDetailsKey, std::move(device_details)); - mojom::BootstrapConfigurationsPtr response = - DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message)); - EXPECT_TRUE(response); - EXPECT_EQ(response->cryptauth_device_id, kExampleCryptauthDeviceId); + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeBootstrapConfigurations(ConvertMessageToBytes(&message), + future.GetCallback()); + EXPECT_FALSE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<0>()->cryptauth_device_id, kExampleCryptauthDeviceId); + EXPECT_EQ(future.Get<1>(), absl::nullopt); } TEST_F(QuickStartDecoderTest, ExtractFidoDataFromValidJsonResponse) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 1409296..231b457 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5546,7 +5546,6 @@ source_set("unit_tests_arc") { testonly = true sources = [ - "../browser/mac/auth_session_request_unittest.mm", "../browser/mac/keystone_glue_unittest.mm", "../browser/ui/cocoa/applescript/apple_event_util_unittest.mm", "../browser/ui/cocoa/scoped_menu_bar_lock_unittest.mm", @@ -5555,20 +5554,12 @@ "../browser/ui/cocoa/touchbar/browser_window_default_touch_bar_unittest.mm", "../browser/ui/cocoa/touchbar/credit_card_autofill_touch_bar_controller_unittest.mm", ] - if (enable_service_discovery) { - # TODO(https://crbug.com/1280317): Return this to the explicitly marked - # previous location; search for the name of this file to find it. - sources += [ - "../browser/local_discovery/service_discovery_client_mac_unittest.mm", - ] - } configs += [ "//build/config/compiler:enable_arc" ] deps = [ "//base", "//base/test:test_support", "//chrome/app:command_ids", "//chrome/app/theme:chrome_unscaled_resources_grit", - "//chrome/browser", "//chrome/browser/autofill:test_support", "//chrome/browser/mac:keystone_glue", "//chrome/browser/ui:test_support", @@ -6631,6 +6622,7 @@ "../browser/apps/app_shim/mach_bootstrap_acceptor_unittest.mm", "../browser/device_reauth/mac/device_authenticator_mac_unittest.mm", "../browser/global_keyboard_shortcuts_mac_unittest.mm", + "../browser/mac/auth_session_request_unittest.mm", "../browser/mac/exception_processor_unittest.mm", "../browser/metrics/power/coalition_resource_usage_provider_mac_unittest.mm", "../browser/metrics/power/coalition_resource_usage_provider_test_util_mac.cc", @@ -7102,6 +7094,7 @@ "../browser/policy/policy_path_parser_unittest.cc", "../browser/policy/serial_allow_usb_devices_for_urls_policy_handler_unittest.cc", "../browser/policy/webhid_device_policy_handler_unittest.cc", + "../browser/private_network_access/private_network_device_chooser_controller_unittest.cc", "../browser/profile_resetter/profile_resetter_unittest.cc", "../browser/profile_resetter/reset_report_uploader_unittest.cc", "../browser/profiles/guest_profile_creation_logger_unittest.cc", @@ -8697,8 +8690,7 @@ if (is_mac) { sources += [ - # TODO(https://crbug.com/1280317): Put - # service_discovery_client_mac_unittest.mm back here. + "../browser/local_discovery/service_discovery_client_mac_unittest.mm", ] } else { sources += [ @@ -9339,6 +9331,7 @@ "../browser/supervised_user/child_accounts/permission_request_creator_apiary_unittest.cc", "../browser/supervised_user/kids_chrome_management/kids_management_service_unittest.cc", "../browser/supervised_user/kids_chrome_management/kids_profile_manager_unittest.cc", + "../browser/supervised_user/supervised_user_browser_utils_unittest.cc", "../browser/supervised_user/supervised_user_google_auth_navigation_throttle_unittest.cc", "../browser/supervised_user/supervised_user_service_unittest.cc", ]
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts index 70b1358b..483aeb4 100644 --- a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts +++ b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_test.ts
@@ -489,7 +489,9 @@ assertFalse(editElement.hasError); }); - test('AddAcceleratorMaximumAccelerators', async () => { + // TODO(b/283781252): this test causes all tests below fail consistently on + // debug builders. Fix and re-enable. + test.skip('AddAcceleratorMaximumAccelerators', async () => { page = initShortcutCustomizationAppElement(); await flushTasks();
diff --git a/chrome/test/fuzzing/html_in_process_fuzzer.cc b/chrome/test/fuzzing/html_in_process_fuzzer.cc index 9a997c9..5ff7724 100644 --- a/chrome/test/fuzzing/html_in_process_fuzzer.cc +++ b/chrome/test/fuzzing/html_in_process_fuzzer.cc
@@ -1,6 +1,8 @@ // 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 "base/functional/bind.h" +#include "base/memory/weak_ptr.h" #include "base/test/bind.h" #include "chrome/test/base/ui_test_utils.h" #include "chrome/test/fuzzing/in_process_fuzzer.h" @@ -21,11 +23,12 @@ void SetUpOnMainThread() override; int Fuzz(const uint8_t* data, size_t size) override; static std::unique_ptr<net::test_server::HttpResponse> HandleHTTPRequest( - std::string response_body, + base::WeakPtr<HtmlInProcessFuzzer> fuzzer_weak, const net::test_server::HttpRequest& request); net::EmbeddedTestServer https_test_server_; std::string current_fuzz_case_; + base::WeakPtrFactory<HtmlInProcessFuzzer> weak_ptr_factory_{this}; }; REGISTER_IN_PROCESS_FUZZER(HtmlInProcessFuzzer) @@ -35,17 +38,34 @@ host_resolver()->AddRule("*", "127.0.0.1"); https_test_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); https_test_server_.RegisterRequestHandler(base::BindRepeating( - &HtmlInProcessFuzzer::HandleHTTPRequest, current_fuzz_case_)); + &HtmlInProcessFuzzer::HandleHTTPRequest, weak_ptr_factory_.GetWeakPtr())); ASSERT_TRUE(https_test_server_.Start()); } std::unique_ptr<net::test_server::HttpResponse> HtmlInProcessFuzzer::HandleHTTPRequest( - std::string response_body, + base::WeakPtr<HtmlInProcessFuzzer> fuzzer_weak, const net::test_server::HttpRequest& request) { std::unique_ptr<net::test_server::BasicHttpResponse> response; response = std::make_unique<net::test_server::BasicHttpResponse>(); response->set_content_type("text/html"); + std::string response_body = ""; + // We are running on the embedded test server's thread. + // We want to ask the fuzzer thread for the latest HTML payload, + // but there's a risk of UaF if it's being destroyed. + // We use a weak pointer, but we have to dereference that on the originating + // thread. + base::RunLoop run_loop; + base::RepeatingCallback<void()> get_payload_lambda = + base::BindLambdaForTesting([&]() { + HtmlInProcessFuzzer* fuzzer = fuzzer_weak.get(); + if (fuzzer) { + response_body = fuzzer->current_fuzz_case_; + } + run_loop.Quit(); + }); + content::GetUIThreadTaskRunner()->PostTask(FROM_HERE, get_payload_lambda); + run_loop.Run(); response->set_content(response_body); response->set_code(net::HTTP_OK); return response; @@ -60,7 +80,7 @@ base::RepeatingCallback<void()> run_fuzz_case_lambda = base::BindLambdaForTesting([&]() { base::IgnoreResult(ui_test_utils::NavigateToURL(browser(), test_url)); - run_loop.QuitClosure().Run(); + run_loop.Quit(); }); base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, run_fuzz_case_lambda);
diff --git a/chrome/updater/lock_mac.mm b/chrome/updater/lock_mac.mm index 575a49bd..8ae3eaa 100644 --- a/chrome/updater/lock_mac.mm +++ b/chrome/updater/lock_mac.mm
@@ -7,6 +7,7 @@ #include <mach/mach.h> #include <servers/bootstrap.h> +#include <algorithm> #include <memory> #include <string> #include <utility> @@ -42,10 +43,11 @@ // // Returns the receive right if the right was successfully acquired. If the // right cannot be acquired for any reason, returns an invalid right instead. -base::mac::ScopedMachReceiveRight TryAcquireReceive(const char* service_name) { +base::mac::ScopedMachReceiveRight TryAcquireReceive( + const std::string& service_name) { base::mac::ScopedMachReceiveRight target_right; kern_return_t check_in_result = bootstrap_check_in( - bootstrap_port, service_name, + bootstrap_port, service_name.c_str(), base::mac::ScopedMachReceiveRight::Receiver(target_right).get()); if (check_in_result != KERN_SUCCESS) { // Log error reports for all errors other than BOOTSTRAP_NOT_PRIVILEGED. @@ -53,7 +55,7 @@ // process has acquired the receive rights for this service. if (check_in_result != BOOTSTRAP_NOT_PRIVILEGED) { BOOTSTRAP_LOG(ERROR, check_in_result) - << "bootstrap_check_in to acquire lock: " << service_name; + << " bootstrap_check_in to acquire lock: " << service_name; } else { BOOTSTRAP_VLOG(2, check_in_result) << " lock already held: " << service_name; @@ -63,14 +65,10 @@ return target_right; } -// Sleep until the lock should be retried, up to an approximate maximum of -// max_wait (within the tolerances of timing, scheduling, etc.). -void WaitToRetryLock(base::TimeDelta max_wait) { - // This is a polling implementation of Mach service locking. - // TODO(1135787): replace with a non-polling Mach notification approach. - const base::TimeDelta wait_time = - max_wait < kLockPollingInterval ? max_wait : kLockPollingInterval; - base::PlatformThread::Sleep(wait_time); +// Sleeps `wait_time` until the lock should be retried, but no more than +// `kLockPollingInterval`. +void WaitToRetryLock(base::TimeDelta wait_time) { + base::PlatformThread::Sleep(std::min(wait_time, kLockPollingInterval)); } } // anonymous namespace @@ -136,7 +134,7 @@ !receive_right.is_valid() && remain > kDeltaZero; remain = deadline - base::TimeTicks::Now()) { WaitToRetryLock(remain); - receive_right = TryAcquireReceive(service_name.c_str()); + receive_right = TryAcquireReceive(service_name); } if (!receive_right.is_valid()) {
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc index b6538a50..f942115 100644 --- a/chrome/updater/updater.cc +++ b/chrome/updater/updater.cc
@@ -117,8 +117,6 @@ base::win::ScopedCOMInitializer::kMTA); if (!com_initializer.Succeeded()) { PLOG(ERROR) << "Failed to initialize COM"; - - // TODO(crbug.com/1294543) - is there a more specific error needed? return kErrorComInitializationFailed; }
diff --git a/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.cc b/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.cc index dfecc34..cca08456 100644 --- a/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.cc +++ b/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.cc
@@ -66,18 +66,19 @@ weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } - void GetAndroidDataSize( - const arc::data_migrator::GetAndroidDataSizeRequest& request, - chromeos::DBusMethodCallback<int64_t> callback) override { + void GetAndroidDataInfo( + const arc::data_migrator::GetAndroidDataInfoRequest& request, + GetAndroidDataInfoCallback callback) override { dbus::MethodCall method_call( arc::data_migrator::kArcVmDataMigratorInterface, - arc::data_migrator::kGetAndroidDataSizeMethod); + arc::data_migrator::kGetAndroidDataInfoMethod); dbus::MessageWriter writer(&method_call); writer.AppendProtoAsArrayOfBytes(request); proxy_->CallMethod( &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, - base::BindOnce(&ArcVmDataMigratorClientImpl::OnInt64Method, - weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + base::BindOnce( + &ArcVmDataMigratorClientImpl::OnGetAndroidDataInfoResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void StartMigration(const arc::data_migrator::StartMigrationRequest& request, @@ -136,20 +137,20 @@ std::move(callback).Run(result); } - void OnInt64Method(chromeos::DBusMethodCallback<int64_t> callback, - dbus::Response* response) { + void OnGetAndroidDataInfoResponse(GetAndroidDataInfoCallback callback, + dbus::Response* response) { if (!response) { std::move(callback).Run(absl::nullopt); return; } dbus::MessageReader reader(response); - int64_t result = 0; - if (!reader.PopInt64(&result)) { + arc::data_migrator::GetAndroidDataInfoResponse proto; + if (!reader.PopArrayOfBytesAsProto(&proto)) { LOG(ERROR) << "Invalid response: " << response->ToString(); std::move(callback).Run(absl::nullopt); return; } - std::move(callback).Run(result); + std::move(callback).Run(std::move(proto)); } base::ObserverList<Observer> observers_;
diff --git a/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.h b/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.h index 00a7fdba..10fc87e 100644 --- a/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.h +++ b/chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.h
@@ -24,6 +24,9 @@ const arc::data_migrator::DataMigrationProgress& progress) = 0; }; + using GetAndroidDataInfoCallback = chromeos::DBusMethodCallback< + arc::data_migrator::GetAndroidDataInfoResponse>; + // Creates and initializes the global instance. |bus| must not be null. static void Initialize(dbus::Bus* bus); @@ -42,11 +45,11 @@ const arc::data_migrator::HasDataToMigrateRequest& request, chromeos::DBusMethodCallback<bool> callback) = 0; - // Obtains the total size of files under the host's - // /home/root/<hash>/android-data/data in bytes. - virtual void GetAndroidDataSize( - const arc::data_migrator::GetAndroidDataSizeRequest& request, - chromeos::DBusMethodCallback<int64_t> callback) = 0; + // Obtains some information about the host's + // /home/root/<hash>/android-data/data. + virtual void GetAndroidDataInfo( + const arc::data_migrator::GetAndroidDataInfoRequest& request, + GetAndroidDataInfoCallback callback) = 0; // Starts the migration. virtual void StartMigration(
diff --git a/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.cc b/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.cc index 9d994d7..a1318ab7 100644 --- a/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.cc +++ b/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.cc
@@ -39,11 +39,12 @@ FROM_HERE, base::BindOnce(std::move(callback), has_data_to_migrate_)); } -void FakeArcVmDataMigratorClient::GetAndroidDataSize( - const arc::data_migrator::GetAndroidDataSizeRequest& request, - chromeos::DBusMethodCallback<int64_t> callback) { +void FakeArcVmDataMigratorClient::GetAndroidDataInfo( + const arc::data_migrator::GetAndroidDataInfoRequest& request, + GetAndroidDataInfoCallback callback) { base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), android_data_size_)); + FROM_HERE, + base::BindOnce(std::move(callback), get_android_data_info_response_)); } void FakeArcVmDataMigratorClient::StartMigration(
diff --git a/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.h b/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.h index 1324246..ad2ed6c 100644 --- a/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.h +++ b/chromeos/ash/components/dbus/arc/fake_arcvm_data_migrator_client.h
@@ -23,9 +23,9 @@ void HasDataToMigrate( const arc::data_migrator::HasDataToMigrateRequest& request, chromeos::DBusMethodCallback<bool> callback) override; - void GetAndroidDataSize( - const arc::data_migrator::GetAndroidDataSizeRequest& request, - chromeos::DBusMethodCallback<int64_t> callback) override; + void GetAndroidDataInfo( + const arc::data_migrator::GetAndroidDataInfoRequest& request, + GetAndroidDataInfoCallback callback) override; void StartMigration(const arc::data_migrator::StartMigrationRequest& request, chromeos::VoidDBusMethodCallback callback) override; void AddObserver(Observer* observer) override; @@ -42,8 +42,10 @@ has_data_to_migrate_ = has_data_to_migrate; } - void set_android_data_size(absl::optional<int64_t> android_data_size) { - android_data_size_ = android_data_size; + void set_get_android_data_info_response( + const absl::optional<arc::data_migrator::GetAndroidDataInfoResponse>& + get_android_data_info_response) { + get_android_data_info_response_ = get_android_data_info_response; } protected: @@ -56,7 +58,8 @@ base::ObserverList<Observer> observers_; absl::optional<bool> has_data_to_migrate_ = true; - absl::optional<int64_t> android_data_size_ = 0; + absl::optional<arc::data_migrator::GetAndroidDataInfoResponse> + get_android_data_info_response_; }; } // namespace ash
diff --git a/chromeos/ash/components/network/BUILD.gn b/chromeos/ash/components/network/BUILD.gn index 3b97b5f..64729db6 100644 --- a/chromeos/ash/components/network/BUILD.gn +++ b/chromeos/ash/components/network/BUILD.gn
@@ -333,6 +333,7 @@ "network_type_pattern_unittest.cc", "network_ui_data_unittest.cc", "network_util_unittest.cc", + "policy_util_unittest.cc", "profile_policies_unittest.cc", "prohibited_technologies_handler_unittest.cc", "shill_property_handler_unittest.cc",
diff --git a/chromeos/ash/components/network/cellular_policy_handler.cc b/chromeos/ash/components/network/cellular_policy_handler.cc index 35c6ba9..f3bda13 100644 --- a/chromeos/ash/components/network/cellular_policy_handler.cc +++ b/chromeos/ash/components/network/cellular_policy_handler.cc
@@ -46,9 +46,9 @@ } // namespace CellularPolicyHandler::InstallPolicyESimRequest::InstallPolicyESimRequest( - const std::string& smdp_address, + policy_util::SmdxActivationCode activation_code, const base::Value::Dict& onc_config) - : smdp_address(smdp_address), + : activation_code(std::move(activation_code)), onc_config(onc_config.Clone()), retry_backoff(&kRetryBackoffPolicy) {} @@ -84,8 +84,10 @@ void CellularPolicyHandler::InstallESim(const std::string& smdp_address, const base::Value::Dict& onc_config) { - PushRequestAndProcess( - std::make_unique<InstallPolicyESimRequest>(smdp_address, onc_config)); + PushRequestAndProcess(std::make_unique<InstallPolicyESimRequest>( + policy_util::SmdxActivationCode( + policy_util::SmdxActivationCode::Type::SMDP, smdp_address), + onc_config)); } void CellularPolicyHandler::OnAvailableEuiccListChanged() { @@ -256,7 +258,7 @@ const std::string& CellularPolicyHandler::GetCurrentSmdpAddress() const { DCHECK(is_installing_); - return remaining_install_requests_.front()->smdp_address; + return remaining_install_requests_.front()->activation_code.value; } void CellularPolicyHandler::OnConfigureESimService( @@ -276,7 +278,7 @@ const std::string* iccid = policy_util::GetIccidFromONC(current_request->onc_config); managed_cellular_pref_handler_->AddIccidSmdpPair( - *iccid, current_request->smdp_address); + *iccid, current_request->activation_code.value); ProcessRequests(); } @@ -307,12 +309,13 @@ } NET_LOG(EVENT) << "Successfully installed eSIM profile with SMDP address: " - << current_request->smdp_address; + << current_request->activation_code.value; current_request->retry_backoff.InformOfRequest(/*succeeded=*/true); HermesProfileClient::Properties* profile_properties = HermesProfileClient::Get()->GetProperties(*profile_path); managed_cellular_pref_handler_->AddIccidSmdpPair( - profile_properties->iccid().value(), current_request->smdp_address, + profile_properties->iccid().value(), + current_request->activation_code.value, /*sync_stub_networks=*/false); managed_network_configuration_handler_->NotifyPolicyAppliedToNetwork( @@ -327,8 +330,8 @@ if (reason != InstallRetryReason::kInternalError && request->retry_backoff.failure_count() >= kInstallRetryLimit) { NET_LOG(ERROR) << "Install policy eSIM profile with SMDP address: " - << request->smdp_address << " failed " << kInstallRetryLimit - << " times."; + << request->activation_code.value << " failed " + << kInstallRetryLimit << " times."; ProcessRequests(); return; }
diff --git a/chromeos/ash/components/network/cellular_policy_handler.h b/chromeos/ash/components/network/cellular_policy_handler.h index a2db6f7..9bddf92 100644 --- a/chromeos/ash/components/network/cellular_policy_handler.h +++ b/chromeos/ash/components/network/cellular_policy_handler.h
@@ -16,6 +16,7 @@ #include "chromeos/ash/components/network/cellular_esim_profile_handler.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/ash/components/network/network_state_handler_observer.h" +#include "chromeos/ash/components/network/policy_util.h" #include "net/base/backoff_entry.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -101,18 +102,18 @@ friend class CellularPolicyHandlerTest; // Represents policy eSIM install request parameters. Requests are queued and - // processed one at a time. |smdp_address| represents the smdp address that - // will be used to install the eSIM profile as activation code and - // |onc_config| is the ONC configuration of the cellular policy. + // processed one at a time. |activation_code| represents the SM-DP+ activation + // code that will be used to install the eSIM profile, and |onc_config| is the + // ONC configuration of the cellular policy. struct InstallPolicyESimRequest { - InstallPolicyESimRequest(const std::string& smdp_address, + InstallPolicyESimRequest(policy_util::SmdxActivationCode activation_code, const base::Value::Dict& onc_config); InstallPolicyESimRequest(const InstallPolicyESimRequest&) = delete; InstallPolicyESimRequest& operator=(const InstallPolicyESimRequest&) = delete; ~InstallPolicyESimRequest(); - const std::string smdp_address; + policy_util::SmdxActivationCode activation_code; base::Value::Dict onc_config; net::BackoffEntry retry_backoff; };
diff --git a/chromeos/ash/components/network/policy_util.cc b/chromeos/ash/components/network/policy_util.cc index 69f8dab..a4a762d 100644 --- a/chromeos/ash/components/network/policy_util.cc +++ b/chromeos/ash/components/network/policy_util.cc
@@ -7,9 +7,11 @@ #include <memory> #include <utility> +#include "base/check.h" #include "base/logging.h" #include "base/notreached.h" #include "base/values.h" +#include "chromeos/ash/components/network/network_event_log.h" #include "chromeos/ash/components/network/network_profile.h" #include "chromeos/ash/components/network/network_type_pattern.h" #include "chromeos/ash/components/network/network_ui_data.h" @@ -151,6 +153,20 @@ } // namespace +SmdxActivationCode::SmdxActivationCode(Type type, std::string value) + : type(type), value(value) {} + +SmdxActivationCode::SmdxActivationCode(SmdxActivationCode&& other) { + type = other.type; + value = std::move(other.value); +} + +SmdxActivationCode& SmdxActivationCode::operator=(SmdxActivationCode&& other) { + type = other.type; + value = std::move(other.value); + return *this; +} + base::Value::Dict CreateManagedONC(const base::Value::Dict* global_policy, const base::Value::Dict* network_policy, const base::Value::Dict* user_settings, @@ -453,4 +469,41 @@ return smdp_address; } +absl::optional<SmdxActivationCode> GetSmdxActivationCodeFromONC( + const base::Value::Dict& onc_config) { + const std::string* type = onc_config.FindString(::onc::network_config::kType); + const base::Value::Dict* cellular_dict = + onc_config.FindDict(::onc::network_config::kCellular); + + if (!type || (*type != ::onc::network_type::kCellular) || !cellular_dict) { + return absl::nullopt; + } + + const std::string* const smdp_activation_code = + cellular_dict->FindString(::onc::cellular::kSMDPAddress); + const std::string* const smds_activation_code = + cellular_dict->FindString(::onc::cellular::kSMDSAddress); + + if (smdp_activation_code && smds_activation_code) { + NET_LOG(ERROR) << "Failed to get SM-DX activation code from ONC " + << "configuration. Expected either an SM-DP+ activation " + << "code or an SM-DS activation code but got both."; + return absl::nullopt; + } + + if (smdp_activation_code) { + return SmdxActivationCode(SmdxActivationCode::Type::SMDP, + *smdp_activation_code); + } + if (smds_activation_code) { + return SmdxActivationCode(SmdxActivationCode::Type::SMDS, + *smds_activation_code); + } + + NET_LOG(ERROR) << "Failed to get SM-DX activation code from ONC " + << "configuration. Expected either an SM-DP+ activation code " + << "or an SM-DS activation code but got neither."; + return absl::nullopt; +} + } // namespace ash::policy_util
diff --git a/chromeos/ash/components/network/policy_util.h b/chromeos/ash/components/network/policy_util.h index db4f8b2..5347555 100644 --- a/chromeos/ash/components/network/policy_util.h +++ b/chromeos/ash/components/network/policy_util.h
@@ -16,6 +16,25 @@ namespace policy_util { +// This class represents a cellular activation code and its corresponding type +// and is used to simplify all cellular code related to enterprise policy. +struct COMPONENT_EXPORT(CHROMEOS_NETWORK) SmdxActivationCode { + enum class Type { + SMDP = 0, + SMDS = 1, + }; + + SmdxActivationCode(Type type, std::string value); + SmdxActivationCode(SmdxActivationCode&& other); + SmdxActivationCode& operator=(SmdxActivationCode&& other); + SmdxActivationCode(const SmdxActivationCode&) = delete; + SmdxActivationCode& operator=(const SmdxActivationCode&) = delete; + ~SmdxActivationCode() = default; + + Type type; + std::string value; +}; + // This fake credential contains a random postfix which is extremely unlikely to // be used by any user. Used to determine saved but unknown credential // (PSK/Passphrase/Password) in UI (see onc_mojo.js). @@ -73,6 +92,13 @@ // If there is no SMDPAddress, returns nullptr. const std::string* GetSMDPAddressFromONC(const base::Value::Dict& onc_config); +// This function returns the SM-DX activation code found in |onc_config|. If +// both an SM-DP+ activation code and an SM-DS activation code are provided, or +// if neither are provided, this function returns |absl::nullopt|. +COMPONENT_EXPORT(CHROMEOS_NETWORK) +absl::optional<SmdxActivationCode> GetSmdxActivationCodeFromONC( + const base::Value::Dict& onc_config); + } // namespace policy_util } // namespace ash
diff --git a/chromeos/ash/components/network/policy_util_unittest.cc b/chromeos/ash/components/network/policy_util_unittest.cc new file mode 100644 index 0000000..43293fc --- /dev/null +++ b/chromeos/ash/components/network/policy_util_unittest.cc
@@ -0,0 +1,73 @@ +// 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 "chromeos/ash/components/network/policy_util.h" + +#include <string> + +#include "base/values.h" +#include "components/onc/onc_constants.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash::policy_util { +namespace { + +typedef testing::Test PolicyUtilTest; + +constexpr char kSmdpActivationCode[] = "smdp_activation_code"; +constexpr char kSmdsActivationCode[] = "smds_activation_code"; + +} // namespace + +TEST_F(PolicyUtilTest, GetActivationCodesFromONC) { + absl::optional<SmdxActivationCode> activation_code; + + // Start with an empty configuration and slowly populate it. + base::Value::Dict onc_config; + + auto expect_invalid = [&]() { + activation_code = GetSmdxActivationCodeFromONC(onc_config); + EXPECT_FALSE(activation_code.has_value()); + }; + + expect_invalid(); + + onc_config.Set(::onc::network_config::kType, + base::Value(::onc::network_type::kWiFi)); + expect_invalid(); + + onc_config.Set(::onc::network_config::kType, + base::Value(::onc::network_type::kCellular)); + expect_invalid(); + + base::Value::Dict cellular_dict; + onc_config.Set(::onc::network_config::kCellular, cellular_dict.Clone()); + expect_invalid(); + + cellular_dict.Set(::onc::cellular::kSMDPAddress, + base::Value(kSmdpActivationCode)); + onc_config.Set(::onc::network_config::kCellular, cellular_dict.Clone()); + + activation_code = GetSmdxActivationCodeFromONC(onc_config); + EXPECT_TRUE(activation_code.has_value()); + EXPECT_EQ(activation_code->type, SmdxActivationCode::Type::SMDP); + EXPECT_EQ(activation_code->value, kSmdpActivationCode); + + cellular_dict.Set(::onc::cellular::kSMDSAddress, + base::Value(kSmdsActivationCode)); + onc_config.Set(::onc::network_config::kCellular, cellular_dict.Clone()); + + // Only one activation code can be provided. + expect_invalid(); + + cellular_dict.Remove(::onc::cellular::kSMDPAddress); + onc_config.Set(::onc::network_config::kCellular, cellular_dict.Clone()); + + activation_code = GetSmdxActivationCodeFromONC(onc_config); + EXPECT_TRUE(activation_code.has_value()); + EXPECT_EQ(activation_code->type, SmdxActivationCode::Type::SMDS); + EXPECT_EQ(activation_code->value, kSmdsActivationCode); +} + +} // namespace ash::policy_util
diff --git a/chromeos/ash/components/quick_start/BUILD.gn b/chromeos/ash/components/quick_start/BUILD.gn index e71e67c..e3bb4231 100644 --- a/chromeos/ash/components/quick_start/BUILD.gn +++ b/chromeos/ash/components/quick_start/BUILD.gn
@@ -15,7 +15,6 @@ "quick_start_requests.h", ] deps = [ - "proto", "//base", "//components/cbor", "//crypto", @@ -28,7 +27,6 @@ testonly = true public_deps = [ ":quick_start" ] deps = [ - "proto", "//base", "//chrome/browser/nearby_sharing/public/cpp", "//chromeos/ash/services/nearby/public/mojom:mojom",
diff --git a/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc b/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc index 300a469..b2221fe 100644 --- a/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc +++ b/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc
@@ -24,7 +24,9 @@ void FakeQuickStartDecoder::DecodeBootstrapConfigurations( const std::vector<uint8_t>& data, DecodeBootstrapConfigurationsCallback callback) { - EXPECT_EQ(expected_data_, data); + std::move(callback).Run( + mojom::BootstrapConfigurations::New(response_cryptauth_device_id_), + error_); } void FakeQuickStartDecoder::DecodeWifiCredentialsResponse( @@ -123,4 +125,11 @@ notify_source_of_update_response_ = ack_received; } +void FakeQuickStartDecoder::SetBootstrapConfigurationsResponse( + const std::string& cryptauth_device_id, + absl::optional<mojom::QuickStartDecoderError> error) { + response_cryptauth_device_id_ = cryptauth_device_id; + error_ = error; +} + } // namespace ash::quick_start
diff --git a/chromeos/ash/components/quick_start/fake_quick_start_decoder.h b/chromeos/ash/components/quick_start/fake_quick_start_decoder.h index 3fa8f236..5222fae 100644 --- a/chromeos/ash/components/quick_start/fake_quick_start_decoder.h +++ b/chromeos/ash/components/quick_start/fake_quick_start_decoder.h
@@ -66,6 +66,10 @@ void SetNotifySourceOfUpdateResponse(absl::optional<bool> ack_received); + void SetBootstrapConfigurationsResponse( + const std::string& cryptauth_device_id, + absl::optional<mojom::QuickStartDecoderError> error); + private: std::vector<uint8_t> expected_data_; mojom::GetAssertionResponse::GetAssertionStatus response_status_; @@ -81,6 +85,7 @@ mojom::UserVerificationRequestedPtr user_verification_request_; mojom::UserVerificationResponsePtr user_verification_response_; absl::optional<mojom::QuickStartDecoderError> error_; + std::string response_cryptauth_device_id_; }; } // namespace ash::quick_start
diff --git a/chromeos/ash/components/quick_start/quick_start_requests.cc b/chromeos/ash/components/quick_start/quick_start_requests.cc index 70bc624..a34af32 100644 --- a/chromeos/ash/components/quick_start/quick_start_requests.cc +++ b/chromeos/ash/components/quick_start/quick_start_requests.cc
@@ -5,7 +5,6 @@ #include "quick_start_requests.h" #include "base/base64.h" #include "base/json/json_writer.h" -#include "chromeos/ash/components/quick_start/proto/aes_gcm_authentication_message.pb.h" #include "chromeos/ash/components/quick_start/quick_start_message.h" #include "chromeos/ash/components/quick_start/quick_start_message_type.h" #include "components/cbor/values.h" @@ -19,8 +18,6 @@ namespace { -namespace proto = ::quick_start::proto; - // bootstrapOptions key telling the phone how to handle // challenge UI in case of fallback. constexpr char kFlowTypeKey[] = "flowType"; @@ -67,10 +64,6 @@ // ID constexpr char kSessionIdKey[] = "SESSION_ID"; -// The role that should be used for the target device. See this enum: -// http://google3/java/com/google/android/gms/smartdevice/d2d/proto/aes_gcm_authentication_message.proto;l=26;rcl=489093041 -constexpr int32_t kAuthPayloadTargetDeviceRole = 1; - // Boolean in NotifySourceOfUpdateMessage indicating target device requires an // update. constexpr char kNotifySourceOfUpdateMessageKey[] = "forced_update_required"; @@ -180,38 +173,6 @@ return request_bytes; } -std::vector<uint8_t> BuildTargetDeviceHandshakeMessage( - const std::string& authentication_token, - std::array<uint8_t, 32> secret, - std::array<uint8_t, 12> nonce) { - proto::V1Message::AuthenticationPayload auth_payload; - auth_payload.set_role(kAuthPayloadTargetDeviceRole); - auth_payload.set_auth_string(authentication_token); - - std::string unencrypted_payload; - auth_payload.SerializeToString(&unencrypted_payload); - - crypto::Aead aead(crypto::Aead::AeadAlgorithm::AES_256_GCM); - aead.Init(secret); - std::vector<uint8_t> encrypted_payload = - aead.Seal(std::vector<uint8_t>(unencrypted_payload.begin(), - unencrypted_payload.end()), - nonce, /*additional_data=*/std::vector<uint8_t>()); - - proto::AesGcmAuthenticationMessage auth_message; - auth_message.set_version(proto::AesGcmAuthenticationMessage::V1); - proto::V1Message* v1_message = auth_message.mutable_v1(); - v1_message->set_nonce(std::string(nonce.begin(), nonce.end())); - v1_message->set_payload( - std::string(encrypted_payload.begin(), encrypted_payload.end())); - - std::string auth_message_serialized; - auth_message.SerializeToString(&auth_message_serialized); - - return std::vector<uint8_t>(auth_message_serialized.begin(), - auth_message_serialized.end()); -} - std::unique_ptr<QuickStartMessage> BuildNotifySourceOfUpdateMessage( int32_t session_id, std::string& shared_secret) {
diff --git a/chromeos/ash/components/quick_start/quick_start_requests.h b/chromeos/ash/components/quick_start/quick_start_requests.h index 50461d3..05e7f58 100644 --- a/chromeos/ash/components/quick_start/quick_start_requests.h +++ b/chromeos/ash/components/quick_start/quick_start_requests.h
@@ -33,11 +33,6 @@ cbor::Value GenerateGetAssertionRequest(const std::string& challenge_b64url); -std::vector<uint8_t> BuildTargetDeviceHandshakeMessage( - const std::string& authentication_token, - std::array<uint8_t, 32> secret, - std::array<uint8_t, 12> nonce); - std::unique_ptr<QuickStartMessage> BuildNotifySourceOfUpdateMessage( int32_t session_id, std::string& shared_secret);
diff --git a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom index 81e9126..af1a1ca 100644 --- a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom +++ b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom
@@ -19,7 +19,8 @@ // appropriate BootstrapConfigurations to ensure that BootstrapOptions // was set correctly on the phone. DecodeBootstrapConfigurations(array<uint8> data) => ( - BootstrapConfigurations? bootstrap_configurations); + BootstrapConfigurations? bootstrap_configurations, + QuickStartDecoderError? error); // Decode a D2D response to a request for Wifi Credentials // This response is JSON, with a Base64 encoded JSON payload
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index d8c92995..174414b1 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2494,7 +2494,7 @@ Dawn to dark </message> <message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION" desc="Description for the radio button to choose the topic source from video animation. The radio button allows the user to set which video to play for ambient mode."> - Select Chromebook exclusive artwork + Select <ph name="PRODUCT_NAME">$1<ex>Chromebook</ex></ph> exclusive artwork </message> <message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_SELECTED_ROW" desc="A11y label for the selected topic source row in ambient mode."> <ph name="TOPIC_SOURCE">$1<ex>Google Photos</ex></ph> <ph name="TOPIC_SOURCE_DESC">$2<ex>Select your memories</ex></ph> selected, press Enter to select <ph name="TOPIC_SOURCE">$1<ex>Google Photos</ex></ph> albums @@ -2694,10 +2694,10 @@ Earth Flow </message> <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION" desc="Common description all videos in the ambient section of the hub."> - Chromebook exclusive + <ph name="PRODUCT_NAME">$1<ex>Chromebook</ex></ph> exclusive </message> <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE" desc="Title for the Time of Day promo banner."> - Exclusive Chromebook assets now available + Exclusive <ph name="PRODUCT_NAME">$1<ex>Chromebook</ex></ph> assets now available </message> <message name="IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_DESCRIPTION" desc="Description shown in the Time of Day promo banner."> You now have access to new <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE"><a href="chrome://personalization/wallpaper/collection?id=_time_of_day_chromebook_collection"></ph>wallpapers<ph name="END_LINK_WALLPAPER_SUBPAGE"></a></ph> and <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE"><a href="chrome://personalization/ambient"></ph>screen saver<ph name="END_LINK_SCREENSAVER_SUBPAGE"></a></ph>
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION.png.sha1 index ce09dbf6..8ff0d0a8 100644 --- a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION.png.sha1 +++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_AMBIENT_MODE_TOPIC_SOURCE_VIDEO_DESCRIPTION.png.sha1
@@ -1 +1 @@ -e301b4a051913fe7b871809b1de2ca38504058b6 \ No newline at end of file +74505c11ffd730e9707850e23084ce78569fa7d0
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE.png.sha1 index 7ceec99..5c32b68 100644 --- a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE.png.sha1 +++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_BANNER_TITLE.png.sha1
@@ -1 +1 @@ -b9725fd8019500688bea8586cda1779ce0268765 \ No newline at end of file +b5b6a611ebac67d8acaf35df3fda1d59e3348ec1
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION.png.sha1 index ba99e42..8ff0d0a8 100644 --- a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION.png.sha1 +++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_TIME_OF_DAY_VIDEO_ALBUM_DESCRIPTION.png.sha1
@@ -1 +1 @@ -a60dc5fbcc97079d33ee758297e660ffae0f0315 \ No newline at end of file +74505c11ffd730e9707850e23084ce78569fa7d0
diff --git a/chromeos/components/kcer/kcer.cc b/chromeos/components/kcer/kcer.cc index f08c18e..2100a532 100644 --- a/chromeos/components/kcer/kcer.cc +++ b/chromeos/components/kcer/kcer.cc
@@ -33,6 +33,14 @@ PublicKey& PublicKey::operator=(PublicKey&&) = default; PublicKey::~PublicKey() = default; +bool PublicKey::operator==(const PublicKey& other) const { + return ((token_ == other.token_) && (pkcs11_id_ == other.pkcs11_id_) && + (pub_key_spki_ == other.pub_key_spki_)); +} +bool PublicKey::operator!=(const PublicKey& other) const { + return !operator==(other); +} + //==================== KeyInfo ================================================= KeyInfo::KeyInfo() = default;
diff --git a/chromeos/components/kcer/kcer.h b/chromeos/components/kcer/kcer.h index 488296f2..6cab3b09 100644 --- a/chromeos/components/kcer/kcer.h +++ b/chromeos/components/kcer/kcer.h
@@ -73,6 +73,9 @@ kFailedToSignBadSignatureLength = 24, kFailedToDerEncode = 25, kInputTooLong = 26, + kFailedToListKeys = 27, + kFailedToRemovePrivateKey = 28, + kFailedToRemovePublicKey = 29, }; // Handles for tokens on ChromeOS. @@ -130,6 +133,9 @@ PublicKey& operator=(PublicKey&&); ~PublicKey(); + bool operator==(const PublicKey& other) const; + bool operator!=(const PublicKey& other) const; + Token GetToken() const { return token_; } const Pkcs11Id& GetPkcs11Id() const { return pkcs11_id_; } const PublicKeySpki& GetSpki() const { return pub_key_spki_; }
diff --git a/chromeos/components/kcer/kcer_impl.cc b/chromeos/components/kcer/kcer_impl.cc index e5a1d224..ba2a1d4 100644 --- a/chromeos/components/kcer/kcer_impl.cc +++ b/chromeos/components/kcer/kcer_impl.cc
@@ -133,7 +133,34 @@ void KcerImpl::RemoveKeyAndCerts(PrivateKeyHandle key, StatusCallback callback) { - // TODO(244408716): Implement. + if (key.GetTokenInternal().has_value()) { + return RemoveKeyAndCertsWithToken(std::move(callback), std::move(key)); + } + + auto on_find_key_done = + base::BindOnce(&KcerImpl::RemoveKeyAndCertsWithToken, + weak_factory_.GetWeakPtr(), std::move(callback)); + return PopulateTokenForKey(std::move(key), std::move(on_find_key_done)); +} + +void KcerImpl::RemoveKeyAndCertsWithToken( + StatusCallback callback, + base::expected<PrivateKeyHandle, Error> key_or_error) { + if (!key_or_error.has_value()) { + return std::move(callback).Run(base::unexpected(key_or_error.error())); + } + PrivateKeyHandle key = std::move(key_or_error).value(); + + const base::WeakPtr<KcerToken>& kcer_token = + GetToken(key.GetTokenInternal().value()); + if (!kcer_token.MaybeValid()) { + return std::move(callback).Run( + base::unexpected(Error::kTokenIsNotAvailable)); + } + token_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&KcerToken::RemoveKeyAndCerts, kcer_token, std::move(key), + base::BindPostTaskToCurrentDefault(std::move(callback)))); } void KcerImpl::RemoveCert(scoped_refptr<const Cert> cert, @@ -156,7 +183,26 @@ void KcerImpl::ListKeys(base::flat_set<Token> tokens, ListKeysCallback callback) { - // TODO(244408716): Implement. + if (tokens.empty()) { + return std::move(callback).Run(/*certs=*/{}, /*errors=*/{}); + } + + scoped_refptr<TokenResultsMerger<PublicKey>> merger = + internal::TokenResultsMerger<PublicKey>::Create( + /*results_to_receive=*/tokens.size(), std::move(callback)); + for (Token token : tokens) { + auto callback_for_token = merger->GetCallback(token); + const base::WeakPtr<KcerToken>& kcer_token = GetToken(token); + if (!kcer_token.MaybeValid()) { + std::move(callback_for_token) + .Run(base::unexpected(Error::kTokenIsNotAvailable)); + } else { + token_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&KcerToken::ListKeys, kcer_token, + base::BindPostTaskToCurrentDefault( + std::move(callback_for_token)))); + } + } } void KcerImpl::ListCerts(base::flat_set<Token> tokens,
diff --git a/chromeos/components/kcer/kcer_impl.h b/chromeos/components/kcer/kcer_impl.h index 72445d5..123ecb6 100644 --- a/chromeos/components/kcer/kcer_impl.h +++ b/chromeos/components/kcer/kcer_impl.h
@@ -114,6 +114,10 @@ callback, base::expected<absl::optional<Token>, Error> find_key_result); + void RemoveKeyAndCertsWithToken( + StatusCallback callback, + base::expected<PrivateKeyHandle, Error> key_or_error); + void DoesPrivateKeyExistWithToken( DoesKeyExistCallback callback, base::expected<absl::optional<Token>, Error> find_key_result);
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn index 5c4c9d7..d70d8a41 100644 --- a/chromeos/crosapi/mojom/BUILD.gn +++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -97,6 +97,7 @@ "task_manager.mojom", "telemetry_event_service.mojom", "telemetry_extension_exception.mojom", + "telemetry_keyboard_event.mojom", "test_controller.mojom", "timezone.mojom", "tts.mojom",
diff --git a/chromeos/crosapi/mojom/telemetry_event_service.mojom b/chromeos/crosapi/mojom/telemetry_event_service.mojom index a1e1370..98b35aaf 100644 --- a/chromeos/crosapi/mojom/telemetry_event_service.mojom +++ b/chromeos/crosapi/mojom/telemetry_event_service.mojom
@@ -15,6 +15,7 @@ module crosapi.mojom; import "chromeos/crosapi/mojom/telemetry_extension_exception.mojom"; +import "chromeos/crosapi/mojom/telemetry_keyboard_event.mojom"; // Audio jack event info. This is emitted when the // audio jack is plugged in or out. @@ -140,7 +141,7 @@ // Union of event info. // -// NextMinVersion: 5, NextIndex: 6 +// NextMinVersion: 6, NextIndex: 7 [Stable, Extensible] union TelemetryEventInfo { // The default value for forward compatibility. All the unknown type will be @@ -156,11 +157,14 @@ [MinVersion=3] TelemetrySdCardEventInfo sd_card_event_info@4; // Power event info. [MinVersion=4] TelemetryPowerEventInfo power_event_info@5; + // Keyboard diagnostic event info. + [MinVersion=5] TelemetryKeyboardDiagnosticEventInfo + keyboard_diagnostic_event_info@6; }; // An enumeration of event categories. // -// NextMinVersion: 5, NextIndex: 6 +// NextMinVersion: 6, NextIndex: 7 [Stable, Extensible] enum TelemetryEventCategoryEnum { // This is required for backwards compatibility, should not be used. @@ -170,6 +174,7 @@ [MinVersion=2] kUsb = 3, [MinVersion=3] kSdCard = 4, [MinVersion=4] kPower = 5, + [MinVersion=5] kKeyboardDiagnostic = 6, }; // Implemented by clients who desire events.
diff --git a/chromeos/crosapi/mojom/telemetry_keyboard_event.mojom b/chromeos/crosapi/mojom/telemetry_keyboard_event.mojom new file mode 100644 index 0000000..d2c2446 --- /dev/null +++ b/chromeos/crosapi/mojom/telemetry_keyboard_event.mojom
@@ -0,0 +1,141 @@ +// 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. + +// Note: this is a subset of the first party input interface which is +// located in +// //ash/system/diagnostics/mojom/input.mojom. +// This interface serves as PII filtering and data post-processing service +// between the source (first party diag tool) and the clients +// (third-party telemetry extensions). + +module crosapi.mojom; + +import "chromeos/crosapi/mojom/nullable_primitives.mojom"; + +[Stable, Extensible] +enum TelemetryKeyboardConnectionType { + // This is required for backwards compatibility, should not be used. + [Default] kUnmappedEnumField = 0, + // Includes devices connected over USB that are on fully internal busses, as + // well as the keyboards/touchpads for detachables. + kInternal = 1, + kUsb = 2, + kBluetooth = 3, + kUnknown = 4, +}; + +[Stable, Extensible] +enum TelemetryKeyboardPhysicalLayout { + // This is required for backwards compatibility, should not be used. + [Default] kUnmappedEnumField = 0, + kUnknown = 1, + // A typical Chrome OS keyboard with action keys on the top row, reduced + // navigation keys, etc. + kChromeOS = 2, +}; + +// The international standard that the layout follows. +[Stable, Extensible] +enum TelemetryKeyboardMechanicalLayout { + // This is required for backwards compatibility, should not be used. + [Default] kUnmappedEnumField = 0, + kUnknown = 1, + kAnsi = 2, + kIso = 3, + kJis = 4, +}; + +[Stable, Extensible] +enum TelemetryKeyboardNumberPadPresence { + // This is required for backwards compatibility, should not be used. + [Default] kUnmappedEnumField = 0, + // Unknown indicates there is no reliable evidence whether a numberpad is + // present. This is common for external keyboards. + kUnknown = 1, + kPresent = 2, + kNotPresent = 3, +}; + +// Note that this enumeration will need to be extended if new keys are added. +[Stable, Extensible] +enum TelemetryKeyboardTopRowKey { + // This is required for backwards compatibility, should not be used. + [Default] kUnmappedEnumField = 0, + // Either no key at all, or no special action key at this position. + kNone = 1, + // Marker for keys which cannot be decoded, but have some action. + kUnknown = 2, + kBack = 3, + kForward = 4, + kRefresh = 5, + kFullscreen = 6, + kOverview = 7, + kScreenshot = 8, + kScreenBrightnessDown = 9, + kScreenBrightnessUp = 10, + kPrivacyScreenToggle = 11, + kMicrophoneMute = 12, + kVolumeMute = 13, + kVolumeDown = 14, + kVolumeUp = 15, + kKeyboardBacklightToggle = 16, + kKeyboardBacklightDown = 17, + kKeyboardBacklightUp = 18, + kNextTrack = 19, + kPreviousTrack = 20, + kPlayPause = 21, + kScreenMirror = 22, + kDelete = 23, +}; + +[Stable, Extensible] +enum TelemetryKeyboardTopRightKey { + // This is required for backwards compatibility, should not be used. + [Default] kUnmappedEnumField = 0, + kUnknown = 1, + kPower = 2, + kLock = 3, + kControlPanel = 4, +}; + +// Describes a connected keyboard. +[Stable] +struct TelemetryKeyboardInfo { + // The number of the keyboard's /dev/input/event* node. + UInt32Value? id@0; + TelemetryKeyboardConnectionType connection_type@1; + string? name@2; + TelemetryKeyboardPhysicalLayout physical_layout@3; + TelemetryKeyboardMechanicalLayout mechanical_layout@4; + // For internal keyboards, the region code of the device (from which the + // visual layout can be determined). + string? region_code@5; + TelemetryKeyboardNumberPadPresence number_pad_present@6; + // List of ChromeOS specific action keys in the top row. This list excludes + // the left-most Escape key, and right-most key (usually Power/Lock). + // If a keyboard has F11-F15 keys beyond the rightmost action key, they may + // not be included in this list (even as kNone). + array<TelemetryKeyboardTopRowKey>? top_row_keys@7; + // For CrOS keyboards, the glyph shown on the key at the far right end of the + // top row. + TelemetryKeyboardTopRightKey top_right_key@8; + // Only applicable to CrOS keyboards. + BoolValue? has_assistant_key@9; +}; + +// Keyboard diagnostics event info. It is fired when users completed a keyboard +// diagnostic in the Diagnostics App. +[Stable] +struct TelemetryKeyboardDiagnosticEventInfo { + // The keyboard which has been tested. + TelemetryKeyboardInfo keyboard_info@0; + // Keys which have been tested. It is an array of the evdev key code. + array<uint32>? tested_keys@1; + // Top row keys which have been tested. They are positions of the key on the + // top row after escape (0 is leftmost, 1 is next to the right, etc.). + // Generally, 0 is F1, in some fashion. + // NOTE: This position may exceed the length of keyboard_info->top_row_keys, + // for external keyboards with keys in the F11-F15 range. + array<uint32>? tested_top_row_keys@2; +};
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index d3f77ce..fb9c5eb 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Desactiva el tema fosc</translation> <translation id="1807246157184219062">Clar</translation> <translation id="1827738518074806965">Galeria d'art</translation> +<translation id="1836553715834333258">Color del sistema</translation> <translation id="1838374766361614909">Esborra la cerca</translation> +<translation id="1840474674287087346">Color de l'escriptori</translation> <translation id="1851218745569890714">Videoconferències</translation> <translation id="1852934301711881861">Instal·la ChromeOS Flex</translation> <translation id="1856388568474281774">Fletxa avall</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Desa a</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">No s'ha pogut fer ping a la passarel·la de xarxa no predeterminada</translation> +<translation id="4500966230243561393">Color de la interfície</translation> <translation id="4503223151711056411">Fletxa esquerra</translation> <translation id="4507392511610824664">augmenta la brillantor</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Atura la prova</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Quan la pantalla està inactiva, mostra fotos, l'hora, el temps i informació multimèdia.</translation> +<translation id="5035083460461104704">Color del tema</translation> <translation id="5038292761217083259">teclat multicolor</translation> <translation id="5039804452771397117">Permet</translation> <translation id="5049856988445523908">SIM bloquejada (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutre</translation> <translation id="7620771111601174153">Més informació al Centre d'ajuda</translation> <translation id="763165478673169849">Hora del darrer restabliment</translation> +<translation id="7633068090678117093">Imatge de fons</translation> <translation id="7648838807254605802">La latència d'HTTPS és alta</translation> <translation id="765159867434478292">Desglossa</translation> <translation id="7656388927906093505">El dispositiu és un ratolí.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Aplicació semblant</translation> <translation id="8930622219860340959">Sense fil</translation> <translation id="8936793075252196307">Adreça IP del client</translation> +<translation id="8944651180182756621">Color del menú d'aplicacions</translation> <translation id="894617464444543719">El dispositiu és un telèfon.</translation> <translation id="8957423540740801332">dreta</translation> <translation id="8968751544471797276">Percentatge de càrrega</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Executa la prova de memòria</translation> <translation id="9161276708550942948">espai</translation> <translation id="9173638680043580060">Queda menys d'un minut</translation> +<translation id="9174334653006917325">Color de la IU</translation> <translation id="917720651393141712">Prova</translation> <translation id="9188992814426075118">El teclat pot coincidir automàticament amb el fons de pantalla</translation> <translation id="9189000703457422362">No es pot connectar a aquesta xarxa mitjançant APN detectats automàticament. Contacta amb el teu operador de telefonia mòbil per obtenir més informació.</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb index ff516d1..71bcac7b 100644 --- a/chromeos/strings/chromeos_strings_cy.xtb +++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Analluogi'r thema dywyll</translation> <translation id="1807246157184219062">Golau</translation> <translation id="1827738518074806965">Oriel gelf</translation> +<translation id="1836553715834333258">Lliw system</translation> <translation id="1838374766361614909">Clirio'r blwch chwilio</translation> +<translation id="1840474674287087346">Lliw bwrdd gwaith</translation> <translation id="1851218745569890714">Fideo-gynadledda</translation> <translation id="1852934301711881861">Gosod ChromeOS Flex</translation> <translation id="1856388568474281774">Saeth i lawr</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Sganio i</translation> <translation id="4479639480957787382">Ether-rwyd</translation> <translation id="4483049906298469269">Wedi methu â phingio porth y rhwydwaith nad yw'n ddiofyn</translation> +<translation id="4500966230243561393">Lliw rhyngwyneb</translation> <translation id="4503223151711056411">Saeth chwith</translation> <translation id="4507392511610824664">disgleirdeb i fyny</translation> <translation id="4511264077854731334">Porth</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Stopio'r prawf</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Pan fydd eich sgrîn yn segur, dangoswch luniau, yr amser, y tywydd a gwybodaeth am y cyfryngau.</translation> +<translation id="5035083460461104704">Lliw thema</translation> <translation id="5038292761217083259">bysellfwrdd amryliw</translation> <translation id="5039804452771397117">Caniatáu</translation> <translation id="5049856988445523908">SIM wedi'i Gloi (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Niwtral</translation> <translation id="7620771111601174153">Dysgu rhagor yn y Ganolfan Gymorth</translation> <translation id="763165478673169849">Amser Ailosod Diwethaf</translation> +<translation id="7633068090678117093">Llun cefndir</translation> <translation id="7648838807254605802">Cuddni HTTPS uchel</translation> <translation id="765159867434478292">Hollti</translation> <translation id="7656388927906093505">Mae'r ddyfais yn llygoden.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Cymar</translation> <translation id="8930622219860340959">Diwifr</translation> <translation id="8936793075252196307">Cyfeiriad IP cleient</translation> +<translation id="8944651180182756621">Lliw lansiwr</translation> <translation id="894617464444543719">Mae'r ddyfais yn ffôn.</translation> <translation id="8957423540740801332">dde</translation> <translation id="8968751544471797276">Cyfradd gwefru</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Rhedeg prawf Cof</translation> <translation id="9161276708550942948">bylchwr</translation> <translation id="9173638680043580060">Llai na munud ar ôl</translation> +<translation id="9174334653006917325">Lliw UI</translation> <translation id="917720651393141712">Prawf</translation> <translation id="9188992814426075118">Gall eich bysellfwrdd cyfateb â'ch papur wal</translation> <translation id="9189000703457422362">Nid oes modd cysylltu â'r rhwydwaith hwn gan ddefnyddio APNs a ganfyddir yn awtomatig. Cysylltwch â'ch cludydd gwasanaethau symudol am ragor o wybodaeth.</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 907a574c..7326b33e 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Disable Dark theme</translation> <translation id="1807246157184219062">Light</translation> <translation id="1827738518074806965">Art gallery</translation> +<translation id="1836553715834333258">System colour</translation> <translation id="1838374766361614909">Clear search</translation> +<translation id="1840474674287087346">Desktop colour</translation> <translation id="1851218745569890714">Video conferencing</translation> <translation id="1852934301711881861">Install Chrome OS Flex</translation> <translation id="1856388568474281774">Down arrow</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Scan to</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Failed to ping the non-default network gateway</translation> +<translation id="4500966230243561393">Interface colour</translation> <translation id="4503223151711056411">Left arrow</translation> <translation id="4507392511610824664">brightness up</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Stop test</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">When your screen is idle, show photos, time, weather and media info.</translation> +<translation id="5035083460461104704">Theme colour</translation> <translation id="5038292761217083259">keyboard multicolour</translation> <translation id="5039804452771397117">Allow</translation> <translation id="5049856988445523908">SIM locked (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutral</translation> <translation id="7620771111601174153">Find out more in the Help Centre</translation> <translation id="763165478673169849">Last reset time</translation> +<translation id="7633068090678117093">Background image</translation> <translation id="7648838807254605802">High HTTPS latency</translation> <translation id="765159867434478292">Split</translation> <translation id="7656388927906093505">Device is a mouse.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Peer</translation> <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">Client IP address</translation> +<translation id="8944651180182756621">Launcher colour</translation> <translation id="894617464444543719">Device is a phone.</translation> <translation id="8957423540740801332">right</translation> <translation id="8968751544471797276">Charging rate</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Run memory test</translation> <translation id="9161276708550942948">space</translation> <translation id="9173638680043580060">Less than a minute remaining</translation> +<translation id="9174334653006917325">UI colour</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Your keyboard can automatically match your wallpaper</translation> <translation id="9189000703457422362">Can't connect to this network using automatically detected APNs. Contact your mobile operator for more information.</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 4c7bd8e..d4fdd8351 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Inhabilitar tema oscuro</translation> <translation id="1807246157184219062">Claro</translation> <translation id="1827738518074806965">Galería de arte</translation> +<translation id="1836553715834333258">Color del sistema</translation> <translation id="1838374766361614909">Borrar búsqueda</translation> +<translation id="1840474674287087346">Color del escritorio</translation> <translation id="1851218745569890714">Videoconferencias</translation> <translation id="1852934301711881861">Instalar ChromeOS Flex</translation> <translation id="1856388568474281774">Flecha hacia abajo</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Guardar en</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Se ha producido un error al hacer ping en la puerta de enlace de red no predeterminada</translation> +<translation id="4500966230243561393">Color de la interfaz</translation> <translation id="4503223151711056411">Flecha hacia la izquierda</translation> <translation id="4507392511610824664">aumentar brillo</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Detener prueba</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Cuando la pantalla está inactiva, muestra fotos, la hora, el tiempo e información multimedia.</translation> +<translation id="5035083460461104704">Color del tema</translation> <translation id="5038292761217083259">teclado multicolor</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5049856988445523908">SIM bloqueada (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutro</translation> <translation id="7620771111601174153">Más información en el Centro de Ayuda</translation> <translation id="763165478673169849">Hora a la que se restableció por última vez</translation> +<translation id="7633068090678117093">Imagen de fondo</translation> <translation id="7648838807254605802">Latencia de HTTPS alta</translation> <translation id="765159867434478292">Dividir</translation> <translation id="7656388927906093505">El dispositivo es un ratón.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Emparejamiento</translation> <translation id="8930622219860340959">Conexión inalámbrica</translation> <translation id="8936793075252196307">Dirección IP de cliente</translation> +<translation id="8944651180182756621">Color del menú de aplicaciones</translation> <translation id="894617464444543719">El dispositivo es un teléfono.</translation> <translation id="8957423540740801332">derecha</translation> <translation id="8968751544471797276">Velocidad de carga</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Realizar prueba de memoria</translation> <translation id="9161276708550942948">barra espaciadora</translation> <translation id="9173638680043580060">Queda menos de 1 minuto</translation> +<translation id="9174334653006917325">Color de la interfaz de usuario</translation> <translation id="917720651393141712">Prueba</translation> <translation id="9188992814426075118">Tu teclado puede combinar automáticamente con tu fondo de pantalla</translation> <translation id="9189000703457422362">No se puede conectar a esta red con APNs detectados automáticamente. Ponte en contacto con tu operador móvil para obtener más información.</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 6c83afc5..359a412 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Tumeda teema keelamine</translation> <translation id="1807246157184219062">Hele</translation> <translation id="1827738518074806965">Kunstigalerii</translation> +<translation id="1836553715834333258">Süsteemi värv</translation> <translation id="1838374766361614909">Otsingu kustutamine</translation> +<translation id="1840474674287087346">Töölaua värv</translation> <translation id="1851218745569890714">Videokonverents</translation> <translation id="1852934301711881861">Installi Chrome OS Flex</translation> <translation id="1856388568474281774">Allanool</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Skanni asukohta</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Mittevaikevõrgulüüsi pingimine ebaõnnestus</translation> +<translation id="4500966230243561393">Liidese värv</translation> <translation id="4503223151711056411">Vasaknool</translation> <translation id="4507392511610824664">suurendab heledust</translation> <translation id="4511264077854731334">Portaal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Lõpeta test</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Kui ekraanikuva on tegevusetu, kuvatakse fotosid, kellaaega, ilmateadet ja meediateavet.</translation> +<translation id="5035083460461104704">Teema värv</translation> <translation id="5038292761217083259">mitmevärviline klaviatuur</translation> <translation id="5039804452771397117">Luba</translation> <translation id="5049856988445523908">SIM on lukus (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutraalne</translation> <translation id="7620771111601174153">Lisateavet leiate abikeskusest</translation> <translation id="763165478673169849">Viimane lähtestamisaeg</translation> +<translation id="7633068090678117093">Taustakujutis</translation> <translation id="7648838807254605802">Pikk HTTPS-i latentsusaeg</translation> <translation id="765159867434478292">Eralda</translation> <translation id="7656388927906093505">Seade on hiir.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Partner</translation> <translation id="8930622219860340959">Raadiovõrk</translation> <translation id="8936793075252196307">Kliendi IP-aadress</translation> +<translation id="8944651180182756621">Käivitaja värv</translation> <translation id="894617464444543719">Seade on telefon.</translation> <translation id="8957423540740801332">paremale</translation> <translation id="8968751544471797276">Laadimiskiirus</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Käita mälutest</translation> <translation id="9161276708550942948">tühikuklahv</translation> <translation id="9173638680043580060">Jäänud on alla minuti</translation> +<translation id="9174334653006917325">Kasutajaliidese värv</translation> <translation id="917720651393141712">Testi</translation> <translation id="9188992814426075118">Teie klaviatuuri saab automaatselt sobitada teie taustapildiga</translation> <translation id="9189000703457422362">Selle võrguga ei saa ühendust luua automaatselt tuvastatud APN-ide abil. Pöörduge lisateabe saamiseks oma mobiilioperaatori poole.</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index 1dfaad3..44e8aea 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">I-disable ang madilim na tema</translation> <translation id="1807246157184219062">Maliwanag</translation> <translation id="1827738518074806965">Art gallery</translation> +<translation id="1836553715834333258">Kulay ng system</translation> <translation id="1838374766361614909">I-clear ang paghahanap</translation> +<translation id="1840474674287087346">Kulay ng desktop</translation> <translation id="1851218745569890714">Pakikipagkumperensya Gamit ang Video</translation> <translation id="1852934301711881861">I-install ang ChromeOS Flex</translation> <translation id="1856388568474281774">Pababang arrow</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Pag-scan sa</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Hindi na-ping ang hindi default na network gateway</translation> +<translation id="4500966230243561393">Kulay ng interface</translation> <translation id="4503223151711056411">Kaliwang arrow</translation> <translation id="4507392511610824664">taasan ang liwanag</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Ihinto ang pagsusuri</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Kapag idle ang iyong screen, magpakita ng mga larawan, oras, lagay ng panahon, at impormasyon ng media.</translation> +<translation id="5035083460461104704">Kulay ng tema</translation> <translation id="5038292761217083259">multicolor na keyboard</translation> <translation id="5039804452771397117">Payagan</translation> <translation id="5049856988445523908">Na-lock ang SIM (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutral</translation> <translation id="7620771111601174153">Matuto pa sa Help Center</translation> <translation id="763165478673169849">Oras ng Huling Pag-reset</translation> +<translation id="7633068090678117093">Imahe sa background</translation> <translation id="7648838807254605802">Mataas na latency ng HTTPS</translation> <translation id="765159867434478292">Hatiin</translation> <translation id="7656388927906093505">Mouse ang device.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Peer</translation> <translation id="8930622219860340959">Wireless</translation> <translation id="8936793075252196307">IP address ng client</translation> +<translation id="8944651180182756621">Kulay ng Launcher</translation> <translation id="894617464444543719">Telepono ang device.</translation> <translation id="8957423540740801332">pakanan</translation> <translation id="8968751544471797276">Rate ng Pag-charge</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Patakbuhin ang pagsusuri sa Memory</translation> <translation id="9161276708550942948">space</translation> <translation id="9173638680043580060">Wala nang isang minuto ang natitira</translation> +<translation id="9174334653006917325">Kulay ng UI</translation> <translation id="917720651393141712">Test</translation> <translation id="9188992814426075118">Awtomatikong maitutugma ng iyong keyboard ang wallpaper mo</translation> <translation id="9189000703457422362">Hindi makakonekta sa network na ito gamit ang mga awtomatikong nade-detect na APN. Makipag-ugnayan sa iyong mobile carrier para sa higit pang impormasyon.</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 99a6b026..32e220c5 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">ઘેરી થીમ બંધ કરો</translation> <translation id="1807246157184219062">આછું</translation> <translation id="1827738518074806965">આર્ટ ગૅલરી</translation> +<translation id="1836553715834333258">સિસ્ટમનો રંગ</translation> <translation id="1838374766361614909">શોધ સાફ કરો</translation> +<translation id="1840474674287087346">ડેસ્કટૉપનો રંગ</translation> <translation id="1851218745569890714">વીડિયો કૉન્ફરન્સિંગ</translation> <translation id="1852934301711881861">ChromeOS Flex ઇન્સ્ટૉલ કરો</translation> <translation id="1856388568474281774">નીચેની ઍરો કી</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">સ્કૅન કરીને અહીં સાચવો</translation> <translation id="4479639480957787382">ઇથરનેટ</translation> <translation id="4483049906298469269">નૉન-ડિફૉલ્ટ નેટવર્ક ગેટવેને પિંગ કરવામાં નિષ્ફળ રહ્યાં</translation> +<translation id="4500966230243561393">ઇન્ટરફેસ રંગ</translation> <translation id="4503223151711056411">ડાબી ઍરો કી</translation> <translation id="4507392511610824664">બ્રાઇટનેસ વધારો</translation> <translation id="4511264077854731334">પોર્ટલ</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">પરીક્ષણ રોકો</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">જ્યારે તમારી સ્ક્રીન નિષ્ક્રિય હોય, ત્યારે ફોટા, સમય, હવામાન અને મીડિયાની માહિતી બતાવો.</translation> +<translation id="5035083460461104704">થીમનો રંગ</translation> <translation id="5038292761217083259">મલ્ટિકલર કીબોર્ડ</translation> <translation id="5039804452771397117">મંજૂરી આપો</translation> <translation id="5049856988445523908">સિમ કાર્ડ લૉક છે (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">ન્યૂટ્રલ</translation> <translation id="7620771111601174153">સહાયતા કેન્દ્રમાં વધુ જાણો</translation> <translation id="763165478673169849">છેલ્લે રીસેટ કર્યાનો સમય</translation> +<translation id="7633068090678117093">બૅકગ્રાઉન્ડની છબી</translation> <translation id="7648838807254605802">HTTPSની ઉચ્ચ વિલંબતા</translation> <translation id="765159867434478292">સ્પ્લિટ</translation> <translation id="7656388927906093505">ડિવાઇસ એક માઉસ છે.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">પીઅર</translation> <translation id="8930622219860340959">વાયરલેસ</translation> <translation id="8936793075252196307">ક્લાયન્ટનું IP ઍડ્રેસ</translation> +<translation id="8944651180182756621">લૉન્ચરનો રંગ</translation> <translation id="894617464444543719">ડિવાઇસ એક ફોન છે.</translation> <translation id="8957423540740801332">જમણી</translation> <translation id="8968751544471797276">ચાર્જ થવાની ટકાવારી</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">મેમરીનું પરીક્ષણ ચાલુ કરો</translation> <translation id="9161276708550942948">space</translation> <translation id="9173638680043580060">એક મિનિટ કરતાં ઓછો સમય બાકી છે</translation> +<translation id="9174334653006917325">UI રંગ</translation> <translation id="917720651393141712">પરીક્ષણ કરો</translation> <translation id="9188992814426075118">તમારું કીબોર્ડ ઑટોમૅટિક રીતે તમારા વૉલપેપર સાથે મેળ કરી શકે છે</translation> <translation id="9189000703457422362">જેની ઑટોમૅટિક રીતે ભાળ મળી હોય તેવા APNsનો ઉપયોગ કરીને આ નેટવર્ક સાથે કનેક્ટ કરી શકતાં નથી. વધુ માહિતી માટે તમારા મોબાઇલ ઑપરેટરનો સંપર્ક કરો.</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 6bbee34..c424676 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -64,6 +64,7 @@ <translation id="1476467821656042872"><ph name="MANAGER" /> はこのデバイスを管理しており、アクティビティを監視できる可能性があります。</translation> <translation id="1478594628797167447">スキャナ</translation> <translation id="1483493594462132177">送信</translation> +<translation id="1488850966314959671">有効なカスタム APN を使用してこのネットワークとの接続を試みましたが接続できません。詳しくは、ご利用の携帯通信会社にお問い合わせください。</translation> <translation id="1491076385728777984">「<ph name="DEVICE_NAME" />」のファームウェアを更新中</translation> <translation id="1499041187027566160">音量を上げる</translation> <translation id="1499900233129743732">このユーザーは <ph name="MANAGER" /> によって管理されています。設定の管理とユーザー アクティビティの監視がリモートで行われることがあります。</translation> @@ -563,6 +564,7 @@ <translation id="5578477003638479617">UMTS</translation> <translation id="5578519639599103840">再スキャン</translation> <translation id="5583640892426849032">Backspace</translation> +<translation id="5584044598279886848">この APN を無効化または削除できません。有効になっている接続済みの APN を無効化または削除しようとしていることを確認してください。</translation> <translation id="5600027863942488546"><ph name="KEY_NAME" /> キーをテストしました</translation> <translation id="5620281292257375798">内部専用</translation> <translation id="5649768706273821470">聴く</translation> @@ -1012,6 +1014,7 @@ <translation id="9173638680043580060">残り 1 分未満</translation> <translation id="917720651393141712">テスト</translation> <translation id="9188992814426075118">キーボードのバックライトの色を壁紙に合わせて自動調整できます</translation> +<translation id="9189000703457422362">自動検出された APN を使用してこのネットワークとの接続を試みましたが接続できません。詳しくは、ご利用の携帯通信会社にお問い合わせください。</translation> <translation id="9193744392140377127">APN*</translation> <translation id="9204237731135241582">Android アプリからゲートウェイにアクセスできません</translation> <translation id="9211490828691860325">すべてのデスク</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 0015ade..3119bf0 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Қараңғы режимді өшіру</translation> <translation id="1807246157184219062">Ашық</translation> <translation id="1827738518074806965">Өнер галереясы</translation> +<translation id="1836553715834333258">Жүйе түсі</translation> <translation id="1838374766361614909">Іздеуді тазарту</translation> +<translation id="1840474674287087346">Жұмыс үстелінің түсі</translation> <translation id="1851218745569890714">Бейнеконференция жасау</translation> <translation id="1852934301711881861">ChromeOS Flex-ті орнату</translation> <translation id="1856388568474281774">Төмен бағыт пернесі</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Сақтау орны</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Әдепкі емес желі шлюзінің байланысы тексерілмеді.</translation> +<translation id="4500966230243561393">Интерфейс түсі</translation> <translation id="4503223151711056411">Сол бағыт пернесі</translation> <translation id="4507392511610824664">жарықтық деңгейін арттыру</translation> <translation id="4511264077854731334">Портал</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Тексеруді тоқтату</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Экран пайдаланылмай тұрғанда, фотосуреттерді, уақытты, ауа райын және медиа ақпаратын көрсетеді.</translation> +<translation id="5035083460461104704">Тақырып түсі</translation> <translation id="5038292761217083259">пернетақтаны көп түсті ету</translation> <translation id="5039804452771397117">Рұқсат беру</translation> <translation id="5049856988445523908">SIM құлыпталған (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Бейтарап</translation> <translation id="7620771111601174153">Толығырақ ақпаратты Анықтамалық орталықтан қарау</translation> <translation id="763165478673169849">Соңғы рет нөлденген уақыт</translation> +<translation id="7633068090678117093">Фондық сурет</translation> <translation id="7648838807254605802">HTTPS кідірісі жоғары.</translation> <translation id="765159867434478292">Бөлу</translation> <translation id="7656388927906093505">Бұл — тінтуір.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">құрылғы</translation> <translation id="8930622219860340959">Сымсыз</translation> <translation id="8936793075252196307">Клиенттің IP мекенжайы</translation> +<translation id="8944651180182756621">Іске қосу тақтасының түсі</translation> <translation id="894617464444543719">Бұл — телефон.</translation> <translation id="8957423540740801332">оң</translation> <translation id="8968751544471797276">Зарядталу жылдамдығы</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Жад тексерісін іске қосу</translation> <translation id="9161276708550942948">бос орын</translation> <translation id="9173638680043580060">Бір минутқа жетпейтін уақыт қалды.</translation> +<translation id="9174334653006917325">Пайдаланушы интерфейсінің түсі</translation> <translation id="917720651393141712">Тексеру</translation> <translation id="9188992814426075118">Пернетақта тұсқағазды автоматты түрде сәйкестендіре алады.</translation> <translation id="9189000703457422362">Автоматты түрде анықталған APN аттары арқылы бұл желіге қосылу мүмкін емес. Қосымша ақпарат алу үшін мобильдік операторыңызға хабарласыңыз.</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 74273c54..d73deb75 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">어두운 테마 사용 안함</translation> <translation id="1807246157184219062">밝게</translation> <translation id="1827738518074806965">아트 갤러리</translation> +<translation id="1836553715834333258">시스템 색상</translation> <translation id="1838374766361614909">검색어 지우기</translation> +<translation id="1840474674287087346">데스크톱 색상</translation> <translation id="1851218745569890714">화상 회의</translation> <translation id="1852934301711881861">ChromeOS Flex 설치</translation> <translation id="1856388568474281774">아래쪽 화살표</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">스캔 파일 저장 위치</translation> <translation id="4479639480957787382">이더넷</translation> <translation id="4483049906298469269">기본이 아닌 네트워크 게이트웨이를 핑할 수 없습니다.</translation> +<translation id="4500966230243561393">인터페이스 색상</translation> <translation id="4503223151711056411">왼쪽 화살표</translation> <translation id="4507392511610824664">밝기를 높입니다</translation> <translation id="4511264077854731334">포털</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">테스트 중지</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">화면이 유휴 상태일 때 사진, 시간, 날씨, 미디어 정보를 표시합니다.</translation> +<translation id="5035083460461104704">테마 색상</translation> <translation id="5038292761217083259">키보드 여러 색상</translation> <translation id="5039804452771397117">허용</translation> <translation id="5049856988445523908">SIM 잠김(<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">중성 색상</translation> <translation id="7620771111601174153">고객센터에서 자세히 알아보기</translation> <translation id="763165478673169849">마지막 재설정 시간</translation> +<translation id="7633068090678117093">배경 이미지</translation> <translation id="7648838807254605802">HTTPS 지연 시간 높음</translation> <translation id="765159867434478292">분할</translation> <translation id="7656388927906093505">마우스 기기입니다.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">동종</translation> <translation id="8930622219860340959">무선</translation> <translation id="8936793075252196307">클라이언트 IP 주소</translation> +<translation id="8944651180182756621">런처 색상</translation> <translation id="894617464444543719">휴대전화 기기입니다.</translation> <translation id="8957423540740801332">오른쪽</translation> <translation id="8968751544471797276">충전 속도</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">메모리 테스트 실행</translation> <translation id="9161276708550942948">스페이스</translation> <translation id="9173638680043580060">1분 미만 남음</translation> +<translation id="9174334653006917325">UI 색상</translation> <translation id="917720651393141712">테스트</translation> <translation id="9188992814426075118">키보드 백라이트가 배경화면에 어울리게 자동으로 설정됩니다.</translation> <translation id="9189000703457422362">자동으로 감지된 APN을 사용하여 이 네트워크에 연결할 수 없습니다. 자세한 내용은 이동통신사에 문의하세요.</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index c7d34c61..7f27772a 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Караңгы теманы өчүрүү</translation> <translation id="1807246157184219062">Ачык</translation> <translation id="1827738518074806965">Көркөм галерея</translation> +<translation id="1836553715834333258">Тутумдун түсү</translation> <translation id="1838374766361614909">Изделип жаткан нерсени өчүрүү</translation> +<translation id="1840474674287087346">Иш тактанын түсү</translation> <translation id="1851218745569890714">Видео конференция</translation> <translation id="1852934301711881861">ChromeOS Flex'ти орнотуу</translation> <translation id="1856388568474281774">Ылдый жебе</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Төмөнкүгө скандоо:</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Демейкиден башка тармактын шлюзуна ping сурамы жөнөтүлгөн жок</translation> +<translation id="4500966230243561393">Интерфейстин түсү</translation> <translation id="4503223151711056411">Солго жебе</translation> <translation id="4507392511610824664">жарыктыгын көбөйтүү</translation> <translation id="4511264077854731334">Портал</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Сынакты токтотуу</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Сенек мезгилде экранда сүрөттөрдү, убакытты, аба ырайын жана медиа маалыматты көрсөтүү.</translation> +<translation id="5035083460461104704">Теманын түсү</translation> <translation id="5038292761217083259">бир нече түстүү баскычтоп</translation> <translation id="5039804452771397117">Уруксат берүү</translation> <translation id="5049856988445523908">SIM карта кулпуланды (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Нейтралдуу</translation> <translation id="7620771111601174153">Жардам борборуна өтүп, кененирээк маалымат алыңыз</translation> <translation id="763165478673169849">Акыркы жолу баштапкы абалга келтирилген убакыт</translation> +<translation id="7633068090678117093">Фондогу сүрөт</translation> <translation id="7648838807254605802">HTTPS күтүү убакыты жогору</translation> <translation id="765159867434478292">Бөлүү</translation> <translation id="7656388927906093505">Түзмөк — чычкан.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Жупташкан түзмөк</translation> <translation id="8930622219860340959">Зымсыз</translation> <translation id="8936793075252196307">Кардардын IP-дареги</translation> +<translation id="8944651180182756621">Жүргүзгүчтүн түсү</translation> <translation id="894617464444543719">Түзмөк — телефон.</translation> <translation id="8957423540740801332">оң</translation> <translation id="8968751544471797276">Батареянын кубатталышы көрсөткүчү</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Эстутумду сыноо</translation> <translation id="9161276708550942948">боштук</translation> <translation id="9173638680043580060">Бир мүнөткө жетпеген убакыт калды</translation> +<translation id="9174334653006917325">Колдонуучу интерфейсинин түсү</translation> <translation id="917720651393141712">Сыноо</translation> <translation id="9188992814426075118">Баскычтобуңуз тушкагазга автоматтык түрдө туураланышы мүмкүн</translation> <translation id="9189000703457422362">Бул тармакка автоматтык түрдө аныкталган APN'дерди колдонуп туташуу мүмкүн эмес. Толук маалымат алуу үчүн мобилдик байланыш операторуна кайрылыңыз.</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 8a7955dd..a501138 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Išjungti tamsiąją temą</translation> <translation id="1807246157184219062">Šviesi</translation> <translation id="1827738518074806965">Meno galerija</translation> +<translation id="1836553715834333258">Sistemos spalva</translation> <translation id="1838374766361614909">Išvalyti paiešką</translation> +<translation id="1840474674287087346">Darbalaukio spalva</translation> <translation id="1851218745569890714">Vaizdo konferencijos</translation> <translation id="1852934301711881861">Įdiegti „ChromeOS Flex“</translation> <translation id="1856388568474281774">Rodyklė žemyn</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Nuskaityti į</translation> <translation id="4479639480957787382">Eternetas</translation> <translation id="4483049906298469269">Nepavyko patikrinti ryšio su nenumatytuoju tinklų sietuvu</translation> +<translation id="4500966230243561393">Sąsajos spalva</translation> <translation id="4503223151711056411">Rodyklė kairėn</translation> <translation id="4507392511610824664">padidinti šviesumą</translation> <translation id="4511264077854731334">Portalas</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Stabdyti bandymą</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Kai ekranas neaktyvus, rodomos nuotraukos, laikas, orų ir medijos informacija.</translation> +<translation id="5035083460461104704">Temos spalva</translation> <translation id="5038292761217083259">įvairiaspalvė klaviatūra</translation> <translation id="5039804452771397117">Leisti</translation> <translation id="5049856988445523908">SIM kortelė užrakinta (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutrali</translation> <translation id="7620771111601174153">Sužinokite daugiau pagalbos centre</translation> <translation id="763165478673169849">Paskutinio nustatymo iš naujo laikas</translation> +<translation id="7633068090678117093">Fono vaizdas</translation> <translation id="7648838807254605802">Didelė HTTPS delsa</translation> <translation id="765159867434478292">Padalyti</translation> <translation id="7656388927906093505">Įrenginys yra pelė.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Lygiavertis tinklo mazgas</translation> <translation id="8930622219860340959">Belaidis</translation> <translation id="8936793075252196307">Kliento IP adresas</translation> +<translation id="8944651180182756621">Paleidimo priemonės spalva</translation> <translation id="894617464444543719">Įrenginys yra telefonas.</translation> <translation id="8957423540740801332">dešinėn</translation> <translation id="8968751544471797276">Įkrovimo rodiklis</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Vykdyti atminties bandymą</translation> <translation id="9161276708550942948">tarpo klavišas</translation> <translation id="9173638680043580060">Liko mažiau nei minutė</translation> +<translation id="9174334653006917325">NS spalva</translation> <translation id="917720651393141712">Bandyti</translation> <translation id="9188992814426075118">Klaviatūra gali automatiškai atitikti ekrano foną</translation> <translation id="9189000703457422362">Nepavyksta prisijungti prie šio tinklo naudojant automatiškai aptiktus APN. Susisiekite su mobiliojo ryšio operatoriumi, kad gautumėte daugiau informacijos.</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index d039b5c..249f481 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Lumpuhkan tema gelap</translation> <translation id="1807246157184219062">Cahaya</translation> <translation id="1827738518074806965">Galeri seni</translation> +<translation id="1836553715834333258">Warna sistem</translation> <translation id="1838374766361614909">Kosongkan carian</translation> +<translation id="1840474674287087346">Warna desktop</translation> <translation id="1851218745569890714">Persidangan Video</translation> <translation id="1852934301711881861">Pasang Chrome OS Flex</translation> <translation id="1856388568474281774">Anak panah ke bawah</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Imbas dan simpan pada</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Gagal untuk ping get laluan rangkaian bukan lalai</translation> +<translation id="4500966230243561393">Warna antara muka</translation> <translation id="4503223151711056411">Anak panah ke kiri</translation> <translation id="4507392511610824664">tambahkan kecerahan</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Hentikan ujian</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Apabila skrin anda melahu, tunjukkan foto, masa, cuaca dan maklumat media.</translation> +<translation id="5035083460461104704">Warna tema</translation> <translation id="5038292761217083259">berbilang warna papan kekunci</translation> <translation id="5039804452771397117">Benarkan</translation> <translation id="5049856988445523908">SIM Dikunci (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutral</translation> <translation id="7620771111601174153">Ketahui lebih lanjut dalam Pusat Bantuan</translation> <translation id="763165478673169849">Masa Terakhir Ditetapkan Semula</translation> +<translation id="7633068090678117093">Imej latar belakang</translation> <translation id="7648838807254605802">Kependaman HTTPS tinggi</translation> <translation id="765159867434478292">Pisah</translation> <translation id="7656388927906093505">Peranti ialah tetikus.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Setara</translation> <translation id="8930622219860340959">Wayarles</translation> <translation id="8936793075252196307">Alamat IP klien</translation> +<translation id="8944651180182756621">Warna pelancar</translation> <translation id="894617464444543719">Peranti ialah telefon.</translation> <translation id="8957423540740801332">kanan</translation> <translation id="8968751544471797276">Kadar pengecasan</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Jalankan Ujian memori</translation> <translation id="9161276708550942948">ruang</translation> <translation id="9173638680043580060">Kurang seminit lagi</translation> +<translation id="9174334653006917325">Warna UI</translation> <translation id="917720651393141712">Ujian</translation> <translation id="9188992814426075118">Papan kekunci anda dapat memadankan kertas dinding anda secara automatik</translation> <translation id="9189000703457422362">Tidak dapat menyambung kepada rangkaian ini menggunakan APN yang dikesan secara automatik. Hubungi pembawa mudah alih anda untuk mendapatkan maklumat lanjut.</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index 854ef45c..fa373fa 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">အမှောင်နောက်ခံ ပိတ်ရန်</translation> <translation id="1807246157184219062">အလင်း</translation> <translation id="1827738518074806965">ပန်းချီပြခန်း</translation> +<translation id="1836553715834333258">စနစ် အရောင်</translation> <translation id="1838374766361614909">ရှာဖွေမှုကို ရှင်းပါ</translation> +<translation id="1840474674287087346">ဒက်စ်တော့ အရောင်</translation> <translation id="1851218745569890714">ဗီဒီယိုအစည်းအဝေး</translation> <translation id="1852934301711881861">ChromeOS Flex ထည့်သွင်းရန်</translation> <translation id="1856388568474281774">အောက်ညွှန်မြား</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">စကင်သိမ်းရန် နေရာ</translation> <translation id="4479639480957787382">အီတာနက်</translation> <translation id="4483049906298469269">မူရင်းမဟုတ်သည့် ကွန်ရက်ဂိတ်ဝကို ပင်လုပ်၍မရပါ</translation> +<translation id="4500966230243561393">အင်တာဖေ့စ် အရောင်</translation> <translation id="4503223151711056411">ဘယ်ညွှန်မြား</translation> <translation id="4507392511610824664">တောက်ပမှု တိုးရန်</translation> <translation id="4511264077854731334">ပေါ်တယ်</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">စစ်ဆေးမှု ရပ်ရန်</translation> <translation id="5017508259293544172">နှစ်ထက်နှစ်</translation> <translation id="5019310272469539976">သင့်ဖန်သားပြင်ကို အသုံးမပြုသောအခါ ဓာတ်ပုံများ၊ အချိန်၊ ရာသီဥတုနှင့် မီဒီယာအချက်အလက်များ ပြသည်။</translation> +<translation id="5035083460461104704">အပြင်အဆင် အရောင်</translation> <translation id="5038292761217083259">ကီးဘုတ် ရောင်စုံ</translation> <translation id="5039804452771397117">ခွင့်ပြုရန်</translation> <translation id="5049856988445523908">ဆင်းမ်ကတ် လော့ခ်ချထားသည် (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">ပုံမှန်</translation> <translation id="7620771111601174153">'ကူညီရေးဌာန' တွင် ပိုမိုလေ့လာရန်</translation> <translation id="763165478673169849">နောက်ဆုံး ပြင်ဆင်သတ်မှတ်ထားချိန်</translation> +<translation id="7633068090678117093">နောက်ခံပုံရိပ်</translation> <translation id="7648838807254605802">HTTPS တုံ့ပြန်ချိန် မြင့်သည်</translation> <translation id="765159867434478292">ခွဲရန်</translation> <translation id="7656388927906093505">ကိရိယာသည် မောက်စ်ဖြစ်သည်။</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">အမျိုးအစားတူ</translation> <translation id="8930622219860340959">ကြိုးမဲ့</translation> <translation id="8936793075252196307">ကလိုင်းယင့် အိုင်ပီ (IP) လိပ်စာ</translation> +<translation id="8944651180182756621">Launcher အရောင်</translation> <translation id="894617464444543719">ကိရိယာသည် ဖုန်းဖြစ်သည်။</translation> <translation id="8957423540740801332">ညာ</translation> <translation id="8968751544471797276">အားသွင်းနှုန်း</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">မှတ်ဉာဏ်စစ်ဆေးရန်</translation> <translation id="9161276708550942948">space ကီး</translation> <translation id="9173638680043580060">တစ်မိနစ်ပင် မကျန်တော့ပါ</translation> +<translation id="9174334653006917325">UI အရောင်</translation> <translation id="917720651393141712">စမ်းသပ်မှု</translation> <translation id="9188992814426075118">ကီးဘုတ်က သင့်နောက်ခံကို အလိုအလျောက် တူညီအောင်လုပ်နိုင်သည်</translation> <translation id="9189000703457422362">အလိုအလျောက် တွေ့ရှိသော APN များ သုံးပြီး ဤကွန်ရက်သို့ ချိတ်ဆက်၍မရပါ။ နောက်ထပ်အချက်အလက်အတွက် သင့်မိုဘိုင်းဖုန်းကုမ္ပဏီကို ဆက်သွယ်ပါ။</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index f446309..a9f3f4c 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">अँध्यारो थिम अफ गर्नुहोस्</translation> <translation id="1807246157184219062">हल्का</translation> <translation id="1827738518074806965">आर्ट ग्यालेरी</translation> +<translation id="1836553715834333258">सिस्टमको रङ</translation> <translation id="1838374766361614909">खोजी खाली गर्नुहोस्</translation> +<translation id="1840474674287087346">डेस्कटपको रङ</translation> <translation id="1851218745569890714">भिडियो कन्फ्रेन्स</translation> <translation id="1852934301711881861">ChromeOS Flex इन्स्टल गर्नुहोस्</translation> <translation id="1856388568474281774">डाउन एरो</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">स्क्यान गरेर यहाँ सेभ गर्नुहोस्</translation> <translation id="4479639480957787382">इथरनेट</translation> <translation id="4483049906298469269">नेटवर्कको डिफल्ट गेटवेका रूपमा सेट नगरिएको यस गेटवेलाई पिङ गर्न सकिएन</translation> +<translation id="4500966230243561393">इन्टरफेसको रङ</translation> <translation id="4503223151711056411">लेफ्ट एरो</translation> <translation id="4507392511610824664">"चमक बढाउनुहोस्" जनाउने आइकन</translation> <translation id="4511264077854731334">पोर्टल</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">परीक्षण रोक्नुहोस्</translation> <translation id="5017508259293544172">छलाङ</translation> <translation id="5019310272469539976">मेरो स्क्रिन निष्क्रिय अवस्थामा हुँदा फोटो, समय, मौसम र मिडियासम्बन्धी जानकारी देखाइयोस्।</translation> +<translation id="5035083460461104704">थिमको रङ</translation> <translation id="5038292761217083259">किबोर्डको ब्याकलाइटको एकभन्दा बढी रङ</translation> <translation id="5039804452771397117">अनुमति दिनुहोस्</translation> <translation id="5049856988445523908">SIM लक गरिएको छ (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">तटस्थ</translation> <translation id="7620771111601174153">मद्दत केन्द्रमा गई थप जान्नुहोस्</translation> <translation id="763165478673169849">पछिल्लो पटक रिसेट गरिएको मिति र समय</translation> +<translation id="7633068090678117093">ब्याकग्राउन्ड फोटो</translation> <translation id="7648838807254605802">HTTPS को विलम्बता धेरै छ</translation> <translation id="765159867434478292">विभाजन गर्नुहोस्</translation> <translation id="7656388927906093505">यो डिभाइस माउस हो।</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">पियर</translation> <translation id="8930622219860340959">वायरलेस</translation> <translation id="8936793075252196307">क्लाइन्टको IP ठेगाना</translation> +<translation id="8944651180182756621">लन्चरको रङ</translation> <translation id="894617464444543719">यो डिभाइस फोन हो।</translation> <translation id="8957423540740801332">दायाँ</translation> <translation id="8968751544471797276">चार्ज भइरहेको दर</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">मेमोरीसम्बन्धी परीक्षण गर्नुहोस्</translation> <translation id="9161276708550942948">space</translation> <translation id="9173638680043580060">एक मिनेटभन्दा कम समय बाँकी छ</translation> +<translation id="9174334653006917325">UI को रङ</translation> <translation id="917720651393141712">परीक्षण</translation> <translation id="9188992814426075118">तपाईंको किबोर्डले तपाईंको वालपेपरसँग मेल खाने कलर थिम स्वतः बनाउन सक्छ</translation> <translation id="9189000703457422362">स्वतः पत्ता लगाइएका APN हरू प्रयोग गरी यो नेटवर्कमा कनेक्ट गर्न सकिएन। यस सम्बन्धमा थप जानकारी प्राप्त गर्न आफ्नो मोबाइलको सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index b5e803a..3cb53d4 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">ਗੂੜ੍ਹਾ ਥੀਮ ਬੰਦ ਕਰੋ</translation> <translation id="1807246157184219062">ਹਲਕਾ</translation> <translation id="1827738518074806965">ਕਲਾ ਗੈਲਰੀ</translation> +<translation id="1836553715834333258">ਸਿਸਟਮ ਦਾ ਰੰਗ</translation> <translation id="1838374766361614909">ਖੋਜ ਹਟਾਓ</translation> +<translation id="1840474674287087346">ਡੈਸਕਟਾਪ ਦਾ ਰੰਗ</translation> <translation id="1851218745569890714">ਵੀਡੀਓ ਕਾਨਫਰੰਸਿੰਗ</translation> <translation id="1852934301711881861">ChromeOS Flex ਸਥਾਪਤ ਕਰੋ</translation> <translation id="1856388568474281774">ਹੇਠਾਂ ਤੀਰ</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">ਇਸ ਵਿੱਚ ਸਕੈਨ ਕਰੋ</translation> <translation id="4479639480957787382">ਈਥਰਨੈਟ</translation> <translation id="4483049906298469269">ਗੈਰ-ਪੂਰਵ-ਨਿਰਧਾਰਤ ਨੈੱਟਵਰਕ ਗੇਟਵੇ ਨੂੰ ਪਿੰਗ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation> +<translation id="4500966230243561393">ਇੰਟਰਫੇਸ ਦਾ ਰੰਗ</translation> <translation id="4503223151711056411">ਖੱਬਾ ਤੀਰ</translation> <translation id="4507392511610824664">ਚਮਕ ਵਧਾਓ</translation> <translation id="4511264077854731334">ਪੋਰਟਲ</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">ਟੈਸਟ ਬੰਦ ਕਰੋ</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">ਜਦੋਂ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਅਕਿਰਿਆਸ਼ੀਲ ਹੁੰਦੀ ਹੈ, ਤਾਂ ਫ਼ੋਟੋਆਂ, ਸਮਾਂ, ਮੌਸਮ ਅਤੇ ਮੀਡੀਆ ਜਾਣਕਾਰੀ ਦਿਖਾਓ।</translation> +<translation id="5035083460461104704">ਥੀਮ ਦਾ ਰੰਗ</translation> <translation id="5038292761217083259">ਕੀ-ਬੋਰਡ ਦੇ ਇੱਕ ਤੋਂ ਜ਼ਿਆਦਾ ਰੰਗ</translation> <translation id="5039804452771397117">ਆਗਿਆ ਦਿਓ</translation> <translation id="5049856988445523908">ਸਿਮ ਲਾਕ ਕੀਤਾ ਗਿਆ (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">ਨਿਰਪੱਖ</translation> <translation id="7620771111601174153">ਮਦਦ ਕੇਂਦਰ ਵਿੱਚ ਹੋਰ ਜਾਣੋ</translation> <translation id="763165478673169849">ਪਿਛਲੀ ਵਾਰ ਰੀਸੈੱਟ ਕਰਨ ਦਾ ਸਮਾਂ</translation> +<translation id="7633068090678117093">ਬੈਕਗ੍ਰਾਊਂਡ ਚਿੱਤਰ</translation> <translation id="7648838807254605802">ਜ਼ਿਆਦਾ HTTPS ਵਿਲੰਬਤਾ</translation> <translation id="765159867434478292">ਵੱਖਰਾ ਕਰੋ</translation> <translation id="7656388927906093505">ਡੀਵਾਈਸ ਇੱਕ ਮਾਊਸ ਹੈ।</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">ਪੀਅਰ</translation> <translation id="8930622219860340959">ਵਾਇਰਲੈੱਸ</translation> <translation id="8936793075252196307">ਕਲਾਇੰਟ ਦਾ IP ਪਤਾ</translation> +<translation id="8944651180182756621">ਲਾਂਚਰ ਦਾ ਰੰਗ</translation> <translation id="894617464444543719">ਡੀਵਾਈਸ ਇੱਕ ਫ਼ੋਨ ਹੈ।</translation> <translation id="8957423540740801332">ਸੱਜਾ</translation> <translation id="8968751544471797276">ਚਾਰਜਿੰਗ ਦਰ</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">ਮੈਮੋਰੀ ਟੈਸਟ ਚਲਾਓ</translation> <translation id="9161276708550942948">space</translation> <translation id="9173638680043580060">ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ</translation> +<translation id="9174334653006917325">UI ਦਾ ਰੰਗ</translation> <translation id="917720651393141712">ਜਾਂਚ</translation> <translation id="9188992814426075118">ਤੁਹਾਡਾ ਕੀ-ਬੋਰਡ ਤੁਹਾਡੇ ਵਾਲਪੇਪਰ ਨਾਲ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਮੇਲ ਖਾ ਸਕਦਾ ਹੈ</translation> <translation id="9189000703457422362">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਪਛਾਣੇ ਗਏ APN ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਇਸ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਆਪਣੇ ਮੋਬਾਈਲ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index beb868b4..d079788 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Отключить тёмную тему</translation> <translation id="1807246157184219062">Светлая</translation> <translation id="1827738518074806965">Галерея</translation> +<translation id="1836553715834333258">Цвет системных элементов</translation> <translation id="1838374766361614909">Удалить условия поиска</translation> +<translation id="1840474674287087346">Цвет рабочего стола</translation> <translation id="1851218745569890714">Видеоконференции</translation> <translation id="1852934301711881861">Установить Chrome OS Flex</translation> <translation id="1856388568474281774">Стрелка вниз</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Место сохранения</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Не удалось выполнить проверку ping сетевого шлюза, не заданного по умолчанию.</translation> +<translation id="4500966230243561393">Цвет интерфейса</translation> <translation id="4503223151711056411">Стрелка влево</translation> <translation id="4507392511610824664">увеличить яркость</translation> <translation id="4511264077854731334">Портал</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Прекратить проверку</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Показывает фото, время, погоду и новости, когда ваше устройство находится в режиме ожидания</translation> +<translation id="5035083460461104704">Цвет темы</translation> <translation id="5038292761217083259">цвета подсветки клавиатуры</translation> <translation id="5039804452771397117">Разрешить</translation> <translation id="5049856988445523908">SIM-карта заблокирована (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Нейтральные цвета</translation> <translation id="7620771111601174153">Узнать больше в Справочном центре</translation> <translation id="763165478673169849">Время последнего сброса</translation> +<translation id="7633068090678117093">Фоновое изображение</translation> <translation id="7648838807254605802">большое время ожидания HTTPS</translation> <translation id="765159867434478292">Разделить</translation> <translation id="7656388927906093505">Это мышь.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Пользователь</translation> <translation id="8930622219860340959">Беспроводная связь</translation> <translation id="8936793075252196307">IP-адрес клиента</translation> +<translation id="8944651180182756621">Цвет панели запуска</translation> <translation id="894617464444543719">Это телефон.</translation> <translation id="8957423540740801332">вправо</translation> <translation id="8968751544471797276">Скорость зарядки</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Запустить проверку памяти</translation> <translation id="9161276708550942948">пробел</translation> <translation id="9173638680043580060">Осталось меньше минуты…</translation> +<translation id="9174334653006917325">Цвет пользовательского интерфейса</translation> <translation id="917720651393141712">Проверить</translation> <translation id="9188992814426075118">Цвет клавиатуры может автоматически подстраиваться под цвет обоев.</translation> <translation id="9189000703457422362">Не удается подключиться к этой сети через автоматически обнаруженные точки доступа. За подробной информацией обратитесь к оператору мобильной связи.</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 2c1d67a..d1df1b96 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Onemogočanje temne teme</translation> <translation id="1807246157184219062">Svetlo</translation> <translation id="1827738518074806965">Umetnostna galerija</translation> +<translation id="1836553715834333258">Barva sistema</translation> <translation id="1838374766361614909">Čiščenje iskanja</translation> +<translation id="1840474674287087346">Barva namizja</translation> <translation id="1851218745569890714">Videokonference</translation> <translation id="1852934301711881861">Namesti ChromeOS Flex</translation> <translation id="1856388568474281774">Puščica dol</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Skeniraj v</translation> <translation id="4479639480957787382">Ethernet</translation> <translation id="4483049906298469269">Ni bilo mogoče preveriti prehoda omrežja, ki ni privzet</translation> +<translation id="4500966230243561393">Barva vmesnika</translation> <translation id="4503223151711056411">Puščica levo</translation> <translation id="4507392511610824664">povečanje svetlosti</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Ustavi preizkus</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Ko je zaslon nedejaven, prikaži fotografije, uro, vreme in podatke o predstavnosti.</translation> +<translation id="5035083460461104704">Barva teme</translation> <translation id="5038292761217083259">večbarvna osvetlitev tipkovnice</translation> <translation id="5039804452771397117">Dovoli</translation> <translation id="5049856988445523908">Kartica SIM je zaklenjena (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Nevtralna</translation> <translation id="7620771111601174153">Preberite več v centru za pomoč</translation> <translation id="763165478673169849">Čas zadnje ponastavitve</translation> +<translation id="7633068090678117093">Slika ozadja</translation> <translation id="7648838807254605802">Velika zakasnitev HTTPS</translation> <translation id="765159867434478292">Delitev</translation> <translation id="7656388927906093505">Naprava je miška.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Primerljiva aplikacija</translation> <translation id="8930622219860340959">Brezžično</translation> <translation id="8936793075252196307">Naslov IP odjemalca</translation> +<translation id="8944651180182756621">Barva zaganjalnika</translation> <translation id="894617464444543719">Naprava je telefon.</translation> <translation id="8957423540740801332">desno</translation> <translation id="8968751544471797276">Hitrost polnjenja</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Zaženi preizkus pomnilnika</translation> <translation id="9161276708550942948">preslednica</translation> <translation id="9173638680043580060">Še manj kot minuta</translation> +<translation id="9174334653006917325">Barva uporabniškega vmesnika</translation> <translation id="917720651393141712">Preizkus</translation> <translation id="9188992814426075118">Tipkovnica se lahko samodejno ujema z zaslonskim ozadjem.</translation> <translation id="9189000703457422362">S tem omrežjem se ni mogoče povezati prek samodejno zaznanih APN-jev. Če želite več informacij, se obrnite na mobilnega operaterja.</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index ea217841..d5e4a5d 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Onemogućite tamnu temu</translation> <translation id="1807246157184219062">Svetla</translation> <translation id="1827738518074806965">Likovna galerija</translation> +<translation id="1836553715834333258">Boja sistema</translation> <translation id="1838374766361614909">Obrišite pretragu</translation> +<translation id="1840474674287087346">Boja radne površine</translation> <translation id="1851218745569890714">Video konferencije</translation> <translation id="1852934301711881861">Instaliraj Chrome OS Flex</translation> <translation id="1856388568474281774">Strelica nadole</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Skeniraj u:</translation> <translation id="4479639480957787382">Eternet</translation> <translation id="4483049906298469269">Pingovanje mrežnog prolaza koji nije podrazumevan nije uspelo</translation> +<translation id="4500966230243561393">Boja interfejsa</translation> <translation id="4503223151711056411">Strelica nalevo</translation> <translation id="4507392511610824664">povećajte osvetljenost</translation> <translation id="4511264077854731334">Portal</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Zaustavi test</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Kada je ekran neaktivan, prikazuju se slike, vreme, vremenska prognoza i informacije o medijskom sadržaju.</translation> +<translation id="5035083460461104704">Boja teme</translation> <translation id="5038292761217083259">višebojna tastatura</translation> <translation id="5039804452771397117">Dozvoli</translation> <translation id="5049856988445523908">SIM je zaključan (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Neutralno</translation> <translation id="7620771111601174153">Saznajte više u Centru za pomoć</translation> <translation id="763165478673169849">Vreme poslednjeg resetovanja</translation> +<translation id="7633068090678117093">Slika u pozadini</translation> <translation id="7648838807254605802">Veliko HTTPS kašnjenje</translation> <translation id="765159867434478292">Podeli</translation> <translation id="7656388927906093505">Uređaj je miš.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Relevantna aplikacija</translation> <translation id="8930622219860340959">Bežično</translation> <translation id="8936793075252196307">IP adresa klijenta</translation> +<translation id="8944651180182756621">Boja pokretača</translation> <translation id="894617464444543719">Uređaj je telefon.</translation> <translation id="8957423540740801332">desno</translation> <translation id="8968751544471797276">Brzina punjenja</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Pokreni test memorije</translation> <translation id="9161276708550942948">razmak</translation> <translation id="9173638680043580060">Preostalo je manje od minuta</translation> +<translation id="9174334653006917325">Boja korisničkog interfejsa</translation> <translation id="917720651393141712">Testiraj</translation> <translation id="9188992814426075118">Tastatura može automatski da se podudara sa pozadinom</translation> <translation id="9189000703457422362">Povezivanje sa ovom mrežom nije uspelo pomoću automatski otkrivenih naziva pristupne tačke. Zatražite više informacija od mobilnog operatera.</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index dc059c8..58d4955 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">Онемогућите тамну тему</translation> <translation id="1807246157184219062">Светлa</translation> <translation id="1827738518074806965">Ликовна галерија</translation> +<translation id="1836553715834333258">Боја система</translation> <translation id="1838374766361614909">Обришите претрагу</translation> +<translation id="1840474674287087346">Боја радне површине</translation> <translation id="1851218745569890714">Видео конференције</translation> <translation id="1852934301711881861">Инсталирај Chrome OS Flex</translation> <translation id="1856388568474281774">Стрелица надоле</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">Скенирај у:</translation> <translation id="4479639480957787382">Етернет</translation> <translation id="4483049906298469269">Пинговање мрежног пролаза који није подразумеван није успело</translation> +<translation id="4500966230243561393">Боја интерфејса</translation> <translation id="4503223151711056411">Стрелица налево</translation> <translation id="4507392511610824664">повећајте осветљеност</translation> <translation id="4511264077854731334">Портал</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">Заустави тест</translation> <translation id="5017508259293544172">LEAP</translation> <translation id="5019310272469539976">Када је екран неактиван, приказују се слике, време, временска прогноза и информације о медијском садржају.</translation> +<translation id="5035083460461104704">Боја теме</translation> <translation id="5038292761217083259">вишебојна тастатура</translation> <translation id="5039804452771397117">Дозволи</translation> <translation id="5049856988445523908">SIM је закључан (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">Неутрално</translation> <translation id="7620771111601174153">Сазнајте више у Центру за помоћ</translation> <translation id="763165478673169849">Време последњег ресетовања</translation> +<translation id="7633068090678117093">Слика у позадини</translation> <translation id="7648838807254605802">Велико HTTPS кашњење</translation> <translation id="765159867434478292">Подели</translation> <translation id="7656388927906093505">Уређај је миш.</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">Релевантна апликација</translation> <translation id="8930622219860340959">Бежично</translation> <translation id="8936793075252196307">IP адреса клијента</translation> +<translation id="8944651180182756621">Боја покретача</translation> <translation id="894617464444543719">Уређај је телефон.</translation> <translation id="8957423540740801332">десно</translation> <translation id="8968751544471797276">Брзина пуњења</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">Покрени тест меморије</translation> <translation id="9161276708550942948">размак</translation> <translation id="9173638680043580060">Преостало је мање од минута</translation> +<translation id="9174334653006917325">Боја корисничког интерфејса</translation> <translation id="917720651393141712">Тестирај</translation> <translation id="9188992814426075118">Тастатура може аутоматски да се подудара са позадином</translation> <translation id="9189000703457422362">Повезивање са овом мрежом није успело помоћу аутоматски откривених назива приступне тачке. Затражите више информација од мобилног оператера.</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index 571ca54a..8d959d1 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -118,7 +118,9 @@ <translation id="1801418420130173017">گہری تھیم غیر فعال کریں</translation> <translation id="1807246157184219062">روشنی</translation> <translation id="1827738518074806965">آرٹ گیلری</translation> +<translation id="1836553715834333258">سسٹم کا رنگ</translation> <translation id="1838374766361614909">تلاش صاف کریں</translation> +<translation id="1840474674287087346">ڈیسک ٹاپ کا رنگ</translation> <translation id="1851218745569890714">ویڈیو کانفرنسنگ</translation> <translation id="1852934301711881861">ChromeOS Flex انسٹال کریں</translation> <translation id="1856388568474281774">نیچے تیر کا نشان</translation> @@ -421,6 +423,7 @@ <translation id="4454245904991689773">اس میں اسکین کریں</translation> <translation id="4479639480957787382">ایتھرنیٹ</translation> <translation id="4483049906298469269">غیر ڈیفالٹ نیٹ ورک گیٹ وے کو پنگ کرنے میں ناکام</translation> +<translation id="4500966230243561393">انٹرفیس کا رنگ</translation> <translation id="4503223151711056411">بائیں تیر کا نشان</translation> <translation id="4507392511610824664">چمک بڑھائیں</translation> <translation id="4511264077854731334">پورٹل</translation> @@ -499,6 +502,7 @@ <translation id="500920857929044050">ٹیسٹ روکیں</translation> <translation id="5017508259293544172">لیپ</translation> <translation id="5019310272469539976">آپ کی اسکرین کے معطل ہونے پر، تصاویر، وقت، موسم اور میڈیا کی معلومات دکھائیں۔</translation> +<translation id="5035083460461104704">تھیم کا رنگ</translation> <translation id="5038292761217083259">متعدد رنگوں والا کی بورڈ</translation> <translation id="5039804452771397117">اجازت دیں</translation> <translation id="5049856988445523908">SIM مقفل ہو گیا (<ph name="LOCK_TYPE" />)</translation> @@ -814,6 +818,7 @@ <translation id="7618774594543487847">نیوٹرل</translation> <translation id="7620771111601174153">مرکز امداد میں مزید جانیں</translation> <translation id="763165478673169849">آخری ری سیٹ کرنے کا وقت</translation> +<translation id="7633068090678117093">پس منظر کی تصویر</translation> <translation id="7648838807254605802">زیادہ HTTPS تاخیر</translation> <translation id="765159867434478292">تقسیم کریں</translation> <translation id="7656388927906093505">آلہ ایک ماؤس ہے۔</translation> @@ -979,6 +984,7 @@ <translation id="8930521118335213258">پیئر</translation> <translation id="8930622219860340959">وائرلیس</translation> <translation id="8936793075252196307">کلائنٹ IP پتہ</translation> +<translation id="8944651180182756621">لانچر کا رنگ</translation> <translation id="894617464444543719">آلہ ایک فون ہے۔</translation> <translation id="8957423540740801332">دایاں</translation> <translation id="8968751544471797276">چارج ہونے کی شرح</translation> @@ -1012,6 +1018,7 @@ <translation id="9149391708638971077">میموری ٹیسٹ چلائیں</translation> <translation id="9161276708550942948">اسپیس</translation> <translation id="9173638680043580060">ایک منٹ سے کم باقی ہے</translation> +<translation id="9174334653006917325">UI کا رنگ</translation> <translation id="917720651393141712">ٹیسٹ</translation> <translation id="9188992814426075118">آپ کا کی بورڈ خودکار طور پر آپ کے وال پیپر سے مماثل ہو سکتا ہے</translation> <translation id="9189000703457422362">خودکار طور پر پتہ چلنے والے APNs کا استعمال کر کے اس نیٹ ورک سے منسلک نہیں کر سکتے۔ مزید معلومات کے لیے اپنے موبائل کیریئر سے رابطہ کریں۔</translation>
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 1096aab..e0479a1 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -20,6 +20,7 @@ #include "base/debug/crash_logging.h" #include "base/i18n/case_conversion.h" #include "base/logging.h" +#include "base/notreached.h" #include "base/numerics/safe_conversions.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" @@ -288,6 +289,7 @@ constexpr base::StringPiece kMerchantDomain = "merchant_domain"; constexpr base::StringPiece kContactInfoTable = "contact_info"; +constexpr base::StringPiece kLocalAddressesTable = "local_addresses"; // kGuid = "guid" // kUseCount = "use_count" // kUseDate = "use_date" @@ -299,6 +301,8 @@ constexpr base::StringPiece kContactInfoTypeTokensTable = "contact_info_type_tokens"; +constexpr base::StringPiece kLocalAddressesTypeTokensTable = + "local_addresses_type_tokens"; // kGuid = "guid" constexpr base::StringPiece kType = "type"; // kValue = "value" @@ -563,31 +567,9 @@ return data.substr(0, AutofillTable::kMaxDataLength); } -void BindAutofillProfileToStatement(const AutofillProfile& profile, - const base::Time& modification_date, - sql::Statement* s) { - DCHECK(base::Uuid::ParseCaseInsensitive(profile.guid()).is_valid()); - int index = 0; - s->BindString(index++, profile.guid()); - - for (ServerFieldType type : - {COMPANY_NAME, ADDRESS_HOME_STREET_ADDRESS, - ADDRESS_HOME_DEPENDENT_LOCALITY, ADDRESS_HOME_CITY, ADDRESS_HOME_STATE, - ADDRESS_HOME_ZIP, ADDRESS_HOME_SORTING_CODE, ADDRESS_HOME_COUNTRY}) { - s->BindString16(index++, Truncate(profile.GetRawInfo(type))); - } - s->BindInt64(index++, profile.use_count()); - s->BindInt64(index++, profile.use_date().ToTimeT()); - s->BindInt64(index++, modification_date.ToTimeT()); - s->BindString(index++, ""); // Origin is deprecated - s->BindString(index++, profile.language_code()); - s->BindString(index++, profile.profile_label()); - s->BindBool(index++, profile.disallow_settings_visible_updates()); -} - void AddAutofillProfileDetailsFromStatement(sql::Statement& s, AutofillProfile* profile) { - int index = 1; // 0 is for the origin. + int index = 0; for (ServerFieldType type : {COMPANY_NAME, ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_DEPENDENT_LOCALITY, ADDRESS_HOME_CITY, ADDRESS_HOME_STATE, @@ -725,80 +707,11 @@ return iban; } -bool AddAutofillProfileNames(const AutofillProfile& profile, - sql::Database* db) { - sql::Statement s; - InsertBuilder( - db, s, kAutofillProfileNamesTable, - {kGuid, kHonorificPrefix, kHonorificPrefixStatus, kFirstName, - kFirstNameStatus, kMiddleName, kMiddleNameStatus, kFirstLastName, - kFirstLastNameStatus, kConjunctionLastName, kConjunctionLastNameStatus, - kSecondLastName, kSecondLastNameStatus, kLastName, kLastNameStatus, - kFullName, kFullNameStatus, kFullNameWithHonorificPrefix, - kFullNameWithHonorificPrefixStatus}); - s.BindString(0, profile.guid()); - int index = 1; - for (ServerFieldType type : - {NAME_HONORIFIC_PREFIX, NAME_FIRST, NAME_MIDDLE, NAME_LAST_FIRST, - NAME_LAST_CONJUNCTION, NAME_LAST_SECOND, NAME_LAST, NAME_FULL, - NAME_FULL_WITH_HONORIFIC_PREFIX}) { - s.BindString16(index++, profile.GetRawInfo(type)); - s.BindInt(index++, profile.GetVerificationStatusInt(type)); - } - return s.Run(); -} - -bool AddAutofillProfileAddresses(const AutofillProfile& profile, - sql::Database* db) { - sql::Statement s; - InsertBuilder(db, s, kAutofillProfileAddressesTable, - {kGuid, - kStreetAddress, - kStreetAddressStatus, - kStreetName, - kStreetNameStatus, - kDependentStreetName, - kDependentStreetNameStatus, - kHouseNumber, - kHouseNumberStatus, - kSubpremise, - kSubpremiseStatus, - kPremiseName, - kPremiseNameStatus, - kDependentLocality, - kDependentLocalityStatus, - kCity, - kCityStatus, - kState, - kStateStatus, - kZipCode, - kZipCodeStatus, - kSortingCode, - kSortingCodeStatus, - kCountryCode, - kCountryCodeStatus, - kApartmentNumber, - kApartmentNumberStatus, - kFloor, - kFloorStatus}); - - s.BindString(0, profile.guid()); - int index = 1; - for (ServerFieldType type : - {ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_STREET_NAME, - ADDRESS_HOME_DEPENDENT_STREET_NAME, ADDRESS_HOME_HOUSE_NUMBER, - ADDRESS_HOME_SUBPREMISE, ADDRESS_HOME_PREMISE_NAME, - ADDRESS_HOME_DEPENDENT_LOCALITY, ADDRESS_HOME_CITY, ADDRESS_HOME_STATE, - ADDRESS_HOME_ZIP, ADDRESS_HOME_SORTING_CODE, ADDRESS_HOME_COUNTRY, - ADDRESS_HOME_APT_NUM, ADDRESS_HOME_FLOOR}) { - s.BindString16(index++, profile.GetRawInfo(type)); - s.BindInt(index++, profile.GetVerificationStatusInt(type)); - } - return s.Run(); -} - bool AddAutofillProfileNamesToProfile(sql::Database* db, AutofillProfile* profile) { + if (!db->DoesTableExist(kAutofillProfileNamesTable)) { + return false; + } sql::Statement s; if (SelectByGuid( db, s, kAutofillProfileNamesTable, @@ -826,6 +739,9 @@ bool AddAutofillProfileAddressesToProfile(sql::Database* db, AutofillProfile* profile) { + if (!db->DoesTableExist(kAutofillProfileAddressesTable)) { + return false; + } sql::Statement s; if (SelectByGuid(db, s, kAutofillProfileAddressesTable, {kGuid, @@ -913,6 +829,9 @@ bool AddAutofillProfileEmailsToProfile(sql::Database* db, AutofillProfile* profile) { + if (!db->DoesTableExist(kAutofillProfileEmailsTable)) { + return false; + } // TODO(estade): update schema so that multiple emails are not associated // per unique profile guid. Please refer https://crbug.com/497934. sql::Statement s; @@ -926,6 +845,9 @@ bool AddAutofillProfilePhonesToProfile(sql::Database* db, AutofillProfile* profile) { + if (!db->DoesTableExist(kAutofillProfilePhonesTable)) { + return false; + } // TODO(estade): update schema so that multiple phone numbers are not // associated per unique profile guid. Please refer // https://crbug.com/497934. @@ -940,6 +862,9 @@ bool AddAutofillProfileBirthdateToProfile(sql::Database* db, AutofillProfile* profile) { + if (!db->DoesTableExist(kAutofillProfileBirthdatesTable)) { + return false; + } sql::Statement s; if (SelectByGuid(db, s, kAutofillProfileBirthdatesTable, {kGuid, kDay, kMonth, kYear}, profile->guid())) { @@ -951,59 +876,6 @@ return s.Succeeded(); } -bool AddAutofillProfileEmails(const AutofillProfile& profile, - sql::Database* db) { - // Add the new email. - sql::Statement s; - InsertBuilder(db, s, kAutofillProfileEmailsTable, {kGuid, kEmail}); - s.BindString(0, profile.guid()); - s.BindString16(1, profile.GetRawInfo(EMAIL_ADDRESS)); - - return s.Run(); -} - -bool AddAutofillProfilePhones(const AutofillProfile& profile, - sql::Database* db) { - // Add the new number. - sql::Statement s; - InsertBuilder(db, s, kAutofillProfilePhonesTable, {kGuid, kNumber}); - s.BindString(0, profile.guid()); - s.BindString16(1, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); - - return s.Run(); -} - -bool AddAutofillProfileBirthdate(const AutofillProfile& profile, - sql::Database* db) { - // Add the new birthdate. - sql::Statement s; - InsertBuilder(db, s, kAutofillProfileBirthdatesTable, - {kGuid, kDay, kMonth, kYear}); - s.BindString(0, profile.guid()); - s.BindInt(1, profile.GetRawInfoAsInt(BIRTHDATE_DAY)); - s.BindInt(2, profile.GetRawInfoAsInt(BIRTHDATE_MONTH)); - s.BindInt(3, profile.GetRawInfoAsInt(BIRTHDATE_4_DIGIT_YEAR)); - - return s.Run(); -} - -bool AddAutofillProfilePieces(const AutofillProfile& profile, - sql::Database* db) { - return AddAutofillProfileNames(profile, db) && - AddAutofillProfileEmails(profile, db) && - AddAutofillProfilePhones(profile, db) && - AddAutofillProfileAddresses(profile, db) && - AddAutofillProfileBirthdate(profile, db); -} - -bool RemoveAutofillProfilePieces(const std::string& guid, sql::Database* db) { - return DeleteWhereColumnEq(db, kAutofillProfileNamesTable, kGuid, guid) && - DeleteWhereColumnEq(db, kAutofillProfileEmailsTable, kGuid, guid) && - DeleteWhereColumnEq(db, kAutofillProfilePhonesTable, kGuid, guid) && - DeleteWhereColumnEq(db, kAutofillProfileAddressesTable, kGuid, guid) && - DeleteWhereColumnEq(db, kAutofillProfileBirthdatesTable, kGuid, guid); -} - WebDatabaseTable::TypeKey GetKey() { // We just need a unique constant. Use the address of a static that // COMDAT folding won't touch in an optimizing linker. @@ -1088,10 +960,9 @@ // `s`, in the order the columns are defined in the header file. // Instead of `profile.modification_date()`, `modification_date` is used. This // makes the function useful for updates as well. -void BindAutofillProfileToContactInfoStatement( - const AutofillProfile& profile, - const base::Time& modification_date, - sql::Statement& s) { +void BindAutofillProfileToStatement(const AutofillProfile& profile, + const base::Time& modification_date, + sql::Statement& s) { int index = 0; s.BindString(index++, profile.guid()); s.BindInt64(index++, profile.use_count()); @@ -1103,15 +974,40 @@ s.BindInt(index++, profile.last_modifier_id()); } -// Inserts `profile` into `kContactInfoTable` and `kContactInfoTypeTokensTable`. -bool AddAutofillProfileToContactInfoTable(sql::Database* db, - const AutofillProfile& profile, - const base::Time& modification_date) { +// Local and account profiles are stored in different tables with the same +// layout. One table contains profile-level metadata, while another table +// contains the values for every relevant ServerFieldType. The following two +// functions are used to map from a profile's `source` to the correct table. +base::StringPiece GetProfileMetadataTable(AutofillProfile::Source source) { + switch (source) { + case AutofillProfile::Source::kLocalOrSyncable: + return kLocalAddressesTable; + case AutofillProfile::Source::kAccount: + return kContactInfoTable; + } + NOTREACHED_NORETURN(); +} +base::StringPiece GetProfileTypeTokensTable(AutofillProfile::Source source) { + switch (source) { + case AutofillProfile::Source::kLocalOrSyncable: + return kLocalAddressesTypeTokensTable; + case AutofillProfile::Source::kAccount: + return kContactInfoTypeTokensTable; + } + NOTREACHED_NORETURN(); +} + +// Inserts `profile` into `GetProfileMetadataTable()` and +// `GetProfileTypeTokensTable()`, depending on the profile's source. +// Parameterized by `modification_date` to be reusable for updates. +bool AddAutofillProfileToTable(sql::Database* db, + const AutofillProfile& profile, + const base::Time& modification_date) { sql::Statement s; - InsertBuilder(db, s, kContactInfoTable, + InsertBuilder(db, s, GetProfileMetadataTable(profile.source()), {kGuid, kUseCount, kUseDate, kDateModified, kLanguageCode, kLabel, kInitialCreatorId, kLastModifierId}); - BindAutofillProfileToContactInfoStatement(profile, modification_date, s); + BindAutofillProfileToStatement(profile, modification_date, s); if (!s.Run()) return false; for (ServerFieldType type : GetStoredContactInfoTypes()) { @@ -1125,7 +1021,7 @@ type == ADDRESS_HOME_BETWEEN_STREETS) { continue; } - InsertBuilder(db, s, kContactInfoTypeTokensTable, + InsertBuilder(db, s, GetProfileTypeTokensTable(profile.source()), {kGuid, kType, kValue, kVerificationStatus}); s.BindString(0, profile.guid()); s.BindInt(1, type); @@ -1137,45 +1033,6 @@ return true; } -// Reads the profile with `guid` from `kContactInfoTable`. The profile's source -// is set to `kAccount`. -std::unique_ptr<AutofillProfile> GetAutofillProfileFromContactInfoTable( - sql::Database* db, - const std::string& guid) { - sql::Statement s; - if (!SelectByGuid(db, s, kContactInfoTable, - {kUseCount, kUseDate, kDateModified, kLanguageCode, kLabel, - kInitialCreatorId, kLastModifierId}, - guid)) { - return nullptr; - } - auto profile = std::make_unique<AutofillProfile>( - guid, AutofillProfile::Source::kAccount); - int index = 0; - profile->set_use_count(s.ColumnInt64(index++)); - profile->set_use_date(base::Time::FromTimeT(s.ColumnInt64(index++))); - profile->set_modification_date(base::Time::FromTimeT(s.ColumnInt64(index++))); - profile->set_language_code(s.ColumnString(index++)); - profile->set_profile_label(s.ColumnString(index++)); - profile->set_initial_creator_id(s.ColumnInt(index++)); - profile->set_last_modifier_id(s.ColumnInt(index++)); - - if (!SelectByGuid(db, s, kContactInfoTypeTokensTable, - {kType, kValue, kVerificationStatus}, guid)) { - return nullptr; - } - // As `SelectByGuid()` already calls `s.Step()`, do-while is used here. - do { - ServerFieldType type = ToSafeServerFieldType(s.ColumnInt(0), UNKNOWN_TYPE); - DCHECK(type != UNKNOWN_TYPE); - profile->SetRawInfoWithVerificationStatusInt(type, s.ColumnString16(1), - s.ColumnInt(2)); - } while (s.Step()); - - profile->FinalizeAfterImport(); - return profile; -} - } // namespace // static @@ -1199,9 +1056,9 @@ bool AutofillTable::CreateTablesIfNecessary() { return InitMainTable() && InitCreditCardsTable() && InitIBANsTable() && - InitProfilesTable() && InitProfileAddressesTable() && - InitProfileNamesTable() && InitProfileEmailsTable() && - InitProfilePhonesTable() && InitProfileBirthdatesTable() && + InitLegacyProfilesTable() && InitLegacyProfileAddressesTable() && + InitLegacyProfileNamesTable() && InitLegacyProfileEmailsTable() && + InitLegacyProfilePhonesTable() && InitLegacyProfileBirthdatesTable() && InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && InitServerCardMetadataTable() && InitServerAddressesTable() && InitServerAddressMetadataTable() && InitAutofillSyncMetadataTable() && @@ -1209,7 +1066,11 @@ InitPaymentsUPIVPATable() && InitServerCreditCardCloudTokenDataTable() && InitOfferDataTable() && InitOfferEligibleInstrumentTable() && InitOfferMerchantDomainTable() && - InitContactInfoTable() && InitContactInfoTypeTokensTable() && + InitProfileMetadataTable(AutofillProfile::Source::kAccount) && + InitProfileTypeTokensTable(AutofillProfile::Source::kAccount) && + InitProfileMetadataTable(AutofillProfile::Source::kLocalOrSyncable) && + InitProfileTypeTokensTable( + AutofillProfile::Source::kLocalOrSyncable) && InitVirtualCardUsageDataTable(); } @@ -1303,6 +1164,12 @@ case 111: *update_compatible_version = false; return MigrateToVersion111AddVirtualCardEnrollmentTypeColumn(); + case 112: // AutofillTable didn't change in WebDatabase version 112. + *update_compatible_version = false; + return true; + case 113: + *update_compatible_version = false; + return MigrateToVersion113MigrateLocalAddressProfilesToNewTable(); } return true; } @@ -1639,27 +1506,11 @@ } bool AutofillTable::AddAutofillProfile(const AutofillProfile& profile) { - if (profile.source() == AutofillProfile::Source::kAccount) { - sql::Transaction transaction(db_); - return transaction.Begin() && - AddAutofillProfileToContactInfoTable( - db_, profile, /*modification_date=*/AutofillClock::Now()) && - transaction.Commit(); - } - - DCHECK(profile.source() == AutofillProfile::Source::kLocalOrSyncable); - sql::Statement s; - InsertBuilder( - db_, s, kAutofillProfilesTable, - {kGuid, kCompanyName, kStreetAddress, kDependentLocality, kCity, kState, - kZipcode, kSortingCode, kCountryCode, kUseCount, kUseDate, kDateModified, - kOrigin, kLanguageCode, kLabel, kDisallowSettingsVisibleUpdates}); - BindAutofillProfileToStatement(profile, AutofillClock::Now(), &s); - - if (!s.Run()) - return false; - - return AddAutofillProfilePieces(profile, db_); + sql::Transaction transaction(db_); + return transaction.Begin() && + AddAutofillProfileToTable( + db_, profile, /*modification_date=*/AutofillClock::Now()) && + transaction.Commit(); } bool AutofillTable::UpdateAutofillProfile(const AutofillProfile& profile) { @@ -1674,57 +1525,30 @@ ? AutofillClock::Now() : old_profile->modification_date(); - if (profile.source() == AutofillProfile::Source::kAccount) { - // Implementing an update as remove + add has multiple advantages: - // - Prevents outdated (ServerFieldType, value) pairs from remaining in the - // `kContactInfoTypeTokensTables`, in case field types are removed. - // - Simpler code. - // The possible downside is performance. This is not an issue, as updates - // happen rarely and asynchronously. - sql::Transaction transaction(db_); - return transaction.Begin() && - RemoveAutofillProfile(profile.guid(), profile.source()) && - AddAutofillProfileToContactInfoTable(db_, profile, - new_modification_date) && - transaction.Commit(); - } - - DCHECK(profile.source() == AutofillProfile::Source::kLocalOrSyncable); - sql::Statement s; - UpdateBuilder( - db_, s, kAutofillProfilesTable, - {kGuid, kCompanyName, kStreetAddress, kDependentLocality, kCity, kState, - kZipcode, kSortingCode, kCountryCode, kUseCount, kUseDate, kDateModified, - kOrigin, kLanguageCode, kLabel, kDisallowSettingsVisibleUpdates}, - "guid = ?1"); - BindAutofillProfileToStatement(profile, new_modification_date, &s); - - bool result = s.Run(); - DCHECK_GT(db_->GetLastChangeCount(), 0); - if (!result) - return result; - - // Remove the old names, emails, and phone numbers. - if (!RemoveAutofillProfilePieces(profile.guid(), db_)) - return false; - - return AddAutofillProfilePieces(profile, db_); + // Implementing an update as remove + add has multiple advantages: + // - Prevents outdated (ServerFieldType, value) pairs from remaining in the + // `GetProfileTypeTokensTable(profile)`, in case field types are removed. + // - Simpler code. + // The possible downside is performance. This is not an issue, as updates + // happen rarely and asynchronously. + sql::Transaction transaction(db_); + return transaction.Begin() && + RemoveAutofillProfile(profile.guid(), profile.source()) && + AddAutofillProfileToTable(db_, profile, new_modification_date) && + transaction.Commit(); } bool AutofillTable::RemoveAutofillProfile( const std::string& guid, AutofillProfile::Source profile_source) { DCHECK(base::Uuid::ParseCaseInsensitive(guid).is_valid()); - if (profile_source == AutofillProfile::Source::kAccount) { - sql::Transaction transaction(db_); - return transaction.Begin() && - DeleteWhereColumnEq(db_, kContactInfoTable, kGuid, guid) && - DeleteWhereColumnEq(db_, kContactInfoTypeTokensTable, kGuid, guid) && - transaction.Commit(); - } - DCHECK(profile_source == AutofillProfile::Source::kLocalOrSyncable); - return DeleteWhereColumnEq(db_, kAutofillProfilesTable, kGuid, guid) && - RemoveAutofillProfilePieces(guid, db_); + sql::Transaction transaction(db_); + return transaction.Begin() && + DeleteWhereColumnEq(db_, GetProfileMetadataTable(profile_source), + kGuid, guid) && + DeleteWhereColumnEq(db_, GetProfileTypeTokensTable(profile_source), + kGuid, guid) && + transaction.Commit(); } bool AutofillTable::RemoveAllAutofillProfiles( @@ -1737,17 +1561,70 @@ std::unique_ptr<AutofillProfile> AutofillTable::GetAutofillProfile( const std::string& guid, - AutofillProfile::Source profile_source) { + AutofillProfile::Source profile_source) const { DCHECK(base::Uuid::ParseCaseInsensitive(guid).is_valid()); - if (profile_source == AutofillProfile::Source::kAccount) - return GetAutofillProfileFromContactInfoTable(db_, guid); + sql::Statement s; + if (!SelectByGuid(db_, s, GetProfileMetadataTable(profile_source), + {kUseCount, kUseDate, kDateModified, kLanguageCode, kLabel, + kInitialCreatorId, kLastModifierId}, + guid)) { + return nullptr; + } + auto profile = std::make_unique<AutofillProfile>(guid, profile_source); + int index = 0; + profile->set_use_count(s.ColumnInt64(index++)); + profile->set_use_date(base::Time::FromTimeT(s.ColumnInt64(index++))); + profile->set_modification_date(base::Time::FromTimeT(s.ColumnInt64(index++))); + profile->set_language_code(s.ColumnString(index++)); + profile->set_profile_label(s.ColumnString(index++)); + profile->set_initial_creator_id(s.ColumnInt(index++)); + profile->set_last_modifier_id(s.ColumnInt(index++)); - DCHECK(profile_source == AutofillProfile::Source::kLocalOrSyncable); + if (!SelectByGuid(db_, s, GetProfileTypeTokensTable(profile_source), + {kType, kValue, kVerificationStatus}, guid)) { + return nullptr; + } + // As `SelectByGuid()` already calls `s.Step()`, do-while is used here. + do { + ServerFieldType type = ToSafeServerFieldType(s.ColumnInt(0), UNKNOWN_TYPE); + DCHECK(type != UNKNOWN_TYPE); + profile->SetRawInfoWithVerificationStatusInt(type, s.ColumnString16(1), + s.ColumnInt(2)); + } while (s.Step()); + + profile->FinalizeAfterImport(); + return profile; +} + +bool AutofillTable::GetAutofillProfiles( + std::vector<std::unique_ptr<AutofillProfile>>* profiles, + AutofillProfile::Source profile_source) const { + CHECK(profiles); + profiles->clear(); + + sql::Statement s; + SelectBuilder(db_, s, GetProfileMetadataTable(profile_source), {kGuid}); + while (s.Step()) { + std::string guid = s.ColumnString(0); + std::unique_ptr<AutofillProfile> profile = + GetAutofillProfile(guid, profile_source); + if (!profile) { + continue; + } + profiles->push_back(std::move(profile)); + } + + return s.Succeeded(); +} + +std::unique_ptr<AutofillProfile> +AutofillTable::GetAutofillProfileFromLegacyTable( + const std::string& guid) const { sql::Statement s; if (!SelectByGuid(db_, s, kAutofillProfilesTable, - {kOrigin, kCompanyName, kStreetAddress, kDependentLocality, - kCity, kState, kZipcode, kSortingCode, kCountryCode, - kUseCount, kUseDate, kDateModified, kLanguageCode, kLabel, + {kCompanyName, kStreetAddress, kDependentLocality, kCity, + kState, kZipcode, kSortingCode, kCountryCode, kUseCount, + kUseDate, kDateModified, kLanguageCode, kLabel, kDisallowSettingsVisibleUpdates}, guid)) { return nullptr; @@ -1785,23 +1662,20 @@ return profile; } -bool AutofillTable::GetAutofillProfiles( - std::vector<std::unique_ptr<AutofillProfile>>* profiles, - AutofillProfile::Source profile_source) { +// TODO(crbug.com/1443393): This function's implementation is very similar to +// `GetAutofillProfiles()`. Simplify somehow. +bool AutofillTable::GetAutofillProfilesFromLegacyTable( + std::vector<std::unique_ptr<AutofillProfile>>* profiles) const { DCHECK(profiles); profiles->clear(); sql::Statement s; - SelectBuilder(db_, s, - profile_source == AutofillProfile::Source::kAccount - ? kContactInfoTable - : kAutofillProfilesTable, - {kGuid}); + SelectBuilder(db_, s, kAutofillProfilesTable, {kGuid}); while (s.Step()) { std::string guid = s.ColumnString(0); std::unique_ptr<AutofillProfile> profile = - GetAutofillProfile(guid, profile_source); + GetAutofillProfileFromLegacyTable(guid); if (!profile) continue; profiles->push_back(std::move(profile)); @@ -2814,8 +2688,10 @@ // Remember Autofill profiles in the time range. sql::Statement s_profiles_get; - SelectBetween(db_, s_profiles_get, kAutofillProfilesTable, {kGuid}, - kDateModified, delete_begin_t, delete_end_t); + SelectBetween( + db_, s_profiles_get, + GetProfileMetadataTable(AutofillProfile::Source::kLocalOrSyncable), + {kGuid}, kDateModified, delete_begin_t, delete_end_t); profiles->clear(); while (s_profiles_get.Step()) { @@ -2829,21 +2705,13 @@ if (!s_profiles_get.Succeeded()) return false; - // Remove the profile pieces. - for (const std::unique_ptr<AutofillProfile>& profile : *profiles) { - if (!RemoveAutofillProfilePieces(profile->guid(), db_)) - return false; - } - // Remove Autofill profiles in the time range. - sql::Statement s_profiles; - DeleteBuilder(db_, s_profiles, kAutofillProfilesTable, - "date_modified >= ? AND date_modified < ?"); - s_profiles.BindInt64(0, delete_begin_t); - s_profiles.BindInt64(1, delete_end_t); - - if (!s_profiles.Run()) - return false; + for (const std::unique_ptr<AutofillProfile>& profile : *profiles) { + if (!RemoveAutofillProfile(profile->guid(), + AutofillProfile::Source::kLocalOrSyncable)) { + return false; + } + } // Remember Autofill credit cards in the time range. sql::Statement s_credit_cards_get; @@ -2916,12 +2784,8 @@ } bool AutofillTable::ClearAutofillProfiles() { - return Delete(db_, kAutofillProfilesTable) && - Delete(db_, kAutofillProfileNamesTable) && - Delete(db_, kAutofillProfileEmailsTable) && - Delete(db_, kAutofillProfileAddressesTable) && - Delete(db_, kAutofillProfilePhonesTable) && - Delete(db_, kAutofillProfileBirthdatesTable); + return Delete(db_, kLocalAddressesTable) && + Delete(db_, kLocalAddressesTypeTokensTable); } bool AutofillTable::ClearCreditCards() { @@ -3010,34 +2874,6 @@ return s.Run(); } -bool AutofillTable::RemoveOrphanAutofillTableRows() { - // Get all the orphan guids. - std::set<std::string> orphan_guids; - sql::Statement s_orphan_profile_pieces_get(db_->GetUniqueStatement( - "SELECT guid FROM (SELECT guid FROM autofill_profile_names UNION SELECT " - "guid FROM autofill_profile_emails UNION SELECT guid FROM " - "autofill_profile_phones UNION SELECT guid FROM " - "autofill_profile_addresses UNION SELECT guid FROM " - "autofill_profile_birthdates) " - "WHERE guid NOT IN (SELECT guid FROM " - "autofill_profiles)")); - - // Put the orphan guids in a set. - while (s_orphan_profile_pieces_get.Step()) - orphan_guids.insert(s_orphan_profile_pieces_get.ColumnString(0)); - - if (!s_orphan_profile_pieces_get.Succeeded()) - return false; - - // Remove the profile pieces for the orphan guids. - for (const std::string& guid : orphan_guids) { - if (!RemoveAutofillProfilePieces(guid, db_)) - return false; - } - - return true; -} - bool AutofillTable::MigrateToVersion83RemoveServerCardTypeColumn() { // Sqlite does not support "alter table drop column" syntax, so it has be done // manually. @@ -3137,7 +2973,7 @@ bool AutofillTable::MigrateToVersion90AddNewStructuredAddressColumns() { if (!db_->DoesTableExist("autofill_profile_addresses")) - InitProfileAddressesTable(); + InitLegacyProfileAddressesTable(); for (base::StringPiece column : {kDependentLocality, kCity, kState, kZipCode, kSortingCode, kCountryCode}) { @@ -3162,7 +2998,7 @@ bool AutofillTable::MigrateToVersion91AddMoreStructuredAddressColumns() { if (!db_->DoesTableExist(kAutofillProfileAddressesTable)) - InitProfileAddressesTable(); + InitLegacyProfileAddressesTable(); for (base::StringPiece column : {kApartmentNumber, kFloor}) { if (!AddColumnIfNotExists(db_, kAutofillProfileAddressesTable, column, @@ -3184,7 +3020,7 @@ bool AutofillTable::MigrateToVersion93AddAutofillProfileLabelColumn() { if (!db_->DoesTableExist(kAutofillProfilesTable)) - InitProfileAddressesTable(); + InitLegacyProfileAddressesTable(); return AddColumnIfNotExists(db_, kAutofillProfilesTable, kLabel, "VARCHAR"); } @@ -3192,7 +3028,7 @@ bool AutofillTable:: MigrateToVersion96AddAutofillProfileDisallowConfirmableMergesColumn() { if (!db_->DoesTableExist(kAutofillProfilesTable)) - InitProfileAddressesTable(); + InitLegacyProfileAddressesTable(); return AddColumnIfNotExists(db_, kAutofillProfilesTable, kDisallowSettingsVisibleUpdates, @@ -3424,6 +3260,49 @@ kVirtualCardEnrollmentType, "INTEGER DEFAULT 0"); } +bool AutofillTable::MigrateToVersion113MigrateLocalAddressProfilesToNewTable() { + sql::Transaction transaction(db_); + if (!transaction.Begin() || + !CreateTableIfNotExists(db_, kLocalAddressesTable, + {{kGuid, "VARCHAR PRIMARY KEY"}, + {kUseCount, "INTEGER NOT NULL DEFAULT 0"}, + {kUseDate, "INTEGER NOT NULL DEFAULT 0"}, + {kDateModified, "INTEGER NOT NULL DEFAULT 0"}, + {kLanguageCode, "VARCHAR"}, + {kLabel, "VARCHAR"}, + {kInitialCreatorId, "INTEGER DEFAULT 0"}, + {kLastModifierId, "INTEGER DEFAULT 0"}}) || + !CreateTableIfNotExists(db_, kLocalAddressesTypeTokensTable, + {{kGuid, "VARCHAR"}, + {kType, "INTEGER"}, + {kValue, "VARCHAR"}, + {kVerificationStatus, "INTEGER DEFAULT 0"}}, + /*composite_primary_key=*/{kGuid, kType})) { + return false; + } + bool success = true; + if (db_->DoesTableExist(kAutofillProfilesTable)) { + std::vector<std::unique_ptr<AutofillProfile>> profiles; + success = GetAutofillProfilesFromLegacyTable(&profiles); + // Migrate profiles to the new tables. Preserve the modification dates. + for (const std::unique_ptr<AutofillProfile>& profile : profiles) { + success = success && AddAutofillProfileToTable( + db_, *profile, profile->modification_date()); + } + } + // Delete all profiles from the legacy tables. + // TODO(crbug.com/1443393): Drop the tables (in a new version). This requires + // adapting several migration unit tests. + for (base::StringPiece deprecated_table : + {kAutofillProfilesTable, kAutofillProfileAddressesTable, + kAutofillProfileNamesTable, kAutofillProfileEmailsTable, + kAutofillProfilePhonesTable, kAutofillProfileBirthdatesTable}) { + success = success && (!db_->DoesTableExist(deprecated_table) || + Delete(db_, deprecated_table)); + } + return success && transaction.Commit(); +} + bool AutofillTable::AddFormFieldValuesTime( const std::vector<FormFieldData>& elements, std::vector<AutofillChange>* changes, @@ -3701,7 +3580,7 @@ {kNickname, "VARCHAR"}}); } -bool AutofillTable::InitProfilesTable() { +bool AutofillTable::InitLegacyProfilesTable() { return CreateTableIfNotExists( db_, kAutofillProfilesTable, {{kGuid, "VARCHAR PRIMARY KEY"}, @@ -3722,7 +3601,7 @@ {kDisallowSettingsVisibleUpdates, "INTEGER NOT NULL DEFAULT 0"}}); } -bool AutofillTable::InitProfileNamesTable() { +bool AutofillTable::InitLegacyProfileNamesTable() { // The default value of 0 corresponds to the verification status // |kNoStatus|. return CreateTableIfNotExists( @@ -3748,7 +3627,7 @@ {kFullNameWithHonorificPrefixStatus, "INTEGER DEFAULT 0"}}); } -bool AutofillTable::InitProfileAddressesTable() { +bool AutofillTable::InitLegacyProfileAddressesTable() { // The default value of 0 corresponds to the verification status // |kNoStatus|. return CreateTableIfNotExists( @@ -3784,17 +3663,17 @@ {kFloorStatus, "INTEGER DEFAULT 0"}}); } -bool AutofillTable::InitProfileEmailsTable() { +bool AutofillTable::InitLegacyProfileEmailsTable() { return CreateTableIfNotExists(db_, kAutofillProfileEmailsTable, {{kGuid, "VARCHAR"}, {kEmail, "VARCHAR"}}); } -bool AutofillTable::InitProfilePhonesTable() { +bool AutofillTable::InitLegacyProfilePhonesTable() { return CreateTableIfNotExists(db_, kAutofillProfilePhonesTable, {{kGuid, "VARCHAR"}, {kNumber, "VARCHAR"}}); } -bool AutofillTable::InitProfileBirthdatesTable() { +bool AutofillTable::InitLegacyProfileBirthdatesTable() { return CreateTableIfNotExists(db_, kAutofillProfileBirthdatesTable, {{kGuid, "VARCHAR"}, {kDay, "INTEGER DEFAULT 0"}, @@ -3921,8 +3800,8 @@ {{kOfferId, "UNSIGNED LONG"}, {kMerchantDomain, "VARCHAR"}}); } -bool AutofillTable::InitContactInfoTable() { - return CreateTableIfNotExists(db_, kContactInfoTable, +bool AutofillTable::InitProfileMetadataTable(AutofillProfile::Source source) { + return CreateTableIfNotExists(db_, GetProfileMetadataTable(source), {{kGuid, "VARCHAR PRIMARY KEY"}, {kUseCount, "INTEGER NOT NULL DEFAULT 0"}, {kUseDate, "INTEGER NOT NULL DEFAULT 0"}, @@ -3933,8 +3812,8 @@ {kLastModifierId, "INTEGER DEFAULT 0"}}); } -bool AutofillTable::InitContactInfoTypeTokensTable() { - return CreateTableIfNotExists(db_, kContactInfoTypeTokensTable, +bool AutofillTable::InitProfileTypeTokensTable(AutofillProfile::Source source) { + return CreateTableIfNotExists(db_, GetProfileTypeTokensTable(source), {{kGuid, "VARCHAR"}, {kType, "INTEGER"}, {kValue, "VARCHAR"},
diff --git a/components/autofill/core/browser/webdata/autofill_table.h b/components/autofill/core/browser/webdata/autofill_table.h index 264bd3d1..48cf4f67 100644 --- a/components/autofill/core/browser/webdata/autofill_table.h +++ b/components/autofill/core/browser/webdata/autofill_table.h
@@ -61,6 +61,7 @@ // count How many times the user has entered the string |value| // in a field of name |name|. // +// DEPRECATED. Use local_addresses instead. // autofill_profiles This table contains Autofill profile data added by the // user with the Autofill dialog. Most of the columns are // standard entries in a contact information form. @@ -102,6 +103,7 @@ // If true, a profile does not qualify to get merged with // a profile observed in a form submission. // +// DEPRECATED. See autofill_profiles. // autofill_profile_addresses // guid The guid string that identifies the profile to which // the name belongs. @@ -151,6 +153,7 @@ // value was observed in a form submission, or even // validated by the user in the settings. // +// DEPRECATED. See autofill_profiles. // autofill_profile_names // This table contains the multi-valued name fields // associated with a profile. @@ -191,6 +194,7 @@ // value was observed in a form submission, or even // validated by the user in the settings. // +// DEPRECATED. See autofill_profiles. // autofill_profile_emails // This table contains the multi-valued email fields // associated with a profile. @@ -199,6 +203,7 @@ // the email belongs. // email // +// DEPRECATED. See autofill_profiles. // autofill_profile_phones // This table contains the multi-valued phone fields // associated with a profile. @@ -207,6 +212,7 @@ // phone number belongs. // number // +// DEPRECATED. See autofill_profiles. // autofill_profile_birthdates // This table contains the multi-valued birthdate fields // associated with a profile. @@ -453,6 +459,8 @@ // // contact_info This table contains Autofill profile data synced from a // remote source. +// local_addresses This table contains kLocalOrSyncable Autofill profiles. +// It has the same layout as the contact_info table. // // guid A guid string to uniquely identify the profile. // use_count The number of times this profile has been used to fill a @@ -479,6 +487,8 @@ // Contains the values for all relevant ServerFieldTypes of // a contact_info entry. At most one entry per (guid, type) // pair exists. +// local_addresses_type_tokens +// Like contact_info_type_tokens, but for local_addresses. // // guid The guid of the corresponding profile in contact_info. // type The ServerFieldType, represented by its integer value in @@ -603,7 +613,7 @@ // `kContactInfoTable`. std::unique_ptr<AutofillProfile> GetAutofillProfile( const std::string& guid, - AutofillProfile::Source profile_source); + AutofillProfile::Source profile_source) const; // Retrieves local/server profiles in the database. They are returned in // unspecified order. @@ -611,7 +621,7 @@ // backend should be retrieved. virtual bool GetAutofillProfiles( std::vector<std::unique_ptr<AutofillProfile>>* profiles, - AutofillProfile::Source profile_source); + AutofillProfile::Source profile_source) const; virtual bool GetServerProfiles( std::vector<std::unique_ptr<AutofillProfile>>* profiles) const; @@ -762,7 +772,8 @@ bool RemoveOriginURLsModifiedBetween(const base::Time& delete_begin, const base::Time& delete_end); - // Clear all profiles. + // Clear all local profiles. + // TODO(crbug.com/1443393): Rename function. bool ClearAutofillProfiles(); // Clear all credit cards. @@ -791,7 +802,8 @@ // autofill_profile_emails and autofill_profile_phones table that were not // removed in the previous implementation of // RemoveAutofillDataModifiedBetween(see crbug.com/836737). - bool RemoveOrphanAutofillTableRows(); + // TODO(crbug.com/1443393): Remove, since the tables are no longer used. + bool RemoveOrphanAutofillTableRows() { return true; } // Table migration functions. NB: These do not and should not rely on other // functions in this class. The implementation of a function such as @@ -824,6 +836,9 @@ bool MigrateToVersion109AddVirtualCardUsageDataTable(); bool MigrateToVersion110AddInitialCreatorIdAndLastModifierId(); bool MigrateToVersion111AddVirtualCardEnrollmentTypeColumn(); + // No MigrateToVersion112. WebDatabase changed, but AutofillTable wasn't + // affected. + bool MigrateToVersion113MigrateLocalAddressProfilesToNewTable(); // Max data length saved in the table, AKA the maximum length allowed for // form data. @@ -915,15 +930,21 @@ const std::vector<AutofillProfile>& profiles, bool update_metadata); + // Reads profiles from the deprecated autofill_profiles table. + std::unique_ptr<AutofillProfile> GetAutofillProfileFromLegacyTable( + const std::string& guid) const; + bool GetAutofillProfilesFromLegacyTable( + std::vector<std::unique_ptr<AutofillProfile>>* profiles) const; + bool InitMainTable(); bool InitCreditCardsTable(); bool InitIBANsTable(); - bool InitProfilesTable(); - bool InitProfileAddressesTable(); - bool InitProfileNamesTable(); - bool InitProfileEmailsTable(); - bool InitProfilePhonesTable(); - bool InitProfileBirthdatesTable(); + bool InitLegacyProfilesTable(); + bool InitLegacyProfileAddressesTable(); + bool InitLegacyProfileNamesTable(); + bool InitLegacyProfileEmailsTable(); + bool InitLegacyProfilePhonesTable(); + bool InitLegacyProfileBirthdatesTable(); bool InitMaskedCreditCardsTable(); bool InitUnmaskedCreditCardsTable(); bool InitServerCardMetadataTable(); @@ -937,8 +958,8 @@ bool InitOfferDataTable(); bool InitOfferEligibleInstrumentTable(); bool InitOfferMerchantDomainTable(); - bool InitContactInfoTable(); - bool InitContactInfoTypeTokensTable(); + bool InitProfileMetadataTable(AutofillProfile::Source source); + bool InitProfileTypeTokensTable(AutofillProfile::Source source); bool InitVirtualCardUsageDataTable(); std::unique_ptr<AutofillTableEncryptor> autofill_table_encryptor_;
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc index a964cc5..f6dd66de 100644 --- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -192,7 +192,7 @@ // different master table. base::StringPiece GetProfileTable() const { return profile_source() == AutofillProfile::Source::kLocalOrSyncable - ? "autofill_profiles" + ? "local_addresses" : "contact_info"; } @@ -982,9 +982,6 @@ home_profile.SetRawInfoAsInt(BIRTHDATE_DAY, 14); home_profile.SetRawInfoAsInt(BIRTHDATE_MONTH, 3); home_profile.SetRawInfoAsInt(BIRTHDATE_4_DIGIT_YEAR, 1997); - // `disallow_settings_visible_updates` is not supported for account profiles. - if (profile_source() == AutofillProfile::Source::kLocalOrSyncable) - home_profile.set_disallow_settings_visible_updates(true); home_profile.set_language_code("en"); Time pre_creation_time = AutofillClock::Now(); @@ -1403,54 +1400,30 @@ TEST_F(AutofillTableTest, RemoveAutofillDataModifiedBetween) { // Populate the autofill_profiles and credit_cards tables. ASSERT_TRUE(db_->GetSQLConnection()->Execute( - "INSERT INTO autofill_profiles (guid, date_modified) " + "INSERT INTO local_addresses (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000000', 11);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000000', 'John Jones');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000000', 'john@jones.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000000', '111-111-1111');" - "INSERT INTO autofill_profiles (guid, date_modified) " + "INSERT INTO local_addresses_type_tokens (guid, type, value) " + "VALUES('00000000-0000-0000-0000-000000000000', 3, 'first name0');" + "INSERT INTO local_addresses (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000001', 21);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000001', 'John Jones2');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000001', 'john@jones2.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000001', '222-222-2222');" - "INSERT INTO autofill_profiles (guid, date_modified) " + "INSERT INTO local_addresses_type_tokens (guid, type, value) " + "VALUES('00000000-0000-0000-0000-000000000001', 3, 'first name1');" + "INSERT INTO local_addresses (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000002', 31);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000002', 'John Jones3');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000002', 'john@jones3.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000002', '333-333-3333');" - "INSERT INTO autofill_profiles (guid, date_modified) " + "INSERT INTO local_addresses_type_tokens (guid, type, value) " + "VALUES('00000000-0000-0000-0000-000000000002', 3, 'first name2');" + "INSERT INTO local_addresses (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000003', 41);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000003', 'John Jones4');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000003', 'john@jones4.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000003', '444-444-4444');" - "INSERT INTO autofill_profiles (guid, date_modified) " + "INSERT INTO local_addresses_type_tokens (guid, type, value) " + "VALUES('00000000-0000-0000-0000-000000000003', 3, 'first name3');" + "INSERT INTO local_addresses (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000004', 51);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000004', 'John Jones5');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000004', 'john@jones5.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000004', '555-555-5555');" - "INSERT INTO autofill_profiles (guid, date_modified) " + "INSERT INTO local_addresses_type_tokens (guid, type, value) " + "VALUES('00000000-0000-0000-0000-000000000004', 3, 'first name4');" + "INSERT INTO local_addresses (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000005', 61);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000005', 'John Jones6');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000005', 'john@jones6.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000005', '666-666-6666');" + "INSERT INTO local_addresses_type_tokens (guid, type, value) " + "VALUES('00000000-0000-0000-0000-000000000005', 3, 'first name5');" "INSERT INTO credit_cards (guid, date_modified) " "VALUES('00000000-0000-0000-0000-000000000006', 17);" "INSERT INTO credit_cards (guid, date_modified) " @@ -1478,7 +1451,7 @@ // Make sure that only the expected profiles are still present. sql::Statement s_autofill_profiles_bounded( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT date_modified FROM autofill_profiles")); + "SELECT date_modified FROM local_addresses ORDER BY guid")); ASSERT_TRUE(s_autofill_profiles_bounded.is_valid()); ASSERT_TRUE(s_autofill_profiles_bounded.Step()); EXPECT_EQ(11, s_autofill_profiles_bounded.ColumnInt64(0)); @@ -1493,62 +1466,28 @@ // Make sure that only the expected profile names are still present. sql::Statement s_autofill_profile_names_bounded( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT full_name FROM autofill_profile_names")); + "SELECT value FROM local_addresses_type_tokens ORDER BY guid")); ASSERT_TRUE(s_autofill_profile_names_bounded.is_valid()); ASSERT_TRUE(s_autofill_profile_names_bounded.Step()); - EXPECT_EQ("John Jones", s_autofill_profile_names_bounded.ColumnString(0)); + EXPECT_EQ("first name0", s_autofill_profile_names_bounded.ColumnString(0)); ASSERT_TRUE(s_autofill_profile_names_bounded.Step()); - EXPECT_EQ("John Jones4", s_autofill_profile_names_bounded.ColumnString(0)); + EXPECT_EQ("first name3", s_autofill_profile_names_bounded.ColumnString(0)); ASSERT_TRUE(s_autofill_profile_names_bounded.Step()); - EXPECT_EQ("John Jones5", s_autofill_profile_names_bounded.ColumnString(0)); + EXPECT_EQ("first name4", s_autofill_profile_names_bounded.ColumnString(0)); ASSERT_TRUE(s_autofill_profile_names_bounded.Step()); - EXPECT_EQ("John Jones6", s_autofill_profile_names_bounded.ColumnString(0)); + EXPECT_EQ("first name5", s_autofill_profile_names_bounded.ColumnString(0)); EXPECT_FALSE(s_autofill_profile_names_bounded.Step()); - // Make sure that only the expected profile emails are still present. - sql::Statement s_autofill_profile_emails_bounded( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT email FROM autofill_profile_emails")); - ASSERT_TRUE(s_autofill_profile_emails_bounded.is_valid()); - ASSERT_TRUE(s_autofill_profile_emails_bounded.Step()); - EXPECT_EQ("john@jones.com", - s_autofill_profile_emails_bounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_emails_bounded.Step()); - EXPECT_EQ("john@jones4.com", - s_autofill_profile_emails_bounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_emails_bounded.Step()); - EXPECT_EQ("john@jones5.com", - s_autofill_profile_emails_bounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_emails_bounded.Step()); - EXPECT_EQ("john@jones6.com", - s_autofill_profile_emails_bounded.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_emails_bounded.Step()); - - // Make sure the expected profile phone numbers are still present. - sql::Statement s_autofill_profile_phones_bounded( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT number FROM autofill_profile_phones")); - ASSERT_TRUE(s_autofill_profile_phones_bounded.is_valid()); - ASSERT_TRUE(s_autofill_profile_phones_bounded.Step()); - EXPECT_EQ("111-111-1111", s_autofill_profile_phones_bounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_phones_bounded.Step()); - EXPECT_EQ("444-444-4444", s_autofill_profile_phones_bounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_phones_bounded.Step()); - EXPECT_EQ("555-555-5555", s_autofill_profile_phones_bounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_phones_bounded.Step()); - EXPECT_EQ("666-666-6666", s_autofill_profile_phones_bounded.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_phones_bounded.Step()); - // Three cards should have been removed. ASSERT_EQ(3UL, credit_cards.size()); EXPECT_EQ("00000000-0000-0000-0000-000000000006", credit_cards[0]->guid()); EXPECT_EQ("00000000-0000-0000-0000-000000000007", credit_cards[1]->guid()); EXPECT_EQ("00000000-0000-0000-0000-000000000008", credit_cards[2]->guid()); - // Make sure the expected profiles are still present. + // Make sure the expected cards are still present. sql::Statement s_credit_cards_bounded( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT date_modified FROM credit_cards")); + "SELECT date_modified FROM credit_cards ORDER BY guid")); ASSERT_TRUE(s_credit_cards_bounded.is_valid()); ASSERT_TRUE(s_credit_cards_bounded.Step()); EXPECT_EQ(47, s_credit_cards_bounded.ColumnInt64(0)); @@ -1565,10 +1504,10 @@ EXPECT_EQ("00000000-0000-0000-0000-000000000004", profiles[0]->guid()); EXPECT_EQ("00000000-0000-0000-0000-000000000005", profiles[1]->guid()); - // Make sure that only the expected profile names are still present. + // Make sure that only the expected profiles are still present. sql::Statement s_autofill_profiles_unbounded( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT date_modified FROM autofill_profiles")); + "SELECT date_modified FROM local_addresses ORDER BY guid")); ASSERT_TRUE(s_autofill_profiles_unbounded.is_valid()); ASSERT_TRUE(s_autofill_profiles_unbounded.Step()); EXPECT_EQ(11, s_autofill_profiles_unbounded.ColumnInt64(0)); @@ -1579,40 +1518,14 @@ // Make sure that only the expected profile names are still present. sql::Statement s_autofill_profile_names_unbounded( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT full_name FROM autofill_profile_names")); + "SELECT value FROM local_addresses_type_tokens ORDER BY guid")); ASSERT_TRUE(s_autofill_profile_names_unbounded.is_valid()); ASSERT_TRUE(s_autofill_profile_names_unbounded.Step()); - EXPECT_EQ("John Jones", s_autofill_profile_names_unbounded.ColumnString(0)); + EXPECT_EQ("first name0", s_autofill_profile_names_unbounded.ColumnString(0)); ASSERT_TRUE(s_autofill_profile_names_unbounded.Step()); - EXPECT_EQ("John Jones4", s_autofill_profile_names_unbounded.ColumnString(0)); + EXPECT_EQ("first name3", s_autofill_profile_names_unbounded.ColumnString(0)); EXPECT_FALSE(s_autofill_profile_names_unbounded.Step()); - // Make sure that only the expected profile emails are still present. - sql::Statement s_autofill_profile_emails_unbounded( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT email FROM autofill_profile_emails")); - ASSERT_TRUE(s_autofill_profile_emails_unbounded.is_valid()); - ASSERT_TRUE(s_autofill_profile_emails_unbounded.Step()); - EXPECT_EQ("john@jones.com", - s_autofill_profile_emails_unbounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_emails_unbounded.Step()); - EXPECT_EQ("john@jones4.com", - s_autofill_profile_emails_unbounded.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_emails_unbounded.Step()); - - // Make sure the expected profile phone numbers are still present. - sql::Statement s_autofill_profile_phones_unbounded( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT number FROM autofill_profile_phones")); - ASSERT_TRUE(s_autofill_profile_phones_unbounded.is_valid()); - ASSERT_TRUE(s_autofill_profile_phones_unbounded.Step()); - EXPECT_EQ("111-111-1111", - s_autofill_profile_phones_unbounded.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_phones_unbounded.Step()); - EXPECT_EQ("444-444-4444", - s_autofill_profile_phones_unbounded.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_phones_unbounded.Step()); - // Two cards should have been removed. ASSERT_EQ(2UL, credit_cards.size()); EXPECT_EQ("00000000-0000-0000-0000-000000000010", credit_cards[0]->guid()); @@ -1639,31 +1552,17 @@ // Make sure there are no profiles remaining. sql::Statement s_autofill_profiles_empty( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT date_modified FROM autofill_profiles")); + "SELECT date_modified FROM local_addresses")); ASSERT_TRUE(s_autofill_profiles_empty.is_valid()); EXPECT_FALSE(s_autofill_profiles_empty.Step()); // Make sure there are no profile names remaining. sql::Statement s_autofill_profile_names_empty( db_->GetSQLConnection()->GetUniqueStatement( - "SELECT full_name FROM autofill_profile_names")); + "SELECT value FROM local_addresses_type_tokens")); ASSERT_TRUE(s_autofill_profile_names_empty.is_valid()); EXPECT_FALSE(s_autofill_profile_names_empty.Step()); - // Make sure there are no profile emails remaining. - sql::Statement s_autofill_profile_emails_empty( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT email FROM autofill_profile_emails")); - ASSERT_TRUE(s_autofill_profile_emails_empty.is_valid()); - EXPECT_FALSE(s_autofill_profile_emails_empty.Step()); - - // Make sure there are no profile phones remaining. - sql::Statement s_autofill_profile_phones_empty( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT number FROM autofill_profile_phones")); - ASSERT_TRUE(s_autofill_profile_phones_empty.is_valid()); - EXPECT_FALSE(s_autofill_profile_phones_empty.Step()); - // One credit card should have been deleted. ASSERT_EQ(1UL, credit_cards.size()); EXPECT_EQ("00000000-0000-0000-0000-000000000009", credit_cards[0]->guid()); @@ -2889,155 +2788,6 @@ testing::Values(syncer::AUTOFILL, syncer::AUTOFILL_PROFILE)); -TEST_F(AutofillTableTest, RemoveOrphanAutofillTableRows) { - // Populate the different tables. - ASSERT_TRUE(db_->GetSQLConnection()->Execute( - // Add a profile in all the tables - "INSERT INTO autofill_profiles (guid, date_modified) " - "VALUES('00000000-0000-0000-0000-000000000000', 11);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000000', 'John Jones');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000000', 'john@jones.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000000', '111-111-1111');" - - // Add a profile in profiles, names and emails tables. - "INSERT INTO autofill_profiles (guid, date_modified) " - "VALUES('00000000-0000-0000-0000-000000000001', 21);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000001', 'John Jones2');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000001', 'john@jones2.com');" - - // Add a profile in profiles, names and phones tables. - "INSERT INTO autofill_profiles (guid, date_modified) " - "VALUES('00000000-0000-0000-0000-000000000002', 31);" - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000002', 'John Jones3');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000002', '333-333-3333');" - - // Add a profile in profiles, emails and phones tables. - "INSERT INTO autofill_profiles (guid, date_modified) " - "VALUES('00000000-0000-0000-0000-000000000003', 41);" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000003', 'john@jones4.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000003', '444-444-4444');" - - // Add a orphan profile in names, emails and phones tables. - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000004', 'John Jones5');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000004', 'john@jones5.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000004', '555-555-5555');" - - // Add a orphan profile in names and emails tables. - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000005', 'John Jones6');" - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000005', 'john@jones6.com');" - - // Add a orphan profile in names and phones tables. - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000006', 'John Jones7');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000006', '777-777-7777');" - - // Add a orphan profile in emails and phones tables. - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000007', 'john@jones8.com');" - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000007', '999-999-9999');" - - // Add a orphan profile in the names table. - "INSERT INTO autofill_profile_names (guid, full_name) " - "VALUES('00000000-0000-0000-0000-000000000008', 'John Jones9');" - - // Add a orphan profile in the emails table. - "INSERT INTO autofill_profile_emails (guid, email) " - "VALUES('00000000-0000-0000-0000-000000000009', 'john@jones10.com');" - - // Add a orphan profile in the phones table. - "INSERT INTO autofill_profile_phones (guid, number) " - "VALUES('00000000-0000-0000-0000-000000000010', '101-010-1010');")); - - ASSERT_TRUE(table_->RemoveOrphanAutofillTableRows()); - - // Make sure that all the rows in the autofill_profiles table are still - // present. - sql::Statement s_autofill_profiles( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT guid FROM autofill_profiles")); - ASSERT_TRUE(s_autofill_profiles.is_valid()); - ASSERT_TRUE(s_autofill_profiles.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000000", - s_autofill_profiles.ColumnString(0)); - ASSERT_TRUE(s_autofill_profiles.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000001", - s_autofill_profiles.ColumnString(0)); - ASSERT_TRUE(s_autofill_profiles.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000002", - s_autofill_profiles.ColumnString(0)); - ASSERT_TRUE(s_autofill_profiles.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000003", - s_autofill_profiles.ColumnString(0)); - EXPECT_FALSE(s_autofill_profiles.Step()); - - // Make sure that only the rows present in the autofill_profiles table are - // present in the autofill_profile_names table. - sql::Statement s_autofill_profile_names( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT guid FROM autofill_profile_names")); - ASSERT_TRUE(s_autofill_profile_names.is_valid()); - ASSERT_TRUE(s_autofill_profile_names.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000000", - s_autofill_profile_names.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_names.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000001", - s_autofill_profile_names.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_names.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000002", - s_autofill_profile_names.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_names.Step()); - - // Make sure that only the rows present in the autofill_profiles table are - // present in the autofill_profile_emails table. - sql::Statement s_autofill_profile_emails( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT guid FROM autofill_profile_emails")); - ASSERT_TRUE(s_autofill_profile_emails.is_valid()); - ASSERT_TRUE(s_autofill_profile_emails.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000000", - s_autofill_profile_emails.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_emails.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000001", - s_autofill_profile_emails.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_emails.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000003", - s_autofill_profile_emails.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_emails.Step()); - - // Make sure that only the rows present in the autofill_profiles table are - // present in the autofill_profile_phones table. - sql::Statement s_autofill_profile_phones( - db_->GetSQLConnection()->GetUniqueStatement( - "SELECT guid FROM autofill_profile_phones")); - ASSERT_TRUE(s_autofill_profile_phones.is_valid()); - ASSERT_TRUE(s_autofill_profile_phones.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000000", - s_autofill_profile_phones.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_phones.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000002", - s_autofill_profile_phones.ColumnString(0)); - ASSERT_TRUE(s_autofill_profile_phones.Step()); - EXPECT_EQ("00000000-0000-0000-0000-000000000003", - s_autofill_profile_phones.ColumnString(0)); - EXPECT_FALSE(s_autofill_profile_phones.Step()); -} - TEST_F(AutofillTableTest, InsertUpiId) { EXPECT_TRUE(table_->InsertUpiId("name@indianbank"));
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc index 4f8446c..e2471666 100644 --- a/components/bookmarks/browser/bookmark_model_unittest.cc +++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -1369,7 +1369,9 @@ n1->set_date_last_used(base_time + base::Days(4)); n2->set_date_last_used(base_time + base::Days(3)); n3->set_date_last_used(base_time + base::Days(2)); - n4->set_date_last_used(base_time + base::Days(1)); + n3->set_date_added(base_time + base::Days(2)); + n4->set_date_last_used(base_time + base::Days(2)); + n4->set_date_added(base_time + base::Days(1)); // Make sure order is honored. std::vector<const BookmarkNode*> recently_used;
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index 8b69541..26defe9 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc
@@ -189,7 +189,7 @@ void GetMostRecentEntries( BookmarkModel* model, size_t limit, - std::set<const BookmarkNode*, Comparator>* nodes_set) { + std::multiset<const BookmarkNode*, Comparator>* nodes_set) { ui::TreeNodeIterator<const BookmarkNode> iterator(model->root_node()); while (iterator.has_next()) { const BookmarkNode* node = iterator.Next(); @@ -394,7 +394,7 @@ // std::set is used here since insert element into std::vector is slower than // std::set, so we use std::set to find the most recent bookmarks, and then // return to users as std::vector. - std::set<const BookmarkNode*, decltype(&MoreRecentlyAdded)> nodes_set( + std::multiset<const BookmarkNode*, decltype(&MoreRecentlyAdded)> nodes_set( &MoreRecentlyAdded); GetMostRecentEntries(model, count, &nodes_set); @@ -413,9 +413,15 @@ // std::set, so we use std::set to find the most recent bookmarks, and then // return to users as std::vector. auto lastUsedComp = [](const BookmarkNode* n1, const BookmarkNode* n2) { + if (n1->date_last_used() == n2->date_last_used()) { + // Both bookmarks have same used date, we compare added date instead, + // normally this happens when both bookmarks are never used. + return n1->date_added() > n2->date_added(); + } return n1->date_last_used() > n2->date_last_used(); }; - std::set<const BookmarkNode*, decltype(lastUsedComp)> nodes_set(lastUsedComp); + std::multiset<const BookmarkNode*, decltype(lastUsedComp)> nodes_set( + lastUsedComp); GetMostRecentEntries(model, count, &nodes_set); nodes->reserve(nodes_set.size());
diff --git a/components/bookmarks/browser/bookmark_utils.h b/components/bookmarks/browser/bookmark_utils.h index f6780e0..91b5c0b5 100644 --- a/components/bookmarks/browser/bookmark_utils.h +++ b/components/bookmarks/browser/bookmark_utils.h
@@ -100,7 +100,9 @@ bool MoreRecentlyAdded(const BookmarkNode* n1, const BookmarkNode* n2); // Returns the most recently used bookmarks. This does not return folders, -// only nodes of type url. +// only nodes of type url. Note: If the bookmarks have the same used time, this +// will return the more recent added bookmarks. Normally, this happens when the +// bookmarks are never used. void GetMostRecentlyUsedEntries(BookmarkModel* model, size_t count, std::vector<const BookmarkNode*>* nodes);
diff --git a/components/bookmarks/browser/titled_url_index_unittest.cc b/components/bookmarks/browser/titled_url_index_unittest.cc index a6c153e7..f371896 100644 --- a/components/bookmarks/browser/titled_url_index_unittest.cc +++ b/components/bookmarks/browser/titled_url_index_unittest.cc
@@ -620,6 +620,8 @@ ASSERT_EQ(2U, matches.size()); EXPECT_EQ(data[0].url, matches[0].node->GetTitledUrlNodeUrl()); EXPECT_EQ(data[3].url, matches[1].node->GetTitledUrlNodeUrl()); + + index()->SetNodeSorter(nullptr); } TEST_F(TitledUrlIndexTest, MatchTitledUrlNodeWithQuery) {
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb index 049c5ad..ac46427 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -32,7 +32,7 @@ <translation id="1644574205037202324">履歴</translation> <translation id="1647582022260550163">権限をリセットし、Cookie とサイトデータを削除してもよろしいですか?</translation> <translation id="1660204651932907780">音声の再生をサイトに許可する(推奨)</translation> -<translation id="1677097821151855053">Cookie と他のサイトデータは、ログインや広告のカスタマイズなどでユーザーを覚えておくために使用されます。すべてのサイトの Cookie を管理するには、<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />をご覧ください。</translation> +<translation id="1677097821151855053">Cookie と他のサイトデータは、ログインや広告のパーソナライズなどでユーザーを覚えておくために使用されます。すべてのサイトの Cookie を管理するには、<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />をご覧ください。</translation> <translation id="1688867105868176567">サイトデータを削除しますか?</translation> <translation id="169515064810179024">サイトによるモーション センサーへのアクセスをブロックする</translation> <translation id="1717218214683051432">モーション センサー</translation>
diff --git a/components/browser_ui/styles/android/java/res/values-night/colors.xml b/components/browser_ui/styles/android/java/res/values-night/colors.xml index b74f81b..bdcdb30 100644 --- a/components/browser_ui/styles/android/java/res/values-night/colors.xml +++ b/components/browser_ui/styles/android/java/res/values-night/colors.xml
@@ -20,4 +20,5 @@ <color name="empty_state_icon_bg_color">@color/material_primary_20</color> <color name="empty_state_icon_bg_background_color">@color/material_primary_10</color> <color name="empty_state_icon_bg_foreground_color">@color/material_primary_20</color> + <color name="empty_state_icon_tabswitcher_bg_color">@macro/default_bg_color_elev_0</color> </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/colors.xml b/components/browser_ui/styles/android/java/res/values/colors.xml index 2b1fb42..c4bf1308 100644 --- a/components/browser_ui/styles/android/java/res/values/colors.xml +++ b/components/browser_ui/styles/android/java/res/values/colors.xml
@@ -57,4 +57,5 @@ <color name="empty_state_icon_bg_background_color">@color/material_primary_95</color> <color name="empty_state_icon_bg_foreground_color">@color/material_primary_90</color> <color name="empty_state_icon_color">@color/material_primary_40</color> + <color name="empty_state_icon_tabswitcher_bg_color">@color/material_primary_95</color> </resources>
diff --git a/components/browsing_topics/browsing_topics_service_impl.cc b/components/browsing_topics/browsing_topics_service_impl.cc index c8b98d7..8c453d9 100644 --- a/components/browsing_topics/browsing_topics_service_impl.cc +++ b/components/browsing_topics/browsing_topics_service_impl.cc
@@ -449,7 +449,18 @@ topics.emplace_back(std::move(result_topic)); } - std::sort(topics.begin(), topics.end()); + // Sort result based on the version first, and then based on the topic ID. + // This groups the topics with the same version together, so that when + // transforming into the header format, all duplicate versions can be omitted. + std::sort(topics.begin(), topics.end(), + [](const blink::mojom::EpochTopicPtr& left, + const blink::mojom::EpochTopicPtr& right) { + if (left->version != right->version) { + return left->version < right->version; + } + + return left->topic < right->topic; + }); // Remove duplicate entries. topics.erase(std::unique(topics.begin(), topics.end()), topics.end());
diff --git a/components/browsing_topics/browsing_topics_service_impl_unittest.cc b/components/browsing_topics/browsing_topics_service_impl_unittest.cc index 9e30724c..0384a23 100644 --- a/components/browsing_topics/browsing_topics_service_impl_unittest.cc +++ b/components/browsing_topics/browsing_topics_service_impl_unittest.cc
@@ -66,7 +66,8 @@ EpochTopics CreateTestEpochTopics( const std::vector<std::pair<Topic, std::set<HashedDomain>>>& topics, base::Time calculation_time, - size_t padded_top_topics_start_index = 5) { + size_t padded_top_topics_start_index = 5, + int64_t model_version = kModelVersion) { DCHECK_EQ(topics.size(), 5u); std::vector<TopicAndDomains> top_topics_and_observing_domains; @@ -77,7 +78,7 @@ return EpochTopics(std::move(top_topics_and_observing_domains), padded_top_topics_start_index, kTaxonomySize, - kTaxonomyVersion, kModelVersion, calculation_time); + kTaxonomyVersion, model_version, calculation_time); } } // namespace @@ -1247,6 +1248,73 @@ EXPECT_EQ(result[1]->topic, 7); } +TEST_F(BrowsingTopicsServiceImplTest, + HandleTopicsWebApi_TopicsReturnedInSortedOrder_DifferentVersions) { + base::queue<EpochTopics> mock_calculator_results; + mock_calculator_results.push( + CreateTestEpochTopics({{Topic(6), {GetHashedDomain("bar.com")}}, + {Topic(7), {GetHashedDomain("bar.com")}}, + {Topic(8), {GetHashedDomain("bar.com")}}, + {Topic(9), {GetHashedDomain("bar.com")}}, + {Topic(10), {GetHashedDomain("bar.com")}}}, + kTime1, + /*padded_top_topics_start_index=*/5, + /*model_version=*/4)); + mock_calculator_results.push( + CreateTestEpochTopics({{Topic(1), {GetHashedDomain("bar.com")}}, + {Topic(2), {GetHashedDomain("bar.com")}}, + {Topic(3), {GetHashedDomain("bar.com")}}, + {Topic(4), {GetHashedDomain("bar.com")}}, + {Topic(5), {GetHashedDomain("bar.com")}}}, + kTime1, + /*padded_top_topics_start_index=*/5, + /*model_version=*/3)); + mock_calculator_results.push( + CreateTestEpochTopics({{Topic(6), {GetHashedDomain("bar.com")}}, + {Topic(7), {GetHashedDomain("bar.com")}}, + {Topic(8), {GetHashedDomain("bar.com")}}, + {Topic(9), {GetHashedDomain("bar.com")}}, + {Topic(10), {GetHashedDomain("bar.com")}}}, + kTime1, + /*padded_top_topics_start_index=*/5, + /*model_version=*/2)); + mock_calculator_results.push( + CreateTestEpochTopics({{Topic(1), {GetHashedDomain("bar.com")}}, + {Topic(2), {GetHashedDomain("bar.com")}}, + {Topic(3), {GetHashedDomain("bar.com")}}, + {Topic(4), {GetHashedDomain("bar.com")}}, + {Topic(5), {GetHashedDomain("bar.com")}}}, + kTime1, + /*padded_top_topics_start_index=*/5, + /*model_version=*/1)); + + InitializeBrowsingTopicsService(std::move(mock_calculator_results)); + + // Finish all calculations. + task_environment()->FastForwardBy(4 * kCalculatorDelay + 3 * kEpoch); + + EXPECT_EQ(browsing_topics_state().epochs().size(), 4u); + + NavigateToPage(GURL("https://www.foo.com")); + + // Current time is before the epoch switch time. + + std::vector<blink::mojom::EpochTopicPtr> result; + EXPECT_TRUE(browsing_topics_service_->HandleTopicsWebApi( + /*context_origin=*/url::Origin::Create(GURL("https://www.bar.com")), + web_contents()->GetPrimaryMainFrame(), ApiCallerSource::kJavaScript, + /*get_topics=*/true, + /*observe=*/true, result)); + + EXPECT_EQ(result.size(), 3u); + EXPECT_EQ(result[0]->topic, 7); + EXPECT_EQ(result[0]->version, "chrome.1:1:2"); + EXPECT_EQ(result[1]->topic, 2); + EXPECT_EQ(result[1]->version, "chrome.1:1:3"); + EXPECT_EQ(result[2]->topic, 7); + EXPECT_EQ(result[2]->version, "chrome.1:1:4"); +} + TEST_F(BrowsingTopicsServiceImplTest, HandleTopicsWebApi_TrackedUsageContext) { base::queue<EpochTopics> mock_calculator_results; mock_calculator_results.push(
diff --git a/components/client_hints/README.md b/components/client_hints/README.md index c6943202..a3b1d01 100644 --- a/components/client_hints/README.md +++ b/components/client_hints/README.md
@@ -56,8 +56,42 @@ The full explanation is outside of the scope of this document and can be found in the reliability explainer linked above. +### Header Names + +All client hint headers should be [forbidden request-headers](https://fetch.spec.whatwg.org/#forbidden-request-header), by virtue of the prefix `Sec-`. Historically, some were not forbidden and most of these have been replaced with new headers using this prefix. Within Chromium, these are distinguished with a `_DEPRECATED` suffix, e.g., `WebClientHintsType::kDeviceMemory_DEPRECATED`. The exception to this rule is the `Save-Data` header, which [will +not be replaced with `Sec-CH-Save-Data`](https://groups.google.com/a/chromium.org/g/blink-dev/c/HR7tWmewbSA/m/R0QYg-ZAAAAJ). + +The "new" naming adds `CH` to distinguish client hints from other forbidden request-headers, giving the combined prefix `Sec-CH`. + +### Client-Hint Types + +There are several types of client hints, which are handled differently: + + * *UA* client hints contain information about the user agent which might once have been found expected in the User-Agent header. + * *Device* client hints contain dynamic information about the configuration of the device on which the browser is running. + * *Network* client hints contain dynamic information about the browser's network connection. + * *User Preference Media Features* client hints contain information about the user agent's preferences as represented in CSS media features. + +All UA client hints are distinguished by a `Sec-CH-UA` header prefix. UA hints are available via the JS `navigator.userAgentData` API, while other types are not. + +Some device client hints are specific to the type of resource being requested. For example, `Sec-CH-Resource-Width` is sent only for image fetches. + +Except for `Save-Data`, network client hints are currently being deprecated. + +Some device and user-preference client hints are not sent for fetches in detached frames. + ## Implementation +### Client-Hint Data Sources + +In terms of the implementation, the web sees client hints in three ways: in headers on navigation-related fetches, in headers for subresource fetches, and via the [`navigator.userAgentData` property](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData). + +The first of these occurs in the browser process. Hint data for client-hint types other than UA are fetched from appropriate APIs, such as `NetworkQualityTracker` or `display::Screen`. Data for UA client hints are gathered in a `UserAgentMetadata` type, which is acquired from the embedder via the `ClientHintControllerDelegate`. + +Subresource fetches and JS access occur in the renderer. The renderer gets UA client hint data from the browser via `RenderThreadImpl::InitializeRenderer` and stores it for the lifetime of the renderer thread. The browser gets this data from the embedder via the `ContentBrowserClient` delegate. *Note that this is entirely independent of the `ClientHintControllerDelegate`!* + +Programmatic access only exposes UA client hints. All other client hints are only revealed in client-hint headers, based on locally-observed information such as that from `NetworkStateNotifier` or the frame's device pixel ratio. + ### Accept-CH cache Client Hint preferences are stored in the preferences service as a content setting (`ContentSettingsType::CLIENT_HINTS`), keyed to the origin. This storage is accessed through the [content::ClientHintsControllerDelegate] interface, with the principle implementation being [client_hints::ClientHints] in //components (to share across multiple platforms). The delegate is accessible in the browser process as a property of the [content::BrowserContext] (in //chrome land, this is implemented as the Profile and “Off The Record” Profile. An important note is that there is an “incognito profile” that gets its own client hints storage). @@ -135,9 +169,14 @@ TODO(crbug.com/1176808): There should be UseCounters measuring usage, but there are not currently. -### Populating the client hint +### Populating the Client Hint -Client Hints are populated in [BaseFetchContext::AddClientHintsIfNecessary](/third_party/blink/renderer/core/loader/base_fetch_context.cc). If you need frame-based information, this should be added to [ClientHintsImageInfo](/third_party/blink/renderer/core/loader/base_fetch_context.cc), which is populated in [FrameFetchContext::AddClientHintsIfNecessary](/third_party/blink/renderer/core/loader/frame_fetch_context.cc) +As described in "Client-Hint Data Sources" above, client hints are populated in +several places: + + * _UA Hints:_ Included in [`blink::UserAgentMetadata`](https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/public/common/user_agent/user_agent_metadata.h?q=blink::UserAgentMetadata) and determined in [`ClientHintsControllerDelegate`](https://source.chromium.org/chromium/chromium/src/+/main:content/public/browser/client_hints_controller_delegate.h;l=55?q=clienthintscontrollerdelegate) for navigation fetches and [`ContentBrowserClient`](https://source.chromium.org/chromium/chromium/src/+/main:content/public/browser/content_browser_client.h;l=2100?q=contentbrowserclient) for programmatic access and subresource fetches. + * _navigation fetches:_ [`content::AddNavigationRequestClientHintsHeaders`](https://source.chromium.org/chromium/chromium/src/+/main:content/browser/client_hints/client_hints.cc;l=1040?q=AddNavigationRequestClientHintsHeader) and `content::AddRequestClientHintsHeaders`. + * _subresource fetches:_ [BaseFetchContext::AddClientHintsIfNecessary](/third_party/blink/renderer/core/loader/base_fetch_context.cc). If you need frame-based information, this should be added to [ClientHintsImageInfo](/third_party/blink/renderer/core/loader/base_fetch_context.cc), which is populated in [FrameFetchContext::AddClientHintsIfNecessary](/third_party/blink/renderer/core/loader/frame_fetch_context.cc) ### Web platform tests * Add the new client hint to [/third_party/blink/web_tests/external/wpt/client-hints/resources/export.js], [/third_party/blink/web_tests/external/wpt/client-hints/resources/clienthintslist.py], [/third_party/blink/web_tests/external/wpt/client-hints/accept-ch/feature-policy-navigation/\_\_dir\_\_.headers], [/third_party/blink/web_tests/external/wpt/client-hints/sandbox/\_\_dir\_\_.headers], and [/third_party/blink/web_tests/external/wpt/client-hints/accept-ch/\_\_dir\_\_.headers] @@ -192,4 +231,4 @@ [/third_party/blink/web_tests/external/wpt/client-hints/resources/clienthintslist.py]: /third_party/blink/web_tests/external/wpt/client-hints/resources/clienthintslist.py [/third_party/blink/web_tests/external/wpt/client-hints/accept-ch/feature-policy-navigation/\_\_dir\_\_.headers]: /third_party/blink/web_tests/external/wpt/client-hints/accept-ch/feature-policy-navigation/__dir__.headers [/third_party/blink/web_tests/external/wpt/client-hints/sandbox/\_\_dir\_\_.headers]: /third_party/blink/web_tests/external/wpt/client-hints/sandbox/__dir__.headers -[/third_party/blink/web_tests/external/wpt/client-hints/accept-ch/\_\_dir\_\_.headers]: /third_party/blink/web_tests/external/wpt/client-hints/accept-ch/__dir__.headers \ No newline at end of file +[/third_party/blink/web_tests/external/wpt/client-hints/accept-ch/\_\_dir\_\_.headers]: /third_party/blink/web_tests/external/wpt/client-hints/accept-ch/__dir__.headers
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc index 7ae0e9a..2d59944 100644 --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -519,8 +519,7 @@ /*allowlisted_schemes=*/{}, /*valid_settings=*/{CONTENT_SETTING_BLOCK, CONTENT_SETTING_ASK}, WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, - WebsiteSettingsRegistry::DESKTOP | - WebsiteSettingsRegistry::PLATFORM_ANDROID, + WebsiteSettingsRegistry::DESKTOP, ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY);
diff --git a/components/content_settings/core/browser/content_settings_registry_unittest.cc b/components/content_settings/core/browser/content_settings_registry_unittest.cc index 2eba3c0..8762823 100644 --- a/components/content_settings/core/browser/content_settings_registry_unittest.cc +++ b/components/content_settings/core/browser/content_settings_registry_unittest.cc
@@ -100,7 +100,7 @@ website_settings_info); // Check that PRIVATE_NETWORK_GUARD is registered correctly. -#if !BUILDFLAG(IS_IOS) +#if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID) info = registry()->Get(ContentSettingsType::PRIVATE_NETWORK_GUARD); ASSERT_TRUE(info); @@ -177,9 +177,6 @@ info = registry()->Get(ContentSettingsType::MEDIASTREAM_CAMERA); EXPECT_FALSE(info->IsDefaultSettingValid(CONTENT_SETTING_ALLOW)); - - info = registry()->Get(ContentSettingsType::PRIVATE_NETWORK_GUARD); - EXPECT_FALSE(info->IsDefaultSettingValid(CONTENT_SETTING_ALLOW)); #endif #if BUILDFLAG(IS_CHROMEOS) @@ -190,6 +187,9 @@ #if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID) info = registry()->Get(ContentSettingsType::FILE_SYSTEM_WRITE_GUARD); EXPECT_FALSE(info->IsDefaultSettingValid(CONTENT_SETTING_ALLOW)); + + info = registry()->Get(ContentSettingsType::PRIVATE_NETWORK_GUARD); + EXPECT_FALSE(info->IsDefaultSettingValid(CONTENT_SETTING_ALLOW)); #endif }
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc index 858ef13..a797d9f 100644 --- a/components/content_settings/core/browser/website_settings_registry.cc +++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -268,8 +268,7 @@ Register(ContentSettingsType::PRIVATE_NETWORK_CHOOSER_DATA, "private-network-chooser-data", base::Value(), WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY, - WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, - DESKTOP | PLATFORM_ANDROID, + WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, DESKTOP, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); Register( ContentSettingsType::FEDERATED_IDENTITY_IDENTITY_PROVIDER_SIGNIN_STATUS,
diff --git a/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc b/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc index 74af54f..16eecd8 100644 --- a/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_reliability_logging_unittest.cc
@@ -525,7 +525,6 @@ WaitForIdleTaskQueue(); EXPECT_EQ(base::StrCat({"LogLoadMoreStarted\n" - "LogLoadMoreIndicatorShown\n" "LogLoadMoreRequestSent\n" "LogLoadMoreResponseReceived " "receive_timestamp=", @@ -552,7 +551,6 @@ EXPECT_EQ( "LogLoadMoreStarted\n" - "LogLoadMoreIndicatorShown\n" "LogLoadMoreRequestSent\n" "LogLoadMoreResponseReceived receive_timestamp=0 send_timestamp=0\n" "LogLoadMoreRequestFinished result=200\n"
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc index 4d40ab7..45de183d 100644 --- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -1383,6 +1383,35 @@ EXPECT_EQ(std::vector<bool>({false}), observer2.calls); } +TEST_P(FeedStreamTestForAllStreamTypes, LoadMoreIndicatorSliceId) { + // The load-more spinner's slice ID must change for each load. + response_translator_.InjectResponse(MakeTypicalInitialModelState()); + TestSurface surface(stream_.get()); + WaitForIdleTaskQueue(); + size_t num_of_updates = surface.all_updates.size(); + size_t num_of_cards = surface.update->updated_slices().size(); + + // Load page 2. + response_translator_.InjectResponse(MakeTypicalNextPageState(2)); + stream_->LoadMore(surface, base::DoNothing()); + WaitForIdleTaskQueue(); + EXPECT_EQ("load-more-spinner1", surface.all_updates[num_of_updates] + .updated_slices(num_of_cards) + .slice() + .slice_id()); + num_of_updates = surface.all_updates.size(); + num_of_cards = surface.update->updated_slices().size(); + + // Load page 3. + response_translator_.InjectResponse(MakeTypicalNextPageState(3)); + stream_->LoadMore(surface, base::DoNothing()); + WaitForIdleTaskQueue(); + EXPECT_EQ("load-more-spinner2", surface.all_updates[num_of_updates] + .updated_slices(num_of_cards) + .slice() + .slice_id()); +} + TEST_P(FeedStreamTestForAllStreamTypes, LoadMoreAppendsContent) { response_translator_.InjectResponse(MakeTypicalInitialModelState()); TestSurface surface(stream_.get());
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc index 32baf7a..f673da8 100644 --- a/components/feed/core/v2/api_test/feed_api_test.cc +++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -200,6 +200,7 @@ initial_state = stream_update; } update = stream_update; + all_updates.push_back(stream_update); described_updates_.push_back(CurrentState()); } @@ -456,10 +457,6 @@ events_.push_back("LogLoadMoreStarted"); } -void TestReliabilityLoggingBridge::LogLoadMoreIndicatorShown() { - events_.push_back("LogLoadMoreIndicatorShown"); -} - void TestReliabilityLoggingBridge::LogLoadMoreActionUploadRequestStarted() { events_.push_back("LogLoadMoreActionUploadRequestStarted"); }
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h index c604417a..d67bd2b 100644 --- a/components/feed/core/v2/api_test/feed_api_test.h +++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -114,7 +114,6 @@ void LogLaunchFinishedAfterStreamUpdate( feedwire::DiscoverLaunchResult result) override; void LogLoadMoreStarted() override; - void LogLoadMoreIndicatorShown() override; void LogLoadMoreActionUploadRequestStarted() override; void LogLoadMoreRequestSent() override; void LogLoadMoreResponseReceived(int64_t server_receive_timestamp_ns, @@ -170,6 +169,8 @@ absl::optional<feedui::StreamUpdate> initial_state; // The last stream update received. absl::optional<feedui::StreamUpdate> update; + // All stream updates. + std::vector<feedui::StreamUpdate> all_updates; TestReliabilityLoggingBridge reliability_logging_bridge;
diff --git a/components/feed/core/v2/launch_reliability_logger.cc b/components/feed/core/v2/launch_reliability_logger.cc index 9c5e112..f79332ac 100644 --- a/components/feed/core/v2/launch_reliability_logger.cc +++ b/components/feed/core/v2/launch_reliability_logger.cc
@@ -166,7 +166,7 @@ logging_bridge.LogLoadingIndicatorShown(base::TimeTicks::Now()); break; case StreamUpdateType::kLoadingMoreSpinner: - logging_bridge.LogLoadMoreIndicatorShown(); + // Nothing to log. We will log only when the indicator is actuallly shown. break; case StreamUpdateType::kZeroState: logging_bridge.LogAboveTheFoldRender(
diff --git a/components/feed/core/v2/launch_reliability_logger.h b/components/feed/core/v2/launch_reliability_logger.h index e38d4e5..e636e0d 100644 --- a/components/feed/core/v2/launch_reliability_logger.h +++ b/components/feed/core/v2/launch_reliability_logger.h
@@ -41,7 +41,6 @@ int combined_network_status_code); void LogLoadMoreStarted(); - void LogLoadMoreIndicatorShown(); void LogLoadMoreActionUploadRequestStarted(); void LogLoadMoreRequestSent(); void LogLoadMoreResponseReceived(int64_t server_receive_timestamp_ns,
diff --git a/components/feed/core/v2/public/reliability_logging_bridge.h b/components/feed/core/v2/public/reliability_logging_bridge.h index 1d75fe4e..8e37dc3 100644 --- a/components/feed/core/v2/public/reliability_logging_bridge.h +++ b/components/feed/core/v2/public/reliability_logging_bridge.h
@@ -56,7 +56,6 @@ feedwire::DiscoverLaunchResult result) = 0; virtual void LogLoadMoreStarted() = 0; - virtual void LogLoadMoreIndicatorShown() = 0; virtual void LogLoadMoreActionUploadRequestStarted() = 0; virtual void LogLoadMoreRequestSent() = 0; virtual void LogLoadMoreResponseReceived(
diff --git a/components/feed/core/v2/surface_updater.cc b/components/feed/core/v2/surface_updater.cc index 32fb92cc..c1d1bdec 100644 --- a/components/feed/core/v2/surface_updater.cc +++ b/components/feed/core/v2/surface_updater.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/check.h" +#include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "components/feed/core/proto/v2/ui.pb.h" @@ -70,10 +71,19 @@ } } -void AddLoadingSpinner(bool is_at_top, feedui::StreamUpdate* update) { +void AddLoadingSpinner(bool is_initial_load, + int load_more_indicator_id, + feedui::StreamUpdate* update) { feedui::Slice* slice = update->add_updated_slices()->mutable_slice(); - slice->mutable_loading_spinner_slice()->set_is_at_top(is_at_top); - slice->set_slice_id(is_at_top ? "loading-spinner" : "load-more-spinner"); + slice->mutable_loading_spinner_slice()->set_is_at_top(is_initial_load); + // The slice ID is checked on Java code to find out the loading spinner view. + // An incremental ID is added to the slice ID in order to differentiate from + // pvrevious spinners. + slice->set_slice_id( + is_initial_load + ? "loading-spinner" + : base::StrCat({"load-more-spinner", + base::NumberToString(load_more_indicator_id)})); } struct StreamUpdateAndType { @@ -85,7 +95,8 @@ const std::vector<std::string>& updated_shared_state_ids, const base::flat_set<ContentRevision>& already_sent_content, const StreamModel* model, - const DrawState& state) { + const DrawState& state, + int load_more_indicator_id) { DCHECK(!state.loading_initial || !state.loading_more) << "logic bug: requested both top and bottom spinners."; @@ -123,12 +134,14 @@ } else { // Add the initial-load spinner if applicable. if (state.loading_initial) { - AddLoadingSpinner(/*is_at_top=*/true, &update.stream_update); + AddLoadingSpinner(/*is_initial_load=*/true, load_more_indicator_id, + &update.stream_update); update.type = StreamUpdateType::kInitialLoadingSpinner; } // Add a loading-more spinner if applicable. if (state.loading_more) { - AddLoadingSpinner(/*is_at_top=*/false, &update.stream_update); + AddLoadingSpinner(/*is_initial_load=*/false, load_more_indicator_id, + &update.stream_update); update.type = StreamUpdateType::kLoadingMoreSpinner; } } @@ -153,7 +166,7 @@ updated_shared_state_ids = model->GetSharedStateIds(); } return MakeStreamUpdate(std::move(updated_shared_state_ids), - /*already_sent_content=*/{}, model, state); + /*already_sent_content=*/{}, model, state, 0); } base::flat_set<ContentRevision> GetContentSet(const StreamModel* model) { @@ -342,6 +355,9 @@ DCHECK(!loading_initial_) << "SetLoadingMore while still loading the initial state"; loading_more_ = is_loading; + if (loading_more_) { + current_load_more_indicator_id_++; + } SendStreamUpdateIfNeeded(); } @@ -367,7 +383,8 @@ const std::vector<std::string>& updated_shared_state_ids) { DrawState state = GetState(); StreamUpdateAndType update = - MakeStreamUpdate(updated_shared_state_ids, sent_content_, model_, state); + MakeStreamUpdate(updated_shared_state_ids, sent_content_, model_, state, + current_load_more_indicator_id_); if (load_stream_started_ || loading_more_) { launch_reliability_logger_.OnStreamUpdate(update.type);
diff --git a/components/feed/core/v2/surface_updater.h b/components/feed/core/v2/surface_updater.h index 52aa741..1ddb20c 100644 --- a/components/feed/core/v2/surface_updater.h +++ b/components/feed/core/v2/surface_updater.h
@@ -134,6 +134,8 @@ LaunchReliabilityLogger launch_reliability_logger_; bool load_stream_started_ = false; + + int current_load_more_indicator_id_ = 0; }; } // namespace feed
diff --git a/components/password_manager/content/browser/form_submission_tracker_util_unittest.cc b/components/password_manager/content/browser/form_submission_tracker_util_unittest.cc index 39f768ec..b54d3cf 100644 --- a/components/password_manager/content/browser/form_submission_tracker_util_unittest.cc +++ b/components/password_manager/content/browser/form_submission_tracker_util_unittest.cc
@@ -15,7 +15,10 @@ class FormSubmissionObserverMock : public FormSubmissionObserver { public: - MOCK_METHOD1(DidNavigateMainFrame, void(bool form_may_be_submitted)); + MOCK_METHOD(void, + DidNavigateMainFrame, + (bool form_may_be_submitted), + (override)); }; class FormSubmissionTrackerUtilTest @@ -35,34 +38,32 @@ TEST_F(FormSubmissionTrackerUtilTest, NotRendererInitiated) { EXPECT_CALL(observer(), - DidNavigateMainFrame(false /* form_may_be_submitted */)); + DidNavigateMainFrame(/*form_may_be_submitted=*/false)); NotifyDidNavigateMainFrame( - false /* is_renderer_initiated */, ui::PAGE_TRANSITION_RELOAD, - true /* was_initiated_by_link_click */, &observer()); + /*is_renderer_initiated=*/false, ui::PAGE_TRANSITION_RELOAD, + /*was_initiated_by_link_click=*/true, &observer()); } TEST_F(FormSubmissionTrackerUtilTest, LinkTransition) { EXPECT_CALL(observer(), - DidNavigateMainFrame(false /* form_may_be_submitted */)); + DidNavigateMainFrame(/*form_may_be_submitted=*/false)); NotifyDidNavigateMainFrame( - true /* is_renderer_initiated */, ui::PAGE_TRANSITION_LINK, - true /* was_initiated_by_link_click */, &observer()); + /*is_renderer_initiated=*/true, ui::PAGE_TRANSITION_LINK, + /*was_initiated_by_link_click=*/true, &observer()); } TEST_F(FormSubmissionTrackerUtilTest, FormSubmission) { - EXPECT_CALL(observer(), - DidNavigateMainFrame(true /* form_may_be_submitted */)); + EXPECT_CALL(observer(), DidNavigateMainFrame(/*form_may_be_submitted=*/true)); NotifyDidNavigateMainFrame( - true /* is_renderer_initiated */, ui::PAGE_TRANSITION_FORM_SUBMIT, - true /* was_initiated_by_link_click */, &observer()); + /*is_renderer_initiated=*/true, ui::PAGE_TRANSITION_FORM_SUBMIT, + /*was_initiated_by_link_click=*/true, &observer()); } TEST_F(FormSubmissionTrackerUtilTest, PageRedirectAfterJavaScriptSubmission) { - EXPECT_CALL(observer(), - DidNavigateMainFrame(true /* form_may_be_submitted */)); + EXPECT_CALL(observer(), DidNavigateMainFrame(/*form_may_be_submitted=*/true)); NotifyDidNavigateMainFrame( - true /* is_renderer_initiated */, ui::PAGE_TRANSITION_CLIENT_REDIRECT, - false /* was_initiated_by_link_click */, &observer()); + /*is_renderer_initiated=*/true, ui::PAGE_TRANSITION_CLIENT_REDIRECT, + /*was_initiated_by_link_click=*/false, &observer()); } } // namespace
diff --git a/components/permissions_strings.grdp b/components/permissions_strings.grdp index 680966a..02daa7f 100644 --- a/components/permissions_strings.grdp +++ b/components/permissions_strings.grdp
@@ -228,6 +228,13 @@ Finding USB devices... </message> + <message name="IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_PROMPT_ORIGIN" desc="Text on a popup permission prompt asking the user whether they want to allow the site to access a private network device."> + <ph name="Origin">$1<ex>www.google.com</ex></ph> wants to access a device on your network: + </message> + <message name="IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONNECT_BUTTON_TEXT" desc="Label on the button that closes the private network chooser popup and connects the selected device."> + Connect + </message> + <if expr="not is_android"> <message name="IDS_GEOLOCATION_PERMISSION_CHIP" desc="Button text representing a request for the user's physical location from a website. When clicked, shows a permission prompt bubble with more information."> Use your location?
diff --git a/components/permissions_strings_grdp/IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONNECT_BUTTON_TEXT.png.sha1 b/components/permissions_strings_grdp/IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONNECT_BUTTON_TEXT.png.sha1 new file mode 100644 index 0000000..20765a7 --- /dev/null +++ b/components/permissions_strings_grdp/IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_CONNECT_BUTTON_TEXT.png.sha1
@@ -0,0 +1 @@ +e85e759ce08b832f935bf83fa95fef76f8778433 \ No newline at end of file
diff --git a/components/permissions_strings_grdp/IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_PROMPT_ORIGIN.png.sha1 b/components/permissions_strings_grdp/IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_PROMPT_ORIGIN.png.sha1 new file mode 100644 index 0000000..20765a7 --- /dev/null +++ b/components/permissions_strings_grdp/IDS_PRIVATE_NETWORK_DEVICE_CHOOSER_PROMPT_ORIGIN.png.sha1
@@ -0,0 +1 @@ +e85e759ce08b832f935bf83fa95fef76f8778433 \ No newline at end of file
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index e8a6d29..b527dff 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -1378,6 +1378,7 @@ <translation id="2269319728625047531">Habilitar Sync Consent durante el inicio de sesión</translation> <translation id="2270747976331889601">Habilita una función de seguridad de TLS 1.3 para los anclajes de veracidad locales.</translation> <translation id="22754818344448444">Permitir que los usuarios seleccionen un diseño de plantilla de escritorio para cargarlo</translation> +<translation id="2279381650184876122">Inhabilitar la compatibilidad de URLs de datos en SVGUseElement</translation> <translation id="2281496157391382819"> Controla las advertencias de privacidad de las sesiones de invitado administradas en <ph name="PRODUCT_OS_NAME" />. Si se asigna el valor "False" a esta política, se desactivarán las advertencias de privacidad en la pantalla de inicio de sesión y las notificaciones de inicio automático en las sesiones de invitado administradas. @@ -2059,6 +2060,7 @@ Si no se asigna ningún valor a esta política o se le asigna una URL no válida, <ph name="PRODUCT_NAME" /> no usará la política como fuente de reglas para cambiar de navegador. Nota: Esta política dirige a un archivo XML con el mismo formato que la política <ph name="IEEM_SITELIST_POLICY" /> de <ph name="IE_PRODUCT_NAME" />. Se cargarán las reglas de un archivo XML, sin compartirlas con <ph name="IE_PRODUCT_NAME" />. Puedes consultar más información sobre la política <ph name="IEEM_SITELIST_POLICY" /> de <ph name="IE_PRODUCT_NAME" /> en https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode</translation> +<translation id="2940284205859074236">Usar el renderizador de Skia para renderizar PDFs</translation> <translation id="2940653651012844682">Lista con los ajustes de los servicios de Chrome Enterprise Connectors que se van a aplicar al conector <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> de Enterprise, que se activa cuando se produce una actividad relacionada con la seguridad en Chrome. Esto incluye resultados negativos del análisis de Enterprise Connectors, reutilización de contraseñas, acceso a páginas no seguras y otras acciones del usuario relacionadas con la seguridad. El campo <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> identifica a qué proveedor de servicios de informes corresponde la configuración y el campo <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> identifica qué eventos están habilitados para este proveedor. @@ -2349,6 +2351,7 @@ <translation id="3169872426103732947">Mostrar la URL predeterminada y permitir que los usuarios cambien a la URL completa</translation> <translation id="3171369832001535378">Plantilla de nombre de host de red de dispositivo</translation> <translation id="3173844121395372156">Esta política está obsoleta y no se admite. Usa la política <ph name="NATIVE_MESSAGING_ALLOWLIST_POLICY_NAME" /> en su lugar.</translation> +<translation id="3177537290334203187">Usar el comportamiento predeterminado para definir si los sitios web pueden enviar solicitudes a los endpoints de red</translation> <translation id="3177802893484440532">Requiere comprobaciones de OCSP/CRL online para los anclajes de veracidad locales</translation> <translation id="3179533009079100620">Mostrar selector de perfil</translation> <translation id="3180671894201217988">Si se habilita la política o no se le asigna ningún valor, se impide que software de terceros pueda insertar código ejecutable en los procesos de <ph name="PRODUCT_NAME" />. @@ -2379,6 +2382,7 @@ Si no se asigna ningún valor a <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" />, no se mostrará ninguna página Nueva pestaña.</translation> <translation id="3195103497550111266">Si se le asigna el valor "<ph name="DEVICE_LTS_TAG_VALUE" />" a esta política, el dispositivo podrá recibir actualizaciones de LTS (asistencia a largo plazo).</translation> +<translation id="319608028525745507">Habilitar la compatibilidad de URLs de datos en SVGUseElement</translation> <translation id="3196585866522778760">Ten en cuenta que esta política está obsoleta y se eliminará de la versión 85 de <ph name="PRODUCT_OS_NAME" />. Utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> en su lugar. Permite especificar el tiempo que debe transcurrir sin que el usuario realice ninguna acción antes de que se habilite el modo de inactividad (con batería). @@ -3176,6 +3180,7 @@ Si esta política no se configura, el protocolo SPDY estará disponible.</translation> <translation id="3887529334667818189">Los recorridos serán visibles en chrome://history/journeys de forma predeterminada y los usuarios podrán cambiar la visibilidad de los recorridos.</translation> +<translation id="3889458462150559611">Permitir que los sitios web envíen solicitudes a cualquier endpoint de red de forma no segura</translation> <translation id="388999630001435491">Permitir que <ph name="PRODUCT_NAME" /> solo se conecte a dispositivos a través de direcciones IP privadas</translation> <translation id="3891175633496805812">Inhabilitar el controlador de diagnóstico y telemetría wilco</translation> <translation id="3891357445869647828">Habilitar JavaScript</translation> @@ -3585,6 +3590,7 @@ Si no se le asigna ningún valor, los sitios web podrán solicitar acceso, pero los usuarios podrán cambiar esta opción.</translation> <translation id="4275048399551500192">No mostrar controles multimedia para las sesiones de <ph name="PRODUCT_NAME" /> iniciadas por otros dispositivos</translation> +<translation id="4282183301963493864">Inhabilitar <ph name="PRODUCT_NAME" /> en todas las páginas web</translation> <translation id="4282243913059705499">Mostrar siempre el icono de <ph name="PRODUCT_NAME" /> en la barra de herramientas</translation> <translation id="4285674129118156176">Permitir que los usuarios no afiliados utilicen ARC</translation> <translation id="428948795004445932">Intervalo en el que se muestrean y recogen los datos de red. El valor mínimo permitido es 1 minuto. @@ -3815,6 +3821,7 @@ Para obtener información detallada sobre los patrones válidos de <ph name="URL_LABEL" />, consulta https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="449561952193478261">Color azul para la retroiluminación del teclado</translation> <translation id="449784980858429908">Permite conceder permiso automáticamente a sitios para conectarse a todos los puertos serie.</translation> +<translation id="4498626728750662965">El visor de PDFs usa el renderizador de Skia</translation> <translation id="4499376951770369935">Las actualizaciones de ChromeOS se configuran a la versión definida en el manifiesto de la aplicación de kiosco</translation> <translation id="450080746522343150">Bloquear todas las descargas.</translation> <translation id="4501388411278568771">Los cambios a HTTPS pueden aplicarse en función del estado del lanzamiento de la función.</translation> @@ -4238,6 +4245,7 @@ Si no se le asigna ningún valor, <ph name="PRODUCT_NAME" /> solo se conectará con dispositivos de emisión en direcciones de RFC 1918 o RFC 4193, a no ser que la función CastAllowAllIPs esté activada.</translation> <translation id="489803897780524242">Parámetro que controla el emplazamiento de los términos de búsqueda para el proveedor de búsquedas predeterminado</translation> <translation id="4899708173828500852">Habilitar Navegación segura</translation> +<translation id="4904462841601272815">Habilitar <ph name="PRODUCT_NAME" /> en todas las páginas web</translation> <translation id="4906194810004762807">Frecuencia de actualización de Device Policy</translation> <translation id="49093841899738146">Si se habilita esta política, <ph name="PRODUCT_NAME" /> podrá recoger registros de eventos WebRTC procedentes de servicios de Google como Hangouts Meet y enviarlos a Google. Esos registros tienen información de diagnóstico para depurar errores de llamadas de audio o videollamadas en <ph name="PRODUCT_NAME" />, como la hora y el tamaño de los paquetes RTP, datos sobre la congestión de la red y metadatos del tiempo y la calidad de los frames de audio y vídeo. Estos registros no tienen contenido de audio ni de vídeo de la reunión. Para facilitar la depuración, Google podría asociar estos registros, mediante un ID de sesión, a otros registros recogidos por el propio servicio de Google. @@ -6164,6 +6172,7 @@ - Si se inhabilita esta política, las funciones del navegador estarán limitadas. - Si se inhabilita esta política, los administradores deberán comunicárselo a los usuarios finales del dispositivo.</translation> +<translation id="6607983779935460461">Compatibilidad de URLs de datos con SVGUseElement</translation> <translation id="6609867253856597039">Establecer la experiencia de usuario de funciones inhabilitadas</translation> <translation id="6614557704487944013">Permitir que los usuarios utilicen el navegador <ph name="LACROS_NAME" /></translation> <translation id="661610294649586421">No permitir solicitudes de la API WebAuthn en sitios con certificados TLS dañados.</translation> @@ -6758,6 +6767,7 @@ Si estableces esta política, los usuarios no podrán cambiarla ni anularla. Si no la estableces, el botón izquierdo del ratón será el principal inicialmente, pero el usuario podrá cambiarlo en cualquier momento.</translation> +<translation id="7136237405361383549">Usar el renderizador predeterminado según la configuración de la prueba de campo</translation> <translation id="7137460825181247519">Esta política está obsoleta en <ph name="PRODUCT_NAME" /> 83. Usa la política <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> en su lugar. Si se habilita la política, la función Navegación segura de Chrome permanecerá activada. Si la política se inhabilita, Navegación segura seguirá desactivada. @@ -7359,6 +7369,13 @@ <translation id="7703041979684393741">No permitir que se recojan registros de eventos WebRTC de los servicios de Google</translation> <translation id="770339941914297201">Comportamiento nuevo: las aplicaciones de kiosco de Chrome solo se actualizarán con la URL de actualización de la política</translation> <translation id="7703737669292992839">Evitar los cuadros de diálogo de selección de archivos</translation> +<translation id="7703819160640109959">Controla si el visor de PDFs de <ph name="PRODUCT_NAME" /> usa el renderizador de Skia. + +Si se habilita esta política, el visor de PDFs usará el renderizador de Skia. + +Si se inhabilita esta política, el visor de PDFs usará el renderizador de AGG actual. + +Si no se establece esta política, el navegador seleccionará el renderizador de PDFs.</translation> <translation id="7708934468069982537">Esta política se retiró en la versión M58 después de que DHE se retirase de <ph name="PRODUCT_NAME" />. Si esta política no se define o se le asigna el valor false, no se habilitarán los paquetes de cifrado DHE en TLS. De lo contrario, se le podrá asignar el valor true para habilitar los paquetes de cifrado DHE y mantener la compatibilidad con un servidor obsoleto. Se trata de una solución provisional y se debería volver a configurar el servidor. @@ -7774,6 +7791,7 @@ <translation id="8091982561085048989">Indicador booleano que especifica si se debe usar IPP Everywhere para configurar la impresora. Este indicador es compatible con <ph name="PRODUCT_OS_NAME" /> 76 y versiones posteriores.</translation> <translation id="8099880303030573137">Retraso de inactividad cuando el dispositivo funciona con la batería</translation> <translation id="8101381354936029836">Grupo atómico de la política:</translation> +<translation id="8102854005031553638">El visor de PDFs usa el renderizador de AGG</translation> <translation id="8102913158860568230">Opción predeterminada de MediaStream</translation> <translation id="8104962233214241919">Seleccionar automáticamente certificados de cliente de estos sitios</translation> <translation id="8109762054721090517">Plantilla del <ph name="IPP_ATTRIBUTE" /> de <ph name="INTERNET_PRINTING_PROTOCOL" /> <ph name="CLIENT_NAME_IPP_ATTRIBUTE" /></translation> @@ -8548,6 +8566,9 @@ <translation id="8777369558049831576">Permite mostrar la casilla Siempre abierto en el cuadro de diálogo de un protocolo externo.</translation> <translation id="8778320022586618010">Habilitar los informes sobre el estado de los gráficos del dispositivo</translation> <translation id="8780039702448388726">Inhabilitar los informes sobre la versión del dispositivo</translation> +<translation id="8782203407766130175">Esta política habilita la compatibilidad de las URLs de datos con SVGUseElement, que se inhabilitará de forma predeterminada a partir de la versión M119. + Si se habilita esta política, las URLs de datos seguirán funcionando en SVGUseElement. + Si se inhabilita esta política o no se establece, las URLs de datos no funcionarán en SVGUseElement.</translation> <translation id="8786409859071107656">Si se habilita esta política, se activa la política de gestión de energía compartida por USB. Algunos dispositivos tienen un puerto USB específico marcado con un icono de rayo o de batería para cargar dispositivos usando la batería del sistema. Esta política afecta al comportamiento de carga de este puerto cuando el sistema está en modo de suspensión o apagado, pero no afecta a los otros puertos USB ni al comportamiento de carga mientras el sistema está activo. En este caso, el puerto USB siempre suministra energía. @@ -8616,6 +8637,9 @@ <translation id="8858642179038618439">Forzar el modo de seguridad de YouTube</translation> <translation id="8860342862142842017">Inhabilitar los requisitos de la transparencia en los certificados en una lista de hashes subjectPublicKeyInfo</translation> <translation id="8860894781631833477">Los usuarios pueden configurar el canal de lanzamiento de <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="8862436312516745856">Si se habilita o no se establece, <ph name="PRODUCT_NAME" /> se permitirá en todas las páginas web. + +Si se inhabilita, <ph name="PRODUCT_NAME" /> no estará disponible en ninguna página web.</translation> <translation id="8864975621965365890">Elimina el mensaje de desactivación que aparece cuando <ph name="PRODUCT_FRAME_NAME" /> muestra un sitio.</translation> <translation id="8866430022832109569">Informes de inventario de aplicaciones</translation> <translation id="886645881209114007">Permite a los usuarios usar <ph name="PLUGIN_VM_NAME" /> en <ph name="PRODUCT_OS_NAME" /></translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index ae8cc6f..4efaa09dc 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -3225,6 +3225,14 @@ 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation> <translation id="4061590579642538878">障害レポートに関する情報を報告します。</translation> +<translation id="4062646759141042418"><ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> を有効にする URL のリストを指定します。 + +このポリシーでは、<ph name="PRODUCT_NAME" /> で管理対象プロファイルの認証フローを開始するよう提案する URL を指定できます。指定したウェブサイトでは、認証済みのコンテキストアウェア シグナルのセットをデバイスから取得できます。 +このポリシーは、<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> の Chrome Enterprise Connectors のページからのみ設定できます。このポリシーを未設定のままにするか空白にした場合は、どのウェブサイトも、ユーザーレベルの認証フローを開始してデバイスからシグナルを受け取ることはできません。ただし、対応する <ph name="BROWSER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> ポリシーを有効にすると、管理対象ブラウザの認証フローを開始してデバイス シグナルを収集することができます。 + +<ph name="PRODUCT_OS_NAME" /> では、このポリシーはリモート認証に関連付けられ、証明書が自動的に生成されてサーバーにアップロードされます。デバイスのログイン画面での認証フローの使用については、<ph name="DEVICE_LOGIN_SCREEN_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST_POLICY_NAME" /> ポリシーで管理できます。 + +有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://support.google.com/chrome/a?p=url_blocklist_filter_format をご覧ください。</translation> <translation id="4070039109671307724">その他</translation> <translation id="4072225853834793549">ログイン画面でユーザー補助のショートカットを無効にする</translation> <translation id="4075675819066819571">シェルフを画面の左側に配置する</translation> @@ -3959,6 +3967,7 @@ このポリシーを true に設定した場合、システム音声エコー キャンセラは常に有効になります。 このポリシーを false に設定するか未設定のままにした場合、システム音声エコー キャンセラはリリース日程に基づいて引き続き有効になることがありますが、このポリシーによって強制適用されることはありません。</translation> +<translation id="4800865664096110749">管理対象プロファイルで <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> の認証フローを有効にする URL のリストを指定する</translation> <translation id="4801512016965057443">モバイル データ ローミングを許可する</translation> <translation id="4801647366128872782">レガシー テクノロジー レポートを許可する URL を指定する</translation> <translation id="4802744647065138872">緊急のロールバックに備えて保持するユーザーデータのスナップショット数を制限します。</translation> @@ -5180,6 +5189,14 @@ 設定しない場合、<ph name="PRODUCT_NAME" /> ではデフォルトのキャッシュ ディレクトリが使用されますが、ユーザーは「--disk-cache-dir」コマンドライン フラグを使って設定を変更できます。 <ph name="PRODUCT_NAME" /> では、ボリュームのルート ディレクトリのコンテンツが管理されます。したがって、データの消失やその他のエラーを避けるため、ルート ディレクトリや他の用途で使用されてるディレクトリは指定しないでください。使用できる変数については、https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables をご覧ください。</translation> +<translation id="6082391187598394288">このポリシーは、PPB_VideoDecoder(Dev) API のサポートを強制的に有効にする目的で一時的に使用できます。 + +このポリシーを未設定のままにするか無効に設定した場合、API をサポートするかどうかはブラウザが判断します。 +このポリシーを有効に設定した場合は、API がサポートされます。 + +このポリシーは、この API のサポート終了に伴い問題が生じた場合に使用できます。このポリシーを使用する必要がある場合は、crbug.com でユースケースをご説明のうえバグを報告し、{blundell, vasilyt}@chromium.org を CC に含めてください。このポリシーは、<ph name="PRODUCT_NAME" /> バージョン 114 まで使用でき、それ以降ではこの API のサポートは恒久的に終了しています。 + +注: ブラウザの実行中にこのポリシーを変更した場合は、新たに開始したレンダラ プロセスにのみ変更が反映されます。</translation> <translation id="6083631234867522991">Windows(Windows クライアント):</translation> <translation id="608788685013546076">電力ピークシフトのバッテリーのしきい値をパーセントで設定する</translation> <translation id="6089679180657323464">Wilco の診断およびテレメトリー用コントローラの設定を制御します。</translation> @@ -5304,6 +5321,12 @@ このポリシーで有効な 16 進数色コードを指定した場合、その色に基づいたテーマが自動的に生成され、ブラウザに適用されます。ユーザーは、ポリシーで設定されたテーマを変更できません。 このポリシーを未設定のままにした場合、ユーザーはブラウザのテーマを自由に変更できます。</translation> +<translation id="6195356309340063061"><ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> を有効にする URL のリストを指定します。 + +このポリシーでは、<ph name="PRODUCT_NAME" /> で管理対象ブラウザの認証フローを開始するよう提案する URL を指定できます。指定したウェブサイトでは、認証済みのコンテキストアウェア シグナルのセットをデバイスから取得できます。 +このポリシーは、<ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME" /> の Chrome Enterprise Connectors のページからのみ設定できます。このポリシーを未設定のままにするか空白にした場合は、どのウェブサイトも、ブラウザレベルの認証フローを開始してデバイスからシグナルを受け取ることはできません。ただし、対応する <ph name="USER_CONTEXT_AWARE_ACCESS_SIGNALS_ALLOWLIST" /> ポリシーを有効にすると、管理対象プロファイルの認証フローを開始してデバイス シグナルを収集することができます。 + +有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://support.google.com/chrome/a?p=url_blocklist_filter_format をご覧ください。</translation> <translation id="6195802366906945965">サーバー証明書の確認に組み込みの証明書確認機能を使用する</translation> <translation id="6198947200418556248">このポリシーはサポートが終了しています。Cookie を以前の動作に戻す必要がある場合は、<ph name="LEGACY_SAMESITE_COOKIE_BEHAVIOR_ENABLED_FOR_DOMAIN_LIST_POLICY_NAME" /> ポリシーを使用してください。すべての Cookie を以前の <ph name="ATTRIBUTE_SAMESITE_NAME" /> 動作に戻します。以前の動作に戻すと、<ph name="ATTRIBUTE_SAMESITE_NAME" /> 属性のない Cookie は「<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />」が指定されたものとして扱われます。また、「<ph name="ATTRIBUTE_VALUE_SAMESITE_NONE" />」の Cookie に「<ph name="ATTRIBUTE_SECURE_NAME" />」属性は必須ではなくなります。さらに、2 つのサイトが同一サイトかどうかを評価する際に、スキーム比較がスキップされます。詳細については https://www.chromium.org/administrators/policy-list-3/cookie-legacy-samesite-policies をご覧ください。 @@ -6816,6 +6839,7 @@ このポリシーを無効に設定した場合、URL キーによる匿名化データの収集は行われません。 このポリシーを未設定のままにした場合、ユーザーはこの設定を手動で変更できます。</translation> +<translation id="7585312329612243723">管理対象ブラウザで <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> の認証フローを有効にする URL のリストを指定する</translation> <translation id="7587345076013230465">ログイン画面で自動選択ポリシーが複数の証明書と一致した場合に、クライアント証明書を選択するよう求めるメッセージを常にユーザーに表示する</translation> <translation id="7587921466180902617">ファミリー リンクのユーザーに対してスクリーンキャスト dogfood を有効にする</translation> <translation id="759957074386651883">セーフ ブラウジングの設定</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 67cec70..353bb594 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1378,6 +1378,7 @@ <translation id="2269319728625047531">로그인 시 동기화 동의 표시 사용</translation> <translation id="2270747976331889601">로컬 트러스트 앵커에 TLS 1.3 보안 기능을 사용합니다.</translation> <translation id="22754818344448444">사용자가 로드할 데스크 템플릿 레이아웃을 선택하도록 허용</translation> +<translation id="2279381650184876122">SVGUseElement에서 데이터 URL 지원을 사용 중지합니다.</translation> <translation id="2281496157391382819"><ph name="PRODUCT_OS_NAME" />에서 관리되는 게스트 세션의 개인 정보 보호 경고를 제어합니다. 정책을 False로 설정하면 로그인 화면의 개인 정보 보호 경고와 관리되는 게스트 세션 내부의 자동 실행 알림이 비활성화됩니다. @@ -2058,6 +2059,7 @@ 정책을 설정하지 않거나 유효한 URL로 설정하지 않으면 <ph name="PRODUCT_NAME" />에서 브라우저를 전환하는 규칙의 출처로 이 정책을 사용하지 않습니다. 참고: 이 정책은 <ph name="IE_PRODUCT_NAME" />의 <ph name="IEEM_SITELIST_POLICY" /> 정책과 동일한 형식의 XML 파일로 연결됩니다. 정책은 XML 파일에서 규칙을 로드하지만 이를 <ph name="IE_PRODUCT_NAME" />와 공유하지는 않습니다. <ph name="IE_PRODUCT_NAME" />의 <ph name="IEEM_SITELIST_POLICY" /> 정책(https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode)을 자세히 살펴보세요.</translation> +<translation id="2940284205859074236">PDF 렌더링에 Skia 렌더기 사용</translation> <translation id="2940653651012844682"><ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> Enterprise 커넥터에 적용할 Chrome Enterprise 커넥터 서비스 설정의 목록으로, Chrome에서 보안 관련 활동이 발생할 때 실행됩니다. 보안 관련 활동에는 Enterprise 커넥터 분석, 비밀번호 재사용, 안전하지 않은 페이지 탐색 및 보안에 민감한 다른 사용자 작업에 의한 부정적인 평가가 포함됩니다. <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> 필드는 설정에 해당하는 보고 서비스 제공업체를 나타내며 <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> 필드는 이 제공업체를 대상으로 사용 설정되는 이벤트를 지정합니다. @@ -2348,6 +2350,7 @@ <translation id="3169872426103732947">기본 URL 표시, 사용자가 전체 URL로 전환하도록 허용</translation> <translation id="3171369832001535378">기기 네트워크 호스트 이름 템플릿</translation> <translation id="3173844121395372156">이 정책은 지원 중단되었으며 지원되지 않습니다. 대신 '<ph name="NATIVE_MESSAGING_ALLOWLIST_POLICY_NAME" />' 정책을 사용하세요.</translation> +<translation id="3177537290334203187">웹사이트에서 네트워크 엔드포인트에 요청할 수 있는지 여부를 결정할 때 기본 동작을 사용합니다.</translation> <translation id="3177802893484440532">로컬 트러스트 앵커에 온라인 OCSP/CRL 확인을 요구합니다.</translation> <translation id="3179533009079100620">프로필 선택 도구 표시</translation> <translation id="3180671894201217988">정책을 사용으로 설정하거나 설정하지 않으면 타사 소프트웨어에서 <ph name="PRODUCT_NAME" />의 프로세스에 실행 가능한 코드를 삽입할 수 없습니다. @@ -2378,6 +2381,7 @@ <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" />을 설정하지 않으면 새 탭 페이지가 제공되지 않습니다.</translation> <translation id="3195103497550111266">이 정책을 <ph name="DEVICE_LTS_TAG_VALUE" />로 설정하면 기기가 LTS(장기적 지원) 업데이트를 받을 수 있습니다.</translation> +<translation id="319608028525745507">SVGUseElement에서 데이터 URL 지원을 사용 설정합니다.</translation> <translation id="3196585866522778760">이 정책은 지원이 중단되었으며 <ph name="PRODUCT_OS_NAME" /> 버전 85에서 삭제될 예정입니다. 대신 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> 정책을 사용하세요. 배터리 전원으로 실행할 때 사용자 입력이 없어서 유휴 작업이 실행되기까지 걸리는 시간을 지정합니다. @@ -3171,6 +3175,7 @@ 이 정책을 설정하지 않으면 SPDY를 사용할 수 있습니다.</translation> <translation id="3887529334667818189">탐색 여정이 기본적으로 chrome://history/journeys에 표시되며 사용자가 표시 여부를 변경할 수 있습니다.</translation> +<translation id="3889458462150559611">웹사이트에서 안전하지 않은 방식으로 네트워크 엔드포인트에 요청할 수 있도록 허용합니다.</translation> <translation id="388999630001435491"><ph name="PRODUCT_NAME" />에서 비공개 IP 주소의 기기에만 연결하도록 허용</translation> <translation id="3891175633496805812">Wilco 진단 및 텔레메트리 컨트롤러 사용 중지</translation> <translation id="3891357445869647828">자바스크립트 사용</translation> @@ -3580,6 +3585,7 @@ 정책을 설정하지 않으면 웹사이트에서 액세스 권한을 요청할 수 있지만, 사용자가 이 설정을 변경할 수 있습니다.</translation> <translation id="4275048399551500192">다른 기기에서 시작한 <ph name="PRODUCT_NAME" /> 세션에 미디어 컨트롤을 표시하지 않음</translation> +<translation id="4282183301963493864">모든 웹페이지에서 <ph name="PRODUCT_NAME" /> 사용 중지</translation> <translation id="4282243913059705499">툴바에 <ph name="PRODUCT_NAME" /> 아이콘 항상 표시</translation> <translation id="4285674129118156176">제휴되지 않은 사용자가 ARC를 사용할 수 있게 허용</translation> <translation id="428948795004445932">네트워크 데이터가 샘플링 및 수집되는 속도입니다. 허용되는 최솟값은 1분입니다. @@ -3810,6 +3816,7 @@ 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://support.google.com/chrome/a?p=url_blocklist_filter_format을 참고하세요.</translation> <translation id="449561952193478261">키보드 백라이트 색상: 파란색</translation> <translation id="449784980858429908">사이트에 모든 직렬 포트에 연결할 권한을 자동으로 부여합니다.</translation> +<translation id="4498626728750662965">PDF 뷰어는 Skia 렌더기를 사용합니다.</translation> <translation id="4499376951770369935">ChromeOS 업데이트가 키오스크 앱 매니페스트에 정의된 버전으로 설정됨</translation> <translation id="450080746522343150">모든 다운로드를 차단합니다.</translation> <translation id="4501388411278568771">기능 출시 상태에 따라 HTTPS 업그레이드가 적용될 수 있습니다.</translation> @@ -4235,6 +4242,7 @@ 정책을 설정하지 않으면 CastAllowAllIPs 기능이 사용 설정되어 있지 않은 한 <ph name="PRODUCT_NAME" />이(가) RFC1918/RFC4193에서만 Cast 기기에 연결됩니다.</translation> <translation id="489803897780524242">기본 검색 공급자의 검색어 위치를 조정하는 매개변수</translation> <translation id="4899708173828500852">세이프 브라우징 사용</translation> +<translation id="4904462841601272815">모든 웹페이지에서 <ph name="PRODUCT_NAME" /> 사용 설정</translation> <translation id="4906194810004762807">기기 정책 새로고침 빈도</translation> <translation id="49093841899738146">정책을 사용 설정하면 <ph name="PRODUCT_NAME" />에서 행아웃 Meet과 같은 Google 서비스의 WebRTC 이벤트 로그를 수집하고 Google에 업로드할 수 있습니다. 이러한 로그에는 RTP 패킷의 시간 및 크기, 네트워크 혼잡에 관한 의견, 오디오/동영상 프레임의 시간 및 품질에 관한 메타데이터 등 <ph name="PRODUCT_NAME" />의 음성/화상 회의에서 발생하는 문제를 디버깅하는 데 유용한 진단 정보가 포함됩니다. 이러한 로그에는 회의의 오디오/동영상 콘텐츠가 포함되지 않습니다. 디버깅을 더 용이하게 하기 위해 Google에서는 세션 ID를 통해 이러한 로그를 Google 서비스에서 수집한 다른 로그와 연결할 수 있습니다. @@ -6142,6 +6150,7 @@ - 정책을 사용 안함으로 설정하면 브라우저의 기능이 제한됩니다. - 정책을 사용 안함으로 설정하면 관리자가 기기의 최종 사용자에게 이를 알려야 합니다.</translation> +<translation id="6607983779935460461">SVGUseElement에 대한 데이터 URL 지원.</translation> <translation id="6609867253856597039">사용 중지된 기능의 사용자 환경 설정</translation> <translation id="6614557704487944013">사용자가 <ph name="LACROS_NAME" /> 브라우저를 사용하도록 허용</translation> <translation id="661610294649586421">손상된 TLS 인증서가 있는 사이트의 WebAuthn API 요청을 허용하지 않습니다.</translation> @@ -6736,6 +6745,7 @@ 정책이 설정되면 사용자가 변경하거나 재정의할 수 없습니다. 정책이 설정되지 않으면 처음에는 마우스 왼쪽 버튼이 기본 버튼으로 지정되지만 사용자가 언제든지 전환할 수 있습니다.</translation> +<translation id="7136237405361383549">필드 체험판 구성에 따라 기본 렌더기를 사용합니다.</translation> <translation id="7137460825181247519">이 정책은 <ph name="PRODUCT_NAME" /> 83에서 지원 중단되었으므로 <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />을 대신 사용하세요. 정책을 사용으로 설정하면 Chrome 세이프 브라우징 기능이 사용 설정된 상태로 유지됩니다. 정책을 사용 안함으로 설정하면 세이프 브라우징이 사용 중지된 상태로 유지됩니다. @@ -7318,6 +7328,13 @@ <translation id="7703041979684393741">Google 서비스에서 WebRTC 이벤트 로그 수집 허용 안함</translation> <translation id="770339941914297201">새 동작: 키오스크 Chrome 앱이 정책의 업데이트 URL만 사용하여 업데이트됨</translation> <translation id="7703737669292992839">파일 선택 대화상자 차단</translation> +<translation id="7703819160640109959"><ph name="PRODUCT_NAME" />의 PDF 뷰어에서 Skia 렌더기를 사용할지 여부를 제어합니다. + +이 정책이 사용 설정되면 PDF 뷰어가 Skia 렌더기를 사용합니다. + +정책을 사용 중지하면 PDF 뷰어에서 현재 AGG 렌더기를 사용합니다. + +정책을 설정하지 않으면 브라우저에서 PDF 렌더러를 선택합니다.</translation> <translation id="7708934468069982537">이 정책은 DHE가 <ph name="PRODUCT_NAME" />에서 삭제된 후 M58에서 삭제되었습니다. 정책이 설정되지 않거나 False로 설정되면 TLS의 DHE 암호화 스위트가 사용 설정되지 않습니다. 아니면 DHE 암호화 스위트를 사용 설정하고 오래된 서버와의 호환성을 유지하기 위해 True로 설정될 수 있습니다. 임시방편이므로 서버를 다시 구성해야 합니다. @@ -7731,6 +7748,7 @@ <translation id="8091982561085048989">프린터 설정 시 IPP Everywhere의 사용 여부를 나타내는 부울 플래그입니다. 이 플래그는 <ph name="PRODUCT_OS_NAME" /> 버전 76 이상에서 지원됩니다.</translation> <translation id="8099880303030573137">배터리 전원으로 실행할 때 유휴 지연</translation> <translation id="8101381354936029836">정책 전체 그룹:</translation> +<translation id="8102854005031553638">PDF 뷰어는 AGG 렌더기를 사용합니다.</translation> <translation id="8102913158860568230">기본 mediastream 설정</translation> <translation id="8104962233214241919">이 사이트에 대해 클라이언트 인증서를 자동으로 선택합니다.</translation> <translation id="8109762054721090517"><ph name="CLIENT_NAME_IPP_ATTRIBUTE" /> <ph name="INTERNET_PRINTING_PROTOCOL" /> <ph name="IPP_ATTRIBUTE" /> 템플릿</translation> @@ -8501,6 +8519,9 @@ <translation id="8777369558049831576">외부 프로토콜 대화상자에 '항상 열기' 체크박스 표시</translation> <translation id="8778320022586618010">기기 그래픽 상태 보고 사용 설정</translation> <translation id="8780039702448388726">기기 버전 정보 보고 사용 중지</translation> +<translation id="8782203407766130175">이 정책은 SVGUseElement에 대한 데이터 URL 지원을 사용 설정하며 M119부터 기본적으로 사용 중지됩니다. + 정책을 사용으로 설정하면 SVGUseElement에서 데이터 URL이 계속 작동합니다. + 정책을 사용 안함으로 설정하거나 설정하지 않으면 SVGUseElement에서 데이터 URL이 작동하지 않습니다.</translation> <translation id="8786409859071107656">정책을 사용 설정하면 USB 전원 공유 전원 관리 정책이 사용 설정됩니다. 일부 기기에는 번개 모양 또는 배터리 아이콘으로 표시된 특정 USB 포트가 있어 시스템 배터리로 기기를 충전합니다. 이 정책은 시스템이 절전 모드 또는 종료 모드일 때 USB 포트에서 기기를 충전하는 방식에 영향을 미칩니다. USB 포트가 항상 전원을 공급할 경우 시스템이 활성화 상태일 때의 충전 방식과 다른 USB 포트에 영향을 주지 않습니다. @@ -8569,6 +8590,9 @@ <translation id="8858642179038618439">YouTube 안전 모드를 강제로 사용합니다.</translation> <translation id="8860342862142842017">subjectPublicKeyInfo 해시 목록에 인증서 투명성 시행 사용 중지</translation> <translation id="8860894781631833477">사용자가 <ph name="PRODUCT_OS_NAME" /> 출시 채널을 구성할 수 있음</translation> +<translation id="8862436312516745856">정책을 사용으로 설정하거나 설정하지 않으면 모든 웹페이지에서 <ph name="PRODUCT_NAME" />이 허용됩니다. + +사용 안함으로 설정하면 어떤 웹페이지에서도 <ph name="PRODUCT_NAME" />을 사용할 수 없습니다.</translation> <translation id="8864975621965365890"><ph name="PRODUCT_FRAME_NAME" />에서 사이트를 렌더링할 때 나타나는 종료 프롬프트를 표시하지 않습니다.</translation> <translation id="8866430022832109569">앱 인벤토리 보고</translation> <translation id="886645881209114007">사용자가 <ph name="PRODUCT_OS_NAME" />에서 <ph name="PLUGIN_VM_NAME" />을(를) 사용하도록 허용합니다</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index d77f15cf..bec8227 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1375,6 +1375,7 @@ <translation id="2269319728625047531">Запрашивать согласие на синхронизацию при входе в аккаунт</translation> <translation id="2270747976331889601">Использовать функцию безопасности протокола TLS 1.3 для локальных якорей доверия</translation> <translation id="22754818344448444">Разрешить пользователям выбирать шаблоны для рабочего стола</translation> +<translation id="2279381650184876122">Отключить поддержку URL данных в SVGUseElement</translation> <translation id="2281496157391382819"> Позволяет управлять предупреждением о конфиденциальности для управляемого гостевого сеанса в <ph name="PRODUCT_OS_NAME" />. Если указано значение False, предупреждения о конфиденциальности на экране входа и уведомления об автоматических запусках управляемых гостевых сеансов будут отключены. @@ -2055,6 +2056,7 @@ Если задан недействительный URL или правило не настроено, <ph name="PRODUCT_NAME" /> не использует его как источник данных о порядке переключения между браузерами. Обратите внимание, что это правило указывает на XML-файл в том же формате, что и правило <ph name="IEEM_SITELIST_POLICY" /> для <ph name="IE_PRODUCT_NAME" />. Элементы списка загружаются из XML-файла без предоставления доступа к ним браузеру <ph name="IE_PRODUCT_NAME" />. Более подробные сведения о правиле <ph name="IEEM_SITELIST_POLICY" /> для <ph name="IE_PRODUCT_NAME" /> можно найти на странице https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode.</translation> +<translation id="2940284205859074236">Использование средства обработки Skia для файлов PDF</translation> <translation id="2940653651012844682">Список настроек, применяемых к коннектору <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> для Chrome Enterprise. Коннектор запускается, когда в Chrome регистрируются события безопасности, например повторное использование паролей, переход на небезопасные страницы, получение отрицательных результатов анализа, запущенного коннекторами Chrome Enterprise, и другие действия пользователей, потенциально нарушающие правила безопасности. Значение поля <ph name="ENTERPRISE_CONNECTOR_SERVICE_PROVIDER_FIELD" /> определяет, какому поставщику отчетов соответствуют эти настройки. Значение поля <ph name="ENTERPRISE_CONNECTOR_ENABLED_EVENT_NAMES_FIELD" /> указывает, какие события допустимы для этого поставщика. @@ -2345,6 +2347,7 @@ <translation id="3169872426103732947">Показывать URL по умолчанию, разрешить пользователям переключаться на показ полного URL</translation> <translation id="3171369832001535378">Шаблон сетевого имени хоста устройства</translation> <translation id="3173844121395372156">Это правило больше не поддерживается. Используйте вместо него правило <ph name="NATIVE_MESSAGING_ALLOWLIST_POLICY_NAME" />.</translation> +<translation id="3177537290334203187">Использовать поведение по умолчанию, если выясняется, что сайты могут отправлять запросы в конечные точки сети</translation> <translation id="3177802893484440532">Настроить обязательное выполнение онлайн-проверок OCSP/CRL для локальных якорей доверия</translation> <translation id="3179533009079100620">Показать окно выбора профиля</translation> <translation id="3180671894201217988">Если правило включено или не настроено, стороннее ПО не сможет внедрять исполняемый код в процессы <ph name="PRODUCT_NAME" />. @@ -2374,6 +2377,7 @@ Если правило <ph name="DEFAULT_SEARCH_PROVIDER_NEW_TAB_URL_POLICY_NAME" /> не настроено, страница быстрого доступа не будет использоваться.</translation> <translation id="3195103497550111266">Если установлено значение <ph name="DEVICE_LTS_TAG_VALUE" />, устройство сможет получать обновления долгосрочной поддержки.</translation> +<translation id="319608028525745507">Включить поддержку URL данных в SVGUseElement</translation> <translation id="3196585866522778760">Правило больше не поддерживается и будет удалено из <ph name="PRODUCT_OS_NAME" /> 85. Вместо него используйте следующее: <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Определяет период неактивности пользователя при работе от батареи, после которого будет выполнен переход в режим бездействия. @@ -3167,6 +3171,7 @@ Если это правило не установлено, протокол SPDY будет доступен.</translation> <translation id="3887529334667818189">По умолчанию показывать сеансы на странице chrome://history/journeys и разрешать пользователям настраивать доступ к этим сведениям</translation> +<translation id="3889458462150559611">Разрешить сайтам небезопасную отправку запросов к любым конечным точкам сети</translation> <translation id="388999630001435491">Разрешить <ph name="PRODUCT_NAME" /> подключаться только к устройствам с частным IP-адресом</translation> <translation id="3891175633496805812">Отключить контроллер телеметрии и диагностики Wilco</translation> <translation id="3891357445869647828">Включить JavaScript</translation> @@ -3572,6 +3577,7 @@ Если правило не настроено, сайты получат такое разрешение, но пользователи смогут его изменить.</translation> <translation id="4275048399551500192">Не показывать элементы управления медиаконтентом для трансляций <ph name="PRODUCT_NAME" />, запущенных с других устройств в локальной сети</translation> +<translation id="4282183301963493864">Отключить продукт "<ph name="PRODUCT_NAME" />" на всех веб-страницах</translation> <translation id="4282243913059705499">Всегда показывать значок <ph name="PRODUCT_NAME" /> на панели инструментов</translation> <translation id="4285674129118156176">Разрешение неаффилированным пользователям запускать ARC</translation> <translation id="428948795004445932">Частота выборки и сбора сетевых данных. Минимальное значение – 1 минута. @@ -3802,6 +3808,7 @@ Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://support.google.com/chrome/a?p=url_blocklist_filter_format.</translation> <translation id="449561952193478261">Синяя подсветка клавиатуры</translation> <translation id="449784980858429908">Автоматически разрешать сайтам подключение ко всем последовательным портам</translation> +<translation id="4498626728750662965">Просмотр файлов PDF с помощью средства обработки Skia</translation> <translation id="4499376951770369935">ChromeOS обновляется до версии, определенной в манифесте киоск-приложения</translation> <translation id="450080746522343150">Блокировать все скачивания</translation> <translation id="4501388411278568771">Включить принудительное использование протокола HTTPS в зависимости от статуса запуска этой функции</translation> @@ -4215,6 +4222,7 @@ Если правило не настроено, то модуль <ph name="PRODUCT_NAME" /> подключается только по адресам стандарта RFC1918/RFC4193 кроме случаев, когда активирована функция CastAllowAllIPs.</translation> <translation id="489803897780524242">Параметр, контролирующий размещение поискового запроса для поисковой системы по умолчанию</translation> <translation id="4899708173828500852">Включить безопасный просмотр</translation> +<translation id="4904462841601272815">Включить продукт "<ph name="PRODUCT_NAME" />" на всех веб-страницах</translation> <translation id="4906194810004762807">Частота обновлений политики устройств</translation> <translation id="49093841899738146">Если правило включено, <ph name="PRODUCT_NAME" /> может собирать журналы событий WebRTC из сервисов Google (например, Hangouts Meet) и загружать их в Google. В журналах содержится такая информация, как размер пакетов RTP, время их отправки и получения, данные о перегрузке сети, а также метаданные о продолжительности и качестве аудио и видео. Такая информация полезна для отладки звонков и видеовстреч в <ph name="PRODUCT_NAME" />. В журналах нет самого аудио- и видеоконтента. Для упрощения отладки эти журналы могут быть связаны с журналами сервисов Google с помощью идентификатора сеанса. @@ -6124,6 +6132,7 @@ – Если это правило отключено, функциональность браузера будет ограничена. – Если это правило отключено, администраторы должны уведомить об этом конечных пользователей устройства.</translation> +<translation id="6607983779935460461">Поддержка URL данных в SVGUseElement</translation> <translation id="6609867253856597039">Настроить параметры доступа пользователей к отключенным функциям</translation> <translation id="6614557704487944013">Разрешить пользователям работать в браузере <ph name="LACROS_NAME" /></translation> <translation id="661610294649586421">Запрещать запросы к WebAuthn API на сайтах с ненадежными TLS-сертификатами</translation> @@ -6716,6 +6725,7 @@ Если правило настроено, пользователи не могут изменить или переопределить его. Если не настроить это правило, изначально основной будет левая кнопка мыши, но пользователь сможет поменять ее в любой момент.</translation> +<translation id="7136237405361383549">Использовать стандартное средство обработки на основе экспериментальных настроек</translation> <translation id="7137460825181247519">Это правило больше не поддерживается в <ph name="PRODUCT_NAME" /> 83. Используйте вместо него правило <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" />. Если этот параметр включен, Безопасный просмотр в Chrome будет всегда активен. Если правило отключено, Безопасный просмотр будет неактивен. @@ -7296,6 +7306,13 @@ <translation id="7703041979684393741">Запретить сбор журналов событий WebRTC из сервисов Google</translation> <translation id="770339941914297201">Новое поведение: киоск-приложения Chrome будут обновляться только с помощью URL обновления, указанного в правиле</translation> <translation id="7703737669292992839">Запретить использование диалоговых окон для выбора файлов</translation> +<translation id="7703819160640109959">Правило позволяет указать, как работать с файлами PDF в <ph name="PRODUCT_NAME" />. + +Если оно включено, файлы PDF просматриваются с помощью средства обработки Skia. + +Если правило отключено, для просмотра PDF используется средство обработки AGG. + +Если правило не настроено, средство обработки файлов PDF выбирается браузером.</translation> <translation id="7708934468069982537">Это правило было удалено в версии M58 после прекращения поддержки DHE в <ph name="PRODUCT_NAME" />. Если правило не настроено или для него выбрано значение False, наборы шифров DHE в TLS включены не будут. Если указать значение True, совместимость с устаревшим сервером и шифрами сохранится. Однако помните, что это временное решение и сервер рекомендуется настроить заново. @@ -7716,6 +7733,7 @@ <translation id="8091982561085048989">Логический флаг, который указывает, будет ли использоваться стандарт IPP Everywhere для настройки принтера. Этот флаг поддерживается в <ph name="PRODUCT_OS_NAME" />, начиная с версии 76.</translation> <translation id="8099880303030573137">Задержка перехода в спящий режим при работе от батареи</translation> <translation id="8101381354936029836">Мини-группа правила:</translation> +<translation id="8102854005031553638">Просмотр файлов PDF с помощью средства обработки AGG</translation> <translation id="8102913158860568230">Настройка MediaStream по умолчанию</translation> <translation id="8104962233214241919">Автоматический выбор клиентских сертификатов для сайтов</translation> <translation id="8109762054721090517">Шаблон, позволяющий установить <ph name="IPP_ATTRIBUTE" /> <ph name="CLIENT_NAME_IPP_ATTRIBUTE" /> протокола <ph name="INTERNET_PRINTING_PROTOCOL" /></translation> @@ -8491,6 +8509,9 @@ <translation id="8777369558049831576">Показывать флажок "Запомнить мой выбор для этого типа ссылок" в диалоговом окне внешнего протокола</translation> <translation id="8778320022586618010">Включить отправку данных о статусе видеокарты устройства</translation> <translation id="8780039702448388726">Отключить отправку данных о версии устройства</translation> +<translation id="8782203407766130175">Это правило включает поддержку URL данных в SVGUseElement, которая будет отключена по умолчанию, начиная с версии M119. + Если правило включено, URL данных продолжат работать в SVGUseElement. + Если правило отключено или не настроено, URL данных не будут работать в SVGUseElement.</translation> <translation id="8786409859071107656">Если правило настроено, включен режим подачи энергии через USB-порт, предназначенный для зарядки других устройств. На некоторых устройствах есть специальный USB-порт со значком молнии или батареи, позволяющий заряжать другие устройства от системного аккумулятора. С помощью данного правила можно указать, как этот порт должен работать, когда система выключена или находится в спящем режиме. Правило не влияет на остальные USB-порты, а также на возможность зарядки устройств при включенной и активной системе, когда энергия и так подается через USB-порт. @@ -8559,6 +8580,9 @@ <translation id="8858642179038618439">Позволяет принудительно включить безопасный режим на YouTube</translation> <translation id="8860342862142842017">Отключить проверку сертификатов для списка хешей subjectPublicKeyInfo</translation> <translation id="8860894781631833477">Разрешить пользователям настраивать версию обновления <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="8862436312516745856">Если правило включено или не настроено, <ph name="PRODUCT_NAME" /> будет работать на любых веб-страницах. + +Если оно отключено, <ph name="PRODUCT_NAME" /> не поддерживается на веб-страницах.</translation> <translation id="8864975621965365890">Скрывает подсказку, которая появляется, если сайт обрабатывается <ph name="PRODUCT_FRAME_NAME" />.</translation> <translation id="8866430022832109569">Отчеты о списке приложений</translation> <translation id="886645881209114007">Разрешить пользователям запускать <ph name="PLUGIN_VM_NAME" /> в <ph name="PRODUCT_OS_NAME" /></translation>
diff --git a/components/reporting/client/BUILD.gn b/components/reporting/client/BUILD.gn index 46c0bad..7adf98b 100644 --- a/components/reporting/client/BUILD.gn +++ b/components/reporting/client/BUILD.gn
@@ -43,6 +43,7 @@ static_library("report_queue") { sources = [ + "filtered_report_queue.h", "report_queue.cc", "report_queue.h", "report_queue_impl.cc", @@ -142,6 +143,7 @@ testonly = true sources = [ "empty_dm_token_retriever_unittest.cc", + "filtered_report_queue_unittest.cc", "report_queue_configuration_unittest.cc", "report_queue_factory_unittest.cc", "report_queue_impl_unittest.cc",
diff --git a/components/reporting/client/filtered_report_queue.h b/components/reporting/client/filtered_report_queue.h new file mode 100644 index 0000000..353bd77 --- /dev/null +++ b/components/reporting/client/filtered_report_queue.h
@@ -0,0 +1,140 @@ +// 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_REPORTING_CLIENT_FILTERED_REPORT_QUEUE_H_ +#define COMPONENTS_REPORTING_CLIENT_FILTERED_REPORT_QUEUE_H_ + +#include <memory> +#include <queue> +#include <string> +#include <type_traits> +#include <utility> + +#include "base/values.h" +#include "components/reporting/client/report_queue.h" +#include "components/reporting/proto/synced/record_constants.pb.h" +#include "components/reporting/util/status.h" +#include "third_party/protobuf/src/google/protobuf/message_lite.h" + +namespace reporting { + +// `FilteredReportQueue` is a wrapper template using actual `ReportQueue` +// instance. It will make a call to a provided filtering interface `Filter` +// whenever `Enqueue` API is called. +// As opposed to `ReportQueue`, filtering only accepts one form of `Enqueue` - +// string, dictionary or proto - others would not compile. And since the +// filtering is called before the event is serialized, it can be analyzed or +// deduplicated in its original form, without the need to deserialize it back. +// +// Usage sketch (note that Filter thread-safety is expected to be ensured by the +// caller code here): +// +// proto EventMessage { optional string tag; optional string data; } +// +// class EventFilter : public FilteredReportQueue<EventMessage>::Filter { +// private: +// Status is_accepted(const EventMessage& new_event) override { +// if (!last_event_tag_.empty() && new_event.tag() == last_event_tag_) { +// return Status(error::ALREADY_EXISTS, "Duplicated event"); +// } +// last_event_tag_ = new_event.tag(); +// return Status::StatusOK(); +// } +// +// std::string last_event_tag_; +// }; +// +// auto filtered_queue = std::make_unique<FilteredReportQueue<EventMessage>>( +// std::make_unique<EventFilter>(filter), +// std::move(actual_report_queue)); +// +// ... +// +// EventMessage event; +// event.set_tag(...); +// event.set_data(...); +// filtered_queue->Enqueue(std::move(event), priority, callback); +// +// The event will only be posted, if its tag differs from the tag in the last +// message before it. +// +template <typename T> +class FilteredReportQueue { + // A traits class that determines whether a type U is implicitly convertible + // from a type V. If it is convertible, then the |value| member of this class + // is statically set to true, otherwise it is statically set to false. + template <class U, typename V> + struct is_implicitly_constructible + : std::conjunction<std::is_constructible<U, V>, + std::is_convertible<V, U>> {}; + + public: + // `Filter` interface, to be subclassed and owned by `FilteredReportQueue`. + // When `Enqueue` is called, the `record` parameter is first passed to + // `is_accepted` and only if the latter returns `Status::OK`, it is actually + // enqueued. Otherwise returned `Status` is reported with `EnqueueCallback`. + class Filter { + public: + virtual ~Filter() = default; + // Returns `Status::OK` if `record` is to be actually enqueued + virtual Status is_accepted(const T& record) = 0; + + protected: + Filter() = default; + }; + + FilteredReportQueue<T>(std::unique_ptr<Filter> filter, + std::unique_ptr<ReportQueue> report_queue) + : filter_(std::move(filter)), report_queue_(std::move(report_queue)) {} + + // String and Dict forms of `Enqueue` are forwarded to `report_queue_` + template <typename U, + std::enable_if_t< + std::disjunction< + is_implicitly_constructible<std::string, U>, + is_implicitly_constructible<base::Value::Dict, U>>::value, + bool> = true> + void Enqueue(U record, + Priority priority, + ReportQueue::EnqueueCallback callback) const { + const auto status = filter_->is_accepted(record); + if (!status.ok()) { + std::move(callback).Run(status); + return; + } + report_queue_->Enqueue(std::move(record), priority, std::move(callback)); + } + + // Proto form of `Enqueue` is forwarded to `report_queue_` wrapping the + // argument in unique_ptr. + template <typename U, + std::enable_if_t<is_implicitly_constructible< + std::unique_ptr<google::protobuf::MessageLite>, + std::unique_ptr<U>>::value, + bool> = true> + void Enqueue(U record, + Priority priority, + ReportQueue::EnqueueCallback callback) const { + const auto status = filter_->is_accepted(record); + if (!status.ok()) { + std::move(callback).Run(status); + return; + } + report_queue_->Enqueue(std::make_unique<U>(std::move(record)), priority, + std::move(callback)); + } + + // `Flush` is forwarded to `report_queue_`. + void Flush(Priority priority, ReportQueue::FlushCallback callback) { + report_queue_->Flush(priority, std::move(callback)); + } + + private: + std::unique_ptr<Filter> filter_; + std::unique_ptr<ReportQueue> report_queue_; +}; + +} // namespace reporting + +#endif // COMPONENTS_REPORTING_CLIENT_FILTERED_REPORT_QUEUE_H_
diff --git a/components/reporting/client/filtered_report_queue_unittest.cc b/components/reporting/client/filtered_report_queue_unittest.cc new file mode 100644 index 0000000..e7a584b --- /dev/null +++ b/components/reporting/client/filtered_report_queue_unittest.cc
@@ -0,0 +1,344 @@ +// 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/reporting/client/filtered_report_queue.h" + +#include <memory> +#include <string> + +#include "base/test/task_environment.h" +#include "components/reporting/client/mock_report_queue.h" +#include "components/reporting/client/report_queue.h" +#include "components/reporting/proto/synced/record_constants.pb.h" +#include "components/reporting/proto/test.pb.h" +#include "components/reporting/util/status.h" +#include "components/reporting/util/test_support_callbacks.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::AllOf; +using ::testing::Eq; +using ::testing::Invoke; +using ::testing::Property; +using ::testing::Return; +using ::testing::StrEq; + +namespace reporting { +namespace { + +constexpr char kTestMessage[] = "TEST_MESSAGE"; + +template <typename T> +class MockFilter : public FilteredReportQueue<T>::Filter { + public: + MOCK_METHOD(Status, is_accepted, (const T&), (override)); +}; + +class FilteredReportQueueTest : public ::testing::Test { + protected: + base::test::TaskEnvironment task_environment_; +}; + +TEST_F(FilteredReportQueueTest, StringAcceptedTest) { + auto filter = std::make_unique<MockFilter<std::string>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<std::string>>( + std::move(filter), std::move(actual_report_queue)); + + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce( + Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(kTestMessage, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); +} + +TEST_F(FilteredReportQueueTest, StringRejectedTest) { + auto filter = std::make_unique<MockFilter<std::string>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<std::string>>( + std::move(filter), std::move(actual_report_queue)); + + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status(error::CANCELLED, "Rejected in test"))); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)).Times(0); + test::TestEvent<Status> enqueued; + queue->Enqueue(kTestMessage, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_THAT( + enqueued.result(), + AllOf(Property(&Status::error_code, Eq(error::CANCELLED)), + Property(&Status::error_message, StrEq("Rejected in test")))); +} + +TEST_F(FilteredReportQueueTest, MixedStringsTest) { + auto filter = std::make_unique<MockFilter<std::string>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<std::string>>( + std::move(filter), std::move(actual_report_queue)); + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce(Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, + ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(kTestMessage, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); + } + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status(error::ALREADY_EXISTS, "Duplicated in test"))); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)).Times(0); + test::TestEvent<Status> enqueued; + queue->Enqueue(kTestMessage, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_THAT( + enqueued.result(), + AllOf(Property(&Status::error_code, Eq(error::ALREADY_EXISTS)), + Property(&Status::error_message, StrEq("Duplicated in test")))); + } + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce(Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, + ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(kTestMessage, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); + } +} + +TEST_F(FilteredReportQueueTest, JsonAcceptedTest) { + auto filter = std::make_unique<MockFilter<base::Value::Dict>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<base::Value::Dict>>( + std::move(filter), std::move(actual_report_queue)); + + static constexpr char kTestKey[] = "TEST_KEY"; + static constexpr char kTestValue[] = "TEST_VALUE"; + base::Value::Dict test_dict; + test_dict.Set(kTestKey, kTestValue); + + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce( + Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(std::move(test_dict), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); +} + +TEST_F(FilteredReportQueueTest, JsonRejectedTest) { + auto filter = std::make_unique<MockFilter<base::Value::Dict>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<base::Value::Dict>>( + std::move(filter), std::move(actual_report_queue)); + + static constexpr char kTestKey[] = "TEST_KEY"; + static constexpr char kTestValue[] = "TEST_VALUE"; + base::Value::Dict test_dict; + test_dict.Set(kTestKey, kTestValue); + + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status(error::CANCELLED, "Rejected in test"))); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)).Times(0); + test::TestEvent<Status> enqueued; + queue->Enqueue(std::move(test_dict), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_THAT( + enqueued.result(), + AllOf(Property(&Status::error_code, Eq(error::CANCELLED)), + Property(&Status::error_message, StrEq("Rejected in test")))); +} + +TEST_F(FilteredReportQueueTest, MixedJsonTest) { + auto filter = std::make_unique<MockFilter<base::Value::Dict>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<base::Value::Dict>>( + std::move(filter), std::move(actual_report_queue)); + + static constexpr char kTestKey[] = "TEST_KEY"; + static constexpr char kTestValue[] = "TEST_VALUE"; + base::Value::Dict test_dict; + test_dict.Set(kTestKey, kTestValue); + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce(Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, + ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(test_dict.Clone(), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); + } + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status(error::ALREADY_EXISTS, "Duplicated in test"))); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)).Times(0); + test::TestEvent<Status> enqueued; + queue->Enqueue(test_dict.Clone(), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_THAT( + enqueued.result(), + AllOf(Property(&Status::error_code, Eq(error::ALREADY_EXISTS)), + Property(&Status::error_message, StrEq("Duplicated in test")))); + } + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce(Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, + ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(test_dict.Clone(), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); + } +} + +TEST_F(FilteredReportQueueTest, ProtoAcceptedTest) { + auto filter = std::make_unique<MockFilter<test::TestMessage>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<test::TestMessage>>( + std::move(filter), std::move(actual_report_queue)); + + test::TestMessage test_message; + test_message.set_test(kTestMessage); + + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce( + Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(std::move(test_message), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); +} + +TEST_F(FilteredReportQueueTest, ProtoRejectedTest) { + auto filter = std::make_unique<MockFilter<test::TestMessage>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<test::TestMessage>>( + std::move(filter), std::move(actual_report_queue)); + + test::TestMessage test_message; + test_message.set_test(kTestMessage); + + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status(error::CANCELLED, "Rejected in test"))); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)).Times(0); + test::TestEvent<Status> enqueued; + queue->Enqueue(std::move(test_message), Priority::IMMEDIATE, enqueued.cb()); + EXPECT_THAT( + enqueued.result(), + AllOf(Property(&Status::error_code, Eq(error::CANCELLED)), + Property(&Status::error_message, StrEq("Rejected in test")))); +} + +TEST_F(FilteredReportQueueTest, MixedProtoTest) { + auto filter = std::make_unique<MockFilter<test::TestMessage>>(); + auto* const mock_filter = filter.get(); + + auto actual_report_queue = std::make_unique<MockReportQueue>(); + auto* const mock_report_queue = actual_report_queue.get(); + auto queue = std::make_unique<FilteredReportQueue<test::TestMessage>>( + std::move(filter), std::move(actual_report_queue)); + + test::TestMessage test_message; + test_message.set_test(kTestMessage); + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce(Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, + ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(test_message, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); + } + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status(error::ALREADY_EXISTS, "Duplicated in test"))); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)).Times(0); + test::TestEvent<Status> enqueued; + queue->Enqueue(test_message, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_THAT( + enqueued.result(), + AllOf(Property(&Status::error_code, Eq(error::ALREADY_EXISTS)), + Property(&Status::error_message, StrEq("Duplicated in test")))); + } + + { + EXPECT_CALL(*mock_filter, is_accepted(_)) + .WillOnce(Return(Status::StatusOK())); + EXPECT_CALL(*mock_report_queue, AddProducedRecord(_, _, _)) + .WillOnce(Invoke([](ReportQueue::RecordProducer record_producer, + Priority priority, + ReportQueue::EnqueueCallback callback) { + std::move(callback).Run(Status::StatusOK()); + })); + test::TestEvent<Status> enqueued; + queue->Enqueue(test_message, Priority::IMMEDIATE, enqueued.cb()); + EXPECT_OK(enqueued.result()); + } +} +} // namespace +} // namespace reporting
diff --git a/components/reporting/client/report_queue_impl.cc b/components/reporting/client/report_queue_impl.cc index d1df9fbe..7a8d5cb2 100644 --- a/components/reporting/client/report_queue_impl.cc +++ b/components/reporting/client/report_queue_impl.cc
@@ -187,8 +187,7 @@ base::OnceCallback<void(StatusOr<std::unique_ptr<ReportQueue>>)> ReportQueueImpl::PrepareToAttachActualQueue() const { NOTREACHED(); - return base::BindOnce( - [](StatusOr<std::unique_ptr<ReportQueue>>) { NOTREACHED(); }); + return base::DoNothing(); } // Implementation of SpeculativeReportQueueImpl::PendingRecordProducer
diff --git a/components/safe_browsing/core/browser/db/v4_local_database_manager.h b/components/safe_browsing/core/browser/db/v4_local_database_manager.h index 002f69a9..3d66ce18e 100644 --- a/components/safe_browsing/core/browser/db/v4_local_database_manager.h +++ b/components/safe_browsing/core/browser/db/v4_local_database_manager.h
@@ -301,7 +301,8 @@ void ScheduleFullHashCheck(std::unique_ptr<PendingCheck> check); // Checks |stores_to_check| in database synchronously for hash prefixes - // matching the full hashes for |url|. + // matching the full hashes for |url|. This function is meant for stores that + // have full hash information locally. void HandleUrl(const GURL& url, const StoresToCheck& stores_to_check, base::OnceCallback<void(bool)> callback);
diff --git a/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc b/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc index b7f18810..e9db60a 100644 --- a/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc +++ b/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc
@@ -17,10 +17,10 @@ #include "base/run_loop.h" #include "base/strings/string_tokenizer.h" #include "base/task/sequenced_task_runner.h" -#include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_command_line.h" #include "base/test/task_environment.h" +#include "base/test/test_future.h" #include "base/test/test_simple_task_runner.h" #include "build/branding_buildflags.h" #include "build/build_config.h" @@ -1102,35 +1102,22 @@ ReplaceV4Database(store_and_hash_prefixes, false /* not available */); // Verify it defaults to false when DB is not available. - bool result = false; - base::RunLoop run_loop1; - v4_local_database_manager_->MatchDownloadAllowlistUrl( - good_url, base::BindLambdaForTesting([&](bool value) { - result = value; - run_loop1.Quit(); - })); - run_loop1.Run(); - EXPECT_FALSE(result); + base::test::TestFuture<bool> future1; + v4_local_database_manager_->MatchDownloadAllowlistUrl(good_url, + future1.GetCallback()); + EXPECT_FALSE(future1.Get()); ReplaceV4Database(store_and_hash_prefixes, true /* available */); // Not allowlisted. - base::RunLoop run_loop2; - v4_local_database_manager_->MatchDownloadAllowlistUrl( - other_url, base::BindLambdaForTesting([&](bool value) { - result = value; - run_loop2.Quit(); - })); - run_loop2.Run(); - EXPECT_FALSE(result); + base::test::TestFuture<bool> future2; + v4_local_database_manager_->MatchDownloadAllowlistUrl(other_url, + future2.GetCallback()); + EXPECT_FALSE(future2.Get()); // Allowlisted. - base::RunLoop run_loop3; - v4_local_database_manager_->MatchDownloadAllowlistUrl( - good_url, base::BindLambdaForTesting([&](bool value) { - result = value; - run_loop3.Quit(); - })); - run_loop3.Run(); - EXPECT_TRUE(result); + base::test::TestFuture<bool> future3; + v4_local_database_manager_->MatchDownloadAllowlistUrl(good_url, + future3.GetCallback()); + EXPECT_TRUE(future3.Get()); EXPECT_FALSE(FakeV4LocalDatabaseManager::PerformFullHashCheckCalled( v4_local_database_manager_));
diff --git a/components/search/ntp_features.cc b/components/search/ntp_features.cc index 5675ef7..150d77c 100644 --- a/components/search/ntp_features.cc +++ b/components/search/ntp_features.cc
@@ -81,12 +81,6 @@ "NtpChromeCartModule", base::FEATURE_ENABLED_BY_DEFAULT); -// If enabled, Comprehensive Theming color changes will be applied to elements -// on the New Tab Page, excluding the Realbox. -BASE_FEATURE(kNtpComprehensiveTheming, - "NtpComprehensiveTheming", - base::FEATURE_ENABLED_BY_DEFAULT); - // If enabled, Comprehensive Theming color changes will be applied to the // Realbox on the New Tab Page. BASE_FEATURE(kNtpComprehensiveThemeRealbox, @@ -304,16 +298,6 @@ "NtpHistoryClustersModuleFetchClustersUntilExhausted", base::FEATURE_ENABLED_BY_DEFAULT); -const base::FeatureParam<double> - kNtpElementLuminosityChangeForLightBackgroundParam{ - &kNtpComprehensiveTheming, - "NtpElementLuminosityChangeForLightBackgroundParam", 0.1}; - -const base::FeatureParam<double> - kNtpElementLuminosityChangeForDarkBackgroundParam{ - &kNtpComprehensiveTheming, - "NtpElementLuminosityChangeForDarkBackgroundParam", 0.2}; - const base::FeatureParam<std::string> kNtpOgbButtonSelectorParam{ &kNtpRemoveScrim, "NtpOgbButtonSelectorParam", ".gb_A"};
diff --git a/components/security_interstitials/content/security_interstitial_controller_client.cc b/components/security_interstitials/content/security_interstitial_controller_client.cc index 2a5abd6..fc14782 100644 --- a/components/security_interstitials/content/security_interstitial_controller_client.cc +++ b/components/security_interstitials/content/security_interstitial_controller_client.cc
@@ -54,9 +54,16 @@ if (web_contents_->GetController().CanGoBack()) { web_contents_->GetController().GoBack(); } else { - web_contents_->GetController().LoadURL( - default_safe_page_, content::Referrer(), - ui::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string()); + // For <webview> tags (also known as guests), use about:blank as the + // default safe page. This is because unlike a normal WebContents, guests + // cannot load pages like WebUI, including the NTP, which is often used as + // the default safe page here. + GURL url_to_load = web_contents_->GetSiteInstance()->IsGuest() + ? GURL(url::kAboutBlankURL) + : default_safe_page_; + web_contents_->GetController().LoadURL(url_to_load, content::Referrer(), + ui::PAGE_TRANSITION_AUTO_TOPLEVEL, + std::string()); } }
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index f64398e..d2af013 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Identificador de client:</translation> <translation id="3381668585148405088">Verifica la teva compra</translation> <translation id="3383566085871012386">Ordre de precedència actual</translation> +<translation id="3384522979010096022">La teva organització no et permet veure aquest lloc web</translation> <translation id="3387261909427947069">Formes de pagament</translation> <translation id="3391030046425686457">Adreça d'entrega</translation> <translation id="3391482648489541560">edició de fitxers</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 0bd817f..34ecde30 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Rhif Adnabod Cleient:</translation> <translation id="3381668585148405088">Dilyswch eich pryniad</translation> <translation id="3383566085871012386">Trefn flaenoriaeth bresennol</translation> +<translation id="3384522979010096022">Nid yw eich sefydliad yn caniatáu i chi weld y wefan hon</translation> <translation id="3387261909427947069">Dulliau Talu</translation> <translation id="3391030046425686457">Cyfeiriad anfon</translation> <translation id="3391482648489541560">golygu ffeiliau</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 192f5fa..75bf134 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Client ID:</translation> <translation id="3381668585148405088">Verify your purchase</translation> <translation id="3383566085871012386">Current precedence order</translation> +<translation id="3384522979010096022">Your organisation doesn’t allow you to view this site</translation> <translation id="3387261909427947069">Payment Methods</translation> <translation id="3391030046425686457">Delivery address</translation> <translation id="3391482648489541560">file editing</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index ef56a8c..729f8ff 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">ID de cliente:</translation> <translation id="3381668585148405088">Verifica tu compra</translation> <translation id="3383566085871012386">Orden de prioridad actual</translation> +<translation id="3384522979010096022">Tu organización no te permite ver este sitio</translation> <translation id="3387261909427947069">Métodos de pago</translation> <translation id="3391030046425686457">Dirección de entrega</translation> <translation id="3391482648489541560">edición de archivos</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 77e2e62..943b14d8 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Kliendi ID:</translation> <translation id="3381668585148405088">Kinnitage oma ost</translation> <translation id="3383566085871012386">Praegune tähtsuse järjekord</translation> +<translation id="3384522979010096022">Teie organisatsioon ei luba teil seda saiti vaadata</translation> <translation id="3387261909427947069">Makseviisid</translation> <translation id="3391030046425686457">Kohaletoimetamise aadress</translation> <translation id="3391482648489541560">failide muutmine</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 2a164e6..3d4cc05 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Client ID:</translation> <translation id="3381668585148405088">I-verify ang pagbili mo</translation> <translation id="3383566085871012386">Kasalukuyang ayos ng pangingibabaw</translation> +<translation id="3384522979010096022">Hindi ka pinapayagan ng iyong organisasyon na tingnan ang site na ito</translation> <translation id="3387261909427947069">Mga Paraan ng Pagbabayad</translation> <translation id="3391030046425686457">Address kung saan maghahatid</translation> <translation id="3391482648489541560">pag-edit ng file</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 96e1da93..24c77da3 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">ક્લાઇન્ટ ID:</translation> <translation id="3381668585148405088">તમારી ખરીદી ચકાસો</translation> <translation id="3383566085871012386">વર્તમાન પ્રાધાન્યતા ક્રમ</translation> +<translation id="3384522979010096022">તમારી સંસ્થા તમને આ સાઇટ જોવાની મંજૂરી આપતી નથી</translation> <translation id="3387261909427947069">ચુકવણી પદ્ધતિઓ</translation> <translation id="3391030046425686457">વિતરણ માટેનું સરનામું</translation> <translation id="3391482648489541560">ફાઇલમાં ફેરફાર</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index b755ef7..cd637a6 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -3304,6 +3304,7 @@ <translation id="9048662076076074925">24x36 インチ</translation> <translation id="9049981332609050619"><ph name="DOMAIN" /> にアクセスしようとしましたが、サーバーから無効な証明書が提示されました。</translation> <translation id="9050666287014529139">パスフレーズ</translation> +<translation id="9053840549256861041">広告の測定という新しい広告プライバシー機能をリリースします。Chrome ではサイトによる広告の効果測定に役立てるため、広告が表示されたときに、ごく少量の限定的な情報のみがサイト間で共有されます。</translation> <translation id="9056953843249698117">ストア</translation> <translation id="9062620674789239642">移動、編集、削除された可能性があります。</translation> <translation id="9063398205799684336">角形 2 号封筒</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 01b5a50..c1d230f 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -978,6 +978,7 @@ <translation id="3380864720620200369">Клиент идентификаторы:</translation> <translation id="3381668585148405088">Сатып алғаныңызды растаңыз</translation> <translation id="3383566085871012386">Ағымдағы кезек реті</translation> +<translation id="3384522979010096022">Ұйымыңыз бұл сайтты көруіңізге рұқсат бермейді</translation> <translation id="3387261909427947069">Төлеу әдістері</translation> <translation id="3391030046425686457">Жеткізу мекенжайы</translation> <translation id="3391482648489541560">файлды өңдеу</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 2783946f..c4bf3cb 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">클라이언트 ID:</translation> <translation id="3381668585148405088">구매 확인</translation> <translation id="3383566085871012386">현재 우선 순서</translation> +<translation id="3384522979010096022">조직에서 이 사이트를 보도록 허용하지 않습니다.</translation> <translation id="3387261909427947069">결제 수단</translation> <translation id="3391030046425686457">배송지 주소</translation> <translation id="3391482648489541560">파일 수정</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 66d0ba6..c6a9d70 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">Кардар ID:</translation> <translation id="3381668585148405088">Сатып алууну ырастаңыз</translation> <translation id="3383566085871012386">Учурдагы артыкчылык тартиби</translation> +<translation id="3384522979010096022">Уюмуңуз бул сайтты көрүүгө уруксат бербейт</translation> <translation id="3387261909427947069">Төлөм ыкмалары</translation> <translation id="3391030046425686457">Жеткирүү дареги</translation> <translation id="3391482648489541560">файл түзөтүү</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index b7b5138..7c73086 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -980,6 +980,7 @@ <translation id="3380864720620200369">Kliento ID:</translation> <translation id="3381668585148405088">Pirkinio patvirtinimas</translation> <translation id="3383566085871012386">Dabartinė pirmenybės tvarka</translation> +<translation id="3384522979010096022">Jūsų organizacija neleidžia peržiūrėti šios svetainės</translation> <translation id="3387261909427947069">Mokėjimo metodai</translation> <translation id="3391030046425686457">Pristatymo adresas</translation> <translation id="3391482648489541560">failo redagavimas</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 88eadf0..fdedde0 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">ID Pelanggan:</translation> <translation id="3381668585148405088">Sahkan pembelian anda</translation> <translation id="3383566085871012386">Susunan keutamaan semasa</translation> +<translation id="3384522979010096022">Organisasi anda tidak membenarkan anda melihat laman ini</translation> <translation id="3387261909427947069">Kaedah Pembayaran</translation> <translation id="3391030046425686457">Alamat penghantaran</translation> <translation id="3391482648489541560">pengeditan fail</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 7f7de97..2d0763e30 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -981,6 +981,7 @@ <translation id="3380864720620200369">အသုံးပြုသူ၏ID:</translation> <translation id="3381668585148405088">ဝယ်ယူမှုကို အတည်ပြုရန် စစ်ဆေးပါ</translation> <translation id="3383566085871012386">လက်ရှိဦးစားပေး စီစဉ်မှု</translation> +<translation id="3384522979010096022">ဤဝဘ်ဆိုက်ကိုကြည့်ရန် သင့်အဖွဲ့အစည်းက ခွင့်မပြုပါ</translation> <translation id="3387261909427947069">ငွေပေးချေ နည်းလမ်းများ</translation> <translation id="3391030046425686457">ပို့ဆောင်ရန် လိပ်စာ</translation> <translation id="3391482648489541560">ဖိုင်တည်းဖြတ်ခြင်း</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index ee0f8e1..99328da 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -976,6 +976,7 @@ <translation id="3380864720620200369">ग्राहक आइडी:</translation> <translation id="3381668585148405088">आफ्नो खरिद पुष्टि गर्नुहोस्</translation> <translation id="3383566085871012386">हाल तय गरिएको प्राथमिकताको क्रम</translation> +<translation id="3384522979010096022">तपाईंको सङ्गठनको नीतिअनुसार तपाईं यो साइट हेर्न पाउनुहुन्न</translation> <translation id="3387261909427947069">भुक्तानी विधिहरू</translation> <translation id="3391030046425686457">डेलिभरीको ठेगाना</translation> <translation id="3391482648489541560">फाइल सम्पादन गर्ने</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index ac0cc1c..a5d9ca3 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -977,6 +977,7 @@ <translation id="3380864720620200369">ਕਲਾਇੰਟ ਆਈਡੀ:</translation> <translation id="3381668585148405088">ਆਪਣੀ ਖਰੀਦ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="3383566085871012386">ਮੌਜੂਦਾ ਤਰਜੀਹ ਕ੍ਰਮ</translation> +<translation id="3384522979010096022">ਤੁਹਾਡੀ ਸੰਸਥਾ ਤੁਹਾਨੂੰ ਇਸ ਸਾਈਟ ਨੂੰ ਦੇਖਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੰਦੀ</translation> <translation id="3387261909427947069">ਭੁਗਤਾਨ ਵਿਧੀਆਂ</translation> <translation id="3391030046425686457">ਡਿਲੀਵਰੀ ਪਤਾ</translation> <translation id="3391482648489541560">ਫ਼ਾਈਲ ਸੰਪਾਦਨ</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 42196ad..f709dcd 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -978,6 +978,7 @@ <translation id="3380864720620200369">Идентификатор клиента:</translation> <translation id="3381668585148405088">Подтвердите покупку</translation> <translation id="3383566085871012386">Текущий порядок приоритетности</translation> +<translation id="3384522979010096022">Ваша организация запрещает просматривать этот сайт.</translation> <translation id="3387261909427947069">Способы оплаты</translation> <translation id="3391030046425686457">Адрес доставки</translation> <translation id="3391482648489541560">редактирование файлов</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index a249ab7..a81f1bd 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">ID odjemalca:</translation> <translation id="3381668585148405088">Potrdite nakup</translation> <translation id="3383566085871012386">Trenutni vrstni red prednosti</translation> +<translation id="3384522979010096022">Vaša organizacija vam ne dovoli ogleda tega spletnega mesta</translation> <translation id="3387261909427947069">Plačilna sredstva</translation> <translation id="3391030046425686457">Naslov za dostavo</translation> <translation id="3391482648489541560">urejanje datotek</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index f4291d6..859fabe34 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">ID klijenta:</translation> <translation id="3381668585148405088">Potvrdite kupovinu</translation> <translation id="3383566085871012386">Aktuelni redosled prioriteta</translation> +<translation id="3384522979010096022">Organizacija vam ne dozvoljava da pregledate ovaj sajt</translation> <translation id="3387261909427947069">Načini plaćanja</translation> <translation id="3391030046425686457">Adresa isporuke</translation> <translation id="3391482648489541560">izmena datoteka</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index f348ff2..a347086 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -979,6 +979,7 @@ <translation id="3380864720620200369">ИД клијента:</translation> <translation id="3381668585148405088">Потврдите куповину</translation> <translation id="3383566085871012386">Актуелни редослед приоритета</translation> +<translation id="3384522979010096022">Организација вам не дозвољава да прегледате овај сајт</translation> <translation id="3387261909427947069">Начини плаћања</translation> <translation id="3391030046425686457">Адреса испоруке</translation> <translation id="3391482648489541560">измена датотека</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index cddd8cdd..531f644 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -1964,7 +1964,7 @@ <translation id="5764725887548570807">รูปแบบต้นทางไม่ถูกต้อง</translation> <translation id="5764920692828389743">ส่งไปยัง <ph name="EMAIL_ADDRESS" /></translation> <translation id="5765072501007116331">หากต้องการดูวิธีการนำส่งสินค้าและข้อกำหนด โปรดเลือกที่อยู่</translation> -<translation id="57689295674415555">ไม่กรอกหมายเลขบัตรเสมือนใช่ไหม</translation> +<translation id="57689295674415555">หมายเลขบัตรเสมือนไม่ได้รับการกรอกใช่ไหม</translation> <translation id="5772086939108830423">ใช้พาสคีย์ในอุปกรณ์อื่น</translation> <translation id="5776313857861697733">ลำดับความสำคัญ</translation> <translation id="5776574724412881956">ระบบไม่ได้กรอกบัตรเสมือนใช่ไหม คลิกรายละเอียดบัตรเสมือนเพื่อคัดลอกไปยังคลิปบอร์ด <ph name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_LEARN_MORE_LINK_LABEL" /></translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 6c81b6b..d390715a 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -981,6 +981,7 @@ <translation id="3380864720620200369">کلائنٹ ID:</translation> <translation id="3381668585148405088">اپنی خریداری کی توثیق کریں</translation> <translation id="3383566085871012386">موجودہ ترجیحی ترتیب</translation> +<translation id="3384522979010096022">آپ کی تنظیم آپ کو اس سائٹ کا ملاحظہ کرنے کی اجازت نہیں دیتی ہے</translation> <translation id="3387261909427947069">ادائیگی کے طریقے</translation> <translation id="3391030046425686457">ڈیلیوری پتہ</translation> <translation id="3391482648489541560">فائل میں ترمیم کرنا</translation>
diff --git a/components/supervised_user/core/browser/supervised_user_interstitial.cc b/components/supervised_user/core/browser/supervised_user_interstitial.cc index 607f1c3a..34a60241 100644 --- a/components/supervised_user/core/browser/supervised_user_interstitial.cc +++ b/components/supervised_user/core/browser/supervised_user_interstitial.cc
@@ -5,10 +5,12 @@ #include "components/supervised_user/core/browser/supervised_user_interstitial.h" #include <stddef.h> +#include <string> #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" @@ -24,34 +26,19 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) -#include "components/user_manager/user.h" -#include "components/user_manager/user_manager.h" -#endif - namespace supervised_user { -namespace { - -// TODO(b/250924204): Implement shared logic to get the user's given name. -std::u16string GetActiveUserFirstName() { -#if BUILDFLAG(IS_CHROMEOS_ASH) - return user_manager::UserManager::Get()->GetActiveUser()->GetGivenName(); -#else - // TODO(b/243656773): Implement for LaCrOS. - return std::u16string(); -#endif -} -} // namespace // static std::unique_ptr<SupervisedUserInterstitial> SupervisedUserInterstitial::Create( std::unique_ptr<WebContentHandler> web_content_handler, SupervisedUserService& supervised_user_service, const GURL& url, + const std::u16string& supervised_user_name, FilteringBehaviorReason reason) { - std::unique_ptr<SupervisedUserInterstitial> interstitial = base::WrapUnique( - new SupervisedUserInterstitial(std::move(web_content_handler), - supervised_user_service, url, reason)); + std::unique_ptr<SupervisedUserInterstitial> interstitial = + base::WrapUnique(new SupervisedUserInterstitial( + std::move(web_content_handler), supervised_user_service, url, + supervised_user_name, reason)); interstitial->web_content_handler()->CleanUpInfoBarOnMainFrame(); // Caller is responsible for deleting the interstitial. @@ -62,10 +49,12 @@ std::unique_ptr<WebContentHandler> web_content_handler, SupervisedUserService& supervised_user_service, const GURL& url, + const std::u16string& supervised_user_name, FilteringBehaviorReason reason) : supervised_user_service_(supervised_user_service), web_content_handler_(std::move(web_content_handler)), url_(url), + supervised_user_name_(supervised_user_name), reason_(reason) {} SupervisedUserInterstitial::~SupervisedUserInterstitial() {} @@ -123,7 +112,10 @@ Commands::HISTOGRAM_BOUNDING_VALUE); OutputRequestPermissionSourceMetric(); - web_content_handler_->RequestLocalApproval(url_, GetActiveUserFirstName(), + DLOG_IF(WARNING, supervised_user_name_.empty()) + << "Supervised user name for local web approval request should not be " + "empty"; + web_content_handler_->RequestLocalApproval(url_, supervised_user_name_, std::move(callback)); }
diff --git a/components/supervised_user/core/browser/supervised_user_interstitial.h b/components/supervised_user/core/browser/supervised_user_interstitial.h index bfa6f015..5b9c86b 100644 --- a/components/supervised_user/core/browser/supervised_user_interstitial.h +++ b/components/supervised_user/core/browser/supervised_user_interstitial.h
@@ -72,6 +72,7 @@ std::unique_ptr<WebContentHandler> web_content_handler, SupervisedUserService& supervised_user_service, const GURL& url, + const std::u16string& supervised_user_name, FilteringBehaviorReason reason); static std::string GetHTMLContents( @@ -98,6 +99,7 @@ std::unique_ptr<WebContentHandler> web_content_handler, SupervisedUserService& supervised_user_service, const GURL& url, + const std::u16string& supervised_user_name, FilteringBehaviorReason reason); void OutputRequestPermissionSourceMetric(); @@ -107,6 +109,7 @@ // The last committed url for this frame. GURL url_; + std::u16string supervised_user_name_; FilteringBehaviorReason reason_; }; } // namespace supervised_user
diff --git a/components/sync/base/features.cc b/components/sync/base/features.cc index 68a1f97..513c312a 100644 --- a/components/sync/base/features.cc +++ b/components/sync/base/features.cc
@@ -165,4 +165,8 @@ "SyncIgnoreGetUpdatesRetryDelay", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kSyncEnablePersistentStorageForAccountPreferences, + "SyncEnablePersistentStorageForAccountPreferences", + base::FEATURE_DISABLED_BY_DEFAULT); + } // namespace syncer
diff --git a/components/sync/base/features.h b/components/sync/base/features.h index ca980a3..53feeb7 100644 --- a/components/sync/base/features.h +++ b/components/sync/base/features.h
@@ -206,6 +206,9 @@ // If enabled, ignore GetUpdates retry delay command from the server. BASE_DECLARE_FEATURE(kSyncIgnoreGetUpdatesRetryDelay); +// If enabled, uses a JsonPrefStore for account preferences. +BASE_DECLARE_FEATURE(kSyncEnablePersistentStorageForAccountPreferences); + } // namespace syncer #endif // COMPONENTS_SYNC_BASE_FEATURES_H_
diff --git a/components/sync/protocol/session_specifics.proto b/components/sync/protocol/session_specifics.proto index 8a70ec4..61bdd9e 100644 --- a/components/sync/protocol/session_specifics.proto +++ b/components/sync/protocol/session_specifics.proto
@@ -36,8 +36,8 @@ // A non-unique but human-readable name to describe this client. optional string client_name = 3; // The type of device. - // Deprecated in M110, but still populated for backwards compatibility. - // Replaced by device_form_factor. + // Mandatory until M115. Replaced by device_form_factor afterwards, but still + // populated for backward compatibility. optional SyncEnums.DeviceType device_type = 4 [deprecated = true]; // The form factor of device. optional SyncEnums.DeviceFormFactor device_form_factor = 5;
diff --git a/components/sync_preferences/dual_layer_user_pref_store.cc b/components/sync_preferences/dual_layer_user_pref_store.cc index 3aa6dae..4316c53 100644 --- a/components/sync_preferences/dual_layer_user_pref_store.cc +++ b/components/sync_preferences/dual_layer_user_pref_store.cc
@@ -440,12 +440,14 @@ // Clear all synced preferences from the account store. for (const std::string& pref_name : GetPrefNamesInAccountStore()) { if (!IsPrefKeySyncable(pref_name)) { - // The write flags only affect persistence, and the account store is in - // memory only. + // The write flags only affect persistence, and the default flag is the + // safer choice. account_pref_store_->RemoveValue( pref_name, WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); } } + + CHECK(!active_types_.empty() || account_pref_store_->GetValues().empty()); } bool DualLayerUserPrefStore::IsPrefKeyMergeable(const std::string& key) const {
diff --git a/components/sync_preferences/pref_service_syncable_factory.cc b/components/sync_preferences/pref_service_syncable_factory.cc index 971fe805..0096fde 100644 --- a/components/sync_preferences/pref_service_syncable_factory.cc +++ b/components/sync_preferences/pref_service_syncable_factory.cc
@@ -49,6 +49,11 @@ pref_model_associator_client_ = pref_model_associator_client; } +void PrefServiceSyncableFactory::SetAccountPrefStore( + scoped_refptr<PersistentPrefStore> account_pref_store) { + account_pref_store_ = std::move(account_pref_store); +} + std::unique_ptr<PrefServiceSyncable> PrefServiceSyncableFactory::CreateSyncable( scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry) { TRACE_EVENT0("browser", "PrefServiceSyncableFactory::CreateSyncable"); @@ -60,11 +65,19 @@ // DualLayerUserPrefStore is used as the main user pref store, and sync is // hooked up directly to the underlying account store. - auto account_pref_store = base::MakeRefCounted<InMemoryPrefStore>(); + // `account_pref_store_` not being set implies + // SyncableEnablePersistentStoreForAccountPreferences flag is disabled. An + // in-memory store used in this case instead. + CHECK(account_pref_store_ || + !base::FeatureList::IsEnabled( + syncer::kSyncEnablePersistentStorageForAccountPreferences)); + if (!account_pref_store_) { + account_pref_store_ = base::MakeRefCounted<InMemoryPrefStore>(); + } + auto dual_layer_user_pref_store = base::MakeRefCounted<sync_preferences::DualLayerUserPrefStore>( - user_prefs_, std::move(account_pref_store), - pref_model_associator_client_); + user_prefs_, account_pref_store_, pref_model_associator_client_); auto pref_value_store = std::make_unique<PrefValueStore>( managed_prefs_.get(), supervised_user_prefs_.get(), extension_prefs_.get(), standalone_browser_prefs_.get(),
diff --git a/components/sync_preferences/pref_service_syncable_factory.h b/components/sync_preferences/pref_service_syncable_factory.h index 25a6e583..4880bf6 100644 --- a/components/sync_preferences/pref_service_syncable_factory.h +++ b/components/sync_preferences/pref_service_syncable_factory.h
@@ -48,11 +48,15 @@ void SetPrefModelAssociatorClient( PrefModelAssociatorClient* pref_model_associator_client); + void SetAccountPrefStore( + scoped_refptr<PersistentPrefStore> account_pref_store); + std::unique_ptr<PrefServiceSyncable> CreateSyncable( scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry); private: raw_ptr<PrefModelAssociatorClient> pref_model_associator_client_ = nullptr; + scoped_refptr<PersistentPrefStore> account_pref_store_; }; } // namespace sync_preferences
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc index dd6eff4..287bfe5 100644 --- a/components/sync_preferences/pref_service_syncable_unittest.cc +++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -1356,12 +1356,15 @@ public: PrefServiceSyncableFactoryTest() { pref_service_syncable_factory_.set_user_prefs(user_prefs_); + pref_service_syncable_factory_.SetAccountPrefStore(account_prefs_); } protected: PrefServiceSyncableFactory pref_service_syncable_factory_; scoped_refptr<TestingPrefStore> user_prefs_ = base::MakeRefCounted<TestingPrefStore>(); + scoped_refptr<TestingPrefStore> account_prefs_ = + base::MakeRefCounted<TestingPrefStore>(); }; TEST_F(PrefServiceSyncableFactoryTest,
diff --git a/components/sync_sessions/session_sync_test_helper.cc b/components/sync_sessions/session_sync_test_helper.cc index 019da8d..dcc32874 100644 --- a/components/sync_sessions/session_sync_test_helper.cc +++ b/components/sync_sessions/session_sync_test_helper.cc
@@ -8,6 +8,7 @@ #include "base/strings/utf_string_conversions.h" #include "components/sync/protocol/session_specifics.pb.h" +#include "components/sync_device_info/device_info_proto_enum_util.h" #include "testing/gtest/include/gtest/gtest.h" namespace sync_sessions { @@ -22,12 +23,11 @@ sync_pb::SessionSpecifics SessionSyncTestHelper::BuildHeaderSpecificsWithoutWindows( const std::string& tag, - sync_pb::SyncEnums_DeviceType device_type) { + const syncer::DeviceInfo::FormFactor& device_form_factor) { sync_pb::SessionSpecifics specifics; specifics.set_session_tag(tag); sync_pb::SessionHeader* header = specifics.mutable_header(); - // TODO(crbug.com/1434959): Set device form factor instead. - header->set_device_type(device_type); + header->set_device_form_factor(ToDeviceFormFactorProto(device_form_factor)); header->set_client_name(kClientName); return specifics; }
diff --git a/components/sync_sessions/session_sync_test_helper.h b/components/sync_sessions/session_sync_test_helper.h index 2c5fac89..ada4ca0 100644 --- a/components/sync_sessions/session_sync_test_helper.h +++ b/components/sync_sessions/session_sync_test_helper.h
@@ -9,7 +9,7 @@ #include <vector> #include "components/sessions/core/session_id.h" -#include "components/sync/protocol/sync_enums.pb.h" +#include "components/sync_device_info/device_info.h" namespace sync_pb { class SessionSpecifics; @@ -27,12 +27,10 @@ // Builds an instance of a SessionHeader, wrapped in SessionSpecifics, without // any windows. The caller may later add windows via `AddWindowSpecifics()` or // otherwise. - // TODO(crbug.com/1434959): Replace `device_type` by `device_form_factor` - // after fix. static sync_pb::SessionSpecifics BuildHeaderSpecificsWithoutWindows( const std::string& tag, - sync_pb::SyncEnums_DeviceType device_type = - sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_UNSET); + const syncer::DeviceInfo::FormFactor& device_form_factor = + syncer::DeviceInfo::FormFactor::kUnknown); // Adds window to a SessionSpecifics object. static void AddWindowSpecifics(SessionID window_id,
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc index 66ad1bd..e93fa397 100644 --- a/components/sync_sessions/synced_session_tracker.cc +++ b/components/sync_sessions/synced_session_tracker.cc
@@ -127,15 +127,16 @@ if (header_specifics.has_client_name()) { synced_session->SetSessionName(header_specifics.client_name()); } - if (header_specifics.has_device_type()) { - syncer::DeviceInfo::FormFactor device_form_factor; - if (header_specifics.has_device_form_factor()) { - device_form_factor = - syncer::ToDeviceInfoFormFactor(header_specifics.device_form_factor()); - } else { /*Fallback to derive from old device type enum*/ - device_form_factor = syncer::DeriveFormFactorFromDeviceType( - header_specifics.device_type()); - } + + syncer::DeviceInfo::FormFactor device_form_factor = + syncer::ToDeviceInfoFormFactor(header_specifics.device_form_factor()); + // Old clients only populate the device type, so the form factor needs to be + // inferred. + if (device_form_factor == syncer::DeviceInfo::FormFactor::kUnknown) { + device_form_factor = + syncer::DeriveFormFactorFromDeviceType(header_specifics.device_type()); + } + if (device_form_factor != syncer::DeviceInfo::FormFactor::kUnknown) { synced_session->SetDeviceTypeAndFormFactor(header_specifics.device_type(), device_form_factor); }
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 0a52522..43c9331d 100644 --- a/components/test/data/web_database/unit_tests_bundle_data.filelist +++ b/components/test/data/web_database/unit_tests_bundle_data.filelist
@@ -16,6 +16,7 @@ //components/test/data/web_database/version_109.sql //components/test/data/web_database/version_110.sql //components/test/data/web_database/version_111.sql +//components/test/data/web_database/version_112.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_112.sql b/components/test/data/web_database/version_112.sql new file mode 100644 index 0000000..8e7852a0 --- /dev/null +++ b/components/test/data/web_database/version_112.sql
@@ -0,0 +1,37 @@ +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','112'); +INSERT INTO meta VALUES('last_compatible_version','106'); +INSERT INTO meta VALUES('Builtin Keyword Version','127'); +CREATE TABLE token_service (service VARCHAR PRIMARY KEY NOT NULL,encrypted_token BLOB); +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); +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 ibans ( guid VARCHAR PRIMARY KEY, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, value VARCHAR, nickname VARCHAR); +CREATE TABLE autofill_profiles ( guid VARCHAR PRIMARY KEY, company_name VARCHAR, street_address VARCHAR, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zipcode VARCHAR, sorting_code VARCHAR, country_code VARCHAR, date_modified INTEGER NOT NULL DEFAULT 0, origin VARCHAR DEFAULT '', language_code VARCHAR, use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, label VARCHAR, disallow_settings_visible_updates INTEGER NOT NULL DEFAULT 0); +CREATE TABLE autofill_profile_addresses ( guid VARCHAR, street_address VARCHAR, street_name VARCHAR, dependent_street_name VARCHAR, house_number VARCHAR, subpremise VARCHAR, premise_name VARCHAR, street_address_status INTEGER DEFAULT 0, street_name_status INTEGER DEFAULT 0, dependent_street_name_status INTEGER DEFAULT 0, house_number_status INTEGER DEFAULT 0, subpremise_status INTEGER DEFAULT 0, premise_name_status INTEGER DEFAULT 0, dependent_locality VARCHAR, city VARCHAR, state VARCHAR, zip_code VARCHAR, sorting_code VARCHAR, country_code VARCHAR, dependent_locality_status INTEGER DEFAULT 0, city_status INTEGER DEFAULT 0, state_status INTEGER DEFAULT 0, zip_code_status INTEGER DEFAULT 0, sorting_code_status INTEGER DEFAULT 0, country_code_status INTEGER DEFAULT 0, apartment_number VARCHAR, floor VARCHAR, apartment_number_status INTEGER DEFAULT 0, floor_status INTEGER DEFAULT 0); +CREATE TABLE autofill_profile_names ( guid VARCHAR, first_name VARCHAR, middle_name VARCHAR, last_name VARCHAR, full_name VARCHAR, honorific_prefix VARCHAR, first_last_name VARCHAR, conjunction_last_name VARCHAR, second_last_name VARCHAR, honorific_prefix_status INTEGER DEFAULT 0, first_name_status INTEGER DEFAULT 0, middle_name_status INTEGER DEFAULT 0, last_name_status INTEGER DEFAULT 0, first_last_name_status INTEGER DEFAULT 0, conjunction_last_name_status INTEGER DEFAULT 0, second_last_name_status INTEGER DEFAULT 0, full_name_status INTEGER DEFAULT 0, full_name_with_honorific_prefix VARCHAR, full_name_with_honorific_prefix_status INTEGER DEFAULT 0); +CREATE TABLE autofill_profile_emails ( guid VARCHAR, email VARCHAR); +CREATE TABLE autofill_profile_phones ( guid VARCHAR, number VARCHAR); +CREATE TABLE autofill_profile_birthdates ( guid VARCHAR, day INTEGER DEFAULT 0, month INTEGER DEFAULT 0, year INTEGER DEFAULT 0); +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); +CREATE TABLE unmasked_credit_cards (id VARCHAR,card_number_encrypted VARCHAR,unmask_date INTEGER NOT NULL DEFAULT 0); +CREATE TABLE virtual_card_usage_data (id VARCHAR PRIMARY KEY, instrument_id INTEGER DEFAULT 0, merchant_domain VARCHAR, last_four VARCHAR); +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 server_addresses (id VARCHAR,company_name VARCHAR,street_address VARCHAR,address_1 VARCHAR,address_2 VARCHAR,address_3 VARCHAR,address_4 VARCHAR,postal_code VARCHAR,sorting_code VARCHAR,country_code VARCHAR,language_code VARCHAR, recipient_name VARCHAR, phone_number VARCHAR); +CREATE TABLE server_address_metadata (id VARCHAR NOT NULL,use_count INTEGER NOT NULL DEFAULT 0, use_date INTEGER NOT NULL DEFAULT 0, has_converted BOOL NOT NULL DEFAULT FALSE); +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 payments_upi_vpa (vpa 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, PRIMARY KEY (guid, type)); +CREATE INDEX autofill_name ON autofill (name); +CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower); +COMMIT;
diff --git a/components/webdata/common/web_database.cc b/components/webdata/common/web_database.cc index d60a819..ede27c2 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 = 112; +const int WebDatabase::kCurrentVersionNumber = 113; const int WebDatabase::kDeprecatedVersionNumber = 82;
diff --git a/components/webdata/common/web_database_migration_unittest.cc b/components/webdata/common/web_database_migration_unittest.cc index 68bec617..7e6cbf0 100644 --- a/components/webdata/common/web_database_migration_unittest.cc +++ b/components/webdata/common/web_database_migration_unittest.cc
@@ -140,7 +140,7 @@ base::ScopedTempDir temp_dir_; }; -const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 112; +const int WebDatabaseMigrationTest::kCurrentTestedVersionNumber = 113; void WebDatabaseMigrationTest::LoadDatabase( const base::FilePath::StringType& file) { @@ -1123,3 +1123,59 @@ EXPECT_TRUE(connection.DoesColumnExist("keywords", "enforced_by_policy")); } } + +// Tests that the autofill_profiles tables are deprecated and any profiles are +// migrated to the new local_addresses and local_addresses_type_tokens tables. +TEST_F(WebDatabaseMigrationTest, MigrateVersion112ToCurrent) { + ASSERT_NO_FATAL_FAILURE(LoadDatabase(FILE_PATH_LITERAL("version_112.sql"))); + { + sql::Database connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + + EXPECT_EQ(112, VersionFromConnection(&connection)); + EXPECT_FALSE(connection.DoesTableExist("local_addresses")); + EXPECT_FALSE(connection.DoesTableExist("local_addresses_type_tokens")); + + // Add two profiles to the legacy tables. This cannot be done via + // AutofillTable, since it only operates on the new local_addresses tables. + // Note that the ZIP code must be present in the unstructured and + // structured address table. + ASSERT_TRUE(connection.ExecuteScriptForTesting(R"( + INSERT INTO autofill_profiles (guid, date_modified, zipcode) + VALUES ('00000000-0000-0000-0000-000000000000', 123, '4567'); + INSERT INTO autofill_profile_names (guid, full_name) + VALUES ('00000000-0000-0000-0000-000000000000', 'full name'); + INSERT INTO autofill_profile_addresses (guid, zip_code) + VALUES ('00000000-0000-0000-0000-000000000000', '4567'); + INSERT INTO autofill_profiles (guid) + VALUES ('00000000-0000-0000-0000-000000000001'); + )")); + } + DoMigration(); + { + sql::Database connection; + ASSERT_TRUE(connection.Open(GetDatabasePath())); + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&connection)); + + EXPECT_EQ(kCurrentTestedVersionNumber, VersionFromConnection(&connection)); + EXPECT_TRUE(connection.DoesTableExist("local_addresses")); + EXPECT_TRUE(connection.DoesTableExist("local_addresses_type_tokens")); + + // Expect to find the profiles in the local_addresses tables. AutofillTable + // will read from them. + AutofillTable table; + table.Init(&connection, /*meta_table=*/nullptr); + std::unique_ptr<AutofillProfile> profile = + table.GetAutofillProfile("00000000-0000-0000-0000-000000000000", + AutofillProfile::Source::kLocalOrSyncable); + ASSERT_TRUE(profile); + EXPECT_EQ(profile->modification_date(), Time::FromTimeT(123)); + EXPECT_EQ(profile->GetRawInfo(autofill::NAME_FULL), u"full name"); + EXPECT_EQ(profile->GetRawInfo(autofill::ADDRESS_HOME_ZIP), u"4567"); + + EXPECT_TRUE( + table.GetAutofillProfile("00000000-0000-0000-0000-000000000001", + AutofillProfile::Source::kLocalOrSyncable)); + } +}
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.cc b/content/browser/fenced_frame/fenced_frame_reporter.cc index 052c2fc..033a1188 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter.cc +++ b/content/browser/fenced_frame/fenced_frame_reporter.cc
@@ -27,6 +27,7 @@ #include "content/browser/attribution_reporting/attribution_data_host_manager.h" #include "content/browser/attribution_reporting/attribution_host.h" #include "content/browser/attribution_reporting/attribution_manager.h" +#include "content/browser/interest_group/interest_group_pa_report_util.h" #include "content/browser/private_aggregation/private_aggregation_budget_key.h" #include "content/browser/private_aggregation/private_aggregation_manager.h" #include "content/browser/renderer_host/render_frame_host_impl.h" @@ -509,21 +510,9 @@ return; } - // Send PA requests of `pa_event_type`. - for (auction_worklet::mojom::PrivateAggregationRequestPtr& request : - it->second) { - DCHECK(request); - // All for-event contributions have already been converted to histogram - // contributions by filling in post auction signals before reaching here. - DCHECK(request->contribution->is_histogram_contribution()); - std::vector<blink::mojom::AggregatableReportHistogramContributionPtr> - contributions; - contributions.push_back( - std::move(request->contribution->get_histogram_contribution())); - private_aggregation_host_->SendHistogramReport( - std::move(contributions), request->aggregation_mode, - std::move(request->debug_mode_details)); - } + SplitContributionsIntoBatchesThenSendToHost( + /*requests=*/std::move(it->second), + /*remote_host=*/private_aggregation_host_); // Remove the entry of key `pa_event_type` from // `private_aggregation_event_map_` to avoid possibly sending the same
diff --git a/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc b/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc index 5a572261..711837f 100644 --- a/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc +++ b/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc
@@ -698,6 +698,9 @@ private_aggregation_event_map2["event_type2"].push_back( kPrivateAggregationRequest.Clone()); + // We expect two calls to `SendHistogramReport()` given the two events. + private_aggregation_manager_.set_allow_multiple_calls_per_origin(true); + reporter->OnForEventPrivateAggregationRequestsReceived( std::move(private_aggregation_event_map2));
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 b347c3c9..b64eb32 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -4788,6 +4788,13 @@ updated_interest_group_bidding_logic_url.bidding_url = GURL(base::StringPrintf("%s/bidding.js", kOriginStringA)); + blink::InterestGroup updated_interest_group_bidding_wasm_helper_url = + CreateInterestGroup(); + updated_interest_group_bidding_wasm_helper_url.update_url = kUpdateUrlA; + updated_interest_group_bidding_wasm_helper_url.priority = 1.0; + updated_interest_group_bidding_wasm_helper_url.bidding_wasm_helper_url = + GURL(base::StringPrintf("%s/bidding.wasm", kOriginStringA)); + struct TestCase { const std::string update_contents; const blink::InterestGroup& expected_group; @@ -4833,6 +4840,23 @@ R"("biddingLogicURL": "%s/bidding2.js")", kOriginStringA, kOriginStringA), initial_interest_group}, + // *** + // biddingWasmHelperURL + // *** + {base::StringPrintf(R"("biddingWasmHelperUrl": "%s/bidding.wasm")", + kOriginStringA), + updated_interest_group_bidding_wasm_helper_url}, + {base::StringPrintf(R"("biddingWasmHelperURL": "%s/bidding.wasm")", + kOriginStringA), + updated_interest_group_bidding_wasm_helper_url}, + {base::StringPrintf(R"("biddingWasmHelperUrl": "%s/bidding.wasm",)" + R"("biddingWasmHelperURL": "%s/bidding.wasm")", + kOriginStringA, kOriginStringA), + updated_interest_group_bidding_wasm_helper_url}, + {base::StringPrintf(R"("biddingWasmHelperUrl": "%s/bidding.wasm",)" + R"("biddingWasmHelperURL": "%s/bidding2.wasm")", + kOriginStringA, kOriginStringA), + initial_interest_group}, }; for (const auto& test_case : kTestCases) { @@ -6713,12 +6737,13 @@ }; TEST_F(AdAuctionServiceImplPrivateAggregationEnabledTest, - PrivateAggregationReportForwarded) { + PrivateAggregationReportsForwarded) { constexpr char kBiddingScript[] = R"( function generateBid( interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { privateAggregation.sendHistogramReport({bucket: 1n, value: 2}); + privateAggregation.sendHistogramReport({bucket: 3n, value: 4}); return {'ad': 'example', 'bid': 1, 'render': 'https://example.com/render'}; } )"; @@ -6772,21 +6797,25 @@ auction_config.decision_logic_url = kUrlA.Resolve(kDecisionUrlPath); auction_config.non_shared_params.interest_group_buyers = {kOriginA}; + base::RunLoop run_loop; EXPECT_CALL(mock_callback, Run) - .WillRepeatedly( - testing::Invoke([this](AggregatableReportRequest request, - PrivateAggregationBudgetKey budget_key) { - ASSERT_EQ(request.payload_contents().contributions.size(), 1u); - EXPECT_EQ(request.payload_contents().contributions[0].bucket, 1); - EXPECT_EQ(request.payload_contents().contributions[0].value, 2); - EXPECT_EQ(request.shared_info().reporting_origin, kOriginA); - EXPECT_EQ(budget_key.api(), - PrivateAggregationBudgetKey::Api::kFledge); - EXPECT_EQ(budget_key.origin(), kOriginA); - })); + .WillOnce(testing::Invoke([&](AggregatableReportRequest request, + PrivateAggregationBudgetKey budget_key) { + ASSERT_EQ(request.payload_contents().contributions.size(), 2u); + EXPECT_EQ(request.payload_contents().contributions[0].bucket, 1); + EXPECT_EQ(request.payload_contents().contributions[0].value, 2); + EXPECT_EQ(request.payload_contents().contributions[1].bucket, 3); + EXPECT_EQ(request.payload_contents().contributions[1].value, 4); + EXPECT_EQ(request.shared_info().reporting_origin, kOriginA); + EXPECT_EQ(budget_key.api(), PrivateAggregationBudgetKey::Api::kFledge); + EXPECT_EQ(budget_key.origin(), kOriginA); + run_loop.Quit(); + })); absl::optional<GURL> auction_result = RunAdAuctionAndFlush(auction_config); EXPECT_NE(auction_result, absl::nullopt); + InvokeCallbackForURN(*auction_result); + run_loop.Run(); } TEST_F(AdAuctionServiceImplPrivateAggregationEnabledTest,
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index 4fe29ffb..cef85241 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -1585,6 +1585,9 @@ // each InterestGroup. void StartAuction(const GURL& seller_decision_logic_url, const std::vector<StorageInterestGroup>& bidders) { + // Allows multiple auctions to be run in the same test. + private_aggregation_manager_.Reset(); + auction_complete_ = false; auto auction_config =
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc index 7257d9a..25d0eda6 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.cc +++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -40,7 +40,6 @@ #include "content/browser/private_aggregation/private_aggregation_budget_key.h" #include "content/browser/private_aggregation/private_aggregation_manager.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" -#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom-forward.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" #include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h" #include "mojo/public/cpp/bindings/remote.h" @@ -249,20 +248,8 @@ continue; } - for (auction_worklet::mojom::PrivateAggregationRequestPtr& request : - requests) { - DCHECK(request); - // All for-event contributions have already been converted to histogram - // contributions by filling in post auction signals before reaching here. - DCHECK(request->contribution->is_histogram_contribution()); - std::vector<blink::mojom::AggregatableReportHistogramContributionPtr> - contributions; - contributions.push_back( - std::move(request->contribution->get_histogram_contribution())); - remote->SendHistogramReport(std::move(contributions), - request->aggregation_mode, - std::move(request->debug_mode_details)); - } + SplitContributionsIntoBatchesThenSendToHost(std::move(requests), + /*remote_host=*/remote); } } @@ -772,8 +759,8 @@ } } - // If any reports were queued (event-level or aggregated), send them now, if - // the winning ad has been navigated to. + // If any event-level reports were queued, send them now, if the winning ad + // has been navigated to. SendPendingReportsIfNavigated(); OnReportingComplete(errors); @@ -787,6 +774,7 @@ top_level_seller_winning_bid_info_.trace_id); errors_.insert(errors_.end(), errors.begin(), errors.end()); reporting_complete_ = true; + MaybeSendPrivateAggregationReports(); MaybeInvokeCallback(); } @@ -798,6 +786,7 @@ // Send any pending reports that are gathered as reports run. SendPendingReportsIfNavigated(); + MaybeSendPrivateAggregationReports(); // Send pre-populated reports. Send these after the main reports, since // reports are sent over the network in FIFO order. @@ -839,8 +828,9 @@ const InterestGroupAuctionReporter::SellerWinningBidInfo& InterestGroupAuctionReporter::GetBidderAuction() { - if (component_seller_winning_bid_info_) + if (component_seller_winning_bid_info_) { return component_seller_winning_bid_info_.value(); + } return top_level_seller_winning_bid_info_; } @@ -857,6 +847,12 @@ std::move(pending_report_urls_), frame_origin_, *client_security_state_, url_loader_factory_); pending_report_urls_.clear(); +} + +void InterestGroupAuctionReporter::MaybeSendPrivateAggregationReports() { + if (!navigated_to_winning_ad_ || !reporting_complete_) { + return; + } OnFledgePrivateAggregationRequests( private_aggregation_manager_, main_frame_origin_, std::move(private_aggregation_requests_reserved_));
diff --git a/content/browser/interest_group/interest_group_auction_reporter.h b/content/browser/interest_group/interest_group_auction_reporter.h index 8af57a4..d95ce9f 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.h +++ b/content/browser/interest_group/interest_group_auction_reporter.h
@@ -265,9 +265,12 @@ } // Sends requests for the Private Aggregation API to - // private_aggregation_manager. The map should be keyed by reporting origin of - // the corresponding requests. Does nothing if `private_aggregation_requests` - // is empty. + // private_aggregation_manager. This does not handle requests conditional on + // non-reserved events, but does handle requests conditional on reserved + // events (and requests that aren't conditional on an event). The map should + // be keyed by reporting origin of the corresponding requests. Does nothing if + // `private_aggregation_requests` is empty. This should only be called once + // per auction. // // Static so that this can be invoked when there's no winner, and a reporter // isn't needed. @@ -372,9 +375,14 @@ // added, and on first invocation of OnNavigateToWinningAd(). // Does not send reports that are populated only on construction - those are // handled in OnNavigateToWinningAd(), since they never need to be sent when a - // reporting script completes. + // reporting script completes. Does not trigger Private Aggregation reports. void SendPendingReportsIfNavigated(); + // This checks if the winning ad has been navigated to and if reporting is + // complete and sends all pending private aggregation requests if both are + // true. It should be called when either of these conditions becomes true. + void MaybeSendPrivateAggregationReports(); + const raw_ptr<InterestGroupManagerImpl> interest_group_manager_; const raw_ptr<AuctionWorkletManager> auction_worklet_manager_; const raw_ptr<PrivateAggregationManager> private_aggregation_manager_;
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc index 302bb13..e547572 100644 --- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc +++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -1329,50 +1329,40 @@ SetUpAndStartSingleSellerAuction(); - // Nothing should be sent when the auction is started. - EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), - testing::UnorderedElementsAre()); - - // On navigation, the requests from the bidding and scoring phase of the - // auction should be passed along. interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); - EXPECT_THAT( - private_aggregation_manager_.TakePrivateAggregationRequests(), - testing::UnorderedElementsAre( - testing::Pair(kSellerOrigin, - ElementsAreRequests(kScoreAdPrivateAggregationRequest)), - testing::Pair( - kWinningBidderOrigin, - ElementsAreRequests( - kWinningBidderGenerateBidPrivateAggregationRequest)), - testing::Pair( - kLosingBidderOrigin, - ElementsAreRequests( - kLosingBidderGenerateBidPrivateAggregationRequest)))); - // The reserved aggregation requests from the seller's reportResult() method - // should be immediately passed along. WaitForReportResultAndRunCallback( kSellerScriptUrl, /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, MakeRequestPtrVector(kReportResultPrivateAggregationRequest.Clone(), kBonusPrivateAggregationRequest.Clone())); - EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), - testing::UnorderedElementsAre(testing::Pair( - kSellerOrigin, - ElementsAreRequests(kReportResultPrivateAggregationRequest, - kBonusPrivateAggregationRequest)))); - // The reserved aggregation requests from the bidder's reportWin() method - // should be immediately passed along. + // No requests should be sent until all phases are complete. + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre()); + + // All reserved aggregation requests should be immediately passed along once + // the auction is complete. WaitForReportWinAndRunCallback( /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, MakeRequestPtrVector(kReportWinPrivateAggregationRequest.Clone(), kBonusPrivateAggregationRequest.Clone())); - EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), - testing::UnorderedElementsAre(testing::Pair( - kWinningBidderOrigin, - ElementsAreRequests(kReportWinPrivateAggregationRequest, - kBonusPrivateAggregationRequest)))); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre( + testing::Pair( + kSellerOrigin, + ElementsAreRequests(kScoreAdPrivateAggregationRequest, + kReportResultPrivateAggregationRequest, + kBonusPrivateAggregationRequest)), + testing::Pair(kWinningBidderOrigin, + ElementsAreRequests( + kWinningBidderGenerateBidPrivateAggregationRequest, + kReportWinPrivateAggregationRequest, + kBonusPrivateAggregationRequest)), + testing::Pair( + kLosingBidderOrigin, + ElementsAreRequests( + kLosingBidderGenerateBidPrivateAggregationRequest)))); WaitForCompletion(); } @@ -1448,30 +1438,18 @@ SetUpAndStartSingleSellerAuction(); - // Nothing should be sent when the auction is started. + interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); + + // Nothing should be sent until all phases are complete. EXPECT_TRUE(interest_group_auction_reporter_->fenced_frame_reporter() ->GetPrivateAggregationEventMapForTesting() .empty()); - // On navigation, the requests from the bidding and scoring phase of the - // auction should be passed along. - interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); - EXPECT_THAT( - interest_group_auction_reporter_->fenced_frame_reporter() - ->GetPrivateAggregationEventMapForTesting(), - testing::UnorderedElementsAre( - testing::Pair( - "event_type", - ElementsAreRequests( - kWinningBidderGenerateBidPrivateAggregationRequest)), - testing::Pair("event_type2", - ElementsAreRequests(kBonusPrivateAggregationRequest)))); - WaitForReportResultAndRunCallback(kSellerScriptUrl, /*report_url=*/absl::nullopt); - // The non-reserved aggregation requests from the bidder's - // reportWin() method should be immediately passed along. + // The non-reserved aggregation requests should be passed along right after + // the reporting phase. WaitForReportWinAndRunCallback( /*report_url=*/absl::nullopt, /*ad_beacon_map=*/{}, MakeRequestPtrVector(
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index b7c2466..da89411 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -1741,10 +1741,10 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "biddingUrl 'https://bid.a.test/' for AuctionAdInterestGroup with " - "owner '%s' and name 'bicycles' biddingUrl must have the same origin " - "as the InterestGroup owner and have no fragment identifier or " - "embedded credentials.", + "biddingLogicURL 'https://bid.a.test/' for AuctionAdInterestGroup " + "with owner '%s' and name 'bicycles' biddingLogicURL must have the " + "same origin as the InterestGroup owner and have no fragment " + "identifier or embedded credentials.", test_origin_a.Serialize().c_str()), JoinInterestGroupAndVerify(blink::TestInterestGroupBuilder( /*owner=*/test_origin_a, @@ -1757,8 +1757,8 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "updateUrl 'https://update.a.test/' for AuctionAdInterestGroup with " - "owner '%s' and name 'tricycles' updateUrl must have the same origin " + "updateURL 'https://update.a.test/' for AuctionAdInterestGroup with " + "owner '%s' and name 'tricycles' updateURL must have the same origin " "as the InterestGroup owner and have no fragment identifier or " "embedded credentials.", test_origin_a.Serialize().c_str()), @@ -2969,7 +2969,7 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "biddingWasmHelperUrl 'https://invalid^&' for AuctionAdInterestGroup " + "biddingWasmHelperURL 'https://invalid^&' for AuctionAdInterestGroup " "with owner '%s' and name 'cars' cannot be resolved to a valid URL.", origin_string.c_str()), EvalJs(shell(), JsReplace(kScriptTemplate, origin_string.c_str()))); @@ -2985,7 +2985,7 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "updateUrl 'https://invalid^&' for AuctionAdInterestGroup with " + "updateURL 'https://invalid^&' for AuctionAdInterestGroup with " "owner '%s' and name 'cars' cannot be resolved to a valid URL.", origin_string.c_str()), EvalJs(shell(), JsReplace(R"( @@ -3053,7 +3053,7 @@ EXPECT_EQ( base::StringPrintf( "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " - "updateUrl '%s' for AuctionAdInterestGroup with owner '%s' and name " + "updateURL '%s' for AuctionAdInterestGroup with owner '%s' and name " "'cars' must match dailyUpdateUrl, when both are present.", (origin_string + "/foo").c_str(), origin_string.c_str()), EvalJs(shell(), JsReplace(R"( @@ -3692,6 +3692,18 @@ GURL(base::StringPrintf("%s/bidding.js", origin_string.c_str()))) .Build(); + const blink::InterestGroup kExpectedGroupBiddingWasmHelperUrl = + blink::TestInterestGroupBuilder(/*owner=*/origin, /*name=*/"cars") + .SetBiddingWasmHelperUrl(GURL( + base::StringPrintf("%s/bidding.wasm", origin_string.c_str()))) + .Build(); + + const blink::InterestGroup kExpectedGroupUpdateUrl = + blink::TestInterestGroupBuilder(/*owner=*/origin, /*name=*/"cars") + .SetUpdateUrl( + GURL(base::StringPrintf("%s/update.json", origin_string.c_str()))) + .Build(); + struct TestCases { const std::string join_dict_contents; const std::string result; @@ -3757,6 +3769,52 @@ "'%s/bidding2.js')", origin_string.c_str(), origin_string.c_str()), absl::nullopt}, + // *** + // biddingWasmHelperURL + // *** + {base::StringPrintf(R"(biddingWasmHelperUrl: '%s/bidding.wasm')", + origin_string.c_str()), + "done", kExpectedGroupBiddingWasmHelperUrl}, + {base::StringPrintf(R"(biddingWasmHelperURL: '%s/bidding.wasm')", + origin_string.c_str()), + "done", kExpectedGroupBiddingWasmHelperUrl}, + {base::StringPrintf(R"(biddingWasmHelperUrl: '%s/bidding.wasm',)" + R"(biddingWasmHelperURL: '%s/bidding.wasm')", + origin_string.c_str(), origin_string.c_str()), + "done", kExpectedGroupBiddingWasmHelperUrl}, + {base::StringPrintf(R"(biddingWasmHelperUrl: '%s/bidding.wasm',)" + R"(biddingWasmHelperURL: '%s/bidding2.wasm')", + origin_string.c_str(), origin_string.c_str()), + base::StringPrintf( + "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " + "interest group biddingWasmHelperUrl doesn't have the same value as " + "interest group biddingWasmHelperURL ('%s/bidding.wasm' vs " + "'%s/bidding2.wasm')", + origin_string.c_str(), origin_string.c_str()), + absl::nullopt}, + // *** + // updateURL + // *** + {base::StringPrintf(R"(updateUrl: '%s/update.json')", + origin_string.c_str()), + "done", kExpectedGroupUpdateUrl}, + {base::StringPrintf(R"(updateURL: '%s/update.json')", + origin_string.c_str()), + "done", kExpectedGroupUpdateUrl}, + {base::StringPrintf(R"(updateUrl: '%s/update.json',)" + R"(updateURL: '%s/update.json')", + origin_string.c_str(), origin_string.c_str()), + "done", kExpectedGroupUpdateUrl}, + {base::StringPrintf(R"(updateUrl: '%s/update.json',)" + R"(updateURL: '%s/update2.json')", + origin_string.c_str(), origin_string.c_str()), + base::StringPrintf( + "TypeError: Failed to execute 'joinAdInterestGroup' on 'Navigator': " + "interest group updateUrl doesn't have the same value as " + "interest group updateURL ('%s/update.json' vs " + "'%s/update2.json')", + origin_string.c_str(), origin_string.c_str()), + absl::nullopt}, }; for (const auto& test_case : kTestCases) {
diff --git a/content/browser/interest_group/interest_group_pa_report_util.cc b/content/browser/interest_group/interest_group_pa_report_util.cc index cd8f2c0..1955fa84 100644 --- a/content/browser/interest_group/interest_group_pa_report_util.cc +++ b/content/browser/interest_group/interest_group_pa_report_util.cc
@@ -7,6 +7,7 @@ #include <stdint.h> #include <cmath> +#include <map> #include <string> #include <utility> #include <vector> @@ -18,9 +19,11 @@ #include "content/common/content_export.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" #include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #include "third_party/abseil-cpp/absl/numeric/int128.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/private_aggregation/aggregatable_report.mojom.h" +#include "third_party/blink/public/mojom/private_aggregation/private_aggregation_host.mojom.h" #include "url/origin.h" namespace content { @@ -309,4 +312,39 @@ return request_with_event_type; } +void SplitContributionsIntoBatchesThenSendToHost( + std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr> requests, + mojo::Remote<blink::mojom::PrivateAggregationHost>& remote_host) { + // Split the vector of requests into those with matching debug mode details. + std::map< + blink::mojom::DebugModeDetailsPtr, + std::vector<blink::mojom::AggregatableReportHistogramContributionPtr>> + contributions_map; + + for (auction_worklet::mojom::PrivateAggregationRequestPtr& request : + requests) { + // All for-event contributions have already been converted to histogram + // contributions by filling in post auction signals using + // `FillInPrivateAggregationRequest()` before reaching here. + CHECK(request->contribution->is_histogram_contribution()); + CHECK(request->debug_mode_details); + + // TODO(alexmt): Split by this too when it can be non-default. + CHECK_EQ(request->aggregation_mode, + blink::mojom::AggregationServiceMode::kDefault); + + contributions_map[std::move(request->debug_mode_details)].push_back( + std::move(request->contribution->get_histogram_contribution())); + } + + for (auto& [debug_mode_details, contributions] : contributions_map) { + // TODO(alexmt): Use `std::map::extract()` to avoid the `Clone()` when + // this is allowed in Chromium. + remote_host->SendHistogramReport( + std::move(contributions), + blink::mojom::AggregationServiceMode::kDefault, + debug_mode_details.Clone()); + } +} + } // namespace content
diff --git a/content/browser/interest_group/interest_group_pa_report_util.h b/content/browser/interest_group/interest_group_pa_report_util.h index 63bd8b3..ebca2bae 100644 --- a/content/browser/interest_group/interest_group_pa_report_util.h +++ b/content/browser/interest_group/interest_group_pa_report_util.h
@@ -5,11 +5,16 @@ #ifndef CONTENT_BROWSER_INTEREST_GROUP_INTEREST_GROUP_PA_REPORT_UTIL_H_ #define CONTENT_BROWSER_INTEREST_GROUP_INTEREST_GROUP_PA_REPORT_UTIL_H_ +#include <vector> + #include "base/time/time.h" #include "content/common/content_export.h" #include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom-forward.h" #include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/public/mojom/private_aggregation/aggregatable_report.mojom-forward.h" +#include "third_party/blink/public/mojom/private_aggregation/private_aggregation_host.mojom-forward.h" namespace content { @@ -60,6 +65,12 @@ const PrivateAggregationTimings& timings, bool is_winner); +// Splits a vector of requests into those with matching debug mode details and +// then forwards to the provided mojo pipe. +CONTENT_EXPORT void SplitContributionsIntoBatchesThenSendToHost( + std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr> requests, + mojo::Remote<blink::mojom::PrivateAggregationHost>& remote_host); + } // namespace content #endif // CONTENT_BROWSER_INTEREST_GROUP_INTEREST_GROUP_PA_REPORT_UTIL_H_
diff --git a/content/browser/interest_group/interest_group_update_manager.cc b/content/browser/interest_group/interest_group_update_manager.cc index f52fb80..25cf37c 100644 --- a/content/browser/interest_group/interest_group_update_manager.cc +++ b/content/browser/interest_group/interest_group_update_manager.cc
@@ -458,7 +458,19 @@ interest_group_update.bidding_url = GURL(*maybe_bidding_url); } const std::string* maybe_bidding_wasm_helper_url = + dict->FindString("biddingWasmHelperURL"); + const std::string* maybe_bidding_wasm_helper_url_deprecated = dict->FindString("biddingWasmHelperUrl"); + if (maybe_bidding_wasm_helper_url_deprecated) { + if (maybe_bidding_wasm_helper_url) { + if (*maybe_bidding_wasm_helper_url != + *maybe_bidding_wasm_helper_url_deprecated) { + return absl::nullopt; + } + } else { + maybe_bidding_wasm_helper_url = maybe_bidding_wasm_helper_url_deprecated; + } + } if (maybe_bidding_wasm_helper_url) { interest_group_update.bidding_wasm_helper_url = GURL(*maybe_bidding_wasm_helper_url);
diff --git a/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc b/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc index c1f0d1f3..d7a9e0a 100644 --- a/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc +++ b/content/browser/interest_group/test_interest_group_private_aggregation_manager.cc
@@ -64,15 +64,23 @@ contributions, blink::mojom::AggregationServiceMode aggregation_mode, blink::mojom::DebugModeDetailsPtr debug_mode_details) { - EXPECT_EQ(1u, contributions.size()); const url::Origin& worklet_origin = receiver_set_.current_context(); - auction_worklet::mojom::PrivateAggregationRequestPtr request = - auction_worklet::mojom::PrivateAggregationRequest::New( - auction_worklet::mojom::AggregatableReportContribution:: - NewHistogramContribution(std::move(contributions[0])), - aggregation_mode, std::move(debug_mode_details)); - private_aggregation_requests_[worklet_origin].push_back(std::move(request)); + if (!allow_multiple_calls_per_origin_) { + EXPECT_FALSE(base::Contains(private_aggregation_requests_, worklet_origin)); + } + + // Here, we 'unbatch' the contributions into separate requests. This allows + // for simpler equality checks in testing. + for (blink::mojom::AggregatableReportHistogramContributionPtr& contribution : + contributions) { + auction_worklet::mojom::PrivateAggregationRequestPtr request = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewHistogramContribution(std::move(contribution)), + aggregation_mode, debug_mode_details->Clone()); + private_aggregation_requests_[worklet_origin].push_back(std::move(request)); + } } void TestInterestGroupPrivateAggregationManager:: SetDebugModeDetailsOnNullReport( @@ -114,4 +122,11 @@ }); } +void TestInterestGroupPrivateAggregationManager::Reset() { + private_aggregation_requests_.clear(); + logged_private_aggregation_requests_.clear(); + receiver_set_.Clear(); + allow_multiple_calls_per_origin_ = false; +} + } // namespace content
diff --git a/content/browser/interest_group/test_interest_group_private_aggregation_manager.h b/content/browser/interest_group/test_interest_group_private_aggregation_manager.h index 0b349201..d0a0f80b 100644 --- a/content/browser/interest_group/test_interest_group_private_aggregation_manager.h +++ b/content/browser/interest_group/test_interest_group_private_aggregation_manager.h
@@ -64,7 +64,9 @@ GetLogPrivateAggregationRequestsCallback(); // Returns a per-origin map of reconstructed PrivateAggregationRequests make - // from SendHistogramReport() calls. + // from SendHistogramReport() calls. Note that the requests will have been + // 'unbatched' -- i.e. each contribution will be in a separate report. This is + // done for easier equality checks in tests. // // Clears everything it returns from internal state, so future calls will only // return new reports. Calls RunLoop::RunUntilIdle(), since @@ -77,6 +79,13 @@ std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr> TakeLoggedPrivateAggregationRequests(); + // Resets all internal state to the state just after construction. + void Reset(); + + void set_allow_multiple_calls_per_origin(bool value) { + allow_multiple_calls_per_origin_ = value; + } + private: void LogPrivateAggregationRequests( const std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr>& @@ -84,6 +93,10 @@ const url::Origin expected_top_frame_origin_; + // Whether multiple `SendHistogramReport()` calls are permitted without a call + // to `TakePrivateAggregationRequests()` or `Reset()` in between. + bool allow_multiple_calls_per_origin_ = false; + // Reports received through `SendHistogramReport()`. std::map<url::Origin, InterestGroupAuctionReporter::PrivateAggregationRequests>
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index 5f5f444..3ccf1e4 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -7260,4 +7260,32 @@ expected_histogram_value, 1); } +// This is a regression test against https://crbug.com/1145717 - navigating to +// invalid/weird URLs (e.g. `about:mumble` or `about://mumble`) shouldn't crash. +IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, AboutMumble) { + // First navigate to an arbitrary http site to lock the renderer process. + GURL http_url = embedded_test_server()->GetURL("a.com", "/title1.html"); + ASSERT_TRUE(NavigateToURL(shell(), http_url)); + + // Verify that browser-initiated navigation to `about:mumble` doesn't crash. + // + // The Commit IPC will carry the original "about:mumble" URL, which will still + // show up via `window.location.href`, but the URL passed back in DidCommit + // will be rewritten to `about:blank#blocked` in + // `RenderProcessHostImpl::FilterURL` and therefore this is what we expect in + // `GetLastCommittedURL`. + ASSERT_FALSE(NavigateToURL(shell(), GURL("about:mumble"))); + EXPECT_EQ(EvalJs(shell(), "window.location.href"), "about:mumble"); + EXPECT_EQ( + shell()->web_contents()->GetPrimaryMainFrame()->GetLastCommittedURL(), + GURL("about:blank#blocked")); + + // Verify that browser-initiated navigation to `about://mumble` doesn't crash. + ASSERT_FALSE(NavigateToURL(shell(), GURL("about://mumble"))); + EXPECT_EQ(EvalJs(shell(), "window.location.href"), "about://mumble"); + EXPECT_EQ( + shell()->web_contents()->GetPrimaryMainFrame()->GetLastCommittedURL(), + GURL("about:blank#blocked")); +} + } // namespace content
diff --git a/content/browser/private_aggregation/private_aggregation_budget_storage.cc b/content/browser/private_aggregation/private_aggregation_budget_storage.cc index db3451a..5507e44 100644 --- a/content/browser/private_aggregation/private_aggregation_budget_storage.cc +++ b/content/browser/private_aggregation/private_aggregation_budget_storage.cc
@@ -57,6 +57,10 @@ base::OnceCallback<void(std::unique_ptr<PrivateAggregationBudgetStorage>)> on_done_initializing) { DCHECK(on_done_initializing); + base::UmaHistogramBoolean( + "PrivacySandbox.PrivateAggregation.BudgetStorage." + "BeginInitializationCount", + /*sample=*/true); auto storage = base::WrapUnique(new PrivateAggregationBudgetStorage(db_task_runner)); auto* raw_storage = storage.get();
diff --git a/content/browser/private_aggregation/private_aggregation_budget_storage_unittest.cc b/content/browser/private_aggregation/private_aggregation_budget_storage_unittest.cc index 74ea15e..584a09d 100644 --- a/content/browser/private_aggregation/private_aggregation_budget_storage_unittest.cc +++ b/content/browser/private_aggregation/private_aggregation_budget_storage_unittest.cc
@@ -82,6 +82,13 @@ task_environment_.RunUntilIdle(); } + void VerifyInitializationCountHistogram(size_t expected_count) { + histogram_tester_.ExpectTotalCount( + "PrivacySandbox.PrivateAggregation.BudgetStorage." + "BeginInitializationCount", + expected_count); + } + // Helper for the unique sample case. void VerifyHistograms(PrivateAggregationBudgetStorage::InitStatus init_status, bool shutdown_before_finishing_initialization, @@ -93,6 +100,8 @@ "PrivacySandbox.PrivateAggregation.BudgetStorage." "ShutdownBeforeFinishingInitialization", shutdown_before_finishing_initialization, expected_bucket_count); + VerifyInitializationCountHistogram( + /*expected_count=*/expected_bucket_count); } base::FilePath storage_directory() const { return temp_directory_.GetPath(); } @@ -124,9 +133,12 @@ EXPECT_FALSE(base::PathExists(db_path())); base::RunLoop run_loop; + VerifyInitializationCountHistogram(/*expected_count=*/0); OpenDatabase(/*run_in_memory=*/false, /*on_done_initializing=*/base::BindLambdaForTesting( [&run_loop]() { run_loop.Quit(); })); + // The count should be increased when the initialization begins. + VerifyInitializationCountHistogram(/*expected_count=*/1); EXPECT_FALSE(storage()); run_loop.Run(); EXPECT_TRUE(storage());
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc index 8c50ae9..d4a7c677 100644 --- a/content/browser/renderer_host/navigation_controller_impl.cc +++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -268,11 +268,12 @@ return absl::make_optional(params.origin); } -bool IsValidURLForNavigation(bool is_main_frame, +bool IsValidURLForNavigation(FrameTreeNode* node, const GURL& virtual_url, const GURL& dest_url) { // Don't attempt to navigate if the virtual URL is non-empty and invalid. - if (is_main_frame && !virtual_url.is_valid() && !virtual_url.is_empty()) { + if (node->IsOutermostMainFrame() && !virtual_url.is_valid() && + !virtual_url.is_empty()) { LOG(WARNING) << "Refusing to load for invalid virtual URL: " << virtual_url.possibly_invalid_spec(); return false; @@ -305,6 +306,22 @@ return false; } + // Guests only support navigations to known-safe schemes. This check already + // exists in the extensions layer, where it also dispatches proper events to + // the guest's embedder (see WebViewGuest::LoadURLWithParams). This check is + // for defense-in-depth to ensure that no other places in the codebase + // accidentally navigate guests to schemes such as WebUI, which is not + // supported. See https://crbug.com/1444221. + if (node->current_frame_host()->GetSiteInstance()->IsGuest()) { + auto* cpsp = content::ChildProcessSecurityPolicy::GetInstance(); + if (!cpsp->IsWebSafeScheme(dest_url.scheme()) && + !dest_url.SchemeIs(url::kAboutScheme)) { + LOG(WARNING) << "Refusing to load unsafe URL in a guest: " + << dest_url.possibly_invalid_spec(); + return false; + } + } + return true; } @@ -3875,9 +3892,9 @@ return nullptr; } - if (!IsValidURLForNavigation(node->IsOutermostMainFrame(), virtual_url, - url_to_load)) + if (!IsValidURLForNavigation(node, virtual_url, url_to_load)) { return nullptr; + } // Look for a pending commit that is to another document in this // FrameTreeNode. If one exists, then the last committed URL will not be the @@ -4044,8 +4061,8 @@ return nullptr; } - if (!IsValidURLForNavigation(frame_tree_node->IsOutermostMainFrame(), - entry->GetVirtualURL(), dest_url)) { + if (!IsValidURLForNavigation(frame_tree_node, entry->GetVirtualURL(), + dest_url)) { return nullptr; }
diff --git a/content/browser/webauth/webauth_browsertest.cc b/content/browser/webauth/webauth_browsertest.cc index b5150ae..1bb13ec 100644 --- a/content/browser/webauth/webauth_browsertest.cc +++ b/content/browser/webauth/webauth_browsertest.cc
@@ -93,56 +93,56 @@ GetAssertionAuthenticatorResponsePtr, WebAuthnDOMExceptionDetailsPtr>; -constexpr char kOkMessage[] = "webauth: OK"; +constexpr char kOkMessage[] = "OK"; constexpr char kPublicKeyErrorMessage[] = - "webauth: TypeError: Failed to execute 'create' on 'CredentialsContainer': " + "TypeError: Failed to execute 'create' on 'CredentialsContainer': " "Failed to read the 'publicKey' property from 'CredentialCreationOptions': " "Failed to read the 'rp' property from 'PublicKeyCredentialCreationOptions'" ": The provided value is not of type 'PublicKeyCredentialRpEntity'."; constexpr char kNotAllowedErrorMessage[] = - "webauth: NotAllowedError: The operation either timed out or was not " + "NotAllowedError: The operation either timed out or was not " "allowed. See: " "https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client."; #if BUILDFLAG(IS_WIN) constexpr char kInvalidStateErrorMessage[] = - "webauth: InvalidStateError: The user attempted to register an " + "InvalidStateError: The user attempted to register an " "authenticator that contains one of the credentials already registered " "with the relying party."; #endif // BUILDFLAG(IS_WIN) constexpr char kResidentCredentialsErrorMessage[] = - "webauth: NotSupportedError: Resident credentials or empty " + "NotSupportedError: Resident credentials or empty " "'allowCredentials' lists are not supported at this time."; constexpr char kRelyingPartySecurityErrorMessage[] = - "webauth: SecurityError: The relying party ID is not a registrable domain " + "SecurityError: The relying party ID is not a registrable domain " "suffix of, nor equal to the current domain."; constexpr char kAbortErrorMessage[] = - "webauth: AbortError: signal is aborted without reason"; + "AbortError: signal is aborted without reason"; -constexpr char kAbortReasonMessage[] = "webauth: Error"; +constexpr char kAbortReasonMessage[] = "Error"; constexpr char kGetPermissionsPolicyMissingMessage[] = - "webauth: NotAllowedError: The 'publickey-credentials-get' feature is " + "NotAllowedError: The 'publickey-credentials-get' feature is " "not enabled in this document. Permissions Policy may be used to delegate " "Web Authentication capabilities to cross-origin child frames."; constexpr char kCrossOriginAncestorMessage[] = - "webauth: NotAllowedError: The following credential operations can only " + "NotAllowedError: The following credential operations can only " "occur in a document which is same-origin with all of its ancestors: " "storage/retrieval of 'PasswordCredential' and 'FederatedCredential', " "storage of 'PublicKeyCredential'."; constexpr char kAllowCredentialsRangeErrorMessage[] = - "webauth: RangeError: The `allowCredentials` attribute exceeds the maximum " + "RangeError: The `allowCredentials` attribute exceeds the maximum " "allowed size (64)."; constexpr char kExcludeCredentialsRangeErrorMessage[] = - "webauth: RangeError: The `excludeCredentials` attribute exceeds the " + "RangeError: The `excludeCredentials` attribute exceeds the " "maximum allowed size (64)."; // Templates to be used with base::ReplaceStringPlaceholders. Can be @@ -166,8 +166,8 @@ " authenticatorAttachment: '$5'," " }," " attestation: '$6'," - "}}).then(c => 'webauth: OK'," - " e => 'webauth: ' + e.toString())"; + "}}).then(c => 'OK'," + " e => e.toString())"; constexpr char kCreatePublicKeyWithAbortSignalTemplate[] = "navigator.credentials.create({ publicKey: {" @@ -187,8 +187,8 @@ " }," " attestation: '$6'," "}, signal: _signal_}" - ").then(c => 'webauth: OK'," - " e => 'webauth: ' + e.toString())"; + ").then(c => 'OK'," + " e => e.toString())"; constexpr char kShortTimeout[] = "100"; @@ -237,8 +237,8 @@ " userVerification: '$1'," " allowCredentials: $2," " timeout: $3}" - "}).then(c => 'webauth: OK'," - " e => 'webauth: ' + e.toString())"; + "}).then(c => 'OK'," + " e => e.toString())"; constexpr char kGetPublicKeyWithAbortSignalTemplate[] = "navigator.credentials.get({ publicKey: {" @@ -247,7 +247,7 @@ " allowCredentials: $2," " timeout: $3," "}, signal: $4}" - ").catch(c => 'webauth: ' + c.toString())"; + ").catch(c => c.toString())"; // Default values for kGetPublicKeyTemplate. struct GetParameters { @@ -274,12 +274,6 @@ substitutions, nullptr); } -std::string SendViaDomAutomationController( - const std::string& promise_expression) { - return promise_expression + - ".then((value) => window.domAutomationController.send(value));"; -} - // Helper class that executes the given |closure| the very last moment before // the next navigation commits in a given WebContents. class ClosureExecutorBeforeNavigationCommit @@ -1149,7 +1143,7 @@ if (should_fail) { ASSERT_EQ(kNotAllowedErrorMessage, result); } else { - ASSERT_EQ("webauth: OK", result); + ASSERT_EQ(kOkMessage, result); } } } @@ -1292,40 +1286,6 @@ ASSERT_EQ(kAbortReasonMessage, result.substr(0, strlen(kAbortReasonMessage))); } -// Executes Javascript in the given WebContents and waits until a string with -// the given prefix is received. It will ignore values other than strings, and -// strings without the given prefix. Since messages are broadcast to -// DOMMessageQueues, this allows other functions that depend on ExecJs -// (and thus trigger the broadcast of values) to run while this function is -// waiting for a specific result. -absl::optional<std::string> ExecuteScriptAndExtractPrefixedString( - WebContents* web_contents, - const std::string& script, - const std::string& result_prefix) { - DOMMessageQueue dom_message_queue(web_contents); - web_contents->GetPrimaryMainFrame()->ExecuteJavaScriptForTests( - base::UTF8ToUTF16(script), base::NullCallback()); - - for (;;) { - std::string json; - if (!dom_message_queue.WaitForMessage(&json)) { - return absl::nullopt; - } - - absl::optional<base::Value> result = - base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS); - if (!result) { - return absl::nullopt; - } - - std::string str; - if (result->is_string()) - str = result->GetString(); - if (str.find(result_prefix) == 0) - return str; - } -} - IN_PROC_BROWSER_TEST_F(WebAuthJavascriptClientBrowserTest, RequestsFromIFrames) { static constexpr char kOuterHost[] = "acme.com"; @@ -1428,15 +1388,9 @@ EXPECT_TRUE(NavigateToURL( shell(), GetHttpsURL("www.acme.com", "/page_with_iframe.html"))); - // The plain EvalJs cannot be used because NavigateIframeToURL uses it - // internally and they get confused about which message is for whom. - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildCreateCallWithParameters(CreateParameters())), - "webauth: "); - ASSERT_TRUE(result); - ASSERT_EQ(kOkMessage, *result); + ASSERT_EQ(kOkMessage, + EvalJs(shell()->web_contents(), + BuildCreateCallWithParameters(CreateParameters()))); ASSERT_TRUE(prompt_callback_was_invoked); } @@ -1465,18 +1419,8 @@ // Silence the erroneous bugprone-use-after-move. callback = base::OnceCallback<void(bool)>(); } - // Can't use NavigateIframeToURL here because in the - // BEFORE_NAVIGATION case we are racing AuthenticatorImpl and - // NavigateIframeToURL can get confused by the "OK" message. - absl::optional<std::string> result = - ExecuteScriptAndExtractPrefixedString( - web_contents, - "document.getElementById('test_iframe').src = " - "'/title2.html'; " - "window.domAutomationController.send('iframe: done');", - "iframe: "); - CHECK(result); - CHECK_EQ("iframe: done", *result); + EXPECT_TRUE(NavigateIframeToURL(web_contents, "test_iframe", + GURL("/title2.html"))); if (behavior == AttestationCallbackBehavior::AFTER_NAVIGATION) { std::move(callback).Run(true); } @@ -1488,15 +1432,8 @@ CreateParameters parameters; parameters.attestation = "direct"; - // The plain EvalJs cannot be used because NavigateIframeToURL uses it - // internally and they get confused about which message is for whom. - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildCreateCallWithParameters(parameters)), - "webauth: "); - ASSERT_TRUE(result); - ASSERT_EQ(kOkMessage, *result); + ASSERT_EQ(kOkMessage, EvalJs(shell()->web_contents(), + BuildCreateCallWithParameters(parameters))); ASSERT_TRUE(prompt_callback_was_invoked); } } @@ -1593,21 +1530,18 @@ " extensions: { devicePubKey: {} }," "}}).then(c => {" " const e = (buf) => btoa(String.fromCharCode(...new Uint8Array(buf)));" - " window.domAutomationController.send(" - " 'webauth: ' + e(c.response.getAuthenticatorData())" + " return e(c.response.getAuthenticatorData())" " + ',' + e(c.response.clientDataJSON)" " + ',' + e(c.getClientExtensionResults()" " .devicePubKey" " .authenticatorOutput)" " + ',' + e(c.getClientExtensionResults()" " .devicePubKey" - " .signature));" - "}, e => window.domAutomationController.send(" - " 'webauth: ' + e.toString()));"; - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), kJavascript, "webauth: "); - ASSERT_TRUE(result); - VerifyDevicePublicKeyOutput(result->substr(9)); + " .signature);" + "}, e => e.toString());"; + std::string result = + EvalJs(shell()->web_contents(), kJavascript).ExtractString(); + VerifyDevicePublicKeyOutput(result); } IN_PROC_BROWSER_TEST_F(WebAuthJavascriptClientBrowserTest, @@ -1632,21 +1566,18 @@ " extensions: { devicePubKey: {} }," "}}).then(c => {" " const e = (buf) => btoa(String.fromCharCode(...new Uint8Array(buf)));" - " window.domAutomationController.send(" - " 'webauth: ' + e(c.response.authenticatorData)" + " return e(c.response.authenticatorData)" " + ',' + e(c.response.clientDataJSON)" " + ',' + e(c.getClientExtensionResults()" " .devicePubKey" " .authenticatorOutput)" " + ',' + e(c.getClientExtensionResults()" " .devicePubKey" - " .signature));" - "}, e => window.domAutomationController.send(" - " 'webauth: ' + e.toString()));"; - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), kJavascript, "webauth: "); - ASSERT_TRUE(result); - VerifyDevicePublicKeyOutput(result->substr(9)); + " .signature);" + "}, e => e.toString());"; + std::string result = + EvalJs(shell()->web_contents(), kJavascript).ExtractString(); + VerifyDevicePublicKeyOutput(result); } #if BUILDFLAG(IS_WIN) @@ -1659,13 +1590,9 @@ auto* virtual_device_factory = InjectVirtualFidoDeviceFactory(); virtual_device_factory->set_win_webauthn_api(&fake_api); - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildCreateCallWithParameters(CreateParameters())), - "webauth: "); - ASSERT_TRUE(result); - ASSERT_EQ(kOkMessage, *result); + ASSERT_EQ(kOkMessage, + EvalJs(shell()->web_contents(), + BuildCreateCallWithParameters(CreateParameters()))); } IN_PROC_BROWSER_TEST_F(WebAuthJavascriptClientBrowserTest, @@ -1698,13 +1625,9 @@ for (const auto& error : errors) { fake_api.set_hresult(error.first); - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildCreateCallWithParameters(CreateParameters())), - "webauth: "); - EXPECT_TRUE(result); - EXPECT_EQ(*result, error.second); + EXPECT_EQ(error.second, + EvalJs(shell()->web_contents(), + BuildCreateCallWithParameters(CreateParameters()))); } } @@ -1723,13 +1646,8 @@ get_parameters.allow_credentials = "[{ type: 'public-key', id: new TextEncoder().encode('AAA')}]"; - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildGetCallWithParameters(get_parameters)), - "webauth: "); - ASSERT_TRUE(result); - ASSERT_EQ(kOkMessage, *result); + ASSERT_EQ(kOkMessage, EvalJs(shell()->web_contents(), + BuildGetCallWithParameters(get_parameters))); } IN_PROC_BROWSER_TEST_F(WebAuthJavascriptClientBrowserTest, @@ -1753,12 +1671,9 @@ for (const auto& error : errors) { fake_api.set_hresult(error); - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildGetCallWithParameters(GetParameters())), - "webauth: "); - ASSERT_EQ(*result, kNotAllowedErrorMessage); + ASSERT_EQ(kNotAllowedErrorMessage, + EvalJs(shell()->web_contents(), + BuildGetCallWithParameters(GetParameters()))); } } #endif @@ -1773,13 +1688,9 @@ "Array(65).fill({ type: 'public-key', id: new " "TextEncoder().encode('A')})"; - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController( - BuildGetCallWithParameters(get_parameters)), - "webauth: "); - ASSERT_TRUE(result); - ASSERT_EQ(kAllowCredentialsRangeErrorMessage, *result); + ASSERT_EQ(kAllowCredentialsRangeErrorMessage, + EvalJs(shell()->web_contents(), + BuildGetCallWithParameters(get_parameters))); } IN_PROC_BROWSER_TEST_F(WebAuthJavascriptClientBrowserTest, @@ -1791,12 +1702,9 @@ parameters.exclude_credentials = "Array(65).fill({type: 'public-key', id: new TextEncoder().encode('A')})"; - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), - SendViaDomAutomationController(BuildCreateCallWithParameters(parameters)), - "webauth: "); - ASSERT_TRUE(result); - ASSERT_EQ(kExcludeCredentialsRangeErrorMessage, *result); + ASSERT_EQ(kExcludeCredentialsRangeErrorMessage, + EvalJs(shell()->web_contents(), + BuildCreateCallWithParameters(parameters))); } // No `kAndroidAccessory` on Windows. @@ -1828,14 +1736,9 @@ " rp: { id: 'www.acme.com', name: 'name' }," " user: { id: new Uint8Array([0]), name: 'name', displayName: 'dn' }," " pubKeyCredParams: [{ type: 'public-key', alg: '-7'}]," - "}}).then(c => window.domAutomationController.send(" - " 'webauth: ' + c.response.getTransports())," - " e => window.domAutomationController.send(" - " 'webauth: ' + e.toString()));"; - absl::optional<std::string> result = ExecuteScriptAndExtractPrefixedString( - shell()->web_contents(), kJavascript, "webauth: "); - ASSERT_TRUE(result); - EXPECT_EQ(result, "webauth: hybrid,internal"); + "}}).then(c => String(c.response.getTransports())," + " e => e.toString());"; + EXPECT_EQ("hybrid,internal", EvalJs(shell()->web_contents(), kJavascript)); } #endif
diff --git a/content/browser/webid/fedcm_metrics.cc b/content/browser/webid/fedcm_metrics.cc index 02193a5..c9f141e 100644 --- a/content/browser/webid/fedcm_metrics.cc +++ b/content/browser/webid/fedcm_metrics.cc
@@ -224,7 +224,8 @@ bool auto_reauthn_success, bool is_auto_reauthn_setting_blocked, bool is_auto_reauthn_embargoed, - absl::optional<base::TimeDelta> time_from_embargo) { + absl::optional<base::TimeDelta> time_from_embargo, + bool requires_user_mediation) { NumReturningAccounts num_returning_accounts = NumReturningAccounts::kZero; if (has_single_returning_account.has_value()) { if (*has_single_returning_account) { @@ -242,6 +243,9 @@ is_auto_reauthn_setting_blocked); base::UmaHistogramBoolean("Blink.FedCm.AutoReauthn.BlockedByEmbargo", is_auto_reauthn_embargoed); + base::UmaHistogramBoolean( + "Blink.FedCm.AutoReauthn.BlockedByPreventSilentAccess", + requires_user_mediation); ukm::builders::Blink_FedCm ukm_builder(page_source_id_); if (time_from_embargo) { // Use a custom histogram with the default number of buckets so that we set @@ -264,6 +268,8 @@ ukm_builder.SetAutoReauthn_BlockedByContentSettings( is_auto_reauthn_setting_blocked); ukm_builder.SetAutoReauthn_BlockedByEmbargo(is_auto_reauthn_embargoed); + ukm_builder.SetAutoReauthn_BlockedByPreventSilentAccess( + requires_user_mediation); ukm_builder.SetFedCmSessionID(session_id_); ukm_builder.Record(ukm::UkmRecorder::Get()); }
diff --git a/content/browser/webid/fedcm_metrics.h b/content/browser/webid/fedcm_metrics.h index 29580083..0557d38 100644 --- a/content/browser/webid/fedcm_metrics.h +++ b/content/browser/webid/fedcm_metrics.h
@@ -182,7 +182,8 @@ bool auto_reauthn_success, bool is_auto_reauthn_setting_blocked, bool is_auto_reauthn_embargoed, - absl::optional<base::TimeDelta> time_from_embargo); + absl::optional<base::TimeDelta> time_from_embargo, + bool requires_user_mediation); private: // The page's SourceId. Used to log the UKM event Blink.FedCm.
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index db1c9c3c..a68e0e7 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -1134,6 +1134,10 @@ bool is_auto_reauthn_setting_enabled = false; bool is_auto_reauthn_embargoed = false; absl::optional<base::TimeDelta> time_from_embargo; + bool requires_user_mediation = false; + const IdentityProviderData* auto_reauthn_idp = nullptr; + const IdentityRequestAccount* auto_reauthn_account = nullptr; + bool has_single_returning_account = false; if (auto_reauthn_enabled) { is_auto_reauthn_setting_enabled = auto_reauthn_permission_delegate_->IsAutoReauthnSettingEnabled(); @@ -1154,13 +1158,8 @@ "Only one auto re-authn request can be made every 10 minutes."); } auto_reauthn &= !is_auto_reauthn_embargoed; - auto_reauthn &= !RequiresUserMediation(); - } - - const IdentityProviderData* auto_reauthn_idp = nullptr; - const IdentityRequestAccount* auto_reauthn_account = nullptr; - bool has_single_returning_account = false; - if (auto_reauthn_enabled) { + requires_user_mediation = RequiresUserMediation(); + auto_reauthn &= !requires_user_mediation; // Auto signs in returning users if they have a single returning account and // are signing in. has_single_returning_account = @@ -1171,7 +1170,7 @@ fedcm_metrics_->RecordAutoReauthnMetrics( has_single_returning_account, auto_reauthn_account, auto_reauthn, !is_auto_reauthn_setting_enabled, is_auto_reauthn_embargoed, - time_from_embargo); + time_from_embargo, requires_user_mediation); // By this moment we know that the user has granted permission in the past // for the RP/IdP. Because otherwise we have returned already in @@ -1244,7 +1243,7 @@ fedcm_metrics_->RecordAutoReauthnMetrics( has_single_returning_account, auto_reauthn_account, auto_reauthn, !is_auto_reauthn_setting_enabled, is_auto_reauthn_embargoed, - time_from_embargo); + time_from_embargo, requires_user_mediation); } } @@ -2129,7 +2128,7 @@ /*has_single_returning_account=*/absl::nullopt, /*auto_signin_account=*/nullptr, /*auto_reauthn_success=*/false, !is_auto_reauthn_setting_enabled, - is_auto_reauthn_embargoed, time_from_embargo); + is_auto_reauthn_embargoed, time_from_embargo, requires_user_mediation); return true; } return false;
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index 5abdee2..be9c2b4 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -1085,7 +1085,8 @@ expected_returning_accounts, bool expected_succeeded, bool expected_auto_reauthn_setting_blocked, - bool expected_auto_reauthn_embargoed) { + bool expected_auto_reauthn_embargoed, + bool expected_prevent_silent_access) { // UMA checks histogram_tester_.ExpectUniqueSample("Blink.FedCm.AutoReauthn.Succeeded", expected_succeeded, 1); @@ -1106,6 +1107,9 @@ histogram_tester_.ExpectTotalCount( "Blink.FedCm.AutoReauthn.TimeFromEmbargoWhenBlocked", expected_auto_reauthn_embargoed ? 1 : 0); + histogram_tester_.ExpectUniqueSample( + "Blink.FedCm.AutoReauthn.BlockedByPreventSilentAccess", + expected_prevent_silent_access, 1); // UKM checks auto entries = ukm_recorder()->GetEntriesByName(FedCmEntry::kEntryName); @@ -1124,6 +1128,8 @@ entry, "AutoReauthn.BlockedByEmbargo")); EXPECT_FALSE(ukm_recorder()->GetEntryMetric( entry, "AutoReauthn.TimeFromEmbargoWhenBlocked")); + EXPECT_FALSE(ukm_recorder()->GetEntryMetric( + entry, "AutoReauthn.BlockedByPreventSilentAccess")); continue; } EXPECT_FALSE(metric_found) << "Found more than one AutoReauthn entry"; @@ -1154,6 +1160,12 @@ metric = ukm_recorder()->GetEntryMetric( entry, "AutoReauthn.TimeFromEmbargoWhenBlocked"); EXPECT_EQ(expected_auto_reauthn_embargoed, !!metric); + + metric = ukm_recorder()->GetEntryMetric( + entry, "AutoReauthn.BlockedByPreventSilentAccess"); + ASSERT_TRUE(metric) + << "AutoReauthn.BlockedByPreventSilentAccess was not found"; + EXPECT_EQ(expected_prevent_silent_access, *metric); } EXPECT_TRUE(metric_found) << "Did not find AutoReauthn metrics"; CheckAllFedCmSessionIDs(); @@ -1567,7 +1579,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kOne, /*expected_succeeded=*/true, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that auto re-authn with a single account where the account is a @@ -1607,7 +1620,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kOne, /*expected_succeeded=*/true, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that auto re-authn with multiple accounts and a single returning user @@ -1662,7 +1676,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kOne, /*expected_succeeded=*/true, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that auto re-authn with multiple accounts and multiple returning users @@ -1719,7 +1734,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kMultiple, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that auto re-authn with single non-returning account sets the sign-in @@ -1757,7 +1773,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kZero, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that auto re-authn with multiple accounts and a single returning user @@ -1822,6 +1839,12 @@ ASSERT_EQ(displayed_accounts().size(), 1u); EXPECT_EQ(CountNumLoginStateIsSignin(), 1); EXPECT_EQ(dialog_controller_state_.sign_in_mode, SignInMode::kExplicit); + + ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kOne, + /*expected_succeeded=*/false, + /*expected_auto_reauthn_setting_blocked=*/false, + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/true); } // Test that auto re-authn with multiple accounts and a single returning user @@ -1951,7 +1974,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kOne, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/true, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that auto re-authn where the auto re-authn cooldown is on sets @@ -1988,7 +2012,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kOne, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/true); + /*expected_auto_reauthn_embargoed=*/true, + /*expected_prevent_silent_access=*/false); std::vector<std::string> messages = RenderFrameHostTester::For(main_rfh())->GetConsoleMessages(); @@ -2041,7 +2066,8 @@ ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that no network request is sent if `mediation: silent` is used and auto @@ -2088,7 +2114,8 @@ ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/true); + /*expected_auto_reauthn_embargoed=*/true, + /*expected_prevent_silent_access=*/false); } // Test that no network request is sent if `mediation: silent` is used and user @@ -2133,7 +2160,8 @@ ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/true); } // Test that no network request is sent if `mediation: silent` is used and user @@ -2177,7 +2205,8 @@ ExpectAutoReauthnMetrics(/*expected_returning_accounts=*/absl::nullopt, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/true, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test `mediation: silent` could fail silently after fetching accounts @@ -2253,7 +2282,8 @@ ExpectAutoReauthnMetrics(FedCmMetrics::NumReturningAccounts::kMultiple, /*expected_succeeded=*/false, /*expected_auto_reauthn_setting_blocked=*/false, - /*expected_auto_reauthn_embargoed=*/false); + /*expected_auto_reauthn_embargoed=*/false, + /*expected_prevent_silent_access=*/false); } // Test that `mediation: required` sets the sign-in mode to explicit even though
diff --git a/content/services/auction_worklet/bidder_worklet.cc b/content/services/auction_worklet/bidder_worklet.cc index 807e22e9..2e2bcc5e 100644 --- a/content/services/auction_worklet/bidder_worklet.cc +++ b/content/services/auction_worklet/bidder_worklet.cc
@@ -127,6 +127,29 @@ SetDictMember(isolate, object, "biddingLogicUrl", v8_value); } +bool SetBiddingWasmHelperUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "biddingWasmHelperURL", v8_value) && + SetDictMember(isolate, object, "biddingWasmHelperUrl", v8_value); +} + +bool SetUpdateUrl(v8::Isolate* isolate, + v8::Local<v8::Object> object, + const std::string& val) { + v8::Local<v8::Value> v8_value; + if (!gin::TryConvertToV8(isolate, val, &v8_value)) { + return false; + } + return SetDictMember(isolate, object, "updateURL", v8_value) && + SetDictMember(isolate, object, "updateUrl", v8_value) && + SetDictMember(isolate, object, "dailyUpdateUrl", v8_value); +} + // Converts a vector of blink::InterestGroup::Ads into a v8 object. bool CreateAdVector(AuctionV8Helper* v8_helper, v8::Local<v8::Context> context, @@ -1045,16 +1068,11 @@ !SetBiddingLogicUrl(isolate, interest_group_object, script_source_url_.spec()) || (wasm_helper_url_ && - !interest_group_dict.Set("biddingWasmHelperUrl", + !SetBiddingWasmHelperUrl(isolate, interest_group_object, wasm_helper_url_->spec())) || (bidder_worklet_non_shared_params.update_url && - (!interest_group_dict.Set( - "updateUrl", bidder_worklet_non_shared_params.update_url->spec()) || - // TODO(https://crbug.com/1420080) Remove deprecated `dailyUpdateUrl` - // alias. - !interest_group_dict.Set( - "dailyUpdateUrl", - bidder_worklet_non_shared_params.update_url->spec()))) || + !SetUpdateUrl(isolate, interest_group_object, + bidder_worklet_non_shared_params.update_url->spec())) || (trusted_bidding_signals_url_ && !interest_group_dict.Set("trustedBiddingSignalsUrl", trusted_bidding_signals_url_->spec()))) {
diff --git a/content/services/auction_worklet/bidder_worklet_unittest.cc b/content/services/auction_worklet/bidder_worklet_unittest.cc index d6a2b16..e7fb248 100644 --- a/content/services/auction_worklet/bidder_worklet_unittest.cc +++ b/content/services/auction_worklet/bidder_worklet_unittest.cc
@@ -2145,6 +2145,38 @@ TEST_F(BidderWorkletTest, GenerateBidInterestGroupBiddingWasmHelperUrl) { const std::string kGenerateBidBody = + R"({ad: "biddingWasmHelperURL" in interestGroup ? + interestGroup.biddingWasmHelperURL : "missing", + bid:1, + render:"https://response.test/"})"; + + RunGenerateBidWithReturnValueExpectingResult( + kGenerateBidBody, + mojom::BidderWorkletBid::New( + R"("missing")", 1, /*bid_currency=*/absl::nullopt, + /*ad_cost=*/absl::nullopt, + blink::AdDescriptor(GURL("https://response.test/")), + /*ad_component_descriptors=*/absl::nullopt, + /*modeling_signals=*/absl::nullopt, base::TimeDelta())); + + interest_group_wasm_url_ = GURL(kWasmUrl); + AddResponse(&url_loader_factory_, GURL(kWasmUrl), kWasmMimeType, + /*charset=*/absl::nullopt, ToyWasm()); + RunGenerateBidWithReturnValueExpectingResult( + kGenerateBidBody, + mojom::BidderWorkletBid::New( + R"("https://foo.test/helper.wasm")", 1, + /*bid_currency=*/absl::nullopt, + /*ad_cost=*/absl::nullopt, + blink::AdDescriptor(GURL("https://response.test/")), + /*ad_component_descriptors=*/absl::nullopt, + /*modeling_signals=*/absl::nullopt, base::TimeDelta())); +} + +// TODO(crbug.com/1441988): Remove once rename is complete. +TEST_F(BidderWorkletTest, + GenerateBidInterestGroupBiddingWasmHelperUrlDeprecatedName) { + const std::string kGenerateBidBody = R"({ad: "biddingWasmHelperUrl" in interestGroup ? interestGroup.biddingWasmHelperUrl : "missing", bid:1,
diff --git a/content/test/data/interest_group/bidding_argument_validator.js b/content/test/data/interest_group/bidding_argument_validator.js index 8e5a42ed..fc9a481 100644 --- a/content/test/data/interest_group/bidding_argument_validator.js +++ b/content/test/data/interest_group/bidding_argument_validator.js
@@ -40,7 +40,7 @@ if (!interestGroup) throw 'No interest group'; - if (Object.keys(interestGroup).length !== 13) { + if (Object.keys(interestGroup).length !== 14) { throw 'Wrong number of interestGroupFields ' + JSON.stringify(interestGroup); } @@ -74,8 +74,12 @@ throw 'Incorrect biddingLogicUrl ' + interestGroup.biddingLogicUrl; } - if (!interestGroup.updateUrl.startsWith('https://a.test') || - !interestGroup.updateUrl.endsWith('/not_found_update_url.json')) { + if (!interestGroup.updateURL.startsWith('https://a.test') || + !interestGroup.updateURL.endsWith('/not_found_update_url.json')) { + throw 'Incorrect updateURL ' + interestGroup.updateURL; + } + + if (interestGroup.updateUrl !== interestGroup.updateURL) { throw 'Incorrect updateUrl ' + interestGroup.updateUrl; }
diff --git a/content/test/data/interest_group/component_auction_bidding_argument_validator.js b/content/test/data/interest_group/component_auction_bidding_argument_validator.js index d02a2d7..190ca9d 100644 --- a/content/test/data/interest_group/component_auction_bidding_argument_validator.js +++ b/content/test/data/interest_group/component_auction_bidding_argument_validator.js
@@ -40,7 +40,7 @@ if (!interestGroup) throw 'No interest group'; - if (Object.keys(interestGroup).length !== 13) { + if (Object.keys(interestGroup).length !== 14) { throw 'Wrong number of interestGroupFields ' + JSON.stringify(interestGroup); } @@ -73,8 +73,12 @@ throw 'Incorrect biddingLogicUrl ' + interestGroup.biddingLogicUrl; } - if (!interestGroup.updateUrl.startsWith('https://a.test') || - !interestGroup.updateUrl.endsWith('/not_found_update_url.json')) { + if (!interestGroup.updateURL.startsWith('https://a.test') || + !interestGroup.updateURL.endsWith('/not_found_update_url.json')) { + throw 'Incorrect updateURL ' + interestGroup.updateURL; + } + + if (interestGroup.updateUrl !== interestGroup.updateURL) { throw 'Incorrect updateUrl ' + interestGroup.updateUrl; }
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test.py b/content/test/gpu/gpu_tests/gpu_integration_test.py index 118ce2b7..e63c806 100644 --- a/content/test/gpu/gpu_tests/gpu_integration_test.py +++ b/content/test/gpu/gpu_tests/gpu_integration_test.py
@@ -368,6 +368,11 @@ try: super(GpuIntegrationTest, cls).StartBrowser() cls.tab = cls.browser.tabs[0] + # The GPU tests don't function correctly if the screen is not on, so + # ensure that this is the case. We do this on browser start instead of + # before every test since the overhead can be non-trivial, particularly + # when running many small tests like for WebGPU. + cls._EnsureScreenOn() return except Exception as e: # pylint: disable=broad-except last_exception = e @@ -430,6 +435,13 @@ cls.SetBrowserOptions(cls._finder_options) cls.StartBrowser() + @classmethod + def _EnsureScreenOn(cls) -> None: + """Ensures the screen is on for applicable platforms.""" + os_name = cls.browser.platform.GetOSName() + if os_name == 'android': + cls.browser.platform.android_action_runner.TurnScreenOn() + # pylint: disable=no-self-use def _ShouldForceRetryOnFailureFirstTest(self) -> bool: return False @@ -478,12 +490,6 @@ # pylint: enable=no-self-use - def _EnsureScreenOn(self) -> None: - """Ensures the screen is on for applicable platforms.""" - os_name = self.browser.platform.GetOSName() - if os_name == 'android': - self.browser.platform.android_action_runner.TurnScreenOn() - def _RunGpuTest(self, url: str, test_name: str, args: ct.TestArgs) -> None: expected_results, should_retry_on_failure = ( self.GetExpectationsForTest()[:2]) @@ -493,9 +499,6 @@ expected_crashes = {} try: expected_crashes = self.GetExpectedCrashes(args) - # The GPU tests don't function correctly if the screen is not on, so - # ensure that this is the case. - self._EnsureScreenOn() self.RunActualGpuTest(url, args) except unittest.SkipTest: # pylint: disable=attribute-defined-outside-init
diff --git a/device/fido/cable/cable_discovery_data.cc b/device/fido/cable/cable_discovery_data.cc index 48198f8d..476289b 100644 --- a/device/fido/cable/cable_discovery_data.cc +++ b/device/fido/cable/cable_discovery_data.cc
@@ -153,6 +153,13 @@ return absl::nullopt; } + const auto play_services_tag_it = map.find(cbor::Value(999)); + if (play_services_tag_it != map.end() && + play_services_tag_it->second.is_bool() && + play_services_tag_it->second.GetBool()) { + pairing->from_new_implementation = true; + } + return pairing; }
diff --git a/device/fido/cable/cable_discovery_data.h b/device/fido/cable/cable_discovery_data.h index 66aa161..00d8a63e 100644 --- a/device/fido/cable/cable_discovery_data.h +++ b/device/fido/cable/cable_discovery_data.h
@@ -183,6 +183,9 @@ // contains a higher number for less stable release channels (i.e. Canary is // high, development builds are highest). int channel_priority = 0; + // from_new_implementation is true if this Pairing was generated by the new + // hybrid implementation on Android. + bool from_new_implementation = false; }; } // namespace cablev2
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index 28bd3ce..937cc7f 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -491,12 +491,12 @@ <message name="IDS_IOS_TAB_SWITCHER_NO_TABS_TO_SYNC_PROMO" desc="The title of the paragraph IDS_OPEN_TABS_NO_SESSION_INSTRUCTIONS_IOS. The paragraph explains that tabs opened on other devices where the user is signed in will appear here, in the Tab Switcher. [iOS only]"> Use Chromium Everywhere </message> + <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> + You're getting standard security protection on this device + </message> <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> You have Chromium's strongest security against harmful websites </message> - <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> - You're getting standard security protection for this Chromium profile - </message> <message name="IDS_IOS_TAILORED_SECURITY_UNCONSENTED_ENABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> Get Enhanced Safe Browsing for this Chromium profile, too </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 index 9baebe4..4fe4d1c 100644 --- a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 +++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1
@@ -1 +1 @@ -d7d38266a64a4f5ba41695a40902ecfec81e29c3 \ No newline at end of file +f497351f1a540d910b8eba176f188a072eb0c6e9 \ 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 a079531a..177703f 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -491,12 +491,12 @@ <message name="IDS_IOS_TAB_SWITCHER_NO_TABS_TO_SYNC_PROMO" desc="The title of the paragraph IDS_OPEN_TABS_NO_SESSION_INSTRUCTIONS_IOS. The paragraph explains that tabs opened on other devices where the user is signed in will appear here, in the Tab Switcher. [iOS only]"> Use Chrome Everywhere </message> + <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> + You're getting standard security protection on this device + </message> <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_ENABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> You have Chrome's strongest security against harmful websites </message> - <message name="IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> - You're getting standard security protection for this Chrome profile - </message> <message name="IDS_IOS_TAILORED_SECURITY_UNCONSENTED_ENABLE_MESSAGE_DESCRIPTION" desc="Description shown in the iOS message when the account tailored security setting changes for a consented primary account"> Get Enhanced Safe Browsing for this Chrome profile, too </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 index f05795fb..4fe4d1c 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1 +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAILORED_SECURITY_CONSENTED_DISABLE_MESSAGE_DESCRIPTION.png.sha1
@@ -1 +1 @@ -6811f45f6f23251ab05851dc5fc14af8df9935bc \ No newline at end of file +f497351f1a540d910b8eba176f188a072eb0c6e9 \ 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 daa6537..2782445 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -4476,11 +4476,8 @@ <message name="IDS_IOS_KEYBOARD_ACCESSORY_VIEW_PASTE_SEARCH" desc="Accessibility label for a button that starts a Paste and Search [iOS only]"> Paste and Search </message> - <message name="IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP" desc="The text of the tip explaining to the user they can use the carousel in the overflow menu."> - Your saved bookmarks, passwords, settings, and more are now here - </message> - <message name="IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP_VOICEOVER" desc="The VoiceOver announcement for the tip explaining to the user they can use the carousel in the overflow menu."> - Your saved bookmarks, passwords, settings, and more are available from this screen. + <message name="IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP" desc="The text of the tip explaining to the user they can use the history item in the overflow menu."> + View browsing history. </message> <message name="IDS_IOS_AUTOFILL_ADDRESS_SUGGESTIONS_AVAILABLE_ACCESSIBILITY_ANNOUNCEMENT" is_accessibility_with_no_ui="true" desc="The accessibility announcement to indicate the number of address suggestions available to the user above the keyboard. This announcement is triggered when the user enters edit mode in a form field that has address suggestions available for autofill purposes. According to the number of available addresses, the string goes from singular to plural. [iOS only]"> {count, plural, @@ -4590,9 +4587,6 @@ <message name="IDS_IOS_IDENTITY_ERROR_INFOBAR_VERIFY_BUTTON_LABEL" desc="The label of the verify your account action button in the identity error info bar. [iOS only]"> Verify </message> - <message name="IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP" desc="The text of the tip explaining that browsing history can be viewed from the Overflow Menu."> - View browsing history - </message> </messages> </release> </grit>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP.png.sha1 deleted file mode 100644 index 915964be..0000000 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -47006b0010e1c00114fa306e153a4039c9e45724 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP_VOICEOVER.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP_VOICEOVER.png.sha1 deleted file mode 100644 index e4fa09e4..0000000 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP_VOICEOVER.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -eefff4b62e8643cf7a87ba2fb1eed03c1e03c38b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP.png.sha1 index 853a879..96a6721 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP.png.sha1
@@ -1 +1 @@ -1fdbfd3d70a183a9eaf728aa708259c399753509 \ No newline at end of file +db7491288afb57a070d9a931f76d4b9f3136264e \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index a161a1d..71158e5e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">No s'ha pogut fer el seguiment del preu.</translation> <translation id="3469166899695866866">Vols aturar la baixada?</translation> <translation id="3470502288861289375">S'està copiant...</translation> +<translation id="3471148582064653480">Sincronitza les contrasenyes, l'historial i altres elements.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{per a {COUNT} lloc web o aplicació}other{per a {COUNT} llocs web i aplicacions}}</translation> <translation id="3474624961160222204">Continua com a <ph name="NAME" /></translation> <translation id="3478058380795961209">Mes de caducitat</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Tanca la pestanya</translation> <translation id="3565207542107370586">Esborra les dades de navegació…</translation> <translation id="3575234738189584619">Cerca amb Lens</translation> +<translation id="3577555362230509265">Utilitza Chrome en altres aplicacions.</translation> <translation id="3581564640715911333">Proposa traduir les pàgines en altres idiomes</translation> <translation id="3588820906588687999">Obre la imatge en una pestanya nova</translation> <translation id="3595252146048399851">Pots anar a la <ph name="BEGIN_LINK" />configuració<ph name="END_LINK" /> en qualsevol moment per decidir què vols sincronitzar. És possible que Google personalitzi la Cerca i altres serveis en funció del teu historial.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index edf6b724..83918e6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Methu ag olrhain y pris.</translation> <translation id="3469166899695866866">Stopio Lawrlwytho?</translation> <translation id="3470502288861289375">Wrthi'n copïo...</translation> +<translation id="3471148582064653480">Cysoni eich cyfrineiriau, hanes, a rhagor.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{ar gyfer {COUNT} wefan neu ap}zero{ar gyfer {COUNT} gwefan ac ap}two{ar gyfer {COUNT} wefan ac ap}few{ar gyfer {COUNT} gwefan ac ap}many{ar gyfer {COUNT} gwefan ac ap}other{ar gyfer {COUNT} gwefan ac ap}}</translation> <translation id="3474624961160222204">Parhau fel <ph name="NAME" /></translation> <translation id="3478058380795961209">Mis Darfod</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Cau'r Tab</translation> <translation id="3565207542107370586">Clirio Data Pori…</translation> <translation id="3575234738189584619">Chwilio gyda Lens</translation> +<translation id="3577555362230509265">Defnyddiwch Chrome mewn apiau eraill.</translation> <translation id="3581564640715911333">Cynnig cyfieithu tudalennau mewn ieithoedd eraill</translation> <translation id="3588820906588687999">Agor y Llun Mewn Tab Newydd</translation> <translation id="3595252146048399851">Gallwch bob amser ddewis beth i'w gysoni yn y <ph name="BEGIN_LINK" />gosodiadau<ph name="END_LINK" />. Gall Google bersonoleiddio Search a gwasanaethau eraill yn seiliedig ar eich hanes.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index cf0d860..6fd5694 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Couldn't track the price.</translation> <translation id="3469166899695866866">Stop download?</translation> <translation id="3470502288861289375">Copying...</translation> +<translation id="3471148582064653480">Sync your passwords, history, and more.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{for {COUNT} site or app}other{for {COUNT} sites and apps}}</translation> <translation id="3474624961160222204">Continue as <ph name="NAME" /></translation> <translation id="3478058380795961209">Month of Expiry</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Close Tab</translation> <translation id="3565207542107370586">Clear browsing data…</translation> <translation id="3575234738189584619">Search with Lens</translation> +<translation id="3577555362230509265">Use Chrome in other apps.</translation> <translation id="3581564640715911333">Offer to translate pages in other languages</translation> <translation id="3588820906588687999">Open Image in New Tab</translation> <translation id="3595252146048399851">You can always choose what to sync in <ph name="BEGIN_LINK" />settings<ph name="END_LINK" />. Google may personalise Search and other services based on your history.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index c73082b..dabbb4a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">No se ha podido hacer un seguimiento del precio.</translation> <translation id="3469166899695866866">¿Detener descarga?</translation> <translation id="3470502288861289375">Copiando...</translation> +<translation id="3471148582064653480">Sincroniza tus contraseñas, tu historial y mucho más.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{de {COUNT} sitio o aplicación}other{de {COUNT} sitios o aplicaciones}}</translation> <translation id="3474624961160222204">Continuar como <ph name="NAME" /></translation> <translation id="3478058380795961209">Mes de caducidad</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Cerrar pestaña</translation> <translation id="3565207542107370586">Borrar datos de navegación…</translation> <translation id="3575234738189584619">Buscar con Lens</translation> +<translation id="3577555362230509265">Usa Chrome en otras aplicaciones.</translation> <translation id="3581564640715911333">Ofrecer la traducción de páginas que estén en otros idiomas</translation> <translation id="3588820906588687999">Abrir imagen en una pestaña nueva</translation> <translation id="3595252146048399851">Siempre puedes seleccionar qué contenido quieres sincronizar en los <ph name="BEGIN_LINK" />ajustes<ph name="END_LINK" />. Google puede personalizar la Búsqueda y otros servicios en función de tu historial.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 84f3733..9b47964 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Hinda ei õnnestunud jälgida.</translation> <translation id="3469166899695866866">Kas peatada allalaadimine?</translation> <translation id="3470502288861289375">Kopeerimine ...</translation> +<translation id="3471148582064653480">Sünkroonige oma paroolid, ajalugu ja muudki.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} saidi või rakenduse puhul}other{{COUNT} saidi või rakenduse puhul}}</translation> <translation id="3474624961160222204">Jätka kasutajana <ph name="NAME" /></translation> <translation id="3478058380795961209">Aegumiskuu</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Sule vaheleht</translation> <translation id="3565207542107370586">Sirvimisandmete kustutamine …</translation> <translation id="3575234738189584619">Otsi Lensiga</translation> +<translation id="3577555362230509265">Kasutage Chrome'i muudes rakendustes.</translation> <translation id="3581564640715911333">Paku muudes keeltes olevate lehtede tõlkimist</translation> <translation id="3588820906588687999">Ava kujutis uuel vahelehel</translation> <translation id="3595252146048399851">Jaotises <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" /> saate igal ajal valida, mida sünkroonida. Google võib Otsingut ja muid teenuseid teie ajaloo alusel isikupärastada.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 9fa7593..a8be3fd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Hindi masubaybayan ang presyo.</translation> <translation id="3469166899695866866">Ihinto ang Pag-download?</translation> <translation id="3470502288861289375">Kinokopya...</translation> +<translation id="3471148582064653480">I-sync ang iyong mga password, history, at higit pa.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{para sa {COUNT} site o app}one{para sa {COUNT} site at app}other{para sa {COUNT} na site at app}}</translation> <translation id="3474624961160222204">Magpatuloy bilang si <ph name="NAME" /></translation> <translation id="3478058380795961209">Buwan ng Pag-expire</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Isara ang Tab</translation> <translation id="3565207542107370586">I-clear ang Data ng Pag-browse…</translation> <translation id="3575234738189584619">Maghanap gamit ang Lens</translation> +<translation id="3577555362230509265">Gamitin ang Chrome sa iba pang app.</translation> <translation id="3581564640715911333">Mag-alok na mag-translate ng mga page sa iba pang wika</translation> <translation id="3588820906588687999">Buksan ang Larawan sa Bagong Tab</translation> <translation id="3595252146048399851">Mapipili mo kung ano ang isi-sync anumang oras sa <ph name="BEGIN_LINK" />mga setting<ph name="END_LINK" />. Puwedeng i-personalize ng Google ang Search at iba pang serbisyo batay sa iyong history.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 5ec11c43..0aa9534 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">કિંમત ટ્રૅક કરી શક્યા નથી.</translation> <translation id="3469166899695866866">ડાઉનલોડ રોકીએ?</translation> <translation id="3470502288861289375">કૉપિ કરી રહ્યું છે...</translation> +<translation id="3471148582064653480">તમારા પાસવર્ડ, ઇતિહાસ અને બીજું ઘણું સિંક કરો.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} સાઇટ અથવા ઍપ માટે}one{{COUNT} સાઇટ અથવા ઍપ માટે}other{{COUNT} સાઇટ અથવા ઍપ માટે}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> તરીકે ચાલુ રાખો</translation> <translation id="3478058380795961209">સમય સમાપ્તિ મહિનો</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">ટૅબ બંધ કરો</translation> <translation id="3565207542107370586">બ્રાઉઝિંગ ડેટા સાફ કરો…</translation> <translation id="3575234738189584619">Lens વડે શોધો</translation> +<translation id="3577555362230509265">અન્ય ઍપમાં Chromeનો ઉપયોગ કરો.</translation> <translation id="3581564640715911333">પેજનો અન્ય ભાષાઓમાં અનુવાદ કરવાનું ઑફર કરો</translation> <translation id="3588820906588687999">નવા ટેબમાં છબી ખોલો</translation> <translation id="3595252146048399851">શું સિંક કરવું, તે તમે <ph name="BEGIN_LINK" />સેટિંગ<ph name="END_LINK" />માં જઈને કોઈપણ સમયે પસંદ કરી શકો છો. Google તમારા ઇતિહાસના આધારે Search અને અન્ય સેવાઓને મનગમતી બનાવી શકે છે.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index f6aa76f..1b99e150 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Бағаны бақылау мүмкін болмады.</translation> <translation id="3469166899695866866">Жүктеп алу процесін тоқтату керек пе?</translation> <translation id="3470502288861289375">Көшіруде…</translation> +<translation id="3471148582064653480">Құпия сөздерді, тарихты және т.б. синхрондаңыз.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} сайтқа немесе қолданбаға арналған}other{{COUNT} сайтқа немесе қолданбаға арналған}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> болып жалғастыру</translation> <translation id="3478058380795961209">Жарамдылық мерзімі бітетін ай</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Қойындыны жабу</translation> <translation id="3565207542107370586">Шолу деректерін өшіру…</translation> <translation id="3575234738189584619">Lens арқылы іздеу</translation> +<translation id="3577555362230509265">Chrome браузерін басқа қолданбаларда пайдаланыңыз.</translation> <translation id="3581564640715911333">Басқа тілдердегі беттердің аудармасын ұсыну</translation> <translation id="3588820906588687999">Кескінді жаңа қойындыда ашу</translation> <translation id="3595252146048399851">Синхрондалатын контентті кез келген уақытта <ph name="BEGIN_LINK" />Параметрлер<ph name="END_LINK" /> бөлімінде таңдай аласыз. Google жүйесі Search және басқа да қызметтерді тарихыңызға негіздеп жекелендіре алады.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 881cc2f..bf8de7d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">가격을 추적할 수 없습니다.</translation> <translation id="3469166899695866866">다운로드를 중지하시겠습니까?</translation> <translation id="3470502288861289375">복사 중...</translation> +<translation id="3471148582064653480">비밀번호, 방문 기록 등을 동기화합니다.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{사이트 또는 앱 {COUNT}개}other{사이트 및 앱 {COUNT}개}}</translation> <translation id="3474624961160222204"><ph name="NAME" />(으)로 계속</translation> <translation id="3478058380795961209">만료 월</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">탭 닫기</translation> <translation id="3565207542107370586">인터넷 사용 기록 삭제…</translation> <translation id="3575234738189584619">렌즈로 검색</translation> +<translation id="3577555362230509265">다른 앱에서 Chrome을 사용합니다.</translation> <translation id="3581564640715911333">다른 언어로 된 페이지의 번역 옵션 제공</translation> <translation id="3588820906588687999">새 탭에서 이미지 열기</translation> <translation id="3595252146048399851">언제든지 <ph name="BEGIN_LINK" />설정<ph name="END_LINK" />에서 동기화할 항목을 선택할 수 있습니다. Google에서는 사용자의 방문 기록을 기반으로 Google 검색 및 기타 서비스를 맞춤설정할 수 있습니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index d84d5f6..86a0a01 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Баага көз салуу мүмкүн болгон жок.</translation> <translation id="3469166899695866866">Жүктөп алуу токтотулсунбу?</translation> <translation id="3470502288861289375">Көчүрүлүүдө…</translation> +<translation id="3471148582064653480">Сырсөздөрүңүздү, таржымалыңызды жана башкаларды шайкештириңиз.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} сайттын же колдонмонун}other{{COUNT} сайттын же колдонмонун}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> катары улантуу</translation> <translation id="3478058380795961209">Мөөнтү аяктг ай</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Өтмөктү жабуу</translation> <translation id="3565207542107370586">Серептөө дайындарын өчүрүү…</translation> <translation id="3575234738189584619">Lens менен издөө</translation> +<translation id="3577555362230509265">Chrome'ду башка колдонмолордо пайдаланыңыз.</translation> <translation id="3581564640715911333">Башка тилдердеги барактарды которуу сунушталсын</translation> <translation id="3588820906588687999">Сүрөттү жаңы өтмөктө ачуу</translation> <translation id="3595252146048399851">Эмнени шайкештирүү керек экенин ар дайым <ph name="BEGIN_LINK" />параметрлерден<ph name="END_LINK" /> тандай аласыз. Google таржымалыңыздын негизинде Издөөнү жана башка кызматтарды жекелештириши мүмкүн.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 7a7b951..32795fe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Nepavyko stebėti kainos.</translation> <translation id="3469166899695866866">Sustabdyti atsisiuntimą?</translation> <translation id="3470502288861289375">Kopijuojama...</translation> +<translation id="3471148582064653480">Sinchronizuokite slaptažodžius, istoriją ir kt.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} svetainėje ar programoje}one{{COUNT} svetainėje ar programoje}few{{COUNT} svetainėse ar programose}many{{COUNT} svetainės ar programos}other{{COUNT} svetainių ar programų}}</translation> <translation id="3474624961160222204">Tęsti kaip <ph name="NAME" /></translation> <translation id="3478058380795961209">Gal. pab. mėnuo</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Uždaryti skirtuką</translation> <translation id="3565207542107370586">Išvalyti naršymo duomenis…</translation> <translation id="3575234738189584619">Paieška naudojant „Lens“</translation> +<translation id="3577555362230509265">Naudokite „Chrome“ kitose programose.</translation> <translation id="3581564640715911333">Siūlyti versti puslapius į kitas kalbas</translation> <translation id="3588820906588687999">Atidaryti vaizdą naujo skirtuko lape</translation> <translation id="3595252146048399851">Bet kada galite pasirinkti, ką norite sinchronizuoti, skiltyje <ph name="BEGIN_LINK" />„Nustatymai“<ph name="END_LINK" />. „Google“ gali suasmeninti Paiešką ir kitas paslaugas pagal jūsų istoriją.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index aba7ac7..b475828 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Tidak dapat menjejaki harga.</translation> <translation id="3469166899695866866">Hentikan Muat Turun?</translation> <translation id="3470502288861289375">Menyalin...</translation> +<translation id="3471148582064653480">Segerakkan kata laluan anda, sejarah dan pelbagai lagi.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{untuk {COUNT} laman atau apl}other{untuk {COUNT} laman atau apl}}</translation> <translation id="3474624961160222204">Teruskan sebagai <ph name="NAME" /></translation> <translation id="3478058380795961209">Bulan Tamat Tempoh</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Tutup Tab</translation> <translation id="3565207542107370586">Kosongkan Data Semakan Imbas…</translation> <translation id="3575234738189584619">Cari dengan Lens</translation> +<translation id="3577555362230509265">Gunakan Chrome pada apl lain.</translation> <translation id="3581564640715911333">Tawaran untuk menterjemah halaman dalam bahasa lain</translation> <translation id="3588820906588687999">Buka Imej dalam Tab Baharu</translation> <translation id="3595252146048399851">Anda boleh memilih item yang hendak disegerakkan dalam <ph name="BEGIN_LINK" />tetapan<ph name="END_LINK" /> pada bila-bila masa. Google mungkin memeribadikan Carian dan perkhidmatan lain berdasarkan sejarah anda.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 3a12722..8580861 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">ဈေးနှုန်းစောင့်ကြည့်၍ မရပါ။</translation> <translation id="3469166899695866866">ဒေါင်းလုဒ်ကို ရပ်လိုသလား။</translation> <translation id="3470502288861289375">ကူးယူနေ...</translation> +<translation id="3471148582064653480">သင့်စကားဝှက်၊ မှတ်တမ်း စသည်တို့ကို စင့်ခ်လုပ်ပါ။</translation> <translation id="3474048842645761983">{COUNT,plural, =1{ဝဘ်ဆိုက် (သို့) အက်ပ် {COUNT} ခု အတွက်}other{ဝဘ်ဆိုက်နှင့် အက်ပ် {COUNT} ခု အတွက်}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> အဖြစ် ရှေ့ဆက်ရန်</translation> <translation id="3478058380795961209">သက်တမ်း ကုန်ဆုံးသည့် လ</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">တဘ် ပိတ်ရန်</translation> <translation id="3565207542107370586">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာကို ရှင်းထုတ်ရန်…</translation> <translation id="3575234738189584619">Lens ဖြင့် ရှာဖွေရန်</translation> +<translation id="3577555362230509265">အခြားအက်ပ်များတွင် Chrome အသုံးပြုပါ။</translation> <translation id="3581564640715911333">စာမျက်နှာများကို အခြားဘာသာစကားများဖြင့် ပြန်ဆိုရန် ကမ်းလှမ်းသည်</translation> <translation id="3588820906588687999">ရုပ်ပုံကို တက်ဘ်အသစ်တွင်ဖွင့်ရန်</translation> <translation id="3595252146048399851">စင့်ခ်လုပ်မည့်အရာကို <ph name="BEGIN_LINK" />ဆက်တင်များ<ph name="END_LINK" /> တွင် အချိန်မရွေး ရွေးနိုင်သည်။ Google က Search နှင့် အခြားဝန်ဆောင်မှုများကို သင့်မှတ်တမ်းပေါ်မူတည်၍ ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်နိုင်သည်။</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 9c40ff1..8c8d664 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">मूल्य ट्रयाक गर्न सकिएन।</translation> <translation id="3469166899695866866">डाउनलोड रोक्ने हो?</translation> <translation id="3470502288861289375">प्रतिलिपि बनाउँदै...</translation> +<translation id="3471148582064653480">आफ्ना पासवर्ड, हिस्ट्री र अन्य जानकारी सिंक गर्नुहोस्।</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} वटा साइट वा एप}other{{COUNT} वटा साइट वा एप}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> का रूपमा जारी राख्नुहोस्</translation> <translation id="3478058380795961209">म्याद समाप्ति महिना</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">ट्याब बन्द गर्नुहोस्</translation> <translation id="3565207542107370586">ब्राउजिङ डेटा मेटाउनुहोस्…</translation> <translation id="3575234738189584619">Google लेन्समार्फत खोज्नुहोस्</translation> +<translation id="3577555362230509265">अन्य एपहरूमा Chrome प्रयोग गर्नुहोस्।</translation> <translation id="3581564640715911333">पृष्ठहरू अन्य भाषामा अनुवाद गर्ने प्रस्ताव गर्नुहोस्</translation> <translation id="3588820906588687999">छविलाई नयाँ ट्याबमा खोल्नुहोस्</translation> <translation id="3595252146048399851">तपाईं जुनसुकै बेला <ph name="BEGIN_LINK" />सेटिङ<ph name="END_LINK" />मा गई आफूले सिंक गर्न चाहेका कुराहरू छनौट गर्न सक्नुहुन्छ। Google ले तपाईंले विगतमा हेरेका वेबपेजका आधारमा Search र अन्य सेवाहरू पर्सनलाइज गर्न सक्छ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index aaf26cd..60ce599a5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">ਕੀਮਤ ਨੂੰ ਟਰੈਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation> <translation id="3469166899695866866">ਕੀ ਡਾਊਨਲੋਡ ਬੰਦ ਕਰਨਾ ਹੈ?</translation> <translation id="3470502288861289375">ਕਾਪੀ ਕਰ ਰਿਹਾ ਹੈ...</translation> +<translation id="3471148582064653480">ਆਪਣੇ ਪਾਸਵਰਡਾਂ, ਇਤਿਹਾਸ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ।</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} ਸਾਈਟ ਜਾਂ ਐਪ ਲਈ}one{{COUNT} ਸਾਈਟ ਜਾਂ ਐਪ ਲਈ}other{{COUNT} ਸਾਈਟਾਂ ਜਾਂ ਐਪਾਂ ਲਈ}}</translation> <translation id="3474624961160222204"><ph name="NAME" /> ਵਜੋਂ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="3478058380795961209">ਮਿਆਦ ਪੁੱਗਣ ਦਾ ਮਹੀਨਾ</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">ਟੈਬ ਬੰਦ ਕਰੋ</translation> <translation id="3565207542107370586">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ…</translation> <translation id="3575234738189584619">Lens ਨਾਲ ਖੋਜੋ</translation> +<translation id="3577555362230509265">ਹੋਰ ਐਪਾਂ ਵਿੱਚ Chrome ਦੀ ਵਰਤੋਂ ਕਰੋ।</translation> <translation id="3581564640715911333">ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ ਪੰਨਿਆਂ ਦਾ ਅਨੁਵਾਦ ਕਰਨ ਲਈ ਪੇਸ਼ਕਸ਼ ਕਰੋ</translation> <translation id="3588820906588687999">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਚਿੱਤਰ ਖੋਲ੍ਹੋ</translation> <translation id="3595252146048399851">ਤੁਸੀਂ <ph name="BEGIN_LINK" />ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ ਇਹ ਕਿਸੇ ਵੀ ਵੇਲੇ ਚੁਣ ਸਕਦੇ ਹੋ ਕਿ ਕੀ ਸਿੰਕ ਕਰਨਾ ਹੈ। Google ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੇ ਆਧਾਰ 'ਤੇ Search ਅਤੇ ਹੋਰ ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾ ਸਕਦਾ ਹੈ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index cdbd83bd..3c3f0be5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Не удалось отследить цену.</translation> <translation id="3469166899695866866">Остановить скачивание?</translation> <translation id="3470502288861289375">Копирование…</translation> +<translation id="3471148582064653480">Синхронизируйте пароли, историю и другие данные.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{Для {COUNT} сайта или приложения}one{Для {COUNT} сайта и приложения}few{Для {COUNT} сайтов и приложений}many{Для {COUNT} сайтов и приложений}other{Для {COUNT} сайта и приложения}}</translation> <translation id="3474624961160222204">Продолжить как <ph name="NAME" /></translation> <translation id="3478058380795961209">Месяц</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Закрыть вкладку</translation> <translation id="3565207542107370586">Удалить данные о работе в браузере</translation> <translation id="3575234738189584619">Искать с помощью Объектива</translation> +<translation id="3577555362230509265">Используйте Chrome в других приложениях.</translation> <translation id="3581564640715911333">Предлагать перевести страницы на других языках.</translation> <translation id="3588820906588687999">Открыть изображение в новой вкладке</translation> <translation id="3595252146048399851">Вы всегда можете выбрать, что синхронизировать, в <ph name="BEGIN_LINK" />настройках<ph name="END_LINK" />. Google может персонально настраивать Поиск и другие сервисы на основе вашей истории.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index fe58c70..7df1da0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Cene ni bilo mogoče spremljati.</translation> <translation id="3469166899695866866">Želite ustaviti prenos?</translation> <translation id="3470502288861289375">Kopiranje ...</translation> +<translation id="3471148582064653480">Sinhronizirajte gesla, zgodovino in drugo.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{za {COUNT} spletno mesto ali aplikacijo}one{za {COUNT} spletno mesto ali aplikacijo}two{za {COUNT} spletni mesti ali aplikaciji}few{za {COUNT} spletna mesta ali aplikacije}other{za {COUNT} spletnih mest ali aplikacij}}</translation> <translation id="3474624961160222204">Nadaljuj kot <ph name="NAME" /></translation> <translation id="3478058380795961209">Expiration Month</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Zapri zavihek</translation> <translation id="3565207542107370586">Izbris podatkov brskanja …</translation> <translation id="3575234738189584619">Iskanje z Googlom Lens</translation> +<translation id="3577555362230509265">Uporabite Chrome v drugih aplikacijah.</translation> <translation id="3581564640715911333">Ponudi prevajanje strani v drugih jezikih</translation> <translation id="3588820906588687999">Odpri sliko na novem zavihku</translation> <translation id="3595252146048399851">V <ph name="BEGIN_LINK" />nastavitvah<ph name="END_LINK" /> lahko kadar koli izberete, kaj želite sinhronizirati. Google lahko prilagodi Iskanje Google in druge storitve glede na vašo zgodovino.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index a2d35c5..f1e8c7d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Praćenje cene nije uspelo.</translation> <translation id="3469166899695866866">Zaustavljate preuzimanje?</translation> <translation id="3470502288861289375">Kopiranje...</translation> +<translation id="3471148582064653480">Sinhronizujte lozinke, istoriju i drugo.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{za {COUNT} sajt ili aplikaciju}one{za {COUNT} sajt i aplikaciju}few{za {COUNT} sajta i aplikacije}other{za {COUNT} sajtova i aplikacija}}</translation> <translation id="3474624961160222204">Nastavi kao <ph name="NAME" /></translation> <translation id="3478058380795961209">Mesec isteka</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Zatvori karticu</translation> <translation id="3565207542107370586">Obriši podatke pregledanja…</translation> <translation id="3575234738189584619">Pretražujte pomoću Objektiva</translation> +<translation id="3577555362230509265">Koristite Chrome u drugim aplikacijama.</translation> <translation id="3581564640715911333">Ponudi prevod stranica na drugim jezicima</translation> <translation id="3588820906588687999">Otvori sliku na novoj kartici</translation> <translation id="3595252146048399851">Uvek možete da odaberete šta ćete sinhronizovati u <ph name="BEGIN_LINK" />podešavanjima<ph name="END_LINK" />. Google može da personalizuje Pretragu i druge usluge na osnovu istorije.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 7a58e0a..a2cb1be3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">Праћење цене није успело.</translation> <translation id="3469166899695866866">Заустављате преузимање?</translation> <translation id="3470502288861289375">Копирање...</translation> +<translation id="3471148582064653480">Синхронизујте лозинке, историју и друго.</translation> <translation id="3474048842645761983">{COUNT,plural, =1{за {COUNT} сајт или апликацију}one{за {COUNT} сајт и апликацију}few{за {COUNT} сајта и апликације}other{за {COUNT} сајтова и апликација}}</translation> <translation id="3474624961160222204">Настави као <ph name="NAME" /></translation> <translation id="3478058380795961209">Месец истека</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">Затвори картицу</translation> <translation id="3565207542107370586">Обриши податке прегледања…</translation> <translation id="3575234738189584619">Претражујте помоћу Објектива</translation> +<translation id="3577555362230509265">Користите Chrome у другим апликацијама.</translation> <translation id="3581564640715911333">Понуди превод страница на другим језицима</translation> <translation id="3588820906588687999">Отвори слику на новој картици</translation> <translation id="3595252146048399851">Увек можете да одаберете шта ћете синхронизовати у <ph name="BEGIN_LINK" />подешавањима<ph name="END_LINK" />. Google може да персонализује Претрагу и друге услуге на основу историје.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 1988d1d..d5760896 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -379,6 +379,7 @@ <translation id="3464194322481586217">قیمت ٹریک نہیں کی جا سکی۔</translation> <translation id="3469166899695866866">ڈاؤن لوڈ روکیں؟</translation> <translation id="3470502288861289375">کاپی کیے جا رہے ہیں…</translation> +<translation id="3471148582064653480">اپنے پاس ورڈز، سرگزشت، اور بہت کچھ کو مطابقت پذیر بنائیں۔</translation> <translation id="3474048842645761983">{COUNT,plural, =1{{COUNT} سائٹ یا ایپ کے لیے}other{{COUNT} سائٹس یا ایپس کے لیے}}</translation> <translation id="3474624961160222204">بطور <ph name="NAME" /> جاری رکھیں</translation> <translation id="3478058380795961209">میعاد کے اختتام کا مہینہ</translation> @@ -399,6 +400,7 @@ <translation id="3551320343578183772">ٹیب بند کریں</translation> <translation id="3565207542107370586">براؤزنگ ڈیٹا صاف کریں…</translation> <translation id="3575234738189584619">لینز کا استعمال کرتے ہوئے تلاش کریں</translation> +<translation id="3577555362230509265">دیگر ایپس میں Chrome کا استعمال کریں۔</translation> <translation id="3581564640715911333">صفحات کو دیگر زبانوں میں ترجمہ کرنے کی پیشکش کریں</translation> <translation id="3588820906588687999">تصویر نئے ٹیب میں کھولیں</translation> <translation id="3595252146048399851">آپ کسی بھی وقت اس بات کا انتخاب کر سکتے ہیں کہ <ph name="BEGIN_LINK" />ترتیبات<ph name="END_LINK" /> میں کس چیز کی مطابقت پذیری کرنی ہے۔ Google آپ کی سرگزشت کی بنیاد پر تلاش اور دیگر سروسز کو ذاتی نوعیت کا بنا سکتا ہے۔</translation>
diff --git a/ios/chrome/browser/ntp/set_up_list_unittest.mm b/ios/chrome/browser/ntp/set_up_list_unittest.mm index 118393e1..1f15324 100644 --- a/ios/chrome/browser/ntp/set_up_list_unittest.mm +++ b/ios/chrome/browser/ntp/set_up_list_unittest.mm
@@ -221,6 +221,22 @@ [delegate verify]; } +// Tests that `allItemsComplete` correctly returns whether all items are +// complete. +TEST_F(SetUpListTest, AllItemsComplete) { + BuildSetUpList(); + EXPECT_FALSE([set_up_list_ allItemsComplete]); + + set_up_list_prefs::MarkItemComplete(local_state_.Get(), + SetUpListItemType::kSignInSync); + set_up_list_prefs::MarkItemComplete(local_state_.Get(), + SetUpListItemType::kDefaultBrowser); + set_up_list_prefs::MarkItemComplete(local_state_.Get(), + SetUpListItemType::kAutofill); + + EXPECT_TRUE([set_up_list_ allItemsComplete]); +} + // Tests that the Set Up List can be disabled. TEST_F(SetUpListTest, Disable) { EXPECT_FALSE(set_up_list_prefs::IsSetUpListDisabled(local_state_.Get()));
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.mm b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.mm index 316b46d7..7badaa89 100644 --- a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.mm +++ b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.mm
@@ -20,6 +20,7 @@ #import "components/prefs/pref_service.h" #import "components/prefs/pref_value_store.h" #import "components/proxy_config/proxy_config_pref_names.h" +#import "components/sync/base/features.h" #import "components/sync_preferences/pref_service_syncable.h" #import "components/sync_preferences/pref_service_syncable_factory.h" #import "ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.h" @@ -32,6 +33,7 @@ namespace { const char kPreferencesFilename[] = "Preferences"; +const char kAccountPreferencesFilename[] = "AccountPreferences"; // Record PersistentPrefStore's reading errors distribution. void HandleReadError(PersistentPrefStore::PrefReadError error) { @@ -88,6 +90,13 @@ sync_preferences::PrefServiceSyncableFactory factory; PrepareFactory(&factory, browser_state_path.Append(kPreferencesFilename), pref_io_task_runner, policy_service, policy_connector); + if (base::FeatureList::IsEnabled(syncer::kEnablePreferencesAccountStorage) && + base::FeatureList::IsEnabled( + syncer::kSyncEnablePersistentStorageForAccountPreferences)) { + factory.SetAccountPrefStore(base::MakeRefCounted<JsonPrefStore>( + browser_state_path.Append(kAccountPreferencesFilename), nullptr, + pref_io_task_runner)); + } std::unique_ptr<sync_preferences::PrefServiceSyncable> pref_service = factory.CreateSyncable(pref_registry.get()); return pref_service;
diff --git a/ios/chrome/browser/shared/ui/util/BUILD.gn b/ios/chrome/browser/shared/ui/util/BUILD.gn index 6ba5e0c6..1fb2669 100644 --- a/ios/chrome/browser/shared/ui/util/BUILD.gn +++ b/ios/chrome/browser/shared/ui/util/BUILD.gn
@@ -85,6 +85,12 @@ frameworks = [ "UIKit.framework" ] } +swift_source_set("util_swiftui") { + sources = [ "ConditionalViewModifier.swift" ] + deps = [] + frameworks = [ "SwiftUI.framework" ] +} + source_set("terms_util") { configs += [ "//build/config/compiler:enable_arc" ] sources = [
diff --git a/ios/chrome/browser/shared/ui/util/ConditionalViewModifier.swift b/ios/chrome/browser/shared/ui/util/ConditionalViewModifier.swift new file mode 100644 index 0000000..ee67367 --- /dev/null +++ b/ios/chrome/browser/shared/ui/util/ConditionalViewModifier.swift
@@ -0,0 +1,21 @@ +// 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 SwiftUI + +extension View { + /// Applies the given transform if the given condition evaluates to `true`. + /// - Parameters: + /// - condition: The condition to evaluate. + /// - transform: The transform to apply to the source `View`. + /// - Returns: Either the original `View` or the modified `View` if the condition is `true`. + @ViewBuilder public func `if`<Content: View>(_ condition: Bool, transform: (Self) -> Content) + -> some View + { + if condition { + transform(self) + } else { + self + } + } +}
diff --git a/ios/chrome/browser/tabs/inactive_tabs/features.h b/ios/chrome/browser/tabs/inactive_tabs/features.h index 4b0ccfda..a0a3b40 100644 --- a/ios/chrome/browser/tabs/inactive_tabs/features.h +++ b/ios/chrome/browser/tabs/inactive_tabs/features.h
@@ -26,6 +26,7 @@ extern const char kTabInactivityThresholdTwoWeeksParam[]; extern const char kTabInactivityThresholdThreeWeeksParam[]; extern const char kTabInactivityThresholdOneMinuteDemoParam[]; +extern const char kTabInactivityThresholdImmediateDemoParam[]; // Convenience method for determining if Inactive Tabs is available (it is not // available on iPad or if not explicitly enabled by Finch).
diff --git a/ios/chrome/browser/tabs/inactive_tabs/features.mm b/ios/chrome/browser/tabs/inactive_tabs/features.mm index ca7b412..c2eb535 100644 --- a/ios/chrome/browser/tabs/inactive_tabs/features.mm +++ b/ios/chrome/browser/tabs/inactive_tabs/features.mm
@@ -31,6 +31,8 @@ "tab-inactivity-threshold-three-weeks"; const char kTabInactivityThresholdOneMinuteDemoParam[] = "tab-inactivity-threshold-one-minute-demo"; +const char kTabInactivityThresholdImmediateDemoParam[] = + "tab-inactivity-threshold-immediate-demo"; bool IsInactiveTabsAvailable() { if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) { @@ -76,6 +78,8 @@ return base::Days(21); } else if (feature_param == kTabInactivityThresholdOneMinuteDemoParam) { return base::Minutes(1); + } else if (feature_param == kTabInactivityThresholdImmediateDemoParam) { + return base::Seconds(0); } return base::Days(14); }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm b/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm index c98d0c8a..b1120ee 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_mediator.mm
@@ -107,7 +107,11 @@ const BookmarkNode* defaultFolder = GetDefaultBookmarkFolder( _prefs, bookmark_utils_ios::IsAccountBookmarkStorageOptedIn(_syncService), _profileBookmarkModel.get(), _accountBookmarkModel.get()); - _profileBookmarkModel->AddNewURL(defaultFolder, + BookmarkModel* modelForDefaultFolder = + bookmark_utils_ios::GetBookmarkModelForNode(defaultFolder, + _profileBookmarkModel.get(), + _accountBookmarkModel.get()); + modelForDefaultFolder->AddNewURL(defaultFolder, defaultFolder->children().size(), base::SysNSStringToUTF16(title), URL); @@ -136,11 +140,13 @@ toFolder:(const BookmarkNode*)folder { LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeAllTabs); + BookmarkModel* modelForFolder = bookmark_utils_ios::GetBookmarkModelForNode( + folder, _profileBookmarkModel.get(), _accountBookmarkModel.get()); for (URLWithTitle* urlWithTitle in URLs) { base::RecordAction(base::UserMetricsAction("BookmarkAdded")); - _profileBookmarkModel->AddNewURL( - folder, folder->children().size(), - base::SysNSStringToUTF16(urlWithTitle.title), urlWithTitle.URL); + modelForFolder->AddNewURL(folder, folder->children().size(), + base::SysNSStringToUTF16(urlWithTitle.title), + urlWithTitle.URL); } NSString* folderTitle = bookmark_utils_ios::TitleForBookmarkNode(folder);
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm index b42c806..f8e3b54 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm
@@ -164,6 +164,7 @@ const bookmarks::BookmarkNode* bookmark_node, bookmarks::BookmarkModel* profile_model, bookmarks::BookmarkModel* account_model) { + DCHECK(bookmark_node); DCHECK(profile_model); if (bookmark_node->HasAncestor(profile_model->root_node())) { return bookmarks::StorageType::kLocalOrSyncable;
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm index ead8cd0..e5cf66e 100644 --- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm
@@ -56,6 +56,17 @@ return [[NSAttributedString alloc] initWithString:text attributes:attrs]; } +// Holds all the configurable attributes of this view. +struct ViewConfig { + BOOL compact_layout; + int signin_sync_description; + int default_browser_description; + int autofill_description; + NSString* title_font; + NSString* description_font; + CGFloat text_spacing; +}; + } // namespace @implementation SetUpListItemView { @@ -64,7 +75,7 @@ CrossfadeLabel* _description; UIStackView* _contentStack; UITapGestureRecognizer* _tapGestureRecognizer; - BOOL _compactLayout; + ViewConfig _config; } - (instancetype)initWithData:(SetUpListItemViewData*)data { @@ -72,7 +83,29 @@ if (self) { _type = data.type; _complete = data.complete; - _compactLayout = data.compactLayout; + if (!data.compactLayout) { + // Normal ViewConfig. + _config = { + NO, + IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION, + IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_DESCRIPTION, + IDS_IOS_SET_UP_LIST_AUTOFILL_DESCRIPTION, + UIFontTextStyleSubheadline, + UIFontTextStyleFootnote, + kTextSpacing, + }; + } else { + // ViewConfig for a compact layout. + _config = { + YES, + IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION, + IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_SHORT_DESCRIPTION, + IDS_IOS_SET_UP_LIST_AUTOFILL_SHORT_DESCRIPTION, + UIFontTextStyleFootnote, + UIFontTextStyleCaption2, + kCompactTextSpacing, + }; + } } return self; } @@ -151,7 +184,7 @@ _icon = [[SetUpListItemIcon alloc] initWithType:_type complete:_complete - compactLayout:_compactLayout]; + compactLayout:_config.compact_layout]; _title = [self createTitle]; _description = [self createDescription]; @@ -160,7 +193,7 @@ [[UIStackView alloc] initWithArrangedSubviews:@[ _title, _description ]]; textStack.axis = UILayoutConstraintAxisVertical; textStack.translatesAutoresizingMaskIntoConstraints = NO; - textStack.spacing = _compactLayout ? kCompactTextSpacing : kTextSpacing; + textStack.spacing = _config.text_spacing; // Add a horizontal stack to contain the icon(s) and the text stack. _contentStack = @@ -183,10 +216,7 @@ CrossfadeLabel* label = [[CrossfadeLabel alloc] init]; label.text = [self titleText]; label.translatesAutoresizingMaskIntoConstraints = NO; - label.font = - _compactLayout - ? [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote] - : [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + label.font = [UIFont preferredFontForTextStyle:_config.title_font]; if (_complete) { label.textColor = [UIColor colorNamed:kTextQuaternaryColor]; label.attributedText = Strikethrough(label.text); @@ -204,9 +234,7 @@ label.numberOfLines = 0; label.lineBreakMode = NSLineBreakByWordWrapping; label.translatesAutoresizingMaskIntoConstraints = NO; - label.font = _compactLayout - ? [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2] - : [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + label.font = [UIFont preferredFontForTextStyle:_config.description_font]; if (_complete) { label.textColor = [UIColor colorNamed:kTextQuaternaryColor]; label.attributedText = Strikethrough(label.text); @@ -227,8 +255,7 @@ return l10n_util::GetNSString(IDS_IOS_SET_UP_LIST_AUTOFILL_TITLE); case SetUpListItemType::kFollow: // TODO(crbug.com/1428070): Add a Follow item to the Set Up List. - NOTREACHED(); - return @""; + NOTREACHED_NORETURN(); } } @@ -236,27 +263,14 @@ - (NSString*)descriptionText { switch (_type) { case SetUpListItemType::kSignInSync: - return _compactLayout - ? l10n_util::GetNSString( - IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION) - : l10n_util::GetNSString( - IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION); + return l10n_util::GetNSString(_config.signin_sync_description); case SetUpListItemType::kDefaultBrowser: - return _compactLayout - ? l10n_util::GetNSString( - IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_SHORT_DESCRIPTION) - : l10n_util::GetNSString( - IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_DESCRIPTION); + return l10n_util::GetNSString(_config.default_browser_description); case SetUpListItemType::kAutofill: - return _compactLayout - ? l10n_util::GetNSString( - IDS_IOS_SET_UP_LIST_AUTOFILL_SHORT_DESCRIPTION) - : l10n_util::GetNSString( - IDS_IOS_SET_UP_LIST_AUTOFILL_DESCRIPTION); + return l10n_util::GetNSString(_config.autofill_description); case SetUpListItemType::kFollow: // TODO(crbug.com/1428070): Add a Follow item to the Set Up List. - NOTREACHED(); - return @""; + NOTREACHED_NORETURN(); } }
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm index f019e224..5fd3a72 100644 --- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm
@@ -59,6 +59,7 @@ constexpr NSString* const kSetUpListExpandButtonID = @"kSetUpListExpandButtonID"; constexpr NSString* const kSetUpListMenuButtonID = @"kSetUpListMenuButtonID"; +constexpr NSString* const kSetUpListAllSetID = @"kSetUpListAllSetID"; } // namespace @@ -356,6 +357,7 @@ UIStackView* stack = [[UIStackView alloc] initWithArrangedSubviews:@[ title, description ]]; + stack.accessibilityIdentifier = kSetUpListAllSetID; stack.axis = UILayoutConstraintAxisVertical; stack.alignment = UIStackViewAlignmentCenter; stack.translatesAutoresizingMaskIntoConstraints = NO;
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm index cf562b36..e81d22a 100644 --- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm
@@ -189,7 +189,7 @@ EXPECT_TRUE(item_view != nil); EXPECT_FALSE(item_view.complete); - [item_view markCompleteWithCompletion:nil]; + [view markItemComplete:SetUpListItemType::kSignInSync completion:nil]; // Give time for run loop to execute events. _task_environment.RunUntilIdle(); @@ -207,3 +207,18 @@ (SetUpListItemView*)FindSubview(@"kSetUpListExpandButtonID"); EXPECT_TRUE(expand_button == nil); } + +// Tests that the "All Set" can be shown. +TEST_F(SetUpListViewTest, AllSetView) { + SetUpListView* view = [[SetUpListView alloc] initWithItems:_itemsData]; + [_superview addSubview:view]; + + ExpectSubview(@"kSetUpListAllSetID", false); + + [view showDoneWithAnimations:nil]; + // Give time for run loop to execute events. + _task_environment.RunUntilIdle(); + + // ExpectSubview(@"kSetUpListItemSignInID", false); + ExpectSubview(@"kSetUpListAllSetID", true); +}
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_pedal_egtest.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_pedal_egtest.mm index 5ca944a2..db95ac50 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_pedal_egtest.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_pedal_egtest.mm
@@ -317,6 +317,41 @@ [ChromeEarlGrey closeCurrentTab]; } +// Tests that visit history pedal is present and it opens the browser history +// page. +- (void)testVisitHistoryPedal { + // Focus omnibox from Web. + [ChromeEarlGrey loadURL:GURL("about:blank")]; + [ChromeEarlGreyUI focusOmniboxAndType:@"history"]; + + NSString* visitHistoryPedalString = l10n_util::GetNSString( + IDS_IOS_OMNIBOX_PEDAL_SUBTITLE_VIEW_CHROME_HISTORY); + + // Matcher for visit history pedal suggestion. + id<GREYMatcher> visitHistoryPedal = + popupRowWithString(visitHistoryPedalString); + + // Visit history pedal should be visible. + [ChromeEarlGrey waitForUIElementToAppearWithMatcher:visitHistoryPedal]; + + // Tap on visit history pedal. + [[EarlGrey selectElementWithMatcher:visitHistoryPedal] + performAction:grey_tap()]; + + // Visit history page should be displayed. + [ChromeEarlGrey + waitForUIElementToAppearWithMatcher:chrome_test_util::HistoryTableView()]; + + // Close the Visit history page. + [[EarlGrey + selectElementWithMatcher:chrome_test_util::NavigationBarDoneButton()] + performAction:grey_tap()]; + [ChromeEarlGrey waitForUIElementToDisappearWithMatcher: + chrome_test_util::HistoryTableView()]; + + [ChromeEarlGrey closeCurrentTab]; +} + // Tests that the dino pedal does not appear when the search suggestion is below // the top 3. - (void)testNoPedal {
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn index 14fc0a0..1846036e 100644 --- a/ios/chrome/browser/ui/popup_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -102,6 +102,7 @@ "//ios/chrome/browser/ui/popup_menu/cells", "//ios/chrome/browser/ui/popup_menu/overflow_menu", "//ios/chrome/browser/ui/popup_menu/overflow_menu:feature_flags", + "//ios/chrome/browser/ui/popup_menu/overflow_menu:overflow_menu_constants", "//ios/chrome/browser/ui/popup_menu/overflow_menu:overflow_menu_swift", "//ios/chrome/browser/ui/popup_menu/public", "//ios/chrome/browser/ui/popup_menu/public:popup_menu_ui",
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn index fe3d268..f45cde7 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn
@@ -108,6 +108,7 @@ deps = [ "//base", "//ios/chrome/app/strings", + "//ios/chrome/browser/shared/ui/util:util_swiftui", "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/popup_menu:metrics_protocols", "//ios/chrome/common:timing", @@ -136,9 +137,13 @@ source_set("unit_tests") { testonly = true - sources = [ "overflow_menu_mediator_unittest.mm" ] + sources = [ + "overflow_menu_mediator_unittest.mm", + "overflow_menu_orderer_unittest.mm", + ] deps = [ ":overflow_menu", + ":overflow_menu_constants", "//base", "//base/test:test_support", "//components/bookmarks/browser", @@ -165,6 +170,7 @@ "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/features", + "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/popup_menu/overflow_menu:feature_flags",
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.h b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.h index 2ced1f5..b829b25 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.h +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.h
@@ -13,6 +13,8 @@ class PrefService; +using DestinationRanking = std::vector<overflow_menu::Destination>; + // Tracks destination usage from the new overflow menu and implements a // frecency-based sorting algorithm (i.e. an algorithm that uses the data // frequency and data recency when determining sort order) to order destinations @@ -67,11 +69,12 @@ // Records a `destination` click from the overflow menu carousel. - (void)recordClickForDestination:(overflow_menu::Destination)destination; -// Returns a new frecency-sorted list of OverflowMenuDestination* given a list -// of OverflowMenuDestination*. -- (NSArray<OverflowMenuDestination*>*) - sortedDestinationsFromCarouselDestinations: - (NSArray<OverflowMenuDestination*>*)carouselDestinations; +// Returns a new frecency-sorted list of overflow_menu::Destination given the +// current ranking and a list of all available destinations. +- (DestinationRanking) + sortedDestinationsFromCurrentRanking:(DestinationRanking)currentRanking + carouselDestinations:(NSArray<OverflowMenuDestination*>*) + carouselDestinations; // Stops the Destination Usage History. - (void)stop;
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm index aa2dc2d..77a79b1f 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm
@@ -55,21 +55,6 @@ } // Ingests base::Value::List of destination names (strings) (`from` list), -// converts each string to an overflow_menu::Destination, then appends each -// destination to a vector (`to` vector). Skips over invalid or malformed list -// items. -void AppendDestinationsToVector(const base::Value::List& from, - std::vector<overflow_menu::Destination>& to) { - for (const auto& value : from) { - if (!value.is_string()) { - continue; - } - - to.push_back(overflow_menu::DestinationForStringName(value.GetString())); - } -} - -// Ingests base::Value::List of destination names (strings) (`from` list), // converts each string to an overflow_menu::Destination, then adds each // destination to a set (`to` set). Skips over invalid or malformed list // items. @@ -87,12 +72,11 @@ // Sort `ranking` in ascending or descending (indicated by // `ascending`) and corresponding number of clicks stored in // `aggregate_history`. -std::vector<overflow_menu::Destination> SortByUsage( - const std::vector<overflow_menu::Destination>& ranking, +DestinationRanking SortByUsage( + const DestinationRanking& ranking, std::map<overflow_menu::Destination, int>& aggregate_history, bool ascending) { - std::vector<overflow_menu::Destination> ordered_ranking(ranking.begin(), - ranking.end()); + DestinationRanking ordered_ranking(ranking.begin(), ranking.end()); std::sort( ordered_ranking.begin(), ordered_ranking.end(), [&](overflow_menu::Destination a, overflow_menu::Destination b) -> bool { @@ -133,9 +117,6 @@ std::map<base::TimeDelta, std::map<overflow_menu::Destination, int>> _usageHistory; - // The current ranking of the destinations. - std::vector<overflow_menu::Destination> _ranking; - // New destinations recently added to the overflow menu carousel that have not // yet been clicked by the user. std::set<overflow_menu::Destination> _untappedDestinations; @@ -165,12 +146,10 @@ const base::Value::Dict& storedUsageHistory = historyUpdate.Get(); - // Fetch the stored ranking and usage history, then update `_ranking` and - // `_usageHistory` with its data. + // Fetch the stored usage history, then update `_usageHistory` with its data. for (const auto&& [key, value] : storedUsageHistory) { if (key == kRankingKey) { - AppendDestinationsToVector(value.GetList(), _ranking); - + // Ranking is now handled by `OverflowMenuOrderer` so ignore it here. continue; } @@ -221,25 +200,25 @@ _prefService = nullptr; } -- (NSArray<OverflowMenuDestination*>*) - sortedDestinationsFromCarouselDestinations: - (NSArray<OverflowMenuDestination*>*)carouselDestinations { +- (DestinationRanking) + sortedDestinationsFromCurrentRanking:(DestinationRanking)currentRanking + carouselDestinations:(NSArray<OverflowMenuDestination*>*) + carouselDestinations { [self seedUsageHistoryForNewDestinations:carouselDestinations]; - // Exit early if there's no `_ranking`, which only happens if the device + // Exit early if there's no `currentRanking`, which only happens if the device // hasn't used Smart Sorting before. - if (_ranking.empty()) { - // Given there's no existing `_ranking`, the current carousel sort order - // will be used as the default ranking. + if (currentRanking.empty()) { + // Given there's no existing `currentRanking`, the current carousel sort + // order will be used as the default ranking. for (OverflowMenuDestination* destination in carouselDestinations) { - _ranking.push_back( + currentRanking.push_back( static_cast<overflow_menu::Destination>(destination.destination)); } - - [self flushToPrefs]; } - [self calculateNewRanking]; + DestinationRanking sortedRanking = + [self calculateNewRankingFromCurrentRanking:currentRanking]; // Maintain a map from overflow_menu::Destination : OverflowMenuDestination* // for fast retrieval of a given overflow_menu::Destination's corresponding @@ -261,8 +240,8 @@ destinations[destination] = carouselDestination; } - std::set<overflow_menu::Destination> existingDestinations(_ranking.begin(), - _ranking.end()); + std::set<overflow_menu::Destination> existingDestinations( + sortedRanking.begin(), sortedRanking.end()); std::vector<overflow_menu::Destination> newDestinations; @@ -285,7 +264,7 @@ // Destinations that need to be re-sorted for highlight are not added here // where they are re-inserted later. These destinations have a badge and a // position of kNewDestinationsInsertionIndex or worst. - for (overflow_menu::Destination rankedDestination : _ranking) { + for (overflow_menu::Destination rankedDestination : sortedRanking) { if (destinations.contains(rankedDestination) && !_untappedDestinations.contains(rankedDestination)) { const bool dontSort = @@ -324,8 +303,9 @@ // Merge all destinations by prioritizing untapped destinations over ranked // destinations in their order of insertion. - std::merge(_ranking.begin(), _ranking.end(), _untappedDestinations.begin(), - _untappedDestinations.end(), std::back_inserter(allDestinations)); + std::merge(sortedRanking.begin(), sortedRanking.end(), + _untappedDestinations.begin(), _untappedDestinations.end(), + std::back_inserter(allDestinations)); // Insert the destinations with a badge that is not for an error at // kNewDestinationsInsertionIndex before the untapped destinations. @@ -349,15 +329,13 @@ DCHECK(destinations.empty()); // Set the new ranking. - _ranking = {}; + sortedRanking = {}; for (OverflowMenuDestination* sortedDestination in sortedDestinations) { - _ranking.push_back( + sortedRanking.push_back( static_cast<overflow_menu::Destination>(sortedDestination.destination)); } - [self flushToPrefs]; - - return sortedDestinations; + return sortedRanking; } // Track click for `destination` and associate it with TodaysDay(). @@ -379,10 +357,11 @@ // carousel/ranking starting at position `kNewDestinationsInsertionIndex`. // This is custom business logic that doesn't respect the Smart Sorting // algorithm defined below, so it will happen outside of this method. -- (void)calculateNewRanking { +- (DestinationRanking)calculateNewRankingFromCurrentRanking: + (DestinationRanking)currentRanking { if (!self.visibleDestinationsCount || - self.visibleDestinationsCount > static_cast<int>(_ranking.size())) { - return; + self.visibleDestinationsCount > static_cast<int>(currentRanking.size())) { + return currentRanking; } // Dictionary with aggregate destination usage history that's occurred over @@ -395,11 +374,13 @@ std::map<overflow_menu::Destination, int> aggregateRecentUsageHistory = [self flattenedUsageHistoryWithinWindow:kDataRecencyWindow]; - std::vector<overflow_menu::Destination> aboveFoldRanking( - _ranking.begin(), _ranking.begin() + (self.visibleDestinationsCount - 1)); + DestinationRanking aboveFoldRanking( + currentRanking.begin(), + currentRanking.begin() + (self.visibleDestinationsCount - 1)); - std::vector<overflow_menu::Destination> belowFoldRanking( - _ranking.begin() + (self.visibleDestinationsCount - 1), _ranking.end()); + DestinationRanking belowFoldRanking( + currentRanking.begin() + (self.visibleDestinationsCount - 1), + currentRanking.end()); overflow_menu::Destination lowestShownAll = SortByUsage(aboveFoldRanking, aggregateUsageHistory, true).front(); @@ -410,7 +391,7 @@ overflow_menu::Destination highestUnshownRecent = SortByUsage(belowFoldRanking, aggregateRecentUsageHistory, false).front(); - std::vector<overflow_menu::Destination> newRanking = _ranking; + DestinationRanking newRanking = currentRanking; if (aggregateRecentUsageHistory[highestUnshownRecent] > aggregateRecentUsageHistory[lowestShownRecent] * kDampening) { @@ -424,9 +405,9 @@ std::find(newRanking.begin(), newRanking.end(), highestUnshownAll)); } - DCHECK_EQ(newRanking.size(), _ranking.size()); + DCHECK_EQ(newRanking.size(), currentRanking.size()); - _ranking = newRanking; + return newRanking; } // Constructs aggregated usage history dictionary of the following shape: @@ -491,6 +472,8 @@ _usageHistory[TodaysDay()][destination] = ((kInitialUsageThreshold - 1) * (kDampening - 1.0) * 100.0); } + + [self flushToPrefs]; } // Flushes the latest usage history, ranking, and untapped destinations @@ -521,15 +504,6 @@ } } - // Flush the new ranking to Prefs. - base::Value::List ranking; - - for (overflow_menu::Destination destination : _ranking) { - ranking.Append(overflow_menu::StringNameForDestination(destination)); - } - - historyUpdate->Set(kRankingKey, std::move(ranking)); - // Flush the new untapped destinations to Prefs. ScopedListPrefUpdate untappedDestinationsUpdate( _prefService, prefs::kOverflowMenuNewDestinations);
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history_unittest.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history_unittest.mm index 4f36960..cb4f265a 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history_unittest.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history_unittest.mm
@@ -52,8 +52,9 @@ PlatformTest::TearDown(); } - // Creates CreateDestinationUsageHistory with empty pref data. - DestinationUsageHistory* CreateDestinationUsageHistory( + // Initializes `destination_usage_history_` with empty pref data and returns + // the initial ranking. + DestinationRanking InitializeDestinationUsageHistory( NSArray<OverflowMenuDestination*>* default_destinations) { CreatePrefs(); @@ -65,15 +66,17 @@ [destination_usage_history_ start]; - [destination_usage_history_ - sortedDestinationsFromCarouselDestinations:default_destinations]; + DestinationRanking initial_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:{} + carouselDestinations:default_destinations]; - return destination_usage_history_; + return initial_ranking; } - // Creates CreateDestinationUsageHistory with past data and `ranking`. - DestinationUsageHistory* CreateDestinationUsageHistoryWithData( - std::vector<overflow_menu::Destination>& ranking, + // Initializes `destination_usage_history_` with past data and `ranking` and + // returns the new ranking. + DestinationRanking InitializeDestinationUsageHistoryWithData( + DestinationRanking& ranking, base::Value::Dict& history, NSArray<OverflowMenuDestination*>* default_destinations) { base::Value::List previous_ranking; @@ -93,10 +96,11 @@ [destination_usage_history_ start]; - [destination_usage_history_ - sortedDestinationsFromCarouselDestinations:default_destinations]; + DestinationRanking initial_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:ranking + carouselDestinations:default_destinations]; - return destination_usage_history_; + return initial_ranking; } // Create pref registry for tests. @@ -199,7 +203,7 @@ // Tests the initializer correctly creates a DestinationUsageHistory* with the // specified Pref service. TEST_F(DestinationUsageHistoryTest, InitWithPrefService) { - CreateDestinationUsageHistory(SampleDestinations()); + InitializeDestinationUsageHistory(SampleDestinations()); PrefService* pref_service = prefs_.get(); @@ -232,7 +236,8 @@ std::move(day_history)); // Create DestinationUsageHistory. - CreateDestinationUsageHistoryWithData(ranking, history, SampleDestinations()); + InitializeDestinationUsageHistoryWithData(ranking, history, + SampleDestinations()); PrefService* pref_service = prefs_.get(); @@ -246,11 +251,10 @@ // Tests that a new destination click is incremented and written to Chrome // Prefs. TEST_F(DestinationUsageHistoryTest, HandlesNewDestinationClick) { - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(SampleDestinations()); + InitializeDestinationUsageHistory(SampleDestinations()); // Click bookmarks destination. - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::Bookmarks]; ScopedDictPrefUpdate update(prefs_.get(), @@ -273,7 +277,7 @@ InjectsDefaultClickCountForAllDestinations) { NSArray<OverflowMenuDestination*>* sample_destinations = SampleDestinations(); - CreateDestinationUsageHistory(sample_destinations); + InitializeDestinationUsageHistory(sample_destinations); ScopedDictPrefUpdate update(prefs_.get(), prefs::kOverflowMenuDestinationUsageHistory); @@ -318,12 +322,11 @@ std::move(day_history)); // Create DestinationUsageHistory. - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistoryWithData(ranking, history, + InitializeDestinationUsageHistoryWithData(ranking, history, SampleDestinations()); // Click bookmarks destination. - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::Bookmarks]; ScopedDictPrefUpdate update(prefs_.get(), @@ -355,33 +358,27 @@ }; base::Value::Dict history; - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistoryWithData(ranking, history, - sample_destinations); - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> current_ranking = update->Extract("ranking"); - EXPECT_TRUE(current_ranking.has_value()); - + DestinationRanking initial_ranking = + InitializeDestinationUsageHistoryWithData(ranking, history, + sample_destinations); // Click bookmarks Reading List five // times. - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::ReadingList]; - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::ReadingList]; - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::ReadingList]; - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::ReadingList]; - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::ReadingList]; - absl::optional<base::Value> new_ranking = update->Extract("ranking"); - EXPECT_TRUE(new_ranking.has_value()); + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:sample_destinations]; - EXPECT_EQ(current_ranking.value(), new_ranking.value()); + EXPECT_EQ(initial_ranking, sorted_ranking); } TEST_F(DestinationUsageHistoryTest, DoesNotSwapTwoUnshownDestinations) { @@ -401,51 +398,53 @@ base::Value::Dict day_history; day_history.Set(overflow_menu::StringNameForDestination( overflow_menu::Destination::Bookmarks), - 1); + 3); day_history.Set(overflow_menu::StringNameForDestination( overflow_menu::Destination::History), - 1); + 3); day_history.Set(overflow_menu::StringNameForDestination( overflow_menu::Destination::ReadingList), - 1); + 3); day_history.Set(overflow_menu::StringNameForDestination( overflow_menu::Destination::Passwords), - 1); + 3); day_history.Set(overflow_menu::StringNameForDestination( overflow_menu::Destination::Downloads), + 3); + day_history.Set(overflow_menu::StringNameForDestination( + overflow_menu::Destination::RecentTabs), + 1); + day_history.Set(overflow_menu::StringNameForDestination( + overflow_menu::Destination::SiteInfo), + 1); + day_history.Set(overflow_menu::StringNameForDestination( + overflow_menu::Destination::Settings), 1); history.Set(base::NumberToString(TodaysDay().InDays()), std::move(day_history)); - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistoryWithData(ranking, history, - sample_destinations); - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> expected_ranking = update->Extract("ranking"); - - EXPECT_TRUE(expected_ranking.has_value()); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistoryWithData(ranking, history, + sample_destinations); // Click Recent Tabs (currently in ranking position 6) once. - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::RecentTabs]; // Click Site Inforamtion (currently in ranking position 7) once. - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::SiteInfo]; // Click Settings (currently in last position) once. - [destination_usage_history + [destination_usage_history_ recordClickForDestination:overflow_menu::Destination::Settings]; - absl::optional<base::Value> new_ranking = update->Extract("ranking"); + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:sample_destinations]; - EXPECT_TRUE(new_ranking.has_value()); - - EXPECT_EQ(expected_ranking.value(), new_ranking.value()); + EXPECT_EQ(initial_ranking, sorted_ranking); } TEST_F(DestinationUsageHistoryTest, DeletesExpiredUsageData) { @@ -482,18 +481,18 @@ history.Set(base::NumberToString(expired_day.InDays()), std::move(expired_day_history)); - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistoryWithData(ranking, history, + InitializeDestinationUsageHistoryWithData(ranking, history, sample_destinations); - [destination_usage_history - sortedDestinationsFromCarouselDestinations:sample_destinations]; + [destination_usage_history_ + sortedDestinationsFromCurrentRanking:ranking + carouselDestinations:sample_destinations]; ScopedDictPrefUpdate update(prefs_.get(), prefs::kOverflowMenuDestinationUsageHistory); - // Has one entry for ranking, and one entry for today's seeded history. - EXPECT_EQ(update->size(), (size_t)2); + // Has one entry for today's seeded history. + EXPECT_EQ(update->size(), (size_t)1); EXPECT_NE(update->Find(base::NumberToString(TodaysDay().InDays())), nullptr); EXPECT_EQ(update->Find(base::NumberToString(recently_expired_day.InDays())), nullptr); @@ -514,11 +513,8 @@ // Creates `DestinationUsageHistory` with initial ranking // `current_destinations`. - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(current_destinations); - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); // Same as `current_destinations`, but has a new element, // `all_destinations[7]`, which should eventually be inserted starting at @@ -536,18 +532,12 @@ all_destinations[7], ]; - [destination_usage_history - sortedDestinationsFromCarouselDestinations:updated_destinations]; + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:updated_destinations]; - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); - - ASSERT_EQ( - overflow_menu::DestinationForStringName(actual[3].GetString()), - static_cast<overflow_menu::Destination>(all_destinations[7].destination)); + ASSERT_EQ(sorted_ranking[3], static_cast<overflow_menu::Destination>( + all_destinations[7].destination)); } TEST_F(DestinationUsageHistoryTest, InsertsNewDestinationsInMiddleOfRanking) { @@ -561,10 +551,10 @@ all_destinations[5], ]; - // Creates `DestinationUsageHistory` with initial ranking + // Initializes `DestinationUsageHistory` with initial ranking // `current_destinations`. - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(current_destinations); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); // Same as `current_destinations`, but has new elements (`all_destinations[6]` // and `all_destinations[7]`) inserted starting at position 4 in the carousel @@ -581,26 +571,19 @@ all_destinations[7], ]; - [destination_usage_history - sortedDestinationsFromCarouselDestinations:updated_destinations]; + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:updated_destinations]; ScopedDictPrefUpdate update(prefs_.get(), prefs::kOverflowMenuDestinationUsageHistory); - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); - ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex], static_cast<overflow_menu::Destination>(all_destinations[7].destination)); - ASSERT_EQ( - overflow_menu::DestinationForStringName(actual[4].GetString()), - static_cast<overflow_menu::Destination>(all_destinations[6].destination)); + ASSERT_EQ(sorted_ranking[4], static_cast<overflow_menu::Destination>( + all_destinations[6].destination)); } TEST_F(DestinationUsageHistoryTest, InsertsAndRemovesNewDestinationsInRanking) { @@ -614,8 +597,8 @@ all_destinations[5], ]; - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(current_destinations); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); NSArray<OverflowMenuDestination*>* updated_destinations = @[ // NOTE: all_destinations[0] was removed @@ -629,30 +612,19 @@ all_destinations[7], ]; - [destination_usage_history - sortedDestinationsFromCarouselDestinations:updated_destinations]; + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:updated_destinations]; - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); + ASSERT_EQ(sorted_ranking[0], static_cast<overflow_menu::Destination>( + all_destinations[2].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName(actual[0].GetString()), - static_cast<overflow_menu::Destination>(all_destinations[2].destination)); - - ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex], static_cast<overflow_menu::Destination>(all_destinations[7].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 1].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 1], static_cast<overflow_menu::Destination>(all_destinations[6].destination)); } @@ -669,10 +641,10 @@ all_destinations[5], ]; - // Creates `DestinationUsageHistory` with initial ranking + // Initializes `DestinationUsageHistory` with initial ranking // `current_destinations`. - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(current_destinations); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); NSArray<OverflowMenuDestination*>* updated_destinations = @[ all_destinations[0], @@ -687,25 +659,15 @@ all_destinations[4].badge = BadgeTypeError; - [destination_usage_history - sortedDestinationsFromCarouselDestinations:updated_destinations]; - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:updated_destinations]; ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex], static_cast<overflow_menu::Destination>(all_destinations[4].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 1].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 1], static_cast<overflow_menu::Destination>(all_destinations[6].destination)); } @@ -725,26 +687,16 @@ all_destinations[5].badge = BadgeTypeError; all_destinations[3].badge = BadgeTypePromo; - // Creates `DestinationUsageHistory` with initial ranking + // Initializes `DestinationUsageHistory` with initial ranking // `current_destinations`. - CreateDestinationUsageHistory(current_destinations); - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex].GetString()), + initial_ranking[kNewDestinationsInsertionIndex], static_cast<overflow_menu::Destination>(all_destinations[5].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 1].GetString()), + initial_ranking[kNewDestinationsInsertionIndex + 1], static_cast<overflow_menu::Destination>(all_destinations[3].destination)); } @@ -763,24 +715,15 @@ all_destinations[0].badge = BadgeTypePromo; - // Creates `DestinationUsageHistory` with initial ranking + // Initializes `DestinationUsageHistory` with initial ranking // `current_destinations`. - CreateDestinationUsageHistory(current_destinations); - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); // Verify that the destination with a badge and with a better ranking than // kNewDestinationsInsertionIndex wasn't moved. - ASSERT_EQ( - overflow_menu::DestinationForStringName(actual[0].GetString()), - static_cast<overflow_menu::Destination>(all_destinations[0].destination)); + ASSERT_EQ(initial_ranking[0], static_cast<overflow_menu::Destination>( + all_destinations[0].destination)); } // Tests that if a destination is both new and has a badge, it will be inserted @@ -797,8 +740,8 @@ // Creates `DestinationUsageHistory` with initial ranking // `current_destinations`. - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(current_destinations); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); NSArray<OverflowMenuDestination*>* updated_destinations = @[ all_destinations[0], @@ -814,29 +757,18 @@ all_destinations[6].badge = BadgeTypeNew; - [destination_usage_history - sortedDestinationsFromCarouselDestinations:updated_destinations]; - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:updated_destinations]; ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex], static_cast<overflow_menu::Destination>(all_destinations[6].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 1].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 1], static_cast<overflow_menu::Destination>(all_destinations[7].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 2].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 2], static_cast<overflow_menu::Destination>(all_destinations[5].destination)); } @@ -854,10 +786,10 @@ all_destinations[5], ]; - // Creates `DestinationUsageHistory` with initial ranking + // Initializes `DestinationUsageHistory` with initial ranking // `current_destinations`. - DestinationUsageHistory* destination_usage_history = - CreateDestinationUsageHistory(current_destinations); + DestinationRanking initial_ranking = + InitializeDestinationUsageHistory(current_destinations); NSArray<OverflowMenuDestination*>* updated_destinations = @[ all_destinations[0], @@ -875,36 +807,23 @@ all_destinations[5].badge = BadgeTypePromo; all_destinations[7].badge = BadgeTypeError; - [destination_usage_history - sortedDestinationsFromCarouselDestinations:updated_destinations]; - - ScopedDictPrefUpdate update(prefs_.get(), - prefs::kOverflowMenuDestinationUsageHistory); - - absl::optional<base::Value> ranking = update->Extract("ranking"); - - EXPECT_TRUE(ranking.has_value()); - - const base::Value::List& actual = ranking.value().GetList(); + DestinationRanking sorted_ranking = [destination_usage_history_ + sortedDestinationsFromCurrentRanking:initial_ranking + carouselDestinations:updated_destinations]; ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex], static_cast<overflow_menu::Destination>(all_destinations[7].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 1].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 1], static_cast<overflow_menu::Destination>(all_destinations[4].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 2].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 2], static_cast<overflow_menu::Destination>(all_destinations[5].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 3].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 3], static_cast<overflow_menu::Destination>(all_destinations[6].destination)); ASSERT_EQ( - overflow_menu::DestinationForStringName( - actual[kNewDestinationsInsertionIndex + 4].GetString()), + sorted_ranking[kNewDestinationsInsertionIndex + 4], static_cast<overflow_menu::Destination>(all_destinations[3].destination)); }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift index 46cec60..9a2a353 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
@@ -50,6 +50,19 @@ } } + /// `PreferenceKey` to track the highlighted destination's bounds in its local coordinate space, + /// can be transformed to other coordinate space by geometry reader. + struct HighlightedDestinationBounds: PreferenceKey { + typealias Value = Anchor<CGRect>? + static var defaultValue: Value = nil + static func reduce(value: inout Value, nextValue: () -> Value) { + // AnchorPreference might be nil in the middle of layout. + if let next = nextValue() { + value = next + } + } + } + /// The current dynamic type size. @Environment(\.sizeCategory) var sizeCategory @@ -118,6 +131,7 @@ ForEach(destinations) { destination in OverflowMenuDestinationView( destination: destination, layoutParameters: layoutParameters, + highlighted: uiConfiguration.highlightDestination == destination.destination, metricsHandler: metricsHandler ).id(destination.destination) } @@ -137,7 +151,9 @@ } } .onAppear { - if layoutDirection == .rightToLeft { + if destinations.map(\.destination).contains(uiConfiguration.highlightDestination) { + proxy.scrollTo(uiConfiguration.highlightDestination) + } else if layoutDirection == .rightToLeft { proxy.scrollTo(destinations.first?.destination) } uiConfiguration.destinationListScreenFrame = geometry.frame(in: .global)
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift index 48346c2c..ff5b6b92 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift
@@ -3,6 +3,7 @@ // found in the LICENSE file. import SwiftUI +import ios_chrome_browser_shared_ui_util_util_swiftui import ios_chrome_common_ui_colors_swift /// Style based on state for an OverflowMenuDestinationView. @@ -49,6 +50,8 @@ /// The layout parameters for this view. var layoutParameters: OverflowMenuDestinationView.LayoutParameters + var highlighted = false + weak var metricsHandler: PopupMenuMetricsHandler? func makeBody(configuration: Configuration) -> some View { @@ -79,7 +82,8 @@ /// Background color for the icon. func backgroundColor(configuration: Configuration) -> Color { - return configuration.isPressed ? Color(.systemGray4) : .groupedSecondaryBackground + return configuration.isPressed + ? Color(.systemGray4) : (highlighted ? .blueHalo : .groupedSecondaryBackground) } /// View representing the background of the icon. @@ -238,6 +242,8 @@ /// The layout parameters for this view. var layoutParameters: LayoutParameters + var highlighted = false + weak var metricsHandler: PopupMenuMetricsHandler? var body: some View { @@ -253,7 +259,14 @@ .accessibilityIdentifier(accessibilityIdentifier) .accessibilityLabel(Text(accessibilityLabel)) .buttonStyle( - OverflowMenuDestinationButton(destination: destination, layoutParameters: layoutParameters)) + OverflowMenuDestinationButton( + destination: destination, layoutParameters: layoutParameters, highlighted: highlighted) + ) + .if(highlighted) { view in + view.anchorPreference( + key: OverflowMenuDestinationList.HighlightedDestinationBounds.self, value: .bounds + ) { $0 } + } } var accessibilityLabel: String {
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer.mm index 307a8910..ea322d0 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer.mm
@@ -4,6 +4,9 @@ #import "ios/chrome/browser/ui/popup_menu//overflow_menu/overflow_menu_orderer.h" +#import "components/prefs/pref_service.h" +#import "components/prefs/scoped_user_pref_update.h" +#import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/constants.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift.h" @@ -13,6 +16,9 @@ #endif namespace { +// The dictionary key used for storing rankings. +const char kRankingKey[] = "ranking"; + // Sorts badged destinations using a local heuristic when the usage history // isn't available (e.g. when on an incognito tab). Destionations that need // highlight and that are at a position of kNewDestinationsInsertionIndex @@ -65,6 +71,25 @@ return sortedDestinations; } + +// Ingests base::Value::List of destination names (strings) (`from` list), +// converts each string to an overflow_menu::Destination, then appends each +// destination to a vector (`to` vector). Skips over invalid or malformed list +// items. +void AppendDestinationsToVector(const base::Value::List* from, + std::vector<overflow_menu::Destination>& to) { + if (!from) { + return; + } + const base::Value::List& fromRef = *from; + for (const auto& value : fromRef) { + if (!value.is_string()) { + continue; + } + + to.push_back(overflow_menu::DestinationForStringName(value.GetString())); + } +} } // namespace @interface OverflowMenuOrderer () @@ -76,7 +101,11 @@ @end @implementation OverflowMenuOrderer { + // Whether the current menu is for an incognito page. BOOL _isIncognito; + + // The current ranking of the destinations. + DestinationRanking _ranking; } - (instancetype)initWithIsIncognito:(BOOL)isIncognito { @@ -102,6 +131,7 @@ self.destinationUsageHistory.visibleDestinationsCount = self.visibleDestinationsCount; [self.destinationUsageHistory start]; + [self loadDataFromPrefs]; } } @@ -121,11 +151,69 @@ sortedDestinationsFromCarouselDestinations: (NSArray<OverflowMenuDestination*>*)carouselDestinations { if (self.destinationUsageHistory) { - return [self.destinationUsageHistory - sortedDestinationsFromCarouselDestinations:carouselDestinations]; + return [self destinationHistorySortedDestinationsFromCarouselDestinations: + carouselDestinations]; } else { return SortBadgedDestinations(carouselDestinations); } } +#pragma mark - Private + +- (void)loadDataFromPrefs { + const base::Value::Dict& storedUsageHistory = + _localStatePrefs->GetDict(prefs::kOverflowMenuDestinationUsageHistory); + + AppendDestinationsToVector(storedUsageHistory.FindList(kRankingKey), + _ranking); +} + +- (void)flushToPrefs { + if (!_localStatePrefs) { + return; + } + + ScopedDictPrefUpdate historyUpdate( + _localStatePrefs, prefs::kOverflowMenuDestinationUsageHistory); + // Flush the new ranking to Prefs. + base::Value::List ranking; + + for (overflow_menu::Destination destination : _ranking) { + ranking.Append(overflow_menu::StringNameForDestination(destination)); + } + + historyUpdate->Set(kRankingKey, std::move(ranking)); +} + +- (NSArray<OverflowMenuDestination*>*) + destinationHistorySortedDestinationsFromCarouselDestinations: + (NSArray<OverflowMenuDestination*>*)carouselDestinations { + _ranking = [self.destinationUsageHistory + sortedDestinationsFromCurrentRanking:_ranking + carouselDestinations:carouselDestinations]; + + [self flushToPrefs]; + + // Maintain a map from overflow_menu::Destination : OverflowMenuDestination* + // for fast retrieval of a given overflow_menu::Destination's corresponding + // Objective-C class. + std::map<overflow_menu::Destination, OverflowMenuDestination*> destinations; + for (OverflowMenuDestination* carouselDestination in carouselDestinations) { + overflow_menu::Destination destination = + static_cast<overflow_menu::Destination>( + carouselDestination.destination); + destinations[destination] = carouselDestination; + } + + // Reconstruct the correct array to return from `_ranking`. + NSMutableArray<OverflowMenuDestination*>* sortedDestinations = + [[NSMutableArray alloc] init]; + for (overflow_menu::Destination destination : _ranking) { + [sortedDestinations addObject:destinations.at(destination)]; + destinations.erase(destination); + } + + return sortedDestinations; +} + @end
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer_unittest.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer_unittest.mm new file mode 100644 index 0000000..75875da --- /dev/null +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer_unittest.mm
@@ -0,0 +1,133 @@ +// 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 "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_orderer.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "base/values.h" +#import "components/prefs/pref_registry_simple.h" +#import "components/prefs/testing_pref_service.h" +#import "ios/chrome/browser/shared/model/prefs/pref_names.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_constants.h" +#import "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift.h" +#import "testing/platform_test.h" + +namespace { + +// The number of destinations immediately visible in the carousel when the +// overflow menu is opened. +// +// For the purposes of these unit tests, this value is +// statically declared below. In practice, this value is dynamically calculated +// based on device size. +static constexpr int kVisibleDestinationsCount = 5; + +} // namespace + +class OverflowMenuOrdererTest : public PlatformTest { + public: + OverflowMenuOrdererTest() {} + + protected: + void TearDown() override { + [overflow_menu_orderer_ disconnect]; + + PlatformTest::TearDown(); + } + + void InitializeOverflowMenuOrderer() { + CreatePrefs(); + + overflow_menu_orderer_ = + [[OverflowMenuOrderer alloc] initWithIsIncognito:NO]; + + overflow_menu_orderer_.localStatePrefs = prefs_.get(); + + overflow_menu_orderer_.visibleDestinationsCount = kVisibleDestinationsCount; + } + + // Create pref registry for tests. + void CreatePrefs() { + prefs_ = std::make_unique<TestingPrefServiceSimple>(); + prefs_->registry()->RegisterDictionaryPref( + prefs::kOverflowMenuDestinationUsageHistory, PrefRegistry::LOSSY_PREF); + prefs_->registry()->RegisterListPref(prefs::kOverflowMenuNewDestinations, + PrefRegistry::LOSSY_PREF); + } + + OverflowMenuDestination* CreateOverflowMenuDestination( + overflow_menu::Destination destination) { + OverflowMenuDestination* result = + [[OverflowMenuDestination alloc] initWithName:@"Foobar" + symbolName:kSettingsSymbol + systemSymbol:YES + monochromeSymbol:NO + accessibilityIdentifier:@"Foobar" + enterpriseDisabled:NO + displayNewLabelIcon:NO + handler:^{ + // Do nothing + }]; + + result.destination = static_cast<NSInteger>(destination); + + return result; + } + + NSArray<OverflowMenuDestination*>* SampleDestinations() { + OverflowMenuDestination* bookmarksDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::Bookmarks); + OverflowMenuDestination* historyDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::History); + OverflowMenuDestination* readingListDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::ReadingList); + OverflowMenuDestination* passwordsDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::Passwords); + OverflowMenuDestination* downloadsDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::Downloads); + OverflowMenuDestination* recentTabsDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::RecentTabs); + OverflowMenuDestination* siteInfoDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::SiteInfo); + OverflowMenuDestination* settingsDestination = + CreateOverflowMenuDestination(overflow_menu::Destination::Settings); + + NSArray<OverflowMenuDestination*>* destinations = @[ + bookmarksDestination, + historyDestination, + readingListDestination, + passwordsDestination, + downloadsDestination, + recentTabsDestination, + siteInfoDestination, + settingsDestination, + ]; + + return destinations; + } + + std::unique_ptr<TestingPrefServiceSimple> prefs_; + OverflowMenuOrderer* overflow_menu_orderer_; +}; + +// Tests that the ranking pref gets populated after sorting once. +TEST_F(OverflowMenuOrdererTest, StoresInitialRanking) { + InitializeOverflowMenuOrderer(); + NSArray<OverflowMenuDestination*>* sample_destinations = SampleDestinations(); + [overflow_menu_orderer_ + sortedDestinationsFromCarouselDestinations:sample_destinations]; + + const base::Value::Dict& stored_usage_history = + prefs_->GetDict(prefs::kOverflowMenuDestinationUsageHistory); + + // Has two entries for the ranking and usage history. + EXPECT_EQ(stored_usage_history.size(), (size_t)2); + EXPECT_NE(stored_usage_history.FindList("ranking"), nullptr); + EXPECT_EQ(stored_usage_history.FindList("ranking")->size(), + sample_destinations.count); +}
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_ui_configuration.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_ui_configuration.swift index ad5b02d6..f67ad02 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_ui_configuration.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_ui_configuration.swift
@@ -10,6 +10,11 @@ @Published public var presentingViewControllerVerticalSizeClass: UserInterfaceSizeClass @Published public var highlightDestinationsRow = false + /// The integer value matches overflow_menu::Destination, setting it to -1 will not highlight any. + @Published public var highlightDestination: Int = -1 + + /// The highlighted destination's frame, in the coordinate system of the menu view. + public var highlightedDestinationFrame: CGRect = .zero /// The destination list's frame in screen coordinates. public var destinationListScreenFrame: CGRect = .zero @@ -26,11 +31,13 @@ public init( presentingViewControllerHorizontalSizeClass: UIUserInterfaceSizeClass, - presentingViewControllerVerticalSizeClass: UIUserInterfaceSizeClass + presentingViewControllerVerticalSizeClass: UIUserInterfaceSizeClass, + highlightDestination: Int ) { self.presentingViewControllerHorizontalSizeClass = UserInterfaceSizeClass(presentingViewControllerHorizontalSizeClass) ?? .compact self.presentingViewControllerVerticalSizeClass = UserInterfaceSizeClass(presentingViewControllerVerticalSizeClass) ?? .compact + self.highlightDestination = highlightDestination } }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift index 54cc300..2376146 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
@@ -17,24 +17,32 @@ weak var metricsHandler: PopupMenuMetricsHandler? var body: some View { - VStack( - alignment: .leading, - // Leave no spaces above or below Divider, the two other sections will - // include proper spacing. - spacing: 0 - ) { - OverflowMenuDestinationList( - destinations: model.destinations, metricsHandler: metricsHandler, - uiConfiguration: uiConfiguration - ).frame(height: Dimensions.destinationListHeight) - Divider() - OverflowMenuActionList(actionGroups: model.actionGroups, metricsHandler: metricsHandler) - // Add a spacer on iPad to make sure there's space below the list. - if uiConfiguration.presentingViewControllerHorizontalSizeClass == .regular - && uiConfiguration.presentingViewControllerVerticalSizeClass == .regular - { - Spacer() + GeometryReader { geometry in + VStack( + alignment: .leading, + // Leave no spaces above or below Divider, the two other sections will + // include proper spacing. + spacing: 0 + ) { + OverflowMenuDestinationList( + destinations: model.destinations, metricsHandler: metricsHandler, + uiConfiguration: uiConfiguration + ).frame(height: Dimensions.destinationListHeight) + Divider() + OverflowMenuActionList(actionGroups: model.actionGroups, metricsHandler: metricsHandler) + // Add a spacer on iPad to make sure there's space below the list. + if uiConfiguration.presentingViewControllerHorizontalSizeClass == .regular + && uiConfiguration.presentingViewControllerVerticalSizeClass == .regular + { + Spacer() + } } - }.background(Color(.systemGroupedBackground).edgesIgnoringSafeArea(.all)) + .background(Color(.systemGroupedBackground).edgesIgnoringSafeArea(.all)) + .onPreferenceChange(OverflowMenuDestinationList.HighlightedDestinationBounds.self) { pref in + if let pref = pref { + uiConfiguration.highlightedDestinationFrame = geometry[pref] + } + } + } } }
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm index 2fce023a..bc94f764 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -277,13 +277,20 @@ self.contentBlockerMediator.consumer = self.overflowMenuMediator; + NSInteger highlightDestination = + [self.popupMenuHelpCoordinator highlightDestination] == nil + ? -1 + : [[self.popupMenuHelpCoordinator highlightDestination] + integerValue]; OverflowMenuUIConfiguration* uiConfiguration = [[OverflowMenuUIConfiguration alloc] initWithPresentingViewControllerHorizontalSizeClass: self.baseViewController.traitCollection.horizontalSizeClass presentingViewControllerVerticalSizeClass: self.baseViewController.traitCollection - .verticalSizeClass]; + .verticalSizeClass + highlightDestination: + highlightDestination]; self.popupMenuHelpCoordinator.uiConfiguration = uiConfiguration; @@ -343,7 +350,7 @@ animated:YES completion:^{ [weakSelf.popupMenuHelpCoordinator - showOverflowMenuIPHInViewController:menu]; + showHistoryOnOverflowMenuIPHInViewController:menu]; }]; return; }
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.h b/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.h index 3ce08cd..b250a895 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.h +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.h
@@ -19,7 +19,12 @@ // UI updater. @property(nonatomic, weak) id<PopupMenuUIUpdating> UIUpdater; -- (void)showOverflowMenuIPHInViewController:(UIViewController*)menu; +// An integer whose value is matching the overflow_menu::Destination, +// representing the destination on the overflow menu that should be highlighted. +// Return nil if no destination is highlighted (default scenario). +- (NSNumber*)highlightDestination; + +- (void)showHistoryOnOverflowMenuIPHInViewController:(UIViewController*)menu; @end
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.mm index 1c42c3c..15b00ae 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_help_coordinator.mm
@@ -20,6 +20,7 @@ #import "ios/chrome/browser/shared/ui/util/util_swift.h" #import "ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h" +#import "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_constants.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift.h" #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_updating.h" #import "ios/chrome/grit/ios_chromium_strings.h" @@ -99,27 +100,50 @@ [sceneState removeObserver:self]; } -- (void)showOverflowMenuIPHInViewController:(UIViewController*)menu { - // Show the IPH in the overflow menu only if user is still in a session where - // they saw the initial IPH. +- (NSNumber*)highlightDestination { + if (self.inSessionWithHistoryMenuItemIPH) { + return [NSNumber numberWithInt:static_cast<NSInteger>( + overflow_menu::Destination::History)]; + } + return nil; +} + +- (void)showHistoryOnOverflowMenuIPHInViewController:(UIViewController*)menu { + // Show the IPH in the overflow menu if user is still in a session where they + // saw the IPH of the three-dot menu item. if (!self.inSessionWithHistoryMenuItemIPH) { return; } - self.overflowMenuBubblePresenter = [self newOverflowMenuBubblePresenter]; - // The overflow menu IPH should be horizontally centered, but beneath the - // destination list. + CGFloat anchorXInParent = + CGRectGetMidX(self.uiConfiguration.highlightedDestinationFrame); + CGFloat anchorX = + [menu.view.window convertPoint:CGPointMake(anchorXInParent, 0) + fromView:menu.view] + .x; + // in global coordinate system CGPoint anchorPoint = CGPointMake( - CGRectGetMidX(self.uiConfiguration.destinationListScreenFrame), - CGRectGetMaxY(self.uiConfiguration.destinationListScreenFrame)); + anchorX, CGRectGetMaxY(self.uiConfiguration.destinationListScreenFrame)); + + self.overflowMenuBubblePresenter = [self + newOverflowMenuBubblePresenterWithAnchorXInParent:anchorXInParent + parentViewWidth: + self.uiConfiguration + .destinationListScreenFrame.size + .width]; if (![self.overflowMenuBubblePresenter canPresentInView:menu.view anchorPoint:anchorPoint]) { + // Reset the highlight status of the destination as we will miss the other + // path of resetting it when dismissing the IPH. + self.uiConfiguration.highlightDestination = -1; + // No effect besides leaving it in a clean state. + self.uiConfiguration.highlightedDestinationFrame = CGRectZero; return; } self.inSessionWithHistoryMenuItemIPH = NO; - self.uiConfiguration.highlightDestinationsRow = YES; + [self.overflowMenuBubblePresenter presentInViewController:menu view:menu.view anchorPoint:anchorPoint]; @@ -213,7 +237,7 @@ } // Early return if the engagement tracker won't display the IPH. - if (![self canShowIPH]) { + if (![self canShowIPHForPopupMenu]) { return; } @@ -229,8 +253,11 @@ #pragma mark - Overflow Menu Bubble methods -- (BubbleViewControllerPresenter*)newOverflowMenuBubblePresenter { - NSString* text = l10n_util::GetNSString(IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP); +- (BubbleViewControllerPresenter*) + newOverflowMenuBubblePresenterWithAnchorXInParent:(CGFloat)anchorXInParent + parentViewWidth:(CGFloat)parentViewWidth { + NSString* text = + l10n_util::GetNSString(IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP); // Prepare the dismissal callback. __weak __typeof(self) weakSelf = self; @@ -239,24 +266,28 @@ [weakSelf overflowMenuIPHDidDismissWithSnoozeAction:snoozeAction]; }; + BubbleAlignment alignment = anchorXInParent < 0.5 * parentViewWidth + ? BubbleAlignmentLeading + : BubbleAlignmentTrailing; + // Create the BubbleViewControllerPresenter. BubbleArrowDirection arrowDirection = BubbleArrowDirectionUp; BubbleViewControllerPresenter* bubbleViewControllerPresenter = [[BubbleViewControllerPresenter alloc] initDefaultBubbleWithText:text arrowDirection:arrowDirection - alignment:BubbleAlignmentCenter + alignment:alignment isLongDurationBubble:NO dismissalCallback:dismissalCallback]; bubbleViewControllerPresenter.voiceOverAnnouncement = - l10n_util::GetNSString(IDS_IOS_OVERFLOW_MENU_CAROUSEL_TIP_VOICEOVER); + l10n_util::GetNSString(IDS_IOS_VIEW_BROWSING_HISTORY_OVERFLOW_MENU_TIP); return bubbleViewControllerPresenter; } - (void)overflowMenuIPHDidDismissWithSnoozeAction: (feature_engagement::Tracker::SnoozeAction)snoozeAction { self.overflowMenuBubblePresenter = nil; - self.uiConfiguration.highlightDestinationsRow = NO; + self.uiConfiguration.highlightDestination = -1; } #pragma mark - SceneStateObserver @@ -274,7 +305,7 @@ // Queries the feature engagement tracker to see if IPH can currently be // displayed. Once this is called, the IPH MUST be shown and dismissed. -- (BOOL)canShowIPH { +- (BOOL)canShowIPHForPopupMenu { feature_engagement::Tracker* tracker = self.featureEngagementTracker; const base::Feature& feature = feature_engagement::kIPHiOSHistoryOnOverflowMenuFeature;
diff --git a/ios/chrome/browser/ui/side_swipe/BUILD.gn b/ios/chrome/browser/ui/side_swipe/BUILD.gn index fb6983f..2dd4165 100644 --- a/ios/chrome/browser/ui/side_swipe/BUILD.gn +++ b/ios/chrome/browser/ui/side_swipe/BUILD.gn
@@ -7,6 +7,7 @@ sources = [ "card_side_swipe_view.h", "card_side_swipe_view.mm", + "side_swipe_controller+private.h", "side_swipe_controller.h", "side_swipe_controller.mm", "side_swipe_gesture_recognizer.h",
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller+private.h b/ios/chrome/browser/ui/side_swipe/side_swipe_controller+private.h new file mode 100644 index 0000000..91f667b --- /dev/null +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller+private.h
@@ -0,0 +1,26 @@ +// 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 IOS_CHROME_BROWSER_UI_SIDE_SWIPE_SIDE_SWIPE_CONTROLLER_PRIVATE_H_ +#define IOS_CHROME_BROWSER_UI_SIDE_SWIPE_SIDE_SWIPE_CONTROLLER_PRIVATE_H_ + +namespace web { +class WebState; +} // namespace web + +// Class extension exposing private methods of SideSwipeController +// for testing. +@interface SideSwipeController () + +// Whether to allow navigating from the leading edge. +@property(nonatomic, assign) BOOL leadingEdgeNavigationEnabled; + +// Whether to allow navigating from the trailing edge. +@property(nonatomic, assign) BOOL trailingEdgeNavigationEnabled; + +- (void)updateNavigationEdgeSwipeForWebState:(web::WebState*)webState; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SIDE_SWIPE_SIDE_SWIPE_CONTROLLER_PRIVATE_H_
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.h b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.h index 41a8e5e..e343c56 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.h +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.h
@@ -9,12 +9,6 @@ #import "ios/chrome/browser/snapshots/snapshot_generator_delegate.h" -namespace web { -class WebState; -} - -@class CardSideSwipeView; -@class SideSwipeGestureRecognizer; @protocol SideSwipeToolbarInteracting; @protocol SideSwipeToolbarSnapshotProviding; @protocol TabStripHighlighting;
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm index cd068d5..39ab4133 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller.mm
@@ -3,6 +3,7 @@ // found in the LICENSE file. #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h" +#import "ios/chrome/browser/ui/side_swipe/side_swipe_controller+private.h" #import <memory> @@ -30,7 +31,6 @@ #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #import "ios/chrome/browser/web/web_navigation_util.h" #import "ios/web/public/navigation/navigation_item.h" -#import "ios/web/public/web_client.h" #import "ios/web/public/web_state_observer_bridge.h" #import "ui/base/device_form_factor.h" @@ -111,10 +111,6 @@ // Browser passed on the initializer. @property(nonatomic, assign) Browser* browser; -// Whether to allow navigating from the leading edge. -@property(nonatomic, assign) BOOL leadingEdgeNavigationEnabled; -// Whether to allow navigating from the trailing edge. -@property(nonatomic, assign) BOOL trailingEdgeNavigationEnabled; // The current active WebState. @property(nonatomic, readonly) web::WebState* activeWebState; // The browser state owning the current browser. @@ -263,80 +259,6 @@ return !([_tabSideSwipeView window] || _inSwipe); } -// Always return yes, as this swipe should work with various recognizers, -// including UITextTapRecognizer, UILongPressGestureRecognizer, -// UIScrollViewPanGestureRecognizer and others. -- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer - shouldRecognizeSimultaneouslyWithGestureRecognizer: - (UIGestureRecognizer*)otherGestureRecognizer { - return YES; -} - -- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer - shouldBeRequiredToFailByGestureRecognizer: - (UIGestureRecognizer*)otherGestureRecognizer { - // Take precedence over a pan gesture recognizer so that moving up and - // down while swiping doesn't trigger overscroll actions. - if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { - return YES; - } - // Take precedence over a WKWebView side swipe gesture. - if ([otherGestureRecognizer - isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) { - return YES; - } - - return NO; -} - -// Gestures should only be recognized within `contentArea_` or the toolbar. -- (BOOL)gestureRecognizerShouldBegin:(SideSwipeGestureRecognizer*)gesture { - if (_inSwipe) { - return NO; - } - - if ([_swipeDelegate preventSideSwipe]) - return NO; - - CGPoint location = [gesture locationInView:gesture.view]; - - // Since the toolbar and the contentView can overlap, check the toolbar frame - // first, and confirm the right gesture recognizer is firing. - if ([self.toolbarInteractionHandler - isInsideToolbar:[gesture.view convertPoint:location toView:nil]]) { - if (![gesture isEqual:_panGestureRecognizer]) { - return NO; - } - - return [_swipeDelegate canBeginToolbarSwipe]; - } - - // Otherwise, only allow contentView touches with `swipeGestureRecognizer_`. - // The content view frame is inset by -1 because CGRectContainsPoint does - // include points on the max X and Y edges, which will happen frequently with - // edge swipes from the right side. - CGRect contentViewFrame = - CGRectInset([[_swipeDelegate sideSwipeContentView] frame], -1, -1); - if (CGRectContainsPoint(contentViewFrame, location)) { - if (![gesture isEqual:_swipeGestureRecognizer]) { - return NO; - } - - if (gesture.direction == UISwipeGestureRecognizerDirectionRight && - !self.leadingEdgeNavigationEnabled) { - return NO; - } - - if (gesture.direction == UISwipeGestureRecognizerDirectionLeft && - !self.trailingEdgeNavigationEnabled) { - return NO; - } - _swipeType = SwipeType::CHANGE_PAGE; - return YES; - } - return NO; -} - - (void)createGreyCache:(UISwipeGestureRecognizerDirection)direction { NSInteger dx = (direction == UISwipeGestureRecognizerDirectionLeft) ? -1 : 1; NSInteger index = _startingTabIndex + dx; @@ -711,6 +633,82 @@ [self updateNavigationEdgeSwipeForWebState:webState]; } +#pragma mark - UIGestureRecognizerDelegate Methods + +// Gestures should only be recognized within `contentArea_` or the toolbar. +- (BOOL)gestureRecognizerShouldBegin:(SideSwipeGestureRecognizer*)gesture { + if (_inSwipe) { + return NO; + } + + if ([_swipeDelegate preventSideSwipe]) { + return NO; + } + + CGPoint location = [gesture locationInView:gesture.view]; + + // Since the toolbar and the contentView can overlap, check the toolbar frame + // first, and confirm the right gesture recognizer is firing. + if ([self.toolbarInteractionHandler + isInsideToolbar:[gesture.view convertPoint:location toView:nil]]) { + if (![gesture isEqual:_panGestureRecognizer]) { + return NO; + } + + return [_swipeDelegate canBeginToolbarSwipe]; + } + + // Otherwise, only allow contentView touches with `swipeGestureRecognizer_`. + // The content view frame is inset by -1 because CGRectContainsPoint does + // include points on the max X and Y edges, which will happen frequently with + // edge swipes from the right side. + CGRect contentViewFrame = + CGRectInset([[_swipeDelegate sideSwipeContentView] frame], -1, -1); + if (CGRectContainsPoint(contentViewFrame, location)) { + if (![gesture isEqual:_swipeGestureRecognizer]) { + return NO; + } + + if (gesture.direction == UISwipeGestureRecognizerDirectionRight && + !self.leadingEdgeNavigationEnabled) { + return NO; + } + + if (gesture.direction == UISwipeGestureRecognizerDirectionLeft && + !self.trailingEdgeNavigationEnabled) { + return NO; + } + _swipeType = SwipeType::CHANGE_PAGE; + return YES; + } + return NO; +} + +// Always return yes, as this swipe should work with various recognizers, +// including UITextTapRecognizer, UILongPressGestureRecognizer, +// UIScrollViewPanGestureRecognizer and others. +- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer + shouldRecognizeSimultaneouslyWithGestureRecognizer: + (UIGestureRecognizer*)otherGestureRecognizer { + return YES; +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer + shouldBeRequiredToFailByGestureRecognizer: + (UIGestureRecognizer*)otherGestureRecognizer { + // Take precedence over a pan gesture recognizer so that moving up and + // down while swiping doesn't trigger overscroll actions. + if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { + return YES; + } + // Take precedence over a WKWebView side swipe gesture. + if ([otherGestureRecognizer + isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) { + return YES; + } + return NO; +} + #pragma mark - WebStateListObserving Methods - (void)webStateList:(WebStateList*)webStateList
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_controller_unittest.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_controller_unittest.mm index f26f11cf..5c5eb7e 100644 --- a/ios/chrome/browser/ui/side_swipe/side_swipe_controller_unittest.mm +++ b/ios/chrome/browser/ui/side_swipe/side_swipe_controller_unittest.mm
@@ -3,6 +3,7 @@ // found in the LICENSE file. #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h" +#import "ios/chrome/browser/ui/side_swipe/side_swipe_controller+private.h" #import <WebKit/WebKit.h> @@ -30,12 +31,6 @@ #error "This file requires ARC support." #endif -@interface SideSwipeController (ExposedForTesting) -@property(nonatomic, assign) BOOL leadingEdgeNavigationEnabled; -@property(nonatomic, assign) BOOL trailingEdgeNavigationEnabled; -- (void)updateNavigationEdgeSwipeForWebState:(web::WebState*)webState; -@end - namespace { class SideSwipeControllerTest : public PlatformTest {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn index 8700e15a..394eab68 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -290,6 +290,7 @@ "//ios/chrome/browser/metrics:eg_test_support+eg2", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/signin:fake_system_identity", + "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", "//ios/chrome/browser/ui/bookmarks:eg_test_support+eg2", "//ios/chrome/browser/ui/history:constants",
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm index bd92a13..e1e53c92 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
@@ -8,6 +8,7 @@ #import <memory> #import "base/check_op.h" +#import "base/debug/dump_without_crashing.h" #import "base/ios/block_types.h" #import "base/ios/ios_util.h" #import "base/mac/foundation_util.h" @@ -78,6 +79,8 @@ constexpr CGFloat kSpringAnimationInitialVelocity = 1.0; constexpr int kOpenTabsSectionIndex = 0; constexpr int kSuggestedActionsSectionIndex = 1; +constexpr base::TimeDelta kInactiveTabsHeaderAnimationDuration = + base::Seconds(0.3); NSString* const kCellIdentifier = @"GridCellIdentifier"; NSString* const kPlusSignCellIdentifier = @"PlusSignCellIdentifier"; @@ -187,6 +190,8 @@ @property(nonatomic, assign) NSInteger inactiveTabsDaysThreshold; // Tracks if a drop action initiated in this grid is in progress. @property(nonatomic) BOOL localDragActionInProgress; +// Tracks if the Inactive Tabs button is being animated out. +@property(nonatomic) BOOL inactiveTabsHeaderHideAnimationInProgress; @end @implementation GridViewController { @@ -579,7 +584,11 @@ case TabGridModeNormal: { // The Regular Tabs grid has a button to inform about the hidden inactive // tabs. - CHECK(IsInactiveTabsAvailable() && self.inactiveTabsCount > 0); + CHECK(IsInactiveTabsAvailable()); + if (self.inactiveTabsCount == 0 && + !self.inactiveTabsHeaderHideAnimationInProgress) { + base::debug::DumpWithoutCrashing(); + } InactiveTabsButtonHeader* header = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier: @@ -732,7 +741,14 @@ referenceSizeForHeaderInSection:(NSInteger)section { switch (_mode) { case TabGridModeNormal: - if (!IsInactiveTabsAvailable() || self.inactiveTabsCount == 0) { + if (!IsInactiveTabsAvailable()) { + return CGSizeZero; + } + if (self.inactiveTabsHeaderHideAnimationInProgress) { + // The header is animated out to a height of 0.1. + return CGSizeMake(collectionView.bounds.size.width, 0.1); + } + if (self.inactiveTabsCount == 0) { return CGSizeZero; } // The Regular Tabs grid has a button to inform about the hidden inactive @@ -810,6 +826,12 @@ - (UIContextMenuConfiguration*)collectionView:(UICollectionView*)collectionView contextMenuConfigurationForItemAtIndexPath:(NSIndexPath*)indexPath point:(CGPoint)point { + // Don't allow long-press previews when the incognito reauth view is blocking + // the content. + if (self.contentNeedsAuthentication) { + return nil; + } + // Context menu shouldn't appear in the selection mode. if (_mode == TabGridModeSelection) { return nil; @@ -1483,12 +1505,13 @@ self.inactiveTabsCount = count; // Update the header. - if (oldCount == 0 || count == 0) { - // The header should appear or disappear. Reload the section. - [self reloadInactiveTabsButtonHeader]; + if (oldCount == 0) { + [self showInactiveTabsButtonHeader]; + } else if (count == 0) { + [self hideInactiveTabsButtonHeader]; } else { // The header just needs to be updated with the new count. - [self updateInactiveTabsButtonHeaderIfNeeded]; + [self updateInactiveTabsButtonHeader]; } } @@ -1506,11 +1529,11 @@ [self reloadInactiveTabsButtonHeader]; } else { // The header just needs to be updated with the new days threshold. - [self updateInactiveTabsButtonHeaderIfNeeded]; + [self updateInactiveTabsButtonHeader]; } // Update the preamble. - [self updateInactiveTabsPreambleHeaderIfNeeded]; + [self updateInactiveTabsPreambleHeader]; } #pragma mark - LayoutSwitcher @@ -2068,6 +2091,44 @@ return CGSizeMake(width, size.height); } +- (void)showInactiveTabsButtonHeader { + // Contrary to `hideInactiveTabsButtonHeader`, this doesn't need to be + // animated. + [self reloadInactiveTabsButtonHeader]; +} + +- (void)hideInactiveTabsButtonHeader { + NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 + inSection:kOpenTabsSectionIndex]; + InactiveTabsButtonHeader* header = + base::mac::ObjCCast<InactiveTabsButtonHeader>([self.collectionView + supplementaryViewForElementKind:UICollectionElementKindSectionHeader + atIndexPath:indexPath]); + if (!header) { + return; + } + + self.inactiveTabsHeaderHideAnimationInProgress = YES; + [UIView animateWithDuration:kInactiveTabsHeaderAnimationDuration.InSecondsF() + animations:^{ + header.alpha = 0; + [self.collectionView.collectionViewLayout invalidateLayout]; + } + completion:^(BOOL finished) { + header.hidden = YES; + self.inactiveTabsHeaderHideAnimationInProgress = NO; + // Update the header to make it entirely disappear once the animation is + // done. This is done after a delay because the completion can be called + // before the animation ended, causing a visual glitch. + __weak __typeof(self) weakSelf = self; + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, base::BindOnce(^{ + [weakSelf reloadInactiveTabsButtonHeader]; + }), + kInactiveTabsHeaderAnimationDuration); + }]; +} + // Reloads the section containing the Inactive Tabs button header. - (void)reloadInactiveTabsButtonHeader { NSIndexSet* openTabsSection = @@ -2088,7 +2149,7 @@ } // Reconfigures the Inactive Tabs button header. -- (void)updateInactiveTabsButtonHeaderIfNeeded { +- (void)updateInactiveTabsButtonHeader { NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 inSection:kOpenTabsSectionIndex]; InactiveTabsButtonHeader* header = @@ -2104,7 +2165,7 @@ } // Reconfigures the Inactive Tabs preamble header. -- (void)updateInactiveTabsPreambleHeaderIfNeeded { +- (void)updateInactiveTabsPreambleHeader { NSIndexPath* indexPath = [NSIndexPath indexPathForItem:0 inSection:kOpenTabsSectionIndex]; InactiveTabsPreambleHeader* header =
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm index d1e4541..33d1f71 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/inactive_tabs/inactive_tabs_coordinator.mm
@@ -95,6 +95,10 @@ // dismissal of the view controller, when the swiped position is already more // than half of the screen's width. const CGFloat kMinBackwardVelocityToCancelDismiss = 10; +// When closing all inactive tabs via the confirmation dialog, the Inactive Tabs +// grid is popped, but to avoid having it emptied immediately (producing a +// glitch), delay the closing of the tabs in the mediator. +const base::TimeDelta kCloseAllInactiveTabsDelay = base::Seconds(0.3); // NSUserDefaults key to check whether the user education screen has ever been // shown. The associated value in user defaults is a BOOL. @@ -636,7 +640,14 @@ // Called when the user confirmed wanting to close all inactive tabs. - (void)closeAllInactiveTabs { [_delegate inactiveTabsCoordinatorDidFinish:self]; - [self.mediator closeAllItems]; + // To prevent the Inactive Tabs grid from being immediately emptied, defer the + // closing to after the view is popped. + __weak __typeof(self) weakSelf = self; + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, base::BindOnce(^{ + [weakSelf.mediator closeAllItems]; + }), + kCloseAllInactiveTabsDelay); } // Presents the Inactive Tabs settings modally in their own navigation
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 b32052a..2a47aaf 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
@@ -202,8 +202,6 @@ @property(nonatomic, strong) InactiveTabsCoordinator* inactiveTabsCoordinator; // The timestamp of the user entering the tab grid. @property(nonatomic, assign) base::TimeTicks tabGridEnterTime; -// The timestamp of the user exiting the tab grid. -@property(nonatomic, assign) base::TimeTicks tabGridExitTime; // The page configuration used when create the tab grid view controller; @property(nonatomic, assign) TabGridPageConfiguration pageConfiguration; @@ -509,13 +507,6 @@ [self.priceCardMediator logMetrics:TAB_SWITCHER]; } -- (void)reportTabGridUsageTime { - base::TimeDelta duration = self.tabGridExitTime - self.tabGridEnterTime; - base::UmaHistogramLongTimes("IOS.TabSwitcher.TimeSpent", duration); - self.tabGridEnterTime = base::TimeTicks(); - self.tabGridExitTime = base::TimeTicks(); -} - - (void)showTabViewController:(UIViewController*)viewController incognito:(BOOL)incognito shouldCloseTabGrid:(BOOL)shouldCloseTabGrid @@ -524,11 +515,13 @@ DCHECK(viewController || (thumbStripEnabled && self.bvcContainer)); if (shouldCloseTabGrid) { - self.tabGridExitTime = base::TimeTicks::Now(); - // Record when the tab switcher is dismissed. base::RecordAction(base::UserMetricsAction("MobileTabGridExited")); - [self reportTabGridUsageTime]; + + // Record how long the tab switcher was presented. + base::TimeDelta duration = base::TimeTicks::Now() - self.tabGridEnterTime; + base::UmaHistogramLongTimes("IOS.TabSwitcher.TimeSpent", duration); + self.tabGridEnterTime = base::TimeTicks(); } if (thumbStripEnabled) {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm index f372c52..e5a02c8 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_egtest.mm
@@ -12,6 +12,7 @@ #import "base/time/time.h" #import "components/bookmarks/common/bookmark_pref_names.h" #import "ios/chrome/browser/signin/fake_system_identity.h" +#import "ios/chrome/browser/tabs/inactive_tabs/features.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" @@ -31,6 +32,7 @@ #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_xcui_actions.h" #import "ios/chrome/test/earl_grey/web_http_server_chrome_test_case.h" +#import "ios/testing/earl_grey/app_launch_manager.h" #import "ios/testing/earl_grey/earl_grey_test.h" #import "ios/web/public/test/http_server/data_response_provider.h" #import "ios/web/public/test/http_server/http_server.h" @@ -427,6 +429,98 @@ assertWithMatcher:grey_sufficientlyVisible()]; } +// Tests that tapping Close All close also inactive tabs. Ensure it is correctly +// recovered when pressing undo and there is no selection mode when there are +// inactive tabs but no regular tabs. +- (void)testCloseAllAndUndoCloseAllWithInactiveTabs { + if ([ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_SKIPPED(@"Skipped for iPad. The Inactive Tabs feature is " + @"only supported on iPhone."); + } + [self loadTestURLsInNewTabs]; + [self relaunchAppWithInactiveTabsEnabled]; + + [ChromeEarlGreyUI openTabGrid]; + GREYAssertEqual(1, [ChromeEarlGrey mainTabCount], + @"Expected only one tab (NTP), all other tabs should have " + @"been in inactive tab grid."); + GREYAssertEqual(4, [ChromeEarlGrey inactiveTabCount], + @"Expected 4 inactive tabs."); + + // Ensure the edit button is visible. + [[EarlGrey selectElementWithMatcher:VisibleTabGridEditButton()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Close all tabs. + [[EarlGrey selectElementWithMatcher:VisibleTabGridEditButton()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + TabGridEditMenuCloseAllButton()] + performAction:grey_tap()]; + + // Ensure regular and inactive tabs were closed. + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + TabGridRegularTabsEmptyStateView()] + assertWithMatcher:grey_sufficientlyVisible()]; + GREYAssertEqual(0, [ChromeEarlGrey mainTabCount], + @"Expected all regular tab to be closed."); + GREYAssertEqual(0, [ChromeEarlGrey inactiveTabCount], + @"Expected all inactive tab to be closed."); + + // Tap Undo button. + [[EarlGrey + selectElementWithMatcher:chrome_test_util::TabGridUndoCloseAllButton()] + performAction:grey_tap()]; + GREYAssertEqual(1, [ChromeEarlGrey mainTabCount], + @"Expected only one tab (NTP), all other tabs should have " + @"been in inactive tab grid."); + GREYAssertEqual(4, [ChromeEarlGrey inactiveTabCount], + @"Expected 4 inactive tabs."); + [[EarlGrey selectElementWithMatcher:chrome_test_util::TabGridCellAtIndex(0)] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Closing the only tab in the regular tab grid and verify there is an empty + // grid. + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + TabGridCloseButtonForCellAtIndex(0)] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + TabGridRegularTabsEmptyStateView()] + assertWithMatcher:grey_sufficientlyVisible()]; + GREYAssertEqual(0, [ChromeEarlGrey mainTabCount], + @"Expected no tab in regular tab grid."); + GREYAssertEqual(4, [ChromeEarlGrey inactiveTabCount], + @"Expected 4 inactive tabs."); + + // Ensure there is no selection mode available when there is no tab in regular + // tab grid. + [[EarlGrey selectElementWithMatcher:VisibleTabGridEditButton()] + assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey selectElementWithMatcher:VisibleTabGridEditButton()] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher:chrome_test_util::TabGridSelectTabsMenuButton()] + assertWithMatcher:grey_nil()]; + + // Close all. + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + TabGridEditMenuCloseAllButton()] + performAction:grey_tap()]; + GREYAssertEqual(0, [ChromeEarlGrey mainTabCount], + @"Expected all regular tab to be closed."); + GREYAssertEqual(0, [ChromeEarlGrey inactiveTabCount], + @"Expected all inactive tab to be closed."); + + // Tap on Undo button. + [[EarlGrey + selectElementWithMatcher:chrome_test_util::TabGridUndoCloseAllButton()] + performAction:grey_tap()]; + GREYAssertEqual(0, [ChromeEarlGrey mainTabCount], + @"Expected no tab in regular tab grid."); + GREYAssertEqual(4, [ChromeEarlGrey inactiveTabCount], + @"Expected 4 inactive tabs."); +} + // Tests that the Undo button is no longer available after tapping Close All, // then creating a new tab, then coming back to the tab grid. // Validates this case when Tab Grid Bulk Actions feature is enabled. @@ -2697,4 +2791,15 @@ [RecentTabsAppInterface clearCollapsedListViewSectionStates]; } +// Relaunches the app with Inactive Tabs enabled. +- (void)relaunchAppWithInactiveTabsEnabled { + AppLaunchConfiguration config; + config.relaunch_policy = ForceRelaunchByCleanShutdown; + config.additional_args.push_back( + "--enable-features=" + std::string(kTabInactivityThreshold.name) + ":" + + kTabInactivityThresholdParameterName + "/" + + kTabInactivityThresholdImmediateDemoParam); + [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; +} + @end
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm index c61d773..f12f7028 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -2229,7 +2229,7 @@ self.tabGridEnterTime = base::TimeTicks(); } -#pragma mark UIGestureRecognizerDelegate +#pragma mark - UIGestureRecognizerDelegate - (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: @@ -2239,7 +2239,7 @@ return NO; } -#pragma mark UISearchBarDelegate +#pragma mark - UISearchBarDelegate - (void)searchBarTextDidBeginEditing:(UISearchBar*)searchBar { [self updateScrimVisibilityForText:searchBar.text]; @@ -2501,8 +2501,6 @@ return; } - // Check if the tab being selected is already selected. - BOOL alreadySelected = NO; id<GridCommands> tabsDelegate; if (gridViewController == self.regularTabsViewController) { tabsDelegate = self.regularTabsDelegate; @@ -2523,7 +2521,8 @@ // Record how long it took to select an item. [self reportTabSelectionTime]; - alreadySelected = [tabsDelegate isItemWithIDSelected:itemID]; + // Check if the tab being selected is already selected. + BOOL alreadySelected = [tabsDelegate isItemWithIDSelected:itemID]; if (!alreadySelected) { [self setCurrentIdlePageStatus:NO]; }
diff --git a/ios/chrome/common/ui/util/BUILD.gn b/ios/chrome/common/ui/util/BUILD.gn index fcf17cb..cc83a5d7 100644 --- a/ios/chrome/common/ui/util/BUILD.gn +++ b/ios/chrome/common/ui/util/BUILD.gn
@@ -4,6 +4,7 @@ import("//build/buildflag_header.gni") import("//build/config/ios/ios_sdk.gni") +import("//build/config/ios/swift_source_set.gni") source_set("util") { sources = [
diff --git a/ios/chrome/test/app/sync_test_util.mm b/ios/chrome/test/app/sync_test_util.mm index e1da0c9..370d8a7 100644 --- a/ios/chrome/test/app/sync_test_util.mm +++ b/ios/chrome/test/app/sync_test_util.mm
@@ -187,30 +187,10 @@ specifics_list.push_back(tab); tab_list.push_back(distant_tab->tab_id); } - // Compute device type. - // TODO(crbug.com/1434959): This is a temporary workaround. Remove the switch - // statement and use `session.form_factor` after - // `BuildHeaderSpecificsWithoutWindows` is updated. - sync_pb::SyncEnums_DeviceType device_type = - sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_UNSET; - switch (session.form_factor) { - case syncer::DeviceInfo::FormFactor::kDesktop: - device_type = - sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_MAC; - break; - case syncer::DeviceInfo::FormFactor::kPhone: - device_type = sync_pb::SyncEnums_DeviceType_TYPE_PHONE; - break; - case syncer::DeviceInfo::FormFactor::kTablet: - device_type = sync_pb::SyncEnums_DeviceType_TYPE_TABLET; - break; - case syncer::DeviceInfo::FormFactor::kUnknown: - break; - } // Header specifics. sync_pb::SessionSpecifics header = sync_sessions::SessionSyncTestHelper::BuildHeaderSpecificsWithoutWindows( - session.tag, device_type); + session.tag, session.form_factor); sync_sessions::SessionSyncTestHelper::AddWindowSpecifics(window_id, tab_list, &header); specifics_list.push_back(header);
diff --git a/ios/chrome/test/app/tab_test_util.h b/ios/chrome/test/app/tab_test_util.h index cc819dee..1ceea7bf 100644 --- a/ios/chrome/test/app/tab_test_util.h +++ b/ios/chrome/test/app/tab_test_util.h
@@ -70,6 +70,9 @@ // Returns the number of main tabs. NSUInteger GetMainTabCount(); +// Returns the number of inactive tabs. +NSUInteger GetInactiveTabCount(); + // Returns the number of incognito tabs. NSUInteger GetIncognitoTabCount();
diff --git a/ios/chrome/test/app/tab_test_util.mm b/ios/chrome/test/app/tab_test_util.mm index ab245c5..3740050d 100644 --- a/ios/chrome/test/app/tab_test_util.mm +++ b/ios/chrome/test/app/tab_test_util.mm
@@ -212,6 +212,13 @@ ->count(); } +NSUInteger GetInactiveTabCount() { + return GetMainController() + .browserProviderInterface.mainBrowserProvider.inactiveBrowser + ->GetWebStateList() + ->count(); +} + NSUInteger GetIncognitoTabCount() { return GetMainController() .browserProviderInterface.incognitoBrowserProvider.browser
diff --git a/ios/chrome/test/data/omnibox/fake_suggestions_pedal.json b/ios/chrome/test/data/omnibox/fake_suggestions_pedal.json index 30888a3..b418332 100644 --- a/ios/chrome/test/data/omnibox/fake_suggestions_pedal.json +++ b/ios/chrome/test/data/omnibox/fake_suggestions_pedal.json
@@ -374,5 +374,46 @@ "google:verbatimrelevance": 1300 } ], + [ + "history", + [ + "View Your Chrome History", + "nopedal1", + "nopedal2" + ], + [ + "", + "", + "", + ], + [], + { + "google:clientdata": { + "bpc": false, + "tlw": false + }, + "google:suggestdetail": [ + {}, + {}, + {}, + ], + "google:suggestrelevance": [ + 1253, + 1252, + 1251, + ], + "google:suggestsubtypes": [ + [], + [], + [], + ], + "google:suggesttype": [ + "QUERY", + "QUERY", + "QUERY", + ], + "google:verbatimrelevance": 1300 + } + ], ]
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h index c9275c9..7578c279 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -339,6 +339,9 @@ // Returns the number of main (non-incognito) tabs. - (NSUInteger)mainTabCount [[nodiscard]]; +// Returns the number of inactive tabs. +- (NSUInteger)inactiveTabCount [[nodiscard]]; + // Returns the number of incognito tabs. - (NSUInteger)incognitoTabCount [[nodiscard]];
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm index 0d77658..d17ddb6 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -255,6 +255,10 @@ return [ChromeEarlGreyAppInterface mainTabCount]; } +- (NSUInteger)inactiveTabCount { + return [ChromeEarlGreyAppInterface inactiveTabCount]; +} + - (NSUInteger)incognitoTabCount { return [ChromeEarlGreyAppInterface incognitoTabCount]; }
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h index d1a284d..5d759e9 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -101,6 +101,9 @@ // Returns the number of open non-incognito tabs. + (NSUInteger)mainTabCount [[nodiscard]]; +// Returns the number of open inactive tabs. ++ (NSUInteger)inactiveTabCount [[nodiscard]]; + // Returns the number of open incognito tabs. + (NSUInteger)incognitoTabCount [[nodiscard]];
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm index 8253bc0d..3de781ca 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -260,6 +260,10 @@ return chrome_test_util::GetMainTabCount(); } ++ (NSUInteger)inactiveTabCount { + return chrome_test_util::GetInactiveTabCount(); +} + + (NSUInteger)incognitoTabCount { return chrome_test_util::GetIncognitoTabCount(); }
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ca.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ca.xtb index ca7a16c..08a4f0f 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ca.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ca.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Fes cerques amb la veu a Chrome.</translation> <translation id="405442954313519726">Fes una cerca o navega per una pestanya nova, en mode d'incògnit, utilitzant la veu o amb un codi QR.</translation> <translation id="4557098988773644458">Entra al joc del dinosaure de Chrome</translation> +<translation id="4678859075583681103">Inicia una cerca nova o obre els llocs web que has visitat més des de la pàgina d'inici de l'iPhone.</translation> <translation id="4954445889641385956">Fes una cerca o escriu un URL</translation> <translation id="5234725349196694896">Fes cerques a Chrome amb el teu motor de cerca preferit.</translation> <translation id="5277852985315196237">Fes una cerca o escriu un URL</translation> @@ -20,11 +21,13 @@ <translation id="6179961764474023795">Accions ràpides</translation> <translation id="6336802729091778259">Joc del dinosaure de Chrome</translation> <translation id="6663288906398689853">Cerca</translation> +<translation id="6691821786147477657">Inicia una cerca nova o obre els llocs web que has visitat més des de la pàgina d'inici de l'iPad.</translation> <translation id="6855322554930231468">Cerca</translation> <translation id="7010831364920321713">Cerca d'incògnit</translation> <translation id="7048549665319929185">Fes una cerca o escriu un URL</translation> <translation id="7317302007099170473">Escaneja un codi QR</translation> <translation id="744668050028871192">Cerca</translation> +<translation id="7730705312376865830">Dreceres de Chrome</translation> <translation id="8104498668011127805">Entra al joc del dinosaure de Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Cerca d'incògnit</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb index 066db92c..f483ceb 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Chwilio yn Chrome gan ddefnyddio'ch llais.</translation> <translation id="405442954313519726">Chwilio neu lywio mewn tab newydd, yn y Modd Anhysbys, gan ddefnyddio'ch llais, neu gyda chod QR.</translation> <translation id="4557098988773644458">Neidio i mewn i'r Gêm Chrome Dino</translation> +<translation id="4678859075583681103">Dechreuwch chwiliad newydd neu agorwch eich gwefannau yr ymwelwyd â nhw amlaf o hafan eich iPhone.</translation> <translation id="4954445889641385956">Chwiliwch neu teipiwch URL</translation> <translation id="5234725349196694896">Chwilio yn Chrome gyda'ch hoff beiriant chwilio.</translation> <translation id="5277852985315196237">Chwiliwch neu teipiwch URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Camau Gweithredu Cyflym</translation> <translation id="6336802729091778259">Gêm Chrome Dino</translation> <translation id="6663288906398689853">Chwilio</translation> +<translation id="6691821786147477657">Dechreuwch chwiliad newydd neu agorwch eich gwefannau yr ymwelwyd â nhw amlaf o hafan eich iPad.</translation> <translation id="6855322554930231468">Chwilio</translation> <translation id="7010831364920321713">Chwiliad Anhysbys</translation> <translation id="7048549665319929185">Chwiliwch neu teipiwch URL</translation> <translation id="7317302007099170473">Sganio Cod QR</translation> <translation id="744668050028871192">Chwilio</translation> +<translation id="7730705312376865830">Llwybrau Byr Chrome</translation> <translation id="8104498668011127805">Neidiwch i mewn i'r Gêm Chrome Dino</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Chwiliad Anhysbys</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_en-GB.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_en-GB.xtb index 4550a941..785a6bd0 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_en-GB.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_en-GB.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Search in Chrome using your voice.</translation> <translation id="405442954313519726">Search or navigate in a new tab, in Incognito mode, using your voice or with a QR code.</translation> <translation id="4557098988773644458">Jump into Chrome Dino game</translation> +<translation id="4678859075583681103">Start a new search or open your most visited sites from your iPhone homepage.</translation> <translation id="4954445889641385956">Search or type a URL</translation> <translation id="5234725349196694896">Search in Chrome with your favourite search engine.</translation> <translation id="5277852985315196237">Search or type a URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Quick Actions</translation> <translation id="6336802729091778259">Chrome Dino game</translation> <translation id="6663288906398689853">Search</translation> +<translation id="6691821786147477657">Start a new search or open your most visited sites from your iPad homepage.</translation> <translation id="6855322554930231468">Search</translation> <translation id="7010831364920321713">Incognito search</translation> <translation id="7048549665319929185">Search or type URL</translation> <translation id="7317302007099170473">Scan QR code</translation> <translation id="744668050028871192">Search</translation> +<translation id="7730705312376865830">Chrome shortcuts</translation> <translation id="8104498668011127805">Jump into Chrome dino game</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Incognito search</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_es.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_es.xtb index 883f888..89c1a5c 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_es.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_es.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Haz búsquedas en Chrome con la voz.</translation> <translation id="405442954313519726">Busca o desplázate por una nueva pestaña, en el modo Incógnito, usando la voz o con un código QR.</translation> <translation id="4557098988773644458">Abrir el juego del dinosaurio de Chrome</translation> +<translation id="4678859075583681103">Inicia una nueva búsqueda o abre los sitios más visitados desde la página principal de tu iPhone.</translation> <translation id="4954445889641385956">Busca o escribe una URL</translation> <translation id="5234725349196694896">Haz búsquedas en Chrome con tu buscador favorito.</translation> <translation id="5277852985315196237">Busca o escribe una URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Acciones rápidas</translation> <translation id="6336802729091778259">Juego El dinosaurio de Chrome</translation> <translation id="6663288906398689853">Buscar</translation> +<translation id="6691821786147477657">Inicia una nueva búsqueda o abre los sitios que más visitas desde la página principal de tu iPad.</translation> <translation id="6855322554930231468">Buscar</translation> <translation id="7010831364920321713">Búsqueda en modo Incógnito</translation> <translation id="7048549665319929185">Busca o escribe una URL</translation> <translation id="7317302007099170473">Escanear código QR</translation> <translation id="744668050028871192">Buscar</translation> +<translation id="7730705312376865830">Accesos directos de Chrome</translation> <translation id="8104498668011127805">Abre el juego del dinosaurio de Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Búsqueda en modo Incógnito</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_et.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_et.xtb index 37b77d37..45837592 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_et.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_et.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Otsige Chrome'is oma hääle abil.</translation> <translation id="405442954313519726">Otsige või navigeerige uuel vahelehel, inkognito režiimis, häälotsingu või QR-koodi abil.</translation> <translation id="4557098988773644458">Avage Chrome'i dinosaurusemäng</translation> +<translation id="4678859075583681103">Alustage uut otsingut või avage oma enim külastatavad saidid oma iPhone'i kodulehel.</translation> <translation id="4954445889641385956">Otsige või sisestage URL</translation> <translation id="5234725349196694896">Otsige Chrome'is oma lemmikotsingumootoriga.</translation> <translation id="5277852985315196237">Otsige või sisestage URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Kiirtoimingud</translation> <translation id="6336802729091778259">Chrome'i dinosaurusemäng</translation> <translation id="6663288906398689853">Otsing</translation> +<translation id="6691821786147477657">Alustage uut otsingut või avage oma enim külastatavad saidid oma iPadi kodulehel.</translation> <translation id="6855322554930231468">Otsing</translation> <translation id="7010831364920321713">Inkognito režiimis otsing</translation> <translation id="7048549665319929185">Otsige või sisestage URL</translation> <translation id="7317302007099170473">QR-koodi skannimine</translation> <translation id="744668050028871192">Otsing</translation> +<translation id="7730705312376865830">Chrome'i otseteed</translation> <translation id="8104498668011127805">Hüpake Chrome'i dinosaurusemängu</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Inkognito režiimis otsing</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fil.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fil.xtb index b11d6f8c..41afa1227 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fil.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fil.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Maghanap sa Chrome gamit ang iyong boses.</translation> <translation id="405442954313519726">Maghanap o mag-navigate sa bagong tab, sa Incognito mode, gamit ang iyong boses, o gamit ang isang QR code.</translation> <translation id="4557098988773644458">Pumunta sa Larong Chrome Dino</translation> +<translation id="4678859075583681103">Magsimula ng bagong paghahanap o buksan ang iyong mga pinakabinibisitang site mula sa homepage ng iPhone mo.</translation> <translation id="4954445889641385956">Maghanap o mag-type ng URL</translation> <translation id="5234725349196694896">Maghanap sa Chrome gamit ang iyong paboritong search engine.</translation> <translation id="5277852985315196237">Maghanap o mag-type ng URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Mga Mabilisang Pagkilos</translation> <translation id="6336802729091778259">Larong Chrome Dino</translation> <translation id="6663288906398689853">Maghanap</translation> +<translation id="6691821786147477657">Magsimula ng bagong paghahanap o buksan ang iyong mga pinakabinibisitang site mula sa homepage ng iPad mo.</translation> <translation id="6855322554930231468">Hanapin</translation> <translation id="7010831364920321713">Paghahanap na Incognito</translation> <translation id="7048549665319929185">Maghanap o mag-type ng URL</translation> <translation id="7317302007099170473">I-scan ang QR Code</translation> <translation id="744668050028871192">Maghanap</translation> +<translation id="7730705312376865830">Mga Shortcut sa Chrome</translation> <translation id="8104498668011127805">Pumunta sa Larong Chrome Dino</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Paghahanap na Incognito</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_gu.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_gu.xtb index f80df6a..7e91d34 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_gu.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_gu.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">તમારા વૉઇસનો ઉપયોગ કરીને Chromeમાં શોધો.</translation> <translation id="405442954313519726">તમારા વૉઇસનો ઉપયોગ કરીને અથવા QR કોડ વડે, છૂપા મોડમાં શોધો અથવા નવી ટૅબ પર નૅવિગેટ કરો.</translation> <translation id="4557098988773644458">Chrome Dino ગેમ પર જાઓ</translation> +<translation id="4678859075583681103">કોઈ નવી શોધ શરૂ કરો અથવા તમારા iPhone હોમપેજમાંથી તમારી સૌથી વધુ મુલાકાત લીધેલી સાઇટ ખોલો.</translation> <translation id="4954445889641385956">URL શોધો અથવા ટાઇપ કરો</translation> <translation id="5234725349196694896">તમારા મનપસંદ શોધ એન્જિન વડે Chromeમાં શોધો.</translation> <translation id="5277852985315196237">URL શોધો અથવા ટાઇપ કરો</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">ઝડપી શૉર્ટકટ</translation> <translation id="6336802729091778259">Chrome Dino ગેમ</translation> <translation id="6663288906398689853">શોધો</translation> +<translation id="6691821786147477657">કોઈ નવી શોધ શરૂ કરો અથવા તમારા iPad હોમપેજમાંથી તમારી સૌથી વધુ મુલાકાત લીધેલી સાઇટ ખોલો.</translation> <translation id="6855322554930231468">શોધ</translation> <translation id="7010831364920321713">છૂપી શોધ</translation> <translation id="7048549665319929185">URL શોધો અથવા ટાઇપ કરો</translation> <translation id="7317302007099170473">QR કોડ સ્કૅન કરો</translation> <translation id="744668050028871192">શોધો</translation> +<translation id="7730705312376865830">Chromeના શૉર્ટકટ</translation> <translation id="8104498668011127805">Chrome Dino ગેમ પર જાઓ</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">છૂપી શોધ</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kk.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kk.xtb index c646a63..81e4099 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kk.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_kk.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Chrome-да дауыспен іздеу.</translation> <translation id="405442954313519726">Жаңа қойындыдан іздеңіз, инкогнито режимінде дауыспен іздеуді не QR кодын пайдаланыңыз.</translation> <translation id="4557098988773644458">Chrome Dino ойынына өту</translation> +<translation id="4678859075583681103">Жаңа іздеуді бастаңыз немесе iPhone негізгі бетінен ең көп қаралатын сайттарды ашыңыз.</translation> <translation id="4954445889641385956">Іздеңіз не URL теріңіз</translation> <translation id="5234725349196694896">Chrome-да ұнататын іздеу жүйесін пайдалану.</translation> <translation id="5277852985315196237">Іздеңіз не URL теріңіз</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Жылдам әрекеттер</translation> <translation id="6336802729091778259">Chrome Dino ойыны</translation> <translation id="6663288906398689853">Іздеу</translation> +<translation id="6691821786147477657">Жаңа іздеуді бастаңыз немесе iPad негізгі бетінен ең көп қаралатын сайттарды ашыңыз.</translation> <translation id="6855322554930231468">Іздеу</translation> <translation id="7010831364920321713">Инкогнито режимінде іздеу</translation> <translation id="7048549665319929185">Іздеңіз не URL теріңіз</translation> <translation id="7317302007099170473">QR кодын сканерлеу</translation> <translation id="744668050028871192">Іздеу</translation> +<translation id="7730705312376865830">Chrome таңбашалары</translation> <translation id="8104498668011127805">Chrome Dino ойынына өту</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Инкогнито режимінде іздеу</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb index 82e0084..4e52b00 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Chrome에서 음성으로 검색합니다.</translation> <translation id="405442954313519726">새 탭 또는 시크릿 모드, 음성 또는 QR 코드를 사용하여 검색하거나 탐색하세요.</translation> <translation id="4557098988773644458">Chrome 공룡 게임 시작</translation> +<translation id="4678859075583681103">iPhone 홈페이지에서 새로 검색을 시작하거나 가장 자주 방문한 사이트를 엽니다.</translation> <translation id="4954445889641385956">검색 또는 URL 입력</translation> <translation id="5234725349196694896">Chrome에서 내가 좋아하는 검색엔진을 이용하여 검색합니다.</translation> <translation id="5277852985315196237">검색 또는 URL 입력</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">빠른 작업</translation> <translation id="6336802729091778259">Chrome 공룡 게임</translation> <translation id="6663288906398689853">검색</translation> +<translation id="6691821786147477657">iPad 홈페이지에서 새로운 검색을 시작하거나 가장 자주 방문한 사이트를 엽니다.</translation> <translation id="6855322554930231468">검색</translation> <translation id="7010831364920321713">시크릿 검색</translation> <translation id="7048549665319929185">검색 또는 URL 입력</translation> <translation id="7317302007099170473">QR 코드 스캔</translation> <translation id="744668050028871192">검색</translation> +<translation id="7730705312376865830">Chrome 바로가기</translation> <translation id="8104498668011127805">Chrome 공룡 게임 시작</translation> <translation id="8150601371542319992">렌즈</translation> <translation id="8171952085734471362">시크릿 검색</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb index 4824ae97..04cd8cc5 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Chrome'до оозеки издеңиз.</translation> <translation id="405442954313519726">Үнүңүз же QR коду аркылуу издеп же жаңы барактарга өтүп, жашыруун режимге кире аласыз.</translation> <translation id="4557098988773644458">Chrome Dino оюнун ачуу</translation> +<translation id="4678859075583681103">Жаңы нерсени издеп же iPhone түзмөгүңүздүн башкы бетинен эң көп баш баккан сайттарыңызды ачыңыз.</translation> <translation id="4954445889641385956">Издеңиз же URL'ди териңиз</translation> <translation id="5234725349196694896">Chrome'до cүйүктүү издөө каражаттарыңыз менен издеңиз.</translation> <translation id="5277852985315196237">Издеңиз же URL'ди териңиз</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Ыкчам аракеттер</translation> <translation id="6336802729091778259">Chrome Dino оюну</translation> <translation id="6663288906398689853">Издөө</translation> +<translation id="6691821786147477657">Жаңы нерсени издеп же iPad түзмөгүңүздүн башкы бетинен эң көп баш баккан сайттарыңызды ачыңыз.</translation> <translation id="6855322554930231468">Издөө</translation> <translation id="7010831364920321713">Жашыруун издөө</translation> <translation id="7048549665319929185">Издеңиз же URL'ди териңиз</translation> <translation id="7317302007099170473">QR кодун скандоо</translation> <translation id="744668050028871192">Издөө</translation> +<translation id="7730705312376865830">Chrome ыкчам баскычтары</translation> <translation id="8104498668011127805">Chrome Dino оюнун ачуу</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Жашыруун издөө</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lt.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lt.xtb index 67a2a11..218d3d3 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lt.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lt.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Paieška balsu naršyklėje „Chrome“</translation> <translation id="405442954313519726">Ieškokite arba naršykite naujame skirtuke, inkognito režimu, balsu arba naudodami QR kodą.</translation> <translation id="4557098988773644458">Eiti į „Chrome“ dinozauro žaidimą</translation> +<translation id="4678859075583681103">Pradėkite naują paiešką arba atidarykite dažniausiai lankomas svetaines „iPhone“ pagrindiniame puslapyje.</translation> <translation id="4954445889641385956">Ieškokite arba įveskite URL</translation> <translation id="5234725349196694896">Ieškokite naršyklėje „Chrome“ naudodami mėgstamiausią paieškos variklį.</translation> <translation id="5277852985315196237">Ieškokite arba įveskite URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Spartieji veiksmai</translation> <translation id="6336802729091778259">„Chrome“ dinozauro žaidimas</translation> <translation id="6663288906398689853">Paieška</translation> +<translation id="6691821786147477657">Pradėkite naują paiešką arba atidarykite dažniausiai lankomas svetaines „iPad“ pagrindiniame puslapyje.</translation> <translation id="6855322554930231468">Paieška</translation> <translation id="7010831364920321713">Paieška inkognito režimu</translation> <translation id="7048549665319929185">Ieškokite arba įveskite URL</translation> <translation id="7317302007099170473">QR kodo nuskaitymas</translation> <translation id="744668050028871192">Paieška</translation> +<translation id="7730705312376865830">„Chrome“ spartieji klavišai</translation> <translation id="8104498668011127805">Eiti į „Chrome“ dinozauro žaidimą</translation> <translation id="8150601371542319992">Objektyvas</translation> <translation id="8171952085734471362">Paieška inkognito režimu</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ms.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ms.xtb index 23d9f064..a300dd5 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ms.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ms.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Cari dalam Chrome menggunakan suara anda.</translation> <translation id="405442954313519726">Cari atau navigasi dalam tab baharu, dalam mod Inkognito, menggunakan suara anda atau dengan kod QR.</translation> <translation id="4557098988773644458">Lompat ke Permainan Dino Chrome</translation> +<translation id="4678859075583681103">Mulakan carian baharu atau buka laman yang paling kerap anda lawati daripada halaman utama iPhone anda.</translation> <translation id="4954445889641385956">Cari atau taip URL</translation> <translation id="5234725349196694896">Cari dalam Chrome menggunakan enjin carian kegemaran anda.</translation> <translation id="5277852985315196237">Cari atau taip URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Tindakan Pantas</translation> <translation id="6336802729091778259">Permainan Dino Chrome</translation> <translation id="6663288906398689853">Cari</translation> +<translation id="6691821786147477657">Mulakan carian baharu atau buka laman yang paling kerap anda lawati daripada halaman utama iPad anda.</translation> <translation id="6855322554930231468">Cari</translation> <translation id="7010831364920321713">Carian Inkognito</translation> <translation id="7048549665319929185">Cari atau taip URL</translation> <translation id="7317302007099170473">Imbas Kod QR</translation> <translation id="744668050028871192">Cari</translation> +<translation id="7730705312376865830">Pintasan Chrome</translation> <translation id="8104498668011127805">Lompat ke Permainan Dino Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Carian Inkognito</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_my.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_my.xtb index 10f0a3b1..b1ad293 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_my.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_my.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">သင့်အသံဖြင့် Chrome တွင် ရှာဖွေနိုင်သည်။</translation> <translation id="405442954313519726">သင်၏အသံ (သို့) QR ကုဒ် အသုံးပြုပြီး ရုပ်ဖျက်မုဒ်ရှိ တဘ်အသစ်တွင် ရှာဖွေနိုင်သည် (သို့) ဝင်ကြည့်နိုင်သည်။</translation> <translation id="4557098988773644458">Chrome Dino ဂိမ်းသို့ တိုက်ရိုက်ဝင်ရန်</translation> +<translation id="4678859075583681103">ရှာဖွေမှုအသစ်တစ်ခု စတင်ရန် (သို့) iPhone ပင်မစာမျက်နှာမှ သင်အများဆုံးဝင်ကြည့်သည့် ဝဘ်ဆိုက်များကို ဖွင့်ရန်။</translation> <translation id="4954445889641385956">ရှာရန် သို့မဟုတ် URL ထည့်ရန်</translation> <translation id="5234725349196694896">သင့်စိတ်ကြိုက်ရှာဖွေရေးအင်ဂျင်ဖြင့် Chrome တွင် ရှာဖွေနိုင်သည်။</translation> <translation id="5277852985315196237">ရှာရန် သို့မဟုတ် URL ထည့်ရန်</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">အမြန် လုပ်ဆောင်ချက်များ</translation> <translation id="6336802729091778259">Chrome Dino ဂိမ်း</translation> <translation id="6663288906398689853">ရှာရန်</translation> +<translation id="6691821786147477657">ရှာဖွေမှုအသစ်တစ်ခု စတင်ရန် (သို့) iPad ပင်မစာမျက်နှာမှ သင်အများဆုံးဝင်ကြည့်သည့် ဝဘ်ဆိုက်များကို ဖွင့်ရန်။</translation> <translation id="6855322554930231468">ရှာရန်</translation> <translation id="7010831364920321713">ရုပ်ဖျက်မုဒ်ဖြင့် ရှာရန်</translation> <translation id="7048549665319929185">ရှာရန် သို့မဟုတ် URL ထည့်ရန်</translation> <translation id="7317302007099170473">QR ကုဒ်ကို စကင်ဖတ်ရန်</translation> <translation id="744668050028871192">ရှာရန်</translation> +<translation id="7730705312376865830">Chrome ဖြတ်လမ်းလင့်ခ်များ</translation> <translation id="8104498668011127805">Chrome Dino ဂိမ်းသို့ တိုက်ရိုက်ဝင်ရန်</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">ရုပ်ဖျက်မုဒ်ဖြင့် ရှာရန်</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb index a3730ee..c8d7aba 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">बोलेरै Chrome मा खोज्नुहोस्।</translation> <translation id="405442954313519726">बोलेर वा QR कोड प्रयोग गरेर इन्कोग्निटो मोडमा कुनै कुरा खोज्नुहोस् वा नयाँ ट्याबमा जानुहोस्।</translation> <translation id="4557098988773644458">Chrome Dino गेम खेल्नुहोस्</translation> +<translation id="4678859075583681103">iPhone को होमपेजमा नयाँ खोज सुरु गर्नुहोस् वा आफूले सबैभन्दा प्रयोग गर्ने साइटहरू खोल्नुहोस्।</translation> <translation id="4954445889641385956">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> <translation id="5234725349196694896">Chrome मा आफूलाई मन पर्ने सर्च इन्जिन प्रयोग गरी खोज्नुहोस्।</translation> <translation id="5277852985315196237">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">द्रुत कारबाहीहरू</translation> <translation id="6336802729091778259">Chrome Dino गेम</translation> <translation id="6663288906398689853">खोज्नुहोस्</translation> +<translation id="6691821786147477657">iPad को होमपेजमा नयाँ खोज सुरु गर्नुहोस् वा आफूले सबैभन्दा प्रयोग गर्ने साइटहरू खोल्नुहोस्।</translation> <translation id="6855322554930231468">खोज्नुहोस्</translation> <translation id="7010831364920321713">इन्कोग्निटो खोज</translation> <translation id="7048549665319929185">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation> <translation id="7317302007099170473">QR कोड स्क्यान गर्नुहोस्</translation> <translation id="744668050028871192">खोज्नुहोस्</translation> +<translation id="7730705312376865830">Chrome का सर्टकटहरू</translation> <translation id="8104498668011127805">Chrome Dino गेम खेल्नुहोस्</translation> <translation id="8150601371542319992">लेन्स</translation> <translation id="8171952085734471362">इन्कोग्निटो खोज</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_pa.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_pa.xtb index 3245d70..a9239ea9 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_pa.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_pa.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">ਆਪਣੀ ਅਵਾਜ਼ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ Chrome ਵਿੱਚ ਖੋਜੋ।</translation> <translation id="405442954313519726">ਆਪਣੀ ਆਵਾਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜਾਂ QR ਕੋਡ ਨਾਲ, ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਇੱਕ ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਜੋ ਜਾਂ ਉਸ 'ਤੇ ਨੈਵੀਗੇਟ ਕਰੋ।</translation> <translation id="4557098988773644458">Chrome Dino ਗੇਮ 'ਤੇ ਜਾਓ</translation> +<translation id="4678859075583681103">ਕੋਈ ਨਵੀਂ ਖੋਜ ਸ਼ੁਰੂ ਕਰੋ ਜਾਂ ਆਪਣੇ iPhone ਦੇ ਹੋਮਪੇਜ ਤੋਂ ਆਪਣੇ ਵੱਲੋਂ ਸਭ ਤੋਂ ਵੱਧ ਦੇਖੀਆਂ ਗਈਆਂ ਸਾਈਟਾਂ ਖੋਲ੍ਹੋ।</translation> <translation id="4954445889641385956">ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation> <translation id="5234725349196694896">ਆਪਣੇ ਮਨਪਸੰਦ ਖੋਜ ਇੰਜਣ ਨਾਲ Chrome ਵਿੱਚ ਖੋਜੋ।</translation> <translation id="5277852985315196237">ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation> @@ -20,11 +21,13 @@ <translation id="6179961764474023795">ਤਤਕਾਲ ਕਾਰਵਾਈਆਂ</translation> <translation id="6336802729091778259">Chrome Dino ਗੇਮ</translation> <translation id="6663288906398689853">ਖੋਜੋ</translation> +<translation id="6691821786147477657">ਕੋਈ ਨਵੀਂ ਖੋਜ ਸ਼ੁਰੂ ਕਰੋ ਜਾਂ ਆਪਣੇ iPad ਦੇ ਹੋਮਪੇਜ ਤੋਂ ਆਪਣੇ ਵੱਲੋਂ ਸਭ ਤੋਂ ਵੱਧ ਦੇਖੀਆਂ ਗਈਆਂ ਸਾਈਟਾਂ ਖੋਲ੍ਹੋ।</translation> <translation id="6855322554930231468">ਖੋਜੋ</translation> <translation id="7010831364920321713">ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਖੋਜੋ</translation> <translation id="7048549665319929185">ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation> <translation id="7317302007099170473">QR ਕੋਡ ਸਕੈਨ ਕਰੋ</translation> <translation id="744668050028871192">ਖੋਜੋ</translation> +<translation id="7730705312376865830">Chrome ਸ਼ਾਰਟਕੱਟ</translation> <translation id="8104498668011127805">Chrome Dino ਗੇਮ 'ਤੇ ਜਾਓ</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਖੋਜੋ</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb index b8e7362..a27b494 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Вводите поисковые запросы в Chrome с помощью голосовых команд.</translation> <translation id="405442954313519726">Вводите запросы, пользуйтесь голосовым поиском, переключайтесь в режим инкогнито и открывайте веб-страницы по QR-коду.</translation> <translation id="4557098988773644458">Удобный запуск игры Chrome Dino</translation> +<translation id="4678859075583681103">Выполняйте поиск и переходите на сайты, которые вы открываете чаще всего, с главной страницы на вашем iPhone.</translation> <translation id="4954445889641385956">Введите запрос или URL</translation> <translation id="5234725349196694896">Пользуйтесь любимой поисковой системой в Chrome.</translation> <translation id="5277852985315196237">Введите запрос или URL</translation> @@ -20,11 +21,13 @@ <translation id="6179961764474023795">Панель действий</translation> <translation id="6336802729091778259">Игра Chrome Dino</translation> <translation id="6663288906398689853">Поиск</translation> +<translation id="6691821786147477657">Выполняйте поиск и переходите на сайты, которые вы открываете чаще всего, с главной страницы на вашем iPad.</translation> <translation id="6855322554930231468">Поиск</translation> <translation id="7010831364920321713">Поиск в режиме инкогнито</translation> <translation id="7048549665319929185">Введите запрос или URL</translation> <translation id="7317302007099170473">Сканировать QR-код</translation> <translation id="744668050028871192">Поиск</translation> +<translation id="7730705312376865830">Ярлыки Chrome</translation> <translation id="8104498668011127805">Запустить игру Chrome Dino</translation> <translation id="8150601371542319992">Объектив</translation> <translation id="8171952085734471362">Поиск в режиме инкогнито</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sl.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sl.xtb index b67189324..8a2e4a5 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sl.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sl.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Iščite v Chromu z glasom.</translation> <translation id="405442954313519726">Iskanje ali pomikanje na novem zavihku, v anonimnem načinu, z govorom ali s kodo QR.</translation> <translation id="4557098988773644458">Začetek igranja igre Dino za Chrome</translation> +<translation id="4678859075583681103">Začnite novo iskanje ali odprite najpogosteje obiskana spletna mesta na domači strani iPhona.</translation> <translation id="4954445889641385956">Iskanje ali vnos URL-ja</translation> <translation id="5234725349196694896">Iščite v Chromu s priljubljenim iskalnikom.</translation> <translation id="5277852985315196237">Poiščite ali vnesite URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Hitra dejanja</translation> <translation id="6336802729091778259">Igra Dino za Chrome</translation> <translation id="6663288906398689853">Iskanje</translation> +<translation id="6691821786147477657">Začnite novo iskanje ali odprite najpogosteje obiskana spletna mesta na domači strani iPada.</translation> <translation id="6855322554930231468">Iskanje</translation> <translation id="7010831364920321713">Anonimno iskanje</translation> <translation id="7048549665319929185">Poiščite ali vnesite URL</translation> <translation id="7317302007099170473">Optično branje kode QR</translation> <translation id="744668050028871192">Iskanje</translation> +<translation id="7730705312376865830">Bližnjice za Chrome</translation> <translation id="8104498668011127805">Začetek igranja igre Dino za Chrome</translation> <translation id="8150601371542319992">Lens</translation> <translation id="8171952085734471362">Anonimno iskanje</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr-Latn.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr-Latn.xtb index 32b264f7e..ac59de6 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr-Latn.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr-Latn.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Pretražujte u Chrome-u glasom.</translation> <translation id="405442954313519726">Pomoću glasa ili QR koda pretražujte na novoj kartici ili se krećite po njoj u režimu bez arhiviranja.</translation> <translation id="4557098988773644458">Zaigrajte igru Chrome dinosaurus</translation> +<translation id="4678859075583681103">Pokrenite novu pretragu ili otvorite najposećenije sajtove sa početne stranice iPhone-a.</translation> <translation id="4954445889641385956">Pretražite ili unesite URL</translation> <translation id="5234725349196694896">Pretražujte u Chrome-u pomoću omiljenog pretraživača.</translation> <translation id="5277852985315196237">Pretražite ili unesite URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Brze radnje</translation> <translation id="6336802729091778259">Igra Chrome dinosaurus</translation> <translation id="6663288906398689853">Pretraga</translation> +<translation id="6691821786147477657">Pokrenite novu pretragu ili otvorite najposećenije sajtove sa početne stranice iPad-a.</translation> <translation id="6855322554930231468">Pretraga</translation> <translation id="7010831364920321713">Pretraga bez arhiviranja</translation> <translation id="7048549665319929185">Pretražite ili unesite URL</translation> <translation id="7317302007099170473">Skenirajte QR kôd</translation> <translation id="744668050028871192">Pretraga</translation> +<translation id="7730705312376865830">Chrome prečice</translation> <translation id="8104498668011127805">Zaigrajte igru Chrome dinosaurus</translation> <translation id="8150601371542319992">Objektiv</translation> <translation id="8171952085734471362">Pretraga bez arhiviranja</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr.xtb index 90ca6d8..50512a7 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_sr.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">Претражујте у Chrome-у гласом.</translation> <translation id="405442954313519726">Помоћу гласа или QR кода претражујте на новој картици или се крећите по њој у режиму без архивирања.</translation> <translation id="4557098988773644458">Заиграјте игру Chrome диносаурус</translation> +<translation id="4678859075583681103">Покрените нову претрагу или отворите најпосећеније сајтове са почетне странице iPhone-а.</translation> <translation id="4954445889641385956">Претражите или унесите URL</translation> <translation id="5234725349196694896">Претражујте у Chrome-у помоћу омиљеног претраживача.</translation> <translation id="5277852985315196237">Претражите или унесите URL</translation> @@ -20,12 +21,14 @@ <translation id="6179961764474023795">Брзе радње</translation> <translation id="6336802729091778259">Игра Chrome диносаурус</translation> <translation id="6663288906398689853">Претрага</translation> +<translation id="6691821786147477657">Покрените нову претрагу или отворите најпосећеније сајтове са почетне странице iPad-а.</translation> <translation id="6855322554930231468">Претрага</translation> <translation id="7010831364920321713">Претрага без архивирања</translation> <translation id="7048549665319929185">Претражите или унесите URL</translation> <translation id="7317302007099170473">Скенирајте QR кôд</translation> <translation id="744668050028871192">Претрага</translation> +<translation id="7730705312376865830">Chrome пречице</translation> <translation id="8104498668011127805">Заиграјте игру Chrome диносаурус</translation> <translation id="8150601371542319992">Објектив</translation> <translation id="8171952085734471362">Претрага без архивирања</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ur.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ur.xtb index b6a8398..5c098ade 100644 --- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ur.xtb +++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ur.xtb
@@ -12,6 +12,7 @@ <translation id="3798529146539130967">اپنی آواز کا استعمال کرتے ہوئے Chrome میں تلاش کریں۔</translation> <translation id="405442954313519726">نئے ٹیب میں، پوشیدگی وضع میں، اپنی آواز سے یا QR کوڈ سے تلاش کریں یا نیویگيٹ کریں۔</translation> <translation id="4557098988773644458">Chrome ڈائنوسار گیم کھیلیں</translation> +<translation id="4678859075583681103">نئی تلاش شروع کریں یا اپنے iPhone کے ہوم پیج سے اپنی سب سے زیادہ ملاحظہ کردہ سائٹس کو کھولیں۔</translation> <translation id="4954445889641385956">URL تلاش یا ٹائپ کریں</translation> <translation id="5234725349196694896">اپنے پسندیدہ سرچ انجن کے ساتھ Chrome میں تلاش کریں۔</translation> <translation id="5277852985315196237">URL تلاش یا ٹائپ کریں</translation> @@ -20,11 +21,13 @@ <translation id="6179961764474023795">فوری کارروائیاں</translation> <translation id="6336802729091778259">Chrome ڈائنوسار گیم</translation> <translation id="6663288906398689853">تلاش کریں</translation> +<translation id="6691821786147477657">نئی تلاش شروع کریں یا اپنے iPad ہوم پیج سے اپنی سب سے زیادہ ملاحظہ کردہ سائٹس کو کھولیں۔</translation> <translation id="6855322554930231468">تلاش</translation> <translation id="7010831364920321713">پوشیدگی تلاش</translation> <translation id="7048549665319929185">تلاش یا URL ٹائپ کریں</translation> <translation id="7317302007099170473">QR کوڈ اسکین کریں</translation> <translation id="744668050028871192">تلاش کریں</translation> +<translation id="7730705312376865830">Chrome کے شارٹ کٹس</translation> <translation id="8104498668011127805">Chrome ڈائنوسار گیم کھیلیں</translation> <translation id="8150601371542319992">لینز</translation> <translation id="8171952085734471362">پوشیدگی تلاش</translation>
diff --git a/ios/web/public/session/crw_session_certificate_policy_cache_storage.h b/ios/web/public/session/crw_session_certificate_policy_cache_storage.h index ced67b7..c1a000d25 100644 --- a/ios/web/public/session/crw_session_certificate_policy_cache_storage.h +++ b/ios/web/public/session/crw_session_certificate_policy_cache_storage.h
@@ -17,6 +17,11 @@ #pragma mark - CRWSessionCertificateStorage namespace web { +namespace proto { +class CertificateStorage; +class CertificatesCacheStorage; +} // namespace proto + // Serialization keys used in CRWSessionCertificateStorage's NSCoding // implementation. extern NSString* const kCertificateSerializationKey; @@ -39,6 +44,12 @@ NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; +// Convenience initializer that creates an instance from proto representation. +- (instancetype)initWithProto:(const web::proto::CertificateStorage&)storage; + +// Serializes the CRWSessionCertificateStorage into `storage`. +- (void)serializeToProto:(web::proto::CertificateStorage&)storage; + // The certificate represented by this storage. @property(nonatomic, readonly) net::X509Certificate* certificate; // The hostname of the page that issued `certificate`. @@ -59,6 +70,13 @@ // A serializable representation of a list of allowed certificates. @interface CRWSessionCertificatePolicyCacheStorage : NSObject <NSCoding> +// Convenience initializer that creates an instance from proto representation. +- (instancetype)initWithProto: + (const web::proto::CertificatesCacheStorage&)storage; + +// Serializes the CRWSessionCertificatePolicyCacheStorage into `storage`. +- (void)serializeToProto:(web::proto::CertificatesCacheStorage&)storage; + // The certificate policy storages for this session. @property(nonatomic, strong) NSSet<CRWSessionCertificateStorage*>* certificateStorages;
diff --git a/ios/web/public/session/session_certificate_policy_cache.h b/ios/web/public/session/session_certificate_policy_cache.h index fe91b75..59314b02 100644 --- a/ios/web/public/session/session_certificate_policy_cache.h +++ b/ios/web/public/session/session_certificate_policy_cache.h
@@ -5,8 +5,6 @@ #ifndef IOS_WEB_PUBLIC_SESSION_SESSION_CERTIFICATE_POLICY_CACHE_H_ #define IOS_WEB_PUBLIC_SESSION_SESSION_CERTIFICATE_POLICY_CACHE_H_ -#import <Foundation/Foundation.h> - #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "net/cert/cert_status_flags.h" @@ -34,10 +32,8 @@ SessionCertificatePolicyCache& operator=( const SessionCertificatePolicyCache&) = delete; - // Transfers the allowed certificate information from this session to `cache`. - // - // TODO(crbug.com/1040566): Delete this method since - // RegisterAllowedCertificate already updates the CertificatePolicyCache. + // Transfers the allowed certificate information from this session to the + // web::CertificatePolicyCache. Used as part of session restoration. virtual void UpdateCertificatePolicyCache() const = 0; // Stores certificate information that a user has indicated should be allowed
diff --git a/ios/web/session/BUILD.gn b/ios/web/session/BUILD.gn index 6a425ec..8ac8d83 100644 --- a/ios/web/session/BUILD.gn +++ b/ios/web/session/BUILD.gn
@@ -32,6 +32,7 @@ "//ios/web/public", "//ios/web/public/security", "//ios/web/public/session", + "//ios/web/public/session/proto", "//ios/web/public/test", "//ios/web/public/test/fakes", "//ios/web/session",
diff --git a/ios/web/session/crw_session_certificate_policy_cache_storage.mm b/ios/web/session/crw_session_certificate_policy_cache_storage.mm index 0b15024..cf7dfe8 100644 --- a/ios/web/session/crw_session_certificate_policy_cache_storage.mm +++ b/ios/web/session/crw_session_certificate_policy_cache_storage.mm
@@ -5,6 +5,7 @@ #import "ios/web/public/session/crw_session_certificate_policy_cache_storage.h" #import "base/strings/sys_string_conversions.h" +#import "ios/web/public/session/proto/session.pb.h" #import "net/base/hash_value.h" #import "net/cert/x509_certificate.h" #import "net/cert/x509_util.h" @@ -45,6 +46,7 @@ } // namespace namespace web { + // CRWSessionCertificateStorage serialization keys. NSString* const kCertificateSerializationKey = @"CertificateSerializationKey"; NSString* const kHostSerializationKey = @"HostSerializationKey"; @@ -99,6 +101,32 @@ return self; } +- (instancetype)initWithProto:(const web::proto::CertificateStorage&)storage { + const std::string& certString = storage.certificate(); + scoped_refptr<net::X509Certificate> cert = + net::X509Certificate::CreateFromBytes( + base::make_span(reinterpret_cast<const uint8_t*>(certString.data()), + certString.size())); + + // Return nil if the cert cannot be decoded or the host is empty. + if (!cert || storage.host().empty()) { + return nil; + } + + return [self initWithCertificate:cert + host:storage.host() + status:storage.status()]; +} + +- (void)serializeToProto:(web::proto::CertificateStorage&)storage { + const base::StringPiece certString = + net::x509_util::CryptoBufferAsStringPiece(_certificate->cert_buffer()); + + storage.set_certificate(certString.data(), certString.size()); + storage.set_host(_host); + storage.set_status(_status); +} + #pragma mark Accessors - (net::X509Certificate*)certificate { @@ -157,6 +185,30 @@ @synthesize certificateStorages = _certificateStorages; +- (instancetype)initWithProto: + (const web::proto::CertificatesCacheStorage&)storage { + if ((self = [super init])) { + NSMutableSet<CRWSessionCertificateStorage*>* certificates = + [[NSMutableSet alloc] initWithCapacity:storage.certs_size()]; + for (const web::proto::CertificateStorage& certStorage : storage.certs()) { + CRWSessionCertificateStorage* cert = + [[CRWSessionCertificateStorage alloc] initWithProto:certStorage]; + + if (cert) { + [certificates addObject:cert]; + } + } + _certificateStorages = [certificates copy]; + } + return self; +} + +- (void)serializeToProto:(web::proto::CertificatesCacheStorage&)storage { + for (CRWSessionCertificateStorage* cert in _certificateStorages) { + [cert serializeToProto:*storage.add_certs()]; + } +} + #pragma mark NSCoding - (instancetype)initWithCoder:(NSCoder*)aDecoder {
diff --git a/ios/web/session/crw_session_certificate_policy_cache_storage_unittest.mm b/ios/web/session/crw_session_certificate_policy_cache_storage_unittest.mm index ccca8d5f..0948dab 100644 --- a/ios/web/session/crw_session_certificate_policy_cache_storage_unittest.mm +++ b/ios/web/session/crw_session_certificate_policy_cache_storage_unittest.mm
@@ -4,6 +4,7 @@ #import "ios/web/public/session/crw_session_certificate_policy_cache_storage.h" +#import "ios/web/public/session/proto/session.pb.h" #import "net/cert/x509_certificate.h" #import "net/cert/x509_util.h" #import "net/test/cert_test_util.h" @@ -17,6 +18,7 @@ #endif namespace { + // Checks for equality between `cert_storage1` and `cert_storage2`. bool CertStoragesAreEqual(CRWSessionCertificateStorage* cert_storage1, CRWSessionCertificateStorage* cert_storage2) { @@ -26,6 +28,7 @@ cert_storage1.host == cert_storage2.host && cert_storage1.status == cert_storage2.status; } + // Checks for equality between `cache_storage1` and `cache_storage2`. bool CacheStoragesAreEqual( CRWSessionCertificatePolicyCacheStorage* cache_storage1, @@ -40,6 +43,7 @@ } return true; } + } // namespace class CRWSessionCertificatePolicyCacheStorageTest : public PlatformTest { @@ -74,6 +78,18 @@ EXPECT_TRUE(CacheStoragesAreEqual(cache_storage_, decoded)); } +// Tests that converting CRWSessionCertificatePolicyCacheStorage to proto and +// back results in an equivalent storage. +TEST_F(CRWSessionCertificatePolicyCacheStorageTest, EncodeDecodeToProto) { + web::proto::CertificatesCacheStorage storage; + [cache_storage_ serializeToProto:storage]; + + CRWSessionCertificatePolicyCacheStorage* decoded = + [[CRWSessionCertificatePolicyCacheStorage alloc] initWithProto:storage]; + + EXPECT_TRUE(CacheStoragesAreEqual(cache_storage_, decoded)); +} + using CRWSessionCertificateStorageTest = PlatformTest; // Tests that unarchiving a CRWSessionCertificateStorage returns nil if the @@ -95,3 +111,16 @@ id decoded = [unarchiver decodeObjectForKey:NSKeyedArchiveRootObjectKey]; EXPECT_FALSE(decoded); } + +// Tests that unarchiving a CRWSessionCertificateStorage from proto returns nil +// if the certificate data does not correctly decode to a certificate. +TEST_F(CRWSessionCertificateStorageTest, InvalidCertDataFromProto) { + web::proto::CertificateStorage storage; + storage.set_certificate("not a cert"); + storage.set_host("host"); + storage.set_status(net::CERT_STATUS_INVALID); + + CRWSessionCertificateStorage* decoded = + [[CRWSessionCertificateStorage alloc] initWithProto:storage]; + EXPECT_FALSE(decoded); +}
diff --git a/media/audio/win/audio_low_latency_input_win.cc b/media/audio/win/audio_low_latency_input_win.cc index d12b35d..dbc97918 100644 --- a/media/audio/win/audio_low_latency_input_win.cc +++ b/media/audio/win/audio_low_latency_input_win.cc
@@ -979,6 +979,11 @@ return; } + TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("audio"), + "AudioInputCallback::OnData", "capture_time", + capture_time - base::TimeTicks(), "time_ticks_now", + base::TimeTicks::Now() - base::TimeTicks()); + // Get a cached AGC volume level which is updated once every second on the // audio manager thread. Note that, |volume| is also updated each time // SetVolume() is called through IPC by the render-side AGC.
diff --git a/net/cert/cert_verify_proc_builtin.cc b/net/cert/cert_verify_proc_builtin.cc index 080e3d7..e26d4fa 100644 --- a/net/cert/cert_verify_proc_builtin.cc +++ b/net/cert/cert_verify_proc_builtin.cc
@@ -548,9 +548,8 @@ intermediates.push_back(bssl::UpRef(path.certs[i]->cert_buffer())); } - scoped_refptr<X509Certificate> result = X509Certificate::CreateFromBuffer( - bssl::UpRef(target_cert->cert_buffer()), std::move(intermediates)); - // |target_cert| was already successfully parsed, so this should never fail. + scoped_refptr<X509Certificate> result = + target_cert->CloneWithDifferentIntermediates(std::move(intermediates)); DCHECK(result); return result;
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc index 9616eda..56245754 100644 --- a/net/cert/cert_verify_proc_unittest.cc +++ b/net/cert/cert_verify_proc_unittest.cc
@@ -1619,7 +1619,6 @@ ASSERT_NE(static_cast<X509Certificate*>(nullptr), verify_result.verified_cert.get()); - EXPECT_NE(google_full_chain, verify_result.verified_cert); EXPECT_TRUE( x509_util::CryptoBufferEqual(google_full_chain->cert_buffer(), verify_result.verified_cert->cert_buffer()));
diff --git a/net/cert/x509_cert_types.cc b/net/cert/x509_cert_types.cc index d857ae4..89722af 100644 --- a/net/cert/x509_cert_types.cc +++ b/net/cert/x509_cert_types.cc
@@ -13,10 +13,18 @@ CertPrincipal::CertPrincipal(const std::string& name) : common_name(name) {} +CertPrincipal::CertPrincipal(const CertPrincipal&) = default; + CertPrincipal::CertPrincipal(CertPrincipal&&) = default; CertPrincipal::~CertPrincipal() = default; +bool CertPrincipal::operator==(const CertPrincipal& other) const = default; + +bool CertPrincipal::EqualsForTesting(const CertPrincipal& other) const { + return *this == other; +} + bool CertPrincipal::ParseDistinguishedName( der::Input ber_name_data, PrintableStringHandling printable_string_handling) {
diff --git a/net/cert/x509_cert_types.h b/net/cert/x509_cert_types.h index e18b8dab..a31f6ccf0 100644 --- a/net/cert/x509_cert_types.h +++ b/net/cert/x509_cert_types.h
@@ -17,6 +17,7 @@ struct NET_EXPORT CertPrincipal { CertPrincipal(); explicit CertPrincipal(const std::string& name); + CertPrincipal(const CertPrincipal&); CertPrincipal(CertPrincipal&&); ~CertPrincipal(); @@ -35,6 +36,11 @@ // order: CN, O and OU and returns the first non-empty one found. std::string GetDisplayName() const; + // True if this object is equal to `other`. This is only exposed for testing, + // as a CertPrincipal object does not fully represent the X.509 Name it was + // parsed from, and comparing them likely does not mean what you want. + bool EqualsForTesting(const CertPrincipal& other) const; + // The different attributes for a principal, stored in UTF-8. They may be "". // Note that some of them can have several values. @@ -47,6 +53,11 @@ std::vector<std::string> organization_names; std::vector<std::string> organization_unit_names; std::vector<std::string> domain_components; + + private: + // Comparison operator is private and only defined for use by + // EqualsForTesting, see comment there for more details. + bool operator==(const CertPrincipal& other) const; }; } // namespace net
diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc index 78d6285..9f11880 100644 --- a/net/cert/x509_certificate.cc +++ b/net/cert/x509_certificate.cc
@@ -298,6 +298,21 @@ return results; } +scoped_refptr<X509Certificate> X509Certificate::CloneWithDifferentIntermediates( + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates) { + // If intermediates are the same, return another reference to the same + // object. Note that this only does a pointer equality comparison on the + // CRYPTO_BUFFERs, which is generally sufficient, but in some edge cases + // buffers have equal contents but with different addresses. This is + // acceptable as this is just an optimization. + if (intermediates == intermediate_ca_certs_) { + return this; + } + + return base::WrapRefCounted( + new X509Certificate(*this, std::move(intermediates))); +} + void X509Certificate::Persist(base::Pickle* pickle) const { DCHECK(cert_buffer_); // This would be an absolutely insane number of intermediates. @@ -710,9 +725,17 @@ cert_buffer_(std::move(cert_buffer)), intermediate_ca_certs_(std::move(intermediates)) {} +X509Certificate::X509Certificate( + const X509Certificate& other, + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates) + : parsed_(other.parsed_), + cert_buffer_(bssl::UpRef(other.cert_buffer_)), + intermediate_ca_certs_(std::move(intermediates)) {} + X509Certificate::~X509Certificate() = default; X509Certificate::ParsedFields::ParsedFields() = default; +X509Certificate::ParsedFields::ParsedFields(const ParsedFields&) = default; X509Certificate::ParsedFields::ParsedFields(ParsedFields&&) = default; X509Certificate::ParsedFields::~ParsedFields() = default;
diff --git a/net/cert/x509_certificate.h b/net/cert/x509_certificate.h index afd51d7..5ef19cf 100644 --- a/net/cert/x509_certificate.h +++ b/net/cert/x509_certificate.h
@@ -141,6 +141,13 @@ base::span<const uint8_t> data, int format); + // Return a X509Certificate object representing the same certificate but + // with a different set of intermediates. If |intermediates| are the same as + // |intermediate_ca_certs_|, it will return a reference to the same + // X509Certificate object rather than cloning. + scoped_refptr<X509Certificate> CloneWithDifferentIntermediates( + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates); + X509Certificate(const X509Certificate&) = delete; X509Certificate& operator=(const X509Certificate&) = delete; @@ -270,6 +277,7 @@ class ParsedFields { public: ParsedFields(); + ParsedFields(const ParsedFields&); ParsedFields(ParsedFields&&); ~ParsedFields(); @@ -298,6 +306,10 @@ bssl::UniquePtr<CRYPTO_BUFFER> cert_buffer, std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates); + // Copy |other|, except with a different set of intermediates. + X509Certificate(const X509Certificate& other, + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates); + ~X509Certificate(); // Verifies that |hostname| matches one of the certificate names or IP
diff --git a/net/cert/x509_certificate_unittest.cc b/net/cert/x509_certificate_unittest.cc index d92c417..21d44a4 100644 --- a/net/cert/x509_certificate_unittest.cc +++ b/net/cert/x509_certificate_unittest.cc
@@ -33,6 +33,8 @@ namespace net { +namespace { + // Certificates for test data. They're obtained with: // // $ openssl s_client -connect [host]:443 -showcerts > /tmp/host.pem < /dev/null @@ -110,6 +112,18 @@ } +void ExpectX509CertificateMembersEqual( + const scoped_refptr<X509Certificate>& a, + const scoped_refptr<X509Certificate>& b) { + EXPECT_TRUE(a->subject().EqualsForTesting(b->subject())); + EXPECT_TRUE(a->issuer().EqualsForTesting(b->issuer())); + EXPECT_EQ(a->valid_start(), b->valid_start()); + EXPECT_EQ(a->valid_expiry(), b->valid_expiry()); + EXPECT_EQ(a->serial_number(), b->serial_number()); +} + +} // namespace + TEST(X509CertificateTest, GoogleCertParsing) { scoped_refptr<X509Certificate> google_cert( X509Certificate::CreateFromBytes(google_der)); @@ -695,6 +709,79 @@ cert3->intermediate_buffers().size()); } +TEST(X509CertificateTest, CloneWithDifferentIntermediates) { + CertificateList certs = CreateCertificateListFromFile( + GetTestCertsDirectory(), "multi-root-chain1.pem", + X509Certificate::FORMAT_PEM_CERT_SEQUENCE); + ASSERT_EQ(4u, certs.size()); + + auto leaf_with_no_intermediates = certs[0]; + + { + auto cloned = + leaf_with_no_intermediates->CloneWithDifferentIntermediates({}); + // Intermediates are equal, so should return a reference to the same object. + EXPECT_EQ(leaf_with_no_intermediates.get(), cloned.get()); + } + { + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates; + intermediates.push_back(bssl::UpRef(certs[1]->cert_buffer())); + intermediates.push_back(bssl::UpRef(certs[2]->cert_buffer())); + auto cloned = leaf_with_no_intermediates->CloneWithDifferentIntermediates( + std::move(intermediates)); + ASSERT_TRUE(cloned); + EXPECT_NE(leaf_with_no_intermediates.get(), cloned.get()); + EXPECT_EQ(leaf_with_no_intermediates->cert_buffer(), cloned->cert_buffer()); + ExpectX509CertificateMembersEqual(leaf_with_no_intermediates, cloned); + ASSERT_EQ(2u, cloned->intermediate_buffers().size()); + EXPECT_TRUE(x509_util::CryptoBufferEqual( + certs[1]->cert_buffer(), cloned->intermediate_buffers()[0].get())); + EXPECT_TRUE(x509_util::CryptoBufferEqual( + certs[2]->cert_buffer(), cloned->intermediate_buffers()[1].get())); + } + + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> leaf_intermediates; + leaf_intermediates.push_back(bssl::UpRef(certs[1]->cert_buffer())); + leaf_intermediates.push_back(bssl::UpRef(certs[2]->cert_buffer())); + auto leaf_with_intermediates = X509Certificate::CreateFromBuffer( + bssl::UpRef(certs[0]->cert_buffer()), std::move(leaf_intermediates)); + ASSERT_TRUE(leaf_with_intermediates); + + { + auto cloned = leaf_with_intermediates->CloneWithDifferentIntermediates({}); + EXPECT_NE(leaf_with_intermediates.get(), cloned.get()); + EXPECT_EQ(leaf_with_intermediates->cert_buffer(), cloned->cert_buffer()); + ExpectX509CertificateMembersEqual(leaf_with_intermediates, cloned); + ASSERT_EQ(0u, cloned->intermediate_buffers().size()); + } + { + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates; + intermediates.push_back(bssl::UpRef(certs[1]->cert_buffer())); + intermediates.push_back(bssl::UpRef(certs[2]->cert_buffer())); + auto cloned = leaf_with_intermediates->CloneWithDifferentIntermediates( + std::move(intermediates)); + // Intermediates are equal, so should return a reference to the same object. + EXPECT_EQ(leaf_with_intermediates.get(), cloned.get()); + } + { + std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates; + intermediates.push_back(bssl::UpRef(certs[2]->cert_buffer())); + intermediates.push_back(bssl::UpRef(certs[1]->cert_buffer())); + auto cloned = leaf_with_intermediates->CloneWithDifferentIntermediates( + std::move(intermediates)); + // Intermediates are different (same buffers but in different order). + ASSERT_TRUE(cloned); + EXPECT_NE(leaf_with_intermediates.get(), cloned.get()); + EXPECT_EQ(leaf_with_intermediates->cert_buffer(), cloned->cert_buffer()); + ExpectX509CertificateMembersEqual(leaf_with_intermediates, cloned); + ASSERT_EQ(2u, cloned->intermediate_buffers().size()); + EXPECT_TRUE(x509_util::CryptoBufferEqual( + certs[2]->cert_buffer(), cloned->intermediate_buffers()[0].get())); + EXPECT_TRUE(x509_util::CryptoBufferEqual( + certs[1]->cert_buffer(), cloned->intermediate_buffers()[1].get())); + } +} + TEST(X509CertificateTest, Pickle) { bssl::UniquePtr<CRYPTO_BUFFER> google_cert_handle = x509_util::CreateCryptoBuffer(google_der);
diff --git a/net/ssl/client_cert_identity.cc b/net/ssl/client_cert_identity.cc index a3bfbff..a17f1557 100644 --- a/net/ssl/client_cert_identity.cc +++ b/net/ssl/client_cert_identity.cc
@@ -41,18 +41,7 @@ void ClientCertIdentity::SetIntermediates( std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates) { - // Allow UTF-8 inside PrintableStrings in client certificates. See - // crbug.com/770323. - // TODO(mattm): Perhaps X509Certificate should have a method to clone the - // X509Certificate but with different intermediates, to avoid reparsing here - // (and avoid needing to match the parsing options here with where the - // X509Certificate was initially created.) - X509Certificate::UnsafeCreateOptions options; - options.printable_string_is_utf8 = true; - cert_ = X509Certificate::CreateFromBufferUnsafeOptions( - bssl::UpRef(cert_->cert_buffer()), std::move(intermediates), options); - // |cert_->cert_buffer()| was already successfully parsed, so this should - // never fail. + cert_ = cert_->CloneWithDifferentIntermediates(std::move(intermediates)); DCHECK(cert_); }
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc index 6459844..b2d4065f 100644 --- a/services/network/public/cpp/url_request_mojom_traits.cc +++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -212,6 +212,7 @@ out->keepalive = data.keepalive(); out->browsing_topics = data.browsing_topics(); out->ad_auction_headers = data.ad_auction_headers(); + out->shared_storage_writable = data.shared_storage_writable(); out->has_user_gesture = data.has_user_gesture(); out->enable_load_timing = data.enable_load_timing(); out->enable_upload_progress = data.enable_upload_progress();
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h index f4ad62d0..088c805 100644 --- a/services/network/public/cpp/url_request_mojom_traits.h +++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -282,6 +282,9 @@ static bool ad_auction_headers(const network::ResourceRequest& request) { return request.ad_auction_headers; } + static bool shared_storage_writable(const network::ResourceRequest& request) { + return request.shared_storage_writable; + } static bool has_user_gesture(const network::ResourceRequest& request) { return request.has_user_gesture; }
diff --git a/services/network/public/cpp/url_request_mojom_traits_unittest.cc b/services/network/public/cpp/url_request_mojom_traits_unittest.cc index d8f69c4a..5db824bf 100644 --- a/services/network/public/cpp/url_request_mojom_traits_unittest.cc +++ b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
@@ -83,6 +83,7 @@ original.keepalive = true; original.browsing_topics = true; original.ad_auction_headers = true; + original.shared_storage_writable = true; original.has_user_gesture = false; original.enable_load_timing = true; original.enable_upload_progress = false;
diff --git a/services/network/public/mojom/url_request.mojom b/services/network/public/mojom/url_request.mojom index 7b684ab..c9a4e16 100644 --- a/services/network/public/mojom/url_request.mojom +++ b/services/network/public/mojom/url_request.mojom
@@ -329,6 +329,10 @@ // https://github.com/WICG/turtledove/blob/main/FLEDGE_browser_bidding_and_auction_API.md#step-3-get-response-blobs-to-browser bool ad_auction_headers; + // True if the request should send the `Shared-Storage-Writable` request + // header. + bool shared_storage_writable; + // True if the request was user initiated. bool has_user_gesture;
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 0efd0df8..de0ff1b0 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -233,7 +233,11 @@ #define SK_ENABLE_SKSL_IN_RASTER_PIPELINE -#define SK_USE_LEGACY_IMAGE_IMAGEFILTER +#define SK_USE_LEGACY_DROPSHADOW_IMAGEFILTER + +#define SK_USE_LEGACY_MERGE_IMAGEFILTER + +#define SK_USE_LEGACY_BLEND_IMAGEFILTER // Use the original std::vector based serializer // Remove when new streaming support operations has been verified.
diff --git a/testing/buildbot/autoshard_exceptions.json b/testing/buildbot/autoshard_exceptions.json index a7253a7..25a17cc 100644 --- a/testing/buildbot/autoshard_exceptions.json +++ b/testing/buildbot/autoshard_exceptions.json
@@ -3,17 +3,17 @@ "android-12-x64-rel": { "webview_instrumentation_test_apk": { "debug": { - "avg_num_builds_per_peak_hour": "83.0", - "estimated_bot_hour_delta": "-3.09", - "prev_avg_pending_time_sec": "168.9", - "prev_p50_pending_time_sec": "17.0", - "prev_p90_pending_time_sec": "424.0", - "prev_percentile_duration_minutes": "13.84", - "prev_shard_count": "12", - "simulated_max_shard_duration": "15.1", + "avg_num_builds_per_peak_hour": "81.0", + "estimated_bot_hour_delta": "3.02", + "prev_avg_pending_time_sec": "23.0", + "prev_p50_pending_time_sec": "1.0", + "prev_p90_pending_time_sec": "84.0", + "prev_percentile_duration_minutes": "15.29", + "prev_shard_count": "11", + "simulated_max_shard_duration": "14.02", "try_builder": "android-12-x64-rel" }, - "shards": "11" + "shards": "12" } } }, @@ -21,17 +21,17 @@ "linux-chromeos-rel": { "browser_tests": { "debug": { - "avg_num_builds_per_peak_hour": "84.0", - "estimated_bot_hour_delta": "16.64", - "prev_avg_pending_time_sec": "110.0", - "prev_p50_pending_time_sec": "12.0", - "prev_p90_pending_time_sec": "360.0", - "prev_percentile_duration_minutes": "16.45", - "prev_shard_count": "59", - "simulated_max_shard_duration": "14.71", + "avg_num_builds_per_peak_hour": "78.0", + "estimated_bot_hour_delta": "2.23", + "prev_avg_pending_time_sec": "109.1", + "prev_p50_pending_time_sec": "14.0", + "prev_p90_pending_time_sec": "365.0", + "prev_percentile_duration_minutes": "15.08", + "prev_shard_count": "66", + "simulated_max_shard_duration": "14.85", "try_builder": "linux-chromeos-rel" }, - "shards": "66" + "shards": "67" } }, "linux-lacros-tester-rel": { @@ -303,14 +303,14 @@ }, "interactive_ui_tests": { "debug": { - "avg_num_builds_per_peak_hour": "83.0", - "estimated_bot_hour_delta": "6.6", - "prev_avg_pending_time_sec": "92.5", - "prev_p50_pending_time_sec": "2.0", - "prev_p90_pending_time_sec": "305.0", - "prev_percentile_duration_minutes": "15.97", + "avg_num_builds_per_peak_hour": "80.0", + "estimated_bot_hour_delta": "6.42", + "prev_avg_pending_time_sec": "142.6", + "prev_p50_pending_time_sec": "15.0", + "prev_p90_pending_time_sec": "518.0", + "prev_percentile_duration_minutes": "16.18", "prev_shard_count": "17", - "simulated_max_shard_duration": "14.29", + "simulated_max_shard_duration": "14.48", "try_builder": "linux_chromium_asan_rel_ng" }, "shards": "19" @@ -345,19 +345,33 @@ }, "shards": "32" }, - "unit_tests": { + "interactive_ui_tests": { "debug": { - "avg_num_builds_per_peak_hour": "84.0", - "estimated_bot_hour_delta": "2.4", - "prev_avg_pending_time_sec": "81.1", - "prev_p50_pending_time_sec": "2.0", - "prev_p90_pending_time_sec": "260.0", - "prev_percentile_duration_minutes": "15.81", - "prev_shard_count": "2", - "simulated_max_shard_duration": "10.54", + "avg_num_builds_per_peak_hour": "80.0", + "estimated_bot_hour_delta": "2.62", + "prev_avg_pending_time_sec": "122.7", + "prev_p50_pending_time_sec": "9.0", + "prev_p90_pending_time_sec": "431.0", + "prev_percentile_duration_minutes": "15.07", + "prev_shard_count": "32", + "simulated_max_shard_duration": "14.61", "try_builder": "linux_chromium_tsan_rel_ng" }, - "shards": "3" + "shards": "33" + }, + "unit_tests": { + "debug": { + "avg_num_builds_per_peak_hour": "80.0", + "estimated_bot_hour_delta": "-2.36", + "prev_avg_pending_time_sec": "114.9", + "prev_p50_pending_time_sec": "1.0", + "prev_p90_pending_time_sec": "415.0", + "prev_percentile_duration_minutes": "10.24", + "prev_shard_count": "3", + "simulated_max_shard_duration": "15.36", + "try_builder": "linux_chromium_tsan_rel_ng" + }, + "shards": "2" }, "webkit_unit_tests": { "debug": { @@ -379,31 +393,31 @@ "Win10 Tests x64": { "updater_tests": { "debug": { - "avg_num_builds_per_peak_hour": "73.0", - "estimated_bot_hour_delta": "1.69", - "prev_avg_pending_time_sec": "65.3", - "prev_p50_pending_time_sec": "1.0", - "prev_p90_pending_time_sec": "237.0", - "prev_percentile_duration_minutes": "18.6", - "prev_shard_count": "1", - "simulated_max_shard_duration": "9.3", + "avg_num_builds_per_peak_hour": "75.0", + "estimated_bot_hour_delta": "-1.76", + "prev_avg_pending_time_sec": "200.3", + "prev_p50_pending_time_sec": "14.0", + "prev_p90_pending_time_sec": "669.0", + "prev_percentile_duration_minutes": "5.69", + "prev_shard_count": "2", + "simulated_max_shard_duration": "11.38", "try_builder": "win-rel" }, - "shards": "2" + "shards": "1" }, "updater_tests_system": { "debug": { - "avg_num_builds_per_peak_hour": "73.0", - "estimated_bot_hour_delta": "1.7", - "prev_avg_pending_time_sec": "65.7", - "prev_p50_pending_time_sec": "2.0", - "prev_p90_pending_time_sec": "238.0", - "prev_percentile_duration_minutes": "18.91", - "prev_shard_count": "1", - "simulated_max_shard_duration": "9.46", + "avg_num_builds_per_peak_hour": "75.0", + "estimated_bot_hour_delta": "-1.77", + "prev_avg_pending_time_sec": "201.0", + "prev_p50_pending_time_sec": "15.0", + "prev_p90_pending_time_sec": "668.0", + "prev_percentile_duration_minutes": "5.87", + "prev_shard_count": "2", + "simulated_max_shard_duration": "11.74", "try_builder": "win-rel" }, - "shards": "2" + "shards": "1" } } }
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 57b5751..b0d2c730 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -10668,7 +10668,7 @@ } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 11 + "shards": 12 }, "test": "webview_instrumentation_test_apk", "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 9f02a66d7..13f8e6a 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -3582,7 +3582,7 @@ } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 66 + "shards": 67 }, "test": "browser_tests", "test_id_prefix": "ninja://chrome/test:browser_tests/"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 588028f..da812cd 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -9464,7 +9464,7 @@ } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 32 + "shards": 33 }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" @@ -10057,7 +10057,7 @@ } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 + "shards": 2 }, "test": "unit_tests", "test_id_prefix": "ninja://chrome/test:unit_tests/"
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index dff2cd8d..ee6c71e 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -1742,7 +1742,7 @@ } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 + "shards": 1 }, "test": "updater_tests", "test_id_prefix": "ninja://chrome/updater:updater_tests/" @@ -1761,7 +1761,7 @@ } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 + "shards": 1 }, "test": "updater_tests_system", "test_id_prefix": "ninja://chrome/updater:updater_tests_system/"
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py index 1437b50..0c165e7 100755 --- a/testing/scripts/run_finch_smoke_tests_android.py +++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -67,6 +67,7 @@ from devil import devil_env from devil.android import apk_helper from devil.android import device_temp_file +from devil.android import device_utils from devil.android import flag_changer from devil.android import logcat_monitor from devil.android.tools import script_common @@ -80,7 +81,6 @@ from skia_gold_common.skia_gold_properties import SkiaGoldProperties from skia_gold_common import skia_gold_session_manager from skia_gold_infra import finch_skia_gold_utils -from run_wpt_tests import get_device ANDROID_WEBLAYER = 'android_weblayer' LOGCAT_TAG = 'finch_test_runner_py' @@ -1180,6 +1180,27 @@ yield +@contextlib.contextmanager +def get_device(args): + try: + instance = None + if args.avd_config: + avd_config = avd.AvdConfig(args.avd_config) + logger.info('Installing emulator from %s', args.avd_config) + avd_config.Install() + + instance = avd_config.CreateInstance() + instance.Start(writable_system=True, + window=args.emulator_window, + require_fast_start=True) + + devices = device_utils.DeviceUtils.HealthyDevices() + yield devices[0] if len(devices) > 0 else None + finally: + if instance: + instance.Stop() + + def main(args): TEST_CASES.update( {p.product_name(): p
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 549191c..c8ddcc939 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1401,6 +1401,27 @@ ] } ], + "AutofillOnlyCacheIsAutofilledOnFill": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillOnlyCacheIsAutofilledOnFill" + ] + } + ] + } + ], "AutofillParseAsync": [ { "platforms": [ @@ -1469,13 +1490,15 @@ "AutofillSurveys": [ { "platforms": [ + "chromeos", + "chromeos_lacros", "mac", "windows", "linux" ], "experiments": [ { - "name": "Card_20230511", + "name": "Card_20230522", "params": { "en_site_id": "F2fsskHvB0ugnJ3q1cK0NXLjUaK5", "probability": "1.0" @@ -1489,7 +1512,7 @@ ] }, { - "name": "Password_20230511", + "name": "Password_20230522", "params": { "en_site_id": "6VQ4NCCaq0ugnJ3q1cK0TR13rB8t", "probability": "1.0" @@ -1503,7 +1526,7 @@ ] }, { - "name": "Address_20230511", + "name": "Address_20230522", "params": { "en_site_id": "qQW9c2ho10ugnJ3q1cK0X48UQjZs", "probability": "1.0" @@ -5198,6 +5221,9 @@ "experiments": [ { "name": "Enabled_20230517", + "params": { + "enable_price_notification": "true" + }, "enable_features": [ "CommercePriceTracking", "IPH_PriceNotificationsWhileBrowsing", @@ -9789,6 +9815,24 @@ ] } ], + "ParentalControlsOnLinuxMacWindows": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20230515", + "enable_features": [ + "EnableSupervisionOnDesktopAndIOS", + "FilterWebsitesForSupervisedUsersOnDesktopAndIOS" + ] + } + ] + } + ], "ParkableImages": [ { "platforms": [ @@ -14353,6 +14397,28 @@ ] } ], + "VSyncDecoding": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "VSyncDecoding" + ] + } + ] + } + ], "VaapiVp8TemporalLayerEncoding": [ { "platforms": [ @@ -15285,6 +15351,28 @@ ] } ], + "WebRtcSendPacketBatch": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "WebRtcSendPacketBatch" + ] + } + ] + } + ], "WebRtcThreadsUseResourceEfficientType": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 8f5fff0..4ed5fd6 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -1644,6 +1644,17 @@ "WebRtcCombinedNetworkAndWorkerThread", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kVSyncDecoding, + "VSyncDecoding", + base::FEATURE_DISABLED_BY_DEFAULT); +const base::FeatureParam<base::TimeDelta> + kVSyncDecodingHiddenOccludedTickDuration{ + &kVSyncDecoding, "occluded_tick_duration", base::Hertz(10)}; + +BASE_FEATURE(kWebRtcSendPacketBatch, + "WebRtcSendPacketBatch", + base::FEATURE_DISABLED_BY_DEFAULT); + // Allow process isolation of iframes with the 'sandbox' attribute set. Whether // or not such an iframe will be isolated may depend on options specified with // the attribute. Note: At present, only iframes with origin-restricted
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 72524358..42ae8e6 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -894,6 +894,19 @@ // Combine WebRTC Network and Worker threads. More info at crbug.com/1373439. BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kWebRtcCombinedNetworkAndWorkerThread); +// Combine WebRTC Network and Worker threads. More info at crbug.com/1373439. +BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kWebRtcSendPacketBatch); + +// Feature flag for driving the Metronome by VSyncs instead of by timer. +BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kVSyncDecoding); +// Feature parameter controlling WebRTC VSyncDecoding tick durations during +// occluded tabs. +BLINK_COMMON_EXPORT extern const base::FeatureParam<base::TimeDelta> + kVSyncDecodingHiddenOccludedTickDuration; + +// Feature flag for batching sending of WebRTC RTP UDP packets. +BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kWebRtcSendPacketBatch); + BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kIsolateSandboxedIframes); enum class IsolateSandboxedIframesGrouping { // In this grouping, all isolated sandboxed iframes whose URLs share the same
diff --git a/third_party/blink/public/common/permissions_policy/permissions_policy.h b/third_party/blink/public/common/permissions_policy/permissions_policy.h index 16f25e65..9d6e4fe 100644 --- a/third_party/blink/public/common/permissions_policy/permissions_policy.h +++ b/third_party/blink/public/common/permissions_policy/permissions_policy.h
@@ -26,7 +26,6 @@ namespace blink { -class Request; class ResourceRequest; // Permissions Policy is a mechanism for controlling the availability of web @@ -252,7 +251,6 @@ mojom::PermissionsPolicyFeature feature) const; private: - friend class Request; friend class ResourceRequest; friend class PermissionsPolicyTest;
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 359f359..6c26083 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -284,6 +284,7 @@ "//services/viz/public/mojom", "//skia/public/mojom", "//third_party/blink/public/mojom/gpu", + "//third_party/blink/public/mojom/private_network_device", "//third_party/blink/public/mojom/quota", "//third_party/blink/public/mojom/runtime_feature_state", "//third_party/blink/public/mojom/service_worker:storage",
diff --git a/third_party/blink/public/mojom/private_network_device/BUILD.gn b/third_party/blink/public/mojom/private_network_device/BUILD.gn new file mode 100644 index 0000000..4e00292 --- /dev/null +++ b/third_party/blink/public/mojom/private_network_device/BUILD.gn
@@ -0,0 +1,27 @@ +# 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("//mojo/public/tools/bindings/mojom.gni") + +mojom("private_network_device") { + generate_java = true + + sources = [ "private_network_device.mojom" ] + + deps = [ + "//mojo/public/mojom/base", + "//services/network/public/mojom", + "//services/network/public/mojom:mojom_ip_address", + ] + + scramble_message_ids = false + + export_class_attribute = "BLINK_COMMON_EXPORT" + export_define = "BLINK_COMMON_IMPLEMENTATION=1" + export_header = "third_party/blink/public/common/common_export.h" + + export_class_attribute_blink = "PLATFORM_EXPORT" + export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1" + export_header_blink = "third_party/blink/renderer/platform/platform_export.h" +}
diff --git a/third_party/blink/public/mojom/private_network_device/DIR_METADATA b/third_party/blink/public/mojom/private_network_device/DIR_METADATA new file mode 100644 index 0000000..961484f --- /dev/null +++ b/third_party/blink/public/mojom/private_network_device/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//third_party/blink/renderer/modules/permissions/COMMON_METADATA"
diff --git a/third_party/blink/public/mojom/private_network_device/OWNERS b/third_party/blink/public/mojom/private_network_device/OWNERS new file mode 100644 index 0000000..008d711 --- /dev/null +++ b/third_party/blink/public/mojom/private_network_device/OWNERS
@@ -0,0 +1,4 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS + +file://chrome/browser/private_network_access/OWNERS
diff --git a/third_party/blink/public/mojom/private_network_device/private_network_device.mojom b/third_party/blink/public/mojom/private_network_device/private_network_device.mojom new file mode 100644 index 0000000..e6a9f12 --- /dev/null +++ b/third_party/blink/public/mojom/private_network_device/private_network_device.mojom
@@ -0,0 +1,24 @@ +// 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. + +module blink.mojom; + +import "services/network/public/mojom/ip_address.mojom"; + +// PrivateNetworkDevice represents a server on private/local network responding +// to requests from public websites. ID and name will defined by HTTP response +// header `Private-Network-Access-ID` and `Private-Network-Access-Name` for +// private network preflight requests. +struct PrivateNetworkDevice { + // Device ID defined in the HTTP response header `Private-Network-Access-ID` + // by the device itself. + string id; + + // Device name defined in the HTTP response header `Private-Network-Access-Name` + // by the device itself. + string name; + + // The IP address of the device. + network.mojom.IPAddress ip_address; +};
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 20ae21d..4b7d42d5 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1767,6 +1767,7 @@ LazyLoadImageObserver& EnsureLazyLoadImageObserver(); void IncrementNumberOfCanvases(); + unsigned GetNumberOfCanvases() const { return num_canvases_; } void ProcessJavaScriptUrl(const KURL&, scoped_refptr<const DOMWrapperWorld> world); @@ -2576,7 +2577,7 @@ bool is_vertical_scroll_enforced_ = false; // The number of canvas elements on the document - int num_canvases_ = 0; + unsigned num_canvases_ = 0; bool deferred_compositor_commit_is_allowed_ = false;
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc index c785ea0..ad305f0 100644 --- a/third_party/blink/renderer/core/fetch/fetch_manager.cc +++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -845,6 +845,8 @@ request.SetAdAuctionHeaders(fetch_request_data_->AdAuctionHeaders()); request.SetAttributionReportingEligibility( fetch_request_data_->AttributionReportingEligibility()); + request.SetSharedStorageWritable( + fetch_request_data_->SharedStorageWritable()); request.SetOriginalDestination(fetch_request_data_->OriginalDestination());
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.cc b/third_party/blink/renderer/core/fetch/fetch_request_data.cc index e2ae995..8577538 100644 --- a/third_party/blink/renderer/core/fetch/fetch_request_data.cc +++ b/third_party/blink/renderer/core/fetch/fetch_request_data.cc
@@ -232,6 +232,7 @@ request->keepalive_ = keepalive_; request->browsing_topics_ = browsing_topics_; request->ad_auction_headers_ = ad_auction_headers_; + request->shared_storage_writable_ = shared_storage_writable_; request->is_history_navigation_ = is_history_navigation_; request->window_id_ = window_id_; request->trust_token_params_ = trust_token_params_;
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.h b/third_party/blink/renderer/core/fetch/fetch_request_data.h index 4915b52..60eef44 100644 --- a/third_party/blink/renderer/core/fetch/fetch_request_data.h +++ b/third_party/blink/renderer/core/fetch/fetch_request_data.h
@@ -144,6 +144,11 @@ bool AdAuctionHeaders() const { return ad_auction_headers_; } void SetAdAuctionHeaders(bool b) { ad_auction_headers_ = b; } + bool SharedStorageWritable() const { return shared_storage_writable_; } + void SetSharedStorageWritable(bool shared_storage_writable) { + shared_storage_writable_ = shared_storage_writable; + } + bool IsHistoryNavigation() const { return is_history_navigation_; } void SetIsHistoryNavigation(bool b) { is_history_navigation_ = b; } @@ -225,6 +230,7 @@ bool keepalive_ = false; bool browsing_topics_ = false; bool ad_auction_headers_ = false; + bool shared_storage_writable_ = false; bool is_history_navigation_ = false; network::mojom::AttributionReportingEligibility attribution_reporting_eligibility_ =
diff --git a/third_party/blink/renderer/core/fetch/request.cc b/third_party/blink/renderer/core/fetch/request.cc index 6d1b997c9..69e7c0ff 100644 --- a/third_party/blink/renderer/core/fetch/request.cc +++ b/third_party/blink/renderer/core/fetch/request.cc
@@ -96,6 +96,7 @@ request->SetKeepalive(original->Keepalive()); request->SetBrowsingTopics(original->BrowsingTopics()); request->SetAdAuctionHeaders(original->AdAuctionHeaders()); + request->SetSharedStorageWritable(original->SharedStorageWritable()); request->SetIsHistoryNavigation(original->IsHistoryNavigation()); if (original->URLLoaderFactory()) { mojo::PendingRemote<network::mojom::blink::URLLoaderFactory> factory_clone; @@ -128,9 +129,9 @@ init->hasTargetAddressSpace() || init->hasCredentials() || init->hasCache() || init->hasRedirect() || init->hasIntegrity() || init->hasKeepalive() || init->hasBrowsingTopics() || - init->hasAdAuctionHeaders() || init->hasPriority() || - init->hasSignal() || init->hasDuplex() || init->hasPrivateToken() || - init->hasAttributionReporting(); + init->hasAdAuctionHeaders() || init->hasSharedStorageWritable() || + init->hasPriority() || init->hasSignal() || init->hasDuplex() || + init->hasPrivateToken() || init->hasAttributionReporting(); } static BodyStreamBuffer* ExtractBody(ScriptState* script_state, @@ -565,6 +566,16 @@ request->SetAdAuctionHeaders(init->adAuctionHeaders()); } + if (init->hasSharedStorageWritable()) { + if (!execution_context->IsSecureContext()) { + exception_state.ThrowTypeError( + "sharedStorageWritable: sharedStorage operations are only available" + " in secure contexts."); + return nullptr; + } + request->SetSharedStorageWritable(init->sharedStorageWritable()); + } + // "If |init|'s method member is present, let |method| be it and run these // substeps:" if (init->hasMethod()) {
diff --git a/third_party/blink/renderer/core/fetch/request_init.idl b/third_party/blink/renderer/core/fetch/request_init.idl index ab0af28d..b06b7121 100644 --- a/third_party/blink/renderer/core/fetch/request_init.idl +++ b/third_party/blink/renderer/core/fetch/request_init.idl
@@ -24,6 +24,7 @@ [RuntimeEnabled=PriorityHints] FetchPriority priority; [RuntimeEnabled=TopicsAPI, Exposed=Window] boolean browsingTopics; [RuntimeEnabled=FledgeBiddingAndAuctionServer, Exposed=Window] boolean adAuctionHeaders; + [RuntimeEnabled=SharedStorageAPI, Exposed=Window] boolean sharedStorageWritable; AbortSignal? signal; [RuntimeEnabled=FetchUploadStreaming] RequestDuplex duplex; [RuntimeEnabled=PrivateNetworkAccessPermissionPrompt] IPAddressSpace targetAddressSpace;
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index d498ed96..88db9fb 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -118,6 +118,24 @@ namespace blink { +// Controls whether canvases may start with acceleration disabled. This behavior +// is controlled by two params. When this feature is enabled, a newly created +// canvas will start with acceleration disabled if the following two +// requirements are met (per Document); +// 1. More than `kCanvasDisableAccelerationThresholdParam` canvases have been +// created. +// 2. The percent of canvases with acceleration disabled is >= +// `kCanvasDisableAccelerationPercentParam`. +BASE_FEATURE(kStartCanvasWithAccelerationDisabled, + "StartCanvasWithAccelerationDisabled", + base::FEATURE_ENABLED_BY_DEFAULT); +constexpr base::FeatureParam<int> kCanvasDisableAccelerationThresholdParam{ + &kStartCanvasWithAccelerationDisabled, + "canvas-disable-acceleration-threshold", 100}; +constexpr base::FeatureParam<int> kCanvasDisableAccelerationPercentParam{ + &kStartCanvasWithAccelerationDisabled, + "canvas-disable-acceleration-percent", 95}; + namespace { // This feature will only take effect if `kTwoCopyCanvasCapture` is also @@ -146,6 +164,71 @@ // than 2^20. constexpr uint32_t kMaximumCanvasSize = 2 << 20; +// Tracks whether canvases should start out with acceleration disabled. +class DisabledAccelerationCounterSupplement final + : public GarbageCollected<DisabledAccelerationCounterSupplement>, + public Supplement<Document> { + public: + static const char kSupplementName[]; + + static DisabledAccelerationCounterSupplement& From(Document& d) { + DisabledAccelerationCounterSupplement* supplement = + Supplement<Document>::From<DisabledAccelerationCounterSupplement>(d); + if (!supplement) { + supplement = + MakeGarbageCollected<DisabledAccelerationCounterSupplement>(d); + ProvideTo(d, supplement); + } + return *supplement; + } + + explicit DisabledAccelerationCounterSupplement(Document& d) + : Supplement<Document>(d), + disable_threshold_(kCanvasDisableAccelerationThresholdParam.Get()), + disable_percent_(kCanvasDisableAccelerationPercentParam.Get()) {} + + // Called when acceleration has been disabled on a canvas. + void IncrementDisabledCount() { + ++acceleration_disabled_count_; + UpdateAccelerationDisabled(); + } + + // Returns true if canvas acceleration should be disabled. + bool ShouldDisableAcceleration() { + UpdateAccelerationDisabled(); + return acceleration_disabled_; + } + + private: + void UpdateAccelerationDisabled() { + if (acceleration_disabled_) { + return; + } + if (acceleration_disabled_count_ < disable_threshold_) { + return; + } + if (acceleration_disabled_count_ * 100 / + GetSupplementable()->GetNumberOfCanvases() >= + disable_percent_) { + UMA_HISTOGRAM_BOOLEAN( + "Blink.Canvas.ForcingAllCanvasesToDisableAcceleration", true); + acceleration_disabled_ = true; + } + } + + // These are cached to allow for tests to use different values. + const unsigned disable_threshold_; + const unsigned disable_percent_; + + // Number of canvases with acceleration disabled. + unsigned acceleration_disabled_count_ = 0; + bool acceleration_disabled_ = false; +}; + +// static +const char DisabledAccelerationCounterSupplement::kSupplementName[] = + "DisabledAccelerationCounterSupplement"; + } // namespace HTMLCanvasElement::HTMLCanvasElement(Document& document) @@ -161,6 +244,11 @@ surface_layer_bridge_(nullptr), externally_allocated_memory_(0) { UseCounter::Count(document, WebFeature::kHTMLCanvasElement); + // Create DisabledAccelerationCounterSupplement now, as it may be needed at a + // time when garbage collected objects can not be created. + if (base::FeatureList::IsEnabled(kStartCanvasWithAccelerationDisabled)) { + DisabledAccelerationCounterSupplement::From(GetDocument()); + } GetDocument().IncrementNumberOfCanvases(); auto* execution_context = GetExecutionContext(); if (execution_context) { @@ -596,6 +684,10 @@ void HTMLCanvasElement::DisableAcceleration( std::unique_ptr<Canvas2DLayerBridge> unaccelerated_bridge_used_for_testing) { + if (base::FeatureList::IsEnabled(kStartCanvasWithAccelerationDisabled)) { + DisabledAccelerationCounterSupplement::From(GetDocument()) + .IncrementDisabledCount(); + } // Create and configure an unaccelerated Canvas2DLayerBridge. std::unique_ptr<Canvas2DLayerBridge> bridge; if (unaccelerated_bridge_used_for_testing) @@ -1287,9 +1379,27 @@ if (!context_provider_wrapper) return false; + if (context_ && + context_->CreationAttributes().will_read_frequently == + CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined && + base::FeatureList::IsEnabled(kStartCanvasWithAccelerationDisabled) && + DisabledAccelerationCounterSupplement::From(GetDocument()) + .ShouldDisableAcceleration()) { + return false; + } + return context_provider_wrapper->Utils()->Accelerated2DCanvasFeatureEnabled(); } +bool HTMLCanvasElement::ShouldDisableAccelerationBecauseOfReadback() const { + if (base::FeatureList::IsEnabled(kStartCanvasWithAccelerationDisabled) && + DisabledAccelerationCounterSupplement::From(GetDocument()) + .ShouldDisableAcceleration()) { + return true; + } + return false; +} + std::unique_ptr<Canvas2DLayerBridge> HTMLCanvasElement::Create2DLayerBridge( RasterMode raster_mode) { auto surface = std::make_unique<Canvas2DLayerBridge>(
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h index 49e4a701..521c600 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -75,6 +75,8 @@ typedef CanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContextOrImageBitmapRenderingContextOrGPUCanvasContext RenderingContext; +CORE_EXPORT BASE_DECLARE_FEATURE(kStartCanvasWithAccelerationDisabled); + // This contains the information of HTML Canvas Element, // There are four different types of rendering context this HTML Canvas can own. // It can be a 3D Context (WebGL or WebGL2), 2D Context, @@ -315,6 +317,8 @@ bool IsPlaceholder() const override { return IsOffscreenCanvasRegistered(); } + bool ShouldDisableAccelerationBecauseOfReadback() const; + protected: void DidMoveToNewDocument(Document& old_document) override; void DidRecalcStyle(const StyleRecalcChange change) override; @@ -343,7 +347,6 @@ static CanvasRenderingContextFactory* GetRenderingContextFactory(int); bool ShouldAccelerate() const; - void ParseAttribute(const AttributeModificationParams&) override; LayoutObject* CreateLayoutObject(const ComputedStyle&) override; bool AreAuthorShadowsAllowed() const override { return false; }
diff --git a/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_config.idl b/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_config.idl index 96c32611..2ecbb6b 100644 --- a/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_config.idl +++ b/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_config.idl
@@ -14,7 +14,6 @@ // For more information on why this is needed please see: // https://github.com/WICG/fenced-frame/issues/48#issuecomment-1245809738 constructor(USVString url); - readonly attribute FencedFrameConfigURL? url; readonly attribute FencedFrameConfigSize? width; readonly attribute FencedFrameConfigSize? height; void setSharedStorageContext(DOMString contextString);
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc index 8b66309..8cfa62a 100644 --- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc +++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -370,6 +370,16 @@ attribution_src_loader->GetRuntimeFeatures()); } + if (request.GetSharedStorageWritable()) { + auto* policy = GetPermissionsPolicy(); + if (!policy || + !request.IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy, mojom::blink::PermissionsPolicyFeature::kSharedStorage, + SecurityOrigin::Create(request.Url())->ToUrlOrigin())) { + request.SetSharedStorageWritable(false); + } + } + GetLocalFrameClient()->DispatchWillSendRequest(request); FrameScheduler* frame_scheduler = GetFrame()->GetFrameScheduler(); if (!for_redirect && frame_scheduler) {
diff --git a/third_party/blink/renderer/core/paint/image_painter.cc b/third_party/blink/renderer/core/paint/image_painter.cc index 718861a..cf285f3 100644 --- a/third_party/blink/renderer/core/paint/image_painter.cc +++ b/third_party/blink/renderer/core/paint/image_painter.cc
@@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/paint/scoped_paint_state.h" #include "third_party/blink/renderer/core/paint/timing/image_element_timing.h" #include "third_party/blink/renderer/core/paint/timing/paint_timing_detector.h" -#include "third_party/blink/renderer/platform/geometry/layout_point.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item_cache_skipper.h" #include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h" @@ -48,15 +47,15 @@ layout_image.GetDocument().GetExecutionContext())) return false; - LayoutSize layout_size = layout_image.ContentSize(); - gfx::Size image_size = image->Size(); + const PhysicalSize layout_size = layout_image.PhysicalContentBoxSize(); + const gfx::Size image_size = image->Size(); if (layout_size.IsEmpty() || image_size.IsEmpty()) return false; const double downscale_ratio_width = - image_size.width() / layout_size.Width().ToDouble(); + image_size.width() / layout_size.width.ToDouble(); const double downscale_ratio_height = - image_size.height() / layout_size.Height().ToDouble(); + image_size.height() / layout_size.height.ToDouble(); const LayoutImageResource* image_resource = layout_image.ImageResource(); const ImageResourceContent* cached_image = @@ -149,7 +148,7 @@ void ImagePainter::PaintReplaced(const PaintInfo& paint_info, const PhysicalOffset& paint_offset) { - LayoutSize content_size = layout_image_.ContentSize(); + const PhysicalSize content_size = layout_image_.PhysicalContentBoxSize(); bool has_image = layout_image_.ImageResource()->HasImage(); if (has_image) { @@ -158,13 +157,13 @@ } else { if (paint_info.phase == PaintPhase::kSelectionDragImage) return; - if (content_size.Width() <= 2 || content_size.Height() <= 2) + if (content_size.width <= 2 || content_size.height <= 2) { return; + } } PhysicalRect content_rect( - paint_offset + layout_image_.PhysicalContentBoxOffset(), - PhysicalSizeToBeNoop(content_size)); + paint_offset + layout_image_.PhysicalContentBoxOffset(), content_size); PhysicalRect paint_rect = layout_image_.ReplacedContentRect(); paint_rect.offset += paint_offset;
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl index a11e69b..6dfeca1 100644 --- a/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl +++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_interest_group.idl
@@ -40,7 +40,13 @@ [ImplementedAs=biddingLogicUrlDeprecated] USVString biddingLogicUrl; + USVString biddingWasmHelperURL; + + [ImplementedAs=biddingWasmHelperUrlDeprecated] USVString biddingWasmHelperUrl; + USVString updateURL; + + [ImplementedAs=updateUrlDeprecated] USVString updateUrl; // TODO(https://crbug.com/1420080): Remove this deprecated field, in favor of // `updateUrl` above.
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index 5529ad83..6c0132f 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -606,12 +606,13 @@ ExceptionState& exception_state, const AuctionAdInterestGroup& input, mojom::blink::InterestGroup& output) { - if (!input.hasBiddingWasmHelperUrl()) + if (!input.hasBiddingWasmHelperURL()) { return true; - KURL wasm_url = context.CompleteURL(input.biddingWasmHelperUrl()); + } + KURL wasm_url = context.CompleteURL(input.biddingWasmHelperURL()); if (!wasm_url.IsValid()) { exception_state.ThrowTypeError(ErrorInvalidInterestGroup( - input, "biddingWasmHelperUrl", input.biddingWasmHelperUrl(), + input, "biddingWasmHelperURL", input.biddingWasmHelperURL(), "cannot be resolved to a valid URL.")); return false; } @@ -624,18 +625,18 @@ ExceptionState& exception_state, const AuctionAdInterestGroup& input, mojom::blink::InterestGroup& output) { - if (input.hasUpdateUrl()) { + if (input.hasUpdateURL()) { if (input.hasDailyUpdateUrl() && - input.updateUrl() != input.dailyUpdateUrl()) { + input.updateURL() != input.dailyUpdateUrl()) { exception_state.ThrowTypeError(ErrorInvalidInterestGroup( - input, "updateUrl", input.updateUrl(), + input, "updateURL", input.updateURL(), "must match dailyUpdateUrl, when both are present.")); return false; } - KURL update_url = context.CompleteURL(input.updateUrl()); + KURL update_url = context.CompleteURL(input.updateURL()); if (!update_url.IsValid()) { exception_state.ThrowTypeError( - ErrorInvalidInterestGroup(input, "updateUrl", input.updateUrl(), + ErrorInvalidInterestGroup(input, "updateURL", input.updateURL(), "cannot be resolved to a valid URL.")); return false; } @@ -2082,7 +2083,7 @@ return false; } } else { - ad->setRenderURL(ad->renderUrlDeprecated()); + ad->setRenderURL(std::move(ad->renderUrlDeprecated())); } } if (!ad->hasRenderURL()) { @@ -2105,7 +2106,7 @@ return false; } } else { - ad->setRenderURL(ad->renderUrlDeprecated()); + ad->setRenderURL(std::move(ad->renderUrlDeprecated())); } } if (!ad->hasRenderURL()) { @@ -2127,7 +2128,39 @@ return false; } } else { - group->setBiddingLogicURL(group->biddingLogicUrlDeprecated()); + group->setBiddingLogicURL(std::move(group->biddingLogicUrlDeprecated())); + } + } + + if (group->hasBiddingWasmHelperUrlDeprecated()) { + if (group->hasBiddingWasmHelperURL()) { + if (group->biddingWasmHelperUrlDeprecated() != + group->biddingWasmHelperURL()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"interest group biddingWasmHelperUrl", + /*old_field_value=*/group->biddingWasmHelperUrlDeprecated(), + /*new_field_name=*/"interest group biddingWasmHelperURL", + /*new_field_value=*/group->biddingWasmHelperURL())); + return false; + } + } else { + group->setBiddingWasmHelperURL( + std::move(group->biddingWasmHelperUrlDeprecated())); + } + } + + if (group->hasUpdateUrlDeprecated()) { + if (group->hasUpdateURL()) { + if (group->updateUrlDeprecated() != group->updateURL()) { + exception_state.ThrowTypeError(ErrorRenameMismatch( + /*old_field_name=*/"interest group updateUrl", + /*old_field_value=*/group->updateUrlDeprecated(), + /*new_field_name=*/"interest group updateURL", + /*new_field_value=*/group->updateURL())); + return false; + } + } else { + group->setUpdateURL(std::move(group->updateUrlDeprecated())); } }
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc index bce5bf7..39282fd 100644 --- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc +++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group.cc
@@ -180,21 +180,21 @@ if (group.bidding_url) { if (!IsUrlAllowed(*group.bidding_url, group)) { - error_field_name = "biddingUrl"; + error_field_name = "biddingLogicURL"; error_field_value = group.bidding_url->GetString(); error = - "biddingUrl must have the same origin as the InterestGroup owner " - "and have no fragment identifier or embedded credentials."; + "biddingLogicURL must have the same origin as the InterestGroup " + "owner and have no fragment identifier or embedded credentials."; return false; } } if (group.bidding_wasm_helper_url) { if (!IsUrlAllowed(*group.bidding_wasm_helper_url, group)) { - error_field_name = "biddingWasmHelperUrl"; + error_field_name = "biddingWasmHelperURL"; error_field_value = group.bidding_wasm_helper_url->GetString(); error = - "biddingWasmHelperUrl must have the same origin as the InterestGroup " + "biddingWasmHelperURL must have the same origin as the InterestGroup " "owner and have no fragment identifier or embedded credentials."; return false; } @@ -202,10 +202,10 @@ if (group.update_url) { if (!IsUrlAllowed(*group.update_url, group)) { - error_field_name = "updateUrl"; + error_field_name = "updateURL"; error_field_value = group.update_url->GetString(); error = - "updateUrl must have the same origin as the InterestGroup owner " + "updateURL must have the same origin as the InterestGroup owner " "and have no fragment identifier or embedded credentials."; return false; }
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc index d7c6869..e415999 100644 --- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc +++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
@@ -259,13 +259,13 @@ TEST_F(ValidateBlinkInterestGroupTest, RejectedUrls) { // Strings when each field has a bad URL, copied from cc file. const char kBadBiddingUrlError[] = - "biddingUrl must have the same origin as the InterestGroup owner " + "biddingLogicURL must have the same origin as the InterestGroup owner " "and have no fragment identifier or embedded credentials."; const char kBadBiddingWasmHelperUrlError[] = - "biddingWasmHelperUrl must have the same origin as the InterestGroup " + "biddingWasmHelperURL must have the same origin as the InterestGroup " "owner and have no fragment identifier or embedded credentials."; const char kBadUpdateUrlError[] = - "updateUrl must have the same origin as the InterestGroup owner " + "updateURL must have the same origin as the InterestGroup owner " "and have no fragment identifier or embedded credentials."; const char kBadTrustedBiddingSignalsUrlError[] = "trustedBiddingSignalsUrl must have the same origin as the " @@ -317,7 +317,7 @@ CreateMinimalInterestGroup(); blink_interest_group->bidding_url = rejected_url; ExpectInterestGroupIsNotValid( - blink_interest_group, /*expected_error_field_name=*/"biddingUrl", + blink_interest_group, /*expected_error_field_name=*/"biddingLogicURL", /*expected_error_field_value=*/rejected_url.GetString().Utf8(), /*expected_error=*/kBadBiddingUrlError); @@ -326,7 +326,7 @@ blink_interest_group->bidding_wasm_helper_url = rejected_url; ExpectInterestGroupIsNotValid( blink_interest_group, - /*expected_error_field_name=*/"biddingWasmHelperUrl", + /*expected_error_field_name=*/"biddingWasmHelperURL", /*expected_error_field_value=*/rejected_url.GetString().Utf8(), /*expected_error=*/kBadBiddingWasmHelperUrlError); @@ -334,7 +334,7 @@ blink_interest_group = CreateMinimalInterestGroup(); blink_interest_group->update_url = rejected_url; ExpectInterestGroupIsNotValid( - blink_interest_group, /*expected_error_field_name=*/"updateUrl", + blink_interest_group, /*expected_error_field_name=*/"updateURL", /*expected_error_field_value=*/rejected_url.GetString().Utf8(), /*expected_error=*/kBadUpdateUrlError);
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc index 8d30a84d..d92159b2 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -24,6 +24,7 @@ #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h" +#include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h" #include "third_party/blink/renderer/core/html/canvas/text_metrics.h" #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/inspector/console_message.h" @@ -2099,7 +2100,8 @@ // putImageData: crbug.com/1112060. if (IsAccelerated() && !IsDesynchronized()) { read_count_++; - if (read_count_ >= kFallbackToCPUAfterReadbacks) { + if (read_count_ >= kFallbackToCPUAfterReadbacks || + ShouldDisableAccelerationBecauseOfReadback()) { DisableAcceleration(); base::UmaHistogramEnumeration("Blink.Canvas.GPUFallbackToCPU", GPUFallbackToCPUScenario::kGetImageData);
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h index 1738b0e..4345b93 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h
@@ -510,6 +510,14 @@ static const char kGeometricPrecisionRendering[]; virtual void DisableAcceleration() {} + // Override to prematurely disable acceleration because of a readback. + // BaseRenderingContext2D automatically disables acceleration after a number + // of readbacks, this can be overridden to disable acceleration earlier than + // would typically happen. + virtual bool ShouldDisableAccelerationBecauseOfReadback() const { + return false; + } + virtual bool IsPaint2D() const { return false; } void WillOverwriteCanvas(OverdrawOp); virtual void WillOverwriteCanvas() = 0;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc index 7049290..3394cf7 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -1234,6 +1234,11 @@ canvas()->DisableAcceleration(); } +bool CanvasRenderingContext2D::ShouldDisableAccelerationBecauseOfReadback() + const { + return canvas()->ShouldDisableAccelerationBecauseOfReadback(); +} + bool CanvasRenderingContext2D::IsCanvas2DBufferValid() const { if (IsPaintable()) { return canvas()->GetCanvas2DLayerBridge()->IsValid();
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h index 7c90d6ba..6e583f88 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
@@ -169,6 +169,7 @@ return CanvasRenderingContext::WouldTaintOrigin(source); } void DisableAcceleration() override; + bool ShouldDisableAccelerationBecauseOfReadback() const override; int Width() const final; int Height() const final;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc index bbd3b2d1..bcca5e10 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -163,7 +163,8 @@ OpacityMode, LatencyMode = kNormalLatency, CanvasContextCreationAttributesCore::WillReadFrequently = - CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined); + CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined, + HTMLCanvasElement* canvas = nullptr); ScriptState* GetScriptState() { return ToScriptStateForMainWorld(canvas_element_->DomWindow()->GetFrame()); @@ -238,13 +239,17 @@ OpacityMode opacity_mode, LatencyMode latency_mode, CanvasContextCreationAttributesCore::WillReadFrequently - will_read_frequently) { + will_read_frequently, + HTMLCanvasElement* canvas) { String canvas_type("2d"); CanvasContextCreationAttributesCore attributes; attributes.alpha = opacity_mode == kNonOpaque; attributes.desynchronized = latency_mode == kLowLatency; attributes.will_read_frequently = will_read_frequently; - canvas_element_->GetCanvasRenderingContext(canvas_type, attributes); + if (!canvas) { + canvas = canvas_element_; + } + canvas->GetCanvasRenderingContext(canvas_type, attributes); } void CanvasRenderingContext2DTest::SetUp() { @@ -1452,6 +1457,23 @@ : public CanvasRenderingContext2DTest { protected: bool AllowsAcceleration() override { return true; } + + void CreateAlotOfCanvasesWithAccelerationExplicitlyDisabled() { + for (int i = 0; i < 200; ++i) { + auto* canvas = MakeGarbageCollected<HTMLCanvasElement>(GetDocument()); + CreateContext( + kNonOpaque, kNormalLatency, + CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined, + canvas); + canvas->GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU); + // Expect that at least the first 10 are accelerated. The exact number + // depends on the feature params. + if (i < 10) { + EXPECT_TRUE(canvas->IsAccelerated()); + } + canvas->DisableAcceleration(); + } + } }; INSTANTIATE_PAINT_TEST_SUITE_P(CanvasRenderingContext2DTestAccelerated); @@ -1594,6 +1616,76 @@ EXPECT_FALSE(CanvasElement().ResourceProvider()->HasRecordedDrawOps()); } +class CanvasRenderingContext2DTestAcceleratedMultipleDisables + : public CanvasRenderingContext2DTest { + protected: + void SetUp() override { + base::FieldTrialParams params; + params["canvas-disable-acceleration-threshold"] = "10"; + params["canvas-disable-acceleration-percent"] = "80"; + feature_list_.InitAndEnableFeatureWithParameters( + kStartCanvasWithAccelerationDisabled, params); + CanvasRenderingContext2DTest::SetUp(); + } + + bool AllowsAcceleration() override { return true; } + + void CreateAlotOfCanvasesWithAccelerationExplicitlyDisabled() { + for (int i = 0; i < 10; ++i) { + auto* canvas = MakeGarbageCollected<HTMLCanvasElement>(GetDocument()); + CreateContext( + kNonOpaque, kNormalLatency, + CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined, + canvas); + canvas->GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU); + EXPECT_TRUE(canvas->IsAccelerated()); + canvas->DisableAcceleration(); + } + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +INSTANTIATE_PAINT_TEST_SUITE_P( + CanvasRenderingContext2DTestAcceleratedMultipleDisables); + +TEST_P(CanvasRenderingContext2DTestAcceleratedMultipleDisables, + ReadFrequentlyUndefined) { + CreateAlotOfCanvasesWithAccelerationExplicitlyDisabled(); + CreateContext( + kNonOpaque, kNormalLatency, + CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined); + CanvasElement().GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU); + // Because a bunch of canvases had acceleration explicitly disabled, canvases + // created with `kUndefined` should start with acceleration disabled. + EXPECT_FALSE(CanvasElement().IsAccelerated()); +} + +TEST_P(CanvasRenderingContext2DTestAcceleratedMultipleDisables, + ReadFrequentlyFalse) { + CreateAlotOfCanvasesWithAccelerationExplicitlyDisabled(); + CreateContext( + kNonOpaque, kNormalLatency, + CanvasContextCreationAttributesCore::WillReadFrequently::kFalse); + CanvasElement().GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU); + // Canvases created with `kFalse` should always start with acceleration + // enabled regardless of how many canvases had acceleration disabled. + EXPECT_TRUE(CanvasElement().IsAccelerated()); +} + +TEST_P(CanvasRenderingContext2DTestAcceleratedMultipleDisables, + ReadFrequentlyTrue) { + CreateAlotOfCanvasesWithAccelerationExplicitlyDisabled(); + CreateContext(kNonOpaque, kNormalLatency, + CanvasContextCreationAttributesCore::WillReadFrequently::kTrue); + CanvasElement().GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU); + // Canvases created with `kTrue` should always start with acceleration + // disabled regardless of how many canvases had acceleration explicitly + // disabled. + EXPECT_FALSE(CanvasElement().IsAccelerated()); +} + class CanvasRenderingContext2DTestImageChromium : public CanvasRenderingContext2DTestAccelerated { protected:
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc index 9362d90..3ed83696 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
@@ -93,23 +93,6 @@ } // namespace WTF namespace blink { - -// Feature flag for driving the Metronome by VSyncs instead of by timer. -BASE_FEATURE(kVSyncDecoding, - "VSyncDecoding", - base::FEATURE_DISABLED_BY_DEFAULT); - -// Feature parameter controlling VSyncDecoding tick durations during occluded -// tabs. -const base::FeatureParam<base::TimeDelta> - kVSyncDecodingHiddenOccludedTickDuration{ - &kVSyncDecoding, "occluded_tick_duration", base::Hertz(10)}; - -// Feature flag for batching send packets. -BASE_FEATURE(kWebRtcSendPacketBatch, - "WebRtcSendPacketBatch", - base::FEATURE_DISABLED_BY_DEFAULT); - namespace { using PassKey = base::PassKey<PeerConnectionDependencyFactory>; @@ -214,7 +197,7 @@ webrtc::ThreadWrapper::current()->set_send_allowed(true); if (!metronome_source_) { std::unique_ptr<MetronomeSource::TickProvider> tick_provider; - if (base::FeatureList::IsEnabled(kVSyncDecoding)) { + if (base::FeatureList::IsEnabled(features::kVSyncDecoding)) { vsync_provider_.emplace( Platform::Current()->VideoFrameCompositorTaskRunner(), To<LocalDOMWindow>(context) @@ -226,7 +209,7 @@ tick_provider = VSyncTickProvider::Create( *vsync_provider_, chrome_worker_thread_.task_runner(), std::make_unique<TimerBasedTickProvider>( - kVSyncDecodingHiddenOccludedTickDuration.Get())); + features::kVSyncDecodingHiddenOccludedTickDuration.Get())); } else { tick_provider = std::make_unique<TimerBasedTickProvider>( TimerBasedTickProvider::kDefaultPeriod); @@ -601,7 +584,7 @@ )"); socket_factory_ = std::make_unique<IpcPacketSocketFactory>( p2p_socket_dispatcher_.Get(), traffic_annotation, /*batch_udp_packets=*/ - base::FeatureList::IsEnabled(kWebRtcSendPacketBatch)); + base::FeatureList::IsEnabled(features::kWebRtcSendPacketBatch)); gpu_factories_ = gpu_factories; // base::Unretained is safe below, because
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h index 28c4959..14994b56 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h
@@ -57,9 +57,6 @@ class WebLocalFrame; class WebRtcAudioDeviceImpl; -// Feature flag for batching send packets. -BASE_DECLARE_FEATURE(kWebRtcSendPacketBatch); - // Object factory for RTC PeerConnections. class MODULES_EXPORT PeerConnectionDependencyFactory : public GarbageCollected<PeerConnectionDependencyFactory>,
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc index acd2a4d980..59c57c9 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
@@ -29,6 +29,7 @@ #include "base/trace_event/trace_event.h" #include "build/chromecast_buildflags.h" #include "media/base/media_switches.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_url.h" @@ -1094,7 +1095,7 @@ &configuration_); configuration_.media_config.video.enable_send_packet_batching = - base::FeatureList::IsEnabled(kWebRtcSendPacketBatch); + base::FeatureList::IsEnabled(features::kWebRtcSendPacketBatch); peer_connection_observer_ = MakeGarbageCollected<Observer>(weak_factory_.GetWeakPtr(), task_runner_);
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc b/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc index 2c50db32..8958d44 100644 --- a/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc +++ b/third_party/blink/renderer/modules/smart_card/smart_card_connection.cc
@@ -41,6 +41,8 @@ connection_.Bind( std::move(pending_connection), execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI)); + connection_.set_disconnect_handler(WTF::BindOnce( + &SmartCardConnection::CloseMojoConnection, WrapWeakPersistent(this))); } ScriptPromise SmartCardConnection::disconnect(ScriptState* script_state, @@ -60,16 +62,16 @@ return ScriptPromise(); } - ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>( + ongoing_request_ = MakeGarbageCollected<ScriptPromiseResolver>( script_state, exception_state.GetContext()); - operation_in_progress_ = true; connection_->Disconnect( ToMojomDisposition(disposition), WTF::BindOnce(&SmartCardConnection::OnDisconnectDone, - WrapPersistent(this), WrapPersistent(resolver))); + WrapPersistent(this), + WrapPersistent(ongoing_request_.Get()))); - return resolver->Promise(); + return ongoing_request_->Promise(); } ScriptPromise SmartCardConnection::transmit(ScriptState* script_state, @@ -86,20 +88,19 @@ return ScriptPromise(); } - ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>( + ongoing_request_ = MakeGarbageCollected<ScriptPromiseResolver>( script_state, exception_state.GetContext()); Vector<uint8_t> send_vector; send_vector.Append(send_buffer.Bytes(), static_cast<wtf_size_t>(send_buffer.ByteLength())); - operation_in_progress_ = true; connection_->Transmit( active_protocol_, send_vector, WTF::BindOnce(&SmartCardConnection::OnDataResult, WrapPersistent(this), - WrapPersistent(resolver))); + WrapPersistent(ongoing_request_.Get()))); - return resolver->Promise(); + return ongoing_request_->Promise(); } ScriptPromise SmartCardConnection::status() { @@ -109,12 +110,13 @@ void SmartCardConnection::Trace(Visitor* visitor) const { visitor->Trace(connection_); + visitor->Trace(ongoing_request_); ScriptWrappable::Trace(visitor); } bool SmartCardConnection::EnsureNoOperationInProgress( ExceptionState& exception_state) const { - if (operation_in_progress_) { + if (ongoing_request_) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, kOperationInProgress); return false; @@ -135,8 +137,8 @@ void SmartCardConnection::OnDisconnectDone( ScriptPromiseResolver* resolver, device::mojom::blink::SmartCardResultPtr result) { - CHECK(operation_in_progress_); - operation_in_progress_ = false; + CHECK_EQ(ongoing_request_, resolver); + ongoing_request_ = nullptr; if (result->is_error()) { auto* error = SmartCardError::Create(result->get_error()); @@ -153,8 +155,8 @@ void SmartCardConnection::OnDataResult( ScriptPromiseResolver* resolver, device::mojom::blink::SmartCardDataResultPtr result) { - CHECK(operation_in_progress_); - operation_in_progress_ = false; + CHECK_EQ(ongoing_request_, resolver); + ongoing_request_ = nullptr; if (result->is_error()) { auto* error = SmartCardError::Create(result->get_error()); @@ -167,4 +169,21 @@ resolver->Resolve(DOMArrayBuffer::Create(data.data(), data.size())); } +void SmartCardConnection::CloseMojoConnection() { + connection_.reset(); + + if (!ongoing_request_) { + return; + } + + ScriptState* script_state = ongoing_request_->GetScriptState(); + if (IsInParallelAlgorithmRunnable(ongoing_request_->GetExecutionContext(), + script_state)) { + ScriptState::Scope script_state_scope(script_state); + ongoing_request_->RejectWithDOMException( + DOMExceptionCode::kInvalidStateError, kDisconnected); + } + ongoing_request_ = nullptr; +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_connection.h b/third_party/blink/renderer/modules/smart_card/smart_card_connection.h index 0aa2da0..a7122c83 100644 --- a/third_party/blink/renderer/modules/smart_card/smart_card_connection.h +++ b/third_party/blink/renderer/modules/smart_card/smart_card_connection.h
@@ -48,8 +48,9 @@ device::mojom::blink::SmartCardResultPtr result); void OnDataResult(ScriptPromiseResolver* resolver, device::mojom::blink::SmartCardDataResultPtr result); + void CloseMojoConnection(); - bool operation_in_progress_ = false; + Member<ScriptPromiseResolver> ongoing_request_; HeapMojoRemote<device::mojom::blink::SmartCardConnection> connection_; device::mojom::blink::SmartCardProtocol active_protocol_; };
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index 28e6a24..414e0e28 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -50,10 +50,12 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/client_hints/client_hints.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/permissions_policy/permissions_policy.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" +#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" #include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_code_cache_loader.h" @@ -932,6 +934,12 @@ fetcher_->RecordResourceTimingOnRedirect(resource_.Get(), redirect_response, new_url); + // `Context().PrepareRequest()` below may update the value of + // `new_request->GetSharedStorageWritable()`. If it does, we will need to + // remove the corresponding header. + bool need_to_check_for_shared_storage_writable_change = + new_request->GetSharedStorageWritable() && removed_headers; + // The following two calls may rewrite the new_request->Url() to // something else not for rejecting redirect but for other reasons. // E.g. WebFrameTestClient::WillSendRequest() and @@ -961,6 +969,11 @@ DCHECK_EQ(new_request->GetMode(), request_mode); DCHECK_EQ(new_request->GetCredentialsMode(), credentials_mode); + if (need_to_check_for_shared_storage_writable_change && + !new_request->GetSharedStorageWritable()) { + removed_headers->push_back(http_names::kSharedStorageWritable.Ascii()); + } + if (new_request->Url() != KURL(new_url)) { CancelForRedirectAccessCheckError(new_request->Url(), ResourceRequestBlockedReason::kOther);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc index e035bff0..07887ff 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
@@ -32,7 +32,9 @@ #include "net/base/request_priority.h" #include "services/network/public/mojom/ip_address_space.mojom-blink.h" #include "services/network/public/mojom/web_bundle_handle.mojom-blink.h" +#include "third_party/blink/public/common/permissions_policy/permissions_policy.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" +#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/platform/network/encoded_form_data.h" #include "third_party/blink/renderer/platform/network/http_names.h" @@ -97,6 +99,7 @@ keepalive_(false), browsing_topics_(false), ad_auction_headers_(false), + shared_storage_writable_(false), allow_stale_response_(false), cache_mode_(mojom::blink::FetchCacheMode::kDefault), skip_service_worker_(false), @@ -207,6 +210,7 @@ request->SetKeepalive(GetKeepalive()); request->SetBrowsingTopics(GetBrowsingTopics()); request->SetAdAuctionHeaders(GetAdAuctionHeaders()); + request->SetSharedStorageWritable(GetSharedStorageWritable()); request->SetPriority(Priority()); request->SetPriorityIncremental(PriorityIncremental()); @@ -474,4 +478,29 @@ return true; } +bool ResourceRequest::IsFeatureEnabledForSubresourceRequestAssumingOptIn( + const PermissionsPolicy* policy, + mojom::blink::PermissionsPolicyFeature feature, + const url::Origin& origin) { + if (!policy) { + return false; + } + + bool browsing_topics_opted_in = + (feature == mojom::blink::PermissionsPolicyFeature::kBrowsingTopics || + feature == mojom::blink::PermissionsPolicyFeature:: + kBrowsingTopicsBackwardCompatible) && + GetBrowsingTopics(); + bool shared_storage_opted_in = + feature == mojom::blink::PermissionsPolicyFeature::kSharedStorage && + GetSharedStorageWritable(); + + if (!browsing_topics_opted_in && !shared_storage_opted_in) { + return false; + } + + return policy->IsFeatureEnabledForSubresourceRequestAssumingOptIn(feature, + origin); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.h b/third_party/blink/renderer/platform/loader/fetch/resource_request.h index 64e045a..411b22f 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
@@ -46,6 +46,7 @@ #include "services/network/public/mojom/web_bundle_handle.mojom-blink.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink-forward.h" #include "third_party/blink/public/platform/resource_request_blocked_reason.h" #include "third_party/blink/public/platform/web_url_request_extra_data.h" #include "third_party/blink/renderer/platform/loader/fetch/render_blocking_behavior.h" @@ -60,6 +61,7 @@ namespace blink { class EncodedFormData; +class PermissionsPolicy; // ResourceRequestHead represents request without request body. // See ResourceRequest below to see what request is. @@ -298,6 +300,14 @@ ad_auction_headers_ = ad_auction_headers; } + // True if the request and any subsequent redirects should have the + // `http_names::kSharedStorageWritable` header attached and allow writing to + // shared storage via the response headers. + bool GetSharedStorageWritable() const { return shared_storage_writable_; } + void SetSharedStorageWritable(bool shared_storage_writable) { + shared_storage_writable_ = shared_storage_writable; + } + // True if service workers should not get events for the request. bool GetSkipServiceWorker() const { return skip_service_worker_; } void SetSkipServiceWorker(bool skip_service_worker) { @@ -617,6 +627,7 @@ bool keepalive_ : 1; bool browsing_topics_ : 1; bool ad_auction_headers_ : 1; + bool shared_storage_writable_ : 1; bool allow_stale_response_ : 1; mojom::blink::FetchCacheMode cache_mode_; bool skip_service_worker_ : 1; @@ -795,6 +806,16 @@ ResourceRequestBody& MutableBody() { return body_; } + // `PermissionsPolicy` is in blink/public and hence cannot access + // `ResourceRequest`. We implement this method here and make `ResourceRequest` + // a forward-declared friend class to `PermissionsPolicy` in order to keep + // `PermissionsPolicy::IsFeatureEnabledForSubresourceRequestAssumingOptIn()` + // private for safety. + bool IsFeatureEnabledForSubresourceRequestAssumingOptIn( + const PermissionsPolicy* policy, + mojom::blink::PermissionsPolicyFeature feature, + const url::Origin& origin); + private: ResourceRequestBody body_; };
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc index 46b00d1..875a799 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request_test.cc
@@ -5,15 +5,32 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include <memory> +#include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/permissions_policy/permissions_policy.h" +#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/platform/network/encoded_form_data.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/weborigin/referrer.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" +#include "url/origin.h" namespace blink { +namespace { + +std::unique_ptr<PermissionsPolicy> CreateFromParentPolicy( + const PermissionsPolicy* parent, + const url::Origin& origin) { + ParsedPermissionsPolicy empty_container_policy; + return PermissionsPolicy::CreateFromParentPolicy( + parent, empty_container_policy, origin); +} + +} // namespace + TEST(ResourceRequestTest, SetHasUserGesture) { ResourceRequest original; EXPECT_FALSE(original.HasUserGesture()); @@ -53,4 +70,460 @@ EXPECT_TRUE(redirect_request->UpgradeIfInsecure()); } +// A cross-origin subresource request that explicitly sets an opt-in flag (e.g. +// `browsingTopics`, `sharedStorageWritable`) should have the corresponding +// permission as long as it passes the allowlist check, regardless of the +// feature's default state. +TEST(ResourceRequestTest, IsFeatureEnabledForSubresourceRequestAssumingOptIn) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {blink::features::kBrowsingTopics, blink::features::kSharedStorageAPI}, + /*disabled_features=*/{}); + + ResourceRequest request_with_topics_opt_in; + request_with_topics_opt_in.SetBrowsingTopics(true); + + ResourceRequest request_with_shared_storage_opt_in; + request_with_shared_storage_opt_in.SetSharedStorageWritable(true); + + ResourceRequest request_with_both_opt_in; + request_with_both_opt_in.SetBrowsingTopics(true); + request_with_both_opt_in.SetSharedStorageWritable(true); + + const url::Origin origin_a = + url::Origin::Create(GURL("https://example.com/")); + const url::Origin origin_b = + url::Origin::Create(GURL("https://example.net/")); + const url::Origin origin_c = + url::Origin::Create(GURL("https://example.org/")); + + { + // +--------------------------------------------------------+ + // |(1)Origin A | + // |No Policy | + // | | + // | fetch(<Origin B's url>, {browsingTopics: true}) | + // | fetch(<Origin B's url>, {sharedStorageWritable: true}) | + // | fetch(<Origin B's url>, {browsingTopics: true, | + // | sharedStorageWritable: true}) | + // +--------------------------------------------------------+ + + std::unique_ptr<PermissionsPolicy> policy = + CreateFromParentPolicy(nullptr, origin_a); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_a)); + EXPECT_TRUE(request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_a)); + EXPECT_TRUE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_b)); + EXPECT_TRUE(request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_b)); + EXPECT_TRUE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + } + + { + // +--------------------------------------------------------+ + // |(1)Origin A | + // |Permissions-Policy: browsing-topics=(self), | + // | shared-storage=(self) | + // | | + // | fetch(<Origin B's url>, {browsingTopics: true}) | + // | fetch(<Origin B's url>, {sharedStorageWritable: true}) | + // | fetch(<Origin B's url>, {browsingTopics: true, | + // | sharedStorageWritable: true}) | + // +--------------------------------------------------------+ + + std::unique_ptr<PermissionsPolicy> policy = + CreateFromParentPolicy(nullptr, origin_a); + policy->SetHeaderPolicy( + {{{mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + /*allowed_origins=*/{}, + /*self_if_matches=*/origin_a, + /*matches_all_origins=*/false, + /*matches_opaque_src=*/false}, + {mojom::blink::PermissionsPolicyFeature::kSharedStorage, + /*allowed_origins=*/{}, + /*self_if_matches=*/origin_a, + /*matches_all_origins=*/false, + /*matches_opaque_src=*/false}}}); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_a)); + EXPECT_TRUE(request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_a)); + EXPECT_TRUE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_b)); + EXPECT_FALSE( + request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + EXPECT_FALSE( + request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_b)); + EXPECT_FALSE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + EXPECT_FALSE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + } + + { + // +--------------------------------------------------------+ + // |(1)Origin A | + // |Permissions-Policy: browsing-topics=(none), | + // | shared-storage=(none) | + // | | + // | fetch(<Origin B's url>, {browsingTopics: true}) | + // | fetch(<Origin B's url>, {sharedStorageWritable: true}) | + // | fetch(<Origin B's url>, {browsingTopics: true, | + // | sharedStorageWritable: true}) | + // +--------------------------------------------------------+ + + std::unique_ptr<PermissionsPolicy> policy = + CreateFromParentPolicy(nullptr, origin_a); + policy->SetHeaderPolicy( + {{{mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + /*allowed_origins=*/{}, + /*self_if_matches=*/absl::nullopt, + /*matches_all_origins=*/false, + /*matches_opaque_src=*/false}, + {mojom::blink::PermissionsPolicyFeature::kSharedStorage, + /*allowed_origins=*/{}, + /*self_if_matches=*/absl::nullopt, + /*matches_all_origins=*/false, + /*matches_opaque_src=*/false}}}); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_a)); + EXPECT_FALSE( + request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + EXPECT_FALSE( + request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_a)); + EXPECT_FALSE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + EXPECT_FALSE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_b)); + EXPECT_FALSE( + request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + EXPECT_FALSE( + request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_b)); + EXPECT_FALSE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + EXPECT_FALSE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + } + + { + // +--------------------------------------------------------+ + // |(1)Origin A | + // |Permissions-Policy: browsing-topics=*, | + // | shared-storage=* | + // | | + // | fetch(<Origin B's url>, {browsingTopics: true}) | + // | fetch(<Origin B's url>, {sharedStorageWritable: true}) | + // | fetch(<Origin B's url>, {browsingTopics: true, | + // | sharedStorageWritable: true}) | + // +--------------------------------------------------------+ + + std::unique_ptr<PermissionsPolicy> policy = + CreateFromParentPolicy(nullptr, origin_a); + policy->SetHeaderPolicy( + {{{mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + /*allowed_origins=*/{}, + /*self_if_matches=*/absl::nullopt, + /*matches_all_origins=*/true, + /*matches_opaque_src=*/false}, + {mojom::blink::PermissionsPolicyFeature::kSharedStorage, + /*allowed_origins=*/{}, + /*self_if_matches=*/absl::nullopt, + /*matches_all_origins=*/true, + /*matches_opaque_src=*/false}}}); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_a)); + EXPECT_TRUE(request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_a)); + EXPECT_TRUE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_b)); + EXPECT_TRUE(request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_b)); + EXPECT_TRUE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + } + + { + // +--------------------------------------------------------+ + // |(1)Origin A | + // |Permissions-Policy: browsing-topics=(Origin B), | + // | shared-storage=(Origin B) | + // | | + // | fetch(<Origin B's url>, {browsingTopics: true}) | + // | fetch(<Origin B's url>, {sharedStorageWritable: true}) | + // | fetch(<Origin B's url>, {browsingTopics: true, | + // | sharedStorageWritable: true}) | + // | fetch(<Origin C's url>, {browsingTopics: true}) | + // | fetch(<Origin C's url>, {sharedStorageWritable: true}) | + // | fetch(<Origin C's url>, {browsingTopics: true, | + // | sharedStorageWritable: true}) | + // +--------------------------------------------------------+ + + std::unique_ptr<PermissionsPolicy> policy = + CreateFromParentPolicy(nullptr, origin_a); + policy->SetHeaderPolicy({{{mojom::blink::PermissionsPolicyFeature:: + kBrowsingTopics, /*allowed_origins=*/ + {blink::OriginWithPossibleWildcards( + origin_b, + /*has_subdomain_wildcard=*/false)}, + /*self_if_matches=*/absl::nullopt, + /*matches_all_origins=*/false, + /*matches_opaque_src=*/false}, + {mojom::blink::PermissionsPolicyFeature:: + kSharedStorage, /*allowed_origins=*/ + {blink::OriginWithPossibleWildcards( + origin_b, + /*has_subdomain_wildcard=*/false)}, + /*self_if_matches=*/absl::nullopt, + /*matches_all_origins=*/false, + /*matches_opaque_src=*/false}}}); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_a)); + EXPECT_FALSE( + request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + EXPECT_FALSE( + request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_a)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_a)); + EXPECT_FALSE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + EXPECT_FALSE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_a)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_b)); + EXPECT_TRUE(request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_b)); + + EXPECT_TRUE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_b)); + EXPECT_TRUE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + EXPECT_TRUE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_b)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, origin_c)); + EXPECT_FALSE( + request_with_topics_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_c)); + EXPECT_FALSE( + request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kBrowsingTopics, + origin_c)); + + EXPECT_FALSE(policy->IsFeatureEnabledForOrigin( + mojom::blink::PermissionsPolicyFeature::kSharedStorage, origin_c)); + EXPECT_FALSE(request_with_shared_storage_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_c)); + EXPECT_FALSE(request_with_both_opt_in + .IsFeatureEnabledForSubresourceRequestAssumingOptIn( + policy.get(), + mojom::blink::PermissionsPolicyFeature::kSharedStorage, + origin_c)); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc index 15c509f9..76a72d2 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/request_conversion.cc
@@ -347,6 +347,7 @@ dest->keepalive = src.GetKeepalive(); dest->browsing_topics = src.GetBrowsingTopics(); dest->ad_auction_headers = src.GetAdAuctionHeaders(); + dest->shared_storage_writable = src.GetSharedStorageWritable(); dest->has_user_gesture = src.HasUserGesture(); dest->enable_load_timing = true; dest->enable_upload_progress = src.ReportUploadProgress();
diff --git a/third_party/blink/renderer/platform/network/http_names.json5 b/third_party/blink/renderer/platform/network/http_names.json5 index bb2ba7c..d60b0e4 100644 --- a/third_party/blink/renderer/platform/network/http_names.json5 +++ b/third_party/blink/renderer/platform/network/http_names.json5
@@ -73,6 +73,7 @@ "Save-Data", "Sec-Purpose", "Server-Timing", + "Shared-Storage-Writable", "Speculation-Rules", "SourceMap", "Timing-Allow-Origin",
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py index c55e768..9cc2d611 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -160,6 +160,7 @@ ('mac13', 'x86_64'), ('mac13-arm64', 'arm64'), ('win10.20h2', 'x86'), + ('win11-arm64', 'arm64'), ('win11', 'x86_64'), ('trusty', 'x86_64'), ('fuchsia', 'x86_64'), @@ -170,7 +171,7 @@ 'mac10.13', 'mac10.14', 'mac10.15', 'mac11', 'mac11-arm64', 'mac12', 'mac12-arm64', 'mac13', 'mac13-arm64' ], - 'win': ['win10.20h2', 'win11'], + 'win': ['win10.20h2', 'win11-arm64', 'win11'], 'linux': ['trusty'], 'fuchsia': ['fuchsia'], }
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/win.py b/third_party/blink/tools/blinkpy/web_tests/port/win.py index 98a8e9f2..2f8dd23c 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/win.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/win.py
@@ -49,11 +49,12 @@ class WinPort(base.Port): port_name = 'win' - SUPPORTED_VERSIONS = ('win10.20h2', 'win11') + SUPPORTED_VERSIONS = ('win10.20h2', 'win11-arm64', 'win11') FALLBACK_PATHS = {} FALLBACK_PATHS['win11'] = ['win'] FALLBACK_PATHS['win10.20h2'] = ['win10'] + FALLBACK_PATHS['win11'] + FALLBACK_PATHS['win11-arm64'] = ['win11-arm64'] + FALLBACK_PATHS['win11'] BUILD_REQUIREMENTS_URL = 'https://chromium.googlesource.com/chromium/src/+/main/docs/windows_build_instructions.md' @@ -70,7 +71,11 @@ version = 'win11' else: version = host.platform.os_version + port_name = port_name + '-' + version + if host.platform.get_machine() == 'arm64': + port_name = port_name + '-arm64' + return port_name def __init__(self, host, port_name, **kwargs): @@ -83,6 +88,9 @@ else: self._dump_reader = DumpReaderWin(host, self._build_path()) + if port_name.endswith('arm64'): + self._architecture = 'arm64' + def additional_driver_flags(self): flags = super(WinPort, self).additional_driver_flags() if not self.get_option('disable_breakpad'): @@ -214,6 +222,10 @@ return val def path_to_apache(self): + if self._architecture == 'arm64': + return self._path_from_chromium_base('third_party', + 'apache-windows-arm64', 'bin', + 'httpd.exe') return self._path_from_chromium_base('third_party', 'apache-win32', 'bin', 'httpd.exe')
diff --git a/third_party/blink/tools/run_wpt_tests.py b/third_party/blink/tools/run_wpt_tests.py index 4575f99..6a5dd8a 100755 --- a/third_party/blink/tools/run_wpt_tests.py +++ b/third_party/blink/tools/run_wpt_tests.py
@@ -1163,12 +1163,6 @@ @contextlib.contextmanager -def get_device(args): - with get_devices(args) as devices: - yield None if not devices else devices[0] - - -@contextlib.contextmanager def get_devices(args): if not _ANDROID_ENABLED: raise Exception('Android is not available')
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index bd6ee2b..e393f31 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2903,14 +2903,8 @@ crbug.com/626703 [ Mac13 ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ] crbug.com/626703 [ Mac13-arm64 ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ] crbug.com/626703 [ Mac13 ] virtual/pending-beacon/external/wpt/pending-beacon/pending_post_beacon-cors.tentative.https.window.html [ Timeout ] -crbug.com/626703 [ Mac11 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/animation-range-visual-test.html [ Failure ] crbug.com/626703 [ Mac12 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-inset-animation.html [ Timeout ] crbug.com/626703 [ Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-inset-animation.html [ Timeout ] -crbug.com/626703 [ Mac11 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-range-animation.html [ Timeout ] -crbug.com/626703 [ Mac12 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-range-animation.html [ Timeout ] -crbug.com/626703 [ Mac12-arm64 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-range-animation.html [ Timeout ] -crbug.com/626703 [ Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-range-animation.html [ Timeout ] -crbug.com/626703 [ Mac13-arm64 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-range-animation.html [ Timeout ] crbug.com/626703 external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html [ Failure Pass ] crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/color-mix-currentcolor-outline-repaint-parent.html [ Failure Pass ] crbug.com/626703 external/wpt/css/css-backgrounds/color-mix-currentcolor-background-repaint-parent.html [ Failure Pass ] @@ -6819,3 +6813,7 @@ crbug.com/1446742 virtual/gpu/fast/canvas/canvas-drawImage-svg.html [ Failure Pass ] crbug.com/1446742 virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-svg.html [ Failure Pass ] crbug.com/1446742 virtual/no-alloc-direct-call/fast/canvas/canvas-drawImage-svg.html [ Failure Pass ] + +crbug.com/1447239 virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/animation-range-visual-test.html [ Failure Pass ] +crbug.com/1447531 [ Mac ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-range-animation.html [ Failure Pass ] +crbug.com/1447244 [ Mac ] virtual/threaded/external/wpt/scroll-animations/css/animation-range-visual-test.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/get-nested-configs.https.html b/third_party/blink/web_tests/external/wpt/fenced-frame/get-nested-configs.https.html index ed9f953..da77f94 100644 --- a/third_party/blink/web_tests/external/wpt/fenced-frame/get-nested-configs.https.html +++ b/third_party/blink/web_tests/external/wpt/fenced-frame/get-nested-configs.https.html
@@ -15,10 +15,9 @@ attachFencedFrame(urn); const response = await nextValueFromServer(key); - const [length, first_url] = response.split(","); + const [length] = response.split(","); assert_equals(length, '20', 'There should be 20 nested configurations.'); - assert_equals(first_url, 'opaque', 'The first config should be opaque.'); }, 'getNestedConfigs() created by FLEDGE should return configurations'); for (const resolve_to_config of [true, false]) {
diff --git a/third_party/blink/web_tests/external/wpt/fenced-frame/resources/get-nested-configs-inner.html b/third_party/blink/web_tests/external/wpt/fenced-frame/resources/get-nested-configs-inner.html index a83ba93..122debf 100644 --- a/third_party/blink/web_tests/external/wpt/fenced-frame/resources/get-nested-configs-inner.html +++ b/third_party/blink/web_tests/external/wpt/fenced-frame/resources/get-nested-configs-inner.html
@@ -4,7 +4,7 @@ <script> const [key] = parseKeylist(); const configs = window.fence.getNestedConfigs(); -const data_to_send = [configs.length, configs.length > 0 ? configs[0].url : "N/a"]; +const data_to_send = [configs.length]; writeValueToServer(key, data_to_send.join(",")); </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/resources/util.js b/third_party/blink/web_tests/external/wpt/shared-storage/resources/util.js index 838885a..2ad668c 100644 --- a/third_party/blink/web_tests/external/wpt/shared-storage/resources/util.js +++ b/third_party/blink/web_tests/external/wpt/shared-storage/resources/util.js
@@ -84,4 +84,4 @@ return true; return false; -} \ No newline at end of file +}
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-default.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-default.tentative.https.sub.html index 5439df2..87fcdfe1 100644 --- a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-default.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-default.tentative.https.sub.html
@@ -25,5 +25,8 @@ test_feature_availability('shared-storage', t, cross_origin_src, expect_feature_available_default); }, header + ' allows sharedStorage in cross-origin iframes.'); + + // TODO(crbug.com/1434529): Add tests with + // `fetch(<url>, {sharedStorageWritable: true})`. </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-none.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-none.tentative.https.sub.html index 17a4bf1..1f64d9a 100644 --- a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-none.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-none.tentative.https.sub.html
@@ -25,5 +25,8 @@ test_feature_availability('shared-storage', t, cross_origin_src, expect_feature_unavailable_default); }, header + ' disallows sharedStorage in cross-origin iframes.'); + + // TODO(crbug.com/1434529): Add tests with + // `fetch(<url>, {sharedStorageWritable: true})`. </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-self.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-self.tentative.https.sub.html index 171325cd..d3787f3ca 100644 --- a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-self.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-permissions-policy-self.tentative.https.sub.html
@@ -25,5 +25,8 @@ test_feature_availability('shared-storage', t, cross_origin_src, expect_feature_unavailable_default); }, header + ' disallows sharedStorage in cross-origin iframes.'); + + // TODO(crbug.com/1434529): Add tests with + // `fetch(<url>, {sharedStorageWritable: true})`, including redirects. </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-writable-insecure-context.tentative.http.sub.html b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-writable-insecure-context.tentative.http.sub.html new file mode 100644 index 0000000..346321a4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/shared-storage/shared-storage-writable-insecure-context.tentative.http.sub.html
@@ -0,0 +1,20 @@ +<!doctype html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script> + 'use strict'; + + promise_test(async t => { + try { + new Request('./resources/simple-module.js', {sharedStorageWritable: true}); + } catch (e) { + assert_equals(e.name, 'TypeError'); + assert_equals(e.message, `Failed to construct 'Request': sharedStorageWritable: ` + + `sharedStorage operations are only available in secure contexts.`); + return; + } + assert_unreached("did not reject"); + }, 'sharedStorageWritable not allowed in insecure context.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index b10b525..15d14c80 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/css/transformed-mask-expected.png b/third_party/blink/web_tests/platform/linux/fast/css/transformed-mask-expected.png index 5922a8f..9343a694 100644 --- a/third_party/blink/web_tests/platform/linux/fast/css/transformed-mask-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index d9c86e6..e8ab978 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index a179624..819ff9a 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 7cc5f3e..584e684 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index 7864195..f75942a0 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 89721bb8..c416bb16 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css/transformed-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css/transformed-mask-expected.png index 6c92902..67a1c61 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css/transformed-mask-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index 778f276..aeecd3d4 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png new file mode 100644 index 0000000..68149451 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index b80081be0..fd29e31 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png index 62138755..0a84f36 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png index 62138755..0a84f36 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac11/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index ee035d2..691c6c3 100644 --- a/third_party/blink/web_tests/platform/mac-mac11/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css/transformed-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css/transformed-mask-expected.png index 6c92902..67a1c61 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css/transformed-mask-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index ec5e471..ca4baf7 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png new file mode 100644 index 0000000..68149451 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index b80081be0..fd29e31 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png index 62138755..0a84f36 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png index 62138755..0a84f36 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/css/transformed-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/css/transformed-mask-expected.png index 6c92902..67a1c61 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/css/transformed-mask-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index ec5e471..ca4baf7 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png new file mode 100644 index 0000000..68149451 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index b80081be0..fd29e31 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png index 62138755..0a84f36 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png index 62138755..0a84f36 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/transformed-mask-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/transformed-mask-expected.png index 5675f0e..008d748 100644 --- a/third_party/blink/web_tests/platform/mac/fast/css/transformed-mask-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index cf4ee5b..3ae4475 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index fd3098e..96499b9b 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index ffcf368..c7a6cc4 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/css/transformed-mask-expected.png b/third_party/blink/web_tests/platform/win/fast/css/transformed-mask-expected.png index e151c7b..1077dc2a 100644 --- a/third_party/blink/web_tests/platform/win/fast/css/transformed-mask-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/css/transformed-mask-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index fa128cd..5b9d6d0 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 7d4c02de..e1c4210 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 48fe198..43f95de8 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/printing/page-break-after-avoid-expected.txt b/third_party/blink/web_tests/printing/page-break-after-avoid-expected.txt index e814ed2..a8467fba 100644 --- a/third_party/blink/web_tests/printing/page-break-after-avoid-expected.txt +++ b/third_party/blink/web_tests/printing/page-break-after-avoid-expected.txt
@@ -4,14 +4,15 @@ PASS: page number of "page1" is 1 -FAIL: expected page number of "page2-1" is 2. Was 1 -FAIL: expected page number of "page2-2" is 2. Was 1 +PASS: page number of "page2-1" is 2 +PASS: page number of "page2-2" is 2 PASS: page number of "page3-1" is 3 PASS: page number of "page3-2" is 3 PASS: page number of "page3-3" is 3 PASS: page number of "page5" is 5 -FAIL: expected page number of "page6-1" is 6. Was 5 +PASS: page number of "page6-1" is 6 PASS: page number of "page6-7" is 6 +All tests passed PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/printing/page-break-after-avoid.html b/third_party/blink/web_tests/printing/page-break-after-avoid.html index 596fb7b..83d11c3e 100644 --- a/third_party/blink/web_tests/printing/page-break-after-avoid.html +++ b/third_party/blink/web_tests/printing/page-break-after-avoid.html
@@ -3,6 +3,9 @@ <head> <script src="../resources/js-test.js"></script> <script src="resources/paged-media-test-utils.js"></script> +<style> + #sandbox > * { break-inside: avoid; } +</style> </head> <body> <p id="description"></p>
diff --git a/third_party/blink/web_tests/printing/page-break-before-avoid-expected.txt b/third_party/blink/web_tests/printing/page-break-before-avoid-expected.txt index 13f8edcf..6be6aa7 100644 --- a/third_party/blink/web_tests/printing/page-break-before-avoid-expected.txt +++ b/third_party/blink/web_tests/printing/page-break-before-avoid-expected.txt
@@ -4,16 +4,19 @@ PASS: page number of "page1" is 1 -FAIL: expected page number of "page2-1" is 2. Was 1 -FAIL: expected page number of "page2-2" is 2. Was 1 +PASS: page number of "page2-1" is 2 +PASS: page number of "page2-2" is 2 PASS: page number of "page3-1" is 3 PASS: page number of "page3-2" is 3 PASS: page number of "page3-3" is 3 PASS: page number of "page5" is 5 -FAIL: expected page number of "page6-1" is 6. Was 5 +PASS: page number of "page6-1" is 6 PASS: page number of "page6-7" is 6 PASS: page number of "page7" is 7 -PASS: page number of "page10" is 10 +PASS: page number of "page8" is 8 +PASS: page number of "page8-1" is 8 +PASS: page number of "page11" is 11 +All tests passed PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/printing/page-break-before-avoid.html b/third_party/blink/web_tests/printing/page-break-before-avoid.html index 74e855b..62ab2be 100644 --- a/third_party/blink/web_tests/printing/page-break-before-avoid.html +++ b/third_party/blink/web_tests/printing/page-break-before-avoid.html
@@ -3,6 +3,9 @@ <head> <script src="../resources/js-test.js"></script> <script src="resources/paged-media-test-utils.js"></script> +<style> + #sandbox > * { break-inside: avoid; } +</style> </head> <body> <p id="description"></p>
diff --git a/third_party/blink/web_tests/printing/script-tests/page-break-after-avoid.js b/third_party/blink/web_tests/printing/script-tests/page-break-after-avoid.js index 6487b98..2186304 100644 --- a/third_party/blink/web_tests/printing/script-tests/page-break-after-avoid.js +++ b/third_party/blink/web_tests/printing/script-tests/page-break-after-avoid.js
@@ -9,9 +9,9 @@ createBlockWithRatioToPageHeight("page2-2", 0.3); createBlockWithRatioToPageHeight("page3-1", 0.5).style.pageBreakBefore = "always"; - // A page break can occur inside of 'page3-3' block because it has child elements. createBlockWithRatioToPageHeight("page3-2", 0.3).style.pageBreakAfter = "avoid"; - createBlockWithNumberOfLines("page3-3", 10); + // A page break can occur between lines inside of 'page3-3'. + createBlockWithNumberOfLines("page3-3", 10).style.breakInside = "auto"; createBlockWithRatioToPageHeight("page5", 0.5).style.pageBreakBefore = "always"; // It seems unrealistic, but block 'page6-1' must move to the next page.
diff --git a/third_party/blink/web_tests/printing/script-tests/page-break-before-avoid.js b/third_party/blink/web_tests/printing/script-tests/page-break-before-avoid.js index 7d335f7c..bc0921d 100644 --- a/third_party/blink/web_tests/printing/script-tests/page-break-before-avoid.js +++ b/third_party/blink/web_tests/printing/script-tests/page-break-before-avoid.js
@@ -10,9 +10,11 @@ createBlockWithRatioToPageHeight("page2-2", 0.3).style.pageBreakBefore = "avoid"; createBlockWithRatioToPageHeight("page3-1", 0.5).style.pageBreakBefore = "always"; - // A page break can occur inside of 'page3-3' block because it has child elements. createBlockWithRatioToPageHeight("page3-2", 0.3); - createBlockWithNumberOfLines("page3-3", 10).style.pageBreakBefore = "avoid"; + // A page break can occur between lines inside of 'page3-3'. + var page3_3 = createBlockWithNumberOfLines("page3-3", 10); + page3_3.style.pageBreakBefore = "avoid"; + page3_3.style.breakInside = "auto"; createBlockWithRatioToPageHeight("page5", 0.5).style.pageBreakBefore = "always"; // It seems unrealistic, but block 'page6-1' must move to the next page. @@ -24,11 +26,10 @@ createBlockWithRatioToPageHeight("page6-6", 0.1).style.pageBreakBefore = "avoid"; createBlockWithRatioToPageHeight("page6-7", 0.1).style.pageBreakBefore = "avoid"; - // We don't define where block 'page7or8-1' is placed. createBlockWithRatioToPageHeight("page7", 0.5).style.pageBreakBefore = "always"; - createBlockWithRatioToPageHeight("page7or8-1", 0.1); - createBlockWithRatioToPageHeight("page7or8-2", 3).style.pageBreakBefore = "avoid"; - createBlockWithRatioToPageHeight("page10", 0.1); + createBlockWithRatioToPageHeight("page8", 0.1); + createBlockWithRatioToPageHeight("page8-1", 3).style.pageBreakBefore = "avoid"; + createBlockWithRatioToPageHeight("page11", 0.1); pageNumberForElementShouldBe("page1", 1); pageNumberForElementShouldBe("page2-1", 2); @@ -44,7 +45,9 @@ pageNumberForElementShouldBe("page6-7", 6); pageNumberForElementShouldBe("page7", 7); - pageNumberForElementShouldBe("page10", 10); + pageNumberForElementShouldBe("page8", 8); + pageNumberForElementShouldBe("page8-1", 8); + pageNumberForElementShouldBe("page11", 11); document.body.removeChild(document.getElementById("sandbox")); }
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png index 48699ed4..6af7c41 100644 --- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png +++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png index 48699ed4..6af7c41 100644 --- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png +++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png index 78dbc63..08b6dad8 100644 --- a/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png +++ b/third_party/blink/web_tests/svg/filters/feImage-preserveAspectRatio-all-expected.png Binary files differ
diff --git a/third_party/puffin/README.chromium b/third_party/puffin/README.chromium index 71edfbf8..d2b5dda 100644 --- a/third_party/puffin/README.chromium +++ b/third_party/puffin/README.chromium
@@ -58,4 +58,5 @@ subblocks. - Removing complete_static_lib = true from libpuffpatch to fix duplicate symbol issue in nonembedded android component_updater. -- Removing logs to reduce chromium binary size. \ No newline at end of file +- Removing logs to reduce chromium binary size. +- Fixed missing cstring includes for memcpy calls.
diff --git a/third_party/puffin/src/bit_reader.cc b/third_party/puffin/src/bit_reader.cc index 0ed68ef..2d04c25 100644 --- a/third_party/puffin/src/bit_reader.cc +++ b/third_party/puffin/src/bit_reader.cc
@@ -4,6 +4,8 @@ #include "puffin/src/bit_reader.h" +#include <cstring> + #include "puffin/src/logging.h" namespace puffin {
diff --git a/third_party/puffin/src/huffman_table.cc b/third_party/puffin/src/huffman_table.cc index 98d8997..cabbf67 100644 --- a/third_party/puffin/src/huffman_table.cc +++ b/third_party/puffin/src/huffman_table.cc
@@ -5,6 +5,7 @@ #include "puffin/src/huffman_table.h" #include <algorithm> +#include <cstring> #include <vector> #include "puffin/src/logging.h"
diff --git a/third_party/puffin/src/memory_stream.cc b/third_party/puffin/src/memory_stream.cc index 599f1af..bc29816 100644 --- a/third_party/puffin/src/memory_stream.cc +++ b/third_party/puffin/src/memory_stream.cc
@@ -6,6 +6,7 @@ #include <fcntl.h> #include <algorithm> +#include <cstring> #include <utility> #include "base/files/file.h"
diff --git a/third_party/puffin/src/puff_reader.cc b/third_party/puffin/src/puff_reader.cc index 89208ed..6dced13 100644 --- a/third_party/puffin/src/puff_reader.cc +++ b/third_party/puffin/src/puff_reader.cc
@@ -5,6 +5,7 @@ #include "puffin/src/puff_reader.h" #include <algorithm> +#include <cstring> #include <memory> #include <string> #include <vector>
diff --git a/third_party/puffin/src/puff_writer.cc b/third_party/puffin/src/puff_writer.cc index a746392..945ee1c 100644 --- a/third_party/puffin/src/puff_writer.cc +++ b/third_party/puffin/src/puff_writer.cc
@@ -5,6 +5,7 @@ #include "puffin/src/puff_writer.h" #include <algorithm> +#include <cstring> #include <memory> #include <string> #include <vector>
diff --git a/third_party/puffin/src/puffin_stream.cc b/third_party/puffin/src/puffin_stream.cc index aa814e07..4569faf 100644 --- a/third_party/puffin/src/puffin_stream.cc +++ b/third_party/puffin/src/puffin_stream.cc
@@ -5,6 +5,7 @@ #include "puffin/src/puffin_stream.h" #include <algorithm> +#include <cstring> #include <memory> #include <string> #include <utility>
diff --git a/third_party/rust/cxx/chromium_integration/rust_cxx.gni b/third_party/rust/cxx/chromium_integration/rust_cxx.gni index 99ef394..1ea9e40 100644 --- a/third_party/rust/cxx/chromium_integration/rust_cxx.gni +++ b/third_party/rust/cxx/chromium_integration/rust_cxx.gni
@@ -161,5 +161,9 @@ ":${target_name}_gen", "//build/rust:cxx_cppdeps", ] + if (defined(invoker.configs)) { + configs = [] + configs = invoker.configs + } } }
diff --git a/tools/code_coverage/coverage.py b/tools/code_coverage/coverage.py index 095c3d3..0f481786 100755 --- a/tools/code_coverage/coverage.py +++ b/tools/code_coverage/coverage.py
@@ -55,13 +55,17 @@ To learn more about generating code coverage reports for fuzz targets, see https://chromium.googlesource.com/chromium/src/+/main/testing/libfuzzer/efficient_fuzzer.md#Code-Coverage - * Sample workflow for running Blink web tests: + * Sample workflow for running Blink web platform tests: vpython3 tools/code_coverage/coverage.py blink_tests \\ - -wt -b out/coverage -o out/report -f third_party/blink + -b out/coverage -o out/report -f third_party/blink -wt - If you need to pass arguments to run_web_tests.py, use - -wt='arguments to run_web_tests.py e.g. test directories' + -wt flag tells coverage script that it is a web test, and can also be + used to pass arguments to run_web_tests.py + + vpython3 tools/code_coverage/coverage.py blink_wpt_tests \\ + -b out/Release -o out/report + -wt external/wpt/webcodecs/per-frame-qp-encoding.https.any.js For more options, please refer to tools/code_coverage/coverage.py -h. @@ -858,8 +862,16 @@ return binary_paths -def _GetCommandForWebTests(arguments): +def _GetCommandForWebTests(targets, arguments): """Return command to run for blink web tests.""" + assert len(targets) == 1, "Only one wpt target can be run" + target = targets[0] + expected_profraw_file_name = os.extsep.join( + [target, '%2m', PROFRAW_FILE_EXTENSION]) + expected_profraw_file_path = os.path.join( + coverage_utils.GetCoverageReportRootDirPath(OUTPUT_DIR), + expected_profraw_file_name) + cpu_count = multiprocessing.cpu_count() if sys.platform == 'win32': # TODO(crbug.com/1190269) - we can't use more than 56 @@ -870,8 +882,7 @@ command_list = [ 'third_party/blink/tools/run_web_tests.py', '--additional-driver-flag=--no-sandbox', - '--additional-env-var=LLVM_PROFILE_FILE=%s' % - LLVM_PROFILE_FILE_PATH_SUBSTITUTION, + '--additional-env-var=LLVM_PROFILE_FILE=%s' % expected_profraw_file_path, '--child-processes=%d' % cpu_count, '--disable-breakpad', '--no-show-results', '--skip-failing-tests', '--target=%s' % os.path.basename(BUILD_DIR), '--timeout-ms=30000' @@ -1104,7 +1115,7 @@ # Get .profdata file and list of binary paths. if args.web_tests: - commands = [_GetCommandForWebTests(args.web_tests)] + commands = [_GetCommandForWebTests(args.targets, args.web_tests)] profdata_file_path = _CreateCoverageProfileDataForTargets( args.targets, commands, args.jobs) binary_paths = [_GetBinaryPathForWebTests()]
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index f4eff444..d424c52c 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -5021,7 +5021,7 @@ <int value="1" label="StopVm request failed"/> <int value="2" label="Upstart jobs could not be stopped"/> <int value="3" label="GetFreeDiskSpace request failed"/> - <int value="4" label="GetAndroidDataSize request failed"/> + <int value="4" label="GetAndroidDataInfo request failed"/> <int value="5" label="CreateDiskImage request failed due to D-Bus error"/> <int value="6" label="CreateDiskImage request failed due to general error"/> <int value="7" label="ArcVmDataMigrator could not be started"/>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml index b6a5b61..28ca689 100644 --- a/tools/metrics/histograms/metadata/blink/histograms.xml +++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1001,6 +1001,18 @@ </summary> </histogram> +<histogram name="Blink.FedCm.AutoReauthn.BlockedByPreventSilentAccess" + enum="Boolean" expires_after="2023-10-08"> + <owner>npm@chromium.org</owner> + <owner>web-identity-eng@google.com</owner> + <summary> + Records whether the FedCM auto re-authn call is blocked because + preventSilentAccess() has been called on this site. Records at most one + sample per FedCM API with auto re-authn enabled: some failures could occur + before this metric is recorded. + </summary> +</histogram> + <histogram name="Blink.FedCm.AutoReauthn.ReturningAccounts" enum="FedCmReturningAccounts" expires_after="2023-10-08"> <owner>npm@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/companion/histograms.xml b/tools/metrics/histograms/metadata/companion/histograms.xml index a02db4be..dfa2a32 100644 --- a/tools/metrics/histograms/metadata/companion/histograms.xml +++ b/tools/metrics/histograms/metadata/companion/histograms.xml
@@ -38,15 +38,27 @@ expires_after="2023-10-20"> <owner>junzou@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> + <owner>src/chrome/browser/companion/OWNERS</owner> <summary> Records whether a text highlight operation was successful on the companion page. Recorded after text highlighting is completed. </summary> </histogram> +<histogram name="Companion.IsUserOptedInToExps" enum="BooleanOptedIn" + expires_after="2023-10-20"> + <owner>tbansal@chromium.org</owner> + <owner>src/chrome/browser/companion/OWNERS</owner> + <summary> + Records whether user is opted-in to various experiments. Recorded when the + information is received from the companion backend. + </summary> +</histogram> + <histogram name="Companion.PromoEvent" enum="Companion.PromoEvent" expires_after="2023-10-20"> <owner>shaktisahu@chromium.org</owner> + <owner>src/chrome/browser/companion/OWNERS</owner> <summary> Records various events (e.g. displayed, accepted or rejected) on various promo surfaces on the companion page. Recorded as soon as the event happens. @@ -56,6 +68,7 @@ <histogram name="Companion.{UiSurface}.Clicked" enum="BooleanClicked" expires_after="2023-10-20"> <owner>shaktisahu@chromium.org</owner> + <owner>src/chrome/browser/companion/OWNERS</owner> <summary> Records whether {UiSurface} was clicked by the user on the companion page. Recorded as soon as the surface is clicked. @@ -66,6 +79,7 @@ <histogram name="Companion.{UiSurface}.ClickPosition" units="Index" expires_after="2023-10-20"> <owner>shaktisahu@chromium.org</owner> + <owner>src/chrome/browser/companion/OWNERS</owner> <summary> Records the position of the UI element that was clicked with respect to its parent list. Recorded as soon as the surface is clicked. @@ -76,6 +90,7 @@ <histogram name="Companion.{UiSurface}.Shown" enum="BooleanShown" expires_after="2023-10-20"> <owner>shaktisahu@chromium.org</owner> + <owner>src/chrome/browser/companion/OWNERS</owner> <summary> Records whether {UiSurface} was shown on the companion page. Recorded as soon as the surface is shown.
diff --git a/tools/metrics/histograms/metadata/oobe/histograms.xml b/tools/metrics/histograms/metadata/oobe/histograms.xml index 60e05e5a..a142d4e 100644 --- a/tools/metrics/histograms/metadata/oobe/histograms.xml +++ b/tools/metrics/histograms/metadata/oobe/histograms.xml
@@ -697,6 +697,32 @@ </summary> </histogram> +<histogram name="OOBE.SyncConsentScreen.LacrosSyncOptIns.DataType.{OsDataType}" + enum="BooleanEnabled" expires_after="2024-05-01"> + <owner>bchikhaoui@google.com</owner> + <owner>cros-oac@google.com</owner> + <summary> + Records the selected data type to sync during the OS Sync consent screen in + OOBE flow with Lacros enabled. + </summary> + <token key="OsDataType"> + <variant name="SyncApps"/> + <variant name="SyncSettings"/> + <variant name="SyncWallpaper"/> + <variant name="SyncWifi"/> + </token> +</histogram> + +<histogram name="OOBE.SyncConsentScreen.LacrosSyncOptIns.SyncEverything" + enum="BooleanEnabled" expires_after="2024-05-01"> + <owner>bchikhaoui@google.com</owner> + <owner>cros-oac@google.com</owner> + <summary> + Indicate if sync all os types is enabled for the sync consent OOBE when + Lacros enabled. + </summary> +</histogram> + <histogram name="OOBE.SyncConsentScreen.LoadingTime" units="ms" expires_after="2023-11-01"> <owner>osamafathy@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml index f41b2ca..03bb37a8 100644 --- a/tools/metrics/histograms/metadata/privacy/histograms.xml +++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -713,6 +713,25 @@ </summary> </histogram> +<histogram + name="PrivacySandbox.PrivateAggregation.BudgetStorage.BeginInitializationCount" + units="units" expires_after="2023-11-12"> + <owner>anthonygarant@chromium.org</owner> + <owner>alexmt@chromium.org</owner> + <summary> + Count the number of times the budget storage begins initialization. This + metric is intended to be used in conjunction with the + "PrivacySandbox.PrivateAggregation.BudgetStorage.ShutdownBeforeFinishingInitialization" + metric, which does not measure cases where the browser is shut down + abruptly. + + To get the actual number of times the browser is shut down before finishing + initialization, including cases where shut down abruptly, subtract the + number of true events for "ShutdownBeforeFinishingInitialization"; + from this metric's total count. + </summary> +</histogram> + <histogram name="PrivacySandbox.PrivateAggregation.BudgetStorage.InitStatus" enum="PrivacySandboxPrivateAggregationBudgetStorageInitStatus" expires_after="2023-10-08">
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 0db66e1e..485d8d1 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -3786,6 +3786,14 @@ before this metric is recorded. </summary> </metric> + <metric name="AutoReauthn.BlockedByPreventSilentAccess" enum="Boolean"> + <summary> + Records whether the FedCM auto re-authn call is blocked because + preventSilentAccess() has been called on this site. Records at most one + sample per FedCM API with auto re-authn enabled: some failures could occur + before this metric is recorded. + </summary> + </metric> <metric name="AutoReauthn.ReturningAccounts" enum="FedCmReturningAccounts"> <summary> Records whether there was zero, one, or multiple returning accounts when a
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index e1e68021..25c9a854 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "perfetto-luci-artifacts/v34.0/linux-arm64/trace_processor_shell" }, "win": { - "hash": "2b03595a2a238eb8cc9e2c852d4c2e950414f8c8", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/87d4934194957d4d3073209cd450c197843fe25a/trace_processor_shell.exe" + "hash": "4caa0a434da5a09c623455a1237119ee8fbeaddc", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/fcdcbbae8aa5b54f7bf3d757992fa52dc8c0283e/trace_processor_shell.exe" }, "linux_arm": { "hash": "336a42cb9ec3c417e13a97816271fec10cdf67e5", "full_remote_path": "perfetto-luci-artifacts/v34.0/linux-arm/trace_processor_shell" }, "mac": { - "hash": "2999ff57f16546167297a64dc76e5873c20c94e1", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/87d4934194957d4d3073209cd450c197843fe25a/trace_processor_shell" + "hash": "1b58688c5bb8bfc56e3c1a4f23f242f11caf58da", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/fcdcbbae8aa5b54f7bf3d757992fa52dc8c0283e/trace_processor_shell" }, "mac_arm64": { "hash": "c32364e05e22cdf82ee0866aedd11c0e2050809c", "full_remote_path": "perfetto-luci-artifacts/v34.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "7097b3ce2a8c523258b092ef3c5bc4adb40186a4", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/87d4934194957d4d3073209cd450c197843fe25a/trace_processor_shell" + "hash": "8610743025a4953c9ee86a63aa2b0fa8aca05854", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/56d0d5eccc2b4e74e6157a8e36fb6f844c31e09b/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/color/ui_color_mixer.cc b/ui/color/ui_color_mixer.cc index b98320a8..4195019 100644 --- a/ui/color/ui_color_mixer.cc +++ b/ui/color/ui_color_mixer.cc
@@ -218,7 +218,7 @@ mixer[kColorShadowValueKeyShadowElevationSixteen] = SetAlpha(kColorShadowBase, 0x1a); mixer[kColorSidePanelComboboxBorder] = {SK_ColorTRANSPARENT}; - mixer[kColorSidePanelComboboxBackground] = {kColorPrimaryBackground}; + mixer[kColorSidePanelComboboxBackground] = {kColorSubtleEmphasisBackground}; mixer[kColorSliderThumb] = PickGoogleColor(kColorAccent, kColorDialogBackground, color_utils::kMinimumVisibleContrastRatio);
diff --git a/ui/gl/gl_features.cc b/ui/gl/gl_features.cc index 80c0b6d..cc3470c 100644 --- a/ui/gl/gl_features.cc +++ b/ui/gl/gl_features.cc
@@ -86,12 +86,7 @@ // platforms that would otherwise not default to using EGL bindings. BASE_FEATURE(kDefaultPassthroughCommandDecoder, "DefaultPassthroughCommandDecoder", -#if BUILDFLAG(IS_CHROMEOS) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif -); + base::FEATURE_DISABLED_BY_DEFAULT); #endif // !defined(PASSTHROUGH_COMMAND_DECODER_LAUNCHED) #if BUILDFLAG(IS_MAC)