diff --git a/DEPS b/DEPS index 52746ffe..2824281 100644 --- a/DEPS +++ b/DEPS
@@ -206,11 +206,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': 'abdfd39bb64e9c63dd5e7088f53f530bd97ab0d9', + 'skia_revision': 'a670782ed315e81862d94aed6e3958e35cdc8f94', # 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': '7bce5fed937f0fce6998e9f8025fba6368a257a7', + 'v8_revision': '55926e1a82bce8ab49a4bb16d36d941bd1cd8f98', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -218,7 +218,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '6883db53569fd219b1591177370a01b4e12a46eb', + 'angle_revision': '6d3d381e725125d6adb0f4a571426e3cfc6ab5a5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -226,7 +226,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '1105ef875a9375fc4e7030161817412f1db283c2', + 'pdfium_revision': '1dd069208c86928f3947b96bbb4daf0086cbbda0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -257,7 +257,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '840ce58f94bafdd24a138a9f7920becb5a30695f', + 'freetype_revision': '80389cab7f5823e7c3b3fe4190a7c337439317de', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. @@ -277,7 +277,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': 'e6d60bea7801bb7e7576e1623155fcb3f8dad976', + 'devtools_frontend_revision': '99620c4bfcfc49d75e9e2df8e22f8f5d8804324a', # 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. @@ -329,7 +329,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '875091308b04ba87e29c929ed707f27889c660ea', + 'dawn_revision': 'aff4c0366314c445dda2537a2f27c8c60ddf51da', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -368,7 +368,7 @@ 'ukey2_revision': '0275885d8e6038c39b8a8ca55e75d1d4d1727f47', # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'tint_revision': '89042538376b59419d2b9d53c2e716ab1f1cf8d5', + 'tint_revision': '7156d3e3140b361c34503e518fa078bd0189981f', # TODO(crbug.com/941824): The values below need to be kept in sync # between //DEPS and //buildtools/DEPS, so if you're updating one, @@ -912,7 +912,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4c45ca0dd90a390224b1031d068900f3e4c3f5c5', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '792630c498fc14ec1525e3b85591f96d4326432e', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1265,7 +1265,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '7411aeba4d3b11872828b8b15ac9bfddd63f4e6c', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e6f794f1dc5dcb51696a9c70ba882081f91859e7', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1497,7 +1497,7 @@ }, 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'af704183574c9b6540bd7dee27ba779950509f31', + Var('webrtc_git') + '/src.git' + '@' + 'e15fb15035fe5391a95a32a3d26cd611302ed688', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1569,7 +1569,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bb82eeb03d64621b652021cd7ba28eab36d7f20f', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c81dc527120bd953d0b36dd072c50925130958ef', 'condition': 'checkout_src_internal', }, @@ -2893,7 +2893,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone', - 'version': 'version:17.1.0-cr0', + 'version': 'version:17.5.0-cr0', }, ], 'condition': 'checkout_android', @@ -2915,7 +2915,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base', - 'version': 'version:17.0.0-cr0', + 'version': 'version:17.1.0-cr0', }, ], 'condition': 'checkout_android', @@ -2926,7 +2926,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement', - 'version': 'version:17.0.0-cr0', + 'version': 'version:17.1.0-cr0', }, ], 'condition': 'checkout_android',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index 9c2f3d5b..78e1544 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -1375,6 +1375,7 @@ 'content/public/android/generate_child_service.pydeps', 'net/tools/testserver/testserver.pydeps', 'testing/scripts/run_android_wpt.pydeps', + 'testing/scripts/run_isolated_script_test.pydeps', 'third_party/android_platform/development/scripts/stack.pydeps', 'third_party/blink/renderer/bindings/scripts/build_web_idl_database.pydeps', 'third_party/blink/renderer/bindings/scripts/collect_idl_files.pydeps',
diff --git a/android_webview/browser/aw_feature_list.cc b/android_webview/browser/aw_feature_list.cc index 48007f6e..14b16f3 100644 --- a/android_webview/browser/aw_feature_list.cc +++ b/android_webview/browser/aw_feature_list.cc
@@ -26,6 +26,7 @@ const base::Feature* kFeaturesExposedToJava[] = { &features::kWebViewConnectionlessSafeBrowsing, &features::kWebViewDisplayCutout, + &features::kWebViewMixedContentAutoupgrades, &features::kWebViewTestFeature, &features::kWebViewMeasureScreenCoverage, };
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc index 62bd8a4..d63a918 100644 --- a/android_webview/common/aw_features.cc +++ b/android_webview/common/aw_features.cc
@@ -29,6 +29,15 @@ const base::Feature kWebViewExtraHeadersSameDomainOnly{ "WebViewExtraHeadersSameDomainOnly", base::FEATURE_ENABLED_BY_DEFAULT}; +// When enabled, passive mixed content (Audio/Video/Image subresources loaded +// over HTTP on HTTPS sites) will be autoupgraded to HTTPS, and the load will be +// blocked if the resource fails to load over HTTPS. This only affects apps that +// set the mixed content mode to MIXED_CONTENT_COMPATIBILITY_MODE, autoupgrades +// are always disabled for MIXED_CONTENT_NEVER_ALLOW and +// MIXED_CONTENT_ALWAYS_ALLOW modes. +const base::Feature kWebViewMixedContentAutoupgrades{ + "WebViewMixedContentAutoupgrades", base::FEATURE_DISABLED_BY_DEFAULT}; + // Only allow extra headers added via loadUrl() to be sent to the original // origin; strip them from the request if a cross-origin redirect occurs. // When this is enabled, kWebViewExtraHeadersSameDomainOnly has no effect.
diff --git a/android_webview/common/aw_features.h b/android_webview/common/aw_features.h index a2ca23a..dcfba51 100644 --- a/android_webview/common/aw_features.h +++ b/android_webview/common/aw_features.h
@@ -20,6 +20,7 @@ extern const base::Feature kWebViewExtraHeadersSameDomainOnly; extern const base::Feature kWebViewExtraHeadersSameOriginOnly; extern const base::Feature kWebViewMeasureScreenCoverage; +extern const base::Feature kWebViewMixedContentAutoupgrades; extern const base::Feature kWebViewTestFeature; extern const base::Feature kWebViewWideColorGamutSupport;
diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected index 7db6f74..07e8126 100644 --- a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
@@ -67,14 +67,16 @@ android:exported="true" android:grantUriPermissions="true" android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider" - android:process=":webview_apk"> + android:process=":webview_apk" + tools:ignore="ExportedContentProvider"> </provider> # DIFF-ANCHOR: a5e78e63 <provider # DIFF-ANCHOR: bfe37944 android:authorities="$PACKAGE.DeveloperModeContentProvider" android:exported="true" android:name="org.chromium.android_webview.services.DeveloperModeContentProvider" android:process=":webview_service" - android:visibleToInstantApps="true"> + android:visibleToInstantApps="true" + tools:ignore="ExportedContentProvider"> </provider> # DIFF-ANCHOR: bfe37944 <receiver # DIFF-ANCHOR: 1091f66b android:exported="false" @@ -103,7 +105,8 @@ <service # DIFF-ANCHOR: 5cda9608 android:exported="true" android:name="org.chromium.android_webview.services.CrashReceiverService" - android:process=":webview_service"> + android:process=":webview_service" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: 5cda9608 <service # DIFF-ANCHOR: adce9ea1 android:exported="false" @@ -114,12 +117,14 @@ android:exported="true" android:name="org.chromium.android_webview.services.MetricsBridgeService" android:process=":webview_service" - android:visibleToInstantApps="true"> + android:visibleToInstantApps="true" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: eecf2fee <service # DIFF-ANCHOR: dc926e35 android:exported="true" android:name="org.chromium.android_webview.services.VariationsSeedServer" - android:process=":webview_service"> + android:process=":webview_service" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: dc926e35 <service # DIFF-ANCHOR: b1e3e8bd android:exported="true"
diff --git a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected index c410529..f46f3621e 100644 --- a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
@@ -67,14 +67,16 @@ android:exported="true" android:grantUriPermissions="true" android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider" - android:process=":webview_apk"> + android:process=":webview_apk" + tools:ignore="ExportedContentProvider"> </provider> # DIFF-ANCHOR: a5e78e63 <provider # DIFF-ANCHOR: bfe37944 android:authorities="$PACKAGE.DeveloperModeContentProvider" android:exported="true" android:name="org.chromium.android_webview.services.DeveloperModeContentProvider" android:process=":webview_service" - android:visibleToInstantApps="true"> + android:visibleToInstantApps="true" + tools:ignore="ExportedContentProvider"> </provider> # DIFF-ANCHOR: bfe37944 <receiver # DIFF-ANCHOR: 1091f66b android:exported="false" @@ -103,7 +105,8 @@ <service # DIFF-ANCHOR: 5cda9608 android:exported="true" android:name="org.chromium.android_webview.services.CrashReceiverService" - android:process=":webview_service"> + android:process=":webview_service" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: 5cda9608 <service # DIFF-ANCHOR: adce9ea1 android:exported="false" @@ -114,12 +117,14 @@ android:exported="true" android:name="org.chromium.android_webview.services.MetricsBridgeService" android:process=":webview_service" - android:visibleToInstantApps="true"> + android:visibleToInstantApps="true" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: eecf2fee <service # DIFF-ANCHOR: dc926e35 android:exported="true" android:name="org.chromium.android_webview.services.VariationsSeedServer" - android:process=":webview_service"> + android:process=":webview_service" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: dc926e35 <service # DIFF-ANCHOR: b1e3e8bd android:exported="true"
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java index 5d29d13..f8dac448 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java
@@ -106,8 +106,9 @@ * * @param webView the {@link WebView} instance that this adapter is serving. */ - WebViewContentsClientAdapter(WebView webView, Context context, - WebViewDelegate webViewDelegate) { + @SuppressWarnings("HandlerLeak") + WebViewContentsClientAdapter( + WebView webView, Context context, WebViewDelegate webViewDelegate) { super(webView, webViewDelegate, context); try (ScopedSysTraceEvent event = ScopedSysTraceEvent.scoped("WebViewContentsClientAdapter.constructor")) { @@ -746,6 +747,7 @@ } @Override + @SuppressWarnings("HandlerLeak") public void onReceivedSslError(final Callback<Boolean> callback, SslError error) { try { TraceEvent.begin("WebViewContentsClientAdapter.onReceivedSslError");
diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index dfe64bf..3fde85c 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -17,6 +17,7 @@ import androidx.annotation.IntDef; +import org.chromium.android_webview.common.AwFeatures; import org.chromium.android_webview.safe_browsing.AwSafeBrowsingConfigHelper; import org.chromium.android_webview.settings.ForceDarkBehavior; import org.chromium.android_webview.settings.ForceDarkMode; @@ -1757,6 +1758,9 @@ } public void setMixedContentMode(int mode) { + // Using explicit max count for the histogram since enum is defined in Android code. The + // values can be trusted to remain stable since they are defined in the Android API. + RecordHistogram.recordEnumeratedHistogram("Android.WebView.MixedContent.Mode", mode, 3); synchronized (mAwSettingsLock) { if (mMixedContentMode != mode) { mMixedContentMode = mode; @@ -1838,10 +1842,16 @@ @CalledByNative private boolean getAllowMixedContentAutoupgradesLocked() { - // TODO(crbug.com/1139424): Mixed content autoupgrades are temporarily disabled completely - // on WebView. This should remain as is for MIXED_CONTENT_ALWAYS_ALLOW and - // MIXED_CONTENT_NEVER_ALLOW, but should be controlled via a variations flag for - // MIXED_CONTENT_COMPATIBILITY_MODE. + if (AwFeatureList.isEnabled(AwFeatures.WEBVIEW_MIXED_CONTENT_AUTOUPGRADES)) { + // We only allow mixed content autoupgrades (upgrading HTTP subresources to HTTPS in + // HTTPS sites) when the mixed content mode is set to MIXED_CONTENT_COMPATIBILITY, which + // keeps it in line with the behavior in Chrome. With MIXED_CONTENT_ALWAYS_ALLOW, we + // disable autoupgrades since the developer is explicitly allowing mixed content, + // whereas with MIXED_CONTENT_NEVER_ALLOW, there is no need to autoupgrade since the + // content will be blocked. + assert Thread.holdsLock(mAwSettingsLock); + return mMixedContentMode == WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE; + } return false; }
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index 7249bc2..6fd96f59 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -98,5 +98,8 @@ "Forces WebView to do rendering work in little cores"), Flag.baseFeature(BlinkFeatures.WEBVIEW_ACCELERATE_SMALL_CANVASES, "Accelerate all canvases in webview."), + Flag.baseFeature(AwFeatures.WEBVIEW_MIXED_CONTENT_AUTOUPGRADES, + "Enables autoupgrades for audio/video/image mixed content when mixed content " + + "mode is set to MIXED_CONTENT_COMPATIBILITY_MODE"), }; }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java index e7b9c79..0f5450d 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -27,8 +27,10 @@ import org.junit.runner.RunWith; import org.chromium.android_webview.AwContents; +import org.chromium.android_webview.AwFeatureList; import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.AwSettings.LayoutAlgorithm; +import org.chromium.android_webview.common.AwFeatures; import org.chromium.android_webview.test.AwActivityTestRule.TestDependencyFactory; import org.chromium.android_webview.test.TestAwContentsClient.DoUpdateVisitedHistoryHelper; import org.chromium.android_webview.test.util.CommonResources; @@ -3309,6 +3311,7 @@ httpsServer = TestWebServer.startSsl(); httpServer = TestWebServer.start(); httpServer.setServerHost("example.com"); + httpsServer.setServerHost("secure.com"); final String jsUrl = "/insecure.js"; final String imageUrl = "/insecure.png"; @@ -3338,11 +3341,29 @@ Assert.assertEquals(1, httpServer.getRequestCount(imageUrl)); awSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); - mActivityTestRule.loadUrlSync( - awContents, contentClient.getOnPageFinishedHelper(), fullSecureUrl); - Assert.assertEquals(3, httpsServer.getRequestCount(secureUrl)); - Assert.assertEquals(1, httpServer.getRequestCount(jsUrl)); - Assert.assertEquals(2, httpServer.getRequestCount(imageUrl)); + if (AwFeatureList.isEnabled(AwFeatures.WEBVIEW_MIXED_CONTENT_AUTOUPGRADES)) { + // COMPATIBILITY_MODE enables autoupgrades for passive mixed content (including + // images), so we set the image url to the HTTP version of the HTTPS server, and + // check it was autoupgraded by expecting the HTTPS server to be hit. + String httpImageUrl = httpsServer.setResponseBase64( + imageUrl, CommonResources.FAVICON_DATA_BASE64, null); + httpImageUrl = httpImageUrl.replaceFirst("https", "http"); + final String autoupgradedImageHtml = "<img src=\"" + httpImageUrl + "\" />"; + final String htmlForAutoupgrade = + "<body>" + autoupgradedImageHtml + " " + jsHtml + "</body>"; + fullSecureUrl = httpsServer.setResponse(secureUrl, htmlForAutoupgrade, null); + mActivityTestRule.loadUrlSync( + awContents, contentClient.getOnPageFinishedHelper(), fullSecureUrl); + Assert.assertEquals(1, httpsServer.getRequestCount(secureUrl)); + Assert.assertEquals(1, httpsServer.getRequestCount(imageUrl)); + Assert.assertEquals(1, httpServer.getRequestCount(jsUrl)); + } else { + mActivityTestRule.loadUrlSync( + awContents, contentClient.getOnPageFinishedHelper(), fullSecureUrl); + Assert.assertEquals(3, httpsServer.getRequestCount(secureUrl)); + Assert.assertEquals(1, httpServer.getRequestCount(jsUrl)); + Assert.assertEquals(2, httpServer.getRequestCount(imageUrl)); + } } finally { if (httpServer != null) { httpServer.shutdown();
diff --git a/android_webview/nonembedded/java/AndroidManifest.xml b/android_webview/nonembedded/java/AndroidManifest.xml index 0d43bbe3..41d136ef 100644 --- a/android_webview/nonembedded/java/AndroidManifest.xml +++ b/android_webview/nonembedded/java/AndroidManifest.xml
@@ -76,13 +76,15 @@ android:exported="true" android:authorities="{{ manifest_package }}.LicenseContentProvider" android:grantUriPermissions="true" - android:process=":webview_apk" /> {# Explicit process required for monochrome compatibility. #} + android:process=":webview_apk" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedContentProvider"/> <!-- Disabled by default, enabled at runtime by Developer UI. --> <provider android:name="org.chromium.android_webview.services.DeveloperModeContentProvider" android:visibleToInstantApps="true" android:exported="true" android:authorities="{{ manifest_package }}.DeveloperModeContentProvider" - android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} + android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedContentProvider" /> {% if donor_package is not defined %} <!-- If you change the variations services, also see android_webview/test/shell/AndroidManifest.xml. --> @@ -91,14 +93,16 @@ PathUtils.getDataDirectory() from Chrome. --> <service android:name="org.chromium.android_webview.services.VariationsSeedServer" android:exported="true" - android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} + android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedService" /> <service android:name="org.chromium.android_webview.services.AwVariationsSeedFetcher" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} <service android:name="org.chromium.android_webview.services.CrashReceiverService" android:exported="true" - android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} + android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedService" /> <service android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" @@ -109,7 +113,8 @@ <service android:name="org.chromium.android_webview.services.MetricsBridgeService" android:exported="true" android:visibleToInstantApps="true" - android:process=":webview_service" /> {# Explicit process required for monochrome compatibility. #} + android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedService" /> {% endif %} {% endmacro %} {{ common(manifest_package|default('com.android.webview'), library|default('libwebviewchromium.so')) }}
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 6703983..15aaa07 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -285,6 +285,8 @@ "capture_mode/capture_window_observer.h", "capture_mode/stop_recording_button_tray.cc", "capture_mode/stop_recording_button_tray.h", + "capture_mode/video_file_handler.cc", + "capture_mode/video_file_handler.h", "capture_mode/view_with_ink_drop.h", "child_accounts/parent_access_controller_impl.cc", "child_accounts/parent_access_controller_impl.h", @@ -1938,6 +1940,7 @@ "autoclick/autoclick_drag_event_rewriter_unittest.cc", "autoclick/autoclick_unittest.cc", "capture_mode/capture_mode_unittests.cc", + "capture_mode/video_file_handler_unittest.cc", "child_accounts/parent_access_controller_impl_unittest.cc", "clipboard/clipboard_history_controller_unittest.cc", "clipboard/clipboard_history_resource_manager_unittest.cc",
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index ed6877bd..96b7255 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -1391,9 +1391,9 @@ std::unique_ptr<AppListItemView> view = std::make_unique<AppListItemView>( this, item, contents_view_->GetAppListMainView()->view_delegate(), is_in_folder); - view->set_callback(base::BindRepeating( - &AppsGridView::OnAppListItemViewPressed, base::Unretained(this), - base::Unretained(view.get()))); + view->SetCallback(base::BindRepeating(&AppsGridView::OnAppListItemViewPressed, + base::Unretained(this), + base::Unretained(view.get()))); return view; }
diff --git a/ash/app_list/views/page_switcher.cc b/ash/app_list/views/page_switcher.cc index 8dcef09..67147597 100644 --- a/ash/app_list/views/page_switcher.cc +++ b/ash/app_list/views/page_switcher.cc
@@ -263,9 +263,9 @@ for (int i = 0; i < model_->total_pages(); ++i) { PageSwitcherButton* button = buttons_->AddChildView( std::make_unique<PageSwitcherButton>(is_root_app_grid_page_switcher_)); - button->set_callback(base::BindRepeating(&PageSwitcher::OnButtonPressed, - base::Unretained(this), - base::Unretained(button))); + button->SetCallback(base::BindRepeating(&PageSwitcher::OnButtonPressed, + base::Unretained(this), + base::Unretained(button))); button->SetAccessibleName(l10n_util::GetStringFUTF16( IDS_APP_LIST_PAGE_SWITCHER, base::FormatNumber(i + 1), base::FormatNumber(model_->total_pages())));
diff --git a/ash/app_list/views/privacy_info_view.cc b/ash/app_list/views/privacy_info_view.cc index d23e543..65780b3 100644 --- a/ash/app_list/views/privacy_info_view.cc +++ b/ash/app_list/views/privacy_info_view.cc
@@ -265,8 +265,8 @@ views::StyledLabel::RangeStyleInfo link_style; link_style.disable_line_wrapping = true; auto custom_view = std::make_unique<views::Link>(link); - custom_view->set_callback(base::BindRepeating(&PrivacyInfoView::LinkClicked, - base::Unretained(this))); + custom_view->SetCallback(base::BindRepeating(&PrivacyInfoView::LinkClicked, + base::Unretained(this))); custom_view->SetEnabledColor(gfx::kGoogleBlue700); link_style.custom_view = custom_view.get(); link_view_ = custom_view.get(); @@ -277,7 +277,7 @@ void PrivacyInfoView::InitCloseButton() { auto close_button = std::make_unique<views::ImageButton>(); - close_button->set_callback(base::BindRepeating( + close_button->SetCallback(base::BindRepeating( &PrivacyInfoView::OnButtonPressed, base::Unretained(this))); close_button->SetImage(views::ImageButton::STATE_NORMAL, gfx::CreateVectorIcon(views::kCloseIcon, kIconSizeDip,
diff --git a/ash/app_list/views/search_result_suggestion_chip_view.cc b/ash/app_list/views/search_result_suggestion_chip_view.cc index 7964573..63158c4 100644 --- a/ash/app_list/views/search_result_suggestion_chip_view.cc +++ b/ash/app_list/views/search_result_suggestion_chip_view.cc
@@ -56,7 +56,7 @@ AppListViewDelegate* view_delegate) : view_delegate_(view_delegate) { SetFocusBehavior(FocusBehavior::ALWAYS); - set_callback( + SetCallback( base::BindRepeating(&SearchResultSuggestionChipView::OnButtonPressed, base::Unretained(this)));
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc index 579380a..25e42d5 100644 --- a/ash/app_list/views/search_result_tile_item_view.cc +++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -74,8 +74,8 @@ is_app_reinstall_recommendation_enabled_( app_list_features::IsAppReinstallZeroStateEnabled()), show_in_apps_page_(show_in_apps_page) { - set_callback(base::BindRepeating(&SearchResultTileItemView::OnButtonPressed, - base::Unretained(this))); + SetCallback(base::BindRepeating(&SearchResultTileItemView::OnButtonPressed, + base::Unretained(this))); SetFocusBehavior(FocusBehavior::ALWAYS); // When |result_| is null, the tile is invisible. Calling SetSearchResult with
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc index 98fe943f..418192b 100644 --- a/ash/app_list/views/search_result_view.cc +++ b/ash/app_list/views/search_result_view.cc
@@ -62,8 +62,8 @@ AppListViewDelegate* view_delegate) : list_view_(list_view), view_delegate_(view_delegate) { SetFocusBehavior(FocusBehavior::ALWAYS); - set_callback(base::BindRepeating(&SearchResultView::OnButtonPressed, - base::Unretained(this))); + SetCallback(base::BindRepeating(&SearchResultView::OnButtonPressed, + base::Unretained(this))); icon_ = AddChildView(std::make_unique<views::ImageView>()); display_icon_ = AddChildView(std::make_unique<views::ImageView>());
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.cc b/ash/assistant/ui/main_stage/suggestion_container_view.cc index d0dd4079..af77d03 100644 --- a/ash/assistant/ui/main_stage/suggestion_container_view.cc +++ b/ash/assistant/ui/main_stage/suggestion_container_view.cc
@@ -200,7 +200,7 @@ const AssistantSuggestion& suggestion) { auto suggestion_chip_view = std::make_unique<SuggestionChipView>(delegate(), suggestion); - suggestion_chip_view->set_callback(base::BindRepeating( + suggestion_chip_view->SetCallback(base::BindRepeating( &SuggestionContainerView::OnButtonPressed, base::Unretained(this), base::Unretained(suggestion_chip_view.get())));
diff --git a/ash/capture_mode/capture_label_view.cc b/ash/capture_mode/capture_label_view.cc index 4e4b3964..2ab2cc38 100644 --- a/ash/capture_mode/capture_label_view.cc +++ b/ash/capture_mode/capture_label_view.cc
@@ -11,9 +11,16 @@ #include "ash/style/ash_color_provider.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/i18n/number_formatting.h" +#include "base/task_runner.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/compositor/callback_layer_animation_observer.h" +#include "ui/compositor/layer_animation_element.h" +#include "ui/compositor/layer_animation_sequence.h" +#include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/text_constants.h" +#include "ui/gfx/transform.h" +#include "ui/gfx/transform_util.h" #include "ui/views/background.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/label.h" @@ -23,19 +30,109 @@ namespace { -bool g_use_delay_for_testing = false; - // Capture label button rounded corner radius. constexpr int kCaptureLabelRadius = 18; -constexpr base::TimeDelta kCountDownDuration = base::TimeDelta::FromSeconds(1); -constexpr base::TimeDelta kCountDownDurationForTesting = - base::TimeDelta::FromMilliseconds(10); +constexpr int kCountDownStartSeconds = 3; +constexpr int kCountDownEndSeconds = 1; + +constexpr base::TimeDelta kCaptureLabelOpacityFadeoutDuration = + base::TimeDelta::FromMilliseconds(33); +// Opacity fade in animation duration and scale up animation duration when the +// timeout label enters 3. +constexpr base::TimeDelta kCountDownEnter3Duration = + base::TimeDelta::FromMilliseconds(267); +// Opacity fade out animation duration and scale down animation duration when +// the timeout label exits 1. +constexpr base::TimeDelta kCountDownExit1Duration = + base::TimeDelta::FromMilliseconds(333); +// For other number enter/exit fade in/out, scale up/down animation duration. +constexpr base::TimeDelta kCountDownEnterExitDuration = + base::TimeDelta::FromMilliseconds(167); + +// Delay to enter number 3 to start count down. +constexpr base::TimeDelta kStartCountDownDelay = + base::TimeDelta::FromMilliseconds(233); +// Delay to exit a number after entering animation is completed. +constexpr base::TimeDelta kCountDownExitDelay = + base::TimeDelta::FromMilliseconds(667); + +// Different scales for enter/exiting countdown numbers. +constexpr float kEnterLabelScaleDown = 0.8f; +constexpr float kExitLabelScaleUp = 1.2f; +// Scale when exiting the number 1, unlike the other numbers, it will shrink +// down a bit and fade out. +constexpr float kExitLabel1ScaleDown = 0.8f; + +void GetOpacityCountDownAnimationSetting(int count_down_number, + bool enter, + base::TimeDelta* duration, + gfx::Tween::Type* tween_type) { + if (count_down_number == kCountDownStartSeconds && enter) { + *duration = kCountDownEnter3Duration; + *tween_type = gfx::Tween::LINEAR_OUT_SLOW_IN; + } else if (count_down_number == kCountDownEndSeconds && !enter) { + *duration = kCountDownExit1Duration; + *tween_type = gfx::Tween::EASE_OUT_3; + } else { + *duration = kCountDownEnterExitDuration; + *tween_type = gfx::Tween::LINEAR; + } +} + +void GetTransformCountDownAnimationSetting(int count_down_number, + bool enter, + base::TimeDelta* duration, + gfx::Tween::Type* tween_type) { + if (count_down_number == kCountDownStartSeconds && enter) { + *duration = kCountDownEnter3Duration; + *tween_type = gfx::Tween::LINEAR_OUT_SLOW_IN; + } else if (count_down_number == kCountDownEndSeconds && !enter) { + *duration = kCountDownExit1Duration; + *tween_type = gfx::Tween::EASE_OUT_3; + } else if (enter) { + *duration = kCountDownEnterExitDuration; + *tween_type = gfx::Tween::LINEAR_OUT_SLOW_IN; + } else { + *duration = kCountDownEnterExitDuration; + *tween_type = gfx::Tween::FAST_OUT_LINEAR_IN; + } +} + +std::unique_ptr<ui::LayerAnimationElement> CreateOpacityLayerAnimationElement( + float target_opacity, + base::TimeDelta duration, + gfx::Tween::Type tween_type) { + std::unique_ptr<ui::LayerAnimationElement> opacity_element = + ui::LayerAnimationElement::CreateOpacityElement(target_opacity, duration); + opacity_element->set_tween_type(tween_type); + return opacity_element; +} + +std::unique_ptr<ui::LayerAnimationElement> CreateTransformLayerAnimationElement( + const gfx::Transform& target_transform, + base::TimeDelta duration, + gfx::Tween::Type tween_type) { + std::unique_ptr<ui::LayerAnimationElement> transform_element = + ui::LayerAnimationElement::CreateTransformElement(target_transform, + duration); + transform_element->set_tween_type(tween_type); + return transform_element; +} + +// Returns the transform that can scale |bounds| around its center point. +gfx::Transform GetScaleTransform(const gfx::Rect& bounds, float scale) { + const gfx::Point center_point = bounds.CenterPoint(); + return gfx::GetScaleTransform( + gfx::Point(center_point.x() - bounds.x(), center_point.y() - bounds.y()), + scale); +} } // namespace CaptureLabelView::CaptureLabelView(CaptureModeSession* capture_mode_session) - : capture_mode_session_(capture_mode_session) { + : timeout_count_down_(kCountDownStartSeconds), + capture_mode_session_(capture_mode_session) { SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); @@ -49,8 +146,10 @@ SkColor text_color = color_provider->GetContentLayerColor( AshColorProvider::ContentLayerType::kTextColorPrimary); - label_button_ = AddChildView( - std::make_unique<views::LabelButton>(this, base::string16())); + label_button_ = AddChildView(std::make_unique<views::LabelButton>( + base::BindRepeating(&CaptureLabelView::OnButtonPressed, + base::Unretained(this)), + base::string16())); label_button_->SetPaintToLayer(); label_button_->layer()->SetFillsBoundsOpaquely(false); label_button_->SetEnabledTextColors(text_color); @@ -74,11 +173,6 @@ CaptureLabelView::~CaptureLabelView() = default; -// static -void CaptureLabelView::SetUseDelayForTesting(bool use_delay) { - g_use_delay_for_testing = true; -} - void CaptureLabelView::UpdateIconAndText() { CaptureModeController* controller = CaptureModeController::Get(); const CaptureModeSource source = controller->source(); @@ -155,15 +249,30 @@ void CaptureLabelView::StartCountDown( base::OnceClosure countdown_finished_callback) { countdown_finished_callback_ = std::move(countdown_finished_callback); - label_button_->SetVisible(false); - label_->SetVisible(true); - CountDown(); - base::TimeDelta duration = g_use_delay_for_testing - ? kCountDownDurationForTesting - : kCountDownDuration; - count_down_timer_.Start(FROM_HERE, duration, this, - &CaptureLabelView::CountDown); + // Depending on the visibility of |label_button_| and |label_|, decide which + // view needs to fade out. + ui::Layer* animation_layer = nullptr; + if (label_button_->GetVisible()) + animation_layer = label_button_->layer(); + if (label_->GetVisible()) + animation_layer = label_->layer(); + if (animation_layer) { + // Fade out the opacity. + animation_layer->SetOpacity(1.f); + ui::ScopedLayerAnimationSettings settings(animation_layer->GetAnimator()); + settings.SetTweenType(gfx::Tween::LINEAR); + settings.SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); + settings.SetTransitionDuration(kCaptureLabelOpacityFadeoutDuration); + animation_layer->SetOpacity(0.f); + } + + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&CaptureLabelView::ScheduleCountDownAnimation, + weak_factory_.GetWeakPtr()), + kStartCountDownDelay); } bool CaptureLabelView::IsInCountDownAnimation() const { @@ -179,7 +288,7 @@ } gfx::Size CaptureLabelView::CalculatePreferredSize() const { - if (count_down_timer_.IsRunning()) + if (countdown_finished_callback_) return gfx::Size(kCaptureLabelRadius * 2, kCaptureLabelRadius * 2); const bool is_label_button_visible = label_button_->GetVisible(); @@ -200,19 +309,133 @@ kCaptureLabelRadius * 2); } -void CaptureLabelView::ButtonPressed(views::Button* sender, - const ui::Event& event) { - DCHECK_EQ(static_cast<views::Button*>(label_button_), sender); - CaptureModeController::Get()->PerformCapture(); -} +void CaptureLabelView::ScheduleCountDownAnimation() { + label_->SetVisible(true); + label_->SetText(base::FormatNumber(timeout_count_down_)); -void CaptureLabelView::CountDown() { - if (timeout_count_down_ == 0) { - std::move(countdown_finished_callback_).Run(); // |this| is destroyed here. - return; + // Initial setup for entering |timeout_count_down_|: + ui::Layer* label_layer = label_->layer(); + label_layer->SetOpacity(0.f); + // Use target bounds as when this function is called, we're still in bounds + // change animation, Widget::GetBoundsInScreen() won't return correct value. + gfx::Rect bounds = GetWidget()->GetLayer()->GetTargetBounds(); + bounds.ClampToCenteredSize(label_->GetPreferredSize()); + label_layer->SetTransform(GetScaleTransform(bounds, kEnterLabelScaleDown)); + if (!animation_observer_) { + animation_observer_ = std::make_unique<ui::CallbackLayerAnimationObserver>( + base::BindRepeating(&CaptureLabelView::OnCountDownAnimationCompleted, + base::Unretained(this))); } - label_->SetText(base::FormatNumber(timeout_count_down_--)); + StartLabelLayerAnimationSequences(); + StartWidgetLayerAnimationSequences(); + animation_observer_->SetActive(); +} + +bool CaptureLabelView::OnCountDownAnimationCompleted( + const ui::CallbackLayerAnimationObserver& observer) { + if (timeout_count_down_ == kCountDownEndSeconds) { + std::move(countdown_finished_callback_).Run(); // |this| is destroyed here. + } else { + timeout_count_down_--; + ScheduleCountDownAnimation(); + } + + // Return false to prevent the observer from destroying itself. + return false; +} + +void CaptureLabelView::StartLabelLayerAnimationSequences() { + // Create |label_opacity_sequence|. Note we don't need the exit animation for + // the last countdown number 1, since when exiting number 1, we'll fade out + // the entire widget, not just the label. + std::unique_ptr<ui::LayerAnimationSequence> label_opacity_sequence = + std::make_unique<ui::LayerAnimationSequence>(); + base::TimeDelta enter_duration, exit_duration; + gfx::Tween::Type enter_type, exit_type; + GetOpacityCountDownAnimationSetting(timeout_count_down_, /*enter=*/true, + &enter_duration, &enter_type); + GetOpacityCountDownAnimationSetting(timeout_count_down_, /*enter=*/false, + &exit_duration, &exit_type); + + label_opacity_sequence->AddElement( + CreateOpacityLayerAnimationElement(1.f, enter_duration, enter_type)); + label_opacity_sequence->AddElement( + ui::LayerAnimationElement::CreatePauseElement( + ui::LayerAnimationElement::OPACITY, kCountDownExitDelay)); + const bool is_final_second = timeout_count_down_ == kCountDownEndSeconds; + if (!is_final_second) { + label_opacity_sequence->AddElement( + CreateOpacityLayerAnimationElement(0.f, exit_duration, exit_type)); + } + + // Construct |label_transfrom_sequence|. Same reason above, we don't need + // the exit animation for the last countdown number 1. + std::unique_ptr<ui::LayerAnimationSequence> label_transfrom_sequence = + std::make_unique<ui::LayerAnimationSequence>(); + GetTransformCountDownAnimationSetting(timeout_count_down_, /*enter=*/true, + &enter_duration, &enter_type); + GetTransformCountDownAnimationSetting(timeout_count_down_, /*enter=*/false, + &exit_duration, &exit_type); + + label_transfrom_sequence->AddElement(CreateTransformLayerAnimationElement( + gfx::Transform(), enter_duration, enter_type)); + label_transfrom_sequence->AddElement( + ui::LayerAnimationElement::CreatePauseElement( + ui::LayerAnimationElement::TRANSFORM, kCountDownExitDelay)); + if (!is_final_second) { + gfx::Rect bounds = GetWidget()->GetLayer()->GetTargetBounds(); + bounds.ClampToCenteredSize(label_->GetPreferredSize()); + label_transfrom_sequence->AddElement(CreateTransformLayerAnimationElement( + GetScaleTransform(bounds, kExitLabelScaleUp), exit_duration, + exit_type)); + } + + label_opacity_sequence->AddObserver(animation_observer_.get()); + label_transfrom_sequence->AddObserver(animation_observer_.get()); + label_->layer()->GetAnimator()->StartTogether( + {label_opacity_sequence.release(), label_transfrom_sequence.release()}); +} + +void CaptureLabelView::StartWidgetLayerAnimationSequences() { + // Only need animate the widget layer when exiting the last countdown number. + if (timeout_count_down_ != kCountDownEndSeconds) + return; + + std::unique_ptr<ui::LayerAnimationSequence> widget_opacity_sequence = + std::make_unique<ui::LayerAnimationSequence>(); + base::TimeDelta exit_duration; + gfx::Tween::Type exit_type; + GetOpacityCountDownAnimationSetting(timeout_count_down_, /*enter=*/false, + &exit_duration, &exit_type); + widget_opacity_sequence->AddElement( + ui::LayerAnimationElement::CreatePauseElement( + ui::LayerAnimationElement::OPACITY, + kCountDownEnterExitDuration + kCountDownExitDelay)); + widget_opacity_sequence->AddElement( + CreateOpacityLayerAnimationElement(0.f, exit_duration, exit_type)); + + std::unique_ptr<ui::LayerAnimationSequence> widget_transform_sequence = + std::make_unique<ui::LayerAnimationSequence>(); + GetTransformCountDownAnimationSetting(timeout_count_down_, /*enter=*/false, + &exit_duration, &exit_type); + widget_transform_sequence->AddElement( + ui::LayerAnimationElement::CreatePauseElement( + ui::LayerAnimationElement::TRANSFORM, + kCountDownEnterExitDuration + kCountDownExitDelay)); + const gfx::Rect bounds = GetWidget()->GetLayer()->GetTargetBounds(); + widget_transform_sequence->AddElement(CreateTransformLayerAnimationElement( + GetScaleTransform(bounds, kExitLabel1ScaleDown), exit_duration, + exit_type)); + + widget_opacity_sequence->AddObserver(animation_observer_.get()); + widget_transform_sequence->AddObserver(animation_observer_.get()); + GetWidget()->GetLayer()->GetAnimator()->StartTogether( + {widget_opacity_sequence.release(), widget_transform_sequence.release()}); +} + +void CaptureLabelView::OnButtonPressed() { + CaptureModeController::Get()->PerformCapture(); } BEGIN_METADATA(CaptureLabelView, views::View)
diff --git a/ash/capture_mode/capture_label_view.h b/ash/capture_mode/capture_label_view.h index 5e1e3f0b..1392217 100644 --- a/ash/capture_mode/capture_label_view.h +++ b/ash/capture_mode/capture_label_view.h
@@ -5,8 +5,10 @@ #ifndef ASH_CAPTURE_MODE_CAPTURE_LABEL_VIEW_H_ #define ASH_CAPTURE_MODE_CAPTURE_LABEL_VIEW_H_ +#include <vector> + #include "ash/ash_export.h" -#include "ui/views/controls/button/button.h" +#include "base/memory/weak_ptr.h" #include "ui/views/view.h" namespace views { @@ -14,6 +16,10 @@ class Label; } // namespace views +namespace ui { +class CallbackLayerAnimationObserver; +} + namespace ash { class CaptureModeSession; @@ -21,8 +27,7 @@ // A view that displays (optional) icon and text message to the user depending // on current capture source and type. In video capture mode, it will later // transform into a 3 second countdown timer. -class ASH_EXPORT CaptureLabelView : public views::View, - public views::ButtonListener { +class ASH_EXPORT CaptureLabelView : public views::View { public: METADATA_HEADER(CaptureLabelView); @@ -31,10 +36,6 @@ CaptureLabelView& operator=(const CaptureLabelView&) = delete; ~CaptureLabelView() override; - // Function to be called to set a short time interval for countdown in tests - // so that we don't have to wait over 3 seconds to start video recording. - static void SetUseDelayForTesting(bool use_delay); - // Update icon and text according to current capture source and type. void UpdateIconAndText(); @@ -53,13 +54,20 @@ void Layout() override; gfx::Size CalculatePreferredSize() const override; - // views::ButtonListener: - void ButtonPressed(views::Button* sender, const ui::Event& event) override; - private: - static constexpr int kCountDownSeconds = 3; + // Start performing countdown to number |timout_count_down_| animation. + void ScheduleCountDownAnimation(); + // Called when each number's countdown animation is completed. + bool OnCountDownAnimationCompleted( + const ui::CallbackLayerAnimationObserver& observer); - void CountDown(); + // Starts the layer animation sequences for the countdown label. + void StartLabelLayerAnimationSequences(); + // Starts the layer animation sequences for the entire widget if applicable. + void StartWidgetLayerAnimationSequences(); + + // Called when |label_button_| is pressed. + void OnButtonPressed(); // The label button that displays an icon and a text message. Can be user // interactable. When clicking/tapping on the button, start perform image or @@ -69,16 +77,18 @@ // The label that displays a text message. Not user interactable. views::Label* label_ = nullptr; - // Count down timer. - base::RepeatingTimer count_down_timer_; - int timeout_count_down_ = kCountDownSeconds; + int timeout_count_down_; // Callback function to be called after countdown if finished. base::OnceClosure countdown_finished_callback_; + // Observe the countdown animation. + std::unique_ptr<ui::CallbackLayerAnimationObserver> animation_observer_; // Pointer to the current capture mode session. Not nullptr during this // lifecycle. CaptureModeSession* capture_mode_session_; + + base::WeakPtrFactory<CaptureLabelView> weak_factory_{this}; }; } // namespace ash
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc index c3a8384..181b4cf 100644 --- a/ash/capture_mode/capture_mode_controller.cc +++ b/ash/capture_mode/capture_mode_controller.cc
@@ -118,12 +118,10 @@ return true; } -void DeleteFileAsync(const base::FilePath& path) { - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(&base::DeleteFile, path), +void DeleteFileAsync(scoped_refptr<base::SequencedTaskRunner> task_runner, + const base::FilePath& path) { + task_runner->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&base::DeleteFile, path), base::BindOnce( [](const base::FilePath& path, bool success) { // TODO(afakhry): Show toast? @@ -204,7 +202,14 @@ CaptureModeController::CaptureModeController( std::unique_ptr<CaptureModeDelegate> delegate) - : delegate_(std::move(delegate)) { + : delegate_(std::move(delegate)), + task_runner_(base::ThreadPool::CreateSequencedTaskRunner( + // A task priority of BEST_EFFORT is good enough for this runner, + // since it's used for blocking file IO such as saving the screenshots + // or the successive webm video chunks received from the recording + // service. + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) { DCHECK_EQ(g_instance, nullptr); g_instance = this; @@ -285,6 +290,11 @@ is_recording_in_progress_ = false; Shell::Get()->UpdateCursorCompositingEnabled(); delegate_->StopObservingRestrictedContent(); + + DCHECK(video_file_handler_); + video_file_handler_.AsyncCall(&VideoFileHandler::FlushBufferedChunks) + .Then(base::BindOnce(&CaptureModeController::OnVideoFileSaved, + weak_ptr_factory_.GetWeakPtr())); } bool CaptureModeController::IsCaptureAllowed() const { @@ -392,10 +402,8 @@ } const base::FilePath path = BuildImagePath(timestamp); - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(&SaveFile, png_bytes, path), + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&SaveFile, png_bytes, path), base::BindOnce(&CaptureModeController::OnImageFileSaved, weak_ptr_factory_.GetWeakPtr(), png_bytes, path)); } @@ -418,6 +426,26 @@ HoldingSpaceController::Get()->client()->AddScreenshot(path); } +void CaptureModeController::OnVideoFileInitialized(bool success) { + if (!success) + EndVideoRecording(); +} + +void CaptureModeController::OnVideoFileSaved(bool success) { + DCHECK(base::CurrentUIThread::IsSet()); + DCHECK(video_file_handler_); + + // TODO(afakhry): The file will be empty now until the recording service is + // implemented. + if (!success) + ShowFailureNotification(); + else + ShowPreviewNotification(current_video_file_path_, gfx::Image()); + + current_video_file_path_.clear(); + video_file_handler_.Reset(); +} + void CaptureModeController::ShowPreviewNotification( const base::FilePath& screen_capture_path, const gfx::Image& preview_image) { @@ -459,7 +487,7 @@ delegate_->OpenScreenshotInImageEditor(screen_capture_path); break; case NotificationButtonIndex::BUTTON_DELETE: - DeleteFileAsync(screen_capture_path); + DeleteFileAsync(task_runner_, screen_capture_path); break; } } @@ -520,6 +548,17 @@ is_recording_in_progress_ = true; Shell::Get()->UpdateCursorCompositingEnabled(); + // TODO(afakhry): Choose a real buffer capacity when the recording service is + // in. + constexpr size_t kVideoBufferCapacityBytes = 20; + DCHECK(current_video_file_path_.empty()); + current_video_file_path_ = BuildVideoPath(base::Time::Now()); + video_file_handler_ = VideoFileHandler::Create( + task_runner_, current_video_file_path_, kVideoBufferCapacityBytes); + video_file_handler_.AsyncCall(&VideoFileHandler::Initialize) + .Then(base::BindOnce(&CaptureModeController::OnVideoFileInitialized, + weak_ptr_factory_.GetWeakPtr())); + // TODO(afakhry): Call into the recording service. delegate_->StartObservingRestrictedContent(
diff --git a/ash/capture_mode/capture_mode_controller.h b/ash/capture_mode/capture_mode_controller.h index 86b2be2..99b616bf 100644 --- a/ash/capture_mode/capture_mode_controller.h +++ b/ash/capture_mode/capture_mode_controller.h
@@ -9,10 +9,14 @@ #include "ash/ash_export.h" #include "ash/capture_mode/capture_mode_types.h" +#include "ash/capture_mode/video_file_handler.h" #include "ash/public/cpp/capture_mode_delegate.h" #include "base/memory/ref_counted_memory.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" +#include "base/single_thread_task_runner.h" +#include "base/threading/sequence_bound.h" #include "base/timer/timer.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/image/image.h" @@ -116,6 +120,15 @@ const base::FilePath& path, bool success); + // Called on the UI thread, when |video_file_handler_| initializes the video + // file whose path is |current_video_file_path_|. If initialization fails, + // i.e. |success| is false, video recording should not continue. + void OnVideoFileInitialized(bool success); + + // Called back when the |video_file_handler_| flushes the remaining cached + // video chunks in its buffer. Called on the UI thread. + void OnVideoFileSaved(bool success); + // Shows a preview notification of the newly taken screenshot or screen // recording. void ShowPreviewNotification(const base::FilePath& screen_capture_path, @@ -144,6 +157,17 @@ CaptureModeType type_ = CaptureModeType::kImage; CaptureModeSource source_ = CaptureModeSource::kRegion; + // A blocking task runner for file IO operations. + scoped_refptr<base::SequencedTaskRunner> task_runner_; + + // This is the file path of the video file currently being recorded. It is + // empty when no video recording is in progress. + base::FilePath current_video_file_path_; + + // Handles the file IO operations of the video file. This enforces doing all + // video file related operations on the blocking |task_runner_|. + base::SequenceBound<VideoFileHandler> video_file_handler_; + // We remember the user selected capture region when the source is |kRegion| // between sessions. Initially, this value is empty at which point we display // a message to the user instructing them to start selecting a region.
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc index 712230a..ef42233 100644 --- a/ash/capture_mode/capture_mode_session.cc +++ b/ash/capture_mode/capture_mode_session.cc
@@ -177,6 +177,69 @@ } // namespace +class CaptureModeSession::ScopedCursorSetter { + public: + explicit ScopedCursorSetter(ui::mojom::CursorType cursor) + : cursor_manager_(Shell::Get()->cursor_manager()), + original_cursor_(cursor_manager_->GetCursor()), + original_cursor_visible_(cursor_manager_->IsCursorVisible()), + original_cursor_locked_(cursor_manager_->IsCursorLocked()) { + UpdateCursor(cursor); + } + + ScopedCursorSetter(const ScopedCursorSetter&) = delete; + ScopedCursorSetter& operator=(const ScopedCursorSetter&) = delete; + + ~ScopedCursorSetter() { + // Only unlock the cursor if it wasn't locked before. + if (original_cursor_locked_) + return; + + cursor_manager_->UnlockCursor(); + cursor_manager_->SetCursor(original_cursor_); + if (original_cursor_visible_) { + cursor_manager_->ShowCursor(); + } else { + cursor_manager_->HideCursor(); + } + } + + // Note that this will always make the cursor visible if it is not |kNone|. + void UpdateCursor(ui::mojom::CursorType cursor) { + if (original_cursor_locked_) + return; + + const bool currently_locked = cursor_manager_->IsCursorLocked(); + + if (cursor_manager_->GetCursor().type() == cursor && + cursor_manager_->IsCursorVisible()) { + if (!currently_locked) + cursor_manager_->LockCursor(); + return; + } + + if (currently_locked) + cursor_manager_->UnlockCursor(); + if (cursor == ui::mojom::CursorType::kNone) { + cursor_manager_->HideCursor(); + } else { + cursor_manager_->SetCursor(cursor); + cursor_manager_->ShowCursor(); + } + cursor_manager_->LockCursor(); + } + + bool IsCursorVisible() const { return cursor_manager_->IsCursorVisible(); } + + private: + wm::CursorManager* const cursor_manager_; + const gfx::NativeCursor original_cursor_; + const bool original_cursor_visible_; + + // If the original cursor is already locked, don't make any changes to it. + const bool original_cursor_locked_; +}; + CaptureModeSession::CaptureModeSession(CaptureModeController* controller) : controller_(controller), current_root_(GetPreferredRootWindow()), @@ -201,6 +264,10 @@ UpdateCaptureLabelWidget(); RefreshStackingOrder(parent); + if (controller_->source() == CaptureModeSource::kRegion) { + cursor_setter_ = + std::make_unique<ScopedCursorSetter>(ui::mojom::CursorType::kCell); + } if (controller_->source() == CaptureModeSource::kWindow) { capture_window_observer_ = std::make_unique<CaptureWindowObserver>(this, controller_->type()); @@ -235,6 +302,16 @@ capture_window_observer_.reset(); } + if (new_source == CaptureModeSource::kRegion) { + cursor_setter_ = std::make_unique<ScopedCursorSetter>( + capture_mode_bar_widget_.GetWindowBoundsInScreen().Contains( + previous_location_in_root_) + ? ui::mojom::CursorType::kPointer + : ui::mojom::CursorType::kCell); + } else { + cursor_setter_.reset(); + } + capture_mode_bar_view_->OnCaptureSourceChanged(new_source); UpdateDimensionsLabelWidget(/*is_resizing=*/false); layer()->SchedulePaint(layer()->bounds()); @@ -484,10 +561,13 @@ } DCHECK_EQ(CaptureModeSource::kRegion, capture_source); + DCHECK(cursor_setter_); // Let the capture button handle any events it can handle first. - if (ShouldCaptureLabelHandleEvent(event_target)) + if (ShouldCaptureLabelHandleEvent(event_target)) { + cursor_setter_->UpdateCursor(ui::mojom::CursorType::kHand); return; + } // Allow events that are located on the capture mode bar to pass through so we // can click the buttons. @@ -513,26 +593,23 @@ SetMouseWarpEnabled(*old_mouse_warp_status_); old_mouse_warp_status_.reset(); - OnLocatedEventReleased(location); + OnLocatedEventReleased(location, is_event_on_capture_bar); + break; + case ui::ET_MOUSE_MOVED: + if (cursor_setter_->IsCursorVisible()) { + cursor_setter_->UpdateCursor(GetCursorType( + GetFineTunePosition(location, is_touch), is_event_on_capture_bar)); + } break; default: break; } } -void CaptureModeSession::OnLocatedEventPressed( +FineTunePosition CaptureModeSession::GetFineTunePosition( const gfx::Point& location_in_root, - bool is_touch, - bool is_event_on_capture_bar) { - initial_location_in_root_ = location_in_root; - previous_location_in_root_ = location_in_root; - - if (is_selecting_region_) - return; - - // Calculate the position and anchor points of the current pressed event. - fine_tune_position_ = FineTunePosition::kNone; - // In the case of overlapping affordances, prioritize the bottom right + bool is_touch) const { + // In the case of overlapping affordances, prioritize the bottomm right // corner, then the rest of the corners, then the edges. static const std::vector<FineTunePosition> drag_positions = { FineTunePosition::kBottomRight, FineTunePosition::kBottomLeft, @@ -551,29 +628,75 @@ // both x and y, then |position| is the current pressed down affordance. if ((position_location - location_in_root).LengthSquared() <= hit_radius_squared) { - fine_tune_position_ = position; - MaybeShowMagnifierGlassAtPoint(position_location); - break; + return position; } } - if (fine_tune_position_ == FineTunePosition::kNone) { + if (controller_->user_capture_region().Contains(location_in_root)) + return FineTunePosition::kCenter; + + return FineTunePosition::kNone; +} + +ui::mojom::CursorType CaptureModeSession::GetCursorType( + FineTunePosition position, + bool is_event_on_capture_bar) const { + if (is_event_on_capture_bar || + controller_->source() != CaptureModeSource::kRegion) { + return ui::mojom::CursorType::kPointer; + } + + switch (position) { + case FineTunePosition::kTopLeft: + return ui::mojom::CursorType::kNorthWestResize; + case FineTunePosition::kBottomRight: + return ui::mojom::CursorType::kSouthEastResize; + case FineTunePosition::kTopCenter: + case FineTunePosition::kBottomCenter: + return ui::mojom::CursorType::kNorthSouthResize; + case FineTunePosition::kTopRight: + return ui::mojom::CursorType::kNorthEastResize; + case FineTunePosition::kBottomLeft: + return ui::mojom::CursorType::kSouthWestResize; + case FineTunePosition::kLeftCenter: + case FineTunePosition::kRightCenter: + return ui::mojom::CursorType::kEastWestResize; + case FineTunePosition::kCenter: + return ui::mojom::CursorType::kMove; + default: + return ui::mojom::CursorType::kCell; + } +} + +void CaptureModeSession::OnLocatedEventPressed( + const gfx::Point& location_in_root, + bool is_touch, + bool is_event_on_capture_bar) { + initial_location_in_root_ = location_in_root; + previous_location_in_root_ = location_in_root; + + if (is_selecting_region_) + return; + + fine_tune_position_ = GetFineTunePosition(location_in_root, is_touch); + + if (fine_tune_position_ == FineTunePosition::kNone && + !is_event_on_capture_bar) { // If the point is outside the capture region and not on the capture bar, // restart to the select phase. - if (controller_->user_capture_region().Contains(location_in_root)) { - fine_tune_position_ = FineTunePosition::kCenter; - } else { - gfx::Point location_in_screen = location_in_root; - wm::ConvertPointToScreen(current_root_, &location_in_screen); - if (!is_event_on_capture_bar) { - is_selecting_region_ = true; - UpdateCaptureRegion(gfx::Rect(), /*is_resizing=*/true); - } - } + is_selecting_region_ = true; + UpdateCaptureRegion(gfx::Rect(), /*is_resizing=*/true); return; } - anchor_points_ = GetAnchorPointsForPosition(fine_tune_position_); + if (fine_tune_position_ != FineTunePosition::kCenter && + fine_tune_position_ != FineTunePosition::kNone) { + anchor_points_ = GetAnchorPointsForPosition(fine_tune_position_); + const gfx::Point position_location = + capture_mode_util::GetLocationForFineTunePosition( + controller_->user_capture_region(), fine_tune_position_); + MaybeShowMagnifierGlassAtPoint(position_location); + } } void CaptureModeSession::OnLocatedEventDragged( @@ -614,10 +737,15 @@ } void CaptureModeSession::OnLocatedEventReleased( - const gfx::Point& location_in_root) { + const gfx::Point& location_in_root, + bool is_event_on_capture_bar) { fine_tune_position_ = FineTunePosition::kNone; anchor_points_.clear(); + cursor_setter_->UpdateCursor( + GetCursorType(GetFineTunePosition(location_in_root, /*is_touch=*/false), + is_event_on_capture_bar)); + // Do a repaint to show the affordance circles. See UpdateCaptureRegion to see // how damage is calculated. gfx::Rect damage_region = controller_->user_capture_region();
diff --git a/ash/capture_mode/capture_mode_session.h b/ash/capture_mode/capture_mode_session.h index 38cc6db..e49f91fb 100644 --- a/ash/capture_mode/capture_mode_session.h +++ b/ash/capture_mode/capture_mode_session.h
@@ -59,9 +59,6 @@ static constexpr int kCaptureButtonDistanceFromRegionDp = 24; aura::Window* current_root() const { return current_root_; } - CaptureModeBarView* capture_mode_bar_view() const { - return capture_mode_bar_view_; - } bool is_selecting_region() const { return is_selecting_region_; } // Gets the current window selected for |kWindow| capture source. Returns @@ -92,17 +89,10 @@ // aura::WindowObserver: void OnWindowDestroying(aura::Window* window) override; - views::Widget* capture_label_widget_for_testing() const { - return capture_label_widget_.get(); - } - views::Widget* dimensions_label_widget_for_testing() const { - return dimensions_label_widget_.get(); - } - const MagnifierGlass& magnifier_glass_for_testing() const { - return magnifier_glass_; - } - private: + friend class CaptureModeSessionTestApi; + class ScopedCursorSetter; + // Gets the bounds of current window selected for |kWindow| capture source. gfx::Rect GetSelectedWindowBounds() const; @@ -121,12 +111,22 @@ // we will use larger hit targets for the drag affordances. void OnLocatedEvent(ui::LocatedEvent* event, bool is_touch); + // Returns the fine tune position that corresponds to the given + // |location_in_root|. + FineTunePosition GetFineTunePosition(const gfx::Point& location_in_root, + bool is_touch) const; + + // Returns the expected cursor type. + ui::mojom::CursorType GetCursorType(FineTunePosition position, + bool is_event_on_capture_bar) const; + // Handles updating the select region UI. void OnLocatedEventPressed(const gfx::Point& location_in_root, bool is_touch, bool is_event_on_capture_bar); void OnLocatedEventDragged(const gfx::Point& location_in_root); - void OnLocatedEventReleased(const gfx::Point& location_in_root); + void OnLocatedEventReleased(const gfx::Point& location_in_root, + bool is_event_on_capture_bar); // Updates the capture region and the capture region widgets depending on the // value of |is_resizing|. @@ -235,6 +235,9 @@ // Contains the window dimmers which dim all the root windows except // |current_root_|. base::flat_set<std::unique_ptr<WindowDimmer>> root_window_dimmers_; + + // The object to specify the cursor type. + std::unique_ptr<ScopedCursorSetter> cursor_setter_; }; } // namespace ash
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc index 4fd4056..012d831a 100644 --- a/ash/capture_mode/capture_mode_unittests.cc +++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -4,7 +4,6 @@ #include <memory> -#include "ash/capture_mode/capture_label_view.h" #include "ash/capture_mode/capture_mode_bar_view.h" #include "ash/capture_mode/capture_mode_close_button.h" #include "ash/capture_mode/capture_mode_controller.h" @@ -26,6 +25,7 @@ #include "ash/wm/window_state.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" +#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/events/keycodes/keyboard_codes_posix.h" #include "ui/events/test/event_generator.h" #include "ui/gfx/geometry/insets.h" @@ -73,6 +73,36 @@ } // namespace +// Wrapper for CaptureModeSession that exposes internal state to test functions. +class CaptureModeSessionTestApi { + public: + explicit CaptureModeSessionTestApi(CaptureModeSession* session) + : session_(session) {} + CaptureModeSessionTestApi(const CaptureModeSessionTestApi&) = delete; + CaptureModeSessionTestApi& operator=(const CaptureModeSessionTestApi&) = + delete; + ~CaptureModeSessionTestApi() = default; + + CaptureModeBarView* capture_mode_bar_view() const { + return session_->capture_mode_bar_view_; + } + + views::Widget* capture_label_widget() const { + return session_->capture_label_widget_.get(); + } + + views::Widget* dimensions_label_widget() const { + return session_->dimensions_label_widget_.get(); + } + + const MagnifierGlass& magnifier_glass() const { + return session_->magnifier_glass_; + } + + private: + const CaptureModeSession* const session_; +}; + class CaptureModeTest : public AshTestBase { public: CaptureModeTest() = default; @@ -86,29 +116,28 @@ AshTestBase::SetUp(); } + CaptureModeBarView* GetCaptureModeBarView() const { + auto* session = CaptureModeController::Get()->capture_mode_session(); + DCHECK(session); + return CaptureModeSessionTestApi(session).capture_mode_bar_view(); + } + CaptureModeToggleButton* GetImageToggleButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - return controller->capture_mode_session() - ->capture_mode_bar_view() - ->capture_type_view() - ->image_toggle_button(); + return GetCaptureModeBarView()->capture_type_view()->image_toggle_button(); } CaptureModeToggleButton* GetVideoToggleButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - return controller->capture_mode_session() - ->capture_mode_bar_view() - ->capture_type_view() - ->video_toggle_button(); + return GetCaptureModeBarView()->capture_type_view()->video_toggle_button(); } CaptureModeToggleButton* GetFullscreenToggleButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - return controller->capture_mode_session() - ->capture_mode_bar_view() + return GetCaptureModeBarView() ->capture_source_view() ->fullscreen_toggle_button(); } @@ -116,8 +145,7 @@ CaptureModeToggleButton* GetRegionToggleButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - return controller->capture_mode_session() - ->capture_mode_bar_view() + return GetCaptureModeBarView() ->capture_source_view() ->region_toggle_button(); } @@ -125,8 +153,7 @@ CaptureModeToggleButton* GetWindowToggleButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - return controller->capture_mode_session() - ->capture_mode_bar_view() + return GetCaptureModeBarView() ->capture_source_view() ->window_toggle_button(); } @@ -134,16 +161,14 @@ CaptureModeCloseButton* GetCloseButton() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - return controller->capture_mode_session() - ->capture_mode_bar_view() - ->close_button(); + return GetCaptureModeBarView()->close_button(); } aura::Window* GetDimensionsLabelWindow() const { auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); - auto* widget = controller->capture_mode_session() - ->dimensions_label_widget_for_testing(); + auto* widget = CaptureModeSessionTestApi(controller->capture_mode_session()) + .dimensions_label_widget(); return widget ? widget->GetNativeWindow() : nullptr; } @@ -151,7 +176,8 @@ auto* controller = CaptureModeController::Get(); DCHECK(controller->IsActive()); auto& magnifier = - controller->capture_mode_session()->magnifier_glass_for_testing(); + CaptureModeSessionTestApi(controller->capture_mode_session()) + .magnifier_glass(); if (magnifier.host_widget_for_testing()) { return magnifier.host_widget_for_testing() ->GetWindowBoundsInScreen() @@ -262,6 +288,10 @@ } TEST_F(CaptureModeTest, VideoRecordingUiBehavior) { + // We need a non-zero duration to avoid infinite loop on countdown. + ui::ScopedAnimationDurationScaleMode animatin_scale( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + auto* controller = CaptureModeController::Get(); // Start Capture Mode in a fullscreen video recording mode. controller->SetSource(CaptureModeSource::kFullscreen); @@ -270,7 +300,6 @@ EXPECT_TRUE(controller->IsActive()); EXPECT_FALSE(controller->is_recording_in_progress()); EXPECT_FALSE(IsCursorCompositingEnabled()); - CaptureLabelView::SetUseDelayForTesting(true); // Hit Enter to begin recording. auto* event_generator = GetEventGenerator(); @@ -488,9 +517,7 @@ // Select a region such that the capture mode bar is covered. SelectRegion(gfx::Rect(5, 5, 795, 795)); EXPECT_TRUE(controller->user_capture_region().Contains( - controller->capture_mode_session() - ->capture_mode_bar_view() - ->GetBoundsInScreen())); + GetCaptureModeBarView()->GetBoundsInScreen())); // Click on the fullscreen toggle button to verify that we enter fullscreen // capture mode. Then click on the region toggle button to verify that we @@ -502,9 +529,7 @@ ClickOnView(GetRegionToggleButton(), GetEventGenerator()); ASSERT_EQ(CaptureModeSource::kRegion, controller->source()); ASSERT_TRUE(controller->user_capture_region().Contains( - controller->capture_mode_session() - ->capture_mode_bar_view() - ->GetBoundsInScreen())); + GetCaptureModeBarView()->GetBoundsInScreen())); ClickOnView(GetCloseButton(), event_generator); EXPECT_FALSE(controller->IsActive()); @@ -649,7 +674,8 @@ SelectRegion(gfx::Rect(100, 100, 600, 600)); views::Widget* capture_button_widget = - controller->capture_mode_session()->capture_label_widget_for_testing(); + CaptureModeSessionTestApi(controller->capture_mode_session()) + .capture_label_widget(); ASSERT_TRUE(capture_button_widget); aura::Window* capture_button_window = capture_button_widget->GetNativeWindow(); @@ -726,16 +752,13 @@ auto* controller = StartImageRegionCapture(); EXPECT_TRUE(gfx::Rect(801, 0, 800, 800) - .Contains(controller->capture_mode_session() - ->capture_mode_bar_view() - ->GetBoundsInScreen())); + .Contains(GetCaptureModeBarView()->GetBoundsInScreen())); controller->Stop(); MoveMouseToAndUpdateCursorDisplay(gfx::Point(100, 500), event_generator); StartImageRegionCapture(); - EXPECT_TRUE(gfx::Rect(800, 800).Contains(controller->capture_mode_session() - ->capture_mode_bar_view() - ->GetBoundsInScreen())); + EXPECT_TRUE(gfx::Rect(800, 800).Contains( + GetCaptureModeBarView()->GetBoundsInScreen())); } // Tests behavior of a capture mode session if the active display is removed. @@ -746,9 +769,8 @@ MoveMouseToAndUpdateCursorDisplay(gfx::Point(1000, 500), GetEventGenerator()); auto* controller = StartImageRegionCapture(); auto* session = controller->capture_mode_session(); - EXPECT_TRUE( - gfx::Rect(801, 0, 800, 800) - .Contains(session->capture_mode_bar_view()->GetBoundsInScreen())); + EXPECT_TRUE(gfx::Rect(801, 0, 800, 800) + .Contains(GetCaptureModeBarView()->GetBoundsInScreen())); ASSERT_EQ(Shell::GetAllRootWindows()[1], session->current_root()); // Remove secondary display. @@ -765,7 +787,7 @@ // Tests that the capture mode bar is now on the primary display. EXPECT_TRUE(gfx::Rect(800, 800).Contains( - session->capture_mode_bar_view()->GetBoundsInScreen())); + GetCaptureModeBarView()->GetBoundsInScreen())); ASSERT_EQ(Shell::GetAllRootWindows()[0], session->current_root()); } @@ -820,16 +842,100 @@ // the primary display until the mouse is released. event_generator->PressLeftButton(); EXPECT_EQ(Shell::GetAllRootWindows()[1], session->current_root()); - EXPECT_TRUE(gfx::Rect(800, 800).Contains(controller->capture_mode_session() - ->capture_mode_bar_view() - ->GetBoundsInScreen())); + EXPECT_TRUE(gfx::Rect(800, 800).Contains( + GetCaptureModeBarView()->GetBoundsInScreen())); event_generator->ReleaseLeftButton(); EXPECT_EQ(Shell::GetAllRootWindows()[1], session->current_root()); EXPECT_TRUE(gfx::Rect(801, 0, 800, 800) - .Contains(controller->capture_mode_session() - ->capture_mode_bar_view() - ->GetBoundsInScreen())); + .Contains(GetCaptureModeBarView()->GetBoundsInScreen())); +} + +TEST_F(CaptureModeTest, RegionCursorStates) { + using ui::mojom::CursorType; + + auto* cursor_manager = Shell::Get()->cursor_manager(); + CursorType original_cursor_type = cursor_manager->GetCursor().type(); + EXPECT_FALSE(cursor_manager->IsCursorLocked()); + EXPECT_EQ(CursorType::kPointer, original_cursor_type); + + auto* event_generator = GetEventGenerator(); + auto* controller = StartImageRegionCapture(); + EXPECT_TRUE(cursor_manager->IsCursorLocked()); + event_generator->MoveMouseTo(gfx::Point(175, 175)); + EXPECT_TRUE(cursor_manager->IsCursorVisible()); + EXPECT_EQ(CursorType::kCell, cursor_manager->GetCursor().type()); + + const gfx::Rect target_region(gfx::Rect(200, 200, 400, 400)); + SelectRegion(target_region); + + // Makes sure that the cursor is updated when the user releases the region + // select and is still hovering in the same location. + EXPECT_EQ(CursorType::kSouthEastResize, cursor_manager->GetCursor().type()); + + // Verify that all of the |FineTunePosition| locations have the correct cursor + // when hovered over. + event_generator->MoveMouseTo(target_region.origin()); + EXPECT_EQ(CursorType::kNorthWestResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.top_center()); + EXPECT_EQ(CursorType::kNorthSouthResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.top_right()); + EXPECT_EQ(CursorType::kNorthEastResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.right_center()); + EXPECT_EQ(CursorType::kEastWestResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.bottom_right()); + EXPECT_EQ(CursorType::kSouthEastResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.bottom_center()); + EXPECT_EQ(CursorType::kNorthSouthResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.bottom_left()); + EXPECT_EQ(CursorType::kSouthWestResize, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.left_center()); + EXPECT_EQ(CursorType::kEastWestResize, cursor_manager->GetCursor().type()); + + // Tests that within the bounds of the selected region, the cursor is a hand + // when hovering over the capture button, otherwise it is a multi-directional + // move cursor. + event_generator->MoveMouseTo(gfx::Point(250, 250)); + EXPECT_EQ(CursorType::kMove, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(target_region.CenterPoint()); + EXPECT_EQ(CursorType::kHand, cursor_manager->GetCursor().type()); + + // Tests that the cursor changes to a cell type when hovering over the + // unselected region. + event_generator->MoveMouseTo(gfx::Point(50, 50)); + EXPECT_EQ(CursorType::kCell, cursor_manager->GetCursor().type()); + + // Check that cursor is unlocked when changing sources, and that the cursor + // changes to a pointer when hovering over the capture mode bar. + event_generator->MoveMouseTo( + GetRegionToggleButton()->GetBoundsInScreen().CenterPoint()); + EXPECT_EQ(CursorType::kPointer, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo( + GetWindowToggleButton()->GetBoundsInScreen().CenterPoint()); + EXPECT_EQ(CursorType::kPointer, cursor_manager->GetCursor().type()); + event_generator->ClickLeftButton(); + ASSERT_EQ(CaptureModeSource::kWindow, controller->source()); + EXPECT_FALSE(cursor_manager->IsCursorLocked()); + EXPECT_EQ(original_cursor_type, cursor_manager->GetCursor().type()); + + // Tests that on changing back to region capture mode, the cursor becomes + // locked, and is still a pointer type over the bar, whilst a cell cursor + // otherwise (not over the selected region). + event_generator->MoveMouseTo( + GetRegionToggleButton()->GetBoundsInScreen().CenterPoint()); + original_cursor_type = cursor_manager->GetCursor().type(); + event_generator->ClickLeftButton(); + EXPECT_TRUE(cursor_manager->IsCursorLocked()); + EXPECT_EQ(CursorType::kPointer, cursor_manager->GetCursor().type()); + event_generator->MoveMouseTo(gfx::Point(50, 50)); + EXPECT_EQ(CursorType::kCell, cursor_manager->GetCursor().type()); + + // Tests that when exiting capture mode that the cursor is restored to its + // original state. + controller->Stop(); + EXPECT_FALSE(controller->IsActive()); + EXPECT_FALSE(cursor_manager->IsCursorLocked()); + EXPECT_EQ(original_cursor_type, cursor_manager->GetCursor().type()); } } // namespace ash
diff --git a/ash/capture_mode/video_file_handler.cc b/ash/capture_mode/video_file_handler.cc new file mode 100644 index 0000000..21ed639b --- /dev/null +++ b/ash/capture_mode/video_file_handler.cc
@@ -0,0 +1,118 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/capture_mode/video_file_handler.h" + +#include "base/containers/span.h" +#include "base/logging.h" +#include "base/task/current_thread.h" + +namespace ash { + +namespace { + +// The value used to call reserve() on the |buffered_chunks_| vector. +// TODO(afakhry): Choose a value more suitable when the recording service is +// wired up. +constexpr size_t kReservedNumberOfChunks = 100; + +} // namespace + +// static +base::SequenceBound<VideoFileHandler> VideoFileHandler::Create( + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner, + const base::FilePath& path, + size_t max_buffered_bytes) { + DCHECK(base::CurrentUIThread::IsSet()); + + return base::SequenceBound<VideoFileHandler>(blocking_task_runner, path, + max_buffered_bytes); +} + +bool VideoFileHandler::Initialize() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!file_.IsValid()); + + file_.Initialize(path_, + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); + success_ = file_.IsValid(); + if (!success_) + LOG(ERROR) << "Failed to create video file: " << path_; + return success_; +} + +bool VideoFileHandler::GetSuccessStatus() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return success_; +} + +bool VideoFileHandler::AppendChunk(std::string chunk) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + const size_t chunk_size = chunk.size(); + if (current_size_ + chunk_size > max_buffered_bytes_) { + if (!FlushBufferedChunks()) { + LOG(ERROR) << "Failed to flush video chunks buffer to file: " << path_; + return false; + } + DCHECK_EQ(current_size_, 0u); + } + + if (chunk_size > max_buffered_bytes_) { + // The order here matters; this check must come after the above flush, since + // the chunks must be appended to the file in sequence. + // This should never be allowed to happen. The client should choose a big + // enough capacity to allow caching of many chunks before IO is needed. But + // if it happens for some reason, we just write the chunk directly to disk + // without caching. + LOG(ERROR) << "Chunk is bigger than the buffer capacity. Select a more " + "suitable capacity value: chunk_size: " + << chunk_size << ", capacity: " << max_buffered_bytes_; + AppendToFile(chunk); + } else { + buffered_chunks_.push_back(std::move(chunk)); + current_size_ += chunk_size; + DCHECK_LE(current_size_, max_buffered_bytes_); + } + + return success_; +} + +bool VideoFileHandler::FlushBufferedChunks() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!current_size_) + return success_; + + for (const auto& chunk : buffered_chunks_) + AppendToFile(chunk); + + buffered_chunks_.clear(); + current_size_ = 0; + return success_; +} + +VideoFileHandler::VideoFileHandler(const base::FilePath& path, + size_t max_buffered_bytes) + : path_(path), max_buffered_bytes_(max_buffered_bytes) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(max_buffered_bytes_); + + buffered_chunks_.reserve(kReservedNumberOfChunks); +} + +VideoFileHandler::~VideoFileHandler() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + FlushBufferedChunks(); +} + +void VideoFileHandler::AppendToFile(const std::string& chunk) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + success_ &= + file_.WriteAtCurrentPosAndCheck(base::as_bytes(base::make_span(chunk))); +} + +} // namespace ash
diff --git a/ash/capture_mode/video_file_handler.h b/ash/capture_mode/video_file_handler.h new file mode 100644 index 0000000..cab5374a --- /dev/null +++ b/ash/capture_mode/video_file_handler.h
@@ -0,0 +1,129 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_CAPTURE_MODE_VIDEO_FILE_HANDLER_H_ +#define ASH_CAPTURE_MODE_VIDEO_FILE_HANDLER_H_ + +#include <string> +#include <vector> + +#include "ash/ash_export.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/sequence_checker.h" +#include "base/sequenced_task_runner.h" +#include "base/thread_annotations.h" +#include "base/threading/sequence_bound.h" + +namespace ash { + +// Defines an object that takes care of creating and saving video contents to a +// file with a given |path_|. Video contents are received from the Recording +// Service as a sequence of byte chunks on the UI thread, however creating the +// file and appending those chunks to it must be done on a blocking thread, +// whose |blocking_task_runner| is given to |Create()|. +// +// Depending on the audio/video contents and their encoding, there can be +// hundreds of chunks received every second. Therefore, it would be very +// expensive to write to the file system every time we receive a chunk, so this +// object also takes care of caching those chunks by std::move()'ing them into +// |buffered_chunks_| until the total size of the cached chunks |current_size_| +// is nearing the maximum allowed |max_buffered_bytes_|, at which point, the +// buffered chunks will be appended to the file, and |buffered_chunks_| will be +// cleared. +// +// A maximum |max_buffered_bytes_| is enforced on the total number of bytes of +// all the cached chunks in |buffered_chunks_| to keep things deterministic, and +// avoid video recording consuming too much memory and eventually OOM'ing the +// system. +// +// An instance of this object can only be accessed on the blocking pool +// sequenced task runner given to |Create()|, which will construct a +// |base::SequenceBound| wrapper around an instance that guarantees all +// operations, including construction and destruction happening in sequence on +// the provided blooking pool. This asserts that destruction of this object +// happens only after all chunks have been flushed to the file. +class ASH_EXPORT VideoFileHandler { + public: + VideoFileHandler(const VideoFileHandler&) = delete; + VideoFileHandler& operator=(const VideoFileHandler&) = delete; + + // Creates a |base::SequenceBound| wrapping an instance of VideoFileHandler + // that enforces all operations this object provides can only be done + // asynchronously on the given |blocking_task_runner|. This should be called + // on the UI thread. |max_buffered_bytes| should be chosen to be big enough to + // allow caching of many video chunks before we need to write to disk. + static base::SequenceBound<VideoFileHandler> Create( + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner, + const base::FilePath& path, + size_t max_buffered_bytes); + + // Must be done only once before all other operations to open/create the file + // at |path_| via |file_| in preparation for future writes. The file remains + // open until this object is destroyed. Returns true on success, and false + // otherwise. |success_| is also updated with this result before returning. + // Callers must check that result before doing further operations since if + // this fails, all future IO will fail too. + bool Initialize(); + + // Returns whether all IO operations done so far were successful. + bool GetSuccessStatus() const; + + // Depending of the number of bytes currently cached, the given |chunk| is + // either cached or appended to the file at |path_| along with any previously + // cached chunks. + // |success_| will be updated and returned as the result. + bool AppendChunk(std::string chunk); + + // Flushes the currently cached chunks in |buffered_chunks_| by appending them + // to |file_| and clearing the buffer so further chunks can be cached. + // |success_| will be updated and returned as the result. + bool FlushBufferedChunks(); + + private: + friend class base::SequenceBound<VideoFileHandler>; + + VideoFileHandler(const base::FilePath& path, size_t max_buffered_bytes); + ~VideoFileHandler(); + + // Appends the given |chunk| to |file_| at its current position, and updates + // |success_| with the result. + void AppendToFile(const std::string& chunk); + + // The video file path. + const base::FilePath path_; + + // This is the maximum allowed number of bytes that the total size of all the + // chunks cached in |buffered_chunks_| cannot exceed. This is to make sure + // there's an upper bound to the memory consumed by video recording to avoid + // OOM'in the system. + const size_t max_buffered_bytes_; + + // The opened file that exists at |path_|. All I/O operations on the file will + // be done through this object, which must first be initialized by calling + // |Initialize()|. + base::File file_ GUARDED_BY_CONTEXT(sequence_checker_); + + // The buffer used to cache the video chunks before they're written to disk. + // Accessed only on the blocking thread. + std::vector<std::string> buffered_chunks_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // The current size in bytes of all the cached chunks in |buffered_chunks_|. + // Accessed only on the blocking thread. + size_t current_size_ GUARDED_BY_CONTEXT(sequence_checker_) = 0; + + // The status of all IO operations done so far. It remains as false, until the + // file is successfully opened in |Initialize()|. After that it will be + // repeatedly updated by each write operation. + bool success_ GUARDED_BY_CONTEXT(sequence_checker_) = false; + + // Checker to guarantee certain operations are run on the + // |blocking_task_runner| given to |Create()|. + SEQUENCE_CHECKER(sequence_checker_); +}; + +} // namespace ash + +#endif // ASH_CAPTURE_MODE_VIDEO_FILE_HANDLER_H_
diff --git a/ash/capture_mode/video_file_handler_unittest.cc b/ash/capture_mode/video_file_handler_unittest.cc new file mode 100644 index 0000000..9d3ca90 --- /dev/null +++ b/ash/capture_mode/video_file_handler_unittest.cc
@@ -0,0 +1,233 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/capture_mode/video_file_handler.h" + +#include <string> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/callback_forward.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/location.h" +#include "base/run_loop.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "base/test/task_environment.h" +#include "base/threading/sequence_bound.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +class VideoFileHandlerTest : public ::testing::Test { + public: + VideoFileHandlerTest() + : task_environment_(base::test::TaskEnvironment::MainThreadType::UI), + task_runner_(base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {} + VideoFileHandlerTest(const VideoFileHandlerTest&) = delete; + VideoFileHandlerTest& operator=(const VideoFileHandlerTest&) = delete; + ~VideoFileHandlerTest() override = default; + + scoped_refptr<base::SequencedTaskRunner> task_runner() const { + return task_runner_; + } + const base::FilePath& temp_file() const { return temp_file_; } + + // ::testing::Test: + void SetUp() override { + EXPECT_TRUE(ScheduleFileOpTaskAndWait( + base::BindOnce(&base::CreateTemporaryFile, &temp_file_))); + EXPECT_FALSE(temp_file_.empty()); + } + + // Creates and returns an initialized VideoFileHandler instance. + base::SequenceBound<VideoFileHandler> CreateAndInitHandler(size_t capacity) { + base::SequenceBound<VideoFileHandler> handler = + VideoFileHandler::Create(task_runner(), temp_file(), capacity); + const bool success = + RunOnHandlerAndWait(&handler, &VideoFileHandler::Initialize); + EXPECT_TRUE(success); + return handler; + } + + // Schedules and waits for a file IO |task|, and returns its result. + using FileOpTask = base::OnceCallback<bool()>; + bool ScheduleFileOpTaskAndWait(FileOpTask task) { + bool result = false; + base::RunLoop run_loop; + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, std::move(task), + base::BindOnce( + [](base::RunLoop* loop, bool* result, bool success) { + *result = success; + loop->Quit(); + }, + &run_loop, &result)); + run_loop.Run(); + return result; + } + + // Reads and returns the contents of the |temp_file_|. + std::string ReadTempFileContent() { + std::string file_content; + EXPECT_TRUE(ScheduleFileOpTaskAndWait( + base::BindOnce(&base::ReadFileToString, temp_file_, &file_content))); + return file_content; + } + + // Runs an async |method| on the VideoFileHandler instance |handler| and waits + // for it complete and returns its result. + template <typename Method> + bool RunOnHandlerAndWait(base::SequenceBound<VideoFileHandler>* handler, + Method method) const { + base::RunLoop run_loop; + bool result = false; + handler->AsyncCall(method).Then(base::BindOnce( + [](base::RunLoop* loop, bool* result, bool success) { + *result = success; + loop->Quit(); + }, + &run_loop, &result)); + run_loop.Run(); + return result; + } + + // Returns the success status of all IO operations done so far by the given + // |handler|. + bool GetSuccessStatusOnUi( + base::SequenceBound<VideoFileHandler>* handler) const { + return RunOnHandlerAndWait(handler, &VideoFileHandler::GetSuccessStatus); + } + + // |base::SequenceBound| does not allow passing a null callback to its + // |Then()| operations. This function is a convenience for getting a callback + // that does nothing. + base::OnceCallback<void(bool)> GetIgnoreResultCallback() const { + return base::BindOnce([](bool) {}); + } + + private: + base::test::TaskEnvironment task_environment_; + scoped_refptr<base::SequencedTaskRunner> task_runner_; + base::FilePath temp_file_; +}; + +TEST_F(VideoFileHandlerTest, ChunksHandling) { + constexpr size_t kCapacity = 10; + base::SequenceBound<VideoFileHandler> handler = + CreateAndInitHandler(kCapacity); + ASSERT_TRUE(handler); + + // Append a chunk smaller than the capacity. Nothing will be written to the + // file yet. + std::string chunk_1 = "12345"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_1) + .Then(GetIgnoreResultCallback()); + std::string file_content = ReadTempFileContent(); + EXPECT_TRUE(file_content.empty()); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); + + // Append another chunk which together with what is cached in the handler + // buffer would exceed the capacity. Only what is in the buffer will be + // written now. + std::string chunk_2 = "1234567"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_2) + .Then(GetIgnoreResultCallback()); + file_content = ReadTempFileContent(); + EXPECT_EQ(file_content, chunk_1); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); + + // Now chunk_2 is cached with a size equals to 7. Appending another chunk with + // size equals to 3 would still be within the buffer capacity. Nothing will be + // flushed yet. + std::string chunk_3 = "89A"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_3) + .Then(GetIgnoreResultCallback()); + file_content = ReadTempFileContent(); + EXPECT_EQ(file_content, chunk_1); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); + + // Appending another chunk will cause a flush. + std::string chunk_4 = "BCDEFG"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_4) + .Then(GetIgnoreResultCallback()); + file_content = ReadTempFileContent(); + EXPECT_EQ(file_content, chunk_1 + chunk_2 + chunk_3); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); + + // Destroying the handler will schedule its destruction on the task runner, + // and will cause a flush of the remaining chunk_4 in the cache. After that, + // the file content will be complete. + handler.Reset(); + file_content = ReadTempFileContent(); + EXPECT_EQ(file_content, chunk_1 + chunk_2 + chunk_3 + chunk_4); +} + +TEST_F(VideoFileHandlerTest, BigChunks) { + constexpr size_t kCapacity = 10; + base::SequenceBound<VideoFileHandler> handler = + CreateAndInitHandler(kCapacity); + ASSERT_TRUE(handler); + + // Append a chunk smaller than the capacity. Nothing will be written to the + // file yet. + std::string chunk_1 = "12345"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_1) + .Then(GetIgnoreResultCallback()); + std::string file_content = ReadTempFileContent(); + EXPECT_TRUE(file_content.empty()); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); + + // Appending a big chunk that is bigger than the buffer capacity will cause a + // flush of what's currently cached, followed by an immediate write of that + // big chunk, such that the file content will be complete. + std::string chunk_2 = "123456789ABCDEF"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_2) + .Then(GetIgnoreResultCallback()); + file_content = ReadTempFileContent(); + EXPECT_EQ(file_content, chunk_1 + chunk_2); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); +} + +TEST_F(VideoFileHandlerTest, ManualFlush) { + constexpr size_t kCapacity = 10; + base::SequenceBound<VideoFileHandler> handler = + CreateAndInitHandler(kCapacity); + ASSERT_TRUE(handler); + + // Append a chunk smaller than the capacity. Nothing will be written to the + // file yet. + std::string chunk_1 = "12345"; + handler.AsyncCall(&VideoFileHandler::AppendChunk) + .WithArgs(chunk_1) + .Then(GetIgnoreResultCallback()); + std::string file_content = ReadTempFileContent(); + EXPECT_TRUE(file_content.empty()); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); + + // It's possible to flush the buffer manually. + base::RunLoop run_loop; + handler.AsyncCall(&VideoFileHandler::FlushBufferedChunks) + .Then(base::BindOnce( + [](base::RunLoop* loop, bool success) { + EXPECT_TRUE(success); + loop->Quit(); + }, + &run_loop)); + run_loop.Run(); + file_content = ReadTempFileContent(); + EXPECT_EQ(file_content, chunk_1); + EXPECT_TRUE(GetSuccessStatusOnUi(&handler)); +} + +} // namespace ash
diff --git a/ash/clipboard/clipboard_nudge.cc b/ash/clipboard/clipboard_nudge.cc index 41c23eb..6a5aab1 100644 --- a/ash/clipboard/clipboard_nudge.cc +++ b/ash/clipboard/clipboard_nudge.cc
@@ -8,11 +8,14 @@ #include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/resources/vector_icons/vector_icons.h" +#include "ash/root_window_controller.h" +#include "ash/shelf/hotseat_widget.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" #include "ui/base/l10n/l10n_util.h" #include "ui/chromeos/events/keyboard_layout_util.h" +#include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/border.h" @@ -49,6 +52,9 @@ // The padding which separates the nudge's border with its inner contents. constexpr int kNudgePadding = 16; +constexpr base::TimeDelta kNudgeBoundsAnimationTime = + base::TimeDelta::FromMilliseconds(250); + bool IsAssistantAvailable() { AssistantStateBase* state = AssistantState::Get(); return state->allowed_state() == @@ -143,7 +149,11 @@ views::ImageView* clipboard_icon_ = nullptr; }; -ClipboardNudge::ClipboardNudge() : widget_(std::make_unique<views::Widget>()) { +ClipboardNudge::ClipboardNudge() + : widget_(std::make_unique<views::Widget>()), + root_window_(Shell::GetRootWindowForNewWindows()) { + shelf_observer_.Add(RootWindowController::ForWindow(root_window_)->shelf()); + views::Widget::InitParams params( views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); params.z_order = ui::ZOrderLevel::kFloatingWindow; @@ -151,8 +161,8 @@ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.name = "ClipboardContextualNudge"; params.layer_type = ui::LAYER_NOT_DRAWN; - params.parent = Shell::GetPrimaryRootWindow()->GetChildById( - kShellWindowId_OverlayContainer); + params.parent = + root_window_->GetChildById(kShellWindowId_SettingBubbleContainer); widget_->Init(std::move(params)); nudge_view_ = @@ -163,14 +173,18 @@ ClipboardNudge::~ClipboardNudge() = default; +void ClipboardNudge::OnHotseatStateChanged(HotseatState old_state, + HotseatState new_state) { + CalculateAndSetWidgetBounds(); +} + void ClipboardNudge::Close() { widget_->CloseWithReason(views::Widget::ClosedReason::kUnspecified); } void ClipboardNudge::CalculateAndSetWidgetBounds() { - aura::Window* root_window = Shell::GetRootWindowForNewWindows(); - gfx::Rect display_bounds = root_window->bounds(); - ::wm::ConvertRectToScreen(root_window, &display_bounds); + gfx::Rect display_bounds = root_window_->bounds(); + ::wm::ConvertRectToScreen(root_window_, &display_bounds); gfx::Rect widget_bounds; // Calculate the nudge's size to ensure the label text accurately fits. @@ -188,6 +202,26 @@ if (base::i18n::IsRTL()) widget_bounds.set_x(display_bounds.right() - nudge_width - kNudgeMargin); + // Set the nudge's bounds above the hotseat when it is extended. + HotseatWidget* hotseat_widget = + RootWindowController::ForWindow(root_window_)->shelf()->hotseat_widget(); + if (hotseat_widget->state() == HotseatState::kExtended) { + widget_bounds.set_y(hotseat_widget->GetTargetBounds().y() - nudge_height - + kNudgeMargin); + } + + // Only run the widget bounds animation if the widget's bounds have already + // been initialized. + std::unique_ptr<ui::ScopedLayerAnimationSettings> settings; + if (widget_->GetWindowBoundsInScreen().size() != gfx::Size()) { + settings = std::make_unique<ui::ScopedLayerAnimationSettings>( + widget_->GetLayer()->GetAnimator()); + settings->SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); + settings->SetTransitionDuration(kNudgeBoundsAnimationTime); + settings->SetTweenType(gfx::Tween::EASE_OUT); + } + widget_->SetBounds(widget_bounds); }
diff --git a/ash/clipboard/clipboard_nudge.h b/ash/clipboard/clipboard_nudge.h index 2724461..46539f99 100644 --- a/ash/clipboard/clipboard_nudge.h +++ b/ash/clipboard/clipboard_nudge.h
@@ -6,18 +6,24 @@ #define ASH_CLIPBOARD_CLIPBOARD_NUDGE_H_ #include "ash/ash_export.h" +#include "ash/shelf/shelf.h" +#include "ash/shelf/shelf_observer.h" +#include "base/scoped_observer.h" #include "ui/views/widget/widget.h" namespace ash { // Implements a contextual nudge for multipaste. -class ASH_EXPORT ClipboardNudge { +class ASH_EXPORT ClipboardNudge : public ShelfObserver { public: ClipboardNudge(); ClipboardNudge(const ClipboardNudge&) = delete; ClipboardNudge& operator=(const ClipboardNudge&) = delete; - ~ClipboardNudge(); + ~ClipboardNudge() override; + // ShelfObserver overrides: + void OnHotseatStateChanged(HotseatState old_state, + HotseatState new_state) override; void Close(); private: @@ -30,8 +36,12 @@ std::unique_ptr<views::Widget> widget_; ClipboardNudgeView* nudge_view_ = nullptr; // not_owned + + aura::Window* const root_window_; + + ScopedObserver<Shelf, ShelfObserver> shelf_observer_{this}; }; } // namespace ash -#endif // ASH_CLIPBOARD_CLIPBOARD_NUDGE_H_ +#endif // ASH_CLIPBOARD_CLIPBOARD_NUDGE_H_ \ No newline at end of file
diff --git a/ash/clipboard/views/clipboard_history_item_view.cc b/ash/clipboard/views/clipboard_history_item_view.cc index 2e22a38..3df7c36b 100644 --- a/ash/clipboard/views/clipboard_history_item_view.cc +++ b/ash/clipboard/views/clipboard_history_item_view.cc
@@ -169,7 +169,7 @@ // Ensures that MainButton is below any other child views. main_button_ = AddChildView(std::make_unique<MainButton>(this)); - main_button_->set_callback(base::BindRepeating( + main_button_->SetCallback(base::BindRepeating( [](ClipboardHistoryItemView* item, views::MenuItemView* container, const ui::Event& event) { item->ExecuteCommand(container->GetCommand(), event);
diff --git a/ash/magnifier/docked_magnifier_controller_impl_unittest.cc b/ash/magnifier/docked_magnifier_controller_impl_unittest.cc index a2c27d8..663a28e7 100644 --- a/ash/magnifier/docked_magnifier_controller_impl_unittest.cc +++ b/ash/magnifier/docked_magnifier_controller_impl_unittest.cc
@@ -32,12 +32,14 @@ #include "base/command_line.h" #include "components/prefs/pref_service.h" #include "components/session_manager/session_manager_types.h" +#include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" #include "ui/compositor/layer.h" #include "ui/display/display.h" #include "ui/display/manager/managed_display_info.h" #include "ui/events/test/event_generator.h" #include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" #include "ui/wm/core/coordinate_conversion.h" namespace ash { @@ -142,8 +144,146 @@ auto* generator = GetEventGenerator(); generator->GestureTapAt(touch_point_in_screen); } + + std::unique_ptr<views::Widget> CreateLockSystemModalWindow( + const gfx::Rect& bounds) { + auto* widget_delegate_view = new views::WidgetDelegateView(); + widget_delegate_view->SetModalType(ui::MODAL_TYPE_SYSTEM); + return CreateTestWidget(widget_delegate_view, + kShellWindowId_LockSystemModalContainer, bounds); + } + + // Test that display work area and a modal window is adjusted correctly + // after enabling and disabling a docked magnifier. + void TestDisplayWorkAreaAndLockSystemModalBoundsUpdated() { + // Start with the docked magnifier disabled. + EXPECT_FALSE(controller()->GetEnabled()); + + // Create a lock system modal window. + auto lock_system_modal_widget = + CreateLockSystemModalWindow(gfx::Rect(800, 600)); + + // Enable the docked magnifier. + controller()->SetEnabled(true); + EXPECT_TRUE(controller()->GetEnabled()); + + // Expect that the modal window fits inside the shrunk valid area. + const gfx::Rect modal_bounds = + lock_system_modal_widget->GetWindowBoundsInScreen(); + const gfx::Rect valid_area = + display::Screen::GetScreen() + ->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow()) + .work_area(); + const gfx::Rect docked_magnifier_bounds = + controller()->GetViewportWidgetForTesting()->GetWindowBoundsInScreen(); + // Check that display work area does not overlap with a docked magnifier. + EXPECT_FALSE(docked_magnifier_bounds.Intersects(valid_area)); + // Check that modal window fits inside the display work area, |valid_area|, + // to make sure the |modal_bounds| size does not overflow. + EXPECT_TRUE(valid_area.Contains(modal_bounds)); + + // Disable the docked magnifier. + controller()->SetEnabled(false); + EXPECT_FALSE(controller()->GetEnabled()); + + const gfx::Rect modal_bounds_no_magnifier = + lock_system_modal_widget->GetWindowBoundsInScreen(); + + // Expect that the window stays inside the valid area. + const gfx::Rect valid_area_no_magnifier = + display::Screen::GetScreen() + ->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow()) + .work_area(); + EXPECT_TRUE(valid_area_no_magnifier.Contains(modal_bounds_no_magnifier)); + // With larger work area, |modal_bounds_no_magnifier| size must not shrink. + // Even stricter, the size must remain the same as |modal_bounds| size + // because a centered system modal only shrinks but never expands according + // to SystemModalContainerLayoutManager::GetCenteredAndOrFittedBounds() + // ClampToCenteredSize. + EXPECT_EQ(modal_bounds.size(), modal_bounds_no_magnifier.size()); + // Expect y offset of the modal window to be centered correctly. + EXPECT_EQ((valid_area_no_magnifier.height() - + modal_bounds_no_magnifier.height()) / + 2, + modal_bounds_no_magnifier.y()); + } + + // Test that bounds of a modal window are the same when initially created and + // updated. views::NativeWidgetAura::CenterWindow() sets the initial modal + // bounds, while + // SystemModalContainerLayoutManager::GetCenteredAndOrFittedBounds() updates + // the modal window bounds. Thus, this test makes sure the bounds are the same + // in both cases. + void TestLockSystemModalBoundUpdateAndCreationConsistency() { + // Start with the docked magnifier disabled. + EXPECT_FALSE(controller()->GetEnabled()); + + // Create a lock system modal window for an update case. + auto lock_system_modal_widget_update_case = + CreateLockSystemModalWindow(gfx::Rect(800, 600)); + + // Enable the docked magnifier. + controller()->SetEnabled(true); + EXPECT_TRUE(controller()->GetEnabled()); + + // Create a lock system modal window for a creation case. + auto lock_system_modal_widget = + CreateLockSystemModalWindow(gfx::Rect(800, 600)); + + // Expect that both modal windows fit inside the shrunk area + // and have the exact same bounds. + const gfx::Rect modal_bounds = + lock_system_modal_widget->GetWindowBoundsInScreen(); + const gfx::Rect modal_bounds_update_case = + lock_system_modal_widget_update_case->GetWindowBoundsInScreen(); + const gfx::Rect valid_area = + display::Screen::GetScreen() + ->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow()) + .work_area(); + const gfx::Rect docked_magnifier_bounds = + controller()->GetViewportWidgetForTesting()->GetWindowBoundsInScreen(); + EXPECT_FALSE(docked_magnifier_bounds.Intersects(valid_area)); + EXPECT_TRUE(valid_area.Contains(modal_bounds)); + EXPECT_EQ(modal_bounds, modal_bounds_update_case); + + // Disable the docked magnifier. + controller()->SetEnabled(false); + EXPECT_FALSE(controller()->GetEnabled()); + } }; +// If not signed in, test that display work area and window bounds +// are updated correctly after enabling and disabling a docked magnifier. +TEST_F(DockedMagnifierTest, WindowBoundsChangeInNonActiveState) { + UpdateDisplay("800x600"); + + struct { + std::string trace; + session_manager::SessionState state; + } kNonActiveStatesTestCases[] = { + {"oobe", session_manager::SessionState::OOBE}, + {"login_primary", session_manager::SessionState::LOGIN_PRIMARY}, + {"locked", session_manager::SessionState::LOCKED}, + {"login_secondary", session_manager::SessionState::LOGIN_SECONDARY}, + }; + + // For each of the states which is not ACTIVE, LOGGED_IN_NOT_ACTIVE, and + // UNKNOWN, set the session state and make sure that work area and window + // bounds are as expected after enabling and disabling the docked magnifier. + // In LOGGED_IN_NOT_ACTIVE state, no window can be added to + // LockSystemModalContainer. + for (auto test_case : kNonActiveStatesTestCases) { + SCOPED_TRACE(test_case.trace); + GetSessionControllerClient()->SetSessionState(test_case.state); + // Test that display work area and the modal window position is dynamically + // adjusted regarding the existence of a docked magnifier. + TestDisplayWorkAreaAndLockSystemModalBoundsUpdated(); + // Test that bounds of a lock system modal window are + // the same during creation and update. + TestLockSystemModalBoundUpdateAndCreationConsistency(); + } +} + // Tests that the Fullscreen and Docked Magnifiers are mutually exclusive. // TODO(afakhry): Update this test to use ash::MagnificationController once // refactored. https://crbug.com/817157.
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index 2f02846..14bccd8 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -1572,21 +1572,26 @@ shelf_widget_->GetNativeWindow()); bool in_overview = Shell::Get()->overview_controller()->InOverviewSession(); - if (!in_overview && !state_.IsScreenLocked() && - (shelf_->alignment() != ShelfAlignment::kBottomLocked || - display_.work_area() == display_.bounds())) { - gfx::Insets insets; - // If user session is blocked (login to new user session or add user to - // the existing session - multi-profile) then give 100% of work area - // only if keyboard is not shown. - // TODO(agawronska): Could this be called from WorkAreaInsets? - const WorkAreaInsets* const work_area = - WorkAreaInsets::ForWindow(shelf_widget_->GetNativeWindow()); - if (!state_.IsAddingSecondaryUser() || work_area->IsKeyboardShown()) - insets = work_area->user_work_area_insets(); - - Shell::Get()->SetDisplayWorkAreaInsets(shelf_widget_->GetNativeWindow(), - insets); + const WorkAreaInsets* const work_area = + WorkAreaInsets::ForWindow(shelf_widget_->GetNativeWindow()); + if (state_.IsActiveSessionState()) { + if (!in_overview && + (shelf_->alignment() != ShelfAlignment::kBottomLocked || + display_.work_area() == display_.bounds())) { + gfx::Insets insets; + // If user session is blocked (login to new user session or add user + // to the existing session - multi-profile) then give 100% of work + // area only if keyboard is not shown. + // TODO(agawronska): Could this be called from WorkAreaInsets? + if (!state_.IsAddingSecondaryUser() || work_area->IsKeyboardShown()) + insets = work_area->user_work_area_insets(); + Shell::Get()->SetDisplayWorkAreaInsets( + shelf_widget_->GetNativeWindow(), insets); + } + } else { + Shell::Get()->SetDisplayWorkAreaInsets( + shelf_widget_->GetNativeWindow(), + work_area->GetAccessibilityInsets()); } } }
diff --git a/ash/shell.cc b/ash/shell.cc index 1f4bb1b..e5f226f 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -822,6 +822,10 @@ // Stop observing window activation changes before closing all windows. focus_controller_->RemoveObserver(this); + // Depends on shelf owned by RootWindowController so destroy this before the + // |window_tree_host_manager_|. + clipboard_history_controller_.reset(); + // This also deletes all RootWindows. Note that we invoke Shutdown() on // WindowTreeHostManager before resetting |window_tree_host_manager_|, since // destruction of its owned RootWindowControllers relies on the value.
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 26b5f1b..f79c06f 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -100,6 +100,7 @@ <translation id="1888656773939766144"><ph name="DISPLAY_NAME" /> unterstützt <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz) nicht. Die Auflösung wurde zu <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" /> Hz) geändert. Bitte bestätigen, um die Änderungen beizubehalten. Die vorherigen Einstellungen werden in <ph name="TIMEOUT_SECONDS" /> wiederhergestellt.</translation> <translation id="1919743966458266018">Die Tastenkombination zum Öffnen des Task-Managers hat sich geändert. Bitte drücken Sie <ph name="NEW_SHORTCUT" /> statt <ph name="OLD_SHORTCUT" />.</translation> <translation id="1923539912171292317">Automatische Klicks</translation> +<translation id="1924640696879807758">Vom Telefon</translation> <translation id="1928739107511554905">Sie können das Update vornehmen, indem Sie den Touchscreen verwenden, um das Chromebook mit angeschlossener Tastatur neu zu starten.</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1957803754585243749">0°</translation> @@ -686,6 +687,7 @@ <translation id="7904094684485781019">Der Administrator dieses Kontos hat keine Mehrfachanmeldung zugelassen.</translation> <translation id="7933084174919150729">Google Assistant ist nur für das Hauptprofil verfügbar.</translation> <translation id="79341161159229895">Konto verwaltet von <ph name="FIRST_PARENT_EMAIL" /> und <ph name="SECOND_PARENT_EMAIL" /></translation> +<translation id="793716872548410480">Drücken Sie <ph name="SHORTCUT_KEY_NAME" /> + V, um die Zwischenablage zu öffnen. In der Zwischenablage werden immer die letzten fünf Elemente, die Sie kopiert haben, gespeichert.</translation> <translation id="7955885781510802139">Modus mit hohem Kontrast</translation> <translation id="7977927628060636163">Nach Mobilfunknetzen wird gesucht…</translation> <translation id="7980780401175799550">Neue Navigationsoptionen für Chrome OS</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 8821c8eb..10fe71c0 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -118,7 +118,7 @@ <translation id="2050339315714019657">عمودی</translation> <translation id="2067602449040652523">روشنایی صفحهکلید</translation> <translation id="2074759828767813253">نماگرفتها و بارگیریهای اخیر</translation> -<translation id="2083190527011054446">شب بهخیر <ph name="GIVEN_NAME" />،</translation> +<translation id="2083190527011054446">شببهخیر <ph name="GIVEN_NAME" />،</translation> <translation id="209965399369889474">به شبکه متصل نیست</translation> <translation id="2126242104232412123">فضای کار جدید</translation> <translation id="2127372758936585790">شارژر برق ضعیف</translation> @@ -334,7 +334,7 @@ <translation id="4269883910223712419">سرپرست این دستگاه میتواند:</translation> <translation id="4279490309300973883">بازتاب میشود</translation> <translation id="4285498937028063278">لغو پین</translation> -<translation id="4294319844246081198">صبح بهخیر <ph name="GIVEN_NAME" />،</translation> +<translation id="4294319844246081198">صبحبهخیر <ph name="GIVEN_NAME" />،</translation> <translation id="4296136865091727875">پاک کردن همه <ph name="COUNT" /> اعلان</translation> <translation id="4302592941791324970">موجود نیست</translation> <translation id="4303223480529385476">بزرگ کردن ناحیه نشانگر وضعیت</translation> @@ -634,7 +634,7 @@ <translation id="7405710164030118432">برای باز کردن قفل دستگاه، کد دسترسی والدین را برای Family Link وارد کنید</translation> <translation id="741244894080940828">تبدیل</translation> <translation id="742594950370306541">دوربین در حال استفاده است.</translation> -<translation id="742608627846767349">صبح بهخیر،</translation> +<translation id="742608627846767349">صبحبهخیر،</translation> <translation id="743058460480092004">دوربین و میکروفن در حال استفاده هستند.</translation> <translation id="7461924472993315131">پین</translation> <translation id="7466449121337984263">لطفاً حسگر را لمس کنید</translation> @@ -730,7 +730,7 @@ <translation id="8351131234907093545">یادداشت ایجاد کنید</translation> <translation id="8371779926711439835">جلو رفتن حرفبهحرف</translation> <translation id="8375916635258623388">این <ph name="DEVICE_NAME" /> و تلفنتان بهطور خودکار متصل میشوند</translation> -<translation id="8380784334203145311">شب بهخیر،</translation> +<translation id="8380784334203145311">شببهخیر،</translation> <translation id="8388750414311082622">میز آخر را نمیتوان حذف کرد.</translation> <translation id="8392451568018454956">منوی گزینهها برای <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8394567579869570560">پدر یا مادرتان این دستگاه را قفل کرده است</translation>
diff --git a/ash/system/dark_mode/dark_mode_detailed_view.cc b/ash/system/dark_mode/dark_mode_detailed_view.cc index 6a7702e..b8fcc53 100644 --- a/ash/system/dark_mode/dark_mode_detailed_view.cc +++ b/ash/system/dark_mode/dark_mode_detailed_view.cc
@@ -28,7 +28,7 @@ : views::RadioButton(button_label) { SetBorder(views::CreateEmptyBorder(kTrayRadioButtonPadding)); SetImageLabelSpacing(kTrayRadioButtonInterSpacing); - set_callback(views::Button::PressedCallback(listener, this)); + SetCallback(views::Button::PressedCallback(listener, this)); } // views::RadioButton:
diff --git a/ash/system/holding_space/holding_space_drag_util.cc b/ash/system/holding_space/holding_space_drag_util.cc index 57b5772..4a443a12 100644 --- a/ash/system/holding_space/holding_space_drag_util.cc +++ b/ash/system/holding_space/holding_space_drag_util.cc
@@ -312,6 +312,49 @@ DragImageView& operator=(const DragImageView&) = delete; ~DragImageView() override = default; + // Paints this view to a `gfx::ImageSkia` for use as a drag image. + gfx::ImageSkia GetDragImage(float scale, bool is_pixel_canvas) { +#if DCHECK_IS_ON() + // NOTE: This method will *not* paint `ui::Layer`s, so it is expected that + // all views in this view hierarchy *not* paint to layers. + AssertNoLayers(this); +#endif // DCHECK_IS_ON() + SkBitmap bitmap; + Paint(views::PaintInfo::CreateRootPaintInfo( + ui::CanvasPainter(&bitmap, size(), scale, + /*clear_color=*/SK_ColorTRANSPARENT, is_pixel_canvas) + .context(), + size())); + return gfx::ImageSkia(gfx::ImageSkiaRep(bitmap, scale)); + } + + // Returns the drag offset to use when rendering this view as a drag image. + // This offset will position the cursor directly over the top left hand corner + // of the first dragged item (or flipped for RTL). + gfx::Vector2d GetDragOffset() const { + DCHECK(first_drag_image_item_view_); + const gfx::Rect contents_bounds = + first_drag_image_item_view_->GetContentsBounds(); + + // Use the contents origin of the first dragged item instead of its local + // bounds origin to exclude the region reserved for its shadow margins. + gfx::Point contents_origin = contents_bounds.origin(); + views::View::ConvertPointToTarget(first_drag_image_item_view_->parent(), + /*target=*/this, &contents_origin); + + gfx::Vector2d drag_offset = contents_origin.OffsetFromOrigin(); + + // In RTL, its necessary to offset by the contents width of the first + // dragged item so that the cursor is positioned over its top right hand + // corner. Again, contents width is used instead of local bounds width to + // exclude shadow margins. + if (base::i18n::IsRTL()) + drag_offset += gfx::Vector2d(contents_bounds.width(), 0); + + return drag_offset; + } + + private: // views::View: gfx::Insets GetInsets() const override { if (!drag_image_overflow_badge_) @@ -345,23 +388,6 @@ gfx::Rect(badge_origin, badge_size)); } - // Paints this view to a `gfx::ImageSkia`. - gfx::ImageSkia PaintToImageSkia(float scale, bool is_pixel_canvas) { -#if DCHECK_IS_ON() - // NOTE: This method will *not* paint `ui::Layer`s, so it is expected that - // all views in this view hierarchy *not* paint to layers. - AssertNoLayers(this); -#endif // DCHECK_IS_ON() - SkBitmap bitmap; - Paint(views::PaintInfo::CreateRootPaintInfo( - ui::CanvasPainter(&bitmap, size(), scale, - /*clear_color=*/SK_ColorTRANSPARENT, is_pixel_canvas) - .context(), - size())); - return gfx::ImageSkia(gfx::ImageSkiaRep(bitmap, scale)); - } - - private: void InitLayout(const std::vector<const HoldingSpaceItem*>& items) { auto* layout = SetLayoutManager(std::make_unique<views::FillLayout>()); AddDragImageItemViews(items); @@ -435,15 +461,8 @@ DragImageView drag_image_view(GetHoldingSpaceItems(views)); drag_image_view.SetSize(drag_image_view.GetPreferredSize()); - *drag_image = drag_image_view.PaintToImageSkia(scale, is_pixel_canvas); - - // The `drag_offset` should correct for the extra space that may have been - // added to layout the overflow badge (if present). Doing so will position the - // cursor at the top left hand corner of the first dragged item (or flipped - // for RTL). - *drag_offset = - gfx::Vector2d(base::i18n::IsRTL() ? drag_image_view.width() : 0, - drag_image_view.GetInsets().top()); + *drag_image = drag_image_view.GetDragImage(scale, is_pixel_canvas); + *drag_offset = drag_image_view.GetDragOffset(); } } // namespace holding_space_util
diff --git a/ash/system/holding_space/holding_space_item_view.cc b/ash/system/holding_space/holding_space_item_view.cc index eb0fd05..51a7fbb 100644 --- a/ash/system/holding_space/holding_space_item_view.cc +++ b/ash/system/holding_space/holding_space_item_view.cc
@@ -229,8 +229,8 @@ pin_->SetImageVerticalAlignment( views::ToggleImageButton::VerticalAlignment::ALIGN_MIDDLE); - pin_->set_callback(base::BindRepeating(&HoldingSpaceItemView::OnPinPressed, - base::Unretained(this))); + pin_->SetCallback(base::BindRepeating(&HoldingSpaceItemView::OnPinPressed, + base::Unretained(this))); return pin_; }
diff --git a/ash/system/holding_space/recent_files_container.cc b/ash/system/holding_space/recent_files_container.cc index 708165e0..c039b115 100644 --- a/ash/system/holding_space/recent_files_container.cc +++ b/ash/system/holding_space/recent_files_container.cc
@@ -71,8 +71,8 @@ chevron->SetImage(CreateVectorIcon( kChevronRightIcon, kHoldingSpaceDownloadsChevronIconSize, icon_color)); - set_callback(base::BindRepeating(&DownloadsHeader::OnPressed, - base::Unretained(this))); + SetCallback(base::BindRepeating(&DownloadsHeader::OnPressed, + base::Unretained(this))); } private:
diff --git a/ash/system/network/sms_observer.cc b/ash/system/network/sms_observer.cc index 85529a19..a0220134 100644 --- a/ash/system/network/sms_observer.cc +++ b/ash/system/network/sms_observer.cc
@@ -26,7 +26,7 @@ // Send the |message| to notification center to display to users. Note that each // notification will be assigned with different |message_id| as notification id. -void ShowNotification(const base::DictionaryValue* message, +void ShowNotification(const base::Value* message, const std::string& message_text, const std::string& message_number, int message_id) { @@ -69,31 +69,31 @@ } } -void SmsObserver::MessageReceived(const base::DictionaryValue& message) { - std::string message_text; - if (!message.GetStringWithoutPathExpansion( - chromeos::NetworkSmsHandler::kTextKey, &message_text)) { +void SmsObserver::MessageReceived(const base::Value& message) { + const std::string* message_text = + message.FindStringKey(chromeos::NetworkSmsHandler::kTextKey); + if (!message_text) { NET_LOG(ERROR) << "SMS message contains no content."; return; } // TODO(armansito): A message might be due to a special "Message Waiting" // state that the message is in. Once SMS handling moves to shill, such // messages should be filtered there so that this check becomes unnecessary. - if (message_text.empty()) { + if (message_text->empty()) { NET_LOG(DEBUG) << "SMS has empty content text. Ignoring."; return; } - std::string message_number; - if (!message.GetStringWithoutPathExpansion( - chromeos::NetworkSmsHandler::kNumberKey, &message_number)) { + const std::string* message_number = + message.FindStringKey(chromeos::NetworkSmsHandler::kNumberKey); + if (!message_number) { NET_LOG(DEBUG) << "SMS contains no number. Ignoring."; return; } - NET_LOG(DEBUG) << "Received SMS from: " << message_number - << " with text: " << message_text; + NET_LOG(DEBUG) << "Received SMS from: " << *message_number + << " with text: " << *message_text; message_id_++; - ShowNotification(&message, message_text, message_number, message_id_); + ShowNotification(&message, *message_text, *message_number, message_id_); } } // namespace ash
diff --git a/ash/system/network/sms_observer.h b/ash/system/network/sms_observer.h index b304005..4291bf2 100644 --- a/ash/system/network/sms_observer.h +++ b/ash/system/network/sms_observer.h
@@ -7,10 +7,6 @@ #include "chromeos/network/network_sms_handler.h" -namespace base { -class DictionaryValue; -} - namespace ash { // SmsObserver is called when a new sms message is received. Then it shows the @@ -21,7 +17,7 @@ ~SmsObserver() override; // chromeos::NetworkSmsHandler::Observer: - void MessageReceived(const base::DictionaryValue& message) override; + void MessageReceived(const base::Value& message) override; private: // Used to create notification identifier.
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc index 6c2c8dca..6ee3a91 100644 --- a/ash/wallpaper/wallpaper_controller_unittest.cc +++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -44,6 +44,7 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/aura/window.h" +#include "ui/compositor/layer_tree_owner.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/compositor/test/layer_animator_test_controller.h" #include "ui/display/display.h" @@ -353,15 +354,18 @@ } // Runs AnimatingWallpaperWidgetController's animation to completion. - // TODO(bshe): Don't require tests to run animations; it's slow. void RunDesktopControllerAnimation() { WallpaperWidgetController* controller = Shell::Get() ->GetPrimaryRootWindowController() ->wallpaper_widget_controller(); ASSERT_TRUE(controller); - ASSERT_NO_FATAL_FAILURE( - RunAnimationForLayer(controller->wallpaper_view()->layer())); + + ui::LayerTreeOwner* owner = controller->old_layer_tree_owner_for_testing(); + if (!owner) + return; + + ASSERT_NO_FATAL_FAILURE(RunAnimationForLayer(owner->root())); } // Convenience function to ensure ShouldCalculateColors() returns true. @@ -684,8 +688,7 @@ controller->CreateEmptyWallpaperForTesting(); // Run wallpaper show animation to completion. - ASSERT_NO_FATAL_FAILURE( - RunAnimationForLayer(widget_controller->wallpaper_view()->layer())); + RunDesktopControllerAnimation(); EXPECT_FALSE(widget_controller->IsAnimating()); }
diff --git a/ash/wallpaper/wallpaper_widget_controller.cc b/ash/wallpaper/wallpaper_widget_controller.cc index 90f16719..ef9e8ee 100644 --- a/ash/wallpaper/wallpaper_widget_controller.cc +++ b/ash/wallpaper/wallpaper_widget_controller.cc
@@ -18,6 +18,7 @@ #include "ui/compositor/layer_animation_observer.h" #include "ui/compositor/layer_tree_owner.h" #include "ui/compositor/scoped_layer_animation_settings.h" +#include "ui/gfx/animation/tween.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_observer.h" #include "ui/wm/core/window_util.h" @@ -44,11 +45,11 @@ } bool WallpaperWidgetController::IsAnimating() const { - return wallpaper_view_->layer()->GetAnimator()->is_animating(); + return old_layer_tree_owner_ && + old_layer_tree_owner_->root()->GetAnimator()->is_animating(); } void WallpaperWidgetController::StopAnimating() { - wallpaper_view_->layer()->GetAnimator()->StopAnimating(); if (old_layer_tree_owner_) { old_layer_tree_owner_->root()->GetAnimator()->StopAnimating(); old_layer_tree_owner_.reset(); @@ -116,25 +117,24 @@ DCHECK(wallpaper_view_); old_layer_tree_owner_ = ::wm::RecreateLayers(wallpaper_view_); - old_layer_tree_owner_->root()->parent()->StackAbove( - old_layer_tree_owner_->root(), wallpaper_view_->layer()); ui::Layer* old_layer = old_layer_tree_owner_->root(); ui::Layer* new_layer = wallpaper_view_->layer(); + DCHECK_EQ(old_layer->parent(), new_layer->parent()); + old_layer->parent()->StackAbove(old_layer, new_layer); + old_layer->SetOpacity(1.f); - new_layer->SetOpacity(0.f); - - ui::ScopedLayerAnimationSettings original_settings(new_layer->GetAnimator()); - ui::ScopedLayerAnimationSettings copy_settings(old_layer->GetAnimator()); - - original_settings.SetTransitionDuration(duration); - original_settings.SetTweenType(gfx::Tween::EASE_OUT); - original_settings.AddObserver(this); - - copy_settings.SetTransitionDuration(duration); - copy_settings.SetTweenType(gfx::Tween::EASE_IN); - new_layer->SetOpacity(1.f); + + // Fade out the old layer. When clearing the blur, use the opposite tween so + // that the animations are mirrors of each other. + const bool clearing = + wallpaper_view_->property() == wallpaper_constants::kClear; + ui::ScopedLayerAnimationSettings settings(old_layer->GetAnimator()); + settings.SetTransitionDuration(duration); + settings.SetTweenType(clearing ? gfx::Tween::EASE_IN : gfx::Tween::EASE_OUT); + settings.AddObserver(this); + old_layer->SetOpacity(0.f); }
diff --git a/ash/wallpaper/wallpaper_widget_controller.h b/ash/wallpaper/wallpaper_widget_controller.h index 75dcb6aa..c6f6783 100644 --- a/ash/wallpaper/wallpaper_widget_controller.h +++ b/ash/wallpaper/wallpaper_widget_controller.h
@@ -71,15 +71,20 @@ const base::TimeDelta& animation_duration = base::TimeDelta()); const WallpaperProperty& GetWallpaperProperty() const; - WallpaperView* wallpaper_view() const { return wallpaper_view_; } - // ui::ImplicitAnimationObserver: void OnImplicitAnimationsCompleted() override; + WallpaperView* wallpaper_view() { return wallpaper_view_; } + + ui::LayerTreeOwner* old_layer_tree_owner_for_testing() { + return old_layer_tree_owner_.get(); + } + private: // Runs callbacks in |animation_end_callbacks_|. void RunAnimationEndCallbacks(); + // Copies and fades out the existing wallpaper. void ApplyCrossFadeAnimation(base::TimeDelta duration); aura::Window* root_window_; @@ -90,7 +95,8 @@ // The current wallpaper widget. std::unique_ptr<views::Widget> widget_; - // The animating layer which contains old content. + // The animating layer which contains old content. This is the layer that is + // animated when changing wallpapers. std::unique_ptr<ui::LayerTreeOwner> old_layer_tree_owner_; // Pointer to the wallpaper view owned by |widget_|.
diff --git a/ash/wm/desks/desk_preview_view.cc b/ash/wm/desks/desk_preview_view.cc index dabed9a..a3783eb 100644 --- a/ash/wm/desks/desk_preview_view.cc +++ b/ash/wm/desks/desk_preview_view.cc
@@ -273,7 +273,7 @@ // Since the mini view has a remove animation, we don't want this desk preview // to be pressed while it's animating. The desk will have already be removed // after this. - set_callback(views::Button::PressedCallback()); + SetCallback(views::Button::PressedCallback()); } void DeskPreviewView::RecreateDeskContentsMirrorLayers() {
diff --git a/ash/wm/overview/overview_item_view.cc b/ash/wm/overview/overview_item_view.cc index 9ea3be8..5bd69e6 100644 --- a/ash/wm/overview/overview_item_view.cc +++ b/ash/wm/overview/overview_item_view.cc
@@ -133,7 +133,7 @@ ~OverviewCloseButton() override = default; // Resets the listener so that the listener can go out of scope. - void ResetListener() { set_callback(views::Button::PressedCallback()); } + void ResetListener() { SetCallback(views::Button::PressedCallback()); } protected: // views::Button:
diff --git a/ash/wm/system_modal_container_layout_manager.cc b/ash/wm/system_modal_container_layout_manager.cc index 3b8a416..9a94dcf 100644 --- a/ash/wm/system_modal_container_layout_manager.cc +++ b/ash/wm/system_modal_container_layout_manager.cc
@@ -17,6 +17,7 @@ #include "base/stl_util.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" +#include "ui/wm/core/coordinate_conversion.h" #include "ui/wm/core/window_util.h" namespace ash { @@ -45,7 +46,10 @@ SystemModalContainerLayoutManager::SystemModalContainerLayoutManager( aura::Window* container) - : container_(container) {} + : container_(container) { + Shelf* shelf = RootWindowController::ForWindow(container_)->shelf(); + shelf_observer_.Add(shelf); +} SystemModalContainerLayoutManager::~SystemModalContainerLayoutManager() { auto* keyboard_controller = keyboard::KeyboardUIController::Get(); @@ -190,6 +194,15 @@ layout_manager->window_dimmer_->window() == window; } +// This is invoked when the work area changes. +// * SystemModalContainerLayoutManager windows depend on +// changes to the accessibility panel insets, which are +// stored and handled globally via ShelfLayoutManager. +void SystemModalContainerLayoutManager::WillChangeVisibilityState( + ShelfVisibilityState new_state) { + PositionDialogsAfterWorkAreaResize(); +} + //////////////////////////////////////////////////////////////////////////////// // SystemModalContainerLayoutManager, private: @@ -255,6 +268,18 @@ // windows. This way we avoid flashing lines upon resize animation and if the // keyboard will not fill left to right, the background is still covered. gfx::Rect valid_bounds = container_->bounds(); + const auto& display = + display::Screen::GetScreen()->GetDisplayNearestWindow(container_); + gfx::Rect work_area = display.work_area(); + // Convert work area in screen global coordinates to root local coordinates. + wm::ConvertRectFromScreen(container_->GetRootWindow(), &work_area); + + // Similarly to NativeWidgetAura::CenterWindow, when centering window, + // we take the intersection of the host and the container bounds. + // The existing tests, SystemModalContainerLayoutManagerTest.KeepVisible and + // KeepCentered, include the cases that container bounds are resizable. + valid_bounds.Intersect(work_area); + keyboard::KeyboardUIController* keyboard_controller = keyboard::KeyboardUIController::Get(); if (keyboard_controller->IsEnabled()) { @@ -279,7 +304,7 @@ target_bounds = window->bounds(); target_bounds.AdjustToFit(usable_area); } - if (usable_area != container_->bounds()) { + if (keyboard::KeyboardUIController::Get()->IsEnabled()) { // Don't clamp the dialog for the keyboard. Keep the size as it is but make // sure that the top remains visible. // TODO(skuhne): M37 should add over scroll functionality to address this.
diff --git a/ash/wm/system_modal_container_layout_manager.h b/ash/wm/system_modal_container_layout_manager.h index 4a36b21..dc523e2 100644 --- a/ash/wm/system_modal_container_layout_manager.h +++ b/ash/wm/system_modal_container_layout_manager.h
@@ -11,8 +11,11 @@ #include "ash/ash_export.h" #include "ash/public/cpp/keyboard/keyboard_controller_observer.h" +#include "ash/shelf/shelf.h" +#include "ash/shelf/shelf_observer.h" #include "ash/wm/wm_default_layout_manager.h" #include "base/macros.h" +#include "base/scoped_observer.h" #include "ui/aura/window_observer.h" namespace gfx { @@ -27,6 +30,7 @@ // when the container size changes. class ASH_EXPORT SystemModalContainerLayoutManager : public WmDefaultLayoutManager, + public ShelfObserver, public aura::WindowObserver, public KeyboardControllerObserver { public: @@ -70,6 +74,9 @@ // Is the |window| modal background? static bool IsModalBackground(aura::Window* window); + // ShelfObserver: + void WillChangeVisibilityState(ShelfVisibilityState new_state) override; + private: void AddModalWindow(aura::Window* window); @@ -112,6 +119,9 @@ // added to this based on IsBoundsCentered(). std::set<const aura::Window*> windows_to_center_; + // A shelf observer to update position of modals when work area is updated. + ScopedObserver<Shelf, ShelfObserver> shelf_observer_{this}; + DISALLOW_COPY_AND_ASSIGN(SystemModalContainerLayoutManager); };
diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc index 9c9b7cc..f4277b5 100644 --- a/ash/wm/system_modal_container_layout_manager_unittest.cc +++ b/ash/wm/system_modal_container_layout_manager_unittest.cc
@@ -11,6 +11,7 @@ #include "ash/keyboard/ui/keyboard_ui_controller.h" #include "ash/keyboard/ui/test/keyboard_test_util.h" #include "ash/public/cpp/keyboard/keyboard_switches.h" +#include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" #include "ash/shell.h" @@ -21,6 +22,7 @@ #include "base/command_line.h" #include "base/compiler_specific.h" #include "base/run_loop.h" +#include "components/session_manager/session_manager_types.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" @@ -568,13 +570,14 @@ GetModalContainer()->SetBounds(gfx::Rect(0, 0, 1024, 768)); std::unique_ptr<aura::Window> main( ShowTestWindowWithParent(GetModalContainer(), true)); - main->SetBounds(gfx::Rect(924, 668, 100, 100)); + const int shelf_height = ShelfConfig::Get()->shelf_size(); + main->SetBounds(gfx::Rect(924, 668 - shelf_height, 100, 100)); // We set now the bounds of the root window to something new which will // Then trigger the repos operation. GetModalContainer()->SetBounds(gfx::Rect(0, 0, 800, 600)); gfx::Rect bounds = main->bounds(); - EXPECT_EQ(bounds, gfx::Rect(700, 500, 100, 100)); + EXPECT_EQ(bounds, gfx::Rect(700, 500 - shelf_height, 100, 100)); } // Verifies that centered windows will remain centered after the visible screen @@ -588,11 +591,45 @@ // We set now the bounds of the root window to something new which will // Then trigger the reposition operation. - GetModalContainer()->SetBounds(gfx::Rect(0, 0, 1024, 768)); + GetModalContainer()->SetBounds(gfx::Rect(0, 0, 600, 400)); // The window should still be centered. gfx::Rect bounds = main->bounds(); - EXPECT_EQ(bounds.ToString(), gfx::Rect(256, 256, 512, 256).ToString()); + EXPECT_EQ(bounds.ToString(), + gfx::Rect((600 - 512) / 2, (400 - 256) / 2, 512, 256).ToString()); +} + +// Verifies that centered windows will remain centered in the secondary screen +// with correct global position in screen coordinate system and local position +// relative to root window. +TEST_F(SystemModalContainerLayoutManagerTest, KeepCenteredSecondaryScreen) { + UpdateDisplay("800x600,800+0-800x600"); + + // Create a lock modal window in a lock state. + GetSessionControllerClient()->SetSessionState( + session_manager::SessionState::OOBE); + aura::Window::Windows root_windows = Shell::GetAllRootWindows(); + aura::Window* secondary_display_modal_container = Shell::GetContainer( + root_windows[1], kShellWindowId_LockSystemModalContainer); + secondary_display_modal_container->SetBounds(gfx::Rect(0, 0, 800, 600)); + std::unique_ptr<aura::Window> modal( + ShowTestWindowWithParent(secondary_display_modal_container, true)); + + // Center the window. + modal->SetBounds(gfx::Rect((800 - 512) / 2, (600 - 256) / 2, 512, 256)); + + // We set now the bounds of the root window to something new which will + // Then trigger the reposition operation. + secondary_display_modal_container->SetBounds(gfx::Rect(0, 0, 600, 400)); + + // The window should still be centered with global and local coordinates. + gfx::Rect modal_bounds_in_screen = modal->GetBoundsInScreen(); + EXPECT_EQ( + modal_bounds_in_screen.ToString(), + gfx::Rect(800 + (600 - 512) / 2, (400 - 256) / 2, 512, 256).ToString()); + gfx::Rect modal_bounds_in_root = modal->bounds(); + EXPECT_EQ(modal_bounds_in_root.ToString(), + gfx::Rect((600 - 512) / 2, (400 - 256) / 2, 512, 256).ToString()); } TEST_F(SystemModalContainerLayoutManagerTest, ShowNormalBackgroundOrLocked) {
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index 6c24e248..fc26e93 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn
@@ -29,7 +29,7 @@ } android_lint("android_lint_test") { - lint_expected_warnings = "InlinedApi,NewApi" + lint_expected_warnings = "DefaultLocale,NewApi" _test_apk_target = ":lint_test_apk" deps = [ "${_test_apk_target}__java" ] build_config_dep = "$_test_apk_target$build_config_target_suffix"
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py index 091b33d..5c08c5a 100755 --- a/build/android/gyp/lint.py +++ b/build/android/gyp/lint.py
@@ -28,6 +28,8 @@ _DISABLED_ALWAYS = [ "AppCompatResource", # Lint does not correctly detect our appcompat lib. "Assert", # R8 --force-enable-assertions is used to enable java asserts. + "InflateParams", # Null is ok when inflating views for dialogs. + "InlinedApi", # Constants are copied so they are always available. "LintBaseline", # Don't warn about using baseline.xml files. "MissingApplicationIcon", # False positive for non-production targets. "SwitchIntDef", # Many C++ enums are not used at all in java.
diff --git a/build/android/java/test/LintTest.java b/build/android/java/test/LintTest.java index 898785f..ddb5c522 100644 --- a/build/android/java/test/LintTest.java +++ b/build/android/java/test/LintTest.java
@@ -5,12 +5,16 @@ package test; import android.app.Application; -import android.content.Context; +/** + * A class with methods that are meant to trigger lint warnings. If it does not trigger these + * expected warnings, then the build will fail. This prevents lint regressions where lint warnings + * are accidentally disabled. + */ public class LintTest extends Application { - public static String testTriggerInlinedApiCheck() { - // This was added in API level 30. - return Context.CONNECTIVITY_DIAGNOSTICS_SERVICE; + public String testTriggerDefaultLocaleCheck(int any) { + // String format with an integer requires a Locale since it may be formatted differently. + return String.format("Test %d", any); } public String testTriggerNewApiCheck() {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index ee59d30ad..f06d3ca 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20201019.1.1 +0.20201019.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index ee59d30ad..f06d3ca 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20201019.1.1 +0.20201019.2.1
diff --git a/cc/base/features.cc b/cc/base/features.cc index b1823b2..0e83148 100644 --- a/cc/base/features.cc +++ b/cc/base/features.cc
@@ -58,4 +58,6 @@ const base::Feature kSchedulerSmoothnessForAnimatedScrolls{ "SmoothnessModeForAnimatedScrolls", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kWheelEventRegions{"WheelEventRegions", + base::FEATURE_DISABLED_BY_DEFAULT}; } // namespace features
diff --git a/cc/base/features.h b/cc/base/features.h index 85b2e1b..6c1e4db 100644 --- a/cc/base/features.h +++ b/cc/base/features.h
@@ -36,6 +36,12 @@ CC_BASE_EXPORT extern const base::Feature kSchedulerSmoothnessForAnimatedScrolls; +// When enabled, cc's layers support region-based wheel event hit-testing rather +// than only supporting flagging all layers, or no layers, as having blocking +// wheel event listeners. +// https://docs.google.com/document/d/1ar4WhVnLA-fmw6atgP-23iq-ys_NfFoGb3LA5AgaylA/edit?usp=sharing +CC_BASE_EXPORT extern const base::Feature kWheelEventRegions; + } // namespace features #endif // CC_BASE_FEATURES_H_
diff --git a/cc/benchmarks/rasterize_and_record_benchmark_impl.cc b/cc/benchmarks/rasterize_and_record_benchmark_impl.cc index 5532530..bb9ffac 100644 --- a/cc/benchmarks/rasterize_and_record_benchmark_impl.cc +++ b/cc/benchmarks/rasterize_and_record_benchmark_impl.cc
@@ -18,7 +18,6 @@ #include "cc/raster/raster_buffer_provider.h" #include "cc/trees/layer_tree_host_impl.h" #include "cc/trees/layer_tree_impl.h" -#include "skia/ext/legacy_display_globals.h" #include "ui/gfx/geometry/axis_transform2d.h" #include "ui/gfx/geometry/rect.h" @@ -57,7 +56,7 @@ SkBitmap bitmap; bitmap.allocPixels(SkImageInfo::MakeN32Premul(content_rect.width(), content_rect.height())); - SkCanvas canvas(bitmap, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(bitmap); // Pass an empty settings to make sure that the decode cache is used to // replace all images.
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc index 3e5cc2b7..5bf6cd8e 100644 --- a/cc/layers/heads_up_display_layer_impl.cc +++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -47,7 +47,6 @@ #include "gpu/command_buffer/common/shared_image_trace_utils.h" #include "gpu/command_buffer/common/shared_image_usage.h" #include "gpu/config/gpu_feature_info.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" #include "third_party/skia/include/core/SkFont.h" @@ -369,9 +368,7 @@ context_provider->GrContext(), pool_resource.color_space().ToSkColorSpace(), mailbox_texture_id, backing->texture_target, pool_resource.size(), - pool_resource.format(), - skia::LegacyDisplayGlobals::ComputeSurfaceProps( - false /* can_use_lcd_text */), + pool_resource.format(), false /* can_use_lcd_text */, 0 /* msaa_sample_count */); SkSurface* surface = scoped_surface.surface(); if (!surface) { @@ -398,9 +395,8 @@ if (!staging_surface_ || gfx::SkISizeToSize(staging_surface_->getCanvas()->getBaseLayerSize()) != pool_resource.size()) { - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); staging_surface_ = SkSurface::MakeRasterN32Premul( - pool_resource.size().width(), pool_resource.size().height(), &props); + pool_resource.size().width(), pool_resource.size().height()); } SkiaPaintCanvas canvas(staging_surface_->getCanvas()); @@ -439,9 +435,8 @@ pool_resource.size().width(), pool_resource.size().height()); auto* backing = static_cast<HudSoftwareBacking*>(pool_resource.software_backing()); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); sk_sp<SkSurface> surface = SkSurface::MakeRasterDirect( - info, backing->shared_mapping.memory(), info.minRowBytes(), &props); + info, backing->shared_mapping.memory(), info.minRowBytes()); SkiaPaintCanvas canvas(surface->getCanvas()); DrawHudContents(&canvas);
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index 5f3fefa8..9a5fbb5 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc
@@ -17,6 +17,7 @@ #include "base/single_thread_task_runner.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" +#include "cc/base/features.h" #include "cc/base/simple_enclosed_region.h" #include "cc/layers/layer_impl.h" #include "cc/layers/picture_layer.h" @@ -51,6 +52,7 @@ SkColor background_color; Region non_fast_scrollable_region; TouchActionRegion touch_action_region; + Region wheel_event_region; ElementId element_id; } inputs; void* layer_tree_inputs; @@ -1073,6 +1075,15 @@ SetNeedsCommit(); } +void Layer::SetWheelEventRegion(Region wheel_event_region) { + DCHECK(IsPropertyChangeAllowed()); + if (inputs_.wheel_event_region == wheel_event_region) + return; + + inputs_.wheel_event_region = std::move(wheel_event_region); + SetNeedsCommit(); +} + void Layer::SetCacheRenderSurface(bool cache) { DCHECK(IsPropertyChangeAllowed()); if (cache_render_surface_ == cache) @@ -1310,16 +1321,20 @@ layer->set_may_contain_video(may_contain_video_); layer->SetNonFastScrollableRegion(inputs_.non_fast_scrollable_region); layer->SetTouchActionRegion(inputs_.touch_action_region); - // TODO(sunxd): Pass the correct region for wheel event handlers, see - // https://crbug.com/841364. - EventListenerProperties mouse_wheel_props = - layer_tree_host()->event_listener_properties( - EventListenerClass::kMouseWheel); - if (mouse_wheel_props == EventListenerProperties::kBlocking || - mouse_wheel_props == EventListenerProperties::kBlockingAndPassive) { - layer->SetWheelEventHandlerRegion(Region(gfx::Rect(bounds()))); + if (!base::FeatureList::IsEnabled(::features::kWheelEventRegions)) { + // TODO(sunxd): Pass the correct region for wheel event handlers, see + // https://crbug.com/841364. + EventListenerProperties mouse_wheel_props = + layer_tree_host()->event_listener_properties( + EventListenerClass::kMouseWheel); + if (mouse_wheel_props == EventListenerProperties::kBlocking || + mouse_wheel_props == EventListenerProperties::kBlockingAndPassive) { + layer->SetWheelEventHandlerRegion(Region(gfx::Rect(bounds()))); + } else { + layer->SetWheelEventHandlerRegion(Region()); + } } else { - layer->SetWheelEventHandlerRegion(Region()); + layer->SetWheelEventHandlerRegion(inputs_.wheel_event_region); } layer->SetContentsOpaque(inputs_.contents_opaque); layer->SetContentsOpaqueForText(inputs_.contents_opaque_for_text);
diff --git a/cc/layers/layer.h b/cc/layers/layer.h index cc2369b..69915971 100644 --- a/cc/layers/layer.h +++ b/cc/layers/layer.h
@@ -451,6 +451,16 @@ return inputs_.touch_action_region; } + // Set or get the set of blocking wheel rects of this layer. The + // |wheel_event_region| is the set of rects for which there is a non-passive + // wheel event listener that paints into this layer. Mouse wheel messages + // that intersect these rects must execute their relevant JS handler before we + // can start scrolling. + void SetWheelEventRegion(Region wheel_event_region); + const Region& wheel_event_region() const { + return inputs_.wheel_event_region; + } + // For layer tree mode only. // In layer list mode, use ScrollTree::SetScrollCallbacks() instead. // Sets a RepeatingCallback that is run during a main frame, before layers are @@ -834,6 +844,7 @@ Region non_fast_scrollable_region; TouchActionRegion touch_action_region; + Region wheel_event_region; ElementId element_id; };
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 8d4f81d..76c989c8 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -35,6 +35,7 @@ #include "gpu/skia_bindings/grcontext_for_gles2_interface.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/khronos/GLES2/gl2ext.h" +#include "third_party/skia/include/core/SkFontLCDConfig.h" #include "third_party/skia/include/core/SkGraphics.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" @@ -47,6 +48,18 @@ namespace cc { namespace { +class ScopedEnableLCDText { + public: + ScopedEnableLCDText() { + order_ = SkFontLCDConfig::GetSubpixelOrder(); + SkFontLCDConfig::SetSubpixelOrder(SkFontLCDConfig::kRGB_LCDOrder); + } + ~ScopedEnableLCDText() { SkFontLCDConfig::SetSubpixelOrder(order_); } + + private: + SkFontLCDConfig::LCDOrder order_; +}; + scoped_refptr<DisplayItemList> MakeNoopDisplayItemList() { auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); @@ -322,7 +335,8 @@ uint32_t flags = 0; SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); if (options.use_lcd_text) { - surface_props = SkSurfaceProps(flags, kRGB_H_SkPixelGeometry); + surface_props = + SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); } SkImageInfo image_info = SkImageInfo::MakeN32Premul( options.resource_size.width(), options.resource_size.height(), @@ -505,7 +519,7 @@ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -544,7 +558,7 @@ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -581,7 +595,7 @@ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -621,7 +635,7 @@ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -713,7 +727,7 @@ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -758,7 +772,7 @@ color_space), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -803,7 +817,7 @@ color_space), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -844,7 +858,7 @@ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -906,7 +920,7 @@ SkBitmap expected_bitmap; expected_bitmap.allocPixels(backing_info); - SkCanvas canvas(expected_bitmap, SkSurfaceProps{}); + SkCanvas canvas(expected_bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN); @@ -1000,7 +1014,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); SkPaint green; green.setColor(options.background_color); @@ -1051,7 +1065,7 @@ SkBitmap::kZeroPixels_AllocFlag); // Expect a one pixel border on the bottom/right edge. - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); SkPaint green; green.setColor(options.background_color); @@ -1096,7 +1110,7 @@ SkBitmap::kZeroPixels_AllocFlag); // Expect no clearing here because the playback rect is internal. - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); ExpectEquals(oop_result, bitmap, "oop"); @@ -1142,7 +1156,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); SkPaint green; green.setColor(options.background_color); @@ -1199,7 +1213,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); SkPaint green; green.setColor(options.background_color); @@ -1255,7 +1269,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); SkPaint green; green.setColor(options.background_color); @@ -1313,7 +1327,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); SkPaint green; green.setColor(options.background_color); @@ -1363,7 +1377,7 @@ // Expect no clears here, as this tile does not intersect the edge of the // tile. - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); ExpectEquals(oop_result, bitmap, "oop"); @@ -1399,7 +1413,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorTRANSPARENT); ExpectEquals(oop_result, bitmap, "oop"); @@ -1439,7 +1453,7 @@ options.resource_size.height()), SkBitmap::kZeroPixels_AllocFlag); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorTRANSPARENT); ExpectEquals(oop_result, bitmap, "oop"); @@ -1476,7 +1490,7 @@ // Result should be a red background with a cleared hole where the // playback_rect is. - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(options.preclear_color); canvas.translate(-arbitrary_offset.x(), -arbitrary_offset.y()); canvas.clipRect(gfx::RectToSkRect(options.playback_rect)); @@ -1695,6 +1709,8 @@ public: bool UseLcdText() const { return GetParam(); } void RunTest() { + ScopedEnableLCDText enable_lcd; + RasterOptions options; options.resource_size = gfx::Size(100, 100); options.content_size = options.resource_size; @@ -1737,6 +1753,8 @@ public: bool UseLcdText() const { return GetParam(); } void RunTest(const SkMatrix& mat) { + ScopedEnableLCDText enable_lcd; + RasterOptions options; options.resource_size = gfx::Size(100, 100); options.content_size = options.resource_size; @@ -1988,7 +2006,7 @@ SkBitmap expected_bitmap; expected_bitmap.allocPixels(dest_info); - SkCanvas canvas(expected_bitmap, SkSurfaceProps{}); + SkCanvas canvas(expected_bitmap); canvas.drawColor(SK_ColorMAGENTA); SkPaint green; green.setColor(SK_ColorGREEN);
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc index a19c4cf..a2f63ed 100644 --- a/cc/paint/paint_op_buffer.cc +++ b/cc/paint/paint_op_buffer.cc
@@ -2760,7 +2760,7 @@ !has_effects_preventing_lcd_text_for_save_layer_alpha_; if (save_layer_alpha_should_preserve_lcd_text) { // Check if the canvas supports LCD text. - SkSurfaceProps props; + SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); canvas->getProps(&props); if (props.pixelGeometry() == kUnknown_SkPixelGeometry) save_layer_alpha_should_preserve_lcd_text = false;
diff --git a/cc/paint/paint_op_buffer_serializer.cc b/cc/paint/paint_op_buffer_serializer.cc index 709b432..d17aa68 100644 --- a/cc/paint/paint_op_buffer_serializer.cc +++ b/cc/paint/paint_op_buffer_serializer.cc
@@ -13,7 +13,6 @@ #include "base/trace_event/trace_event.h" #include "cc/paint/clear_for_opaque_raster.h" #include "cc/paint/scoped_raster_flags.h" -#include "skia/ext/legacy_display_globals.h" #include "ui/gfx/skia_util.h" namespace cc { @@ -32,6 +31,19 @@ PaintOp::SerializeOptions* options_; }; +// Copied from viz::ClientResourceProvider. +SkSurfaceProps ComputeSurfaceProps(bool can_use_lcd_text) { + uint32_t flags = 0; + // Use unknown pixel geometry to disable LCD text. + SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); + if (can_use_lcd_text) { + // LegacyFontHost will get LCD text and skia figures out what type to use. + surface_props = + SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); + } + return surface_props; +} + PlaybackParams MakeParams(const SkCanvas* canvas) { // We don't use an ImageProvider here since the ops are played onto a no-draw // canvas for state tracking and don't need decoded images. @@ -69,8 +81,7 @@ ? std::make_unique<SkTextBlobCacheDiffCanvas>( kMaxExtent, kMaxExtent, - skia::LegacyDisplayGlobals::ComputeSurfaceProps( - can_use_lcd_text), + ComputeSurfaceProps(can_use_lcd_text), strike_server, std::move(color_space), context_supports_distance_field_text)
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc index a9674da9..3e40ebe 100644 --- a/cc/paint/skia_paint_canvas.cc +++ b/cc/paint/skia_paint_canvas.cc
@@ -8,7 +8,6 @@ #include "cc/paint/display_item_list.h" #include "cc/paint/paint_recorder.h" #include "cc/paint/scoped_raster_flags.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkAnnotation.h" #include "third_party/skia/include/docs/SkPDFDocument.h" @@ -25,8 +24,7 @@ SkiaPaintCanvas::SkiaPaintCanvas(const SkBitmap& bitmap, ImageProvider* image_provider) - : canvas_(new SkCanvas(bitmap, - skia::LegacyDisplayGlobals::GetSkSurfaceProps())), + : canvas_(new SkCanvas(bitmap)), bitmap_(bitmap), owned_(canvas_), image_provider_(image_provider) {}
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc index 3d106918..5d33a52 100644 --- a/cc/raster/gpu_raster_buffer_provider.cc +++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -34,7 +34,6 @@ #include "gpu/command_buffer/client/shared_image_interface.h" #include "gpu/command_buffer/common/shared_image_trace_utils.h" #include "gpu/command_buffer/common/shared_image_usage.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/GrDirectContext.h" @@ -80,7 +79,8 @@ intermediate_size.height(), std::move(color_space)); SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::ComputeSurfaceProps(can_use_lcd_text); + viz::ClientResourceProvider::ScopedSkSurface::ComputeSurfaceProps( + can_use_lcd_text); surface_ = SkSurface::MakeRenderTarget( context_provider->GrContext(), SkBudgeted::kNo, n32Info, msaa_sample_count, kTopLeft_GrSurfaceOrigin, &surface_props); @@ -218,9 +218,7 @@ if (!unpremultiply_and_dither) { scoped_surface.emplace(context_provider->GrContext(), sk_color_space, texture_id, texture_target, resource_size, - resource_format, - skia::LegacyDisplayGlobals::ComputeSurfaceProps( - playback_settings.use_lcd_text), + resource_format, playback_settings.use_lcd_text, playback_settings.msaa_sample_count); surface = scoped_surface->surface(); } else {
diff --git a/cc/raster/raster_buffer_provider.cc b/cc/raster/raster_buffer_provider.cc index 49b0f268..7d777a9 100644 --- a/cc/raster/raster_buffer_provider.cc +++ b/cc/raster/raster_buffer_provider.cc
@@ -10,7 +10,6 @@ #include "cc/raster/raster_source.h" #include "components/viz/common/resources/platform_color.h" #include "components/viz/common/resources/resource_format_utils.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkMath.h" #include "third_party/skia/include/core/SkSurface.h" @@ -84,7 +83,8 @@ // Use unknown pixel geometry to disable LCD text. SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry); if (playback_settings.use_lcd_text) { - surface_props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + // LegacyFontHost will get LCD text and skia figures out what type to use. + surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType); } if (!stride) @@ -121,8 +121,7 @@ "RasterBufferProvider::PlaybackToMemory::ConvertRGBA4444"); SkImageInfo dst_info = info.makeColorType( ResourceFormatToClosestSkColorType(gpu_compositing, format)); - auto dst_canvas = - SkCanvas::MakeRasterDirect(dst_info, memory, stride, &surface_props); + auto dst_canvas = SkCanvas::MakeRasterDirect(dst_info, memory, stride); DCHECK(dst_canvas); SkPaint paint; paint.setDither(true);
diff --git a/cc/raster/raster_source_unittest.cc b/cc/raster/raster_source_unittest.cc index 2fa3f7b7..df164e4bf 100644 --- a/cc/raster/raster_source_unittest.cc +++ b/cc/raster/raster_source_unittest.cc
@@ -300,7 +300,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); raster->PlaybackToCanvas( @@ -361,7 +361,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); raster->PlaybackToCanvas( @@ -408,7 +408,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); // Playback the full rect which should make everything white. @@ -482,7 +482,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); // Playback the full rect which should make everything white. @@ -576,7 +576,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(content_bounds.width(), content_bounds.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); // Playback the full rect which should make everything light gray (alpha=10). @@ -645,7 +645,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(canvas_rect.width(), canvas_rect.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); raster->PlaybackToCanvas( &canvas, content_bounds, canvas_rect, canvas_rect,
diff --git a/cc/test/skia_common.cc b/cc/test/skia_common.cc index 37dfa06..50a7728 100644 --- a/cc/test/skia_common.cc +++ b/cc/test/skia_common.cc
@@ -59,7 +59,7 @@ SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); SkBitmap bitmap; bitmap.installPixels(info, buffer, info.minRowBytes()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clipRect(gfx::RectToSkRect(layer_rect)); list->Raster(&canvas); }
diff --git a/cc/trees/debug_rect_history.cc b/cc/trees/debug_rect_history.cc index f9aae39..f2455eb 100644 --- a/cc/trees/debug_rect_history.cc +++ b/cc/trees/debug_rect_history.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include "base/memory/ptr_util.h" +#include "cc/base/features.h" #include "cc/base/math_util.h" #include "cc/layers/heads_up_display_layer_impl.h" #include "cc/layers/layer_impl.h" @@ -161,24 +162,39 @@ } void DebugRectHistory::SaveWheelEventHandlerRects(LayerTreeImpl* tree_impl) { - EventListenerProperties event_properties = - tree_impl->event_listener_properties(EventListenerClass::kMouseWheel); - if (event_properties == EventListenerProperties::kNone || - event_properties == EventListenerProperties::kPassive) { - return; - } + // TODO(https://crbug.com/1136591): Need behavior confirmation. + // TODO(https://crbug.com/1136591): Need to check results in dev tools layer + // view. + if (base::FeatureList::IsEnabled(::features::kWheelEventRegions)) { + for (auto* layer : *tree_impl) { + const Region& region = layer->wheel_event_handler_region(); + for (gfx::Rect rect : region) { + debug_rects_.emplace_back( + DebugRect(WHEEL_EVENT_HANDLER_RECT_TYPE, + MathUtil::MapEnclosingClippedRect( + layer->ScreenSpaceTransform(), rect))); + } + } + } else { + EventListenerProperties event_properties = + tree_impl->event_listener_properties(EventListenerClass::kMouseWheel); + if (event_properties == EventListenerProperties::kNone || + event_properties == EventListenerProperties::kPassive) { + return; + } - // Since the wheel event handlers property is on the entire layer tree just - // mark inner viewport if have listeners. - ScrollNode* inner_scroll = tree_impl->InnerViewportScrollNode(); - if (!inner_scroll) - return; - debug_rects_.push_back( - DebugRect(WHEEL_EVENT_HANDLER_RECT_TYPE, - MathUtil::MapEnclosingClippedRect( - tree_impl->property_trees()->transform_tree.ToScreen( - inner_scroll->transform_id), - gfx::Rect(inner_scroll->bounds)))); + // Since the wheel event handlers property is on the entire layer tree just + // mark inner viewport if have listeners. + ScrollNode* inner_scroll = tree_impl->InnerViewportScrollNode(); + if (!inner_scroll) + return; + debug_rects_.emplace_back( + DebugRect(WHEEL_EVENT_HANDLER_RECT_TYPE, + MathUtil::MapEnclosingClippedRect( + tree_impl->property_trees()->transform_tree.ToScreen( + inner_scroll->transform_id), + gfx::Rect(inner_scroll->bounds)))); + } } void DebugRectHistory::SaveScrollEventHandlerRects(LayerTreeImpl* tree_impl) {
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index d46daaa1..5ee6866 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -33,6 +33,7 @@ #include "base/trace_event/traced_value.h" #include "build/build_config.h" #include "cc/base/devtools_instrumentation.h" +#include "cc/base/features.h" #include "cc/base/histograms.h" #include "cc/base/math_util.h" #include "cc/debug/rendering_stats_instrumentation.h" @@ -1208,25 +1209,28 @@ if (event_listener_properties_[index] == properties) return; - // If the mouse wheel event listener is blocking, then every layer in the - // layer tree sets a wheel event handler region to be its entire bounds, - // otherwise it sets it to empty. - // - // Thus when it changes, we want to request every layer to push properties - // and recompute its wheel event handler region, since the computation is - // done in PushPropertiesTo. - if (event_class == EventListenerClass::kMouseWheel) { - bool new_property_is_blocking = - properties == EventListenerProperties::kBlocking || - properties == EventListenerProperties::kBlockingAndPassive; - EventListenerProperties old_properties = event_listener_properties_[index]; - bool old_property_is_blocking = - old_properties == EventListenerProperties::kBlocking || - old_properties == EventListenerProperties::kBlockingAndPassive; + if (!base::FeatureList::IsEnabled(::features::kWheelEventRegions)) { + // If the mouse wheel event listener is blocking, then every layer in the + // layer tree sets a wheel event handler region to be its entire bounds, + // otherwise it sets it to empty. + // + // Thus when it changes, we want to request every layer to push properties + // and recompute its wheel event handler region, since the computation is + // done in PushPropertiesTo. + if (event_class == EventListenerClass::kMouseWheel) { + bool new_property_is_blocking = + properties == EventListenerProperties::kBlocking || + properties == EventListenerProperties::kBlockingAndPassive; + EventListenerProperties old_properties = + event_listener_properties_[index]; + bool old_property_is_blocking = + old_properties == EventListenerProperties::kBlocking || + old_properties == EventListenerProperties::kBlockingAndPassive; - if (old_property_is_blocking != new_property_is_blocking) { - for (auto* layer : *this) - layer->SetNeedsPushProperties(); + if (old_property_is_blocking != new_property_is_blocking) { + for (auto* layer : *this) + layer->SetNeedsPushProperties(); + } } }
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 49e9d29..d74f07b 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2183,6 +2183,7 @@ if (std::unique_ptr<viz::DelegatedInkMetadata> delegated_ink_metadata = active_tree_->take_delegated_ink_metadata()) { + delegated_ink_metadata->set_frame_time(CurrentBeginFrameArgs().frame_time); TRACE_EVENT_INSTANT1( "cc", "Delegated Ink Metadata set on compositor frame metadata", TRACE_EVENT_SCOPE_THREAD, "ink metadata",
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc index 496bdbf6..9100d9e 100644 --- a/cc/trees/layer_tree_host_pixeltest_blending.cc +++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -202,7 +202,7 @@ SkBitmap expected; expected.allocN32Pixels(width, height); - SkCanvas canvas(expected, SkSurfaceProps{}); + SkCanvas canvas(expected); canvas.clear(SK_ColorWHITE); canvas.drawImage(surface->makeImageSnapshot(), 0, 0); @@ -306,7 +306,7 @@ SkBitmap expected; expected.allocN32Pixels(kRootWidth, kRootHeight); - SkCanvas canvas(expected, SkSurfaceProps{}); + SkCanvas canvas(expected); canvas.drawColor(kCSSOrange); SkPaint paint; paint.setBlendMode(current_blend_mode()); @@ -337,7 +337,7 @@ SkBitmap expected; expected.allocN32Pixels(kRootWidth, kRootHeight); - SkCanvas canvas(expected, SkSurfaceProps{}); + SkCanvas canvas(expected); SkiaPaintCanvas paint_canvas(&canvas); PaintFlags grayscale; grayscale.setColor(kCSSOrange); @@ -379,7 +379,7 @@ SkBitmap expected; expected.allocN32Pixels(kRootWidth, kRootHeight); - SkCanvas canvas(expected, SkSurfaceProps{}); + SkCanvas canvas(expected); canvas.drawColor(kCSSOrange); SkPaint paint; paint.setBlendMode(current_blend_mode());
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc index 8b8fc54ec..3687e59c 100644 --- a/cc/trees/layer_tree_host_pixeltest_filters.cc +++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -175,11 +175,11 @@ float percentage_pixels_large_error = 1.09f; // 436px / (200*200) float percentage_pixels_small_error = 0.0f; float average_error_allowed_in_bad_pixels = 1.f; - int large_error_allowed = 1; + int large_error_allowed = 2; int small_error_allowed = 0; - // Windows using Dawn D3D12 has 2982 pixels off by 1. + // Windows using Dawn D3D12 has 4044 pixels off by max of 2. if (use_d3d12()) - percentage_pixels_large_error = 1.864f; // 2982px / (400*400) + percentage_pixels_large_error = 2.5275f; // 4044px / (400*400) pixel_comparator_.reset(new FuzzyPixelComparator( true, // discard_alpha percentage_pixels_large_error, percentage_pixels_small_error,
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index d3c1431..b105f86 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -8904,6 +8904,7 @@ void DrawLayersOnThread(LayerTreeHostImpl* impl) override { if (expected_metadata_.has_value()) { + EXPECT_EQ(metadata_frame_time_, impl->CurrentBeginFrameArgs().frame_time); // Now try again with no metadata to confirm everything is cleared out. expected_metadata_.reset(); } @@ -8920,6 +8921,11 @@ EXPECT_EQ(expected_metadata_->presentation_area(), actual_metadata->presentation_area()); EXPECT_EQ(expected_metadata_->timestamp(), actual_metadata->timestamp()); + + // Record the frame time from the metadata so we can confirm that it + // matches the LayerTreeHostImpl's frame time in DrawLayersOnThread. + EXPECT_GT(actual_metadata->frame_time(), base::TimeTicks::Min()); + metadata_frame_time_ = actual_metadata->frame_time(); } else { EXPECT_FALSE(had_delegated_ink_metadata); EXPECT_FALSE(actual_metadata); @@ -8942,6 +8948,7 @@ FakeContentLayerClient client_; scoped_refptr<Layer> layer_; bool set_needs_display_ = true; + base::TimeTicks metadata_frame_time_; }; SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDelegatedInkMetadataOnAndOff);
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index cf0d5f51..3126777 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -297,7 +297,6 @@ "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerHost.java", "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutProvider.java", "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutRenderHost.java", - "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutStateProvider.java", "java/src/org/chromium/chrome/browser/compositor/layouts/LayoutUpdateHost.java", "java/src/org/chromium/chrome/browser/compositor/layouts/OverviewModeBehavior.java", "java/src/org/chromium/chrome/browser/compositor/layouts/OverviewModeController.java",
diff --git a/chrome/android/expectations/lint-suppressions.xml b/chrome/android/expectations/lint-suppressions.xml index 19034df..d7d4b62ec 100644 --- a/chrome/android/expectations/lint-suppressions.xml +++ b/chrome/android/expectations/lint-suppressions.xml
@@ -16,37 +16,10 @@ <issue id="AcceptsUserCertificates"> <!-- See https://crbug.com/827265 and comment in the file for context. --> <ignore regexp="chrome/android/java/res_base/xml/network_security_config.xml"/> - <ignore regexp="android_webview/tools/system_webview_shell/apk/res/xml/network_security_config.xml"/> </issue> - <issue id="CustomViewStyleable"> - <!-- TODO(crbug.com/1077861): Old code, good to fix. --> - <ignore regexp="components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java"/> - </issue> - <issue id="DefaultLocale"> - <ignore regexp="clank"/> - <ignore regexp="com/android/tv"/> - <!-- TODO(crbug.com/1081240): Fix --> - <ignore regexp="chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java"/> - <!-- TODO(crbug.com/1082222): Fix --> - <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java"/> - </issue> - <issue id="DrawAllocation"> - <ignore regexp="content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java"/> - <ignore regexp="content/public/android/java/src/org/chromium/content/browser/PopupZoomer.java"/> - </issue> - <!-- TODO(crbug.com/804432): Remove this and fix the offending xml files. --> - <issue id="EllipsizeMaxLines" severity="ignore"/> <issue id="ExifInterface"> - <!-- TODO(crbug.com/804438): Cannot update until android.media.ExifInterface supports file descriptors --> - <ignore regexp="components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/BitmapUtils.java"/> - </issue> - <issue id="ExportedContentProvider" severity="ignore"/> - <issue id="ExportedService" severity="ignore"/> - <issue id="HandlerLeak"> - <ignore regexp="android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java"/> - </issue> - <issue id="IconColors"> - <ignore regexp="tools/android/audio_focus_grabber/java/res/drawable-.*/notification_icon.png"/> + <!-- TODO(crbug.com/804438): Update to androidx ExifInterface. --> + <ignore regexp="components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/BitmapUtils.java"/> </issue> <issue id="IconDensities"> <!-- This is intentional to reduce APK size. See: http://crrev/c/1352161 --> @@ -69,10 +42,6 @@ <!-- Filed https://crbug.com/1073963 --> <ignore regexp="clank/java/res_default/mipmap-.*/app_shortcut_icon.png"/> </issue> - <issue id="IconLauncherFormat" severity="ignore"/> - <issue id="IconLauncherShape"> - <ignore regexp="chrome/android/webapk/shell_apk/res/mipmap-mdpi/ic_launcher_background.png"/> - </issue> <issue id="IconLocation"> <!-- It is OK for content_shell_apk to have missing assets. --> <ignore regexp="content/shell/android/java/res/"/> @@ -99,22 +68,16 @@ <issue id="InsecureBaseConfiguration"> <!-- See https://crbug.com/827265 and comment in the file for context. --> <ignore regexp="chrome/android/java/res_base/xml/network_security_config.xml"/> - <ignore regexp="android_webview/tools/system_webview_shell/apk/res/xml/network_security_config.xml"/> </issue> - <issue id="Instantiatable" severity="ignore"/> <issue id="InconsistentArrays"> <ignore regexp="android_webview/locale_paks.resources.zip/values/locale-paks.xml"/> <ignore regexp="chrome/android/chrome_locale_paks.resources.zip/values/locale-paks.xml"/> <ignore regexp="preloaded_fonts.xml"/> </issue> - <issue id="InconsistentLayout" severity="ignore"/> <issue id="InefficientWeight"> <ignore regexp="android_webview/tools/system_webview_shell/apk/res/layout/activity_webview_browser.xml"/> </issue> - <issue id="InflateParams" severity="ignore"/> - <issue id="InlinedApi" severity="ignore"/> <issue id="InvalidVectorPath" severity="ignore"/> - <issue id="JobSchedulerService" severity="ignore"/> <issue id="LabelFor"> <ignore regexp="android_webview/tools/system_webview_shell/apk/res/layout/activity_webview_browser.xml"/> </issue>
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected index ec0a8cc..943e8522 100644 --- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -844,14 +844,16 @@ android:exported="true" android:grantUriPermissions="true" android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider" - android:process=":webview_apk"> + android:process=":webview_apk" + tools:ignore="ExportedContentProvider"> </provider> # DIFF-ANCHOR: a5e78e63 <provider # DIFF-ANCHOR: bfe37944 android:authorities="$PACKAGE.DeveloperModeContentProvider" android:exported="true" android:name="org.chromium.android_webview.services.DeveloperModeContentProvider" android:process=":webview_service" - android:visibleToInstantApps="true"> + android:visibleToInstantApps="true" + tools:ignore="ExportedContentProvider"> </provider> # DIFF-ANCHOR: bfe37944 <provider # DIFF-ANCHOR: 97e158a1 android:authorities="$PACKAGE.DownloadFileProvider" @@ -1056,7 +1058,8 @@ <service # DIFF-ANCHOR: 5cda9608 android:exported="true" android:name="org.chromium.android_webview.services.CrashReceiverService" - android:process=":webview_service"> + android:process=":webview_service" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: 5cda9608 <service # DIFF-ANCHOR: adce9ea1 android:exported="false" @@ -1067,12 +1070,14 @@ android:exported="true" android:name="org.chromium.android_webview.services.MetricsBridgeService" android:process=":webview_service" - android:visibleToInstantApps="true"> + android:visibleToInstantApps="true" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: eecf2fee <service # DIFF-ANCHOR: dc926e35 android:exported="true" android:name="org.chromium.android_webview.services.VariationsSeedServer" - android:process=":webview_service"> + android:process=":webview_service" + tools:ignore="ExportedService"> </service> # DIFF-ANCHOR: dc926e35 <service # DIFF-ANCHOR: c34d99ad android:exported="true" @@ -1210,10 +1215,11 @@ android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskJobService" android:permission="android.permission.BIND_JOB_SERVICE"> </service> # DIFF-ANCHOR: a550decc - <service # DIFF-ANCHOR: 2ce68981 + <service # DIFF-ANCHOR: 2a1cd701 android:exported="true" - android:name="org.chromium.components.payments.PaymentDetailsUpdateService"> - </service> # DIFF-ANCHOR: 2ce68981 + android:name="org.chromium.components.payments.PaymentDetailsUpdateService" + tools:ignore="ExportedService"> + </service> # DIFF-ANCHOR: 2a1cd701 <service # DIFF-ANCHOR: 0c6c4fd9 android:exported="false" android:isolatedProcess="false"
diff --git a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected index 9beda20..a0526a1 100644 --- a/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected +++ b/chrome/android/expectations/monochrome_public_bundle.proguard_flags.expected
@@ -665,6 +665,16 @@ } # Keep the classes/members we need for client functionality. +-keep @interface android.support.annotation.Keep +-keep @androidx.annotation.Keep class * +-keepclasseswithmembers class * { + @androidx.annotation.Keep <fields>; +} +-keepclasseswithmembers class * { + @androidx.annotation.Keep <methods>; +} + +# Keep androidX equivalent of above android.support to allow Jetification. -keep @interface androidx.annotation.Keep -keep @androidx.annotation.Keep class * -keepclasseswithmembers class * {
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected index 4df0164..ca88ff39 100644 --- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
@@ -1117,10 +1117,11 @@ android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskJobService" android:permission="android.permission.BIND_JOB_SERVICE"> </service> # DIFF-ANCHOR: a550decc - <service # DIFF-ANCHOR: 2ce68981 + <service # DIFF-ANCHOR: 2a1cd701 android:exported="true" - android:name="org.chromium.components.payments.PaymentDetailsUpdateService"> - </service> # DIFF-ANCHOR: 2ce68981 + android:name="org.chromium.components.payments.PaymentDetailsUpdateService" + tools:ignore="ExportedService"> + </service> # DIFF-ANCHOR: 2a1cd701 <service # DIFF-ANCHOR: 0c6c4fd9 android:exported="false" android:isolatedProcess="false"
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java index 12c7acd9b..a2edb6d 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
@@ -314,7 +314,8 @@ } private static void readAllPseudoTabsFromStateFile() { - assert CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANT_START); + assert CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANT_START) + || CachedFeatureFlags.isEnabled(ChromeFeatureList.PAINT_PREVIEW_SHOW_ON_STARTUP); if (sReadStateFile) return; sReadStateFile = true;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java index 363f0e9a..e057b60 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
@@ -618,9 +618,14 @@ mAnimationCardView.findViewById(R.id.card_view) .setBackground(view.findViewById(R.id.card_view).getBackground()); - ((ImageView) (mAnimationCardView.findViewById(R.id.tab_favicon))) - .setImageDrawable( - ((ImageView) (view.findViewById(R.id.tab_favicon))).getDrawable()); + ImageView sourceCardFavicon = view.findViewById(R.id.tab_favicon); + ImageView animationCardFavicon = mAnimationCardView.findViewById(R.id.tab_favicon); + if (sourceCardFavicon.getDrawable() != null) { + int padding = + mContext.getResources().getDimensionPixelSize(R.dimen.tab_list_card_padding); + animationCardFavicon.setPadding(padding, padding, padding, padding); + animationCardFavicon.setImageDrawable(sourceCardFavicon.getDrawable()); + } ((TextView) (mAnimationCardView.findViewById(R.id.tab_title))) .setText(((TextView) (view.findViewById(R.id.tab_title))).getText());
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java index 2cae602..ed9709d 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -57,6 +57,8 @@ import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.mojom.WindowOpenDisposition; +import java.util.Locale; + /** * A mediator for the {@link FeedSurfaceCoordinator} responsible for interacting with the * native library and handling business logic. @@ -615,8 +617,8 @@ FeedUma.recordFeedControlsAction(FeedUma.CONTROLS_ACTION_TOGGLED_FEED); SuggestionsMetrics.recordArticlesListVisible(); } else { - assert false - : String.format("Cannot handle action for item in the menu with id %d", itemId); + assert false : String.format(Locale.ENGLISH, + "Cannot handle action for item in the menu with id %d", itemId); } }
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index 63b59514..fe38655 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -1130,7 +1130,8 @@ payment method, shipping address, or shipping option --> <service android:name="org.chromium.components.payments.PaymentDetailsUpdateService" - android:exported="true"/> + android:exported="true" + tools:ignore="ExportedService"/> <receiver android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver" android:exported="false"/>
diff --git a/chrome/android/java/res/layout-sw600dp/location_bar.xml b/chrome/android/java/res/layout-sw600dp/location_bar.xml index 8b98003..678a32a85 100644 --- a/chrome/android/java/res/layout-sw600dp/location_bar.xml +++ b/chrome/android/java/res/layout-sw600dp/location_bar.xml
@@ -6,7 +6,8 @@ <!-- The location bar also know as URL bar --> <merge xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> <include layout="@layout/location_status" /> @@ -20,7 +21,8 @@ android:layout_marginEnd="80dp" android:layout_gravity="center_vertical" android:nextFocusForward="@+id/menu_button" - layout="@layout/url_bar" /> + tools:ignore="InconsistentLayout" + layout="@layout/url_bar"/> <include layout="@layout/url_action_container" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index c9179a6..3d17a880 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -64,7 +64,6 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChromePhone; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChromeTablet; -import org.chromium.chrome.browser.compositor.layouts.LayoutStateProvider; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeController; import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout; @@ -287,9 +286,6 @@ private NextTabPolicySupplier mNextTabPolicySupplier; - private final OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderOneshotSupplier = - new OneshotSupplierImpl<>(); - // TODO(crbug.com/1108496): Removed after all usages has been migrated to LayoutStateProvider. private final OneshotSupplierImpl<OverviewModeBehavior> mOverviewModeBehaviorSupplier = new OneshotSupplierImpl<>(); private OverviewModeController mOverviewModeController; @@ -569,7 +565,7 @@ } mLayoutManager = new LayoutManagerChromePhone(compositorViewHolder, mContentContainer, mStartSurfaceSupplier.get(), getTabContentManagerSupplier(), - mOverviewModeBehaviorSupplier, mLayoutStateProviderOneshotSupplier); + mOverviewModeBehaviorSupplier); mOverviewModeController = mLayoutManager; } } @@ -579,9 +575,9 @@ try (TraceEvent e = TraceEvent.scoped( "ChromeTabbedActivity.setupCompositorContentPreNativeForTablet")) { - mLayoutManager = new LayoutManagerChromeTablet(getCompositorViewHolder(), - mContentContainer, getTabContentManagerSupplier(), - mOverviewModeBehaviorSupplier, mLayoutStateProviderOneshotSupplier); + mLayoutManager = + new LayoutManagerChromeTablet(getCompositorViewHolder(), mContentContainer, + getTabContentManagerSupplier(), mOverviewModeBehaviorSupplier); mOverviewModeController = mLayoutManager; } } @@ -619,7 +615,7 @@ } Layout activeLayout = mLayoutManager.getActiveLayout(); - if (activeLayout instanceof StackLayout && !activeLayout.isStartingToHide()) { + if (activeLayout instanceof StackLayout && !activeLayout.isHiding()) { RecordUserAction.record("MobileToolbarStackViewButtonInStackView"); } else if (!isInOverviewMode()) { RecordUserAction.record("MobileToolbarStackViewButtonInBrowsingView");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index 6cdb30e..44e4dfb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -40,7 +40,6 @@ import org.chromium.base.Callback; import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; -import org.chromium.base.DiscardableReferencePool; import org.chromium.base.MathUtils; import org.chromium.base.StrictModeContext; import org.chromium.base.SysUtils; @@ -293,7 +292,6 @@ private int mUiMode; private int mDensityDpi; - private final DiscardableReferencePool mReferencePool = new DiscardableReferencePool(); private final ManualFillingComponent mManualFillingComponent = ManualFillingComponentFactory.createComponent(); @@ -1894,7 +1892,6 @@ public void onTrimMemory(int level) { super.onTrimMemory(level); if (ChromeApplication.isSevereMemorySignal(level)) { - mReferencePool.drain(); clearToolbarResourceCache(); } } @@ -2238,16 +2235,6 @@ */ public void onExitVr() {} - /** - * @return the reference pool for this activity. - * @deprecated Use {@link GlobalDiscardableReferencePool#getReferencePool} instead. - */ - // TODO(bauerb): Migrate clients to GlobalDiscardableReferencePool#getReferencePool. - @Deprecated - public DiscardableReferencePool getReferencePool() { - return mReferencePool; - } - private void clearToolbarResourceCache() { ControlContainer controlContainer = (ControlContainer) findViewById(R.id.control_container); if (controlContainer != null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java index 361325cc..504b63c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
@@ -114,10 +114,7 @@ protected LayoutTab[] mLayoutTabs; // True means that the layout is going to hide as soon as the animation finishes. - private boolean mIsStartingToHide; - - // True means that the layout is going to show as soon as the animation finishes. - private boolean mIsStartingToShow; + private boolean mIsHiding; // The next id to show when the layout is hidden, or TabBase#INVALID_TAB_ID if no change. protected int mNextTabId = Tab.INVALID_TAB_ID; @@ -419,22 +416,15 @@ */ public void startHiding(int nextTabId, boolean hintAtTabSelection) { mUpdateHost.startHiding(nextTabId, hintAtTabSelection); - mIsStartingToHide = true; + mIsHiding = true; mNextTabId = nextTabId; } /** * @return True is the layout is in the process of hiding itself. */ - public boolean isStartingToHide() { - return mIsStartingToHide; - } - - /** - * @return True is the layout is in the process of showing itself. - */ - public boolean isStartingToShow() { - return mIsStartingToShow; + public boolean isHiding() { + return mIsHiding; } /** @@ -448,7 +438,6 @@ * To be called when the transition into the layout is done. */ public void doneShowing() { - mIsStartingToShow = false; mUpdateHost.doneShowing(); } @@ -457,7 +446,7 @@ * This is currently called by the renderer when all the animation are done while hiding. */ public void doneHiding() { - mIsStartingToHide = false; + mIsHiding = false; if (mNextTabId != Tab.INVALID_TAB_ID) { TabModel model = mTabModelSelector.getModelForTabId(mNextTabId); if (model != null) { @@ -488,9 +477,7 @@ * @param animate Whether to play an entry animation. */ public void show(long time, boolean animate) { - // TODO(crbug.com/1108496): Remove after LayoutManager explicitly hide the old layout. - mIsStartingToHide = false; - mIsStartingToShow = true; + mIsHiding = false; mNextTabId = Tab.INVALID_TAB_ID; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java index a1770db..85731fee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
@@ -20,7 +20,6 @@ import org.chromium.base.TraceEvent; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils; import org.chromium.chrome.browser.browser_controls.BrowserControlsVisibilityManager; @@ -81,7 +80,7 @@ * includes lifecycle managment like showing/hiding this {@link Layout}. */ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, - TabModelSelector.CloseAllTabsDelegate, LayoutStateProvider { + TabModelSelector.CloseAllTabsDelegate { /** Sampling at 60 fps. */ private static final long FRAME_DELTA_TIME_MS = 16; @@ -119,9 +118,6 @@ private TabModelObserver mTabModelFilterObserver; // External Observers - private final ObserverList<LayoutStateObserver> mLayoutObservers = new ObserverList<>(); - // TODO(crbug.com/1108496): Remove after all SceneChangeObserver migrates to - // LayoutStateObserver. private final ObserverList<SceneChangeObserver> mSceneChangeObservers = new ObserverList<>(); // Current Layout State @@ -169,9 +165,6 @@ /** A map of {@link SceneOverlay} to its position relative to the others. */ private Map<Class, Integer> mOverlayOrderMap = new HashMap<>(); - /** The supplier used to supply the LayoutStateProvider. */ - private final OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderOneshotSupplier; - /** * Protected class to handle {@link TabModelObserver} related tasks. Extending classes will * need to override any related calls to add new functionality */ @@ -248,18 +241,14 @@ * @param host A {@link LayoutManagerHost} instance. * @param contentContainer A {@link ViewGroup} for Android views to be bound to. * @param tabContentManagerSupplier Supplier of the {@link TabContentManager} instance. - * @param layoutStateProviderOneshotSupplier Supplier used to supply the {@link - * LayoutStateProvider}. */ public LayoutManager(LayoutManagerHost host, ViewGroup contentContainer, - ObservableSupplier<TabContentManager> tabContentManagerSupplier, - OneshotSupplierImpl<LayoutStateProvider> layoutStateProviderOneshotSupplier) { + ObservableSupplier<TabContentManager> tabContentManagerSupplier) { mHost = host; mPxToDp = 1.f / mHost.getContext().getResources().getDisplayMetrics().density; mAndroidViewShownSupplier = new ObservableSupplierImpl<>(); mAndroidViewShownSupplier.set(true); mTabContentManagerSupplier = tabContentManagerSupplier; - mLayoutStateProviderOneshotSupplier = layoutStateProviderOneshotSupplier; mContext = host.getContext(); LayoutRenderHost renderHost = host.getLayoutRenderHost(); @@ -273,7 +262,7 @@ StripLayoutHelperManager.class, StatusIndicatorCoordinator.getSceneOverlayClass(), ContextualSearchPanel.class}; - // clang-format on + // clang-format off for (int i = 0; i < overlayOrder.length; i++) mOverlayOrderMap.put(overlayOrder[i], i); @@ -285,8 +274,6 @@ mOverlayPanelManager = new OverlayPanelManager(); mFrameRequestSupplier = new CompositorModelChangeProcessor.FrameRequestSupplier(this); - - mLayoutStateProviderOneshotSupplier.set(this); } /** @@ -431,16 +418,9 @@ // system. final Layout layout = getActiveLayout(); - // TODO(crbug.com/1070281): Layout itself should decide when it's done hiding and done - // showing. - if (layout != null && layout.onUpdate(timeMs, dtMs) && areAnimatorsComplete) { - if (layout.isStartingToHide()) { - layout.doneHiding(); - } else if (layout.isStartingToShow()) { - // TODO(crbug.com/1108496): Call layout.doneShowing() here after all Layout have - // been consolidated into the new Layout System to avoid Layout tests become flaky, - // especially the StartSurfaceLayoutTest. - } + if (layout != null && layout.onUpdate(timeMs, dtMs) && layout.isHiding() + && areAnimatorsComplete) { + layout.doneHiding(); } // TODO(1100332): Once overlays are MVC, this should no longer be needed. @@ -903,18 +883,10 @@ public void startHiding(int nextTabId, boolean hintAtTabSelection) { requestUpdate(); if (hintAtTabSelection) { - notifyObserversOnTabSelectionHinted(nextTabId); - - // TODO(crbug.com/1108496): Remove after migrates to LayoutStateObserver. for (SceneChangeObserver observer : mSceneChangeObservers) { observer.onTabSelectionHinted(nextTabId); } } - - Layout layoutBeingHidden = getActiveLayout(); - notifyObserversLayoutStartedHiding(layoutBeingHidden.getLayoutType(), - shouldShowToolbarAnimationOnHide(layoutBeingHidden, nextTabId), - shouldDelayHideAnimation(layoutBeingHidden)); } @Override @@ -922,19 +894,11 @@ // TODO: If next layout is default layout clear caches (should this be a sub layout thing?) assert mNextActiveLayout != null : "Need to have a next active layout."; - if (mNextActiveLayout != null) { - // Notify LayoutObservers the active layout is finished hiding. - notifyObserversLayoutFinishedHiding(getActiveLayout().getLayoutType()); - - startShowing(mNextActiveLayout, true); - } + if (mNextActiveLayout != null) startShowing(mNextActiveLayout, true); } @Override - public void doneShowing() { - // Notify LayoutObservers the active layout is finished showing. - notifyObserversLayoutFinishedShowing(getActiveLayout().getLayoutType()); - } + public void doneShowing() {} /** * Should be called by control logic to show a new {@link Layout}. @@ -956,8 +920,6 @@ if (oldLayout != null) { oldLayout.forceAnimationToFinish(); oldLayout.detachViews(); - - // TODO(crbug.com/1108496): hide oldLayout if it's not hidden. } layout.contextChanged(mHost.getContext()); layout.attachViews(mContentContainer); @@ -987,14 +949,10 @@ getActiveLayout().canHostBeFocusable()); mHost.requestRender(); - // TODO(crbug.com/1108496): Remove after migrates to LayoutStateObserver#onStartedShowing. // Notify observers about the new scene. for (SceneChangeObserver observer : mSceneChangeObservers) { observer.onSceneChange(getActiveLayout()); } - - notifyObserversLayoutStartedShowing( - layout.getLayoutType(), shouldShowToolbarAnimationOnShow(animate)); } /** @@ -1110,74 +1068,4 @@ protected void switchToTab(Tab tab, int lastTabId) { tabSelected(tab.getId(), lastTabId, tab.isIncognito()); } - - // LayoutStateProvider implementation. - @Override - public boolean isLayoutVisible(int layoutType) { - return getActiveLayout().getLayoutType() == layoutType; - } - - @Override - public void addObserver(LayoutStateObserver listener) { - mLayoutObservers.addObserver(listener); - } - - @Override - public void removeObserver(LayoutStateObserver listener) { - mLayoutObservers.removeObserver(listener); - } - - protected final void notifyObserversLayoutStartedShowing( - @Layout.LayoutType int layoutType, boolean showToolbar) { - mLayoutStateProviderOneshotSupplier.onAvailable((unused) -> { - for (LayoutStateObserver observer : mLayoutObservers) { - observer.onStartedShowing(layoutType, showToolbar); - } - }); - } - - protected final void notifyObserversLayoutFinishedShowing(@Layout.LayoutType int layoutType) { - mLayoutStateProviderOneshotSupplier.onAvailable((unused) -> { - for (LayoutStateObserver observer : mLayoutObservers) { - observer.onFinishedShowing(layoutType); - } - }); - } - - protected final void notifyObserversLayoutStartedHiding( - @Layout.LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) { - mLayoutStateProviderOneshotSupplier.onAvailable((unused) -> { - for (LayoutStateObserver observer : mLayoutObservers) { - observer.onStartedHiding(layoutType, showToolbar, delayAnimation); - } - }); - } - - protected final void notifyObserversLayoutFinishedHiding(@Layout.LayoutType int layoutType) { - mLayoutStateProviderOneshotSupplier.onAvailable((unused) -> { - for (LayoutStateObserver observer : mLayoutObservers) { - observer.onFinishedHiding(layoutType); - } - }); - } - - protected final void notifyObserversOnTabSelectionHinted(int tabId) { - mLayoutStateProviderOneshotSupplier.onAvailable((unused) -> { - for (LayoutStateObserver observer : mLayoutObservers) { - observer.onTabSelectionHinted(tabId); - } - }); - } - - protected boolean shouldShowToolbarAnimationOnShow(boolean isAnimate) { - return false; - } - - protected boolean shouldShowToolbarAnimationOnHide(Layout layoutBeingHidden, int nextTabId) { - return false; - } - - protected boolean shouldDelayHideAnimation(Layout layoutBeingHidden) { - return false; - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index 305773d4..8238e9b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -88,10 +88,8 @@ public LayoutManagerChrome(LayoutManagerHost host, ViewGroup contentContainer, boolean createOverviewLayout, @Nullable StartSurface startSurface, ObservableSupplier<TabContentManager> tabContentManagerSupplier, - OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier, - OneshotSupplierImpl<LayoutStateProvider> layoutStateProviderOneshotSupplier) { - super(host, contentContainer, tabContentManagerSupplier, - layoutStateProviderOneshotSupplier); + OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier) { + super(host, contentContainer, tabContentManagerSupplier); Context context = host.getContext(); LayoutRenderHost renderHost = host.getLayoutRenderHost(); @@ -261,7 +259,6 @@ Layout layoutBeingShown = getActiveLayout(); - // TODO(crbug.com/1108496): Remove after migrates to LayoutStateObserver. // Check if we should notify OverviewModeObservers. if (isOverviewLayout(layoutBeingShown)) { boolean showToolbar = animate && (!mEnableAnimations @@ -274,7 +271,6 @@ public void startHiding(int nextTabId, boolean hintAtTabSelection) { super.startHiding(nextTabId, hintAtTabSelection); - // TODO(crbug.com/1108496): Remove after migrates to LayoutStateObserver. Layout layoutBeingHidden = getActiveLayout(); if (isOverviewLayout(layoutBeingHidden)) { boolean showToolbar = true; @@ -293,7 +289,6 @@ public void doneShowing() { super.doneShowing(); - // TODO(crbug.com/1108496): Remove after migrates to LayoutStateObserver. if (isOverviewLayout(getActiveLayout())) { notifyObserversFinishedShowing(); } @@ -310,34 +305,12 @@ super.doneHiding(); - // TODO(crbug.com/1108496): Remove after migrates to Observer. if (isOverviewLayout(layoutBeingHidden)) { notifyObserversFinishedHiding(); } } @Override - protected boolean shouldDelayHideAnimation(Layout layoutBeingHidden) { - return mEnableAnimations && layoutBeingHidden == mOverviewLayout && mCreatingNtp; - } - - @Override - protected boolean shouldShowToolbarAnimationOnShow(boolean isAnimate) { - return isAnimate - && (!mEnableAnimations || getTabModelSelector().getCurrentModel().getCount() <= 0); - } - - @Override - protected boolean shouldShowToolbarAnimationOnHide(Layout layoutBeingHidden, int nextTabId) { - boolean showAnimation = true; - if (mEnableAnimations && layoutBeingHidden == mOverviewLayout) { - final LayoutTab tab = layoutBeingHidden.getLayoutTab(nextTabId); - showAnimation = tab == null || !tab.showToolbar(); - } - return showAnimation; - } - - @Override protected void tabCreated(int id, int sourceId, @TabLaunchType int launchType, boolean incognito, boolean willBeSelected, float originX, float originY) { Tab newTab = TabModelUtils.getTabById(getTabModelSelector().getModel(incognito), id); @@ -421,7 +394,7 @@ @Override public void hideOverview(boolean animate) { Layout activeLayout = getActiveLayout(); - if (activeLayout != null && !activeLayout.isStartingToHide()) { + if (activeLayout != null && !activeLayout.isHiding()) { if (animate) { activeLayout.onTabSelecting(time(), Tab.INVALID_TAB_ID); } else { @@ -450,7 +423,7 @@ @Override public boolean overviewVisible() { Layout activeLayout = getActiveLayout(); - return isOverviewLayout(activeLayout) && !activeLayout.isStartingToHide(); + return isOverviewLayout(activeLayout) && !activeLayout.isHiding(); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java index 7dbb7eb7..43f9d355 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
@@ -41,10 +41,9 @@ public LayoutManagerChromePhone(LayoutManagerHost host, ViewGroup contentContainer, StartSurface startSurface, ObservableSupplier<TabContentManager> tabContentManagerSupplier, - OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier, - OneshotSupplierImpl<LayoutStateProvider> layoutStateProviderOneshotSupplier) { + OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier) { super(host, contentContainer, true, startSurface, tabContentManagerSupplier, - overviewModeBehaviorSupplier, layoutStateProviderOneshotSupplier); + overviewModeBehaviorSupplier); } @Override @@ -131,7 +130,7 @@ @Override protected void tabCreating(int sourceId, String url, boolean isIncognito) { - if (!getActiveLayout().isStartingToHide() && overlaysHandleTabCreating() + if (!getActiveLayout().isHiding() && overlaysHandleTabCreating() && getActiveLayout().handlesTabCreating()) { // If the current layout in the foreground, let it handle the tab creation animation. // This check allows us to switch from the StackLayout to the SimpleAnimationLayout @@ -139,7 +138,7 @@ getActiveLayout().onTabCreating(sourceId); } else if (animationsEnabled()) { if (!overviewVisible()) { - if (getActiveLayout() != null && getActiveLayout().isStartingToHide()) { + if (getActiveLayout() != null && getActiveLayout().isHiding()) { setNextLayout(mSimpleAnimationLayout); // The method Layout#doneHiding() will automatically show the next layout. getActiveLayout().doneHiding();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java index 8f24eee4..a0f4ff5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -37,10 +37,9 @@ */ public LayoutManagerChromeTablet(LayoutManagerHost host, ViewGroup contentContainer, ObservableSupplier<TabContentManager> tabContentManagerSupplier, - OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier, - OneshotSupplierImpl<LayoutStateProvider> layoutStateProviderOneshotSupplier) { + OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier) { super(host, contentContainer, false, null, tabContentManagerSupplier, - overviewModeBehaviorSupplier, layoutStateProviderOneshotSupplier); + overviewModeBehaviorSupplier); mTabStripLayoutHelperManager = new StripLayoutHelperManager( host.getContext(), this, mHost.getLayoutRenderHost(), () -> mTitleCache);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutStateProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutStateProvider.java deleted file mode 100644 index bb1fcf32..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutStateProvider.java +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.compositor.layouts; - -/** - * Exposes the current {@link Layout} state as well as a way to listen to {@link Layout} state - * changes. - */ -public interface LayoutStateProvider { - /** - * An observer that is notified when the {@link Layout} state changes. - */ - interface LayoutStateObserver { - // TODO(crbug.com/1108496): Reiterate to see whether the showToolbar param is needed. - /** - * Called when Layout starts showing. - * @param layoutType LayoutType of the started showing Layout. - * @param showToolbar Whether or not to show the normal toolbar when animating into the - */ - default void onStartedShowing(@Layout.LayoutType int layoutType, boolean showToolbar) {} - - /** - * Called when Layout finishes showing. - * @param layoutType LayoutType of the finished showing Layout. - */ - default void onFinishedShowing(@Layout.LayoutType int layoutType) {} - - // TODO(crbug.com/1108496): Reiterate to see whether the showToolbar and delayAnimation - // param is needed. - /** - * Called when Layout starts hiding. - * @param layoutType LayoutType of the started hiding Layout. - * @param showToolbar Whether or not to show the normal toolbar when animating out of - * showing Layout. - * @param delayAnimation Whether or not to delay any related animations until after Layout - */ - default void onStartedHiding( - @Layout.LayoutType int layoutType, boolean showToolbar, boolean delayAnimation) {} - - /** - * Called when Layout finishes hiding. - * @param layoutType LayoutType of the finished hiding Layout. - */ - default void onFinishedHiding(@Layout.LayoutType int layoutType) {} - - /** - * Called when a layout wants to hint that a new tab might be selected soon. This is not - * called every time a tab is selected. - * @param tabId The id of the tab that might be selected soon. - */ - default void onTabSelectionHinted(int tabId) {} - } - - /** - * @return Whether or not the {@link Layout} is visible. - * @param layoutType whether the {@link Layout} give {@link Layout.LayoutType} is visible. - */ - boolean isLayoutVisible(@Layout.LayoutType int layoutType); - - /** - * @param listener Registers {@code listener} for all layout status changes. - */ - void addObserver(LayoutStateObserver listener); - - /** - * @param listener Unregisters {@code listener} for all layout status changes. - */ - void removeObserver(LayoutStateObserver listener); -} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java index 841faaa2..234227a7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
@@ -1727,7 +1727,7 @@ mStackTabs = new StackTab[count]; final boolean isIncognito = mTabList.isIncognito(); - final boolean needTitle = !mLayout.isStartingToHide(); + final boolean needTitle = !mLayout.isHiding(); for (int i = 0; i < count; ++i) { Tab tab = mTabList.getTabAt(i); int tabId = tab != null ? tab.getId() : Tab.INVALID_TAB_ID;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabCompositorContentInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabCompositorContentInitializer.java index 4561f996..8d8f1ba 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabCompositorContentInitializer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabCompositorContentInitializer.java
@@ -9,7 +9,6 @@ import org.chromium.base.Callback; import org.chromium.base.supplier.ObservableSupplier; -import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; @@ -68,8 +67,8 @@ @Override public void onFinishNativeInitialization() { ViewGroup contentContainer = mActivity.findViewById(android.R.id.content); - LayoutManager layoutDriver = new LayoutManager(mCompositorViewHolder.get(), - contentContainer, mTabContentManagerSupplier, new OneshotSupplierImpl<>()); + LayoutManager layoutDriver = new LayoutManager( + mCompositorViewHolder.get(), contentContainer, mTabContentManagerSupplier); mCompositorViewHolderInitializer.initializeCompositorContent(layoutDriver, mActivity.findViewById(org.chromium.chrome.R.id.url_bar), contentContainer,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index a0f2ccc9..4d0dddce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -46,12 +46,14 @@ import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.gsa.GSAState; +import org.chromium.chrome.browser.lifecycle.Destroyable; import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.native_page.NativePageFactory; import org.chromium.chrome.browser.ntp.FakeboxDelegate; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType; +import org.chromium.chrome.browser.omnibox.UrlBar.UrlBarDelegate; import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.geo.GeolocationHeader; import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; @@ -98,8 +100,9 @@ * search terms. */ public class LocationBarLayout extends FrameLayout - implements OnClickListener, LocationBar, AutocompleteDelegate, FakeboxDelegate, - VoiceRecognitionHandler.Delegate, AssistantVoiceSearchService.Observer { + implements OnClickListener, AutocompleteDelegate, FakeboxDelegate, + VoiceRecognitionHandler.Delegate, AssistantVoiceSearchService.Observer, + Destroyable, UrlBarDelegate { private static final int KEYBOARD_HIDE_DELAY_MS = 150; private static final int KEYBOARD_MODE_CHANGE_DELAY_MS = 300; @@ -330,7 +333,6 @@ } } - @Override public void initializeControls(WindowDelegate windowDelegate, WindowAndroid windowAndroid, ActivityTabProvider activityTabProvider, Supplier<ModalDialogManager> modalDialogManagerSupplier, @@ -352,7 +354,6 @@ return mAutocompleteCoordinator; } - @Override public void onDeferredStartup() { mAutocompleteCoordinator.prefetchZeroSuggestResults(); } @@ -360,7 +361,6 @@ /** * Handles native dependent initialization for this class. */ - @Override public void onNativeLibraryReady() { TemplateUrlServiceFactory.get().runWhenLoaded(this::registerTemplateUrlObserver); mNativeInitialized = true; @@ -390,7 +390,6 @@ setProfile(mProfileSupplier.get()); } - @Override public void setProfileSupplier(ObservableSupplier<Profile> profileSupplier) { assert profileSupplier != null; assert mProfileSupplier == null; @@ -404,12 +403,10 @@ setUrlBarFocus(false, null, LocationBar.OmniboxFocusReason.UNFOCUS); } - @Override public void selectAll() { mUrlCoordinator.selectAll(); } - @Override public void revertChanges() { if (!mUrlHasFocus) { setUrlToPageUrl(); @@ -430,7 +427,6 @@ updateButtonVisibility(); } - @Override public void setDefaultTextEditActionModeCallback(ToolbarActionModeCallback callback) { mUrlCoordinator.setActionModeCallback(callback); } @@ -445,7 +441,6 @@ return mUrlFocusedFromQueryTiles; } - @Override public void showUrlBarCursorWithoutFocusAnimations() { if (mUrlHasFocus || mUrlFocusedFromFakebox) return; @@ -459,7 +454,6 @@ /** * Sets the toolbar that owns this LocationBar. */ - @Override public void setToolbarDataProvider(ToolbarDataProvider toolbarDataProvider) { mToolbarDataProvider = toolbarDataProvider; @@ -478,7 +472,6 @@ /** * Updates the security icon displayed in the LocationBar. */ - @Override public void updateStatusIcon() { mStatusCoordinator.updateStatusIcon(); // Update the URL in case the scheme change triggers a URL emphasis change. @@ -622,7 +615,6 @@ * Update the location bar visuals based on a loading state change. * @param updateUrl Whether to update the URL as a result of this call. */ - @Override public void updateLoadingState(boolean updateUrl) { if (updateUrl) setUrlToPageUrl(); mStatusCoordinator.updateStatusIcon(); @@ -642,8 +634,8 @@ } @Override - public void setUrlBarFocus( - boolean shouldBeFocused, @Nullable String pastedText, @OmniboxFocusReason int reason) { + public void setUrlBarFocus(boolean shouldBeFocused, @Nullable String pastedText, + @LocationBar.OmniboxFocusReason int reason) { if (shouldBeFocused) { if (!mUrlHasFocus) recordOmniboxFocusReason(reason); if (reason == LocationBar.OmniboxFocusReason.FAKE_BOX_TAP @@ -713,7 +705,6 @@ * Call to force the UI to update the state of various buttons based on whether or not the * current tab is incognito. */ - @Override public void updateVisualsForState() { // If the location bar is focused, the toolbar background color would be the default color // regardless of whether it is branded or not. @@ -752,25 +743,20 @@ } } - @Override public void onTabLoadingNTP(NewTabPage ntp) { ntp.setFakeboxDelegate(this); } - @Override public View getContainerView() { return this; } - @Override public View getSecurityIconView() { return mStatusCoordinator.getSecurityIconView(); } - @Override public void setTitleToPageTitle() {} - @Override public void setShowTitle(boolean showTitle) {} @Override @@ -809,7 +795,6 @@ * * <p>If the current tab is null, the URL text will be cleared. */ - @Override public void setUrlToPageUrl() { String currentUrl = mToolbarDataProvider.getCurrentUrl(); @@ -1335,9 +1320,9 @@ mAutocompleteCoordinator.onTextChanged(textWithoutAutocomplete, textWithAutocomplete); } - private void recordOmniboxFocusReason(@OmniboxFocusReason int reason) { + private void recordOmniboxFocusReason(@LocationBar.OmniboxFocusReason int reason) { RecordHistogram.recordEnumeratedHistogram( - "Android.OmniboxFocusReason", reason, OmniboxFocusReason.NUM_ENTRIES); + "Android.OmniboxFocusReason", reason, LocationBar.OmniboxFocusReason.NUM_ENTRIES); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java index ff1412d..a6c2c32 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java
@@ -11,7 +11,6 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; -import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType; @@ -215,26 +214,20 @@ private static void flushTabSwitchLatencyMetric(boolean perceived) { if (sTabSwitchStartTime <= 0) return; final long ms = SystemClock.uptimeMillis() - sTabSwitchStartTime; - String baseHistogram; switch (sTabSelectionType) { case TabSelectionType.FROM_CLOSE: - baseHistogram = "Tabs.SwitchFromCloseLatency"; + TabModelJniBridgeJni.get().logFromCloseMetric(ms, perceived); break; case TabSelectionType.FROM_EXIT: - baseHistogram = "Tabs.SwitchFromExitLatency"; + TabModelJniBridgeJni.get().logFromExitMetric(ms, perceived); break; case TabSelectionType.FROM_NEW: - baseHistogram = "Tabs.SwitchFromNewLatency"; + TabModelJniBridgeJni.get().logFromNewMetric(ms, perceived); break; case TabSelectionType.FROM_USER: - baseHistogram = "Tabs.SwitchFromUserLatency"; + TabModelJniBridgeJni.get().logFromUserMetric(ms, perceived); break; - default: - assert false; - return; } - String histogramSuffix = perceived ? "_Perceived" : "_Actual"; - RecordHistogram.recordTimesHistogram(baseHistogram + histogramSuffix, ms); } @NativeMethods @@ -245,5 +238,11 @@ long nativeTabModelJniBridge, TabModelJniBridge caller); void destroy(long nativeTabModelJniBridge, TabModelJniBridge caller); void tabAddedToModel(long nativeTabModelJniBridge, TabModelJniBridge caller, Tab tab); + + // Methods for tab switch latency metrics. + void logFromCloseMetric(long ms, boolean perceived); + void logFromExitMetric(long ms, boolean perceived); + void logFromNewMetric(long ms, boolean perceived); + void logFromUserMetric(long ms, boolean perceived); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java index c6badbf69..b139a27 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java
@@ -1479,15 +1479,19 @@ openBookmarkManager(); TestThreadUtils.runOnUiThreadBlocking( () -> mManager.openFolder(mBookmarkModel.getRootFolderId())); - + RecyclerViewTestUtils.waitForStableRecyclerView(mItemsContainer); Assert.assertEquals("Wrong number of top level folders.", 2, getAdapter().getItemCount()); - Assert.assertEquals("The first view should be reading list.", BookmarkType.READING_LIST, - getIdByPosition(0).getType()); - Assert.assertEquals("The second view should be a normal folder.", BookmarkType.NORMAL, - getIdByPosition(1).getType()); // Reading list should show in the root folder. + View readingListRow = mItemsContainer.findViewHolderForAdapterPosition(0).itemView; + Assert.assertEquals("No overflow menu for reading list folder.", View.GONE, + readingListRow.findViewById(R.id.more).getVisibility()); + Assert.assertEquals("The first view should be reading list.", BookmarkType.READING_LIST, + getIdByPosition(0).getType()); onView(withText("Reading list")).check(matches(isDisplayed())); + + Assert.assertEquals("The second view should be a normal folder.", BookmarkType.NORMAL, + getIdByPosition(1).getType()); } /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index 9afeeca..aa29d42b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -10,6 +10,7 @@ import android.content.Context; import android.graphics.PointF; import android.support.test.InstrumentationRegistry; +import android.util.Log; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; @@ -27,12 +28,10 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.chromium.base.Log; import org.chromium.base.MathUtils; import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.test.UiThreadTest; -import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; @@ -69,8 +68,6 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.test.util.UiRestriction; -import java.util.concurrent.TimeoutException; - /** * Unit tests for {@link org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome} */ @@ -95,13 +92,6 @@ private float mDpToPx; - private OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderSupplier; - - class LayoutObserverCallbackHelper extends CallbackHelper { - @Layout.LayoutType - public int layoutType; - } - private void initializeMotionEvent() { mProperties[0] = new PointerProperties(); mProperties[0].id = 0; @@ -182,14 +172,8 @@ new ObservableSupplierImpl<>(); OneshotSupplierImpl<OverviewModeBehavior> overviewModeBehaviorSupplier = new OneshotSupplierImpl<>(); - - if (mLayoutStateProviderSupplier == null) { - mLayoutStateProviderSupplier = new OneshotSupplierImpl<>(); - } - mManagerPhone = new LayoutManagerChromePhone(layoutManagerHost, container, null, - tabContentManagerSupplier, overviewModeBehaviorSupplier, - mLayoutStateProviderSupplier); + tabContentManagerSupplier, overviewModeBehaviorSupplier); tabContentManagerSupplier.set(tabContentManager); mManager = mManagerPhone; CompositorAnimationHandler.setTestingMode(true); @@ -657,207 +641,6 @@ verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.LIST); } - @Test - @MediumTest - public void testLayoutObserverNotification_ShowAndHide_ToolbarSwipe() throws TimeoutException { - LayoutObserverCallbackHelper startedShowingCallback = new LayoutObserverCallbackHelper(); - LayoutObserverCallbackHelper finishedShowingCallback = new LayoutObserverCallbackHelper(); - LayoutObserverCallbackHelper startedHidingCallback = new LayoutObserverCallbackHelper(); - LayoutObserverCallbackHelper finishedHidingCallback = new LayoutObserverCallbackHelper(); - - setUpShowAndHideLayoutObserverNotification(startedShowingCallback, finishedShowingCallback, - startedHidingCallback, finishedHidingCallback); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - performToolbarSideSwipe(ScrollDirection.RIGHT); - Assert.assertEquals( - Layout.LayoutType.TOOLBAR_SWIPE, mManager.getActiveLayout().getLayoutType()); - Assert.assertTrue(mLayoutStateProviderSupplier.get().isLayoutVisible( - Layout.LayoutType.TOOLBAR_SWIPE)); - }); - - // The |startedShowingCallback| callCount 0 is reserved for the default layout during - // initialization. Because LayoutManager does not explicitly hide the old layout when a new - // layout is forced to show, the callCount for |finishedShowingCallback|, - // |startedHidingCallback|, and |finishedHidingCallback| are still 0. - // TODO(crbug.com/1108496): update the callCount when LayoutManager explicitly hide the old - // layout. - startedShowingCallback.waitForCallback(1); - Assert.assertEquals(Layout.LayoutType.TOOLBAR_SWIPE, startedShowingCallback.layoutType); - - // TODO(crbug.com/1108496): Enable the following two lines after layout.doneShowing() is - // always call when trying to show a Layout. - // finishedShowingCallback.waitForCallback(0); - // Assert.assertEquals(Layout.LayoutType.TOOLBAR_SWIPE, finishedShowingCallback.layoutType); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - finishToolbarSideSwipe(); - Assert.assertEquals( - Layout.LayoutType.BROWSING, mManager.getActiveLayout().getLayoutType()); - Assert.assertTrue( - mLayoutStateProviderSupplier.get().isLayoutVisible(Layout.LayoutType.BROWSING)); - }); - - startedHidingCallback.waitForCallback(0); - Assert.assertEquals(Layout.LayoutType.TOOLBAR_SWIPE, startedHidingCallback.layoutType); - - finishedHidingCallback.waitForCallback(0); - Assert.assertEquals(Layout.LayoutType.TOOLBAR_SWIPE, finishedHidingCallback.layoutType); - - startedShowingCallback.waitForCallback(2); - Assert.assertEquals(Layout.LayoutType.BROWSING, startedShowingCallback.layoutType); - - // TODO(crbug.com/1108496): Enable the following two lines after layout.doneShowing() is - // always call when trying to show a Layout. - // finishedShowingCallback.waitForCallback(1); - // Assert.assertEquals(Layout.LayoutType.BROWSING, finishedShowingCallback.layoutType); - } - - @Test - @MediumTest - public void testLayoutObserverNotification_ShowAndHide_TabSwitcher() throws TimeoutException { - LayoutObserverCallbackHelper startedShowingCallback = new LayoutObserverCallbackHelper(); - LayoutObserverCallbackHelper finishedShowingCallback = new LayoutObserverCallbackHelper(); - LayoutObserverCallbackHelper startedHidingCallback = new LayoutObserverCallbackHelper(); - LayoutObserverCallbackHelper finishedHidingCallback = new LayoutObserverCallbackHelper(); - - setUpShowAndHideLayoutObserverNotification(startedShowingCallback, finishedShowingCallback, - startedHidingCallback, finishedHidingCallback); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - mManager.showOverview(true); - - Assert.assertTrue( - "layoutManager is way too long to end motion", simulateTime(mManager, 1000)); - Assert.assertEquals( - Layout.LayoutType.TAB_SWITCHER, mManager.getActiveLayout().getLayoutType()); - Assert.assertTrue(mLayoutStateProviderSupplier.get().isLayoutVisible( - Layout.LayoutType.TAB_SWITCHER)); - }); - - // The |startedShowingCallback| callCount 0 is reserved for the default layout during - // initialization. Because LayoutManager does not explicitly hide the old layout when a new - // layout is forced to show, the callCount for |finishedShowingCallback|, - // |startedHidingCallback|, and |finishedHidingCallback| are still 0. - // TODO(crbug.com/1108496): update the callCount when LayoutManager explicitly hide the old - // layout. - startedShowingCallback.waitForCallback(1); - Assert.assertEquals(Layout.LayoutType.TAB_SWITCHER, startedShowingCallback.layoutType); - - finishedShowingCallback.waitForCallback(0); - Assert.assertEquals(Layout.LayoutType.TAB_SWITCHER, finishedShowingCallback.layoutType); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - mManagerPhone.hideOverview(true); - Assert.assertTrue( - "layoutManager is way too long to end motion", simulateTime(mManager, 1000)); - - Assert.assertTrue( - mLayoutStateProviderSupplier.get().isLayoutVisible(Layout.LayoutType.BROWSING)); - }); - - startedHidingCallback.waitForCallback(0); - Assert.assertEquals(Layout.LayoutType.TAB_SWITCHER, startedHidingCallback.layoutType); - - finishedHidingCallback.waitForCallback(0); - Assert.assertEquals(Layout.LayoutType.TAB_SWITCHER, finishedHidingCallback.layoutType); - - startedShowingCallback.waitForCallback(2); - Assert.assertEquals(Layout.LayoutType.BROWSING, startedShowingCallback.layoutType); - - // TODO(crbug.com/1108496): Enable the following two lines after layout.doneShowing() is - // always call when trying to show a Layout. - // finishedShowingCallback.waitForCallback(1); - // Assert.assertEquals(Layout.LayoutType.BROWSING, finishedShowingCallback.layoutType); - } - - private void setUpShowAndHideLayoutObserverNotification( - LayoutObserverCallbackHelper startedShowingCallback, - LayoutObserverCallbackHelper finishedShowingCallback, - LayoutObserverCallbackHelper startedHidingCallback, - LayoutObserverCallbackHelper finishedHidingCallback) throws TimeoutException { - TestThreadUtils.runOnUiThreadBlocking(() -> { - mLayoutStateProviderSupplier = new OneshotSupplierImpl<>(); - - mLayoutStateProviderSupplier.onAvailable((layoutStateProvider) -> { - layoutStateProvider.addObserver(new LayoutStateProvider.LayoutStateObserver() { - @Override - public void onStartedShowing(int layoutType, boolean showToolbar) { - Log.d(TAG, "Started to show: " + layoutType); - startedShowingCallback.layoutType = layoutType; - startedShowingCallback.notifyCalled(); - } - - @Override - public void onFinishedShowing(int layoutType) { - Log.d(TAG, "finished to show: " + layoutType); - finishedShowingCallback.layoutType = layoutType; - finishedShowingCallback.notifyCalled(); - } - - @Override - public void onStartedHiding( - int layoutType, boolean showToolbar, boolean delayAnimation) { - Log.d(TAG, "Started to hide: " + layoutType); - startedHidingCallback.layoutType = layoutType; - startedHidingCallback.notifyCalled(); - } - - @Override - public void onFinishedHiding(int layoutType) { - Log.d(TAG, "finished to hide: " + layoutType); - finishedHidingCallback.layoutType = layoutType; - finishedHidingCallback.notifyCalled(); - } - }); - }); - - initializeLayoutManagerPhone(2, 0); - Assert.assertEquals( - Layout.LayoutType.BROWSING, mManager.getActiveLayout().getLayoutType()); - }); - - startedShowingCallback.waitForCallback(0); - Assert.assertEquals(Layout.LayoutType.BROWSING, startedShowingCallback.layoutType); - } - - @Test - @MediumTest - public void testLayoutObserverNotification_TabSelectionHinted() throws TimeoutException { - CallbackHelper tabSelectionHintedCallback = new CallbackHelper(); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - mLayoutStateProviderSupplier = new OneshotSupplierImpl<>(); - - mLayoutStateProviderSupplier.onAvailable((layoutStateProvider) -> { - layoutStateProvider.addObserver(new LayoutStateProvider.LayoutStateObserver() { - @Override - public void onTabSelectionHinted(int tabId) { - Log.d(TAG, "onTabSelectionHinted"); - tabSelectionHintedCallback.notifyCalled(); - } - }); - }); - - initializeLayoutManagerPhone(2, 0); - mManager.showOverview(true); - - Assert.assertTrue( - "layoutManager is way too long to end motion", simulateTime(mManager, 1000)); - Assert.assertEquals( - Layout.LayoutType.TAB_SWITCHER, mManager.getActiveLayout().getLayoutType()); - - mManagerPhone.hideOverview(true); - Assert.assertTrue( - "layoutManager is way too long to end motion", simulateTime(mManager, 1000)); - - Assert.assertEquals( - Layout.LayoutType.BROWSING, mManager.getActiveLayout().getLayoutType()); - }); - - tabSelectionHintedCallback.waitForCallback(0); - } - @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -938,7 +721,6 @@ final int finalId = model.getTabAt(finalIndex).getId(); performToolbarSideSwipe(direction); - finishToolbarSideSwipe(); Assert.assertEquals("Unexpected model change after side swipe", model.isIncognito(), mTabModelSelector.isIncognitoSelected()); @@ -969,21 +751,14 @@ // TODO(mdjones): Update implementation of EdgeSwipeHandler to work this way by default. eventHandler.swipeUpdated(deltaX, 0.f, deltaX, 0.f, deltaX, 0.f); eventHandler.swipeUpdated(deltaX, 0.f, deltaX, 0.f, deltaX, 0.f); + eventHandler.swipeFinished(); + Assert.assertTrue("LayoutManager#getActiveLayout() should be ToolbarSwipeLayout", mManager.getActiveLayout() instanceof ToolbarSwipeLayout); Assert.assertTrue("LayoutManager took too long to finish the animations", simulateTime(mManager, 1000)); } - private void finishToolbarSideSwipe() { - final EdgeSwipeHandler eventHandler = mManager.getToolbarSwipeHandler(); - Assert.assertNotNull("LayoutManager#getToolbarSwipeHandler() returned null", eventHandler); - - eventHandler.swipeFinished(); - Assert.assertTrue("LayoutManager took too long to finish the animations", - simulateTime(mManager, 1000)); - } - @Override public Tab createTab(int id, boolean incognito) { return MockTab.createAndInitialize(id, incognito);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java index e2d5e24..efbbd4e9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java
@@ -5,8 +5,6 @@ package org.chromium.chrome.browser.compositor.layouts; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import android.content.Context; @@ -23,7 +21,6 @@ import org.robolectric.annotation.Config; import org.chromium.base.supplier.ObservableSupplier; -import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; @@ -56,9 +53,6 @@ @Mock private ObservableSupplier<TabContentManager> mTabContentManagerSupplier; - @Mock - private OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderOneshotSupplier; - private LayoutManager mLayoutManager; @Before @@ -68,10 +62,9 @@ when(mLayoutManagerHost.getContext()).thenReturn(mContext); when(mContext.getResources()).thenReturn(mResources); when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics); - doNothing().when(mLayoutStateProviderOneshotSupplier).set(any()); - mLayoutManager = new LayoutManager(mLayoutManagerHost, mContainerView, - mTabContentManagerSupplier, mLayoutStateProviderOneshotSupplier); + mLayoutManager = + new LayoutManager(mLayoutManagerHost, mContainerView, mTabContentManagerSupplier); } @Test
diff --git a/chrome/android/monochrome/BUILD.gn b/chrome/android/monochrome/BUILD.gn index 0252d05..c520131 100644 --- a/chrome/android/monochrome/BUILD.gn +++ b/chrome/android/monochrome/BUILD.gn
@@ -12,5 +12,6 @@ "//android_webview:system_webview_apk", "//chrome/android:chrome_public_apk", "//chrome/android:monochrome_public_apk", + "//testing:run_isolated_script_test", ] }
diff --git a/chrome/android/monochrome/scripts/monochrome_python_tests.pydeps b/chrome/android/monochrome/scripts/monochrome_python_tests.pydeps index 1694d42..fba475a93 100644 --- a/chrome/android/monochrome/scripts/monochrome_python_tests.pydeps +++ b/chrome/android/monochrome/scripts/monochrome_python_tests.pydeps
@@ -1,61 +1,61 @@ # Generated by running: -# build/print_python_deps.py chrome/android/monochrome/scripts -build/android/devil_chromium.py -build/android/pylib/__init__.py -build/android/pylib/constants/__init__.py -build/android/pylib/constants/host_paths.py -chrome/android/monochrome/scripts/monochrome_android_manifest_test.py -chrome/android/monochrome/scripts/monochrome_apk_checker_test.py -chrome/android/monochrome/scripts/monochrome_dexdump_test.py -chrome/android/monochrome/scripts/monochrome_python_tests.py -third_party/catapult/common/py_utils/py_utils/__init__.py -third_party/catapult/common/py_utils/py_utils/cloud_storage.py -third_party/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py -third_party/catapult/common/py_utils/py_utils/lock.py -third_party/catapult/dependency_manager/dependency_manager/__init__.py -third_party/catapult/dependency_manager/dependency_manager/archive_info.py -third_party/catapult/dependency_manager/dependency_manager/base_config.py -third_party/catapult/dependency_manager/dependency_manager/cloud_storage_info.py -third_party/catapult/dependency_manager/dependency_manager/dependency_info.py -third_party/catapult/dependency_manager/dependency_manager/dependency_manager_util.py -third_party/catapult/dependency_manager/dependency_manager/exceptions.py -third_party/catapult/dependency_manager/dependency_manager/local_path_info.py -third_party/catapult/dependency_manager/dependency_manager/manager.py -third_party/catapult/dependency_manager/dependency_manager/uploader.py -third_party/catapult/devil/devil/__init__.py -third_party/catapult/devil/devil/android/__init__.py -third_party/catapult/devil/devil/android/constants/__init__.py -third_party/catapult/devil/devil/android/constants/chrome.py -third_party/catapult/devil/devil/android/ndk/__init__.py -third_party/catapult/devil/devil/android/ndk/abis.py -third_party/catapult/devil/devil/android/sdk/__init__.py -third_party/catapult/devil/devil/android/sdk/build_tools.py -third_party/catapult/devil/devil/android/sdk/keyevent.py -third_party/catapult/devil/devil/android/sdk/version_codes.py -third_party/catapult/devil/devil/base_error.py -third_party/catapult/devil/devil/constants/__init__.py -third_party/catapult/devil/devil/constants/exit_codes.py -third_party/catapult/devil/devil/devil_env.py -third_party/catapult/devil/devil/utils/__init__.py -third_party/catapult/devil/devil/utils/cmd_helper.py -third_party/catapult/devil/devil/utils/lazy/__init__.py -third_party/catapult/devil/devil/utils/lazy/weak_constant.py -third_party/catapult/devil/devil/utils/reraiser_thread.py -third_party/catapult/devil/devil/utils/timeout_retry.py -third_party/catapult/devil/devil/utils/watchdog_timer.py -third_party/catapult/third_party/typ/typ/__init__.py -third_party/catapult/third_party/typ/typ/arg_parser.py -third_party/catapult/third_party/typ/typ/artifacts.py -third_party/catapult/third_party/typ/typ/expectations_parser.py -third_party/catapult/third_party/typ/typ/fakes/__init__.py -third_party/catapult/third_party/typ/typ/fakes/host_fake.py -third_party/catapult/third_party/typ/typ/host.py -third_party/catapult/third_party/typ/typ/json_results.py -third_party/catapult/third_party/typ/typ/pool.py -third_party/catapult/third_party/typ/typ/printer.py -third_party/catapult/third_party/typ/typ/python_2_3_compat.py -third_party/catapult/third_party/typ/typ/runner.py -third_party/catapult/third_party/typ/typ/stats.py -third_party/catapult/third_party/typ/typ/test_case.py -third_party/catapult/third_party/typ/typ/version.py -third_party/catapult/third_party/zipfile/zipfile_2_7_13.py +# build/print_python_deps.py --gn-paths chrome/android/monochrome/scripts +//build/android/devil_chromium.py +//build/android/pylib/__init__.py +//build/android/pylib/constants/__init__.py +//build/android/pylib/constants/host_paths.py +//chrome/android/monochrome/scripts/monochrome_android_manifest_test.py +//chrome/android/monochrome/scripts/monochrome_apk_checker_test.py +//chrome/android/monochrome/scripts/monochrome_dexdump_test.py +//chrome/android/monochrome/scripts/monochrome_python_tests.py +//third_party/catapult/common/py_utils/py_utils/__init__.py +//third_party/catapult/common/py_utils/py_utils/cloud_storage.py +//third_party/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py +//third_party/catapult/common/py_utils/py_utils/lock.py +//third_party/catapult/dependency_manager/dependency_manager/__init__.py +//third_party/catapult/dependency_manager/dependency_manager/archive_info.py +//third_party/catapult/dependency_manager/dependency_manager/base_config.py +//third_party/catapult/dependency_manager/dependency_manager/cloud_storage_info.py +//third_party/catapult/dependency_manager/dependency_manager/dependency_info.py +//third_party/catapult/dependency_manager/dependency_manager/dependency_manager_util.py +//third_party/catapult/dependency_manager/dependency_manager/exceptions.py +//third_party/catapult/dependency_manager/dependency_manager/local_path_info.py +//third_party/catapult/dependency_manager/dependency_manager/manager.py +//third_party/catapult/dependency_manager/dependency_manager/uploader.py +//third_party/catapult/devil/devil/__init__.py +//third_party/catapult/devil/devil/android/__init__.py +//third_party/catapult/devil/devil/android/constants/__init__.py +//third_party/catapult/devil/devil/android/constants/chrome.py +//third_party/catapult/devil/devil/android/ndk/__init__.py +//third_party/catapult/devil/devil/android/ndk/abis.py +//third_party/catapult/devil/devil/android/sdk/__init__.py +//third_party/catapult/devil/devil/android/sdk/build_tools.py +//third_party/catapult/devil/devil/android/sdk/keyevent.py +//third_party/catapult/devil/devil/android/sdk/version_codes.py +//third_party/catapult/devil/devil/base_error.py +//third_party/catapult/devil/devil/constants/__init__.py +//third_party/catapult/devil/devil/constants/exit_codes.py +//third_party/catapult/devil/devil/devil_env.py +//third_party/catapult/devil/devil/utils/__init__.py +//third_party/catapult/devil/devil/utils/cmd_helper.py +//third_party/catapult/devil/devil/utils/lazy/__init__.py +//third_party/catapult/devil/devil/utils/lazy/weak_constant.py +//third_party/catapult/devil/devil/utils/reraiser_thread.py +//third_party/catapult/devil/devil/utils/timeout_retry.py +//third_party/catapult/devil/devil/utils/watchdog_timer.py +//third_party/catapult/third_party/typ/typ/__init__.py +//third_party/catapult/third_party/typ/typ/arg_parser.py +//third_party/catapult/third_party/typ/typ/artifacts.py +//third_party/catapult/third_party/typ/typ/expectations_parser.py +//third_party/catapult/third_party/typ/typ/fakes/__init__.py +//third_party/catapult/third_party/typ/typ/fakes/host_fake.py +//third_party/catapult/third_party/typ/typ/host.py +//third_party/catapult/third_party/typ/typ/json_results.py +//third_party/catapult/third_party/typ/typ/pool.py +//third_party/catapult/third_party/typ/typ/printer.py +//third_party/catapult/third_party/typ/typ/python_2_3_compat.py +//third_party/catapult/third_party/typ/typ/runner.py +//third_party/catapult/third_party/typ/typ/stats.py +//third_party/catapult/third_party/typ/typ/test_case.py +//third_party/catapult/third_party/typ/typ/version.py +//third_party/catapult/third_party/zipfile/zipfile_2_7_13.py
diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp index 931128cd..1671478 100644 --- a/chrome/app/extensions_strings.grdp +++ b/chrome/app/extensions_strings.grdp
@@ -406,6 +406,9 @@ <message name="IDS_EXTENSIONS_TYPE_A_SHORTCUT" desc="The prompt to the user to enter a keyboard shortcut in order to assign it to an extension."> Type a shortcut </message> + <message name="IDS_EXTENSIONS_SUBPAGE_BUTTON" is_accessibility_with_no_ui="true" desc="Accessibility description for a button navigating the user from an extension's settings page to its settings subpage."> + Subpage button + </message> <if expr="is_macosx"> <message name="IDS_EXTENSIONS_INCLUDE_START_MODIFIER" desc="Error message explaining that shortcuts must start with either the Control, Alt, or Command key."> Include Ctrl, Alt, or ⌘
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index f553d04..6225639 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Jou administrateur<ph name="END_LINK" /> het Chromium se kontrolering vir skadelike sagteware gedeaktiveer</translation> <translation id="2799223571221894425">Begin weer</translation> <translation id="2847479871509788944">Verwyder uit Chromium …</translation> -<translation id="2853765747879685679">Vra wanneer ek Chromium oopmaak</translation> <translation id="2885378588091291677">Taakbestuurder</translation> <translation id="2910007522516064972">Meer oor Chromium</translation> <translation id="2977470724722393594">Chromium is op datum</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (na Chromium gekopieer)</translation> <translation id="6893813176749746474">Chromium is opgedateer, maar jy het dit vir minstens 30 dae nie gebruik nie.</translation> <translation id="6964305034639999644">Maak skakel in 'n incognitovenster in Chromium oop</translation> +<translation id="6978145336957848883">Swak wagwoorde is maklik om te raai. Laat Chromium <ph name="BEGIN_LINK" />sterk wagwoorde vir jou skep en onthou<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium het toestemming nodig om toegang te kry tot jou mikrofoon vir hierdie werf</translation> <translation id="701244094609242530">Chromium kan nie jou uitbreidings nagaan nie. Probeer later weer.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium het nie enige bekende skadelike sagteware op jou rekenaar gekry nie. Laas nagegaan: 1 uur gelede.}other{Chromium het nie enige bekende skadelike sagteware op jou rekenaar gekry nie. Laas nagegaan: {NUM_HOURS} uur gelede.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 3bd6fbd..0f337055 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />የእርስዎ አስተዳዳሪ<ph name="END_LINK" /> ለጎጂ ሶፍትዌር የChromiumን ፍተሻ አሰናክሏል</translation> <translation id="2799223571221894425">ዳግም አስጀምር</translation> <translation id="2847479871509788944">ከChromium አስወግድ...</translation> -<translation id="2853765747879685679">Chromiumን ስከፍት ጠይቅ</translation> <translation id="2885378588091291677">ተግባር መሪ</translation> <translation id="2910007522516064972">ስለ &Chromium</translation> <translation id="2977470724722393594">Chromium የተዘመነ ነው</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (ወደ Chromium ተቀድቷል)</translation> <translation id="6893813176749746474">Chromium ተዘምኗል፣ ግን ቢያንስ ለ30 ቀኖች አልተጠቀሙበትም።</translation> <translation id="6964305034639999644">አገናኙን በChromium ማን&ነትን በማያሳውቅ መስኮት ውስጥ ክፈት</translation> +<translation id="6978145336957848883">ደካማ የይለፍ ቃላት ለመገመት ቀላል ናቸው። Chromium <ph name="BEGIN_LINK" /> ለእርስዎ ጠንካራ የይለፍ ቃላትን እንዲፈጥር እና እንዲያስታውስ<ph name="END_LINK" /> ይፍቀዱ።</translation> <translation id="6990124437352146030">Chromium ለዚህ ጣቢያ የእርስዎን ማይክሮፎን ለመድረስ ፈቃድ ያስፈልገዋል</translation> <translation id="701244094609242530">Chromium የእርስዎን ቅጥያዎች መፈተሽ አይችልም። ቆይተው እንደገና ይሞክሩ።</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium በኮምፒውተርዎ ላይ ያለውን የሚታወቁ ጎጂ ሶፍትዌሮችን አላገኘም። መጨረሻ የተፈተሸው፦ ከ1 ሰዓት በፊት።}one{Chromium በኮምፒውተርዎ ላይ ያለውን የሚታወቁ ጎጂ ሶፍትዌሮችን አላገኘም። መጨረሻ የተፈተሸው፦ ከ{NUM_HOURS} ሰዓቶች በፊት።}other{Chromium በኮምፒውተርዎ ላይ ያለውን የሚታወቁ ጎጂ ሶፍትዌሮችን አላገኘም። መጨረሻ የተፈተሸው፦ ከ{NUM_HOURS} ሰዓቶች በፊት።}}</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index 4a041b4..3fd1d76 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058">لقد أوقف <ph name="BEGIN_LINK" />المشرف<ph name="END_LINK" /> ميزة "التحقُّق من البرامج الضارّة" في متصفِّح Chromium.</translation> <translation id="2799223571221894425">إعادة تشغيل</translation> <translation id="2847479871509788944">إزالة من Chromium</translation> -<translation id="2853765747879685679">السؤال عند فتح Chromium</translation> <translation id="2885378588091291677">إدارة المهام</translation> <translation id="2910007522516064972">حو&ل Chromium</translation> <translation id="2977470724722393594">Chromium محدّث</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index 9e0d063..0c7aa17 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />আপোনাৰ প্ৰশাসকে<ph name="END_LINK" />Chromiumৰ ক্ষতিকাৰক ছফ্টৱেৰ আছেনে নাই পৰীক্ষা কৰাৰ সুবিধাটো অক্ষম কৰিছে</translation> <translation id="2799223571221894425">পুনৰ লঞ্চ কৰক</translation> <translation id="2847479871509788944">Chromiumৰপৰা আঁতৰাওক...</translation> -<translation id="2853765747879685679">মই Chromium খুলিলে সোধক</translation> <translation id="2885378588091291677">কাৰ্য পৰিচালক</translation> <translation id="2910007522516064972">&Chromiumৰ বিষয়ে</translation> <translation id="2977470724722393594">Chromium একেবাৰে শেহতীয়া অৱস্থাত আছে</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index b9c8c55..e4ba51bc 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratorunuz<ph name="END_LINK" /> Chromium'un zərərli proqramların olub-olmamasını yoxlamasını deaktiv edib</translation> <translation id="2799223571221894425">Yenidən başladın</translation> <translation id="2847479871509788944">Chromium'dan silin...</translation> -<translation id="2853765747879685679">Chromium'u açdığım zaman soruşulsun</translation> <translation id="2885378588091291677">Tapşırıq Meneceri</translation> <translation id="2910007522516064972">Chromium haqqında</translation> <translation id="2977470724722393594">Chromium güncəldir</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 7e660b3..4d9e56b 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Адміністратар<ph name="END_LINK" /> адключыў у браўзеры Chromium функцыю праверкі наяўнасці шкоднага праграмнага забеспячэння</translation> <translation id="2799223571221894425">Перазапусціць</translation> <translation id="2847479871509788944">Выдаліць з Chromium...</translation> -<translation id="2853765747879685679">Пытацца, калі я адкрываю Chromium</translation> <translation id="2885378588091291677">Менеджар заданняў</translation> <translation id="2910007522516064972">Пра &Chromium</translation> <translation id="2977470724722393594">Chromium абноўлены</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index 797c210..9d6ee21c 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Администраторът ви<ph name="END_LINK" /> е деактивирал функцията на Chromium за проверка за опасен софтуер</translation> <translation id="2799223571221894425">Стартиране отново</translation> <translation id="2847479871509788944">Премахване от Chromium...</translation> -<translation id="2853765747879685679">Запитване, когато отворя Chromium</translation> <translation id="2885378588091291677">Диспечер на задачите</translation> <translation id="2910007522516064972">Всичко за &Chromium</translation> <translation id="2977470724722393594">Chromium е актуален</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 1bc1945..58ec401 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -46,7 +46,6 @@ <translation id="2770231113462710648">ডিফল্ট ব্রাউজার এতে পরিবর্তন করুন:</translation> <translation id="2799223571221894425">পুনঃশুরু</translation> <translation id="2847479871509788944">Chromium থেকে সরান...</translation> -<translation id="2853765747879685679">আমি Chromium খুললে জিজ্ঞাসা করো</translation> <translation id="2885378588091291677">কার্য পরিচালক</translation> <translation id="2910007522516064972">&Chromium সম্পর্কে</translation> <translation id="2977470724722393594">Chromium আপ-টু-ডেট আছে</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index dfb7befc..3a696be 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Vaš administrator<ph name="END_LINK" /> je onemogućio Chromiumovu provjeru prisutnosti štetnog softvera</translation> <translation id="2799223571221894425">Ponovo pokreni</translation> <translation id="2847479871509788944">Ukloni iz Chromiuma...</translation> -<translation id="2853765747879685679">Traži odobrenje kada otvorim Chromium</translation> <translation id="2885378588091291677">Upravitelj zadataka</translation> <translation id="2910007522516064972">O &Chromiumu</translation> <translation id="2977470724722393594">Chromium je ažuriran</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (kopirano u Chromium)</translation> <translation id="6893813176749746474">Chromium je ažuriran, ali ga niste koristili najmanje 30 dana.</translation> <translation id="6964305034639999644">Otvori link u anonim&nom prozoru Chromiuma</translation> +<translation id="6978145336957848883">Slabe zaporke lako je pogoditi. Neka Chromium <ph name="BEGIN_LINK" />izradi i zapamti snažne zaporke za vas<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium treba dopuštenje za pristup mikrofonu za ovu web-lokaciju</translation> <translation id="701244094609242530">Chromium ne može provjeravati vaše ekstenzije. Pokušajte ponovo kasnije.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium nije pronašao nijedan poznati štetni softver na vašem računaru. Posljednja provjera: prije 1 sat.}one{Chromium nije pronašao nijedan poznati štetni softver na vašem računaru. Posljednja provjera: prije {NUM_HOURS} sat.}few{Chromium nije pronašao nijedan poznati štetni softver na vašem računaru. Posljednja provjera: prije {NUM_HOURS} sata.}other{Chromium nije pronašao nijedan poznati štetni softver na vašem računaru. Posljednja provjera: prije {NUM_HOURS} sati.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 28633cf..ea09d80 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />L'administrador<ph name="END_LINK" /> ha desactivat la comprovació de programari nociu de Chromium</translation> <translation id="2799223571221894425">Reinicia</translation> <translation id="2847479871509788944">Suprimeix de Chromium...</translation> -<translation id="2853765747879685679">Pregunta'm quan obri Chromium</translation> <translation id="2885378588091291677">Gestor de tasques</translation> <translation id="2910007522516064972">Quant a &Chromium</translation> <translation id="2977470724722393594">Chromium està actualitzat</translation> @@ -184,6 +183,7 @@ <translation id="6863361426438995919">Google Pay (copiada a Chromium)</translation> <translation id="6893813176749746474">S'ha actualitzat Chromium, però fa almenys 30 dies que no l'heu utilitzat.</translation> <translation id="6964305034639999644">Obre l'enllaç en una finestra d'incò&gnit a Chromium</translation> +<translation id="6978145336957848883">Les contrasenyes poc segures són fàcils d'endevinar. Deixa que Chromium <ph name="BEGIN_LINK" />creï i recordi contrasenyes segures en nom teu<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Per visitar aquest lloc web, Chromium necessita permís per accedir al micròfon</translation> <translation id="701244094609242530">Chromium no pot comprovar les teves extensions. Torna-ho a provar més tard.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium no ha trobat programari nociu conegut a l'ordinador. Darrera comprovació: fa 1 hora.}other{Chromium no ha trobat programari nociu conegut a l'ordinador. Darrera comprovació: fa {NUM_HOURS} hores.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index d5257f2..729e96a 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Váš administrátor<ph name="END_LINK" /> kontrolu škodlivého softwaru pomocí prohlížeče Chromium zakázal</translation> <translation id="2799223571221894425">Restartovat</translation> <translation id="2847479871509788944">Odstranit z prohlížeče Chromium...</translation> -<translation id="2853765747879685679">Při otevření prohlížeče Chromium se zeptat</translation> <translation id="2885378588091291677">Správce úloh</translation> <translation id="2910007522516064972">O prohlížeči &Chromium</translation> <translation id="2977470724722393594">Chromium je aktuální</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 9be6b66..83334087 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Din administrator<ph name="END_LINK" /> har deaktiveret Chromiums scanning efter skadelig software</translation> <translation id="2799223571221894425">Genstart</translation> <translation id="2847479871509788944">Fjern fra Chromium...</translation> -<translation id="2853765747879685679">Spørg, når jeg åbner Chromium</translation> <translation id="2885378588091291677">Jobliste</translation> <translation id="2910007522516064972">Om &Chromium</translation> <translation id="2977470724722393594">Chromium er opdateret</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 454ecc0f..0ced235 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Ihr Administrator<ph name="END_LINK" /> hat die Prüfung auf schädliche Software in Chromium deaktiviert</translation> <translation id="2799223571221894425">Neu starten</translation> <translation id="2847479871509788944">Aus Chromium entfernen...</translation> -<translation id="2853765747879685679">Fragen, wenn ich Chromium öffne</translation> <translation id="2885378588091291677">Task-Manager</translation> <translation id="2910007522516064972">Über &Chromium</translation> <translation id="2977470724722393594">Chromium ist auf dem neuesten Stand</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index 0692212..2bd905d 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Ο διαχειριστής<ph name="END_LINK" /> έχει απενεργοποιήσει τον έλεγχο του Chromium για επιβλαβές λογισμικό</translation> <translation id="2799223571221894425">Επανεκκίνηση</translation> <translation id="2847479871509788944">Κατάργηση από το Chromium…</translation> -<translation id="2853765747879685679">Να γίνεται ερώτηση όταν ανοίγω το Chromium</translation> <translation id="2885378588091291677">Διαχείριση εργασιών</translation> <translation id="2910007522516064972">Σχετικά με το &Chromium</translation> <translation id="2977470724722393594">Το Chromium έχει ενημερωθεί</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 35555597..14b69980 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Your administrator<ph name="END_LINK" /> has disabled Chromium's check for harmful software</translation> <translation id="2799223571221894425">Relaunch</translation> <translation id="2847479871509788944">Remove from Chromium...</translation> -<translation id="2853765747879685679">Ask when I open Chromium</translation> <translation id="2885378588091291677">Task Manager</translation> <translation id="2910007522516064972">About &Chromium</translation> <translation id="2977470724722393594">Chromium is up to date</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 8bb6d81..24a64ae 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Tu administrador<ph name="END_LINK" /> inhabilitó la opción de búsqueda de software dañino de Chromium</translation> <translation id="2799223571221894425">Reiniciar</translation> <translation id="2847479871509788944">Eliminar de Chromium…</translation> -<translation id="2853765747879685679">Preguntar al abrir Chromium</translation> <translation id="2885378588091291677">Administrador de tareas</translation> <translation id="2910007522516064972">Acerca de &Chromium</translation> <translation id="2977470724722393594">Chromium está actualizado.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index c3298dc..55a219a 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Tu administrador<ph name="END_LINK" /> ha inhabilitado la comprobación de Chromium de software dañino</translation> <translation id="2799223571221894425">Reiniciar</translation> <translation id="2847479871509788944">Desinstalar de Chromium...</translation> -<translation id="2853765747879685679">Preguntar cuando abra Chromium</translation> <translation id="2885378588091291677">Administrador de tareas</translation> <translation id="2910007522516064972">Información de &Chromium</translation> <translation id="2977470724722393594">Chromium está actualizado</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (copiada en Chromium)</translation> <translation id="6893813176749746474">Chromium se ha actualizado, pero llevas al menos 30 días sin utilizarlo.</translation> <translation id="6964305034639999644">Abrir enlace en una ventana de incó&gnito de Chromium</translation> +<translation id="6978145336957848883">Las contraseñas poco seguras son fáciles de adivinar. Permite que Chromium <ph name="BEGIN_LINK" />cree y recuerde contraseñas seguras por ti<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium necesita permiso para acceder al micrófono en este sitio web</translation> <translation id="701244094609242530">Chromium no puede comprobar tus extensiones. Vuelve a intentarlo más tarde.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium no ha detectado ningún software dañino conocido en tu ordenador. Última comprobación: hace 1 hora.}other{Chromium no ha detectado ningún software dañino conocido en tu ordenador. Última comprobación: hace {NUM_HOURS} horas.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index 6157254..d16eb1d 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administraator<ph name="END_LINK" /> keelas Chromiumil kahjuliku tarkvara otsimise</translation> <translation id="2799223571221894425">Taaskäivita</translation> <translation id="2847479871509788944">Chromiumist eemaldamine ...</translation> -<translation id="2853765747879685679">Küsi, kui ma Chromiumi avan</translation> <translation id="2885378588091291677">Tegumihaldur</translation> <translation id="2910007522516064972">Teave &Chromiumi kohta</translation> <translation id="2977470724722393594">Chromium on ajakohane</translation> @@ -184,6 +183,7 @@ <translation id="6863361426438995919">Google Pay (kopeeritud Chromiumi)</translation> <translation id="6893813176749746474">Chromiumi on värskendatud, kuid te ei ole seda kasutanud vähemalt 30 päeva.</translation> <translation id="6964305034639999644">Ava link Chromiumi inko&gnito aknas</translation> +<translation id="6978145336957848883">Nõrku paroole on lihtne ära arvata. Laske Chromiumil <ph name="BEGIN_LINK" />teie jaoks luua ja meelde jätta tugevaid paroole<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium vajab selle saidi puhul luba, et teie mikrofonile juurde pääseda</translation> <translation id="701244094609242530">Chromium ei saa teie laiendusi kontrollida. Proovige hiljem uuesti.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium ei leidnud teie arvutist teadaolevalt kahjulikku tarkvara. Viimati kontrolliti: 1 tund tagasi.}other{Chromium ei leidnud teie arvutist teadaolevalt kahjulikku tarkvara. Viimati kontrolliti: {NUM_HOURS} tundi tagasi.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 5914a79..9f8195d9 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratzaileak<ph name="END_LINK" /> desgaitu egin du software kaltegarria bilatzeko Chromium-en eginbidea</translation> <translation id="2799223571221894425">Abiarazi berriro</translation> <translation id="2847479871509788944">Kendu Chromium-etik…</translation> -<translation id="2853765747879685679">Galdetu Chromium irekitzen dudanean</translation> <translation id="2885378588091291677">Zereginen kudeatzailea</translation> <translation id="2910007522516064972">&Chromium arakatzaileari buruz</translation> <translation id="2977470724722393594">Eguneratuta dago Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index ac76690..25c3a7e 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />سرپرستتان<ph name="END_LINK" /> بررسی نرمافزارهای مضر توسط Chromium را غیرفعال کرده است</translation> <translation id="2799223571221894425">راهاندازی مجدد</translation> <translation id="2847479871509788944">حذف از Chromium...</translation> -<translation id="2853765747879685679">وقتی Chromium را باز میکنم سؤال شود</translation> <translation id="2885378588091291677">مدیر فعالیتها</translation> <translation id="2910007522516064972">درباره &Chromium</translation> <translation id="2977470724722393594">Chromium بهروز است</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 829e908..a362e19 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Järjestelmänvalvoja<ph name="END_LINK" /> on poistanut käytöstä Chromiumin suorittaman haittaohjelmatarkistuksen</translation> <translation id="2799223571221894425">Käynnistä uudelleen</translation> <translation id="2847479871509788944">Poista Chromiumista…</translation> -<translation id="2853765747879685679">Kysy, kun avaan Chromiumin</translation> <translation id="2885378588091291677">Tehtävänhallinta</translation> <translation id="2910007522516064972">Tietoja &Chromiumista</translation> <translation id="2977470724722393594">Chromium on ajan tasalla.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 5c2f9f1..d4f88db 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058">Na-disable ng <ph name="BEGIN_LINK" />iyong administrator<ph name="END_LINK" /> ang pagsusuri ng Chromium para sa mapaminsalang software</translation> <translation id="2799223571221894425">Ilunsad Muli</translation> <translation id="2847479871509788944">Alisin sa Chromium...</translation> -<translation id="2853765747879685679">Magtanong kapag binuksan ko ang Chromium</translation> <translation id="2885378588091291677">Task Manager</translation> <translation id="2910007522516064972">Tungkol sa &Chromium</translation> <translation id="2977470724722393594">Napapanahon ang Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb index e9cf9c1e..dcb7683e 100644 --- a/chrome/app/resources/chromium_strings_fr-CA.xtb +++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Votre administrateur<ph name="END_LINK" /> a désactivé la fonctionnalité de vérification de logiciels nuisibles de Chromium</translation> <translation id="2799223571221894425">Redémarrer</translation> <translation id="2847479871509788944">Supprimer de Chromium...</translation> -<translation id="2853765747879685679">Me demander quand j'ouvre Chromium</translation> <translation id="2885378588091291677">Moniteur d'activité</translation> <translation id="2910007522516064972">À propos de &Chromium</translation> <translation id="2977470724722393594">Chromium est à jour</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index 6813d62..af39ef5 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -48,7 +48,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Votre administrateur<ph name="END_LINK" /> a désactivé la détection des logiciels malveillants par Chromium</translation> <translation id="2799223571221894425">Relancer</translation> <translation id="2847479871509788944">Supprimer de Chromium</translation> -<translation id="2853765747879685679">Me demander quand j'ouvre Chromium</translation> <translation id="2885378588091291677">Gestionnaire de tâches</translation> <translation id="2910007522516064972">À propos de &Chromium</translation> <translation id="2977470724722393594">Chromium est à jour</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index da66022..b947898 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />O teu administrador<ph name="END_LINK" /> desactivou a comprobación de software daniño de Chromium</translation> <translation id="2799223571221894425">Iniciar de novo</translation> <translation id="2847479871509788944">Eliminar de Chromium...</translation> -<translation id="2853765747879685679">Preguntar cando abra Chromium</translation> <translation id="2885378588091291677">Xestor de tarefas</translation> <translation id="2910007522516064972">Acerca de &Chromium</translation> <translation id="2977470724722393594">Chromium está actualizado</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index ddb730c..5244ff6 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />તમારા વ્યવસ્થાપક<ph name="END_LINK" /> દ્વારા Chromiumની હાનિકારક સૉફ્ટવેર ચેક કરવાની સુવિધા બંધ કરવામાં આવી છે</translation> <translation id="2799223571221894425">ફરીથી લોંચ કરો</translation> <translation id="2847479871509788944">Chromium માંથી દૂર કરો...</translation> -<translation id="2853765747879685679">હું Chromium ખોલું ત્યારે પૂછો</translation> <translation id="2885378588091291677">કાર્ય વ્યવસ્થાપક</translation> <translation id="2910007522516064972">&Chromium વિશે</translation> <translation id="2977470724722393594">Chromium અપ ટૂ ડેટ છે</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index c2b45fe..c35e7b1 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />आपके एडमिन<ph name="END_LINK" /> ने नुकसान पहुंचाने वाले सॉफ़्टवेयर की जांच करने की, क्रोमियम की सुविधा को बंद कर दिया है</translation> <translation id="2799223571221894425">फिर से लॉन्च करें</translation> <translation id="2847479871509788944">क्रोमियम से निकालें...</translation> -<translation id="2853765747879685679">जब मैं क्रोमियम खोलूं, तब यह सवाल पूछें</translation> <translation id="2885378588091291677">काम का प्रबंधक</translation> <translation id="2910007522516064972">&क्रोमियम के बारे में</translation> <translation id="2977470724722393594">क्रोमियम अप टू डेट है</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 2d94784..e2fd76ec 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Vaš administrator<ph name="END_LINK" /> onemogućio je Chromiumovu provjeru štetnog softvera</translation> <translation id="2799223571221894425">Pokreni ponovo</translation> <translation id="2847479871509788944">Ukloni iz Chromiuma...</translation> -<translation id="2853765747879685679">Pitaj kada otvorim Chromium</translation> <translation id="2885378588091291677">Upravitelj zadataka</translation> <translation id="2910007522516064972">O pregledniku &Chromium</translation> <translation id="2977470724722393594">Chromium je ažuran</translation> @@ -184,6 +183,7 @@ <translation id="6863361426438995919">Google Pay (kopirano na Chromium)</translation> <translation id="6893813176749746474">Chromium je ažuriran, ali vi ga niste upotrebljavali najmanje 30 dana.</translation> <translation id="6964305034639999644">Otvori vezu u ano&nimnom prozoru Chromiuma</translation> +<translation id="6978145336957848883">Slabe zaporke lako je pogoditi. Neka Chromium <ph name="BEGIN_LINK" />izradi i zapamti snažne zaporke za vas<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium treba dopuštenje za pristup mikrofonu za ovu web-lokaciju</translation> <translation id="701244094609242530">Chromium ne može provjeriti vaša proširenja. Pokušajte ponovno kasnije.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium nije pronašao poznati štetni softver na vašem računalu. Posljednja provjera bila je prije sat vremena.}one{Chromium nije pronašao poznati štetni softver na vašem računalu. Posljednja provjera bila je prije {NUM_HOURS} sat.}few{Chromium nije pronašao poznati štetni softver na vašem računalu. Posljednja provjera bila je prije {NUM_HOURS} sata.}other{Chromium nije pronašao poznati štetni softver na vašem računalu. Posljednja provjera bila je prije {NUM_HOURS} sati.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index a187849..10002a0c 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />A rendszergazda<ph name="END_LINK" /> kikapcsolta a Chromium kártékony szoftverek keresésére szolgáló funkcióját</translation> <translation id="2799223571221894425">Újraindítás</translation> <translation id="2847479871509788944">Eltávolítás a Chromiumból…</translation> -<translation id="2853765747879685679">Kérdezzen rá a Chromium megnyitásakor</translation> <translation id="2885378588091291677">Feladatkezelő</translation> <translation id="2910007522516064972">A &Chromium névjegye</translation> <translation id="2977470724722393594">A Chromium naprakész</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index 9b5ee6a4..34b85477 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Ձեր ադմինիստրատորն<ph name="END_LINK" /> անջատել է Chromium-ի՝ վնասաբեր ծրագրերի ստուգման գործառույթը</translation> <translation id="2799223571221894425">Վերագործարկել</translation> <translation id="2847479871509788944">Հեռացնել Chromium-ից...</translation> -<translation id="2853765747879685679">Հարցնել, երբ ես բացեմ Chromium-ը</translation> <translation id="2885378588091291677">Task Manager</translation> <translation id="2910007522516064972">&Chromium-ի մասին</translation> <translation id="2977470724722393594">Chromium-ը թարմացված է</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 45c768a..7827a66a 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administrator Anda<ph name="END_LINK" /> telah menonaktifkan pemeriksaan Chromium terhadap software berbahaya</translation> <translation id="2799223571221894425">Luncurkan Ulang</translation> <translation id="2847479871509788944">Buang dari Chromium...</translation> -<translation id="2853765747879685679">Tanyakan saat saya membuka Chromium</translation> <translation id="2885378588091291677">Pengelola Tugas</translation> <translation id="2910007522516064972">Tentang &Chromium</translation> <translation id="2977470724722393594">Chromium sudah diperbarui</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb index a8d85f72..7f36261 100644 --- a/chrome/app/resources/chromium_strings_is.xtb +++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Kerfisstjórinn<ph name="END_LINK" /> slökkti á eiginleika Chromium til að finna skaðlegan hugbúnað</translation> <translation id="2799223571221894425">Endurræsa</translation> <translation id="2847479871509788944">Fjarlægja úr Chromium...</translation> -<translation id="2853765747879685679">Spyrja þegar ég opna Chromium</translation> <translation id="2885378588091291677">Verkstjórn</translation> <translation id="2910007522516064972">Um &Chromium</translation> <translation id="2977470724722393594">Chromium er uppfært</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index b220e642..674d40e 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />L'amministratore<ph name="END_LINK" /> ha disattivato il controllo della presenza di software dannoso in Chromium</translation> <translation id="2799223571221894425">Riavvia</translation> <translation id="2847479871509788944">Rimuovi da Chromium...</translation> -<translation id="2853765747879685679">Chiedi all'apertura di Chromium</translation> <translation id="2885378588091291677">Task Manager</translation> <translation id="2910007522516064972">Informazioni su &Chromium</translation> <translation id="2977470724722393594">Chromium è aggiornato</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 0e6e0305..6a38378 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />מנהל המערכת<ph name="END_LINK" /> השבית את הבדיקה של Chromium לאיתור תוכנות מזיקות</translation> <translation id="2799223571221894425">הפעל מחדש</translation> <translation id="2847479871509788944">הסר מ-Chromium...</translation> -<translation id="2853765747879685679">הצגת שאלה בפתיחה של Chromium</translation> <translation id="2885378588091291677">מנהל המשימות</translation> <translation id="2910007522516064972">מידע על &Chromium</translation> <translation id="2977470724722393594">Chromium מעודכן</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index 719cb37..9b73fb32 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058">Chromium による有害なソフトウェアの確認は、<ph name="BEGIN_LINK" />管理者<ph name="END_LINK" />によって無効にされています</translation> <translation id="2799223571221894425">再起動</translation> <translation id="2847479871509788944">Chromium から削除...</translation> -<translation id="2853765747879685679">Chromium を開くときに確認する</translation> <translation id="2885378588091291677">タスク マネージャ</translation> <translation id="2910007522516064972">Chromium について(&C)</translation> <translation id="2977470724722393594">Chromium は最新版です</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index 35a3696..868c5a9a 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />თქვენმა ადმინისტრატორმა<ph name="END_LINK" /> გათიშა Chromium-ის მიერ საზიანო პროგრამული უზრუნველყოფის შემოწმების ფუნქცია</translation> <translation id="2799223571221894425">ხელახლა გაშვება</translation> <translation id="2847479871509788944">Chromium-იდან ამოღება...</translation> -<translation id="2853765747879685679">შეკითხვა Chromium-ის გახსნისას</translation> <translation id="2885378588091291677">ამოცანების მმართველი</translation> <translation id="2910007522516064972">Chromium-ის შ&ესახებ</translation> <translation id="2977470724722393594">Chromium განახლებულია</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb index fe74ec5..8fef9e6 100644 --- a/chrome/app/resources/chromium_strings_kk.xtb +++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Әкімшіңіз<ph name="END_LINK" /> Chromium браузерінің зиянды бағдарламалық құралдың бар-жоғын тексеру функциясын өшіріп қойған.</translation> <translation id="2799223571221894425">Қайта іске қосу</translation> <translation id="2847479871509788944">Chromium жүйесінен алып тастау…</translation> -<translation id="2853765747879685679">Chromium браузерін ашқанда сұрасын</translation> <translation id="2885378588091291677">Тапсырмалар реттегіші</translation> <translation id="2910007522516064972">&Chromium туралы</translation> <translation id="2977470724722393594">Chromium жаңартылған</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index c4cb3600..435de40a 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />អ្នកគ្រប់គ្រងរបស់អ្នក<ph name="END_LINK" />បានបិទការពិនិត្យរកកម្មវិធីបង្កគ្រោះថ្នាក់របស់ Chromium</translation> <translation id="2799223571221894425">បើកដំណើរការឡើងវិញ</translation> <translation id="2847479871509788944">ដកចេញពី Chromium...</translation> -<translation id="2853765747879685679">សួរនៅពេលខ្ញុំបើក Chromium</translation> <translation id="2885378588091291677">កម្មវិធីគ្រប់គ្រងភារកិច្ច</translation> <translation id="2910007522516064972">អំពី Chromium</translation> <translation id="2977470724722393594">Chromium នេះជាកំណែថ្មីហើយ</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index bb9cc32..e736b4f 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />ನಿಮ್ಮ ನಿರ್ವಾಹಕರು <ph name="END_LINK" /> Chromium ನ ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಪರಿಶೀಲಿಸುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation> <translation id="2799223571221894425">ಮರುಪ್ರಾರಂಭಿಸು</translation> <translation id="2847479871509788944">Chromium ನಿಂದ ತೆಗೆದುಹಾಕಿ...</translation> -<translation id="2853765747879685679">ನಾನು Chromium ಅನ್ನು ತೆರೆದಾಗ ಕೇಳಿ</translation> <translation id="2885378588091291677">ಕಾರ್ಯ ನಿರ್ವಾಹಕ</translation> <translation id="2910007522516064972">&Chromium ಕುರಿತು</translation> <translation id="2977470724722393594">Chromium ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index e9201a55..0003d0ce 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />관리자<ph name="END_LINK" />가 Chromium의 유해 소프트웨어 확인을 사용 중지했습니다.</translation> <translation id="2799223571221894425">다시 시작</translation> <translation id="2847479871509788944">Chromium에서 제거...</translation> -<translation id="2853765747879685679">Chromium을 열 때 확인</translation> <translation id="2885378588091291677">작업 관리자</translation> <translation id="2910007522516064972">Chromium 정보</translation> <translation id="2977470724722393594">Chromium이 최신 버전임</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index d34764e3..d3abe3b 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Администраторуңуз<ph name="END_LINK" /> Chromium'дун кооптуу программаларды текшерүү функциясын өчүрүп койгон</translation> <translation id="2799223571221894425">Кайра ишке киргизүү</translation> <translation id="2847479871509788944">Chromium'дан чыгарып салуу…</translation> -<translation id="2853765747879685679">Chromium'ду ачканда суралсын</translation> <translation id="2885378588091291677">Тапшырмаларды башкаргыч</translation> <translation id="2910007522516064972">&Chromium жөнүндө</translation> <translation id="2977470724722393594">Chromium жаңыртылган</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index e06398f..8d89c0d0 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ<ph name="END_LINK" /> ໄດ້ປິດການນຳໃຊ້ການກວດຫາຊອບແວອັນຕະລາຍຂອງ Chromium ແລ້ວ</translation> <translation id="2799223571221894425">ເລີ່ມເປີດໃຊ້ໃໝ່</translation> <translation id="2847479871509788944">ເອົາອອກຈາກ Chromium...</translation> -<translation id="2853765747879685679">ຖາມເມື່ອຂ້ອຍເປີດ Chromium</translation> <translation id="2885378588091291677">ຕົວຈັດການໜ້າວຽກ</translation> <translation id="2910007522516064972">ກ່ຽວກັບ Chromium</translation> <translation id="2977470724722393594">Chromium ແມ່ນເວີຊັນໃໝ່ຫຼ້າສຸດແລ້ວ</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (ສຳເນົາໄວ້ໃນ Chromium ແລ້ວ)</translation> <translation id="6893813176749746474">ອັບເດດ Chromium ແລ້ວ, ແຕ່ທ່ານບໍ່ໄດ້ໃຊ້ມັນເປັນເວລາຢ່າງໜ້ອຍ 30 ວັນແລ້ວ.</translation> <translation id="6964305034639999644">ເປີດລິ້ງໃນໜ້າຈໍທີ່ບໍ່ເຜີຍຕົວຕົນຂອງ Chromium</translation> +<translation id="6978145336957848883">ລະຫັດຜ່ານງ່າຍແມ່ນລະຫັດຜ່ານທີ່ເດົາໄດ້ງ່າຍ. ອະນຸຍາດໃຫ້ Chromium <ph name="BEGIN_LINK" />ສ້າງ ແລະ ຈື່ລະຫັດຜ່ານຍາກສຳລັບທ່ານ<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium ຕ້ອງການການອະນຸຍາດເພື່ອເຂົ້າເຖິງໄມໂຄຣໂຟນຂອງທ່ານສຳລັບເວັບໄຊນີ້</translation> <translation id="701244094609242530">Chromium ບໍ່ສາມາດກວດສ່ວນຂະຫຍາຍຂອງທ່ານໄດ້. ກະລຸນາລອງໃໝ່ໃນພາຍຫລັງ.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium ບໍ່ພົບຊອບແວອັນຕະລາຍທີ່ຮູ້ຈັກໃນຄອມພິວເຕີຂອງທ່ານ. ກວດຄັ້ງຫຼ້າສຸດ: 1 ຊົ່ວໂມງກ່ອນ.}other{Chromium ບໍ່ພົບຊອບແວອັນຕະລາຍທີ່ຮູ້ຈັກໃນຄອມພິວເຕີຂອງທ່ານ. ກວດຄັ້ງຫຼ້າສຸດ: {NUM_HOURS} ຊົ່ວໂມງກ່ອນ.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 3cc1d21..1c2081df 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratorius<ph name="END_LINK" /> išjungė „Chromium“ žalingos programinės įrangos tikrinimo funkciją</translation> <translation id="2799223571221894425">Paleisti iš naujo</translation> <translation id="2847479871509788944">Pašalinti iš „Chromium“...</translation> -<translation id="2853765747879685679">Klausti, kai atidarau „Chromium“</translation> <translation id="2885378588091291677">Užduočių tvarkytuvė</translation> <translation id="2910007522516064972">Apie &„Chromium“</translation> <translation id="2977470724722393594">„Chromium“ naujausios versijos</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index 4950ed82b..80078e0 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Jūsu administrators<ph name="END_LINK" /> ir atspējojis Chromium pārbaudi kaitīgas programmatūras noteikšanai</translation> <translation id="2799223571221894425">Restartēt</translation> <translation id="2847479871509788944">Noņemšana no pārlūka Chromium...</translation> -<translation id="2853765747879685679">Jautāt, kad atveru pārlūku Chromium</translation> <translation id="2885378588091291677">Uzdevumu pārvaldnieks</translation> <translation id="2910007522516064972">Par &Chromium</translation> <translation id="2977470724722393594">Chromium ir atjaunināts</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index f01fc19..97df4b5 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Администраторот<ph name="END_LINK" /> оневозможил Chromium да проверува дали има штетен софтвер</translation> <translation id="2799223571221894425">Рестартирај</translation> <translation id="2847479871509788944">Отстрани од Chromium</translation> -<translation id="2853765747879685679">Прашувај кога ќе го отворам Chromium</translation> <translation id="2885378588091291677">Управник со задачи</translation> <translation id="2910007522516064972">За &Chromium</translation> <translation id="2977470724722393594">Chromium е ажуриран</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (копирана во Chromium)</translation> <translation id="6893813176749746474">Chromium се ажурираше, но не сте го употребиле најмалку 30 дена.</translation> <translation id="6964305034639999644">Отвори го линкот во инко&гнито прозорец на Chromium</translation> +<translation id="6978145336957848883">Слабите лозинки се лесни за погаѓање. Дозволете Chromium да ви <ph name="BEGIN_LINK" />создаде и запомни силни лозинки<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">На Chromium му треба дозвола за да пристапи до микрофонот за сајтов</translation> <translation id="701244094609242530">Chromium не може да ги провери вашите екстензии. Обидете се пак подоцна.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium не најде познат штетен софтвер на вашиот компјутер. Последна проверка: пред 1 час.}one{Chromium не најде познат штетен софтвер на вашиот компјутер. Последна проверка: пред {NUM_HOURS} час.}other{Chromium не најде познат штетен софтвер на вашиот компјутер. Последна проверка: пред {NUM_HOURS} часа.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 9562776..d4026760 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താനുള്ള Chromium-ന്റെ പരിശോധന, <ph name="BEGIN_LINK" />നിങ്ങളുടെ അഡ്മിൻ<ph name="END_LINK" /> പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="2847479871509788944">Chromium-ൽ നിന്ന് നീക്കംചെയ്യുക...</translation> -<translation id="2853765747879685679">ഞാൻ Chromium തുറക്കുമ്പോൾ ചോദിക്കുക</translation> <translation id="2885378588091291677">ടാസ്ക് മാനേജര്</translation> <translation id="2910007522516064972">&Chromium-നെക്കുറിച്ച്</translation> <translation id="2977470724722393594">Chromium അപ്ടുഡേറ്റാണ്</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index e9e78d1..8e7fef3 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Таны администратор<ph name="END_LINK" /> Chromium-н хортой программ хангамжийн шалгалтыг идэвхгүй болгосон байна</translation> <translation id="2799223571221894425">Дахин эхлүүлэх</translation> <translation id="2847479871509788944">Chromium-аас устгах ...</translation> -<translation id="2853765747879685679">Намайг Chromium-г нээх үед асуух</translation> <translation id="2885378588091291677">Асуудлын менежер</translation> <translation id="2910007522516064972">Chromium-ын тухай</translation> <translation id="2977470724722393594">Chromium-г шинэчилсэн байна</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index 3966bf7..5e6c522 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -48,7 +48,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />तुमच्या अॅडमिनिस्ट्रेटरने<ph name="END_LINK" /> Chromium ची हानिकारक सॉफ्टवेअरची तपासणी बंद केली आहे</translation> <translation id="2799223571221894425">पुन्हा लाँच करा</translation> <translation id="2847479871509788944">Chromium मधून काढून टाका...</translation> -<translation id="2853765747879685679">मी Chromium उघडल्यावर विचारा</translation> <translation id="2885378588091291677">टास्क मॅनेजर</translation> <translation id="2910007522516064972">&Chromium बद्दल</translation> <translation id="2977470724722393594">Chromium अद्ययावत आहे</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index 3e28b9d..c89088f0 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Pentadbir anda<ph name="END_LINK" /> telah melumpuhkan semakan Chromium untuk mengesan perisian berbahaya</translation> <translation id="2799223571221894425">Lancarkan semula</translation> <translation id="2847479871509788944">Alih keluar daripada Chromium...</translation> -<translation id="2853765747879685679">Tanya apabila saya membuka Chromium</translation> <translation id="2885378588091291677">Pengurus Tugas</translation> <translation id="2910007522516064972">Mengenai &Chromium</translation> <translation id="2977470724722393594">Chromium telah dikemas kini</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index 7655f97..d953ceb 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -50,7 +50,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />သင့်စီမံခန့်ခွဲသူ<ph name="END_LINK" /> က Chromium ၏ အန္တရာယ်ဆော့ဖ်ဝဲရှာဖွေမှုကို ပိတ်ထားသည်</translation> <translation id="2799223571221894425">ပြန်လည်ဖွင့်တင်ရန်</translation> <translation id="2847479871509788944">Chromium ထဲမှ ဖယ်ရှားရန်</translation> -<translation id="2853765747879685679">Chromium ကို ကျွန်ုပ်ဖွင့်လျှင်မေးရန်</translation> <translation id="2885378588091291677">အလုပ် မန်နေဂျာ</translation> <translation id="2910007522516064972">Chromium အကြောင်း</translation> <translation id="2977470724722393594">Chroumium ကို အပ်ဒိတ်လုပ်ထားပြီးပါပြီ</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index 1105e5a..1cec101 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />तपाईंका एड्मिन<ph name="END_LINK" />ले Chromium को हानिकारक सफ्टवेयर छन् कि छैनन् भनी जाँच गर्ने सुविधा असक्षम पार्नुभएको छ</translation> <translation id="2799223571221894425">पुन: सुरुवात गर्नुहोस्</translation> <translation id="2847479871509788944">Chromium बाट हटाउनुहोस् ...</translation> -<translation id="2853765747879685679">मैले Chromium खोल्दा सोधियोस्</translation> <translation id="2885378588091291677">कार्य व्यवस्थापक</translation> <translation id="2910007522516064972">&क्रोमियमको बारेमा</translation> <translation id="2977470724722393594">Chromium अद्यावधिक छ</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index a8883ae..095a782a 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Je beheerder<ph name="END_LINK" /> heeft de Chromium-check op schadelijke software uitgeschakeld</translation> <translation id="2799223571221894425">Opnieuw starten</translation> <translation id="2847479871509788944">Verwijderen uit Chromium…</translation> -<translation id="2853765747879685679">Vragen als ik Chromium open</translation> <translation id="2885378588091291677">Taakbeheer</translation> <translation id="2910007522516064972">Over &Chromium</translation> <translation id="2977470724722393594">Chromium is up-to-date</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index 48242f5..722b7bd 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratoren din<ph name="END_LINK" /> har slått av Chromium-funksjonen for skanning etter skadelig programvare</translation> <translation id="2799223571221894425">Start på nytt</translation> <translation id="2847479871509788944">Fjern fra Chromium</translation> -<translation id="2853765747879685679">Spør når jeg åpner Chromium</translation> <translation id="2885378588091291677">Oppgavebehandling</translation> <translation id="2910007522516064972">Om &Chromium</translation> <translation id="2977470724722393594">Chromium er oppdatert</translation> @@ -184,6 +183,7 @@ <translation id="6863361426438995919">Google Pay (kopiert til Chromium)</translation> <translation id="6893813176749746474">Chromium har blitt oppdatert, men du har ikke brukt den på minst 30 dager.</translation> <translation id="6964305034639999644">Åpne linken i et inko&gnitovindu i Chromium</translation> +<translation id="6978145336957848883">Svake passord er enkle å gjette. La Chromium <ph name="BEGIN_LINK" />opprette og huske sterke passord for deg<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium trenger tilgang til mikrofonen din for dette nettstedet</translation> <translation id="701244094609242530">Chromium kan ikke sjekke utvidelsene dine. Prøv igjen senere.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium fant ingen kjent skadelig programvare på datamaskinen. Sist sjekket for en time siden.}other{Chromium fant ingen kjent skadelig programvare på datamaskinen. Sist sjekket for {NUM_HOURS} timer siden.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb index 7875dc8..72c51d4 100644 --- a/chrome/app/resources/chromium_strings_or.xtb +++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍<ph name="END_LINK" /> କ୍ଷତିକାରକ ସଫ୍ଟୱେର୍ ପାଇଁ Chromiumର ଯାଞ୍ଚକୁ ଅକ୍ଷମ କରିଛନ୍ତି</translation> <translation id="2799223571221894425">ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ</translation> <translation id="2847479871509788944">Chromiumରୁ କାଢ଼ିଦିଅନ୍ତୁ...</translation> -<translation id="2853765747879685679">ମୁଁ Chromium ଖୋଲିଲେ ପଚାରନ୍ତୁ</translation> <translation id="2885378588091291677">ଟାସ୍କ ପରିଚାଳକ</translation> <translation id="2910007522516064972">&Chromium ବିଷୟରେ</translation> <translation id="2977470724722393594">Chromium ଅପ୍-ଟୁ-ଡେଟ୍ ଅଛି</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 3430fd9..cf0a790 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ<ph name="END_LINK" /> ਨੇ Chromium ਦੀ ਹਾਨੀਕਾਰਕ ਸਾਫ਼ਟਵੇਅਰ ਜਾਂਚ ਵਾਲੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ</translation> <translation id="2799223571221894425">ਰੀਲੌਂਚ ਕਰੋ</translation> <translation id="2847479871509788944">Chromium ਤੋਂ ਹਟਾਓ...</translation> -<translation id="2853765747879685679">ਮੇਰੇ ਵੱਲੋਂ Chromium ਨੂੰ ਖੋਲ੍ਹੇ ਜਾਣ 'ਤੇ ਪੁੱਛੋ</translation> <translation id="2885378588091291677">ਕੰਮ ਪ੍ਰਬੰਧਕ</translation> <translation id="2910007522516064972">&Chromium ਬਾਰੇ</translation> <translation id="2977470724722393594">Chromium ਅੱਪ ਟੂ ਡੇਟ ਹੈ</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index f2fc38af..a3f5ca21 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administrator<ph name="END_LINK" /> wyłączył w Chromium sprawdzanie, czy na komputerze nie ma szkodliwego oprogramowania</translation> <translation id="2799223571221894425">Uruchom ponownie</translation> <translation id="2847479871509788944">Usuń z Chromium...</translation> -<translation id="2853765747879685679">Pytaj, gdy otwieram Chromium</translation> <translation id="2885378588091291677">Menedżer zadań</translation> <translation id="2910007522516064972">&Chromium – informacje</translation> <translation id="2977470724722393594">Masz aktualną wersję Chromium</translation> @@ -182,6 +181,7 @@ <translation id="6863361426438995919">Google Pay (skopiowana do Chromium)</translation> <translation id="6893813176749746474">Przeglądarka Chromium została zaktualizowana, ale nie była przez Ciebie używana przez co najmniej 30 dni.</translation> <translation id="6964305034639999644">Otwórz link w oknie inco&gnito Chromium</translation> +<translation id="6978145336957848883">Słabe hasła są łatwe do odgadnięcia. Pozwól Chromium <ph name="BEGIN_LINK" />utworzyć i zapamiętać silne hasła<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium potrzebuje uprawnień dostępu do mikrofonu na tej stronie</translation> <translation id="701244094609242530">Chromium nie może sprawdzić Twoich rozszerzeń. Spróbuj później.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium nie udało się znaleźć znanego szkodliwego oprogramowania na komputerze. Sprawdzano: godzinę temu.}few{Chromium nie udało się znaleźć znanego szkodliwego oprogramowania na komputerze. Sprawdzano: {NUM_HOURS} godziny temu.}many{Chromium nie udało się znaleźć znanego szkodliwego oprogramowania na komputerze. Sprawdzano: {NUM_HOURS} godzin temu.}other{Chromium nie udało się znaleźć znanego szkodliwego oprogramowania na komputerze. Sprawdzano: {NUM_HOURS} godziny temu.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 965787e..dd5b808 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Seu administrador<ph name="END_LINK" /> desativou a verificação de softwares nocivos do Chromium</translation> <translation id="2799223571221894425">Reiniciar</translation> <translation id="2847479871509788944">Remover do Chromium</translation> -<translation id="2853765747879685679">Perguntar ao abrir o Chromium</translation> <translation id="2885378588091291677">Gerenciador de tarefas</translation> <translation id="2910007522516064972">Sobre o &Chromium</translation> <translation id="2977470724722393594">O Chromium está atualizado</translation> @@ -180,6 +179,7 @@ <translation id="6863361426438995919">Google Pay (copiado para o Chromium)</translation> <translation id="6893813176749746474">O Chromium foi atualizado, mas não é utilizado há pelo menos 30 dias.</translation> <translation id="6964305034639999644">Abrir link na janela &sem rastros do Chromium</translation> +<translation id="6978145336957848883">Senhas fracas são fáceis de adivinhar. Deixe o Chromium <ph name="BEGIN_LINK" />criar e guardar senhas fortes para você<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">O Chromium precisa de permissão para este site acessar seu microfone</translation> <translation id="701244094609242530">O Chromium não pode verificar suas extensões. Tente mais tarde.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{O Chromium não encontrou softwares nocivos conhecidos no computador. Última verificação: 1 hora atrás.}one{O Chromium não encontrou softwares nocivos conhecidos no computador. Última verificação: {NUM_HOURS} hora atrás.}other{O Chromium não encontrou softwares nocivos conhecidos no computador. Última verificação: {NUM_HOURS} horas atrás.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index 82ddff39..2c80de2a 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />O seu administrador<ph name="END_LINK" /> desativou a verificação da existência de software prejudicial do Chromium.</translation> <translation id="2799223571221894425">Reiniciar</translation> <translation id="2847479871509788944">Remover do Chromium...</translation> -<translation id="2853765747879685679">Perguntar quando abrir o Chromium</translation> <translation id="2885378588091291677">Gestor de tarefas</translation> <translation id="2910007522516064972">Acerca do &Chromium</translation> <translation id="2977470724722393594">O Chromium está atualizado</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index 3b1e956..e67cb26 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratorul<ph name="END_LINK" /> a dezactivat verificarea privind software-ul dăunător în Chromium</translation> <translation id="2799223571221894425">Repornește</translation> <translation id="2847479871509788944">Elimină din Chromium...</translation> -<translation id="2853765747879685679">Întreabă atunci când deschid Chromium</translation> <translation id="2885378588091291677">Manager de activități</translation> <translation id="2910007522516064972">Despre &Chromium</translation> <translation id="2977470724722393594">Chromium este actualizat</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 7f707577..fbeb360 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Администратор<ph name="END_LINK" /> отключил выполнение браузером Chromium проверки на наличие вредоносного ПО.</translation> <translation id="2799223571221894425">Перезапустить</translation> <translation id="2847479871509788944">Удалить из Chromium</translation> -<translation id="2853765747879685679">Спрашивать во время запуска Chromium</translation> <translation id="2885378588091291677">Диспетчер задач</translation> <translation id="2910007522516064972">О &Chromium</translation> <translation id="2977470724722393594">Вы используете последнюю версию Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index f0e6607..1bedd8a 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />ඔබේ පරිපාලක<ph name="END_LINK" /> හානිකර මෘදුකාංග සඳහා Chromium හි පරීක්ෂාව අබල කර ඇත</translation> <translation id="2799223571221894425">නැවත දියත් කරන්න</translation> <translation id="2847479871509788944">Chromium වෙතින් ඉවත් කරන්න...</translation> -<translation id="2853765747879685679">මා Chromium විවෘත කරන විට අසන්න</translation> <translation id="2885378588091291677">කාර්ය කළමණාකරු</translation> <translation id="2910007522516064972">&Chromium පිළිබඳ</translation> <translation id="2977470724722393594">Chromium යාවත්කාලීනයි</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index dc1a805..860b2d8 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Váš správca<ph name="END_LINK" /> zakázal v prehliadači Chromium kontrolu prítomnosti škodlivého softvéru</translation> <translation id="2799223571221894425">Znova spustiť</translation> <translation id="2847479871509788944">Odstrániť z prehliadača Chromium...</translation> -<translation id="2853765747879685679">Opýtať sa pri otvorení prehliadača Chromium</translation> <translation id="2885378588091291677">Správca úloh</translation> <translation id="2910007522516064972">Informácie o prehliadači &Chromium</translation> <translation id="2977470724722393594">Prehliadač Chromium bol aktualizovaný</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (skopírované do prehliadača Chromium)</translation> <translation id="6893813176749746474">Prehliadač Chromium bol aktualizovaný, ale najmenej 30 dní ste ho nepoužili.</translation> <translation id="6964305034639999644">Otvoriť odkaz v okne inko&gnito prehliadača Chromium</translation> +<translation id="6978145336957848883">Slabé heslá sa dajú ľahko uhádnuť. Povoľte prehliadaču Chromium, <ph name="BEGIN_LINK" />aby vám vytváral silné heslá a pamätal si ich<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium potrebuje povolenie pre tento web na prístup k mikrofónu</translation> <translation id="701244094609242530">Chromium nemôže skontrolovať rozšírenia. Skúste to znova neskôr.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred hodinou.}few{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodinami.}many{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodiny.}other{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodinami.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 8771860..2f6984e 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Skrbnik<ph name="END_LINK" /> je onemogočil Chromiumovo preverjanje prisotnosti škodljive programske opreme.</translation> <translation id="2799223571221894425">Vnovičen zagon</translation> <translation id="2847479871509788944">Odstranitev iz Chromiuma ...</translation> -<translation id="2853765747879685679">Vprašaj, ko odprem Chromium</translation> <translation id="2885378588091291677">Upravitelj opravil</translation> <translation id="2910007522516064972">O &Chromiumu</translation> <translation id="2977470724722393594">Chromium je posodobljen</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index 6012fca..03facbaa 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratori yt<ph name="END_LINK" /> ka çaktivizuar kontrollin e Chromium për softuerë keqdashës</translation> <translation id="2799223571221894425">Nis sërish</translation> <translation id="2847479871509788944">Hiqe nga Chromium...</translation> -<translation id="2853765747879685679">Pyet kur unë hap Chromium</translation> <translation id="2885378588091291677">Menaxheri i detyrave</translation> <translation id="2910007522516064972">Rreth &Chromium</translation> <translation id="2977470724722393594">Chromium është i përditësuar</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb index c523797b..a21b3043 100644 --- a/chrome/app/resources/chromium_strings_sr-Latn.xtb +++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administrator<ph name="END_LINK" /> je onemogućio traženje štetnog softvera pomoću Chromium-a</translation> <translation id="2799223571221894425">Ponovo pokreni</translation> <translation id="2847479871509788944">Ukloni iz Chromium-a...</translation> -<translation id="2853765747879685679">Pitaj kada otvaram Chromium</translation> <translation id="2885378588091291677">Menadžer zadataka</translation> <translation id="2910007522516064972">O &Chromium-u</translation> <translation id="2977470724722393594">Chromium je ažuriran</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (kopirano u Chromium)</translation> <translation id="6893813176749746474">Chromium je ažuriran, ali ga niste koristili najmanje 30 dana.</translation> <translation id="6964305034639999644">Otvori link u Chromium prozoru bez arhi&viranja</translation> +<translation id="6978145336957848883">Slabe lozinke lako mogu da se pogode. Dozvolite da Chromium <ph name="BEGIN_LINK" />pravi i pamti jake lozinke za vas<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium traži dozvolu da pristupi mikrofonu za ovaj sajt</translation> <translation id="701244094609242530">Chromium ne može da vam proverava dodatke. Probajte ponovo kasnije.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium nije pronašao poznat štetan softver na računaru. Poslednji put provereno: pre 1 sat.}one{Chromium nije pronašao poznat štetan softver na računaru. Poslednji put provereno: pre {NUM_HOURS} sat.}few{Chromium nije pronašao poznat štetan softver na računaru. Poslednji put provereno: pre {NUM_HOURS} sata.}other{Chromium nije pronašao poznat štetan softver na računaru. Poslednji put provereno: pre {NUM_HOURS} sati.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index f6470fca..2b23149 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Администратор<ph name="END_LINK" /> је онемогућио тражење штетног софтвера помоћу Chromium-а</translation> <translation id="2799223571221894425">Поново покрени</translation> <translation id="2847479871509788944">Уклони из Chromium-а...</translation> -<translation id="2853765747879685679">Питај када отварам Chromium</translation> <translation id="2885378588091291677">Менаџер задатака</translation> <translation id="2910007522516064972">О &Chromium-у</translation> <translation id="2977470724722393594">Chromium је ажуриран</translation> @@ -186,6 +185,7 @@ <translation id="6863361426438995919">Google Pay (копирано у Chromium)</translation> <translation id="6893813176749746474">Chromium је ажуриран, али га нисте користили најмање 30 дана.</translation> <translation id="6964305034639999644">Отвори линк у Chromium прозору без архи&вирања</translation> +<translation id="6978145336957848883">Слабе лозинке лако могу да се погоде. Дозволите да Chromium <ph name="BEGIN_LINK" />прави и памти јаке лозинке за вас<ph name="END_LINK" />.</translation> <translation id="6990124437352146030">Chromium тражи дозволу да приступи микрофону за овај сајт</translation> <translation id="701244094609242530">Chromium не може да вам проверава додатке. Пробајте поново касније.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium није пронашао познат штетан софтвер на рачунару. Последњи пут проверено: пре 1 сат.}one{Chromium није пронашао познат штетан софтвер на рачунару. Последњи пут проверено: пре {NUM_HOURS} сат.}few{Chromium није пронашао познат штетан софтвер на рачунару. Последњи пут проверено: пре {NUM_HOURS} сата.}other{Chromium није пронашао познат штетан софтвер на рачунару. Последњи пут проверено: пре {NUM_HOURS} сати.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index 93c5efe..9d167fb 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Administratören<ph name="END_LINK" /> har inaktiverat sökning efter skadlig programvara med Chromium</translation> <translation id="2799223571221894425">Starta om</translation> <translation id="2847479871509788944">Ta bort från Chromium …</translation> -<translation id="2853765747879685679">Fråga när jag öppnar Chromium</translation> <translation id="2885378588091291677">Aktivitetshanteraren</translation> <translation id="2910007522516064972">Om &Chromium</translation> <translation id="2977470724722393594">Chromium är uppdaterat</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index e2a14a71..5fa50ea1b 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Msimamizi wako<ph name="END_LINK" /> amezima kipengele cha Chromium cha kukagua kama kuna programu hatari</translation> <translation id="2799223571221894425">Funga na ufungue</translation> <translation id="2847479871509788944">Ondoa kwenye Chromium...</translation> -<translation id="2853765747879685679">Uliza ninapofungua Chromium</translation> <translation id="2885378588091291677">Kidhibiti cha Shughuli</translation> <translation id="2910007522516064972">Kuhusu Chromium</translation> <translation id="2977470724722393594">Chromium imesasishwa</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index d79e4f48..ea3eb29 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058">Chromiumமின் ’தீங்கிழைக்கும் மென்பொருள் உள்ளதா’ எனக் கண்டறியும் வசதியை <ph name="BEGIN_LINK" />உங்கள் நிர்வாகி<ph name="END_LINK" /> முடக்கியுள்ளார்</translation> <translation id="2799223571221894425">மீண்டும் தொடங்கு</translation> <translation id="2847479871509788944">Chromium இலிருந்து அகற்று...</translation> -<translation id="2853765747879685679">நான் Chromiumமைத் திறக்கும்போது கேள்</translation> <translation id="2885378588091291677">செயல் நிர்வாகி</translation> <translation id="2910007522516064972">&Chromium அறிமுகம்</translation> <translation id="2977470724722393594">Chromium புதுப்பித்த நிலையில் உள்ளது</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index ea8fc91..9be112a 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058">హానికరమైన సాఫ్ట్వేర్ను Chromium చెక్ చేయడాన్ని <ph name="BEGIN_LINK" />మీ అడ్మినిస్ట్రేటర్<ph name="END_LINK" /> డిజేబుల్ చేశారు</translation> <translation id="2799223571221894425">మళ్లీ ప్రారంభించు</translation> <translation id="2847479871509788944">Chromium నుండి తీసివేయి...</translation> -<translation id="2853765747879685679">నేను Chromium తెరిచినప్పుడు అడుగు</translation> <translation id="2885378588091291677">విధి సంచాలకులు</translation> <translation id="2910007522516064972">&Chromium గురించి</translation> <translation id="2977470724722393594">Chromium తాజాగా ఉంది</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index f317290..30956f25 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />ผู้ดูแลระบบ<ph name="END_LINK" />ปิดใช้การตรวจหาซอฟต์แวร์ที่เป็นอันตรายของ Chromium</translation> <translation id="2799223571221894425">เปิดใหม่</translation> <translation id="2847479871509788944">นำออกจาก Chromium...</translation> -<translation id="2853765747879685679">ถามเมื่อฉันเปิด Chromium</translation> <translation id="2885378588091291677">ตัวจัดการงาน</translation> <translation id="2910007522516064972">เกี่ยวกับ &Chromium</translation> <translation id="2977470724722393594">Chromium อัปเดตแล้ว</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index eec3289a..fdbfa6a 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Yöneticiniz<ph name="END_LINK" /> Chromium'un zararlı yazılım kontrolünü devre dışı bıraktı</translation> <translation id="2799223571221894425">Yeniden başlat</translation> <translation id="2847479871509788944">Chromium'dan kaldır...</translation> -<translation id="2853765747879685679">Chromium'u açtığımda sor</translation> <translation id="2885378588091291677">Görev Yöneticisi</translation> <translation id="2910007522516064972">&Chromium hakkında</translation> <translation id="2977470724722393594">Chromium güncel durumda</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index bb2dbcef..dd5c497b 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Адміністратор<ph name="END_LINK" /> вимкнув перевірку пристрою веб-переглядачем Chromium на наявність шкідливого програмного забезпечення</translation> <translation id="2799223571221894425">Перезапустити</translation> <translation id="2847479871509788944">Видалити з Chromium…</translation> -<translation id="2853765747879685679">Запитувати, коли я відкриваю Chromium</translation> <translation id="2885378588091291677">Диспетчер завдань</translation> <translation id="2910007522516064972">Про &Chromium</translation> <translation id="2977470724722393594">У вас остання версія Chromium</translation> @@ -184,6 +183,7 @@ <translation id="6863361426438995919">Google Pay (скопійовано в Chromium)</translation> <translation id="6893813176749746474">Chromium оновлено, проте ви не користувалися цим веб-переглядачем щонайменше 30 днів.</translation> <translation id="6964305034639999644">Відкрити посилання в аноні&мному вікні Chromium</translation> +<translation id="6978145336957848883">Ненадійні паролі можна легко вгадати. Тому радимо <ph name="BEGIN_LINK" />створювати й зберігати безпечні паролі<ph name="END_LINK" /> в Chromium.</translation> <translation id="6990124437352146030">Chromium потрібен дозвіл на використання мікрофона, щоб надати цьому сайту доступ до нього</translation> <translation id="701244094609242530">Chromium не може перевірити розширення. Повторіть спробу пізніше.</translation> <translation id="7028347026395185822">{NUM_HOURS,plural, =1{Веб-переглядач Chromium не виявив відомого шкідливого програмного забезпечення на вашому комп'ютері. Востаннє перевірено 1 годину тому.}one{Веб-переглядач Chromium не виявив відомого шкідливого програмного забезпечення на вашому комп'ютері. Востаннє перевірено {NUM_HOURS} годину тому.}few{Веб-переглядач Chromium не виявив відомого шкідливого програмного забезпечення на вашому комп'ютері. Востаннє перевірено {NUM_HOURS} години тому.}many{Веб-переглядач Chromium не виявив відомого шкідливого програмного забезпечення на вашому комп'ютері. Востаннє перевірено {NUM_HOURS} годин тому.}other{Веб-переглядач Chromium не виявив відомого шкідливого програмного забезпечення на вашому комп'ютері. Востаннє перевірено {NUM_HOURS} години тому.}}</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index d7dcbe3..d28d286 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />آپ کے منتظم<ph name="END_LINK" /> نے نقصان دہ سافٹ ویئر کے لئے Chromium کے چیک کو غیر فعال کردیا ہے</translation> <translation id="2799223571221894425">دوبارہ شروع کریں</translation> <translation id="2847479871509788944">Chromium سے ہٹائیں…</translation> -<translation id="2853765747879685679">جب میں Chromium کھولتا ہوں تو پوچھیں</translation> <translation id="2885378588091291677">ٹاسک مینیجر</translation> <translation id="2910007522516064972">Chromium& کے بارے میں</translation> <translation id="2977470724722393594">Chromium اپ ٹو ڈیٹ ہے</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index bfd6bbd..b9749722 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058">Chromium zararli dasturlarni aniqlash vositasi <ph name="BEGIN_LINK" />administrator<ph name="END_LINK" /> tomonidan faolsizlantirilgan</translation> <translation id="2799223571221894425">Qaytadan ishga tushirish</translation> <translation id="2847479871509788944">Chromium‘dan o‘chirish...</translation> -<translation id="2853765747879685679">Chromium ochilganda soʻralsin</translation> <translation id="2885378588091291677">Vazifalar boshqaruvi</translation> <translation id="2910007522516064972">&Chromium haqida</translation> <translation id="2977470724722393594">Siz Chromium brauzerining eng oxirgi versiyasidan foydalanyapsiz.</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index e1d6001..a3018b14 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Quản trị viên của bạn<ph name="END_LINK" /> đã tắt tính năng kiểm tra phần mềm gây hại trên Chromium</translation> <translation id="2799223571221894425">Chạy lại</translation> <translation id="2847479871509788944">Xóa khỏi Chromium...</translation> -<translation id="2853765747879685679">Hỏi khi tôi mở Chromium</translation> <translation id="2885378588091291677">Trình quản lý tác vụ</translation> <translation id="2910007522516064972">Giới thiệu về &Chromium</translation> <translation id="2977470724722393594">Chromium đã được cập nhật</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 5e3dcff90..86ddda4 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />您的管理员<ph name="END_LINK" />已停用 Chromium 的有害软件检查功能</translation> <translation id="2799223571221894425">重新启动</translation> <translation id="2847479871509788944">从Chromium中移除…</translation> -<translation id="2853765747879685679">在我打开 Chromium 时询问</translation> <translation id="2885378588091291677">任务管理器</translation> <translation id="2910007522516064972">关于 Chromium(&C)</translation> <translation id="2977470724722393594">Chromium 已是最新版本</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index f0ee373..8050b8e 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />您的管理員<ph name="END_LINK" />已停用 Chromium 檢查有害軟件的功能</translation> <translation id="2799223571221894425">重新啟動</translation> <translation id="2847479871509788944">從 Chromium 中移除…</translation> -<translation id="2853765747879685679">開啟 Chromium 時詢問我</translation> <translation id="2885378588091291677">工作管理員</translation> <translation id="2910007522516064972">關於 Chromium(&C)</translation> <translation id="2977470724722393594">Chromium 已是最新版本</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 30f1a5ea..4cc55c6 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -47,7 +47,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />系統管理員<ph name="END_LINK" />已停用 Chromium 的有害軟體檢測功能</translation> <translation id="2799223571221894425">重新啟動</translation> <translation id="2847479871509788944">從 Chromium 中移除...</translation> -<translation id="2853765747879685679">開啟 Chromium 時詢問我</translation> <translation id="2885378588091291677">工作管理員</translation> <translation id="2910007522516064972">關於 Chromium(&C)</translation> <translation id="2977470724722393594">Chromium 目前是最新版本</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index 1bed25cb..b71a507 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -49,7 +49,6 @@ <translation id="2774556997178638058"><ph name="BEGIN_LINK" />Umlawuli wakho<ph name="END_LINK" /> ukhubaze ukuhlola kwe-Chromium isofthiwe eyingozi</translation> <translation id="2799223571221894425">Qalisa kabusha</translation> <translation id="2847479871509788944">Susa kusuka ku-Chromium...</translation> -<translation id="2853765747879685679">Buza uma ngivula i-Chromium</translation> <translation id="2885378588091291677">Isiphathi somsebenzi</translation> <translation id="2910007522516064972">Mayelana ne-&Chromium</translation> <translation id="2977470724722393594">I-Chromium isesikhathini samanje</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 35f0988..5070fbe 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Skep kortpad</translation> <translation id="2050339315714019657">Portret</translation> <translation id="2053312383184521053">Rustoestand-data</translation> +<translation id="2054665754582400095">Jou teenwoordigheid</translation> <translation id="2055585478631012616">Jy sal by hierdie werwe afgemeld word, insluitend in oop oortjies</translation> <translation id="205560151218727633">Google Assistent-logo</translation> <translation id="2058456167109518507">Toestel is bespeur</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Gaan na tuisskerm</translation> <translation id="2387458720915042159">Soort instaanbedienerverbinding</translation> <translation id="2390347491606624519">Kan nie aan instaanbediener koppel nie; meld asseblief weer aan</translation> +<translation id="2390782873446084770">Wi-fi-sinkronisering</translation> <translation id="2391082728065870591">Stuur terugvoerverslag</translation> <translation id="2391419135980381625">Standaardlettertipe</translation> <translation id="2392163307141705938">Jy het die tydlimiet wat jou ouer vir <ph name="IDS_SHORT_PRODUCT_NAME" /> gestel het, bereik.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Stel terug</translation> <translation id="3158033540161634471">Stel jou vingerafdruk op</translation> <translation id="3159493096109238499">Beige</translation> +<translation id="3159978855457658359">Wysig toestelnaam</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardeware-gesteun)</translation> <translation id="3161522574479303604">Alle tale</translation> <translation id="3162853326462195145">Skoolrekening</translation> @@ -3230,6 +3233,7 @@ <translation id="4761104368405085019">Gebruik jou mikrofoon</translation> <translation id="4762718786438001384">Toestel se skyfspasie is gevaarlik laag</translation> <translation id="4763408175235639573">Die volgende webkoekies is gestel toe jy hierdie bladsy bekyk het</translation> +<translation id="4764368918650455114">Maak seker dat albei toestelle ontsluit is, naby mekaar is, en dat Bluetooth aangeskakel is. As jy met 'n Chromebook deel, moet jy seker maak dat Nabydeling aangeskakel is (maak die statusarea oop deur die tyd te kies, en kies dan Nabydeling). <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Laat Android Boodskappe toe om SMS'e van jou foon af na jou Chromebook toe oor te dra</translation> <translation id="476598255842811483">Niemand nie, tensy jy Nabydeling op jou toestel oopmaak</translation> <translation id="4768332406694066911">Jy het sertifikate van hierdie organisasies af wat jou identifiseer</translation> @@ -3392,6 +3396,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Jou administrateur het hierdie program geïnstalleer.</translation> <translation id="4964455510556214366">Rangskikking</translation> +<translation id="496446150016900060">Sinkroniseer wi-fi-netwerke met jou foon</translation> <translation id="4965808351167763748">Is jy seker jy wil hierdie toestel opstel om Hangouts Ontmoeting te laat loop?</translation> <translation id="496888482094675990">Die Lêers-program bied vinnige toegang tot lêers wat jy op Google Drive, eksterne berging of jou Chrome-bedryfstelseltoestel gestoor het.</translation> <translation id="4971412780836297815">Maak oop wanneer dit klaar is</translation> @@ -3698,6 +3703,7 @@ <translation id="5341980496415249280">Wag asseblief, pak tans</translation> <translation id="5342091991439452114">PIN moet minstens <ph name="MINIMUM" /> syfers wees</translation> <translation id="5344036115151554031">Stel tans Linux terug</translation> +<translation id="5345916423802287046">Begin program wanneer jy aanmeld</translation> <translation id="5350293332385664455">Skakel Google Assistent af</translation> <translation id="535123479159372765">Teks is van ander toestel af gekopieer</translation> <translation id="5352033265844765294">Tydstempel</translation> @@ -4008,6 +4014,7 @@ <translation id="5704875434923668958">Sinkroniseer tans met</translation> <translation id="5705005699929844214">Wys altyd toeganklikheidopsies</translation> <translation id="5705882733397021510">Gaan terug</translation> +<translation id="5707117624115653804">Pasmaak onderskrifgrootte en -styl vir programme en werwe wat hierdie instelling ondersteun</translation> <translation id="5707185214361380026">Kon nie uitbreiding hiervandaan laai nie:</translation> <translation id="5708171344853220004">Microsoft-hoofnaam</translation> <translation id="5709557627224531708">Stel Chrome as jou verstekblaaier</translation> @@ -4171,6 +4178,7 @@ <translation id="5904614460720589786">Kon nie <ph name="APP_NAME" /> opstel nie weens 'n opstellingprobleem. Kontak jou administrateur. Foutkode: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Amper op datum! Herbegin jou toestel om opdatering te voltooi.</translation> <translation id="5906732635754427568">Data wat met hierdie program geassosieer word, sal van hierdie toestel af verwyder word.</translation> +<translation id="5908474332780919512">Begin program wanneer jy aanmeld</translation> <translation id="5908695239556627796">Muis se rolleesspoed</translation> <translation id="5908769186679515905">Verhinder werwe om Flash te laat loop</translation> <translation id="5910363049092958439">Stoor prent as …</translation> @@ -4563,7 +4571,6 @@ <translation id="6345878117466430440">Merk as gelees</translation> <translation id="6349101878882523185">Installeer <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinkronisering werk tans nie. Probeer afmeld en weer aanmeld.</translation> -<translation id="6351063337294363751">Jy kan jou blaaidata van hierdie kieslys af uitvee</translation> <translation id="6354918092619878358">SECG-elliptiesekurwe-secp256r1 (ook bekend as ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Hou toestel aangeskakel</translation> <translation id="63566973648609420">Net iemand met jou wagfrase kan jou geënkripteerde data lees. Die wagfrase word nie na Google gestuur of deur Google geberg nie. As jy jou wagfrase vergeet of hierdie instelling wil verander, sal jy <ph name="BEGIN_LINK" />sinkronisering moet terugstel<ph name="END_LINK" />.</translation> @@ -4711,6 +4718,7 @@ <translation id="6532527800157340614">Kon nie aanmeld nie omdat jou toegangtoken nie opgehaal kon word nie. Gaan jou netwerkverbinding na en probeer weer.</translation> <translation id="6532663472409656417">Onderneming is ingeskryf</translation> <translation id="6535331821390304775">Laat <ph name="ORIGIN" /> altyd toe om hierdie soort skakels in die geassosieerde program oop te maak</translation> +<translation id="6537613839935722475">Naam kan letters, syfers en koppeltekens (-) gebruik</translation> <translation id="6538635548667167211">Huidige datagebruikinstelling is Data</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Let wel:<ph name="END_BOLD" /> Aktiveer net as jy weet wat jy doen of as jy gevra is om dit te doen, aangesien die insameling van data prestasie kan verlaag.</translation> <translation id="6541638731489116978">Hierdie werf is geblokkeer om toegang tot jou bewegingsensors te kry.</translation> @@ -4799,6 +4807,7 @@ <translation id="6650234781371031356">Jou wagwoord vir <ph name="WEBSITE" /> is op hierdie toestel en in jou Google-rekening geberg. Watter een wil jy uitvee?</translation> <translation id="665061930738760572">Maak in nuwe venster oop</translation> <translation id="6651237644330755633">Vertrou hierdie sertifikaat om webwerwe te identifiseer</translation> +<translation id="6651495917527016072">Sinkroniseer wi-fi-netwerke met jou foon. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" /> se integrasie word net op x86_64-platforms gesteun. Chromebooks wat bo-op 'n ARM of x86-platform gebou is, steun nie hierdie funksionaliteit nie.</translation> <translation id="6654509035557065241">Verkies netwerk</translation> <translation id="6655190889273724601">Ontwikkelaarmodus</translation> @@ -5402,6 +5411,7 @@ <translation id="7375235221357833624">{0,plural, =1{Dateer toestel binne 'n uur op}other{Dateer toestel binne # uur op}}</translation> <translation id="7376553024552204454">Lig die muismerker uit wanneer dit beweeg</translation> <translation id="7377451353532943397">Hou aan om sensortoegang te blokkeer</translation> +<translation id="7378611153938412599">Swak wagwoorde is maklik om te raai. Maak seker dat jy sterk wagwoorde skep. <ph name="BEGIN_LINK" />Sien meer sekuriteitswenke.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Maak Chrome Webwinkel oop</translation> <translation id="7378812711085314936">Kry dataverbinding</translation> <translation id="7380622428988553498">Toestelnaam bevat ongeldige karakters</translation> @@ -5926,6 +5936,7 @@ <translation id="7959074893852789871">Die lêer bevat veelvuldige sertifikate, waarvan sommige nie ingevoer is nie:</translation> <translation id="7961015016161918242">Nooit</translation> <translation id="7963001036288347286">Raakpaneelversnelling</translation> +<translation id="7963608432878156675">Ander toestelle kan hierdie naam sien vir Bluetooth- en netwerkverbindings</translation> <translation id="7963826112438303517">Jou Assistent gebruik hierdie opnames en jou gesproke versoeke om jou stemmodel, wat net geberg word op toestelle waar jy Voice Match aangeskakel het, te skep en op te dateer. Bekyk of lei stemaktiwiteit weer op in Assistent-instellings.</translation> <translation id="7966241909927244760">Kopieer prentadres</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 item op boekmerklys}other{{COUNT} items op boekmerklys}}</translation> @@ -6389,6 +6400,7 @@ <translation id="850875081535031620">Geen skadelike sagteware gevind nie</translation> <translation id="8509177919508253835">Stel sekuriteitsleutels terug en skep PIN'e</translation> <translation id="8509646642152301857">Kon nie speltoetserwoordeboek aflaai nie.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Geen swak wagwoorde gekry nie}=1{Het {COUNT} swak wagwoord gekry}other{Het {COUNT} swak wagwoorde gekry}}</translation> <translation id="8512476990829870887">Beëindig proses</translation> <translation id="851263357009351303">Laat <ph name="HOST" /> altyd toe om prente te wys</translation> <translation id="8513108775083588393">Outodraai</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index e9d338fe..37007fb 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">አቋራጭ ፍጠር</translation> <translation id="2050339315714019657">በቁመት</translation> <translation id="2053312383184521053">የስራ-ፈት ሁኔታ ውሂብ</translation> +<translation id="2054665754582400095">የእርስዎ መገኘት</translation> <translation id="2055585478631012616">ክፍት ትሮችን ጨምሮ ከእነዚህ ጣቢያዎች ዘግተው እንዲወጡ ይደረጋሉ</translation> <translation id="205560151218727633">የGoogle ረዳት ዓርማ</translation> <translation id="2058456167109518507">መሣሪያ መኖሩ ተደርሶበታል</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">ወደ መነሻ ሂድ</translation> <translation id="2387458720915042159">የተኪ ግንኙነት አይነት</translation> <translation id="2390347491606624519">ከተኪ ጋር መገናኘት አልተቻለም፣ እባክዎ እንደገና ይግቡ</translation> +<translation id="2390782873446084770">Wi-Fi ስምረት</translation> <translation id="2391082728065870591">የግብረመልስ ሪፖርት ላክ</translation> <translation id="2391419135980381625">መደበኛ ቅርጸ-ቁምፊ</translation> <translation id="2392163307141705938">የእርስዎ ወላጅ ለ<ph name="IDS_SHORT_PRODUCT_NAME" /> ያቀናበሩት የጊዜ ገደብ ላይ ድደርሰዋል።</translation> @@ -1869,6 +1871,7 @@ <translation id="3157931365184549694">እነበረበት መልስ</translation> <translation id="3158033540161634471">የጣት አሻራዎን ያዋቅሩ</translation> <translation id="3159493096109238499">ቤዥ</translation> +<translation id="3159978855457658359">የመሣሪያ ስሙን አርትዕ</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (በሃርድዌር የሚደገፍ)</translation> <translation id="3161522574479303604">ሁሉም ቋንቋዎች</translation> <translation id="3162853326462195145">የትምህርት ቤት መለያ</translation> @@ -3227,6 +3230,7 @@ <translation id="4761104368405085019">ማይክፎሮንዎን ይጠቀማል</translation> <translation id="4762718786438001384">የመሣሪያ የዲስክ ቦታ እጅግ በጣም ዝቅተኛ ነው</translation> <translation id="4763408175235639573">ይህን ገጽ ሲመለከቱት የሚከተሉት ኩኪዎች ተቀናብረዋል</translation> +<translation id="4764368918650455114">ሁለቱም መሣሪያዎች እንደተከፈቱ፣ አጠገብ ለአጠገብ እንደሆኑ እና ብሉቱዝ መብራቱን ያረጋግጡ። በChromebook እያጋሩ ያሉ ከሆነ የአቅራቢያ ማጋሪያው እንደበራ ያረጋግጡ (ጊዜውን በመምረጥ የሁኔታ አካባቢውን ይክፈቱ፣ ከዚያ የአቅራቢያ ማጋሪያን ይምረጡ)። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="4765582662863429759">የAndroid መልዕክቶች ከስልክዎ የሚመጡ ጽሑፎችን ወደ የእርስዎ Chromebook እንዲያስተላልፉ ያስችለዋል</translation> <translation id="476598255842811483">እርስዎ በአቅራቢያ ማጋሪያን በመሣሪያዎ ላይ እስካልከፈቱ ድረስ ማንም ሰው</translation> <translation id="4768332406694066911">እርስዎን የሚለዩ ከእነዚህ ድርጅቶች የመጡ የዕውቅና ማረጋገጫዎች አለዎት</translation> @@ -3389,6 +3393,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">ይህ መተግበሪያ በእርስዎ አስተዳዳሪ ተጭኗል።</translation> <translation id="4964455510556214366">አደራደር</translation> +<translation id="496446150016900060">የWi-Fi አውታረ መረቦችን ከስልክዎ ጋር ያስምሩ</translation> <translation id="4965808351167763748">እርግጠኛ ነዎት ይህን መሣሪያ Hangouts Meetን እንዲያሄድ ማዋቀር ይፈልጋሉ?</translation> <translation id="496888482094675990">የፋይሎች መተግበሪያው በGoogle Drive፣ ውጫዊ ማከማቻ ወይም በእርስዎ የChrome OS መሣሪያ ላይ ያስቀመጧቸውን ፋይሎች ፈጣን መዳረሻ ይሰጠዎታል።</translation> <translation id="4971412780836297815">ሲጠናቀቅ ክፈት</translation> @@ -3695,6 +3700,7 @@ <translation id="5341980496415249280">እባክዎ ይጠብቁ፣ በመጠቅለል ላይ...</translation> <translation id="5342091991439452114">ፒን ቢያንስ <ph name="MINIMUM" /> አኃዞች መሆን አለበት</translation> <translation id="5344036115151554031">Linuxን ወደነበረበት በመመለስ ላይ</translation> +<translation id="5345916423802287046">ሲገቡ መተግበሪያውን ይጀምሩ</translation> <translation id="5350293332385664455">Google ረዳትን ያጥፉ</translation> <translation id="535123479159372765">ጽሑፍ ከሌላ መሣሪያ ተቀድቷል</translation> <translation id="5352033265844765294">የሰዓት ምዝገባ</translation> @@ -4004,6 +4010,7 @@ <translation id="5704875434923668958">ከዚህ ጋር በማስመር ላይ፦</translation> <translation id="5705005699929844214">ሁልጊዜ የተደራሽነት አማራጮችን አሳይ</translation> <translation id="5705882733397021510">ተመለስ</translation> +<translation id="5707117624115653804">ይህን ቅንብር ለሚደግፉ መተግበሪያዎች እና ጣቢያዎች የመግለጫ ጽሑፍ መጠንን እና ቅጥን ያብጁ</translation> <translation id="5707185214361380026">ቅጥያዎችን ከሚከተለው መጫን አልተቻለም፦</translation> <translation id="5708171344853220004">Microsoft Principal Name</translation> <translation id="5709557627224531708">Chromeን እንደ ነባሪ አሳሽዎ አድርገው ያቀናብሩት</translation> @@ -4167,6 +4174,7 @@ <translation id="5904614460720589786">በውቅረት ችግር ምክንያት <ph name="APP_NAME" />ን ማቀናበር አልተቻለም። እባክዎ አስተዳዳሪዎን ያነጋግሩ። የስሕተት ኮድ፦ <ph name="ERROR_CODE" />።</translation> <translation id="5906655207909574370">የተዘመነ ለመሆን ጥቂት ብቻ ቀርቷል! ዝማኔውን ለማጠናቀቅ መሣሪያዎን ዳግም ያስጀምሩት።</translation> <translation id="5906732635754427568">ከዚህ መተግበሪያ ጋር የተጎዳኘ ውሂብ ከዚህ መሣሪያ ላይ ይወገዳል።</translation> +<translation id="5908474332780919512">ሲገቡ መተግበሪያውን ይጀምሩ</translation> <translation id="5908695239556627796">የመዳፊት ሽብለላ ፍጥነት</translation> <translation id="5908769186679515905">ጣቢያዎች Flashን እንዳያሄዱ አግድ</translation> <translation id="5910363049092958439">ምስል አስ&ቀምጥ እንደ…</translation> @@ -4559,7 +4567,6 @@ <translation id="6345878117466430440">እንደተነበበ ምልክት አድርግ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" />ን ይጫኑ</translation> <translation id="6349170655202535379">ስምረት እየሰራ አይደለም። ዘግተው ወጥተው እና ተመልሰው ለመግባት ይሞክሩ።</translation> -<translation id="6351063337294363751">የእርስዎን የአሰሳ አደራረግ ውሂብ ከዚህ ምናሌ ላይ ማጽዳት ይችላሉ</translation> <translation id="6354918092619878358">የSECG ሞላላ ጥምዝ secp256r1 (እንዲሁም ANSI X9.62 prime256v1, NIST P-256 በመባት የሚታወቅ)</translation> <translation id="635609604405270300">መሣሪያውን እንደበራ አቆየው</translation> <translation id="63566973648609420">የእርስዎን የይለፍ ሐረግ ያለው ሰው ብቻ ነው የተመሰጠረ ውሂብዎን ማየት የሚችለው። የይለፍ ሐረጉ ለGoogle አይላክም ወይም በእሱ አይከማችም። የይለፍ ሐረግዎን ከረሱት <ph name="BEGIN_LINK" />ስምረትን ዳግም ማስጀመር<ph name="END_LINK" /> ይኖርብዎታል።</translation> @@ -4707,6 +4714,7 @@ <translation id="6532527800157340614">የእርስዎ የመዳረሻ ማስመሰያ ተሰርስሮ ሊወጣ አልቻለም። እባክዎ የአውታረ መረብ ግንኙነትዎን ይፈትሹትና እንደገና ይሞክሩ።</translation> <translation id="6532663472409656417">በድርጅት ተመዝግቧል</translation> <translation id="6535331821390304775"><ph name="ORIGIN" /> የዚህ አይነት አገናኞችን በተጓዳኙ መተግበሪያ ውስጥ እንዲከፍት ሁልጊዜ ፍቀድ</translation> +<translation id="6537613839935722475">ስም ፊደላትን፣ ቁጥሮችን እና ሰረዝን (-) መጠቀም ይችላል</translation> <translation id="6538635548667167211">የአሁኑ የውሂብ አጠቃቀም ቅንብር ውሂብ ነው</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ማስታወሻ፦<ph name="END_BOLD" /> የውሂብ መሰብሰብ አፈጻጸምን ስለሚቀንስ እያደረጉ ያሉትን ነገር የሚያውቁት ከሆነ ወይም እንዲያነቁ ከተጠየቁ ብቻ ያንቁ።</translation> <translation id="6541638731489116978">ይህ ጣቢያ የእንቅስቃሴ ዳሳሾችዎን እንዳይደርስ ታግዷል።</translation> @@ -4795,6 +4803,7 @@ <translation id="6650234781371031356">ለ<ph name="WEBSITE" /> የይለፍ ቃልዎ በዚህ መሣሪያ እና በእርስዎ የGoogle መለያ ውስጥ ይቀመጣል። የትኛውን መሰረዝ ይፈልጋሉ?</translation> <translation id="665061930738760572">&በአዲስ መስኮት ክፈት</translation> <translation id="6651237644330755633">ድር ጣቢያዎችን ለመለየት ይህን የዕውቅና ማረጋገጫ ይመኑ</translation> +<translation id="6651495917527016072">የWi-Fi አውታረ መረቦችን ከስልክዎ ጋር ያስምሩ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="665355505818177700">የChrome <ph name="MS_AD_NAME" /> ውህደት በx86_64 የመሣሪያ ስርዓቶች ላይ ብቻ ነው የሚደገፈው። በARM ወይም x86 የመሣሪያ ስርዓቶች ላይ የተገነቡ Chromebooks ይህን ትግብራ አይደግፉም።</translation> <translation id="6654509035557065241">ተመራጭ አውታረ መረብ</translation> <translation id="6655190889273724601">የገንቢ ሁነት</translation> @@ -5398,6 +5407,7 @@ <translation id="7375235221357833624">{0,plural, =1{በአንድ ሰዓት ውስጥ መሣሪያን አዘምን}one{በ# ሰዓታት ውስጥ መሣሪያን አዘምን}other{በ# ሰዓታት ውስጥ መሣሪያን አዘምን}}</translation> <translation id="7376553024552204454">በሚንቀሳቀስበት ጊዜ የመዳፊት ጠቋሚን አድምቅ</translation> <translation id="7377451353532943397">የዳሳሽ መዳረሻን ማገዱን ቀጥል</translation> +<translation id="7378611153938412599">ደካማ የይለፍ ቃላት ለመገመት ቀላል ናቸው። ጠንካራ የይለፍ ቃላትን እየፈጠሩ መሆንዎን ያረጋግጡ። <ph name="BEGIN_LINK" />ተጨማሪ ጠቃሚ የደህንነት ምክሮችን ይመልከቱ።<ph name="END_LINK" /></translation> <translation id="73786666777299047">Chrome የድር መደብርን ይክፈቱ</translation> <translation id="7378812711085314936">የውሂብ ግንኙነት ያግኙ</translation> <translation id="7380622428988553498">የመሣሪያ ስም ልክ ያልሆኑ ቁምፊዎችን ይዟል</translation> @@ -5922,6 +5932,7 @@ <translation id="7959074893852789871">ፋይሉ አንዳንዶቹ እንዲገቡ ያልተደረጉ በርካታ የእውቅና ማረጋገጫዎችን ይዟል፦</translation> <translation id="7961015016161918242">በፍጹም</translation> <translation id="7963001036288347286">የመዳሰሻ ሰሌዳ ማፍጠኛ</translation> +<translation id="7963608432878156675">ይህ ስም ለሌሎች መሳሪያዎች ለብሉቱዝ እና ለአውታረ መረብ ግንኙነቶች ይታያል</translation> <translation id="7963826112438303517">የእርስዎ ረዳት እነዚህን ቅጂዎች እና የቃል ጥያቄዎችዎን የድምጽዎን ሞዴል ለመፍጠር እና ለማዘመን ይጠቀምባቸዋል፣ ይህም Voice Match ባነቁባቸው መሣሪያዎች ላይ ብቻ የሚከማች ነው። በረዳት ቅንብሮች ውስጥ የድምጽ እንቅስቃሴን ይይመልከቱ ወይም ዳግም ያሰልጥኑ።</translation> <translation id="7966241909927244760">የምስል አድራሻ &ቅዳ</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 ንጥል በእልባት ዝርዝር ውስጥ}one{{COUNT} ንጥሎች በዕልባት ዝርዝር ውስጥ}other{{COUNT} ንጥሎች በዕልባት ዝርዝር ውስጥ}}</translation> @@ -6390,6 +6401,7 @@ <translation id="850875081535031620">ምንም ጎጂ ሶፍትዌር አልተገኘም</translation> <translation id="8509177919508253835">የደህንነት ቁልፎችን ዳግም ያስጀምሩ እና ፒኖችን ይፍጠሩ</translation> <translation id="8509646642152301857">የፊደል ማረሚያ መዝገበ-ቃላት ማውረድ አልተሳካም።</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{ምንም ደካማ የይለፍ ቃላት አልተገኙም}=1{{COUNT} ደካማ የይለፍ ቃላ ተገኝቷል}one{{COUNT} ደካማ የይለፍ ቃላት ተገኝተዋል}other{{COUNT} ደካማ የይለፍ ቃላት ተገኝተዋል}}</translation> <translation id="8512476990829870887">ሂደቱን ግታ</translation> <translation id="851263357009351303">ሁልጊዜ <ph name="HOST" /> ምስሎችን እዲያሳይ ፍቀድ</translation> <translation id="8513108775083588393">በራስ ሰር አሽከርክር</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 729a68c..e84909f4 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">وضع علامة "مقروءة"</translation> <translation id="6349101878882523185">تثبيت <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">المزامنة لا تعمل. جرّب الخروج وتسجيل الدخول مرة أخرى.</translation> -<translation id="6351063337294363751">يمكنك محو بيانات التصفح من هذه القائمة</translation> <translation id="6354918092619878358">منحنى SECG ناقص المقطع secp256r1 (aka ANSI X9.62 prime256v1، NIST P-256)</translation> <translation id="635609604405270300">يُرجى إبقاء الجهاز مشغَّلاً</translation> <translation id="63566973648609420">لا يمكن لأحد قراءة بياناتك المشفرة سوى من لديه عبارة المرور التي تستخدمها. ولا يتم إرسال عبارة المرور إلى شركة Google أو تخزينها لديها. إذا نسيت عبارة المرور أو رغبت في تغيير هذا الإعداد، فسيلزمك <ph name="BEGIN_LINK" />إعادة ضبط المزامنة<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index f08e673..3f7f6c3f78 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -953,7 +953,7 @@ <translation id="2090165459409185032">আপোনাৰ একাউণ্টৰ তথ্য পুনৰুদ্ধাৰ কৰিবলৈ google.com/accounts/recoveryলৈ যাওক</translation> <translation id="2090876986345970080">ছিষ্টেমৰ সুৰক্ষা ছেটিং</translation> <translation id="2091887806945687916">শব্দ</translation> -<translation id="209539936453343974">অভিভাৱকীয় নিয়ন্ত্ৰণ ছেট আপ কৰিবলৈ এটি শিশুৰ এটা অভিভাৱকে পৰিচালনা কৰা Google একাউণ্ট থাকিবই লাগিব। <ph name="DEVICE_TYPE_PLURAL" />এ Family Link এপ্টোৰ জৰিয়তে ডিভাইচত অতিবাহিত কৰা সময়ৰ সীমা ছেট কৰা, ৱেবছাইট অনুমোদন জনোৱা অথবা অৱৰোধ কৰা তথা অন্য বহুতো কাৰ্য কৰাৰ সুবিধা দিয়ে। যদি শিশুটিয়ে Google Classroomৰ দৰে ছাইটত বিদ্যালয়ৰ কাম কৰিব লাগে, তেন্তে পাছত এটা বিদ্যালয়ৰ একাউণ্ট যোগ দিব পৰা যায়।</translation> +<translation id="209539936453343974">অভিভাৱকীয় নিয়ন্ত্ৰণ ছেট আপ কৰিবলৈ এটি শিশুৰ এটা অভিভাৱকে পৰিচালনা কৰা Google একাউণ্ট থাকিবই লাগিব। <ph name="DEVICE_TYPE_PLURAL" />এ Family Link এপ্টোৰ জৰিয়তে অভিভাৱকক ডিভাইচত অতিবাহিত কৰা সময়ৰ সীমা ছেট কৰা, ৱেবছাইট অনুমোদন জনোৱা অথবা অৱৰোধ কৰা তথা অন্য বহুতো কাৰ্য কৰাৰ অনুমতি দিয়ে। যদি শিশুটিয়ে Google Classroomৰ দৰে ছাইটত বিদ্যালয়ৰ কাম কৰিব লাগে, তেন্তে পাছত এটা বিদ্যালয়ৰ একাউণ্ট যোগ দিব পৰা যায়।</translation> <translation id="2096715839409389970">তৃতীয় পক্ষৰ কুকিসমূহ মচক</translation> <translation id="2097372108957554726">আপুনি নতুন ডিভাইচসমূহ পঞ্জীকৰণ কৰিবলৈ Chromeলৈ ছাইন ইন কৰিব লাগিব।</translation> <translation id="2098805196501063469">বাকী থকা পাছৱৰ্ডসমূহ পৰীক্ষা কৰক</translation> @@ -4553,7 +4553,6 @@ <translation id="6345878117466430440">পঢ়া হৈছে বুলি চিহ্নিত কৰক</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ইনষ্টল কৰক</translation> <translation id="6349170655202535379">ছিংক কৰা সুবিধাটোৱে কাম কৰা নাই। এবাৰ ছাইন আউট হৈ আকৌ ছাইন ইন কৰি চেষ্টা কৰক।</translation> -<translation id="6351063337294363751">আপুনি এই মেনুৰ পৰা নিজৰ ব্ৰাউজিং ডেটা মচিব পাৰিব</translation> <translation id="6354918092619878358">SECG উপবৃত্তাকাৰ লেখ secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ডিভাইচ অন কৰি ৰাখক</translation> <translation id="63566973648609420">আপোনাৰ পাছফ্ৰেজ জনা কোনোবাইহে আপুনি এনক্ৰিপ্ট কৰি থোৱা ডেটা পঢ়িব পাৰে। পাছফ্ৰেজটো ক’লৈকো পঠিওৱা নহয় আৰু সেইটোGoogleত সঞ্চিত নাথাকে। আপুনি যদি নিজৰ পাছফ্ৰেজটো পাহৰে বা এই ছেটিংটো সলাব বিচাৰে, <ph name="BEGIN_LINK" />ছিংক ৰিছেট<ph name="END_LINK" /> কৰিব লাগিব।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 43c1658..cfc78d0 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -4554,7 +4554,6 @@ <translation id="6345878117466430440">Oxunmuş kimi qeyd edin</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> tətbiqini quraşdırın</translation> <translation id="6349170655202535379">Sinxronizasiya işləmir. Çıxın və yenidən daxil olun.</translation> -<translation id="6351063337294363751">Bu menyudan axtarış datanızı silə bilərsiniz</translation> <translation id="6354918092619878358">SECG oval əyrisi secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Cihazı aktiv saxlayın</translation> <translation id="63566973648609420">Yalnız parol sözünüzü bilən adam şifrələnmiş məlumatınızı oxuya bilər. Parol söz Google tərəfindən göndərilmir və yadda saxlanılmır. Əgər parol sözü unutmusunuzsa və ya bu ayarı dəyişmək istəyirsinizsə <ph name="BEGIN_LINK" />sinxronizasiyanı sıfırlamalısınız<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 93e0f4a..7844c3b2 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Пазначыць як прачытанае</translation> <translation id="6349101878882523185">Усталяваць праграму "<ph name="APP_NAME" />"</translation> <translation id="6349170655202535379">Сінхранізацыя не працуе. Паспрабуйце выйсці і ўвайсці зноў.</translation> -<translation id="6351063337294363751">Праз гэта меню можна выдаліць гісторыю праглядаў</translation> <translation id="6354918092619878358">SECG эліптычны secp256r1 (іншая назва – ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Не выключайце прыладу.</translation> <translation id="63566973648609420">Толькі карыстальнікі, якія ведаюць фразу-пароль, могуць чытаць вашы зашыфраваныя даныя. Google не адпраўляе і не захоўвае фразу-пароль. Калі вы не памятаеце фразу-пароль або хочаце змяніць гэту наладу, вам трэба <ph name="BEGIN_LINK" />скінуць сінхранізацыю<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index b9e134b..5b0252c 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Означаване като прочетено</translation> <translation id="6349101878882523185">Инсталиране на <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Синхронизирането не работи. Опитайте да излезете от профила си и отново да влезете в него.</translation> -<translation id="6351063337294363751">Можете да изчистите данните за сърфирането си от това меню</translation> <translation id="6354918092619878358">Елиптична крива secp256r1 по SECG (позната и като ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Не изключвайте устройството</translation> <translation id="63566973648609420">Само някой с пропуска ви може да прочете шифрованите ви данни – той не се изпраща до Google, нито се съхранява от нас. Ако го забравите или искате да промените тази настройка, ще се наложи <ph name="BEGIN_LINK" />да нулирате синхронизирането<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 74522f33..5e569f35 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4515,7 +4515,6 @@ <translation id="6345878117466430440">'পড়া হয়েছে' হিসেবে চিহ্নিত করুন</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ইনস্টল করুন</translation> <translation id="6349170655202535379">সিঙ্ক কাজ করছে না। সাইন আউট করে আবার ফিরে এসে দেখুন।</translation> -<translation id="6351063337294363751">আপনি এই মেনু থেকে আপনার ব্রাউজিং ডেটা সাফ করতে পারেন</translation> <translation id="6354918092619878358">SECG এলিপ্টিক কার্ভ secp256r1 (ওরফে ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ডিভাইসটি চালু রাখুন</translation> <translation id="63566973648609420">শুধুমাত্র আপনার পাসফ্রেজসহ কোনো ব্যক্তি আপনার এনক্রিপ্ট করা ডেটা পড়তে পারবেন৷ পাসফ্রেজটি Google-এ পাঠানো হয় না বা এর দ্বারা সংরক্ষণ করা হয় না৷ যদি আপনি আপনার পাসফ্রেজ ভুলে যান বা এই সেটিং পরিবর্তন করতে চান, তাহলে আপনাকে <ph name="BEGIN_LINK" />সিঙ্ক রিসেট<ph name="END_LINK" /> করতে হবে।</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index d91d3a57..e68a606 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Napravi prečicu</translation> <translation id="2050339315714019657">Uspravno</translation> <translation id="2053312383184521053">Podaci o stanju neaktivnosti</translation> +<translation id="2054665754582400095">Vaša prisutnost</translation> <translation id="2055585478631012616">Odjavit ćete se s ovih web lokacija, uključujući otvorene kartice</translation> <translation id="205560151218727633">Logotip Google asistenta</translation> <translation id="2058456167109518507">Otkriven je uređaj</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Odlazak na početnu stranicu</translation> <translation id="2387458720915042159">Vrsta veze s proksi serverom</translation> <translation id="2390347491606624519">Nije se moguće povezati s proxyijem. Prijavite se ponovo</translation> +<translation id="2390782873446084770">Wi-Fi sinkronizacija</translation> <translation id="2391082728065870591">Pošalji izvještaj o povratnim informacijama</translation> <translation id="2391419135980381625">Standardni font</translation> <translation id="2392163307141705938">Dostignuto je vremensko ograničenje koje je tvoj roditelj postavio za <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Vrati</translation> <translation id="3158033540161634471">Postavljanje otiska prsta</translation> <translation id="3159493096109238499">Bež</translation> +<translation id="3159978855457658359">Uredite naziv uređaja</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (podržano hardverom)</translation> <translation id="3161522574479303604">Svi jezici</translation> <translation id="3162853326462195145">Školski račun</translation> @@ -3230,6 +3233,7 @@ <translation id="4761104368405085019">Korištenje vašeg mikrofona</translation> <translation id="4762718786438001384">Količina prostora na disku uređaja je kritično mala</translation> <translation id="4763408175235639573">Sljedeći kolačići su postavljeni kada ste pregledali ovu stranicu</translation> +<translation id="4764368918650455114">Provjerite jesu li oba uređaja otključana, blizu jedan drugome te imaju li uključen Bluetooth. Ako dijelite s Chromebookom, provjerite je li Dijeljenje s Android uređajima uključeno (otvorite područje statusa tako što ćete odabrati vrijeme, a zatim odaberite Dijeljenje s Android uređajima). <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Omogućava aplikaciji Android Messages da šalje SMS-ove s vašeg telefona na vaš Chromebook</translation> <translation id="476598255842811483">Niko osim ako na uređaju ne otvorite Dijeljenje u blizini</translation> <translation id="4768332406694066911">Imate potvrde ovih organizacija koje vas identificiraju</translation> @@ -3392,6 +3396,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Ovu aplikaciju je instalirao vaš administrator.</translation> <translation id="4964455510556214366">Uređivanje</translation> +<translation id="496446150016900060">Sinkronizirajte Wi-Fi mreže s telefonom</translation> <translation id="4965808351167763748">Jeste li sigurni da želite postaviti ovaj uređaj da pokreće Hangouts Meet?</translation> <translation id="496888482094675990">Aplikacija Files pruža brzi pristup fajlovima sačuvanim na Google Disku, vanjskoj pohrani ili na Chrome OS uređaju.</translation> <translation id="4971412780836297815">Otvori kada se završi preuzimanje</translation> @@ -3698,6 +3703,7 @@ <translation id="5341980496415249280">Pričekajte, pakiranje je u toku...</translation> <translation id="5342091991439452114">Broj znamenki u PIN-u mora biti najmanje <ph name="MINIMUM" /></translation> <translation id="5344036115151554031">Vraćanje Linuxa</translation> +<translation id="5345916423802287046">Pokrenite aplikaciju kad se prijavite</translation> <translation id="5350293332385664455">Isključite Google Asistenta</translation> <translation id="535123479159372765">Tekst je kopiran s drugog uređaja</translation> <translation id="5352033265844765294">Vremensko označavanje</translation> @@ -4007,6 +4013,7 @@ <translation id="5704875434923668958">Sinhroniziranje s korisnikom</translation> <translation id="5705005699929844214">Uvijek prikaži opcije pristupačnosti</translation> <translation id="5705882733397021510">Natrag</translation> +<translation id="5707117624115653804">Prilagodite veličinu i stil titlova za aplikacije i web-lokacije koje podržavaju tu postavku</translation> <translation id="5707185214361380026">Nije uspjelo učitavanje ekstenzije iz:</translation> <translation id="5708171344853220004">Glavni Microsoft naziv</translation> <translation id="5709557627224531708">Postavite Chrome kao zadani preglednik</translation> @@ -4170,6 +4177,7 @@ <translation id="5904614460720589786">Postavljanje aplikacije <ph name="APP_NAME" /> nije uspjelo zbog problema s konfiguracijom. Kontaktirajte administratora. Kȏd greške: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Još malo pa je ažurirano! Ponovo pokrenite uređaj da završite ažuriranje.</translation> <translation id="5906732635754427568">Podaci koji su povezani s ovom aplikacijom bit će uklonjeni s ovog uređaja.</translation> +<translation id="5908474332780919512">Pokrenite aplikaciju kad se prijavite</translation> <translation id="5908695239556627796">Brzina klizanja miša</translation> <translation id="5908769186679515905">Blokiraj pokretanje Flasha na web lokacijama</translation> <translation id="5910363049092958439">Sa&čuvaj sliku kao…</translation> @@ -4562,7 +4570,6 @@ <translation id="6345878117466430440">Označi kao pročitano</translation> <translation id="6349101878882523185">Instalirajte <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinhronizacija ne radi. Pokušajte se odjaviti i ponovo prijaviti.</translation> -<translation id="6351063337294363751">Iz ovog menija možete izbrisati svoje podatke o pregledanju</translation> <translation id="6354918092619878358">SECG eliptična krivulja secp256r1 (poznata i kao ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Ne isključujte uređaj</translation> <translation id="63566973648609420">Vaše šifrirane podatke može čitati isključivo osoba koja ima vašu šifru za pristup. Šifra za pristup se ne šalje Googleu niti je Google pohranjuje. Ukoliko zaboravite šifru za pristup ili želite promijeniti ovu postavku, morat ćete <ph name="BEGIN_LINK" />poništiti sinhronizaciju<ph name="END_LINK" />.</translation> @@ -4710,6 +4717,7 @@ <translation id="6532527800157340614">Prijava nije uspjela jer preuzimanje tokena za pristup nije uspjelo. Provjerite mrežnu vezu i pokušajte ponovo.</translation> <translation id="6532663472409656417">Uređaj prijavljenog preduzeća</translation> <translation id="6535331821390304775">Uvijek dozvolite web lokaciji <ph name="ORIGIN" /> da otvara linkove ove vrste u povezanoj aplikaciji</translation> +<translation id="6537613839935722475">Naziv može sadržavati slova, brojke i crtice (–)</translation> <translation id="6538635548667167211">Trenutna postavka prijenosa podataka je Prijenos podataka</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> Omogućite samo ako znate šta radite ili ako je to od vas zatraženo jer prikupljanje podataka može smanjiti performanse.</translation> <translation id="6541638731489116978">Ovoj web lokaciji je blokiran pristup vašim senzorima pokreta.</translation> @@ -4798,6 +4806,7 @@ <translation id="6650234781371031356">Vaša lozinka za <ph name="WEBSITE" /> je pohranjena na ovom uređaju i na vašem Google računu. Koju verziju lozinke želite izbrisati?</translation> <translation id="665061930738760572">Otvori u &novom prozoru</translation> <translation id="6651237644330755633">Vjeruj ovoj potvrdi za identifikaciju web lokacija</translation> +<translation id="6651495917527016072">Sinkronizirajte Wi-Fi mreže s telefonom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="665355505818177700">Integracija<ph name="MS_AD_NAME" /> Chromea podržana je samo na x86_64 platformama. Chromebook uređaji izrađeni na platformama ARM ili x86 ne podržavaju ovu funkcionalnost.</translation> <translation id="6654509035557065241">Preferirana mreža</translation> <translation id="6655190889273724601">Način rada za programere</translation> @@ -5401,6 +5410,7 @@ <translation id="7375235221357833624">{0,plural, =1{Ažurirajte uređaj u roku od jednog sata}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> <translation id="7376553024552204454">Istakni kursor miša u pokretu</translation> <translation id="7377451353532943397">Nastavi blokirati pristup senzoru</translation> +<translation id="7378611153938412599">Slabe zaporke lako je pogoditi. Neka vaše zaporke obavezno budu snažne. <ph name="BEGIN_LINK" />Pročitajte još sigurnosnih savjeta<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Otvorite Chrome Web trgovinu</translation> <translation id="7378812711085314936">Obezbijedite vezu za prijenos podataka</translation> <translation id="7380622428988553498">Naziv uređaja sadrži nevažeće znakove</translation> @@ -5925,6 +5935,7 @@ <translation id="7959074893852789871">Fajl je sadržavao nekoliko potvrda, a neke nisu bile uvezene:</translation> <translation id="7961015016161918242">Nikada</translation> <translation id="7963001036288347286">Ubrzanje dodirne podloge</translation> +<translation id="7963608432878156675">Ovaj je naziv vidljiv drugim uređajima za povezivanje s Bluetoothom i mrežnom vezom</translation> <translation id="7963826112438303517">Asistent koristi te snimke i vaše izgovorene zahtjeve za kreiranje i ažuriranje modela vašeg glasa koji se pohranjuje samo na uređajima na kojim ste uključili Voice Match. Aktivnost glasa možete pregledati ili ponovo uvježbati u Postavkama Asistenta.</translation> <translation id="7966241909927244760">K&opiraj adresu slike</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 stavka na listi s oznakama}one{{COUNT} stavka na listi s oznakama}few{{COUNT} stavke na listi s oznakama}other{{COUNT} stavki na listi s oznakama}}</translation> @@ -6389,6 +6400,7 @@ <translation id="850875081535031620">Nije pronađen nijedan štetan softver</translation> <translation id="8509177919508253835">Poništite sigurnosne ključeve i kreirajte PIN-ove</translation> <translation id="8509646642152301857">Preuzimanje rječnika za provjeru pravopisa nije uspjelo.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Nije pronađena nijedna slaba zaporka}=1{Pronađena je {COUNT} slaba zaporka}one{Pronađena je {COUNT} slaba zaporka}few{Pronađene su {COUNT} slabe zaporke}other{Pronađeno je {COUNT} slabih zaporki}}</translation> <translation id="8512476990829870887">Završi proces</translation> <translation id="851263357009351303">Uvijek dozvoli da <ph name="HOST" /> prikazuje slike</translation> <translation id="8513108775083588393">Aut. rotiranje</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index d1016d9..b45dacbb 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Crea la drecera</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2053312383184521053">Dades de l'estat d'inactivitat</translation> +<translation id="2054665754582400095">La teva presència</translation> <translation id="2055585478631012616">Se't tancarà la sessió d'aquests llocs web, també de les pestanyes obertes</translation> <translation id="205560151218727633">Logotip de l'Assistent de Google</translation> <translation id="2058456167109518507">S'ha detectat un dispositiu</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Ves a la pantalla d’inici</translation> <translation id="2387458720915042159">Tipus de connexió del servidor intermediari</translation> <translation id="2390347491606624519">No es pot establir connexió amb el servidor intermediari; torna a iniciar la sessió</translation> +<translation id="2390782873446084770">Sincronització Wi‑Fi</translation> <translation id="2391082728065870591">Envia un informe de suggeriments</translation> <translation id="2391419135980381625">Tipus de lletra estàndard</translation> <translation id="2392163307141705938">Has arribat al límit de temps que els teus pares han definit per a <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1869,6 +1871,7 @@ <translation id="3157931365184549694">Restaura</translation> <translation id="3158033540161634471">Configura l'empremta digital</translation> <translation id="3159493096109238499">Beix</translation> +<translation id="3159978855457658359">Edita el nom del dispositiu</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (emmagatzemat en maquinari)</translation> <translation id="3161522574479303604">Tots els idiomes</translation> <translation id="3162853326462195145">Compte de centre educatiu</translation> @@ -3228,6 +3231,7 @@ <translation id="4761104368405085019">Utilitzar el micròfon</translation> <translation id="4762718786438001384">L'espai de disc del dispositiu és molt baix</translation> <translation id="4763408175235639573">S'han permès les galetes següents en visitar aquesta pàgina</translation> +<translation id="4764368918650455114">Comprova que els dos dispositius estiguin desbloquejats, l'un a prop de l'altre i amb el Bluetooth activat. Si vols compartir fitxers amb un Chromebook, comprova que tingui la funció Compartició Nearby activada (obre l'àrea d'estat seleccionant l'hora i, a continuació, selecciona Compartició Nearby). <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Permet que Missatges Android retransmeti els missatges de text del telèfon al teu Chromebook</translation> <translation id="476598255842811483">Ningú, tret que obris la funció Compartició Nearby al teu dispositiu</translation> <translation id="4768332406694066911">Tens certificats d'aquestes organitzacions que t'identifiquen</translation> @@ -3390,6 +3394,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" />: <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">L'administrador ha instal·lat aquesta aplicació.</translation> <translation id="4964455510556214366">Disposició</translation> +<translation id="496446150016900060">Sincronitzar les xarxes Wi‑Fi amb el teu telèfon.</translation> <translation id="4965808351167763748">Confirmes que vols configurar aquest dispositiu perquè executi Hangouts Meet?</translation> <translation id="496888482094675990">L'aplicació Fitxers permet accedir ràpidament als fitxers desats a Google Drive, a l'emmagatzematge extern o al dispositiu Chrome OS.</translation> <translation id="4971412780836297815">Obre quan acabi</translation> @@ -3697,6 +3702,7 @@ <translation id="5341980496415249280">Espera, l'empaquetat està en procés...</translation> <translation id="5342091991439452114">El PIN ha de tenir com a mínim <ph name="MINIMUM" /> dígits</translation> <translation id="5344036115151554031">S'està restaurant Linux</translation> +<translation id="5345916423802287046">Obre l'aplicació en iniciar la sessió</translation> <translation id="5350293332385664455">Desactiva l'Assistent de Google</translation> <translation id="535123479159372765">Text copiat des d'un altre dispositiu</translation> <translation id="5352033265844765294">Indicació de data i hora</translation> @@ -4007,6 +4013,7 @@ <translation id="5704875434923668958">S'està sincronitzant amb</translation> <translation id="5705005699929844214">Mostra sempre les opcions d'accessibilitat</translation> <translation id="5705882733397021510">Enrere</translation> +<translation id="5707117624115653804">Personalitza la mida i l'estil dels subtítols per a les aplicacions i per als llocs web que admeten aquesta opció de configuració</translation> <translation id="5707185214361380026">No s'ha pogut carregar l'extensió de:</translation> <translation id="5708171344853220004">Nom principal de Microsoft</translation> <translation id="5709557627224531708">Defineix Chrome com a navegador predeterminat</translation> @@ -4170,6 +4177,7 @@ <translation id="5904614460720589786">No s'ha pogut configurar <ph name="APP_NAME" /> a causa d'un problema de configuració. Contacta amb l'administrador. Codi d'error: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Gairebé has acabat amb l'actualització. Reinicia el dispositiu per completar-la.</translation> <translation id="5906732635754427568">Les dades associades a aquesta aplicació se suprimiran del dispositiu.</translation> +<translation id="5908474332780919512">Obre l'aplicació en iniciar la sessió</translation> <translation id="5908695239556627796">Velocitat de desplaçament del ratolí</translation> <translation id="5908769186679515905">Impedeix que els llocs web executin Flash</translation> <translation id="5910363049092958439">De&sa la imatge com a...</translation> @@ -4562,7 +4570,6 @@ <translation id="6345878117466430440">Marca com a llegit</translation> <translation id="6349101878882523185">Instal·la <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">La sincronització no funciona. Tanca la sessió i torna-la a iniciar.</translation> -<translation id="6351063337294363751">Pots esborrar les dades de navegació des d'aquest menú</translation> <translation id="6354918092619878358">Corba el·líptica secp256r1 d'SECG (també coneguda com a X9.62 prime256v1 d'ANSI o NIST P-256)</translation> <translation id="635609604405270300">Mantén el dispositiu activat</translation> <translation id="63566973648609420">Només els usuaris que sàpiguen la teva frase de contrasenya poden llegir les dades que encriptis. La frase de contrasenya no s'envia a Google, ni Google l'emmagatzema. Si l'oblides o vols canviar aquesta configuració, hauràs de <ph name="BEGIN_LINK" />restablir la sincronització<ph name="END_LINK" />.</translation> @@ -4710,6 +4717,7 @@ <translation id="6532527800157340614">L'inici de sessió ha fallat perquè no s'ha pogut recuperar el testimoni d'accés. Comprova la connexió a la xarxa i torna-ho a provar.</translation> <translation id="6532663472409656417">Inscrit en una empresa</translation> <translation id="6535331821390304775">Permet sempre que <ph name="ORIGIN" /> obri els enllaços d'aquest tipus a l'aplicació associada</translation> +<translation id="6537613839935722475">El nom pot incloure lletres, números i guionets (-)</translation> <translation id="6538635548667167211">L'opció de configuració d'ús de dades actual és Dades</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> @@ -4798,6 +4806,7 @@ <translation id="6650234781371031356">La contrasenya per a <ph name="WEBSITE" /> està emmagatzemada en aquest dispositiu i al teu Compte de Google. D'on la vols suprimir?</translation> <translation id="665061930738760572">Obre en una &finestra nova</translation> <translation id="6651237644330755633">Confia en aquest certificat per identificar llocs web</translation> +<translation id="6651495917527016072">Sincronitza les xarxes Wi‑Fi amb el teu telèfon. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="665355505818177700">La integració de Chrome amb <ph name="MS_AD_NAME" /> només s'admet en plataformes x86_64. Els dispositius Chromebook equipats amb una plataforma ARM o x86 no admeten aquesta funció.</translation> <translation id="6654509035557065241">Estableix una xarxa com a preferida</translation> <translation id="6655190889273724601">Mode de desenvolupador </translation> @@ -5401,6 +5410,7 @@ <translation id="7375235221357833624">{0,plural, =1{Actualitza el dispositiu en 1 hora}other{Actualitza el dispositiu en # hores}}</translation> <translation id="7376553024552204454">Destaca el cursor del ratolí quan es mogui</translation> <translation id="7377451353532943397">Continua bloquejant l'accés als sensors</translation> +<translation id="7378611153938412599">Les contrasenyes poc segures són fàcils d'endevinar. Assegura't de crear-ne de segures. <ph name="BEGIN_LINK" />Consulta més consells de seguretat<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Obre Chrome Web Store</translation> <translation id="7378812711085314936">Obtén la connexió de dades</translation> <translation id="7380622428988553498">El nom del dispositiu conté caràcters que no són vàlids</translation> @@ -5925,6 +5935,7 @@ <translation id="7959074893852789871">El fitxer contenia certificats múltiples, però alguns no s'han importat:</translation> <translation id="7961015016161918242">Mai</translation> <translation id="7963001036288347286">Acceleració del ratolí tàctil</translation> +<translation id="7963608432878156675">Altres dispositius poden veure aquest nom per a les connexions Bluetooth i a la xarxa</translation> <translation id="7963826112438303517">L'Assistent utilitza aquestes gravacions i les sol·licituds de veu per crear i actualitzar el teu model de veu, que només es desa als dispositius en què has activat Voice Match. Consulta l'activitat de veu o torna a entrenar el model a Configuració de l'Assistent.</translation> <translation id="7966241909927244760">C&opia l'adreça de la imatge</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 element a la llista d'adreces d'interès}other{{COUNT} elements a la llista d'adreces d'interès}}</translation> @@ -6389,6 +6400,7 @@ <translation id="850875081535031620">No s'ha trobat programari maliciós</translation> <translation id="8509177919508253835">Restableix les claus de seguretat i crea codis PIN</translation> <translation id="8509646642152301857">La baixada del diccionari del corrector ortogràfic ha fallat.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{No s'ha trobat cap contrasenya poc segura}=1{S'ha trobat {COUNT} contrasenya poc segura}other{S'han trobat {COUNT} contrasenyes poc segures}}</translation> <translation id="8512476990829870887">Finalitza el procés</translation> <translation id="851263357009351303">Permet sempre que <ph name="HOST" /> mostri imatges</translation> <translation id="8513108775083588393">Rotació autom.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 241e4908..5182d98 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -4560,7 +4560,6 @@ <translation id="6345878117466430440">Označit jako přečtené</translation> <translation id="6349101878882523185">Nainstalovat aplikaci <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Synchronizace nefunguje. Zkuste se odhlásit a znovu přihlásit.</translation> -<translation id="6351063337294363751">Z této nabídky lze vymazat údaje o prohlížení</translation> <translation id="6354918092619878358">Eliptická křivka SECG secp256r1 (neboli ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Ponechat zařízení zapnuté</translation> <translation id="63566973648609420">Vaše šifrovaná data mohou číst pouze uživatelé, kteří mají vaši heslovou frázi. Heslová fráze se neodesílá do Googlu a není na Googlu uložena. Pokud heslovou frázi zapomenete nebo toto nastavení budete chtít změnit, budete muset <ph name="BEGIN_LINK" />synchronizaci resetovat<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index d9c9bb8..6436df5 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Markér som læst</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Synkronisering virker ikke. Prøv at logge ud og ind igen.</translation> -<translation id="6351063337294363751">Du kan rydde dine browserdata fra denne menu</translation> <translation id="6354918092619878358">SECG elliptisk kurve secp256r1 (også kaldet ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Lad enheden være tændt</translation> <translation id="63566973648609420">Det er kun personer med din adgangssætning, der kan læse dine krypterede data. Adgangssætningen sendes ikke til og gemmes ikke af Google. Hvis du glemmer din adgangssætning eller vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkroniseringen<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 692568b1..1ded5bd 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -867,6 +867,7 @@ <translation id="1976307821760494606"><ph name="DOMAIN" /> hat die ADB-Fehlerbehebung deaktiviert. Dadurch wird <ph name="DEVICE_TYPE" /> in 24 Stunden zurückgesetzt. Sichern Sie alle Dateien, die Sie behalten möchten.</translation> <translation id="1977965994116744507">Verringern Sie den Abstand zwischen Smartphone und <ph name="DEVICE_TYPE" />, um das Gerät zu entsperren.</translation> <translation id="1978006917103730774">Künftige Software- und Sicherheitsupdates werden automatisch installiert.</translation> +<translation id="1978057560491495741">Adresse entfernen</translation> <translation id="1979095679518582070">Wenn Sie diese Funktion deaktivieren, kann dieses Gerät weiterhin Informationen senden, die für grundlegende Dienste wie Systemupdates und -sicherheit erforderlich sind.</translation> <translation id="1979280758666859181">Sie möchten zu einem Kanal mit einer älteren Version von <ph name="PRODUCT_NAME" /> wechseln. Die Änderung erfolgt, sobald die Kanalversion der aktuell auf Ihrem Gerät installierten Version entspricht.</translation> <translation id="197989455406964291">KDC unterstützt den Verschlüsselungstyp nicht</translation> @@ -1068,6 +1069,7 @@ <translation id="2224444042887712269">Inhaber dieser Einstellung ist <ph name="OWNER_EMAIL" />.</translation> <translation id="2224551243087462610">Ordnername bearbeiten</translation> <translation id="2225864335125757863">Bitte ändern Sie umgehend die folgenden Passwörter, um Ihr Konto zu schützen:</translation> +<translation id="2226204716217107988">Möchten Sie zu einem anderen Profil wechseln?</translation> <translation id="2226449515541314767">Dieser Website wurde keine vollständige Kontrolle über MIDI-Geräte gewährt.</translation> <translation id="2226907662744526012">Automatisch entsperren, wenn die PIN eingegeben wurde</translation> <translation id="222704500187107962">Wenn Sie die aktuelle Inkognitositzung beenden, wird diese Ausnahme automatisch entfernt</translation> @@ -1137,6 +1139,7 @@ <translation id="2307462900900812319">Netzwerk konfigurieren</translation> <translation id="230927227160767054">Diese Seite möchte einen Service-Handler installieren.</translation> <translation id="2309620859903500144">Diese Website darf nicht auf meine Bewegungs- oder Lichtsensoren zugreifen.</translation> +<translation id="2312219318583366810">Seiten-URL</translation> <translation id="2314165183524574721">Die aktuelle Sichtbarkeitseinstellung ist "Verborgen"</translation> <translation id="2314774579020744484">Sprache, in die Seiten übersetzt werden sollen</translation> <translation id="2315414688463285945">Fehler beim Konfigurieren von Linux-Dateien. Bitte versuchen Sie es noch einmal.</translation> @@ -2339,6 +2342,7 @@ <translation id="3713047097299026954">Auf diesem Sicherheitsschlüssel sind keine Anmeldedaten gespeichert</translation> <translation id="3714195043138862580">Die Bereitstellung dieses Demogeräts wurde aufgehoben.</translation> <translation id="3714633008798122362">Web-Kalender</translation> +<translation id="3715954932774762075">Apps und Websites, die in mehreren Sprachen verfügbar sind, verwenden die erste unterstützte Sprache auf dieser Liste. Diese Einstellungen werden mit den Browsereinstellungen synchronisiert. <ph name="BEGIN_LINK_LEARN_MORE" />Weitere Informationen<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3719826155360621982">Startseite</translation> <translation id="372062398998492895">CUPS</translation> <translation id="3721119614952978349">Google und ich</translation> @@ -2499,6 +2503,7 @@ <translation id="3882165008614329320">Vorhandenes Video von der Kamera oder als Datei</translation> <translation id="3886446263141354045">Deine Anfrage zum Zugriff auf diese Website wurde an <ph name="NAME" /> gesendet</translation> <translation id="3888550877729210209">Notizerstellung mit <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3890064827463908288">Chrome-Synchronisierung aktivieren, um WLAN-Synchronisation zu verwenden</translation> <translation id="3892414795099177503">OpenVPN/L2TP hinzufügen…</translation> <translation id="3893536212201235195">Einstellungen für Eingabehilfen lesen und ändern</translation> <translation id="3893630138897523026">ChromeVox (gesprochenes Feedback)</translation> @@ -3770,6 +3775,7 @@ <translation id="5449588825071916739">Alle Tabs als Lesezeichen speichern</translation> <translation id="5449716055534515760">Fen&ster schließen</translation> <translation id="5452974209916053028">Aktuelle Inkognitositzung: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /></translation> +<translation id="5454005855577728171">Untertitelfeld wurde auf <ph name="POSITION_ON_SCREEN_FROM_LEFT" /> % waagerecht, <ph name="POSITION_ON_SCREEN_FROM_TOP" /> % senkrecht verschoben</translation> <translation id="5454166040603940656">mit <ph name="PROVIDER" /></translation> <translation id="5457113250005438886">Ungültig</translation> <translation id="5457459357461771897">Fotos, Musik und andere Medien auf Ihrem Computer lesen und löschen</translation> @@ -3913,6 +3919,7 @@ <translation id="5602765853043467355">Lesezeichen, Verlauf, Passwörter und weitere Daten von diesem Gerät löschen</translation> <translation id="5605623530403479164">Andere Suchmaschinen</translation> <translation id="5605758115928394442">An Ihr Smartphone wurde eine Benachrichtigung gesendet, um Ihre Identität zu bestätigen.</translation> +<translation id="560834977503641186">Weitere Informationen zur WLAN-Synchronisation</translation> <translation id="5608580678041221894">Tippen Sie auf die folgenden Tasten, um den Overscan-Bereich anzupassen oder zu verschieben</translation> <translation id="5609231933459083978">Die Anwendung ist anscheinend ungültig.</translation> <translation id="5610038042047936818">Zum Kameramodus wechseln</translation> @@ -4103,6 +4110,7 @@ <translation id="5841270259333717135">Ethernet konfigurieren</translation> <translation id="5842497610951477805">Bluetooth aktivieren</translation> <translation id="5843706793424741864">Fahrenheit</translation> +<translation id="584451707753263735">Automatische Untertitel sind sichtbar. Drücken Sie F6, um den Fokus zu wechseln.</translation> <translation id="5844574845205796324">Inhaltsvorschläge erhalten</translation> <translation id="5846200638699387931">Bezugs-Syntaxfehler: <ph name="ERROR_LINE" /></translation> <translation id="5846807460505171493">Updates und Apps installieren. Wenn Sie fortfahren, stimmen Sie zu, dass dieses Gerät automatisch Updates und Apps von Google, Ihrem Mobilfunkanbieter und dem Hersteller Ihres Geräts herunterladen und installieren darf, möglicherweise über eine mobile Datenverbindung. Einige dieser Apps bieten eventuell In-App-Käufe an.</translation> @@ -4550,7 +4558,6 @@ <translation id="6345878117466430440">Als gelesen markieren</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> installieren</translation> <translation id="6349170655202535379">Die Synchronisierung funktioniert nicht. Melden Sie sich ab und dann wieder an.</translation> -<translation id="6351063337294363751">Über dieses Menü können Sie Ihre Browserdaten löschen</translation> <translation id="6354918092619878358">Elliptische SECG-Kurve secp256r1 (ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Gerät eingeschaltet lassen</translation> <translation id="63566973648609420">Nur Personen mit Ihrer Passphrase können Ihre verschlüsselten Daten lesen. Die Passphrase wird nicht an Google gesendet oder von Google gespeichert. Falls Sie sie vergessen oder diese Einstellung ändern möchten, müssen Sie die <ph name="BEGIN_LINK" />Synchronisierung zurücksetzen<ph name="END_LINK" />.</translation> @@ -5357,6 +5364,7 @@ <translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> wird jetzt im Vollbildmodus angezeigt.</translation> <translation id="7340650977506865820">Ihr Bildschirm wurde von der Website freigegeben</translation> <translation id="7341834142292923918">Möchte auf diese Website zugreifen</translation> +<translation id="7343372807593926528">Bitte beschreiben Sie das Problem, bevor Sie Feedback senden.</translation> <translation id="7345706641791090287">Passwort bestätigen</translation> <translation id="7346909386216857016">Ok</translation> <translation id="7347452120014970266">Dadurch werden alle Daten und Cookies gelöscht, die von <ph name="ORIGIN_NAME" /> und den zugehörigen installierten Apps gespeichert wurden</translation> @@ -5773,6 +5781,7 @@ <translation id="7819857487979277519">PSK (WPA oder RSN)</translation> <translation id="7819992334107904369">Chrome-Synchronisierung</translation> <translation id="782057141565633384">Videoadresse k&opieren</translation> +<translation id="7822187537422052256">Möchten Sie diese Adresse wirklich entfernen?</translation> <translation id="7824864914877854148">Sicherung konnte aufgrund eines Fehlers nicht abgeschlossen werden</translation> <translation id="7825666486843191125">Alle Kontakte in meiner Nähe, wenn das Display entsperrt ist</translation> <translation id="782590969421016895">Aktuelle Seiten verwenden</translation> @@ -6298,6 +6307,7 @@ <translation id="8419098111404128271">Suchergebnisse für "<ph name="SEARCH_TEXT" />"</translation> <translation id="8419368276599091549">Willkommen bei Ihrem <ph name="DEVICE_TYPE" />!</translation> <translation id="8420308167132684745">Wörterbucheinträge bearbeiten</translation> +<translation id="8421361468937925547">Automatische Untertitel (nur auf Englisch)</translation> <translation id="8422787418163030046">Fach fehlt</translation> <translation id="8425213833346101688">Ändern</translation> <translation id="8425492902634685834">An Taskleiste anpinnen</translation> @@ -6326,6 +6336,7 @@ <translation id="8449036207308062757">Speicherplatz verwalten</translation> <translation id="8452135315243592079">Keine SIM-Karte vorhanden</translation> <translation id="8455026683977728932">Fehler bei der Aktivierung der ADB-Illustration</translation> +<translation id="8456398879271637452">Automatische Untertitel sind sichtbar. Drücken Sie Strg + Zurück oder Strg + Vor, um den Fokus zu wechseln.</translation> <translation id="845702320058262034">Verbindung nicht möglich. Kontrollieren Sie, ob Bluetooth auf Ihrem Smartphone aktiviert ist.</translation> <translation id="8457451314607652708">Lesezeichen importieren</translation> <translation id="8458627787104127436">Alle (<ph name="URL_COUNT" />) in neuem Fenster öffnen</translation> @@ -6836,6 +6847,7 @@ <translation id="9027459031423301635">Link in neuem Tab öffnen</translation> <translation id="9030515284705930323">Ihre Organisation hat den Google Play Store für Ihr Konto nicht aktiviert. Weitere Informationen erhalten Sie von Ihrem Administrator.</translation> <translation id="9030785788945687215">Gmail</translation> +<translation id="9030855135435061269"><ph name="PLUGIN_NAME" /> wird nicht mehr unterstützt</translation> <translation id="9031549947500880805">In Google Drive sichern. Sie können Ihre Daten jederzeit wiederherstellen – auch auf einem anderen Gerät. In Ihrer Sicherung sind auch App-Daten enthalten.</translation> <translation id="9033765790910064284">Trotzdem fortfahren</translation> <translation id="9033857511263905942">&Einfügen</translation> @@ -6844,6 +6856,7 @@ <translation id="9039014462651733343">{NUM_ATTEMPTS,plural, =1{Sie haben noch einen Eingabeversuch.}other{Sie haben noch # Eingabeversuche.}}</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9040661932550800571">Passwort für <ph name="ORIGIN" /> aktualisieren?</translation> +<translation id="9041049756004505730">Automatische Untertitel sind sichtbar. Drücken Sie ⌘ + Option + Aufwärtspfeil oder Abwärtspfeil, um den Fokus zu wechseln.</translation> <translation id="9041692268811217999">Der Zugriff auf lokale Dateien auf Ihrem Gerät wurde von Ihrem Administrator deaktiviert</translation> <translation id="904224458472510106">Dieser Vorgang kann nicht rückgängig gemacht werden</translation> <translation id="9042893549633094279">Datenschutz und Sicherheit</translation> @@ -6882,6 +6895,7 @@ <translation id="9088446193279799727">Linux konnte nicht konfiguriert werden. Stellen Sie eine Verbindung zum Internet her und versuchen Sie es noch einmal.</translation> <translation id="9088917181875854783">Bitte bestätigen Sie, dass dieser Zugangscode auf "<ph name="DEVICE_NAME" />" angezeigt wird:</translation> <translation id="9089416786594320554">Eingabemethoden</translation> +<translation id="909108997331068008"><ph name="NEW_USER" /> ist bereits mit dem Profil von <ph name="EXISTING_USER" /> angemeldet</translation> <translation id="9093429538970210897">Wir empfehlen, vor diesem Update Dateien zu sichern, für den Fall, dass es nicht abgeschlossen werden kann. Beim Start des Upgrades wird Linux (Beta) heruntergefahren. Speichern Sie bitte die geöffneten Dateien, bevor Sie fortfahren.</translation> <translation id="9094033019050270033">Passwort aktualisieren</translation> <translation id="9094038138851891550">Nutzername ungültig</translation> @@ -7055,5 +7069,6 @@ <translation id="994289308992179865">Sch&leife</translation> <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Sichere Verbindung wird hergestellt...</translation> +<translation id="99731366405731005">Aktivieren Sie die <ph name="LINK1_BEGIN" />Chrome-Synchronisierung<ph name="LINK1_END" />, um die WLAN-Synchronisation zu verwenden. <ph name="LINK2_BEGIN" />Weitere Informationen<ph name="LINK2_END" /></translation> <translation id="998747458861718449">Untersuchen</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 3aae37a5d..73fcc55 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Επισήμανση ως αναγνωσμένο</translation> <translation id="6349101878882523185">Εγκατάσταση εφαρμογής <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Ο συγχρονισμός δεν λειτουργεί. Δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε ξανά.</translation> -<translation id="6351063337294363751">Μπορείτε να διαγράψετε τα δεδομένα περιήγησης από αυτό το μενού</translation> <translation id="6354918092619878358">Ελλειπτική καμπύλη SECG secp256r1 (επίσης γνωστή ως ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Κρατήστε τη συσκευή ενεργοποιημένη</translation> <translation id="63566973648609420">Μόνο κάποιος που γνωρίζει τη φράση πρόσβασης μπορεί να διαβάσει τα κρυπτογραφημένα δεδομένα σας. Η φράση πρόσβασης δεν αποστέλλεται ούτε αποθηκεύεται στην Google. Εάν ξεχάσετε τη φράση πρόσβασης ή θέλετε να αλλάξετε αυτήν τη ρύθμιση, θα πρέπει να <ph name="BEGIN_LINK" />επαναφέρετε τον συγχρονισμό<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 91bd566..04526f0 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -4570,7 +4570,6 @@ <translation id="6345878117466430440">Mark as read</translation> <translation id="6349101878882523185">Install <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sync isn’t working. Try signing out and back in again.</translation> -<translation id="6351063337294363751">You can clear your browsing data from this menu</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Keep device turned on</translation> <translation id="63566973648609420">Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, you'll need to <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 1811bc0..2f5b908 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -4559,7 +4559,6 @@ <translation id="6345878117466430440">Marcar como leído</translation> <translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">La sincronización no funciona. Intenta salir y volver a acceder.</translation> -<translation id="6351063337294363751">Puedes borrar los datos de navegación desde este menú</translation> <translation id="6354918092619878358">Curva elíptica SECG elliptic secp256r1 (también conocido como ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">No apagues el dispositivo</translation> <translation id="63566973648609420">Solo las personas que tengan tu frase de contraseña pueden leer los datos encriptados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar esta configuración, deberás <ph name="BEGIN_LINK" />restablecer la sincronización<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 1e8f6378..fe1f764 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Crear acceso directo</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2053312383184521053">Datos de estado de inactividad</translation> +<translation id="2054665754582400095">Tu presencia</translation> <translation id="2055585478631012616">Se cerrarán tus sesiones en esos sitios web (también en las pestañas abiertas)</translation> <translation id="205560151218727633">Logotipo del Asistente de Google</translation> <translation id="2058456167109518507">Dispositivo detectado</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Ir a la pantalla de inicio</translation> <translation id="2387458720915042159">Tipo de conexión con proxy</translation> <translation id="2390347491606624519">No se ha podido conectar al proxy, vuelve a iniciar sesión</translation> +<translation id="2390782873446084770">Sincronización Wi‑Fi</translation> <translation id="2391082728065870591">Enviar informe de opinión</translation> <translation id="2391419135980381625">Fuente estándar</translation> <translation id="2392163307141705938">Has llegado al límite de tiempo de uso de <ph name="IDS_SHORT_PRODUCT_NAME" /> establecido por tu padre o madre.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Restaurar</translation> <translation id="3158033540161634471">Configura la huella digital</translation> <translation id="3159493096109238499">Beis</translation> +<translation id="3159978855457658359">Editar nombre del dispositivo</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (respaldado por hardware)</translation> <translation id="3161522574479303604">Todos los idiomas</translation> <translation id="3162853326462195145">Cuenta de centro educativo</translation> @@ -3229,6 +3232,7 @@ <translation id="4761104368405085019">Utilizar el micrófono</translation> <translation id="4762718786438001384">El espacio en disco del dispositivo está prácticamente agotado</translation> <translation id="4763408175235639573">Se han permitido las siguientes cookies al visitar esta página</translation> +<translation id="4764368918650455114">Asegúrate de que los dos dispositivos estén desbloqueados, se encuentren cerca y tengan el Bluetooth activado. Si vas a compartir archivos con un Chromebook, comprueba que Compartir con Nearby esté activo (selecciona la hora para abrir el área de estado y luego selecciona Compartir con Nearby). <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Permite que Mensajes Android transmita mensajes desde tu teléfono al Chromebook</translation> <translation id="476598255842811483">Nadie, salvo que abras Compartir con Nearby en tu dispositivo</translation> <translation id="4768332406694066911">Tienes certificados de estas organizaciones que te identifican</translation> @@ -3391,6 +3395,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Tu administrador ha instalado esta aplicación.</translation> <translation id="4964455510556214366">Disposición</translation> +<translation id="496446150016900060">Sincroniza redes Wi-Fi con tu teléfono</translation> <translation id="4965808351167763748">¿Seguro que quieres configurar este dispositivo para que utilice Hangouts Meet?</translation> <translation id="496888482094675990">La aplicación Archivos permite acceder rápidamente a los archivos que has guardado en Google Drive, en un almacenamiento externo o en tu dispositivo Chrome OS.</translation> <translation id="4971412780836297815">Abrir al finalizar</translation> @@ -3697,6 +3702,7 @@ <translation id="5341980496415249280">Espera mientras se comprime…</translation> <translation id="5342091991439452114">El PIN debe tener al menos <ph name="MINIMUM" /> dígitos</translation> <translation id="5344036115151554031">Restaurando Linux</translation> +<translation id="5345916423802287046">Abrir aplicación al iniciar sesión</translation> <translation id="5350293332385664455">Desactivar el Asistente de Google</translation> <translation id="535123479159372765">Texto copiado desde otro dispositivo</translation> <translation id="5352033265844765294">Impresión de fecha</translation> @@ -4006,6 +4012,7 @@ <translation id="5704875434923668958">Sincronizando con</translation> <translation id="5705005699929844214">Mostrar siempre opciones de accesibilidad</translation> <translation id="5705882733397021510">Volver</translation> +<translation id="5707117624115653804">Personaliza el tamaño y el estilo de los subtítulos en las aplicaciones y los sitios web que admiten este ajuste.</translation> <translation id="5707185214361380026">Error al cargar la extensión desde:</translation> <translation id="5708171344853220004">Nombre principal de Microsoft</translation> <translation id="5709557627224531708">Establecer Google Chrome como navegador predeterminado</translation> @@ -4169,6 +4176,7 @@ <translation id="5904614460720589786">No se ha podido configurar <ph name="APP_NAME" /> debido a un problema de configuración. Ponte en contacto con tu administrador. Código de error: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">El dispositivo está casi actualizado. Reinícialo para completar la actualización.</translation> <translation id="5906732635754427568">Los datos asociados a esta aplicación se eliminarán de este dispositivo.</translation> +<translation id="5908474332780919512">Abrir aplicación al iniciar sesión</translation> <translation id="5908695239556627796">Velocidad de desplazamiento del ratón</translation> <translation id="5908769186679515905">Impedir que los sitios web ejecuten Flash</translation> <translation id="5910363049092958439">Guar&dar imagen como...</translation> @@ -4561,7 +4569,6 @@ <translation id="6345878117466430440">Marcar como leído</translation> <translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">La sincronización no funciona. Prueba a cerrar sesión y volver a iniciarla.</translation> -<translation id="6351063337294363751">En este menú puedes borrar los datos de navegación</translation> <translation id="6354918092619878358">Curva elíptica SECG secp256r1 (también denominada ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">No apagues el dispositivo</translation> <translation id="63566973648609420">Solo alguien que tenga tu frase de contraseña puede leer tus datos cifrados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar estos ajustes, debes <ph name="BEGIN_LINK" />restablecer la sincronización<ph name="END_LINK" />.</translation> @@ -4709,6 +4716,7 @@ <translation id="6532527800157340614">Se ha producido un error al iniciar sesión porque no se ha podido recuperar tu token de acceso. Revisa tu conexión de red y vuelve a intentarlo.</translation> <translation id="6532663472409656417">Registrado en la empresa</translation> <translation id="6535331821390304775">Permitir siempre que <ph name="ORIGIN" /> abra este tipo de enlaces en la aplicación asociada</translation> +<translation id="6537613839935722475">El nombre puede contener letras, números y guiones (-).</translation> <translation id="6538635548667167211">La configuración actual de uso de datos es Datos</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> @@ -4797,6 +4805,7 @@ <translation id="6650234781371031356">Tu contraseña de <ph name="WEBSITE" /> está almacenada en este dispositivo y en tu cuenta de Google. ¿De dónde la quieres eliminar?</translation> <translation id="665061930738760572">Abrir en una ventana &nueva</translation> <translation id="6651237644330755633">Confiar en este certificado para identificar sitios web</translation> +<translation id="6651495917527016072">Sincroniza redes Wi‑Fi con tu teléfono. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="665355505818177700">La integración de <ph name="MS_AD_NAME" /> con Chrome solo se admite en plataformas x86_64. Los Chromebooks basados en una plataforma ARM o x86 no admiten esta función.</translation> <translation id="6654509035557065241">Establecer como red preferida</translation> <translation id="6655190889273724601">Modo de desarrollador</translation> @@ -5400,6 +5409,7 @@ <translation id="7375235221357833624">{0,plural, =1{Actualizar dispositivo dentro de 1 hora}other{Actualizar dispositivo dentro de # horas}}</translation> <translation id="7376553024552204454">Resaltar el cursor del ratón al moverlo</translation> <translation id="7377451353532943397">Seguir bloqueando el acceso a los sensores</translation> +<translation id="7378611153938412599">Las contraseñas poco seguras son fáciles de adivinar. Asegúrate de que tus contraseñas sean seguras. <ph name="BEGIN_LINK" />Ver más consejos de seguridad<ph name="END_LINK" /></translation> <translation id="73786666777299047">Abrir Chrome Web Store</translation> <translation id="7378812711085314936">Obtener conexión de datos</translation> <translation id="7380622428988553498">El nombre del dispositivo contiene caracteres no válidos</translation> @@ -5924,6 +5934,7 @@ <translation id="7959074893852789871">El archivo contenía varios certificados, pero algunos de ellos no se han importado:</translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7963001036288347286">Aceleración del panel táctil</translation> +<translation id="7963608432878156675">Otros dispositivos pueden ver este nombre en las conexiones de red o Bluetooth.</translation> <translation id="7963826112438303517">Tu Asistente utiliza estas grabaciones y tus solicitudes de voz para crear y actualizar tu modelo de voz, que solo se almacena en los dispositivos en los que hayas activado Voice Match. Puedes ver o volver a entrenar tu actividad de voz en la configuración del Asistente.</translation> <translation id="7966241909927244760">C&opiar dirección de imagen</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 elemento en la lista de marcadores}other{{COUNT} elementos en la lista de marcadores}}</translation> @@ -6388,6 +6399,7 @@ <translation id="850875081535031620">No se ha encontrado software dañino</translation> <translation id="8509177919508253835">Restablece las llaves de seguridad y crea los PIN</translation> <translation id="8509646642152301857">Se ha producido un error al descargar el diccionario del corrector ortográfico.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{No se han encontrado contraseñas poco seguras}=1{{COUNT} contraseña poco segura encontrada}other{{COUNT} contraseñas poco seguras encontradas}}</translation> <translation id="8512476990829870887">Finalizar proceso</translation> <translation id="851263357009351303">Permitir siempre que <ph name="HOST" /> muestre imágenes</translation> <translation id="8513108775083588393">Girar autom.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 9cec1e74..d1a4456 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Loo otsetee</translation> <translation id="2050339315714019657">Vertikaalpaigutus</translation> <translation id="2053312383184521053">Jõudeoleku andmed</translation> +<translation id="2054665754582400095">Teie kohalolek</translation> <translation id="2055585478631012616">Teid logitakse nendelt saitidelt (sh avatud vahelehtedel) välja</translation> <translation id="205560151218727633">Google'i assistendi logo</translation> <translation id="2058456167109518507">Tuvastati seade</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Mine avalehele</translation> <translation id="2387458720915042159">Puhverserveri ühenduse tüüp</translation> <translation id="2390347491606624519">Ei saa puhverserveriga ühendust luua, logige uuesti sisse</translation> +<translation id="2390782873446084770">WiFi sünkroonimine</translation> <translation id="2391082728065870591">Saada tagasisidearuanne</translation> <translation id="2391419135980381625">Standardne font</translation> <translation id="2392163307141705938">Jõudsid piiranguni, mille sinu vanem teenuses <ph name="IDS_SHORT_PRODUCT_NAME" /> määras.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Taasta</translation> <translation id="3158033540161634471">Sõrmejälje seadistamine</translation> <translation id="3159493096109238499">Beež</translation> +<translation id="3159978855457658359">Seadme nime muutmine</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (riistvaratoega)</translation> <translation id="3161522574479303604">Kõik keeled</translation> <translation id="3162853326462195145">Kooli konto</translation> @@ -3230,6 +3233,7 @@ <translation id="4761104368405085019">Mikrofoni kasutamine</translation> <translation id="4762718786438001384">Seadmes on kriitiliselt vähe kettaruumi</translation> <translation id="4763408175235639573">Lehe vaatamisel seati järgmised küpsised</translation> +<translation id="4764368918650455114">Veenduge, et mõlemad seadmed oleksid avatud, lähestikku ja Bluetooth oleks sisse lülitatud. Kui jagate Chromebookiga, veenduge, et funktsioon Läheduses jagamine oleks aktiveeritud (avage olekuala, valides kellaaja, seejärel tehke valik Läheduses jagamine). <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Lubab rakendusel Android Messages tekstisõnumeid telefonist Chromebooki edastada</translation> <translation id="476598255842811483">Mitte keegi, v.a juhul, kui aktiveerite oma seadmes funktsiooni Läheduses jagamine</translation> <translation id="4768332406694066911">Teil on nende organisatsioonide sertifikaadid, mis teid tuvastavad</translation> @@ -3392,6 +3396,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Selle rakenduse installis administraator.</translation> <translation id="4964455510556214366">Asetus</translation> +<translation id="496446150016900060">Sünkroonida WiFi-võrke teie telefoniga</translation> <translation id="4965808351167763748">Kas soovite kindlasti selle seadme seadistada, et rakendust Hangouts Meet käitada?</translation> <translation id="496888482094675990">Rakendusega Failid saate kiiresti juurdepääsu Google Drive'i, välisesse talletusseadmesse või Chrome OS-i seadmesse salvestatud failidele.</translation> <translation id="4971412780836297815">Ava, kui on valmis</translation> @@ -3698,6 +3703,7 @@ <translation id="5341980496415249280">Oodake, pakkimine on pooleli …</translation> <translation id="5342091991439452114">PIN-kood peab olema vähemalt <ph name="MINIMUM" /> numbrit</translation> <translation id="5344036115151554031">Linuxi taastamine</translation> +<translation id="5345916423802287046">Käivita rakendus sisselogimisel</translation> <translation id="5350293332385664455">Google'i assistendi väljalülitamine</translation> <translation id="535123479159372765">Tekst kopeeriti muust seadmest</translation> <translation id="5352033265844765294">Ajatempel</translation> @@ -4007,6 +4013,7 @@ <translation id="5704875434923668958">Sünkroonimine kontoga</translation> <translation id="5705005699929844214">Kuva alati juurdepääsetavuse valikud</translation> <translation id="5705882733397021510">Mine tagasi</translation> +<translation id="5707117624115653804">Kohandage subtiitrite suurust ja stiili rakenduste ning saitide puhul, mis seda seadet toetavad</translation> <translation id="5707185214361380026">Laienduse laadimine järgmisest asukohast ebaõnnestus:</translation> <translation id="5708171344853220004">Microsofti põhinimi</translation> <translation id="5709557627224531708">Määrake Chrome vaikebrauseriks</translation> @@ -4170,6 +4177,7 @@ <translation id="5904614460720589786">Rakendust <ph name="APP_NAME" /> ei saanud konfiguratsiooniprobleemi tõttu seadistada. Võtke ühendust administraatoriga. Veakood: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Seade on peaaegu ajakohane. Värskenduse lõpuleviimiseks taaskäivitage seade.</translation> <translation id="5906732635754427568">Selle rakendusega seostatud andmed eemaldatakse seadmest.</translation> +<translation id="5908474332780919512">Käivita rakendus sisselogimisel</translation> <translation id="5908695239556627796">Hiire kerimiskiirus</translation> <translation id="5908769186679515905">Keela Flashi käitamine saitidel</translation> <translation id="5910363049092958439">Sal&vesta pilt nimega...</translation> @@ -4562,7 +4570,6 @@ <translation id="6345878117466430440">Märgi loetuks</translation> <translation id="6349101878882523185">Installi <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sünkroonimine ei tööta. Logige välja ja seejärel uuesti sisse.</translation> -<translation id="6351063337294363751">Selles menüüs saate kustutada oma sirvimisandmed</translation> <translation id="6354918092619878358">SECG elliptilise kõveraga secp256r1 (ehk ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Hoidke seade sisselülitatuna</translation> <translation id="63566973648609420">Teie krüpteeritud andmeid saavad lugeda vaid need, kes teavad teie parooli – seda ei saadeta Google'ile ja Google ei talleta seda. Kui unustate parooli või soovite seda seadet muuta, tuleb teil <ph name="BEGIN_LINK" />sünkroonimine lähtestada<ph name="END_LINK" />.</translation> @@ -4710,6 +4717,7 @@ <translation id="6532527800157340614">Sisselogimine ebaõnnestus, kuna teie juurdepääsuluba ei õnnestunud hankida. Kontrollige võrguühendust ja proovige uuesti.</translation> <translation id="6532663472409656417">Ettevõttes registreeritud</translation> <translation id="6535331821390304775">Luba teenusel <ph name="ORIGIN" /> seda tüüpi linke alati avada seotud rakenduses</translation> +<translation id="6537613839935722475">Nimi võib sisaldada tähemärke, numbreid ja sidekriipse (-)</translation> <translation id="6538635548667167211">Praegune andmekasutuse seade on Andmeside</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> @@ -4798,6 +4806,7 @@ <translation id="6650234781371031356">Teie saidi <ph name="WEBSITE" /> parool salvestatakse sellesse seadmesse ja teie Google'i kontole. Millise soovite kustutada?</translation> <translation id="665061930738760572">Ava &uues aknas</translation> <translation id="6651237644330755633">Usaldatakse seda sertifikaati veebisaitide tuvastamiseks</translation> +<translation id="6651495917527016072">Sünkroonige WiFi-võrke oma telefoniga. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="665355505818177700">Chrome'i teenuse <ph name="MS_AD_NAME" /> integreerimist toetatakse ainult x86_64-põhistel platvormidel. ARM-ile või x86-põhisele platvormile ehitatud Chromebookid seda funktsiooni ei toeta.</translation> <translation id="6654509035557065241">Eelista võrku</translation> <translation id="6655190889273724601">Arendaja režiim</translation> @@ -5401,6 +5410,7 @@ <translation id="7375235221357833624">{0,plural, =1{Värskendage seadet tunni jooksul}other{Värskendage seadet # tunni jooksul}}</translation> <translation id="7376553024552204454">Tõsta hiirekursor esile, kui see liigub</translation> <translation id="7377451353532943397">Blokeeri ka edaspidi juurdepääs anduritele</translation> +<translation id="7378611153938412599">Nõrku paroole on lihtne ära arvata. Veenduge, et looksite tugevad paroolid. <ph name="BEGIN_LINK" />Vaadake rohkem turvanõuandeid.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Ava Chrome'i veebipood</translation> <translation id="7378812711085314936">Andmesideühenduse hankimine</translation> <translation id="7380622428988553498">Seadme nimi sisaldab sobimatuid tähemärke</translation> @@ -5925,6 +5935,7 @@ <translation id="7959074893852789871">Fail sisaldas mitut sertifikaati, mõnda neist ei imporditud:</translation> <translation id="7961015016161918242">Mitte kunagi</translation> <translation id="7963001036288347286">Puuteplaadi kiirendamine</translation> +<translation id="7963608432878156675">See nimi on teistele seadmetele Bluetoothi ja võrguühenduste jaoks nähtav</translation> <translation id="7963826112438303517">Assistent kasutab neid salvestisi ja teie öeldud päringuid teie häälemudeli loomiseks ja värskendamiseks. Mudel salvestatakse ainult seadmetes, kus Voice Match on sisse lülitatud. Assistendi seadetes saate häältegevusi vaadata ja ümber õpetada.</translation> <translation id="7966241909927244760">K&opeeri kujutise aadress</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 üksus järjehoidjate loendis}other{{COUNT} üksust järjehoidjate loendis}}</translation> @@ -6389,6 +6400,7 @@ <translation id="850875081535031620">Ohtlikku tarkvara ei leitud</translation> <translation id="8509177919508253835">Turvavõtmete lähtestamine ja PIN-koodide loomine</translation> <translation id="8509646642152301857">Õigekirjakontrolli sõnastiku allalaadimine ebaõnnestus.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Ei leitud ühtegi nõrka parooli}=1{Leiti {COUNT} nõrk parool}other{Leiti {COUNT} nõrka parooli}}</translation> <translation id="8512476990829870887">Lõpeta protsess</translation> <translation id="851263357009351303">Luba alati saidil <ph name="HOST" /> pilte kuvada</translation> <translation id="8513108775083588393">Aut. pööramine</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 209e7b66..04a6a80 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Markatu irakurritako gisa</translation> <translation id="6349101878882523185">Instalatu <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinkronizazioa ez dabil. Amaitu eta hasi berriro saioa.</translation> -<translation id="6351063337294363751">Menu honetan, arakatze-datuak garbi ditzakezu</translation> <translation id="6354918092619878358">SECG kurba eliptikoko secp256r1 (edo, bestela esanda: ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Mantendu gailua piztuta</translation> <translation id="63566973648609420">Pasaesaldia duten pertsonek soilik irakur ditzakete enkriptatutako datuak. Pasaesaldia ez da Google-ra bidaltzen, ezta bertan gordetzen ere. Pasaesaldia ahazten bazaizu edo ezarpena aldatu nahi baduzu, sinkronizazioa berrezarri beharko duzu. <ph name="BEGIN_LINK" />Berrezarri sinkronizazioa<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 700abbe..ac0bdd7 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -4559,7 +4559,6 @@ <translation id="6345878117466430440">علامتگذاری بهعنوان خواندهشده</translation> <translation id="6349101878882523185">نصب <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">همگامسازی کار نمیکند. از سیستم خارج شوید و دوباره به آن وارد شوید.</translation> -<translation id="6351063337294363751">میتوانید دادههای مرور را از این منو پاک کنید</translation> <translation id="6354918092619878358">منحنی بیضوی SECG مدل secp256r1 (بهنام ANSI X9.62 prime256v1، NIST P-256)</translation> <translation id="635609604405270300">روشن نگهداشتن دستگاه</translation> <translation id="63566973648609420">فقط فردی که عبارت عبور شما را دارد میتواند اطلاعات رمزگذاریشدهتان را بخواند. این عبارت عبور به Google ارسال یا در سرورهای آن ذخیره نمیشود. اگر عبارت عبورتان را فراموش کنید، باید همگامسازی را بازنشانی کنید. <ph name="BEGIN_LINK" />بازنشانی همگامسازی<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index bbb29938..eefe9c0 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">Merkitse luetuksi</translation> <translation id="6349101878882523185">Asenna <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Synkronointi ei onnistu. Yritä kirjautua ensin ulos ja sitten takaisin sisään.</translation> -<translation id="6351063337294363751">Voit tyhjentää selaustiedot tämän valikon kautta.</translation> <translation id="6354918092619878358">SECG elliptinen käyrä secp256r1 (eli ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Pidä laite päällä</translation> <translation id="63566973648609420">Salattuja tietojasi voi lukea vain tunnuslauseesi avulla. Tunnuslausetta ei lähetetä Googlelle eikä Google tallenna sitä. Jos unohdat tunnuslauseesi tai haluat muokata tätä asetusta, <ph name="BEGIN_LINK" />synkronointi on nollattava<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index e5f074c9..8f3a1e8 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Markahang nabasa na</translation> <translation id="6349101878882523185">I-install ang <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Hindi gumagana ang pag-sync. Subukang mag-sign out at muling mag-sign in.</translation> -<translation id="6351063337294363751">Maaari mong i-clear ang iyong data sa pag-browse sa menu na ito</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (na tinatawag ding ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Panatilihing naka-on ang device</translation> <translation id="63566973648609420">Ang taong may alam ng passphrase mo lang ang makakabasa sa iyong naka-encrypt na data. Hindi ipinapadala sa o iniimbak ng Google ang passphrase. Kung makalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, kakailanganin mong <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 45affbb..7edaa8c 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Marquer comme lu</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">La synchronisation ne fonctionne pas. Essayez de vous déconnecter et de vous reconnecter.</translation> -<translation id="6351063337294363751">Vous pouvez effacer vos données de navigation à partir de ce menu</translation> <translation id="6354918092619878358">Courbe elliptique SECG secp256r1 (aussi appelée ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Laissez l'appareil allumé</translation> <translation id="63566973648609420">Seule une personne connaissant votre phrase de passe peut lire vos données chiffrées. Google ne reçoit pas la phrase de passe et ne la stocke pas. Si vous l'oubliez ou souhaitez modifier ce paramètre, vous devrez <ph name="BEGIN_LINK" />réinitialiser la synchronisation<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 554771a..da90aa0 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Marquer comme lu</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">La synchronisation ne fonctionne pas. Essayez de vous déconnecter, puis de vous reconnecter.</translation> -<translation id="6351063337294363751">Vous pouvez effacer vos données de navigation à partir de ce menu.</translation> <translation id="6354918092619878358">Courbe elliptique SECG secp256r1 (également appelée "ANSI X9.62 prime256v1, NIST P-256")</translation> <translation id="635609604405270300">N'éteignez pas l'appareil</translation> <translation id="63566973648609420">Seule une personne connaissant votre phrase secrète peut lire vos données chiffrées. La phrase secrète ne nous est pas envoyée et nous ne la stockons pas. Si vous l'oubliez ou si vous voulez modifier ce paramètre, vous devrez <ph name="BEGIN_LINK" />réinitialiser la synchronisation<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 6632497..7ee484cf 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">Marcar como lido</translation> <translation id="6349101878882523185">Instalar a aplicación <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">A sincronización non funciona. Proba a pechar sesión e volver iniciala.</translation> -<translation id="6351063337294363751">Podes borrar os datos do navegador desde este menú</translation> <translation id="6354918092619878358">SECG Elliptic Curve secp256r1 (tamén se denomina ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Non apagues o dispositivo</translation> <translation id="63566973648609420">Só alguén co teu contrasinal pode ler os teus datos encriptados. O contrasinal non se envía nin se almacena en Google. Se esqueciches o contrasinal ou queres cambiar esta configuración, deberás <ph name="BEGIN_LINK" />restablecer a sincronización<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 4d818aa..3aec8152 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -4560,7 +4560,6 @@ <translation id="6345878117466430440">વાંચેલાં તરીકે માર્ક કરો</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ઇન્સ્ટૉલ કરો</translation> <translation id="6349170655202535379">સિંક કામ કરી રહ્યું નથી. સાઇન આઉટ કરીને ફરી પાછા સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation> -<translation id="6351063337294363751">તમે આ મેનૂમાંથી તમારો બ્રાઉઝિંગ ડેટા સાફ કરી શકો છો</translation> <translation id="6354918092619878358">SECG એલિપ્ટિક કર્વ secp256r1 (ઉર્ફ ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ડિવાઇસને ચાલુ રાખો</translation> <translation id="63566973648609420">માત્ર તમારા પાસફ્રેઝ સાથેની કોઈ વ્યક્તિ જ તમારા એન્ક્રિપ્ટ કરેલા ડેટાને વાંચી શકે છે. Googleને પાસફ્રેઝ મોકલવામાં આવતો નથી કે એના દ્વારા સ્ટોર કરવામાં આવતો નથી. જો તમે તમારો પાસફ્રેઝ ભૂલી જાઓ અથવા આ સેટિંગ બદલવા માંગતા હો, તો તમારે <ph name="BEGIN_LINK" />સિંકને ફરીથી સેટ<ph name="END_LINK" /> કરવું પડશે.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 10c1286..209a640 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">'पढ़ा गया' के तौर पर मार्क करें</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> इंस्टॉल करें</translation> <translation id="6349170655202535379">सिंक काम नहीं कर रहा है. प्रस्थान करके और वापस प्रवेश करके देखें.</translation> -<translation id="6351063337294363751">आप इस मेन्यू से अपना ब्राउज़िंग डेटा साफ़ कर सकते हैं</translation> <translation id="6354918092619878358">SECG अंडाकार वक्र secp256r1 (अर्थात ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">डिवाइस चालू रखें</translation> <translation id="63566973648609420">आपके सुरक्षित किए गए डेटा को सिर्फ़ वही व्यक्ति पढ़ सकता है जिसके पास आपका लंबा पासवर्ड है. लंबा पासवर्ड Google को नहीं भेजा जाता है. Google इसे सेव भी नहीं करता है. अगर आप अपना लंबा पासवर्ड भूल जाते हैं या यह सेटिंग बदलना चाहते हैं, तो आपको <ph name="BEGIN_LINK" />सिंक रीसेट करना होगा<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 037e69e..fff166d5 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Stvori prečac</translation> <translation id="2050339315714019657">Portret</translation> <translation id="2053312383184521053">Podaci o stanju mirovanja</translation> +<translation id="2054665754582400095">Vaša prisutnost</translation> <translation id="2055585478631012616">Odjavit ćete se s tih web-lokacija, uključujući i prijave na otvorenim karticama</translation> <translation id="205560151218727633">Logotip Google asistenta</translation> <translation id="2058456167109518507">Otkriven je uređaj</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Otvaranje početnog zaslona</translation> <translation id="2387458720915042159">Vrsta proxy veze</translation> <translation id="2390347491606624519">Nije uspjelo povezivanje s proxyjem, ponovno se prijavite</translation> +<translation id="2390782873446084770">Wi-Fi sinkronizacija</translation> <translation id="2391082728065870591">Slanje izvješća s povratnim informacijama</translation> <translation id="2391419135980381625">Standardni font</translation> <translation id="2392163307141705938">Dosegnuto je vremensko ograničenje koje je tvoj roditelj postavio za <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Vrati</translation> <translation id="3158033540161634471">Postavljanje otiska prsta</translation> <translation id="3159493096109238499">Bež</translation> +<translation id="3159978855457658359">Uredite naziv uređaja</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (s hardverskom podlogom)</translation> <translation id="3161522574479303604">Svi jezici</translation> <translation id="3162853326462195145">Školski račun</translation> @@ -3230,6 +3233,7 @@ <translation id="4761104368405085019">upotrijebiti vaš mikrofon</translation> <translation id="4762718786438001384">Količina prostora na disku uređaja kritično je mala</translation> <translation id="4763408175235639573">Prilikom pregledavanja ove stranice postavljeni su sljedeći kolačići</translation> +<translation id="4764368918650455114">Provjerite jesu li oba uređaja otključana, blizu jedan drugome te imaju li uključen Bluetooth. Ako dijelite s Chromebookom, provjerite je li Dijeljenje s Android uređajima uključeno (otvorite područje statusa tako što ćete odabrati vrijeme, a zatim odaberite Dijeljenje s Android uređajima). <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Omogućuje Android porukama prijenos tekstnih poruka s vašeg telefona na Chromebook</translation> <translation id="476598255842811483">Nitko, osim ako na svojem uređaju otvorite Dijeljenje s Android uređajima</translation> <translation id="4768332406694066911">Imate certifikate ovih organizacija koji vas identificiraju</translation> @@ -3392,6 +3396,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Aplikaciju je instalirao vaš administrator.</translation> <translation id="4964455510556214366">Poredak</translation> +<translation id="496446150016900060">Sinkronizirajte Wi-Fi mreže s telefonom</translation> <translation id="4965808351167763748">Jeste li sigurni da želite postaviti ovaj uređaj za pokretanje Hangouts Meeta?</translation> <translation id="496888482094675990">Aplikacija Datoteke pruža brzi pristup datotekama spremljenima na Google disku, u vanjskoj pohrani ili na uređaju s OS-om Chrome.</translation> <translation id="4971412780836297815">Otvori nakon dovršetka</translation> @@ -3698,6 +3703,7 @@ <translation id="5341980496415249280">Pričekajte. Pakiranje u tijeku...</translation> <translation id="5342091991439452114">Broj znamenki u PIN-u mora biti najmanje <ph name="MINIMUM" /></translation> <translation id="5344036115151554031">Vraćanje Linuxa</translation> +<translation id="5345916423802287046">Pokrenite aplikaciju kad se prijavite</translation> <translation id="5350293332385664455">Isključivanje Google asistenta</translation> <translation id="535123479159372765">Tekst kopiran s drugog uređaja</translation> <translation id="5352033265844765294">Vremensko označavanje</translation> @@ -4007,6 +4013,7 @@ <translation id="5704875434923668958">Sinkronizacija s</translation> <translation id="5705005699929844214">Uvijek prikaži opcije pristupačnosti</translation> <translation id="5705882733397021510">Natrag</translation> +<translation id="5707117624115653804">Prilagodite veličinu i stil titlova za aplikacije i web-lokacije koje podržavaju tu postavku</translation> <translation id="5707185214361380026">Nije učitano proširenje s lokacije:</translation> <translation id="5708171344853220004">Microsoftov glavni naziv</translation> <translation id="5709557627224531708">Postavite Chrome kao zadani preglednik</translation> @@ -4170,6 +4177,7 @@ <translation id="5904614460720589786">Postavljanje aplikacije <ph name="APP_NAME" /> nije uspjelo zbog problema s konfiguracijom. Obratite se administratoru. Kôd pogreške: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Ažuriranje će uskoro biti gotovo. Za dovršetak ponovo pokrenite uređaj.</translation> <translation id="5906732635754427568">Podaci povezani s tom aplikacijom uklonit će se s uređaja.</translation> +<translation id="5908474332780919512">Pokrenite aplikaciju kad se prijavite</translation> <translation id="5908695239556627796">Brzina pomicanja mišem</translation> <translation id="5908769186679515905">Onemogući web-lokacijama pokretanje Flasha</translation> <translation id="5910363049092958439">Sp&remi sliku kao...</translation> @@ -4562,7 +4570,6 @@ <translation id="6345878117466430440">Označi kao pročitano</translation> <translation id="6349101878882523185">Instalirajte aplikaciju <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinkronizacija ne funkcionira. Odjavite se, pa se ponovo prijavite.</translation> -<translation id="6351063337294363751">Podatke o pregledavanju možete izbrisati putem ovog izbornika</translation> <translation id="6354918092619878358">SECG eliptična krivulja secp256r1 (poznata i kao ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Neka uređaj ostane uključen</translation> <translation id="63566973648609420">Samo osoba koja ima vašu šifru može čitati vaše kriptirane podatke. Šifra se ne šalje Googleu i ne pohranjuje na njemu. Ako zaboravite šifru ili želite promijeniti tu postavku, morat ćete <ph name="BEGIN_LINK" />poništiti sinkronizaciju<ph name="END_LINK" />.</translation> @@ -4710,6 +4717,7 @@ <translation id="6532527800157340614">Prijava nije uspjela jer nije dohvaćen vaš pristupni token. Provjerite mrežnu vezu i pokušajte ponovo.</translation> <translation id="6532663472409656417">Prijavljeno u poduzeću</translation> <translation id="6535331821390304775">Uvijek dopusti da <ph name="ORIGIN" /> otvara veze ove vrste u povezanoj aplikaciji</translation> +<translation id="6537613839935722475">Naziv može sadržavati slova, brojke i crtice (–)</translation> <translation id="6538635548667167211">Za potrošnju podatkovnog prometa trenutačno je odabrana postavka Podaci</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Napomena:<ph name="END_BOLD" /> omogućite samo ako točno znate što radite ili ako se to od vas traži jer prikupljanje podataka može umanjiti izvedbu.</translation> <translation id="6541638731489116978">Web-lokaciji je blokiran pristup senzorima kretanja.</translation> @@ -4798,6 +4806,7 @@ <translation id="6650234781371031356">Zaporka za <ph name="WEBSITE" /> pohranjena je na ovom uređaju i vašem Google računu. Gdje je želite izbrisati?</translation> <translation id="665061930738760572">Otvaranje u &novom prozoru</translation> <translation id="6651237644330755633">Vjeruj ovom certifikatu za identificiranje web-lokacija</translation> +<translation id="6651495917527016072">Sinkronizirajte Wi-Fi mreže s telefonom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="665355505818177700">Integracija modela <ph name="MS_AD_NAME" /> s Chromeom podržana je samo na platformama x86_64. Chromebookovi izgrađeni na platformi ARM ili x86 ne podržavaju tu funkciju.</translation> <translation id="6654509035557065241">Preferiranje mreže</translation> <translation id="6655190889273724601">Način za razvojne programere</translation> @@ -5401,6 +5410,7 @@ <translation id="7375235221357833624">{0,plural, =1{Ažurirajte uređaj u roku od sat vremena}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> <translation id="7376553024552204454">Istakni pokazivač miša kada se kreće</translation> <translation id="7377451353532943397">Nastavi blokirati pristup senzorima</translation> +<translation id="7378611153938412599">Slabe zaporke lako je pogoditi. Neka vaše zaporke obavezno budu snažne. <ph name="BEGIN_LINK" />Pročitajte još sigurnosnih savjeta<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Otvori Chrome web-trgovinu</translation> <translation id="7378812711085314936">Dohvaćanje podatkovne veze</translation> <translation id="7380622428988553498">Naziv uređaja sadrži nevažeće znakove</translation> @@ -5925,6 +5935,7 @@ <translation id="7959074893852789871">Datoteka je sadržavala više certifikata, a neki od njih nisu uvezeni:</translation> <translation id="7961015016161918242">Nikad</translation> <translation id="7963001036288347286">Ubrzanje dodirne podloge</translation> +<translation id="7963608432878156675">Ovaj je naziv vidljiv drugim uređajima za povezivanje s Bluetoothom i mrežnom vezom</translation> <translation id="7963826112438303517">Te snimke i zahtjeve koje izgovorite Asistent upotrebljava za izradu i ažuriranje vašeg glasovnog modela koji se sprema samo na uređajima na kojima ste uključili Voice Match. Glasovnu aktivnost možete pregledati ili ponovo uvježbati u postavkama Asistenta.</translation> <translation id="7966241909927244760">K&opiraj adresu slike</translation> <translation id="7966571622054096916">{COUNT,plural, =1{Jedna stavka na popisu oznaka}one{{COUNT} stavka na popisu oznaka}few{{COUNT} stavke na popisu oznaka}other{{COUNT} stavki na popisu oznaka}}</translation> @@ -6389,6 +6400,7 @@ <translation id="850875081535031620">Nije pronađen štetan softver</translation> <translation id="8509177919508253835">Vraćanje sigurnosnih ključeva na zadano i izrada PIN-ova</translation> <translation id="8509646642152301857">Preuzimanje rječnika za provjeru pravopisa nije uspjelo.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Nije pronađena nijedna slaba zaporka}=1{Pronađena je {COUNT} slaba zaporka}one{Pronađena je {COUNT} slaba zaporka}few{Pronađene su {COUNT} slabe zaporke}other{Pronađeno je {COUNT} slabih zaporki}}</translation> <translation id="8512476990829870887">Završi proces</translation> <translation id="851263357009351303">Uvijek dopusti da web-lokacija <ph name="HOST" /> prikazuje slike</translation> <translation id="8513108775083588393">Aut. zakret.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index d1524442..dd48488 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Megjelölés olvasottként</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> telepítése</translation> <translation id="6349170655202535379">A szinkronizálás nem működik. Próbáljon meg kijelentkezni, majd újra bejelentkezni.</translation> -<translation id="6351063337294363751">Ebből a menüből törölheti böngészési adatait</translation> <translation id="6354918092619878358">SECG elliptikus görbe secp256r1 (vagyis ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Az eszköz bekapcsolva tartása</translation> <translation id="63566973648609420">Titkosított adatait csak az olvashatja el, aki rendelkezik összetett jelszavával. Az összetett jelszót a Google nem kapja meg, és nem is tárolja. Ha elfelejtette összetett jelszavát, vagy módosítani szeretné ezt a beállítást, <ph name="BEGIN_LINK" />alaphelyzetbe kell állítania a szinkronizálást<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 49772a4..2bc4c4e 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -4566,7 +4566,6 @@ <translation id="6345878117466430440">Նշել որպես կարդացված</translation> <translation id="6349101878882523185">Տեղադրել <ph name="APP_NAME" /> հավելվածը</translation> <translation id="6349170655202535379">Համաժամացումը չի աշխատում։ Դուրս եկեք հաշվից ու նորից մուտք գործեք։</translation> -<translation id="6351063337294363751">Ձեր այցելությունների պատմությունը կարող եք ջնջել այս ընտրացանկից</translation> <translation id="6354918092619878358">SECG օվալաձև կոր secp256r1 (հայտնի է նաև որպես ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Սարքը մի՛ անջատեք</translation> <translation id="63566973648609420">Միայն ձեր անցաբառն ունեցող օգտատերը կարող է կարդալ ձեր գաղտնագրված տվյալները: Անցաբառը չի ուղարկվում Google-ին և չի պահվում դրա կողմից: Անցաբառը մոռանալու դեպքում ձեզ անհրաժեշտ կլինի <ph name="BEGIN_LINK" />վերակայել համաժամացումը<ph name="END_LINK" />:</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index a6ce64816..2c6fad4 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2576,7 +2576,7 @@ <translation id="3949981384795585075">{NUM_APPS,plural, =1{Aplikasi ini mungkin berbahaya}other{Aplikasi ini mungkin berbahaya}}</translation> <translation id="3950820424414687140">Login</translation> <translation id="3953834000574892725">Akun saya</translation> -<translation id="3954354850384043518">Sedang berlangsung</translation> +<translation id="3954354850384043518">Dalam proses</translation> <translation id="3954469006674843813"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> Hertz)</translation> <translation id="3954953195017194676">Anda tidak memiliki log aktivitas WebRTC yang direkam baru-baru ini.</translation> <translation id="3955163004258753966">Error saat memulai upgrade</translation> @@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Tandai telah dibaca</translation> <translation id="6349101878882523185">Instal <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinkronisasi tidak berjalan. Coba keluar dan masuk lagi.</translation> -<translation id="6351063337294363751">Anda dapat menghapus data penjelajahan dari menu ini</translation> <translation id="6354918092619878358">Kurva eliptis SECG secp256r1 (alias ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Jaga perangkat tetap menyala</translation> <translation id="63566973648609420">Hanya orang yang memiliki frasa sandi Anda yang dapat membaca data terenkripsi. Frasa sandi tidak dikirim ke atau disimpan oleh Google. Jika lupa frasa sandi atau ingin mengubah setelan ini, Anda perlu <ph name="BEGIN_LINK" />menyetel ulang sinkronisasi<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 644765b..ddff00b 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Merkja sem lesið</translation> <translation id="6349101878882523185">Setja upp <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Samstilling virkar ekki. Prófaðu að skrá þig út og inn aftur.</translation> -<translation id="6351063337294363751">Þú getur hreinsað vefskoðunargögn í þessari valmynd</translation> <translation id="6354918092619878358">SECG sporger ferill secp256r1 (e.þ.s. ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Hafðu kveikt á tækinu</translation> <translation id="63566973648609420">Aðeins þeir sem vita aðgangsorðið geta lesið dulkóðuðu gögnin þín. Aðgangsorðið er ekki sent til Google eða vistað þar. Ef þú gleymir aðgangsorðinu eða þig langar að breyta þessari stillingu þarftu að <ph name="BEGIN_LINK" />endurstilla samstillingu<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 84de0f0..a101bf8 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">Segna come letto</translation> <translation id="6349101878882523185">Installa <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">La sincronizzazione non funziona. Prova a uscire e ad accedere di nuovo.</translation> -<translation id="6351063337294363751">Puoi cancellare i tuoi dati di navigazione da questo menu</translation> <translation id="6354918092619878358">Curva ellittica SECG secp256r1 (anche nota come ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Tieni accesi i dispositivi</translation> <translation id="63566973648609420">Soltanto chi conosce la tua passphrase può leggere i tuoi dati criptati. La passphrase non viene inviata a Google né memorizzata. Se dimentichi la passphrase o vuoi modificare questa impostazione, dovrai <ph name="BEGIN_LINK" />reimpostare la sincronizzazione<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 2461bfe1..6644c1e 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -441,7 +441,7 @@ <translation id="1504551620756424144">התיקיות המשותפות זמינות ב-Windows בספרייה <ph name="BASE_DIR" />.</translation> <translation id="1506061864768559482">מנוע חיפוש</translation> <translation id="1507170440449692343">דף זה נחסם לגישה למצלמה שלך.</translation> -<translation id="1507246803636407672">&התעלם</translation> +<translation id="1507246803636407672">&התעלמות</translation> <translation id="1508491105858779599">הנח את האצבע על חיישן טביעות האצבע כדי לבטל את נעילת המכשיר.</translation> <translation id="1508575541972276599">הגרסה הנוכחית היא Debian 9 (Stretch)</translation> <translation id="1509281256533087115">גישה לכל מכשיר של <ph name="DEVICE_NAME_AND_VENDOR" /> באמצעות USB</translation> @@ -581,7 +581,7 @@ <translation id="1650371550981945235">הצג אפשרויות קלט</translation> <translation id="1651008383952180276">עליך להזין אותו ביטוי סיסמה פעמיים</translation> <translation id="1652326691684645429">הפעלה של 'שיתוף בקרבת מקום'</translation> -<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{הוסף את המדפסת אל Google Cloud Print כך שתוכל להדפיס מכל מקום.}two{הוסף # מדפסות אל Google Cloud Print כך שתוכל להדפיס מכל מקום.}many{הוסף # מדפסות אל Google Cloud Print כך שתוכל להדפיס מכל מקום.}other{הוסף # מדפסות אל Google Cloud Print כך שתוכל להדפיס מכל מקום.}}</translation> +<translation id="1653526288038954982">{NUM_PRINTER,plural, =1{יש להוסיף את המדפסת אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}two{יש להוסיף # מדפסות אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}many{יש להוסיף # מדפסות אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}other{יש להוסיף # מדפסות אל Google Cloud Print כך שניתן יהיה להדפיס מכל מקום.}}</translation> <translation id="1653575510930452864">העתקת הקישור לטקסט</translation> <translation id="1656528038316521561">שקיפות רקע</translation> <translation id="1657406563541664238">עזור להפוך את <ph name="PRODUCT_NAME" /> לטוב יותר, על ידי שליחה אוטומטית של נתוני שימוש ודוחות קריסה אל Google</translation> @@ -703,7 +703,7 @@ <translation id="1790194216133135334">שליחת הקישור אל <ph name="DEVICE_NAME" /></translation> <translation id="1790976235243700817">הסרת הגישה</translation> <translation id="1792619191750875668">תצוגה מורחבת</translation> -<translation id="1794791083288629568"> שליחת משוב כדי לעזור לנו לפתור את הבעיה.</translation> +<translation id="1794791083288629568">שליחת משוב שיעזור לנו לפתור את הבעיה.</translation> <translation id="1795214765651529549">השתמש בעיצוב קלאסי</translation> <translation id="1799071797295057738">התוסף "<ph name="EXTENSION_NAME" />" הושבת באופן אוטומטי.</translation> <translation id="1802624026913571222">מעבר למצב שינה כשסוגרים את הכיסוי</translation> @@ -1339,7 +1339,7 @@ <translation id="2526619973349913024">יש עדכון חדש?</translation> <translation id="2527167509808613699">חיבור מכל סוג שהוא</translation> <translation id="2532589005999780174">מצב ניגודיות גבוהה</translation> -<translation id="253434972992662860">&השהה</translation> +<translation id="253434972992662860">&השהיה</translation> <translation id="2534460670861217804">שרת proxy של Secure HTTP</translation> <translation id="253557089021624350">ספירת Keepalive</translation> <translation id="2535799430745250929">אין רשתות סלולריות</translation> @@ -1715,7 +1715,7 @@ <translation id="2963151496262057773">הפלאגין הבא אינו מגיב: <ph name="PLUGIN_NAME" /> האם ברצונך לכבות אותו?</translation> <translation id="2964193600955408481">השבת Wi-Fi</translation> <translation id="2966937470348689686">ניהול העדפות ל-Android</translation> -<translation id="2972581237482394796">&בצע שנית</translation> +<translation id="2972581237482394796">&ביצוע חוזר</translation> <translation id="2973324205039581528">השתקת האתר</translation> <translation id="2977480621796371840">הסרה מהקבוצה</translation> <translation id="2979520980928493164">Chrome בריא ושמח יותר</translation> @@ -1761,7 +1761,7 @@ <translation id="3020990233660977256">מספר סידורי: <ph name="SERIAL_NUMBER" /></translation> <translation id="3021065318976393105">בזמן שימוש בסוללה</translation> <translation id="3021066826692793094">פרפר</translation> -<translation id="3021678814754966447">&הצג את מקור המסגרת</translation> +<translation id="3021678814754966447">&הצגת מקור המסגרת</translation> <translation id="3022978424994383087">ההודעה שלך לא ברורה.</translation> <translation id="3023464535986383522">הקראה</translation> <translation id="3024374909719388945">השתמש בשעון של 24 שעות</translation> @@ -3133,7 +3133,7 @@ <translation id="4637083375689622795">פעולות נוספות, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">הפעלה של ניפוי באגים באמצעות ADB</translation> <translation id="4641539339823703554">Chrome לא הצליח להגדיר את שעת המערכת. בדוק את השעה המצוינת בהמשך ותקן אותה במקרה הצורך.</translation> -<translation id="4643612240819915418">&פתח סרטון וידאו בכרטיסייה חדשה</translation> +<translation id="4643612240819915418">&פתיחת סרטון בכרטיסייה חדשה</translation> <translation id="4645551927492192497">{NUM_DAYS,plural, =1{לפי הדרישה של <ph name="DOMAIN" />, עליך להתחבר היום לרשת Wi-Fi כדי להוריד עדכון. ניתן גם לבצע את ההורדה דרך חיבור עם חיוב לפי שימוש בנתונים (עשויים לחול חיובים).}two{לפי דרישת <ph name="DOMAIN" />, עליך להתחבר ל-Wi-Fi ולהוריד עדכון לפני המועד האחרון. ניתן גם לבצע את ההורדה דרך חיבור עם חיוב לפי שימוש בנתונים (עשויים לחול חיובים).}many{לפי דרישת <ph name="DOMAIN" />, עליך להתחבר ל-Wi-Fi ולהוריד עדכון לפני המועד האחרון. ניתן גם לבצע את ההורדה דרך חיבור עם חיוב לפי שימוש בנתונים (עשויים לחול חיובים).}other{לפי דרישת <ph name="DOMAIN" />, עליך להתחבר ל-Wi-Fi ולהוריד עדכון לפני המועד האחרון. ניתן גם לבצע את ההורדה דרך חיבור עם חיוב לפי שימוש בנתונים (עשויים לחול חיובים).}}</translation> <translation id="4645676300727003670">&שמור</translation> <translation id="4646675363240786305">יציאות</translation> @@ -3243,7 +3243,7 @@ <translation id="4788092183367008521">כדאי לבדוק את החיבור לרשת ולנסות שוב.</translation> <translation id="4791000909649665275">מספר התמונות: <ph name="NUMBER" /></translation> <translation id="4791037424585594169">(UDP)</translation> -<translation id="4792711294155034829">&דווח על בעיה...</translation> +<translation id="4792711294155034829">&דיווח על בעיה...</translation> <translation id="4794810983896241342">העדכונים מנוהלים על ידי <ph name="BEGIN_LINK" />מנהל המערכת<ph name="END_LINK" /></translation> <translation id="479536056609751218">דף אינטרנט, HTML בלבד</translation> <translation id="4798236378408895261">צירוף של <ph name="BEGIN_LINK" />יומני Bluetooth<ph name="END_LINK" /> (מידע פנימי של Google)</translation> @@ -3597,7 +3597,7 @@ <translation id="5233019165164992427">יציאת ניפוי באגים של NaCl</translation> <translation id="5233231016133573565">זיהוי תהליך</translation> <translation id="5233638681132016545">כרטיסייה חדשה</translation> -<translation id="5233736638227740678">&הדבק</translation> +<translation id="5233736638227740678">&הדבקה</translation> <translation id="5234764350956374838">סגור</translation> <translation id="5235050375939235066">להסיר את התקנת האפליקציה?</translation> <translation id="523505283826916779">הגדרות נגישות</translation> @@ -3681,7 +3681,7 @@ <translation id="5327248766486351172">שם</translation> <translation id="5327570636534774768">המכשיר הזה מסומן כמנוהל על ידי דומיין אחר. צריך לבטל את ניהול התצורה שלו מהדומיין הזה לפני ההגדרה של מצב ההדגמה.</translation> <translation id="532943162177641444">הקש על ההודעה בטלפון <ph name="PHONE_NAME" /> כדי להגדיר את הנקודה לשיתוף אינטרנט בנייד שבה המכשיר הזה יכול להשתמש.</translation> -<translation id="5329858601952122676">&מחק</translation> +<translation id="5329858601952122676">&מחיקה</translation> <translation id="5331069282670671859">אין לך אישורים בקטגוריה הזו</translation> <translation id="5331425616433531170">"<ph name="CHROME_EXTENSION_NAME" />" רוצה לבצע התאמה עם</translation> <translation id="5331975486040154427">מכשיר עם יציאת USB-C (יציאה שמאלית-אחורית)</translation> @@ -4503,7 +4503,7 @@ <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{מדפסת חדשה ברשת שלך}two{מדפסות חדשות ברשת שלך}many{מדפסות חדשות ברשת שלך}other{מדפסות חדשות ברשת שלך}}</translation> <translation id="6291163159361301370">כדי להפעיל את Linux, עליך לגבות את הנתונים ולאפס את ה-Chromebook הזה להגדרות היצרן על פי דרישת <ph name="ORGANIZATION_NAME" />.</translation> <translation id="6291949900244949761">צריך לבקש ממני אישור כשאתר רוצה לגשת למכשירי USB (מומלץ)</translation> -<translation id="6291953229176937411">&הצג ב-Finder</translation> +<translation id="6291953229176937411">&הצגה ב-Finder</translation> <translation id="6295158916970320988">כל האתרים</translation> <translation id="6295855836753816081">שומר...</translation> <translation id="6298962879096096191">התקן אפליקציות ל-Android באמצעות Google Play</translation> @@ -4560,14 +4560,13 @@ <translation id="6345878117466430440">סימון כפריט שנקרא</translation> <translation id="6349101878882523185">התקן את <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">הסנכרון לא פועל. נסה לצאת ולהיכנס שוב.</translation> -<translation id="6351063337294363751">בתפריט זה ניתן לנקות את נתוני הגלישה</translation> <translation id="6354918092619878358">עקומה אליפטית SECG מסוג secp256r1 (מוכרת גם בשם ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">אין לכבות את המכשיר</translation> <translation id="63566973648609420">רק מי שיודע את ביטוי הסיסמה יכול לקרוא את הנתונים המוצפנים. ביטוי הסיסמה לא נשלח אל Google והיא אינה מאחסנת אותו. אם תשכח את ביטוי הסיסמה או אם תרצה לשנות את ההגדרה הזו, יהיה עליך <ph name="BEGIN_LINK" />לאפס את הסנכרון<ph name="END_LINK" />.</translation> <translation id="6357619544108132570">ברוכים הבאים אל משפחת <ph name="SHORT_PRODUCT_NAME" />. לא מדובר במחשב רגיל.</translation> <translation id="6358884629796491903">דרקון</translation> <translation id="6361850914223837199">פרטי השגיאה:</translation> -<translation id="6362853299801475928">&דווח על בעיה...</translation> +<translation id="6362853299801475928">&דיווח על בעיה...</translation> <translation id="6365069501305898914">Facebook</translation> <translation id="6365411474437319296">הוספת בני משפחה וחברים</translation> <translation id="6367985768157257101">האם לקבל באמצעות 'שיתוף בקרבת מקום'?</translation> @@ -4652,7 +4651,7 @@ <translation id="6461170143930046705">המכשיר מחפש רשתות...</translation> <translation id="6463795194797719782">&עריכה</translation> <translation id="6465841119675156448">ללא אינטרנט</translation> -<translation id="6466988389784393586">&פתח את כל הסימניות</translation> +<translation id="6466988389784393586">&פתיחת כל הסימניות</translation> <translation id="6467304607960172345">אופטימיזציה של סרטונים במסך מלא</translation> <translation id="6468485451923838994">גופנים</translation> <translation id="6469557521904094793">הפעלת רשת סלולרית</translation> @@ -4734,7 +4733,7 @@ <translation id="656293578423618167">הנתיב או שם הקובץ ארוך מדי. שמור בשם קצר יותר או למיקום אחר.</translation> <translation id="6563469144985748109">המנהל שלך עדיין לא אישר זאת</translation> <translation id="6569934958368283244">אנשים אחרים</translation> -<translation id="657402800789773160">&טען דף זה מחדש</translation> +<translation id="657402800789773160">&טעינת דף זה מחדש</translation> <translation id="6577284282025554716">ההורדה בוטלה: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">תמונת מצב של תקינות הרשת</translation> <translation id="6578664922716508575">הצפנת סיסמאות מסונכרנות עם שם המשתמש והסיסמה שלך ב-Google</translation> @@ -5434,7 +5433,7 @@ <translation id="7416362041876611053">שגיאת רשת לא ידועה.</translation> <translation id="741906494724992817">אין צורך בהרשאות מיוחדות עבור האפליקציה הזו.</translation> <translation id="742130257665691897">סימניות הוסרו</translation> -<translation id="7421925624202799674">&הצג את מקור הדף</translation> +<translation id="7421925624202799674">&הצגת מקור הדף</translation> <translation id="7422192691352527311">העדפות...</translation> <translation id="7423098979219808738">תופיע בקשת אישור</translation> <translation id="7423513079490750513">הסרת <ph name="INPUT_METHOD_NAME" /></translation> @@ -5684,7 +5683,7 @@ <translation id="7707108266051544351">גישת האתר הזה אל חיישני התנועה נחסמה.</translation> <translation id="7707922173985738739">השתמש בחבילת גלישה</translation> <translation id="7709152031285164251">נכשל - <ph name="INTERRUPT_REASON" /></translation> -<translation id="7710568461918838723">&העבר...</translation> +<translation id="7710568461918838723">&העברה...</translation> <translation id="7712836429117959503">תוסף לא מוכר עם המזהה <ph name="EXTENSION_ID" /></translation> <translation id="7714307061282548371">קובצי Cookie מ-<ph name="DOMAIN" /> מותרים</translation> <translation id="7714464543167945231">אישור</translation> @@ -5776,7 +5775,7 @@ <translation id="7810202088502699111">חלונות קופצים נחסמו בדף זה.</translation> <translation id="781167124805380294">העברה של <ph name="FILE_NAME" /></translation> <translation id="7814277578404816512">מה חדש ב-<ph name="DEVICE_TYPE" /></translation> -<translation id="7814458197256864873">&העתק</translation> +<translation id="7814458197256864873">&העתקה</translation> <translation id="7815680994978050279">נחסמה הורדה מסוכנת</translation> <translation id="7817361223956157679">המקלדת שמופיעה במסך לא עובדת עדיין באפליקציות Linux</translation> <translation id="7818135753970109980">עיצוב חדש נוסף (<ph name="EXTENSION_NAME" />)</translation> @@ -6566,7 +6565,7 @@ <translation id="8723108084122415655">הרשת שאינה מוגדרת כברירת מחדל חורגת מסף זמן האחזור</translation> <translation id="8724405322205516354">כשיוצג לך הסמל הזה, משמעות הדבר היא שאפשר להשתמש בטביעת אצבע לצורכי זיהוי או לאישור רכישה.</translation> <translation id="8724409975248965964">טביעת האצבע נקלטה</translation> -<translation id="8724859055372736596">&הצג בתיקייה</translation> +<translation id="8724859055372736596">&הצגה בתיקייה</translation> <translation id="8725066075913043281">נסה שוב</translation> <translation id="8725178340343806893">מועדפים/סימניות</translation> <translation id="8726206820263995930">אירעה שגיאה בעת הבאת הגדרות מדיניות מהשרת: <ph name="CLIENT_ERROR" />.</translation> @@ -6855,7 +6854,7 @@ <translation id="9030855135435061269">אין יותר תמיכה בפלאגין <ph name="PLUGIN_NAME" /></translation> <translation id="9031549947500880805">גיבוי ב-Google Drive. ההגדרה הזו מאפשרת לאחזר נתונים בקלות או לעבור למכשיר אחר בכל שלב. הגיבוי כולל נתוני אפליקציות.</translation> <translation id="9033765790910064284">אני רוצה להמשיך בכל זאת</translation> -<translation id="9033857511263905942">&הדבק</translation> +<translation id="9033857511263905942">&הדבקה</translation> <translation id="9037818663270399707">החיבור שלך אינו פרטי בכל התנועה ברשת</translation> <translation id="9037965129289936994">הצג מקור</translation> <translation id="9039014462651733343">{NUM_ATTEMPTS,plural, =1{נשאר לך ניסיון אחד.}two{נשארו לך # ניסיונות.}many{נשארו לך # ניסיונות.}other{נשארו לך # ניסיונות.}}</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index fb891f16..8dc42ff 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -4554,7 +4554,6 @@ <translation id="6345878117466430440">既読にする</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> をインストールします</translation> <translation id="6349170655202535379">同期が機能していません。ログアウトして再度ログインしてみてください。</translation> -<translation id="6351063337294363751">このメニューで閲覧データを削除できます</translation> <translation id="6354918092619878358">SECG 楕円曲線 secp256r1(別名 ANSI X9.62 prime256v1、NIST P-256)</translation> <translation id="635609604405270300">デバイスの電源を切らないでください</translation> <translation id="63566973648609420">パスフレーズを知っているユーザーだけが暗号化データを読み取ることができます。パスフレーズが Google に送信されたり Google で保存されたりすることはありません。パスフレーズを忘れた場合や、この設定を変更する場合は、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />する必要があります。</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index a467200..c0f4f8a 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -4569,7 +4569,6 @@ <translation id="6345878117466430440">წაკითხულად მონიშვნა</translation> <translation id="6349101878882523185"><ph name="APP_NAME" />-ის ინსტალაცია</translation> <translation id="6349170655202535379">სინქრონიზაცია არ მუშაობს. ცადეთ სისტემიდან გასვლა და ხელახლა შესვლა.</translation> -<translation id="6351063337294363751">ამ მენიუდან თქვენი დათვალიერების მონაცემების გასუფთავება შეგიძლიათ</translation> <translation id="6354918092619878358">SECG ეკლიპტიკური მრუდი secp256r1 (ასევე ცნობილი, როგორც ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">მოწყობილობის ჩართულად შენარჩუნება</translation> <translation id="63566973648609420">თქვენი დაშიფრული მონაცემების წაკითხვა შეუძლია მხოლოდ იმ ადამიანს, რომელმაც იცის თქვენი საიდუმლო ფრაზა. საიდუმლო ფრაზა არ იგზავნება Google-ში და არ ინახება მის მიერ. საიდუმლო ფრაზის დავიწყების ან ამ პარამეტრის შეცვლის სურვილის შემთხვევაში, <ph name="BEGIN_LINK" />სინქრონიზაციის გადაყენება<ph name="END_LINK" /> მოგიწევთ.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 5fc163a..546da0a 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -4559,7 +4559,6 @@ <translation id="6345878117466430440">Оқылды деп белгілеу</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> қолданбасын орнату</translation> <translation id="6349170655202535379">Синхрондалып жатқан жоқ. Жүйеден шығып, қайта кіріп көріңіз.</translation> -<translation id="6351063337294363751">Осы мәзірден браузерді пайдалану деректерін өшіре аласыз</translation> <translation id="6354918092619878358">SECG эллипстік қисық сызығы secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Құрылғыны қосулы күйде ұстаңыз</translation> <translation id="63566973648609420">Тек құпия фразаны білетін адам ғана шифрланған деректерді оқи алады. Құпия фраза Google қызметіне жіберілмейді және онда сақталмайды. Құпия фразаны ұмытып қалған жағдайда немесе бұл параметрді өзгерткіңіз келгенде, <ph name="BEGIN_LINK" />синхрондауды бастапқы күйіне қайтару<ph name="END_LINK" /> қажет болады.</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 0f1666d..437880e 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">សម្គាល់ថាបានអានហើយ</translation> <translation id="6349101878882523185">ដំឡើង <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">សមកាលកម្មមិនដំណើរការទេ សូមសាកល្បងចាកចេញពីគណនី ហើយចូលមកវិញម្តងទៀត។</translation> -<translation id="6351063337294363751">អ្នកអាចជម្រះទិន្នន័យរុករករបស់អ្នកចេញពីម៉ឺនុយនេះបាន</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">បន្តបើកឧបករណ៍</translation> <translation id="63566973648609420">មានតែបុគ្គលដែលមានឃ្លាសម្ងាត់របស់អ្នកប៉ុណ្ណោះ ដែលអាចអានទិន្នន័យដែលបានអ៊ិនគ្រីបរបស់អ្នក។ ឃ្លាសម្ងាត់នេះមិនត្រូវបានផ្ញើទៅ ឬផ្ទុកដោយ Google ឡើយ។ ប្រសិនបើអ្នកភ្លេចឃ្លាសម្ងាត់របស់អ្នក ឬចង់ប្តូរការកំណត់នេះ អ្នកត្រូវ<ph name="BEGIN_LINK" />កំណត់សមកាលកម្មឡើងវិញ<ph name="END_LINK" />។</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index fc558d1..be55d23 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -4556,7 +4556,6 @@ <translation id="6345878117466430440">ಓದಲಾಗಿದೆ ಎಂದು ಗುರುತಿಸಿ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ</translation> <translation id="6349170655202535379">ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡಲು ಹಾಗೂ ಮರಳಿ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation> -<translation id="6351063337294363751">ಈ ಮೆನುವಿನಿಂದ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ನೀವು ತೆರವುಗೊಳಿಸಬಹುದು</translation> <translation id="6354918092619878358">SECG ಎಲಿಪ್ಟಿಕ್ ಕರ್ವ್ secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ಸಾಧನವು ಆನ್ ಆಗಿರಲಿ</translation> <translation id="63566973648609420">ನಿಮ್ಮ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಪಾಸ್ಫ್ರೇಸ್ ಹೊಂದಿರುವವರು ಮಾತ್ರ ಓದಬಹುದು. ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುವುದಿಲ್ಲ ಅಥವಾ ಅದನ್ನು ಸಂಗ್ರಹಿಸುವುದಿಲ್ಲ. ನಿಮ್ಮ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ನೀವು ಮರೆತಿದ್ದರೆ ಅಥವಾ ಈ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಲು ಬಯಸಿದರೆ, ನೀವು <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಮರುಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index fe6abf1..a61e315 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -4560,7 +4560,6 @@ <translation id="6345878117466430440">읽음으로 표시</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> 설치</translation> <translation id="6349170655202535379">동기화가 작동하지 않습니다. 로그아웃한 후 다시 로그인하세요.</translation> -<translation id="6351063337294363751">이 메뉴에서 인터넷 사용 기록을 삭제할 수 있습니다.</translation> <translation id="6354918092619878358">SECG 타원 곡선 secp256r1(또는 ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">기기를 계속 켜두세요.</translation> <translation id="63566973648609420">암호를 아는 사람만 암호화된 데이터를 읽을 수 있습니다. 암호는 Google로 전송되거나 Google에 저장되지 않습니다. 암호가 기억나지 않거나 이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />해야 합니다.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 359c7aae..9a14041d 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Окулду деп белгилөө</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> колдонмосун орнотуу</translation> <translation id="6349170655202535379">Шайкештирүү иштебей жатат. Каттоо эсебинен чыгып, кайра кирип көрүңүз.</translation> -<translation id="6351063337294363751">Бул менюдан серептөө дайындарын тазалап салсаңыз болот</translation> <translation id="6354918092619878358">SECG эллиптикалык ийри сызыгы secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Түзмөктү өчүрбөңүз</translation> <translation id="63566973648609420">Шифрленген дайын-даректериңизди купуя сөз айкашын билген адам гана окуй алат. Бул купуя сөз айкашы Google'га жөнөтүлбөйт же анда сакталбайт. Эгер купуя сөз айкашыңызды унутуп калсаңыз, <ph name="BEGIN_LINK" />шайкештирүүнү баштапкы абалга келтиришиңиз<ph name="END_LINK" /> керек болот.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 73aa73a..6fb2b24 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -926,6 +926,7 @@ <translation id="204914487372604757">ສ້າງທາງລັດ</translation> <translation id="2050339315714019657">ລວງຕັ້ງ</translation> <translation id="2053312383184521053">ຂໍ້ມູນສະພາວະຢູ່ຊື່ໆ</translation> +<translation id="2054665754582400095">ການນຳໃຊ້ຂອງທ່ານ</translation> <translation id="2055585478631012616">ທ່ານຈະຖືກນຳອອກຈາກລະບົບເວັບໄຊເຫຼົ່ານີ້, ຮວມທັງໃນແຖບທີ່ເປີດຢູ່</translation> <translation id="205560151218727633">ໂລໂກ້ຜູ້ຊ່ວຍ Google</translation> <translation id="2058456167109518507">ກວດພົບອຸປະກອນ</translation> @@ -1212,6 +1213,7 @@ <translation id="2387052489799050037">ໄປທີ່ໜ້າຫຼັກ</translation> <translation id="2387458720915042159">ປະເພດການເຊື່ອມຕໍ່ພຣັອກຊີ</translation> <translation id="2390347491606624519">ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບພຣັອກຊີໄດ້, ກະລຸນາເຂົ້າສູ່ລະບົບອີກຄັ້ງ</translation> +<translation id="2390782873446084770">Wi-Fi Sync</translation> <translation id="2391082728065870591">ສົ່ງລາຍງານຄຳຕິຊົມ</translation> <translation id="2391419135980381625">ຟອນມາດຕະຖານ</translation> <translation id="2392163307141705938">ທ່ານໄດ້ຮອດຂີດຈຳກັດເວລາທີ່ພໍ່ແມ່ຂອງທ່ານກຳນົດໃຫ້ <ph name="IDS_SHORT_PRODUCT_NAME" /> ແລ້ວ.</translation> @@ -1868,6 +1870,7 @@ <translation id="3157931365184549694">ເອົາຄືນມາ</translation> <translation id="3158033540161634471">ຕັ້ງຄ່າລາຍນິ້ວມືຂອງທ່ານ</translation> <translation id="3159493096109238499">ສີເບຈ</translation> +<translation id="3159978855457658359">ແກ້ໄຂຊື່ອຸປະກອນ</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (ສະໜັບສະໜູນຈາກຮາດແວ)</translation> <translation id="3161522574479303604">ທຸກພາສາ</translation> <translation id="3162853326462195145">ບັນຊີໂຮງຮຽນ</translation> @@ -3228,6 +3231,7 @@ <translation id="4761104368405085019">ໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານ</translation> <translation id="4762718786438001384">ພື້ນທີ່ດິສກ໌ໃນອຸປະກອນເຫຼືອໜ້ອຍທີ່ສຸດ</translation> <translation id="4763408175235639573">ຄຸກກີ້ຕໍ່ໄປນີ້ຖືກຕັ້ງຂຶ້ນ ເມື່ອທ່ານເບິ່ງໜ້ານີ້</translation> +<translation id="4764368918650455114">ກະລຸນາກວດສອບວ່າອຸປະກອນທັງສອງປົດລັອກແລ້ວ, ຢູ່ໃກ້ກັນ ແລະ ເປີດ Bluetooth. ຖ້າທ່ານກຳລັງແບ່ງປັນກັບ Chromebook, ກະລຸນາກວດໃຫ້ແນ່ໃຈວ່າມັນໄດ້ເປີດການແບ່ງປັນໃກ້ຄຽງແລ້ວ (ເປີດພື້ນທີ່ສະຖານະໂດຍການເລືອກເວລາ, ຈາກນັ້ນເລືອກການແບ່ງປັນໃກ້ຄຽງ). <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="4765582662863429759">ອະນຸຍາດໃຫ້ Android Messages ສົ່ງຕໍ່ຂໍ້ຄວາມຈາກໂທລະສັບຂອງທ່ານໄປໃສ່ Chromebook ທ່ານ</translation> <translation id="476598255842811483">ບໍ່ມີໃຜເວັ້ນເສຍແຕ່ທ່ານຈະເປີດການແບ່ງປັນໃກ້ຄຽງໃນອຸປະກອນຂອງທ່ານ</translation> <translation id="4768332406694066911">ທ່ານມີໃບຢັ້ງຢືນຈາກໜ່ວຍງານເຫຼົ່ານີ້ທີ່ລະບຸຕົວຕົນຂອງທ່ານ</translation> @@ -3390,6 +3394,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">ແອັບນີ້ໄດ້ຖືກຕິດຕັ້ງໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="4964455510556214366">ການກະກຽມ</translation> +<translation id="496446150016900060">ຊິ້ງຂໍ້ມູນເຄືອຂ່າຍ Wi-Fi ກັບໂທລະສັບຂອງທ່ານ</translation> <translation id="4965808351167763748">ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການຕັ້ງຄ່າອຸປະກອນນີ້ເພື່ອເປີດໃຊ້ Hangouts Meet?</translation> <translation id="496888482094675990">ແອັບໄຟລ໌ໃຫ້ການເຂົ້າຫາໂດຍໄວຕໍ່ກັບໄຟລ໌ທີ່ທ່ານບັນທຶກໄວ້ຢູ່ເທິງ Google Drive, ບ່ອນເກັບຂໍ້ມູນທາງນອກ, ຫຼືອຸປະກອນ Chrome OS ຂອງທ່ານ.</translation> <translation id="4971412780836297815">ເປີດເມື່ອສໍາເລັດ</translation> @@ -3696,6 +3701,7 @@ <translation id="5341980496415249280">ກະລຸນາລໍຖ້າ, ກຳລັງເກັບຮວມກັນ...</translation> <translation id="5342091991439452114">PIN ຕ້ອງມີຢ່າງໜ້ອຍ <ph name="MINIMUM" /> ຕົວເລກ</translation> <translation id="5344036115151554031">ກຳລັງກູ້ຄືນ Linux</translation> +<translation id="5345916423802287046">ເລີ່ມແອັບເມື່ອທ່ານເຂົ້າສູ່ລະບົບ</translation> <translation id="5350293332385664455">ປິດຜູ້ຊ່ວຍ Google</translation> <translation id="535123479159372765">ສຳເນົາຂໍ້ຄວາມຈາກອຸປະກອນອື່ນແລ້ວ</translation> <translation id="5352033265844765294">ການຕິດສະແຕັມເວລາ</translation> @@ -4005,6 +4011,7 @@ <translation id="5704875434923668958">ກຳລັງຊິ້ງຂໍ້ມູນກັບ</translation> <translation id="5705005699929844214">ສະແດງຕົວເລືອກການຊ່ວຍເຂົ້າເຖິງທຸກເທື່ອ</translation> <translation id="5705882733397021510">ກັບຄືນ</translation> +<translation id="5707117624115653804">ປັບແຕ່ງຂະໜາດ ແລະ ຮູບແບບຄຳບັນຍາຍສຳລັບແອັບ ແລະ ເວັບໄຊທີ່ຮອງຮັບການຕັ້ງຄ່ານີ້</translation> <translation id="5707185214361380026">ບໍ່ສາມາດໂຫຼດສ່ວນຂະຫຍາຍຈາກ:</translation> <translation id="5708171344853220004">ຊື່ສໍາຄັນຂອງ Microsoft</translation> <translation id="5709557627224531708">ຕັ້ງຄ່າ Chrome ເປັນໂປຣແກຣມທ່ອງເວັບເລີ່ມຕົ້ນ</translation> @@ -4168,6 +4175,7 @@ <translation id="5904614460720589786">ບໍ່ສາມາດຕິດຕັ້ງ <ph name="APP_NAME" /> ໄດ້ ເນື່ອງຈາກບັນຫາການຕັ້ງຄ່າ. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ. ລະຫັດຂໍ້ຜິດພາດ: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">ອັບເດດໃກ້ແລ້ວໆ! ກະລຸນາປິດແລ້ວເປີດອຸປະກອນຂອງທ່ານຄືນໃໝ່ເພື່ອສິ້ນສຸດຂັ້ນຕອນການອັບເດດ.</translation> <translation id="5906732635754427568">ຂໍ້ມູນທີ່ເຊື່ອມໂຍງກັບແອັບນີ້ຈະຖືກລຶບອອກຈາກອຸປະກອນນີ້.</translation> +<translation id="5908474332780919512">ເລີ່ມແອັບເມື່ອທ່ານເຂົ້າສູ່ລະບົບ</translation> <translation id="5908695239556627796">ຄວາມໄວການເລື່ອນເມົ້າ</translation> <translation id="5908769186679515905">ບລັອກບໍ່ໃຫ້ເວັບໄຊເປີດໃຊ້ Flash</translation> <translation id="5910363049092958439">ບັນທຶກຮູບເປັນ...</translation> @@ -4560,7 +4568,6 @@ <translation id="6345878117466430440">ໝາຍວ່າອ່ານແລ້ວ</translation> <translation id="6349101878882523185">ຕິດຕັ້ງ <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">ການຊິ້ງຂໍ້ມູນໃຊ້ບໍ່ໄດ້. ລອງອອກຈາກລະບົບ ແລະ ກັບເຂົ້າສູ່ລະບົບຄືນໃໝ່.</translation> -<translation id="6351063337294363751">ທ່ານສາມາດລຶບລ້າງຂໍ້ມູນການທ່ອງເວັບຂອງທ່ານອອກຈາກເມນູນີ້ໄດ້</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ຮັກສາໃຫ້ອຸປະກອນເປີດຢູ່</translation> <translation id="63566973648609420">ສະເພາະຜູ້ທີ່ມີວະລີຜ່ານຂອງທ່ານເທົ່ານັ້ນສາມາດອ່ານຂໍ້ມູນທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານໄດ້. ວະລີຜ່ານຈະບໍ່ຖືກສົ່ງຫາ ຫຼື ຮັກສາໄວ້ໂດຍ Google. ຖ້າທ່ານລືມວະລີຜ່ານຂອງທ່ານ ຫຼື ຕ້ອງການປ່ຽນການຕັ້ງຄ່ານີ້, ທ່ານຈະຈຳເປັນຕ້ອງ <ph name="BEGIN_LINK" />ຣີເຊັດການຊິ້ງຂໍ້ມູນ<ph name="END_LINK" />.</translation> @@ -4708,6 +4715,7 @@ <translation id="6532527800157340614">ເຂົ້າສູ່ລະບົບບໍ່ສຳເລັດ ເພາະວ່າລະບົບກູ້ຄືນໂທເຄັນສິດເຂົ້າເຖິງຂອງທ່ານບໍ່ສຳເລັດ. ກະລຸນາກວດເບິ່ງການເຊື່ອມຕໍ່ເຄືອຂ່າຍຂອງທ່ານ ແລ້ວລອງອີກຄັ້ງ.</translation> <translation id="6532663472409656417">ວິສາຫະກິດທີ່ລົງທະບຽນແລ້ວ</translation> <translation id="6535331821390304775">ອະນຸຍາດໃຫ້ <ph name="ORIGIN" /> ເປີດລິ້ງປະເພດນີ້ໃນແອັບທີ່ເຊື່ອມໂຍງທຸກເທື່ອ</translation> +<translation id="6537613839935722475">ຊື່ສາມາດໃຊ້ຕົວໜັງສື, ຕົວເລກ ແລະ ຂີດຕໍ່ (-) ໄດ້</translation> <translation id="6538635548667167211">ການຕັ້ງຄ່າການນຳໃຊ້ອິນເຕີເນັດປັດຈຸບັນແມ່ນອິນເຕີເນັດ</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ໝາຍເຫດ:<ph name="END_BOLD" /> ເປີດໃຊ້ງານພຽງແຕ່ຖ້າທ່ານຮູ້ສິ່ງທີ່ທ່ານກໍາລັງເຮັດ ຫຼືຖ້າທ່ານໄດ້ຮັບການຂໍຮ້ອງໃຫ້ເຮັດ, ເນື່ອງຈາກການເກັບກໍາຂໍ້ມູນອາດຈະຫຼຸດການປະຕິບັດງານລົງ.</translation> <translation id="6541638731489116978">ເວັບໄຊນີ້ໄດ້ຖືກບລັອກບໍ່ໃຫ້ເຂົ້າເຖິງເຊັນເຊີກວດຈັບການເຄື່ອນໄຫວຂອງທ່ານແລ້ວ.</translation> @@ -4796,6 +4804,7 @@ <translation id="6650234781371031356">ລະຫັດຜ່ານຂອງທ່ານສຳລັບ <ph name="WEBSITE" /> ຖືກເກັບໄວ້ໃນອຸປະກອນນີ້ ແລະ ໃນບັນຊີ Google ຂອງທ່ານ. ທ່ານຕ້ອງການລຶບອັນໃດ?</translation> <translation id="665061930738760572">ເປີດຢູ່ໃນໜ້າຕ່າງໃຫມ່</translation> <translation id="6651237644330755633">ເຊື່ອຖືໃບຢັ້ງຢືນນີ້ສຳລັບການລະບຸເວັບໄຊ</translation> +<translation id="6651495917527016072">ຊິ້ງຂໍ້ມູນເຄືອຂ່າຍ Wi-Fi ກັບໂທລະສັບຂອງທ່ານ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="665355505818177700">ຮອງຮັບການລວມ <ph name="MS_AD_NAME" /> ຂອງ Chrome ໃນລະບົບປະຕິບັດການ x86_64 ເທົ່ານັ້ນ. Chromebooks ທີ່ສ້າງຈາກສ່ວນເທິງຂອງ ARM ຫຼື ລະບົບປະຕິບັດການ x86 ບໍ່ຮອງຮັບຟັງຊັນນີ້.</translation> <translation id="6654509035557065241">ຕ້ອງການໃຊ້ເຄືອຂ່າຍນີ້</translation> <translation id="6655190889273724601">ໂໝດຜູ້ພັດທະນາ</translation> @@ -5399,6 +5408,7 @@ <translation id="7375235221357833624">{0,plural, =1{ອັບເດດອຸປະກອນພາຍໃນໜຶ່ງຊົ່ວໂມງ}other{ອັບເດດອຸປະກອນພາຍໃນ # ຊົ່ວໂມງ}}</translation> <translation id="7376553024552204454">ໝາຍເຄີເຊີເມົ້າໃນເວລາທີ່ມັນເຄື່ອນເໜັງ</translation> <translation id="7377451353532943397">ສືບຕໍ່ບລັອກການເຂົ້າເຖິງເຊັນເຊີ</translation> +<translation id="7378611153938412599">ລະຫັດຜ່ານງ່າຍແມ່ນລະຫັດຜ່ານທີ່ເດົາໄດ້ງ່າຍ. ໃຫ້ແນ່ໃຈວ່າທ່ານກຳລັງສ້າງລະຫັດຜ່ານຍາກ. <ph name="BEGIN_LINK" />ເບິ່ງຄຳແນະນຳຄວາມປອດໄພເພີ່ມເຕີມ.<ph name="END_LINK" /></translation> <translation id="73786666777299047">ເປີດ Chrome Web Store</translation> <translation id="7378812711085314936">ຮັບເອົາການເຊື່ອມຕໍ່ຂໍ້ມູນ</translation> <translation id="7380622428988553498">ຊື່ອຸປະກອນປະກອບມີຕົວອັກສອນທີ່ບໍ່ຖືກຕ້ອງ</translation> @@ -5922,6 +5932,7 @@ <translation id="7959074893852789871">ໄຟລ໌ມີຫຼາຍໃບຢັ້ງຢືນ, ບາງອັນບໍ່ໄດ້ນໍາເຂົ້າມາເທື່ອ:</translation> <translation id="7961015016161918242">ບໍ່ເລີຍ</translation> <translation id="7963001036288347286">ການເລັ່ງຄວາມໄວແຜ່ນສຳຜັດ</translation> +<translation id="7963608432878156675">ຊື່ນີ້ເບິ່ງເຫັນຕໍ່ກັບອຸປະກອນອື່ນສຳລັບການເຊື່ອມຕໍ່ Bluetooth ແລະ ເຄືອຂ່າຍ</translation> <translation id="7963826112438303517">ຜູ້ຊ່ວຍຂອງທ່ານໃຊ້ບັນທຶກສຽງເຫຼົ່ານີ້ ແລະ ຄຳຂໍທີ່ເວົ້າເປັນສຽງຂອງທ່ານເພື່ອສ້າງ ແລະ ອັບເດດຮູບແບບສຽງຂອງທ່ານ ເຊິ່ງຖືກເກັບໄວ້ໃນອຸປະກອນທີ່ທ່ານເປີດ Voice Match ເທົ່ານັ້ນ. ເບິ່ງ ຫຼື ຝຶກການເຄື່ອນໄຫວທາງສຽງຄືນໃໝ່ໃນການຕັ້ງຄ່າຜູ້ຊ່ວຍ</translation> <translation id="7966241909927244760">ອັດສຳເນົາທີ່ຢູ່ຮູບ</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 ລາຍການໃນລາຍຊື່ບຸກມາກ}other{{COUNT} ລາຍການໃນລາຍຊື່ບຸກມາກ}}</translation> @@ -6385,6 +6396,7 @@ <translation id="850875081535031620">ບໍ່ພົບຊອບແວອັນຕະລາຍໃດໆ</translation> <translation id="8509177919508253835">ຣີເຊັດກະແຈຄວາມປອດໄພ ແລະ ສ້າງ PIN</translation> <translation id="8509646642152301857">ດາວໂຫຼດພົດຈະນານຸກົມສະກົດຄໍາບໍ່ສໍາເລັດ.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{ບໍ່ເຫັນລະຫັດຜ່ານງ່າຍ}=1{ເຫັນລະຫັດຜ່ານງ່າຍ {COUNT} ລາຍການ}other{ເຫັນລະຫັດຜ່ານງ່າຍ {COUNT} ລາຍການ}}</translation> <translation id="8512476990829870887">ສິ້ນສຸດຂະບວນການ</translation> <translation id="851263357009351303">ອະນຸຍາດໃຫ້ <ph name="HOST" /> ສະແດງຮູບທຸກຄັ້ງ</translation> <translation id="8513108775083588393">ໝຸນອັດຕະໂນມັດ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 427f493..ec6fe01 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Žymėti kaip skaitytą</translation> <translation id="6349101878882523185">Įdiegti <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinchronizavimas neveikia. Bandykite atsijungti ir vėl prisijungti.</translation> -<translation id="6351063337294363751">Galite išvalyti naršymo duomenis iš šio meniu</translation> <translation id="6354918092619878358">SECG elipsės formos kreivės secp256r1 (taip pat vadinama ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Neišjunkite įrenginio</translation> <translation id="63566973648609420">Tik jūsų slaptafrazę žinantis asmuo gali skaityti šifruotus duomenis. Slaptafrazė nesiunčiama į sistemą „Google“ ir joje nesaugoma. Pamiršę slaptafrazę arba norėdami pakeisti šį nustatymą turėsite <ph name="BEGIN_LINK" />iš naujo nustatyti sinchronizavimą<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index d108f554..ff8830e4 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Atzīmēt kā izlasītu</translation> <translation id="6349101878882523185">Instalēt <ph name="APP_NAME" /> lietotni</translation> <translation id="6349170655202535379">Sinhronizācija nedarbojas. Izrakstieties un atkārtoti pierakstieties.</translation> -<translation id="6351063337294363751">Šajā izvēlnē varat notīrīt pārlūkošanas datus.</translation> <translation id="6354918092619878358">SECG eliptiskā līkne secp256r1 (jeb ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Neizslēdziet ierīci</translation> <translation id="63566973648609420">Jūsu šifrētos datus var lasīt tikai personas, kurām ir zināma jūsu ieejas frāze. Ieejas frāze netiek sūtīta Google serveriem un netiek tajos glabāta. Ja aizmirsīsiet ieejas frāzi vai vēlēsieties mainīt šo iestatījumu, jums būs <ph name="BEGIN_LINK" />jāatiestata sinhronizācija<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index a779344..daf236d 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Креирај кратенка</translation> <translation id="2050339315714019657">Портрет</translation> <translation id="2053312383184521053">Податоци во состојба на неактивност</translation> +<translation id="2054665754582400095">Вашето присуство</translation> <translation id="2055585478631012616">Ќе ве одјавиме од овие сајтови, вклучително и од отворените картички</translation> <translation id="205560151218727633">Лого на „Помошникот на Google“</translation> <translation id="2058456167109518507">Откриен е уред</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Оди на почетен екран</translation> <translation id="2387458720915042159">Тип на врска прокси</translation> <translation id="2390347491606624519">Не може да се поврзе со прокси-серверот, најавете се повторно</translation> +<translation id="2390782873446084770">Синхронизирање на Wi-Fi</translation> <translation id="2391082728065870591">Испрати извештај со повратни информации</translation> <translation id="2391419135980381625">Стандарден фонт</translation> <translation id="2392163307141705938">Го достигна временското ограничување што твојот родител го поставил за <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Обнови</translation> <translation id="3158033540161634471">Поставете го отпечатокот</translation> <translation id="3159493096109238499">Беж</translation> +<translation id="3159978855457658359">Изменете го името на уредот</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (со хардверски бекап)</translation> <translation id="3161522574479303604">Сите јазици</translation> <translation id="3162853326462195145">Училишна сметка</translation> @@ -3230,6 +3233,7 @@ <translation id="4761104368405085019">Користете го микрофонот</translation> <translation id="4762718786438001384">Просторот на дискот на уредот е критично низок</translation> <translation id="4763408175235639573">Кога ја посетивте страницава, се поставија следниве колачиња</translation> +<translation id="4764368918650455114">Проверете дали двата уреда се отклучени, блиску еден до друг и дали имаат вклучено Bluetooth. Ако споделувате со Chromebook, треба да е вклучена „Споделување во близина“ (отворете ја статусната област со избирање на времето, а потоа изберете „Споделување во близина“). <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Дозволува Android Messages да пренесува SMS-пораки од телефонот во вашиот Chromebook</translation> <translation id="476598255842811483">Никој, освен ако ја отворите „Споделување во близина“ на вашиот уред</translation> <translation id="4768332406694066911">Имате сертификати од овие организации што ве идентификуваат</translation> @@ -3392,6 +3396,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Апликацијава ја инсталирал вашиот администратор.</translation> <translation id="4964455510556214366">Распоред</translation> +<translation id="496446150016900060">да ги синхронизира Wi-Fi мрежите со телефонот</translation> <translation id="4965808351167763748">Дали сигурно сакате да поставите уредов да извршува Hangouts Meet?</translation> <translation id="496888482094675990">Апликацијата Датотеки овозможува брз пристап до датотеки што сте ги зачувале на Google Drive, надворешен склад или уред со Chrome OS.</translation> <translation id="4971412780836297815">Отвори кога ќе заврши</translation> @@ -3698,6 +3703,7 @@ <translation id="5341980496415249280">Почекајте. Се пакува…</translation> <translation id="5342091991439452114">PIN-кодот мора да содржи најмалку <ph name="MINIMUM" /> цифри</translation> <translation id="5344036115151554031">Се враќа Linux</translation> +<translation id="5345916423802287046">Стартувај ја апликацијата која ќе се најавам</translation> <translation id="5350293332385664455">Исклучување на „Помошникот на Google“</translation> <translation id="535123479159372765">Текст копиран од друг уред</translation> <translation id="5352033265844765294">Временско означување</translation> @@ -4007,6 +4013,7 @@ <translation id="5704875434923668958">Се синхронизира со</translation> <translation id="5705005699929844214">Секогаш прикажувај ги опциите за пристапност</translation> <translation id="5705882733397021510">Врати се назад</translation> +<translation id="5707117624115653804">Приспособете ги големината и стилот на титловите за апликациите и сајтовите што ја поддржуваат поставкава</translation> <translation id="5707185214361380026">Не можеше да се вчита наставка од:</translation> <translation id="5708171344853220004">Главно име на Microsoft</translation> <translation id="5709557627224531708">Поставете го Chrome за ваш стандарден прелистувач</translation> @@ -4170,6 +4177,7 @@ <translation id="5904614460720589786">Не можеше да се постави <ph name="APP_NAME" /> поради конфигурациски проблем. Контактирајте со администраторот. Код за грешка: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Речиси ажурирано! Рестартирајте го уредот за да се заврши ажурирањето.</translation> <translation id="5906732635754427568">Податоците поврзани со оваа апликација ќе бидат отстранети од уредов.</translation> +<translation id="5908474332780919512">Стартувај ја апликацијата која ќе се најавам</translation> <translation id="5908695239556627796">Брзина на лизгање на глувчето</translation> <translation id="5908769186679515905">Блокирајте страниците да пуштаат Flash</translation> <translation id="5910363049092958439">Сни&ми слика како…</translation> @@ -4562,7 +4570,6 @@ <translation id="6345878117466430440">Означи како прочитано</translation> <translation id="6349101878882523185">Инсталирај <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Синхронизацијата не функционира. Обидете се да се одјавите и да се најавите повторно.</translation> -<translation id="6351063337294363751">Од ова мени може да ги исчистите податоците од прелистувањето</translation> <translation id="6354918092619878358">SECG елиптична крива secp256r1 (наречена ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Чувајте го уредот вклучен</translation> <translation id="63566973648609420">Само лицата што ја знаат вашата лозинка може да ги прочитаат шифрираните податоци. Лозинката не се испраќа до Google ниту пак се складира. Ако ја заборавите, ќе треба да ја <ph name="BEGIN_LINK" />ресетирате синхронизацијата<ph name="END_LINK" />.</translation> @@ -4710,6 +4717,7 @@ <translation id="6532527800157340614">Пријавувањето не успеа затоа што не можеше да се преземе токенот за пристап. Проверете ја мрежната врска и обидете се повторно.</translation> <translation id="6532663472409656417">Регистриран во компанија</translation> <translation id="6535331821390304775">Секогаш дозволувај <ph name="ORIGIN" /> да отвора линкови од овој тип во поврзаната апликација</translation> +<translation id="6537613839935722475">Името може да содржи букви, бројки и цртички (-)</translation> <translation id="6538635548667167211">Моменталната поставка за користење интернет е „Мобилен интернет“</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Напомена:<ph name="END_BOLD" /> овозможете само ако знаете што правите или ако ви рекле да го направите тоа, затоа што собирањето податоци може да го намали учинокот.</translation> <translation id="6541638731489116978">Пристапот до сензорите за движење е блокиран за сајтов.</translation> @@ -4798,6 +4806,7 @@ <translation id="6650234781371031356">Вашата лозинка за <ph name="WEBSITE" /> е зачувана на уредов и во сметката на Google. Од каде сакате да ја избришете?</translation> <translation id="665061930738760572">Отвори во &нов прозорец</translation> <translation id="6651237644330755633">Имајте доверба во сертификатов за идентификување на веб-сајтовите</translation> +<translation id="6651495917527016072">Синхронизирајте ги Wi-Fi мрежите со телефонот. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="665355505818177700">Интеграцијата на Chrome <ph name="MS_AD_NAME" /> е поддржана само на платформи x86_64. Оваа функционалност не е поддржана на уреди Chromebook изградени на платформи ARM или x86.</translation> <translation id="6654509035557065241">Се претпочита мрежа</translation> <translation id="6655190889273724601">Режим на програмер</translation> @@ -5401,6 +5410,7 @@ <translation id="7375235221357833624">{0,plural, =1{Ажурирајте го уредот во рок од еден час}one{Ажурирајте го уредот во рок од # час}other{Ажурирајте го уредот во рок од # часа}}</translation> <translation id="7376553024552204454">Нагласување на покажувачот на глувчето при движење</translation> <translation id="7377451353532943397">Продолжи со блокирање на пристапот до сензорите</translation> +<translation id="7378611153938412599">Слабите лозинки се лесни за погаѓање. Уверете се дека создавате силни лозинки. <ph name="BEGIN_LINK" />Погледнете повеќе совети за безбедност.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Отворете ја Веб-продавницата на Chrome</translation> <translation id="7378812711085314936">Поврзи се на интернет</translation> <translation id="7380622428988553498">Името на уредот содржи неважечки знаци</translation> @@ -5925,6 +5935,7 @@ <translation id="7959074893852789871">Датотеката содржеше повеќе сертификати, од кои некои не беа увезени:</translation> <translation id="7961015016161918242">Никогаш</translation> <translation id="7963001036288347286">Забрзување на подлогата за допир</translation> +<translation id="7963608432878156675">Имево е видливо за други уреди преку Bluetooth и мрежна врска</translation> <translation id="7963826112438303517">Вашиот „Помошник“ ги користи снимкиве и изговорените барања за да го создаде и ажурира вашиот гласовен модел, којшто се складира само на уредите на кои сте ја вклучиле Voice Match. Прегледајте ја или повторно обучете ја активноста со глас во „Поставките за Помошникот“.</translation> <translation id="7966241909927244760">К&опирај ја адресата на сликата</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 ставка во списокот со обележувачи}one{{COUNT} ставка во списокот со обележувачи}other{{COUNT} ставки во списокот со обележувачи}}</translation> @@ -6391,6 +6402,7 @@ <translation id="850875081535031620">Не е најден штетен софтвер</translation> <translation id="8509177919508253835">Ресетирајте ги безбедносните клучеви и создајте PIN-кодови</translation> <translation id="8509646642152301857">Преземањето речник за проверување правопис не успеа.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Не се најдени слаби лозинки}=1{Најдена е {COUNT} слаба лозинка}one{Најдена е {COUNT} слаба лозинка}other{Најдени се {COUNT} слаби лозинки}}</translation> <translation id="8512476990829870887">Заврши процес</translation> <translation id="851263357009351303">Секогаш дозволи <ph name="HOST" /> да прикажува слики</translation> <translation id="8513108775083588393">Авт. ротирање</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index b11b6dd..f6e01b3 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -4568,7 +4568,6 @@ <translation id="6345878117466430440">വായിച്ചതായി അടയാളപ്പെടുത്തുക</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="6349170655202535379">സമന്വയം പ്രവർത്തിക്കുന്നില്ല. സൈൻ ഔട്ട് ചെയ്ത് വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നത് പരീക്ഷിക്കൂ.</translation> -<translation id="6351063337294363751">നിങ്ങൾക്ക് ഈ മെനുവിൽ നിന്ന് ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കാനാവും</translation> <translation id="6354918092619878358">SECG എലിപ്റ്റിക് കർവ് secp256r1 (ANSI X9.62 prime256v1, NIST P-256 എന്നും അറിയപ്പെടുന്നു)</translation> <translation id="635609604405270300">ഉപകരണം ഓഫാക്കരുത്</translation> <translation id="63566973648609420">നിങ്ങളുടെ പാസ്ഫ്രെയ്സുള്ള ഒരാൾക്ക് മാത്രമേ എൻക്രിപ്റ്റ് ചെയ്ത ഡാറ്റ വായിക്കാനാവൂ. Google-ലേക്ക് പാസ്ഫ്രെയ്സ് അയയ്ക്കുകയോ Google അത് സൂക്ഷിക്കുകയോ ചെയ്യില്ല. പാസ്ഫ്രെയ്സ് മറന്നുപോയെങ്കിലോ ഈ ക്രമീകരണം മാറ്റണമെങ്കിലോ നിങ്ങൾ <ph name="BEGIN_LINK" />സമന്വയിപ്പിക്കൽ റീസെറ്റ് ചെയ്യേണ്ടതുണ്ട്<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index fd89d0f..c3717aa 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -4564,7 +4564,6 @@ <translation id="6345878117466430440">Уншсан гэж тэмдэглэх</translation> <translation id="6349101878882523185"><ph name="APP_NAME" />-г суулгах</translation> <translation id="6349170655202535379">Синк ажиллахгүй байна. Гараад, дахин нэвтэрнэ үү.</translation> -<translation id="6351063337294363751">Та энэ цэснээс хайлтын өгөгдлөө устгах боломжтой</translation> <translation id="6354918092619878358">SECG зууван муруй secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Төхөөрөмжийг асаалттай хэвээр байлгаарай</translation> <translation id="63566973648609420">Зөвхөн таны нэвтрэх үгийг мэддэг хүн л таны шифрлэсэн өгөгдлийг унших боломжтой. Нэвтрэх үгийг Google-д илгээх болон хадгалахгүй. Хэрэв та нэвтрэх үгээ мартсан, эсвэл тохиргоог өөрчлөх бол <ph name="BEGIN_LINK" />синкийг дахин тохируулах<ph name="END_LINK" /> шаардлагатай.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index f453a7f..8a669010 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -4560,7 +4560,6 @@ <translation id="6345878117466430440">वाचलेले अशी खूण करा</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> इंस्टॉल करा</translation> <translation id="6349170655202535379">सिंक कार्य करत नाही. साइन आउट करून पुन्हा साइन इन करून पहा.</translation> -<translation id="6351063337294363751">तुम्ही या मेनूमधून तुमचा ब्राउझिंग डेटा साफ करू शकता</translation> <translation id="6354918092619878358">SECG एल्लिपटिक कर्व्ह secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">डिव्हाइस सुरू ठेवा</translation> <translation id="63566973648609420">फक्त तुमचा सांकेतिक पासफ्रेझ असलेली एखादी व्यक्ती तुमचा एंक्रिप्ट केलेला डेटा वाचू शकते. सांकेतिक पासफ्रेझ Google कडे पाठविला किंवा त्याद्वारे स्टोअर केला जात नाही. तुमचा सांकेतिक पासफ्रेझ विसरल्यास किंवा हे सेटिंग बदलू इच्छित असल्यास, तुम्हाला <ph name="BEGIN_LINK" />सिंक रीसेट करण्याची आवश्यकता असेल<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index a1659ac..dd1f57c 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Tandai sebagai dibaca</translation> <translation id="6349101878882523185">Pasang <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Penyegerakan tidak berfungsi. Cuba log keluar dan log masuk semula.</translation> -<translation id="6351063337294363751">Anda boleh mengosongkan data semakan imbas anda daripada menu ini</translation> <translation id="6354918092619878358">Lengkung eliptik SECG secp256r1 (alias ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Sentiasa hidupkan peranti</translation> <translation id="63566973648609420">Hanya orang yang tahu ungkapan laluan anda boleh membaca data anda yang disulitkan. Ungkapan laluan tidak dihantar atau disimpan oleh Google. Jika anda terlupa ungkapan laluan atau ingin menukar tetapan ini, anda perlu <ph name="BEGIN_LINK" />menetapkan semula penyegerakan<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index cfe2e23..f8d045c0 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">ဖတ်ပြီးဟု မှတ်သားရန်</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ထည့်သွင်းရန်</translation> <translation id="6349170655202535379">စင့်ခ်လုပ်၍ မရပါ။ ထွက်ပြီး ပြန်လည်၍ လက်မှတ်ထိုးဝင်ပါ။</translation> -<translation id="6351063337294363751">သင်၏ ဖွင့်ကြည့်ထားသည့် မှတ်တမ်းဒေတာတို့ကို ဤမီနူးမှနေ၍ ရှင်းပစ်နိုင်ပါသည်</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ကိရိယာကို ဆက်ဖွင့်ထားပါ</translation> <translation id="63566973648609420">သင့်စကားဝှက်ရှိသူသာ သင်အသွင်ဝှက်ထားသည့် ဒေတာများကို ဖတ်နိုင်မည် ဖြစ်သည်။ စကားဝှက်ကို Google သို့ပို့ခြင်း သို့မဟုတ် သိမ်းဆည်းထားခြင်း မရှိပါ။ သင့်စကားဝှက်ကို မေ့သွားလျှင် သို့မဟုတ် ဤဆက်တင်ကို ပြောင်းလဲလိုလျှင် <ph name="BEGIN_LINK" />စင့်ခ်လုပ်ခြင်းကို ပြန်လည်သတ်မှတ်ပေးရန်<ph name="END_LINK" /> လိုအပ်ပါသည်။</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index ef1eab7..326b5fe 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -4549,7 +4549,6 @@ <translation id="6345878117466430440">पढिसकिएको सामग्रीका रूपमा चिन्ह लगाउनुहोस्</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> स्थापना गर्नुहोस्</translation> <translation id="6349170655202535379">सिंकले काम गरिरहेको छैन। साइन आउट गरेर फेरि साइन इन गरी हेर्नुहोस्।</translation> -<translation id="6351063337294363751">तपाईं यस मेनुबाट आफ्नो ब्राउजिङको डेटा खाली गर्न सक्नुहुन्छ</translation> <translation id="6354918092619878358">SECG अण्डाकार कर्भ secp256r1 (ANSI X9.62 prime256v1, NIST P-256 पनि भनिन्छ)</translation> <translation id="635609604405270300">यन्त्रलाई सक्रिय राख्नुहोस्</translation> <translation id="63566973648609420">तपाईंको इन्क्रिप्ट गरिएको डेटालाई तपाईंको पासफ्रेज भएको व्यक्तिले मात्र पढ्न सक्छ। पासफ्रेजलाई Google मा पठाइँदैन वा त्यहाँ भण्डारण गरिदैन। यदि तपाईंले आफ्नो पासफ्रेज बिर्सनुभयो वा यस सेटिङलाई परिवर्तन गर्न चाहनुहुन्छ भने तपाईंले <ph name="BEGIN_LINK" />सिंकलाई रिसेट<ph name="END_LINK" /> गर्नुपर्ने हुन्छ।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index b8504ab..e73897a 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -4570,7 +4570,6 @@ <translation id="6345878117466430440">Markeren als gelezen</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> installeren</translation> <translation id="6349170655202535379">Synchronisatie werkt niet. Probeer uit en weer in te loggen.</translation> -<translation id="6351063337294363751">Je kunt je browsergegevens wissen vanuit dit menu</translation> <translation id="6354918092619878358">Elliptische SECG-kromme secp256r1 (ook wel ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Apparaat ingeschakeld laten</translation> <translation id="63566973648609420">Alleen iemand met je wachtwoordzin kan je versleutelde gegevens lezen. De wachtwoordzin wordt niet verzonden naar of opgeslagen door Google. Als je je wachtwoordzin vergeet of deze instelling wilt wijzigen, moet je de <ph name="BEGIN_LINK" />synchronisatie resetten<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index c93cd1f..51854caa 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -925,6 +925,7 @@ <translation id="204914487372604757">Opprett snarvei</translation> <translation id="2050339315714019657">Stående</translation> <translation id="2053312383184521053">Data om hviletilstand</translation> +<translation id="2054665754582400095">Tilstedeværelsen din</translation> <translation id="2055585478631012616">Du blir logget av disse nettstedene – inkludert i åpne faner</translation> <translation id="205560151218727633">Google Assistent-logo</translation> <translation id="2058456167109518507">Enhet oppdaget</translation> @@ -1211,6 +1212,7 @@ <translation id="2387052489799050037">Gå til startsiden</translation> <translation id="2387458720915042159">Tilkoblingstype for proxy-tjener</translation> <translation id="2390347491606624519">Kan ikke koble til proxy-tjeneren – logg på på nytt</translation> +<translation id="2390782873446084770">Wi-Fi-synkronisering</translation> <translation id="2391082728065870591">Send tilbakemeldingsrapport</translation> <translation id="2391419135980381625">Standardskrift</translation> <translation id="2392163307141705938">Du har nådd tidsgrensen som forelderen din har angitt for <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1867,6 +1869,7 @@ <translation id="3157931365184549694">Gjenopprett</translation> <translation id="3158033540161634471">Konfigurer fingeravtrykket ditt</translation> <translation id="3159493096109238499">Beige</translation> +<translation id="3159978855457658359">Rediger enhetsnavnet</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (maskinvarestøttet)</translation> <translation id="3161522574479303604">Alle språk</translation> <translation id="3162853326462195145">Skolekonto</translation> @@ -3225,6 +3228,7 @@ <translation id="4761104368405085019">bruke mikrofonen din</translation> <translation id="4762718786438001384">Det er kritisk lite plass på enheten</translation> <translation id="4763408175235639573">Følgende informasjonskapsler ble angitt da du besøkte denne siden</translation> +<translation id="4764368918650455114">Kontrollér at begge enhetene er låst opp, er i nærheten av hverandre og har Bluetooth påslått. Hvis du deler med en Chromebook, må du sørge for at den har nærdeling påslått (åpne statusfeltet ved å velge tidspunktet, og velg deretter Nærdeling). <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Tillater at Android Messages videresender tekstmeldinger fra telefonen din til Chromebook</translation> <translation id="476598255842811483">Ingen, med mindre du åpner nærdeling på enheten din</translation> <translation id="4768332406694066911">Du har sertifikater som identifiserer deg, fra disse organisasjonene</translation> @@ -3387,6 +3391,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Denne appen er installert av administratoren.</translation> <translation id="4964455510556214366">Oppsett</translation> +<translation id="496446150016900060">Synkroniser Wi-Fi-nettverk med telefonen din</translation> <translation id="4965808351167763748">Er du sikker på at du vil konfigurere Hangouts Meet på denne enheten?</translation> <translation id="496888482094675990">Med Filer-appen får du rask tilgang til filer du har lagret på Google Disk, eksterne langringsenheter eller Chrome OS-enheten din.</translation> <translation id="4971412780836297815">Åpne når ferdig</translation> @@ -3693,6 +3698,7 @@ <translation id="5341980496415249280">Vent litt – pakker …</translation> <translation id="5342091991439452114">PIN-koden må inneholde minst <ph name="MINIMUM" /> sifre</translation> <translation id="5344036115151554031">Gjenoppretter Linux</translation> +<translation id="5345916423802287046">Start appen når du logger på</translation> <translation id="5350293332385664455">Slå av Google-assistenten</translation> <translation id="535123479159372765">Tekst er kopiert fra en annen enhet</translation> <translation id="5352033265844765294">Tidsangivelse</translation> @@ -4002,6 +4008,7 @@ <translation id="5704875434923668958">Synkroniserer med</translation> <translation id="5705005699929844214">Vis alltid tilgjengelighetsalternativer</translation> <translation id="5705882733397021510">Tilbake</translation> +<translation id="5707117624115653804">Tilpass størrelsen og stilen på tekstingen i apper og på nettsteder som støtter denne innstillingen</translation> <translation id="5707185214361380026">Kunne ikke laste inn utvidelse fra:</translation> <translation id="5708171344853220004">Microsoft hovednavn</translation> <translation id="5709557627224531708">Angi Chrome som standardnettleser</translation> @@ -4165,6 +4172,7 @@ <translation id="5904614460720589786">Kunne ikke konfigurere <ph name="APP_NAME" /> på grunn av et konfigurasjonsproblem. Kontakt administratoren din. Feilkode: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Nå er oppdateringen snart ferdig! Start enheten på nytt for å fullføre oppdateringen.</translation> <translation id="5906732635754427568">Data som er tilknyttet denne appen, fjernes fra denne enheten.</translation> +<translation id="5908474332780919512">Start appen når du logger på</translation> <translation id="5908695239556627796">Rullehastighet for musen</translation> <translation id="5908769186679515905">Blokkér nettsteder fra å kjøre Flash</translation> <translation id="5910363049092958439">Lagre &bildet som</translation> @@ -4557,7 +4565,6 @@ <translation id="6345878117466430440">Merk som lest</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Synkroniseringen fungerer ikke. Prøv å logge av og på igjen.</translation> -<translation id="6351063337294363751">Du kan slette nettleserloggen fra denne menyen</translation> <translation id="6354918092619878358">SECG elliptisk kurve secp256r1 (også kjent som ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Hold enheten påslått</translation> <translation id="63566973648609420">Bare de som har passordfrasen din, kan lese de krypterte dataene dine. Passordfrasen blir verken sendt til Google eller lagret av oss. Hvis du glemmer passordfrasen eller vil endre denne innstillingen, må du <ph name="BEGIN_LINK" />tilbakestille synkroniseringen<ph name="END_LINK" />.</translation> @@ -4705,6 +4712,7 @@ <translation id="6532527800157340614">Påloggingen mislyktes fordi tilgangstokenet ditt ikke kunne hentes. Sjekk nettverkstilkoblingen din, og prøv på nytt.</translation> <translation id="6532663472409656417">Bedriftsregistrert</translation> <translation id="6535331821390304775">Tillat alltid <ph name="ORIGIN" /> å åpne linker av denne typen i den tilknyttede appen</translation> +<translation id="6537613839935722475">Navnet kan inneholde bokstaver, tall og bindestreker (-)</translation> <translation id="6538635548667167211">Gjeldende innstilling for databruk er Data</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Merk:<ph name="END_BOLD" /> Ettersom innsamling av data kan redusere ytelsen bør du bare aktivere dette hvis du vet hva du gjør eller har blitt bedt om å gjøre dette.</translation> <translation id="6541638731489116978">Dette nettstedet er blokkert fra å få tilgang til bevegelsessensorene dine.</translation> @@ -4793,6 +4801,7 @@ <translation id="6650234781371031356">Passordet ditt for <ph name="WEBSITE" /> er lagret på denne enheten og i Google-kontoen din. Hvilket vil du slette?</translation> <translation id="665061930738760572">Åpne i &nytt vindu</translation> <translation id="6651237644330755633">Stol på dette sertifikatet for identifisering av nettsteder.</translation> +<translation id="6651495917527016072">Synkroniser Wi-Fi-nettverk med telefonen din. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" />-integrering støttes bare på x86_64-plattformer. Chromebook-enheter som er bygget på en ARM- eller x86-plattform, støtter ikke denne funksjonaliteten.</translation> <translation id="6654509035557065241">Foretrekk nettverk</translation> <translation id="6655190889273724601">Utviklermodus</translation> @@ -5396,6 +5405,7 @@ <translation id="7375235221357833624">{0,plural, =1{Oppdater enheten innen en time}other{Oppdater enheten innen # timer}}</translation> <translation id="7376553024552204454">Fremhev musepekeren når den beveger seg</translation> <translation id="7377451353532943397">Fortsett blokkering av sensortilgang</translation> +<translation id="7378611153938412599">Svake passord er enkle å gjette. Sørg for at du lager sterke passord. <ph name="BEGIN_LINK" />Se flere sikkerhetstips.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Åpne Chrome Nettmarked</translation> <translation id="7378812711085314936">Få datatilkobling</translation> <translation id="7380622428988553498">Enhetsnavnet inneholder ugyldige tegn</translation> @@ -5920,6 +5930,7 @@ <translation id="7959074893852789871">Filen inneholdt flere sertifikater, og enkelte av dem ble ikke importert:</translation> <translation id="7961015016161918242">Aldri</translation> <translation id="7963001036288347286">Styreflateakselerasjon</translation> +<translation id="7963608432878156675">Dette navnet er synlig for andre enheter for Bluetooth- og nettverkstilkoblinger</translation> <translation id="7963826112438303517">Assistenten bruker disse opptakene og uttalte forespørsler fra deg for å opprette og oppdatere stemmemodellen din, som bare lagres på enheter der du har slått på Voice Match. Du kan se taleaktivitet eller lære den opp på nytt i Assistent-innstillingene.</translation> <translation id="7966241909927244760">K&opiér bildeadressen</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 element på bokmerkelisten}other{{COUNT} elementer på bokmerkelisten}}</translation> @@ -6384,6 +6395,7 @@ <translation id="850875081535031620">Fant ingen skadelig programvare</translation> <translation id="8509177919508253835">Tilbakestill sikkerhetsnøkler, og opprett PIN-koder</translation> <translation id="8509646642152301857">Nedlastingen av ordboken for stavekontroll mislyktes.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Fant ingen svake passord}=1{Fant {COUNT} svakt passord}other{Fant {COUNT} svake passord}}</translation> <translation id="8512476990829870887">Avslutt prosessen</translation> <translation id="851263357009351303">Tillat alltid <ph name="HOST" /> å vise bilder</translation> <translation id="8513108775083588393">Autorotasjon</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index ce39a4e..85aeb72 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -4554,7 +4554,6 @@ <translation id="6345878117466430440">ପଢ଼ାଯାଇଛି ଭାବରେ ଚିହ୍ନଟ କରନ୍ତୁ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ଇନଷ୍ଟଲ୍ କରନ୍ତୁ</translation> <translation id="6349170655202535379">ସିଙ୍କ୍ କାମ କରୁନାହିଁ ସାଇନ୍ ଆଉଟ୍ କରନ୍ତୁ ଏବଂ ପୁଣି ସାଇନ୍ ଇନ୍ କରି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> -<translation id="6351063337294363751">ଏହି ମେନୁରୁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଡାଟା ଖାଲି କରିପାରିବେ</translation> <translation id="6354918092619878358">SECG ଅଣ୍ଡାକାର ବକ୍ର secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ଡିଭାଇସ୍କୁ ଚାଲୁ ଅବସ୍ଥାରେ ରଖନ୍ତୁ</translation> <translation id="63566973648609420">ଆପଣଙ୍କ ଏନ୍କ୍ରିପ୍ଟ ହୋଇଥିବା ଡାଟାକୁ କେବଳ ଆପଣଙ୍କ ପାସ୍ଫ୍ରେଜ୍ ଥିବା ଜଣେ ବ୍ୟକ୍ତି ପଢ଼ିପାରିବେ। Google ଦ୍ବାରା ପାସ୍ଫ୍ରେଜ୍ ପଠାଯାଏ ନାହିଁ ବା ଷ୍ଟୋର୍ କରାଯାଏନାହିଁ। ଯଦି ଆପଣ ନିଜର ପାସ୍ଫ୍ରେଜ୍ ଭୁଲିଯାଇଛନ୍ତି କିମ୍ବା ଏହି ସେଟିଂ ପରିବର୍ତ୍ତନ କରିବାକୁ ଚାହୁଁଛନ୍ତି, ତେବେ ଆପଣଙ୍କୁ <ph name="BEGIN_LINK" />ସିଙ୍କ୍ ରିସେଟ୍<ph name="END_LINK" /> କରିବାକୁ ହେବ।</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index eed3636..b13ff8e 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -4552,7 +4552,6 @@ <translation id="6345878117466430440">ਪੜ੍ਹੇ ਵਜੋਂ ਨਿਸ਼ਾਨਦੇਹੀ ਕਰੋ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ਸਥਾਪਤ ਕਰੋ</translation> <translation id="6349170655202535379">ਸਮਕਾਲੀਕਰਨ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਹੈ। ਸਾਈਨ-ਆਊਟ ਕਰਕੇ ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> -<translation id="6351063337294363751">ਤੁਸੀਂ ਇਸ ਮੀਨੂ ਤੋਂ ਆਪਣਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਸਾਫ਼ ਕਰ ਸਕਦੇ ਹੋ</translation> <translation id="6354918092619878358">SECG ਅੰਡਾਕਾਰ ਘੁਮਾਓ secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">ਡੀਵਾਈਸ ਚਾਲੂ ਰੱਖੋ</translation> <translation id="63566973648609420">ਤੁਹਾਡੇ ਇਨਕ੍ਰਿਪਟਡ ਡਾਟੇ ਨੂੰ ਸਿਰਫ਼ ਓਹੀ ਵਿਅਕਤੀ ਪੜ੍ਹ ਸਕਦਾ ਹੈ ਜਿਸ ਕੋਲ ਤੁਹਾਡਾ ਪਾਸਫਰੇਜ਼ ਹੋਵੇ। ਪਾਸਫਰੇਜ਼ Google ਨੂੰ ਭੇਜਿਆ ਜਾਂ ਉਸ ਵੱਲੋਂ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਫਰੇਜ਼ ਭੁੱਲ ਜਾਂਦੇ ਹੋ ਜਾਂ ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ <ph name="BEGIN_LINK" />ਸਮਕਾਲੀਕਰਨ ਨੂੰ ਰੀਸੈੱਟ<ph name="END_LINK" /> ਕਰਨ ਦੀ ਲੋੜ ਪਵੇਗੀ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 5a06585..0c04982 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -924,6 +924,7 @@ <translation id="204914487372604757">Utwórz skrót</translation> <translation id="2050339315714019657">Pionowo</translation> <translation id="2053312383184521053">Dane o stanie bezczynności</translation> +<translation id="2054665754582400095">Twoja obecność</translation> <translation id="2055585478631012616">Wylogujemy Cię z tych stron, także na otwartych kartach</translation> <translation id="205560151218727633">Logo Asystenta Google</translation> <translation id="2058456167109518507">Wykryto urządzenie</translation> @@ -1210,6 +1211,7 @@ <translation id="2387052489799050037">Powrót do ekranu głównego</translation> <translation id="2387458720915042159">Typ połączenia z serwerem proxy</translation> <translation id="2390347491606624519">Nie udało się nawiązać połączenia z serwerem proxy. Zaloguj się ponownie.</translation> +<translation id="2390782873446084770">Wi-Fi Sync</translation> <translation id="2391082728065870591">Prześlij zgłoszenie opinii</translation> <translation id="2391419135980381625">Czcionka standardowa</translation> <translation id="2392163307141705938">Upłynął ustawiony przez rodzica limit czasu korzystania z <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1866,6 +1868,7 @@ <translation id="3157931365184549694">Przywróć</translation> <translation id="3158033540161634471">Skonfiguruj swój odcisk palca</translation> <translation id="3159493096109238499">Beżowy</translation> +<translation id="3159978855457658359">Edytuj nazwę urządzenia</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (obsługiwany sprzętowo)</translation> <translation id="3161522574479303604">Wszystkie języki</translation> <translation id="3162853326462195145">Konto szkolne</translation> @@ -3226,6 +3229,7 @@ <translation id="4761104368405085019">Korzystanie z Twojego mikrofonu</translation> <translation id="4762718786438001384">Bardzo mało miejsca na dysku</translation> <translation id="4763408175235639573">Podczas wyświetlania strony zostały utworzone te pliki cookie</translation> +<translation id="4764368918650455114">Dopilnuj, by obydwa urządzenia były odblokowane, znajdowały się blisko siebie i miały włączony Bluetooth. Jeśli chcesz coś udostępnić Chromebookowi, upewnij się, że ma włączone Udostępnianie w pobliżu (kliknij godzinę, by otworzyć pasek stanu, a potem wybierz Udostępnianie w pobliżu). <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Zezwala Wiadomościom na Androida przesyłać SMS-y z telefonu na Chromebooka</translation> <translation id="476598255842811483">Nikt, chyba że na swoim urządzeniu otworzysz Udostępnianie w pobliżu</translation> <translation id="4768332406694066911">Masz certyfikaty od tych organizacji potwierdzające Twoją tożsamość</translation> @@ -3388,6 +3392,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Tę aplikację zainstalował administrator.</translation> <translation id="4964455510556214366">Układ</translation> +<translation id="496446150016900060">Zsynchronizuj sieci Wi-Fi z telefonem</translation> <translation id="4965808351167763748">Czy na pewno chcesz skonfigurować to urządzenie na potrzeby Hangouts Meet?</translation> <translation id="496888482094675990">Aplikacja Pliki daje szybki dostęp do plików zapisanych na Dysku Google, urządzeniu z Chrome OS lub w pamięci zewnętrznej.</translation> <translation id="4971412780836297815">Otwórz po zakończeniu</translation> @@ -3694,6 +3699,7 @@ <translation id="5341980496415249280">Czekaj, pakuję…</translation> <translation id="5342091991439452114">Kod PIN musi się składać co najmniej z <ph name="MINIMUM" /> cyfr</translation> <translation id="5344036115151554031">Przywracanie Linuksa</translation> +<translation id="5345916423802287046">Uruchom aplikację po zalogowaniu</translation> <translation id="5350293332385664455">Wyłącz Asystenta Google</translation> <translation id="535123479159372765">Tekst skopiowany z innego urządzenia</translation> <translation id="5352033265844765294">Dodawanie sygnatury czasowej</translation> @@ -4003,6 +4009,7 @@ <translation id="5704875434923668958">Synchronizacja z</translation> <translation id="5705005699929844214">Zawsze pokazuj opcje ułatwień dostępu</translation> <translation id="5705882733397021510">Wróć</translation> +<translation id="5707117624115653804">Dostosuj rozmiar i styl napisów w przypadku aplikacji i stron, które obsługują to ustawienie</translation> <translation id="5707185214361380026">Nie udało się wczytać rozszerzenia z:</translation> <translation id="5708171344853220004">Nazwa główna firmy Microsoft</translation> <translation id="5709557627224531708">Ustaw Chrome jako domyślną przeglądarkę</translation> @@ -4166,6 +4173,7 @@ <translation id="5904614460720589786">Z powodu błędu konfiguracji nie udało się skonfigurować <ph name="APP_NAME" />. Skontaktuj się z administratorem. Kod błędu: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Już prawie gotowe. Uruchom ponownie urządzenie, by zakończyć aktualizację.</translation> <translation id="5906732635754427568">Dane powiązane z tą aplikacją zostaną usunięte z urządzenia.</translation> +<translation id="5908474332780919512">Uruchom aplikację po zalogowaniu</translation> <translation id="5908695239556627796">Szybkość przewijania kółkiem myszy</translation> <translation id="5908769186679515905">Zablokuj uruchamianie Flasha na stronach</translation> <translation id="5910363049092958439">Zapisz gra&fikę jako...</translation> @@ -4558,7 +4566,6 @@ <translation id="6345878117466430440">Oznacz jako przeczytane</translation> <translation id="6349101878882523185">Zainstaluj aplikację <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Synchronizacja nie działa. Wyloguj się i zaloguj się ponownie.</translation> -<translation id="6351063337294363751">Używając tego menu, możesz wyczyścić dane przeglądania</translation> <translation id="6354918092619878358">Kryptografia krzywych eliptycznych SECG secp256r1 (inne nazwy: ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Nie wyłączaj urządzenia</translation> <translation id="63566973648609420">Twoje zaszyfrowane dane może odczytać tylko ktoś znający hasło. Google nie otrzyma Twojego hasła ani nie będzie go przechowywać. Jeśli je zapomnisz lub zechcesz zmienić to ustawienie, musisz <ph name="BEGIN_LINK" />zresetować synchronizację<ph name="END_LINK" />.</translation> @@ -4706,6 +4713,7 @@ <translation id="6532527800157340614">Nie można Cię zalogować, ponieważ nie udało się pobrać Twojego tokenu dostępu. Sprawdź połączenie sieciowe i spróbuj jeszcze raz.</translation> <translation id="6532663472409656417">Zarejestrowane w firmie</translation> <translation id="6535331821390304775">Zawsze zezwalaj stronie <ph name="ORIGIN" /> na otwieranie linków tego typu w powiązanej aplikacji</translation> +<translation id="6537613839935722475">Nazwa może zawierać litery, cyfry i łączniki (-)</translation> <translation id="6538635548667167211">Bieżące ustawienie transmisji danych: Dane</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Uwaga:<ph name="END_BOLD" /> włącz tę opcję, tylko jeśli dokładnie wiesz, co robisz, lub ktoś Cię o to poprosił – zbieranie danych może obniżyć wydajność.</translation> <translation id="6541638731489116978">Tej stronie zablokowano dostęp do czujników ruchu.</translation> @@ -4794,6 +4802,7 @@ <translation id="6650234781371031356">Hasło, którego używasz na stronie <ph name="WEBSITE" />, jest zapisane na tym urządzeniu i na koncie Google. Skąd chcesz je usunąć?</translation> <translation id="665061930738760572">Otwórz w &nowym oknie</translation> <translation id="6651237644330755633">Ufaj temu certyfikatowi przy identyfikowaniu witryn internetowych</translation> +<translation id="6651495917527016072">Zsynchronizuj sieci Wi-Fi z telefonem. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="665355505818177700">Integracja Chrome <ph name="MS_AD_NAME" /> jest obsługiwana tylko na platformach x86_64. Chromebooki zbudowane na platformach ARM lub x86 nie obsługują tej funkcji.</translation> <translation id="6654509035557065241">Ustaw sieć jako preferowaną</translation> <translation id="6655190889273724601">Tryb dewelopera</translation> @@ -5397,6 +5406,7 @@ <translation id="7375235221357833624">{0,plural, =1{Aktualizacja urządzenia nastąpi w ciągu godziny}few{Aktualizacja urządzenia nastąpi w ciągu # godzin}many{Aktualizacja urządzenia nastąpi w ciągu # godzin}other{Aktualizacja urządzenia nastąpi w ciągu # godziny}}</translation> <translation id="7376553024552204454">Podświetlaj wskaźnik myszy, gdy się porusza</translation> <translation id="7377451353532943397">Nadal blokuj dostęp do czujników</translation> +<translation id="7378611153938412599">Słabe hasła są łatwe do odgadnięcia. Pamiętaj, by używać tylko silnych haseł. <ph name="BEGIN_LINK" />Więcej wskazówek dotyczących bezpieczeństwa<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otwórz Chrome Web Store</translation> <translation id="7378812711085314936">Korzystanie z transmisji danych</translation> <translation id="7380622428988553498">Nazwa urządzenia zawiera niedozwolone znaki</translation> @@ -5921,6 +5931,7 @@ <translation id="7959074893852789871">Plik zawierał wiele certyfikatów, z których niektóre nie zostały zaimportowane:</translation> <translation id="7961015016161918242">Nigdy</translation> <translation id="7963001036288347286">Przyspieszenie touchpada</translation> +<translation id="7963608432878156675">Ta nazwa jest widoczna dla innych urządzeń połączonych przez sieć lub Bluetooth</translation> <translation id="7963826112438303517">Asystent używa tych nagrań i wypowiadanych przez Ciebie poleceń do tworzenia i aktualizowania modelu Twojego głosu. Model ten jest przechowywany tylko na tych urządzeniach, na których jest włączona funkcja Voice Match. W ustawieniach Asystenta możesz zobaczyć aktywność głosową oraz nauczyć go ponownie modelu głosu.</translation> <translation id="7966241909927244760">K&opiuj adres obrazu</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 element na liście zakładek}few{{COUNT} elementy na liście zakładek}many{{COUNT} elementów na liście zakładek}other{{COUNT} elementu na liście zakładek}}</translation> @@ -6385,6 +6396,7 @@ <translation id="850875081535031620">Nie znaleziono szkodliwego oprogramowania</translation> <translation id="8509177919508253835">Zresetuj klucze bezpieczeństwa i utwórz kody PIN</translation> <translation id="8509646642152301857">Nie udało się pobrać słownika funkcji sprawdzania pisowni.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Nie znaleziono słabych haseł}=1{Znaleziono {COUNT} słabe hasło}few{Znaleziono {COUNT} słabe hasła}many{Znaleziono {COUNT} słabych haseł}other{Znaleziono {COUNT} słabego hasła}}</translation> <translation id="8512476990829870887">Zakończ proces</translation> <translation id="851263357009351303">Zawsze zezwalaj na pokazywanie grafik w witrynie <ph name="HOST" /></translation> <translation id="8513108775083588393">Autoobracanie</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 450de9d..1e94953 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Criar atalho</translation> <translation id="2050339315714019657">Retrato</translation> <translation id="2053312383184521053">Dados em estado de inatividade</translation> +<translation id="2054665754582400095">Sua presença</translation> <translation id="2055585478631012616">Sua conta será desconectada desses sites, inclusive nas guias abertas.</translation> <translation id="205560151218727633">Logotipo do Google Assistente</translation> <translation id="2058456167109518507">Dispositivo detectado</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Ir para a tela inicial</translation> <translation id="2387458720915042159">Tipo de conexão proxy</translation> <translation id="2390347491606624519">Não foi possível se conectar ao proxy. Tente fazer login novamente</translation> +<translation id="2390782873446084770">Sincronizar Wi-Fi</translation> <translation id="2391082728065870591">Enviar relatório de feedback</translation> <translation id="2391419135980381625">Fonte padrão</translation> <translation id="2392163307141705938">Você atingiu o limite de tempo que seu pai/mãe definiu para <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Restaurar</translation> <translation id="3158033540161634471">Configurar impressão digital</translation> <translation id="3159493096109238499">Bege</translation> +<translation id="3159978855457658359">Editar o nome do dispositivo</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (no hardware)</translation> <translation id="3161522574479303604">Todos os idiomas</translation> <translation id="3162853326462195145">Conta escolar</translation> @@ -3231,6 +3234,7 @@ <translation id="4761104368405085019">Usar microfone</translation> <translation id="4762718786438001384">Dispositivo com espaço em disco criticamente baixo</translation> <translation id="4763408175235639573">Os cookies a seguir foram definidos quando você visualizou esta página</translation> +<translation id="4764368918650455114">Verifique se os dois dispositivos estão desbloqueados, próximos um do outro e com o Bluetooth ativado. Se você estiver compartilhando com um Chromebook, abra a área de status clicando no horário e selecione "Compartilhar por proximidade" para verificar se o recurso está ativado. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Permite que o Android Mensagens transmita mensagens de texto do smartphone para o Chromebook</translation> <translation id="476598255842811483">Ninguém, a menos que você abra o recurso "Compartilhar por proximidade"</translation> <translation id="4768332406694066911">Você tem certificados das seguintes empresas que identificam você</translation> @@ -3393,6 +3397,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" />: <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Este app foi instalado pelo seu administrador.</translation> <translation id="4964455510556214366">Organização</translation> +<translation id="496446150016900060">Sincronizar redes Wi-Fi com seu smartphone</translation> <translation id="4965808351167763748">Você quer mesmo configurar este dispositivo para executar o Google Meet?</translation> <translation id="496888482094675990">O aplicativo Arquivos fornece acesso rápido a arquivos que foram salvos no Google Drive, em armazenamento externo ou no seu dispositivo Chrome OS.</translation> <translation id="4971412780836297815">Abrir quando estiver concluído</translation> @@ -3699,6 +3704,7 @@ <translation id="5341980496415249280">Aguarde, empacotando...</translation> <translation id="5342091991439452114">O PIN deve ter no mínimo <ph name="MINIMUM" /> dígitos</translation> <translation id="5344036115151554031">Restaurando o Linux</translation> +<translation id="5345916423802287046">Iniciar app ao fazer login</translation> <translation id="5350293332385664455">Desativar o Google Assistente</translation> <translation id="535123479159372765">Texto copiado de outro dispositivo</translation> <translation id="5352033265844765294">Carimbo de data/hora</translation> @@ -4009,6 +4015,7 @@ <translation id="5704875434923668958">Sincronizando com</translation> <translation id="5705005699929844214">Sempre mostrar opções de acessibilidade</translation> <translation id="5705882733397021510">Voltar</translation> +<translation id="5707117624115653804">Personalizar o tamanho e o estilo das legendas em apps e sites compatíveis com esta configuração</translation> <translation id="5707185214361380026">Falha ao carregar a extensão a partir de:</translation> <translation id="5708171344853220004">Nome principal da Microsoft</translation> <translation id="5709557627224531708">Definir o Chrome como seu navegador padrão</translation> @@ -4172,6 +4179,7 @@ <translation id="5904614460720589786">Não foi possível definir o app <ph name="APP_NAME" /> devido a um problema de configuração. Entre em contato com o administrador. Código do erro: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Atualização quase concluída. Reinicie o dispositivo para concluí-la.</translation> <translation id="5906732635754427568">Os dados associados a este app serão removidos deste dispositivo.</translation> +<translation id="5908474332780919512">Iniciar app ao fazer login</translation> <translation id="5908695239556627796">Velocidade de rolagem do mouse</translation> <translation id="5908769186679515905">Impedir que sites executem Flash</translation> <translation id="5910363049092958439">Sal&var imagem como...</translation> @@ -4565,7 +4573,6 @@ <translation id="6345878117466430440">Marcar como lida</translation> <translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">A sincronização não está funcionando. Tente sair e fazer login novamente.</translation> -<translation id="6351063337294363751">É possível limpar seus dados de navegação desse menu</translation> <translation id="6354918092619878358">Curva elíptica SECG secp256r1 (também conhecida como ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Mantenha o dispositivo ligado</translation> <translation id="63566973648609420">Somente uma pessoa que tenha sua senha longa pode ler seus dados criptografados. A senha longa não é enviada para o Google ou armazenada por ele. Se você esquecer sua senha longa ou quiser alterar essa configuração, será necessário <ph name="BEGIN_LINK" />redefinir a sincronização<ph name="END_LINK" />.</translation> @@ -4713,6 +4720,7 @@ <translation id="6532527800157340614">O login falhou porque não foi possível recuperar seu token de acesso. Verifique sua conexão de rede e tente novamente.</translation> <translation id="6532663472409656417">Inscrito pela empresa</translation> <translation id="6535331821390304775">Sempre permitir que <ph name="ORIGIN" /> abra esse tipo de link no app associado</translation> +<translation id="6537613839935722475">O nome pode conter letras, números e hifens (-)</translation> <translation id="6538635548667167211">A configuração atual de uso de dados é "Dados"</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Observação:<ph name="END_BOLD" /> Ative somente se você souber o que está fazendo ou tiver sido solicitado(a) a fazê-lo, porque a coleta de dados pode reduzir o desempenho.</translation> <translation id="6541638731489116978">Este site foi impedido de acessar seus sensores de movimento.</translation> @@ -4801,6 +4809,7 @@ <translation id="6650234781371031356">Sua senha para <ph name="WEBSITE" /> foi armazenada neste dispositivo e na sua Conta do Google. Qual você quer excluir?</translation> <translation id="665061930738760572">Abrir em &nova janela</translation> <translation id="6651237644330755633">Confiar neste certificado para a identificação de websites.</translation> +<translation id="6651495917527016072">Sincronizar redes Wi-Fi com seu smartphone. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="665355505818177700">A integração de <ph name="MS_AD_NAME" /> ao Chrome só é compatível com plataformas x86_64. Chromebooks criados com ARM ou plataformas x86 não são compatíveis com essa funcionalidade.</translation> <translation id="6654509035557065241">Preferir esta rede</translation> <translation id="6655190889273724601">Modo do desenvolvedor</translation> @@ -5404,6 +5413,7 @@ <translation id="7375235221357833624">{0,plural, =1{Atualize o dispositivo em uma hora}one{Atualize o dispositivo em # hora}other{Atualize o dispositivo em # horas}}</translation> <translation id="7376553024552204454">Destacar o cursor do mouse quando ele estiver se movendo</translation> <translation id="7377451353532943397">Continuar bloqueando o acesso ao sensor</translation> +<translation id="7378611153938412599">Senhas fracas são fáceis de adivinhar. Crie senhas fortes. <ph name="BEGIN_LINK" />Veja mais dicas de segurança<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Abrir a Chrome Web Store</translation> <translation id="7378812711085314936">Usar conexão de dados</translation> <translation id="7380622428988553498">O nome do dispositivo contém caracteres inválidos</translation> @@ -5928,6 +5938,7 @@ <translation id="7959074893852789871">O arquivo continha vários certificados e alguns deles não foram importados:</translation> <translation id="7961015016161918242">Nunca</translation> <translation id="7963001036288347286">Aceleração do touchpad</translation> +<translation id="7963608432878156675">Este nome fica visível para outros dispositivos em conexões de rede e Bluetooth</translation> <translation id="7963826112438303517">O Assistente usa essas gravações e as solicitações por voz para criar e atualizar seu modelo de voz, que é armazenado apenas em dispositivos com o Voice Match ativado. Veja ou altere as atividades de voz nas configurações do Assistente.</translation> <translation id="7966241909927244760">C&opiar endereço da imagem</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 item na lista de favoritos}one{{COUNT} item na lista de favoritos}other{{COUNT} itens na lista de favoritos}}</translation> @@ -6392,6 +6403,7 @@ <translation id="850875081535031620">Nenhum software perigoso encontrado</translation> <translation id="8509177919508253835">Redefinir chaves de segurança e criar PINs</translation> <translation id="8509646642152301857">Falha no download do dicionário de correção ortográfica.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Nenhuma senha fraca encontrada}=1{{COUNT} senha fraca encontrada}one{{COUNT} senha fraca encontrada}other{{COUNT} senhas fracas encontradas}}</translation> <translation id="8512476990829870887">Encerrar processo</translation> <translation id="851263357009351303">Sempre permitir que <ph name="HOST" /> mostre imagens</translation> <translation id="8513108775083588393">Girar automat.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index aa791c7..9e742a1 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Marcar como lido</translation> <translation id="6349101878882523185">Instale a aplicação <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">A sincronização não está a funcionar. Experimente terminar e iniciar sessão novamente.</translation> -<translation id="6351063337294363751">Pode limpar os dados de navegação a partir deste menu</translation> <translation id="6354918092619878358">SECG de curva elíptica secp256r1 (também denominada ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Manter o dispositivo ativado</translation> <translation id="63566973648609420">Apenas alguém que conheça a sua frase de acesso pode ler os seus dados encriptados. A frase de acesso não é enviada para a Google nem armazenada pela mesma. Se se esquecer da frase de acesso ou pretender alterar esta definição, tem de <ph name="BEGIN_LINK" />repor a sincronização<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 7b120bb5..39a97de 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Marchează ca citit</translation> <translation id="6349101878882523185">Instalează <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sincronizarea nu funcționează. Deconectează-te și conectează-te din nou.</translation> -<translation id="6351063337294363751">Poți șterge datele de navigare din acest meniu</translation> <translation id="6354918092619878358">Curbură eliptică SECG secp256r1 (cunoscută și sub numele de ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Păstrează dispozitivul activat</translation> <translation id="63566973648609420">Numai un utilizator care are expresia de acces poate citi datele criptate. Expresia de acces nu este trimisă sau stocată la Google. Dacă uiți expresia de acces sau dorești să modifici această setare, va fi necesar să <ph name="BEGIN_LINK" />resetezi sincronizarea<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index f26841b..317431f 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -4560,7 +4560,6 @@ <translation id="6345878117466430440">Отметить как прочитанное</translation> <translation id="6349101878882523185">Установить приложение "<ph name="APP_NAME" />"</translation> <translation id="6349170655202535379">Ошибка синхронизации. Выйдите из аккаунта и войдите ещё раз.</translation> -<translation id="6351063337294363751">В этом меню можно удалить данные о работе в браузере</translation> <translation id="6354918092619878358">Эллиптическая кривая SECG secp256r1 (она же ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Не выключайте устройство.</translation> <translation id="63566973648609420">Ваши зашифрованные данные может прочитать только тот, кто знает кодовую фразу. Она не пересылается и не хранится в Google. Если вы забудете фразу или решите изменить эту настройку, вам придется <ph name="BEGIN_LINK" />сбросить параметры синхронизации<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 3e2577b..8dde7f93 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">කියවූ ලෙස ලකුණු කරන්න</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ස්ථාපන කරන්න</translation> <translation id="6349170655202535379">සමමුහුර්ත කිරීම ක්රියා නොකරයි. වරා නැවත පැමිණීම උත්සාහ කරන්න.</translation> -<translation id="6351063337294363751">ඔබට මෙම මෙනුවෙන් ඔබගේ බ්රවුස් කිරීමේ දත්ත හිස් කළ හැකිය</translation> <translation id="6354918092619878358">SECG ඉලිප්සාකාර වක්ර secp256r1 (එනම් ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">උපාංගය සක්රීයව තබන්න</translation> <translation id="63566973648609420">සංකේතනය කළ දත්ත කියවිය හැක්කේ ඔබේ මුරවැකිකඩ සහිත අයකුට පමණි. මෙම මුරවැකිකඩ Google වෙත යැවීම හෝ ගබඩා කර ගැනීම නොකෙරේ. ඔබට ඔබේ මුරවැකිකඩ අමතක නම් හෝ මෙම සැකසීම් වෙනස් කිරීමට අවශ්ය නම්, ඔබ <ph name="BEGIN_LINK" />සමමුහුර්ත කිරීම යළි සැකසීම<ph name="END_LINK" /> අවශ්ය වනු ඇත.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index c5298181..65a211f 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Vytvoriť odkaz</translation> <translation id="2050339315714019657">Na výšku</translation> <translation id="2053312383184521053">Údaje stavu nečinnosti</translation> +<translation id="2054665754582400095">Vaša prítomnosť</translation> <translation id="2055585478631012616">Systém vás odhlási z týchto webov (aj v otvorených kartách)</translation> <translation id="205560151218727633">Logo asistenta Google</translation> <translation id="2058456167109518507">Bolo rozpoznané zariadenie</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">Prechod na domovskú obrazovku</translation> <translation id="2387458720915042159">Typ pripojenia proxy</translation> <translation id="2390347491606624519">K proxy serveru sa nedá pripojiť, prihláste sa znova</translation> +<translation id="2390782873446084770">Synchronizácia Wi-Fi</translation> <translation id="2391082728065870591">Odoslať správu so spätnou väzbou</translation> <translation id="2391419135980381625">Štandardné písmo</translation> <translation id="2392163307141705938">Dosiahli ste časový limit, ktorý váš rodič nastavil pre <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1869,6 +1871,7 @@ <translation id="3157931365184549694">Obnoviť</translation> <translation id="3158033540161634471">Nastavenie odtlačku prsta</translation> <translation id="3159493096109238499">Béžová</translation> +<translation id="3159978855457658359">Úprava názvu zariadenia</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (chránené hardvérom)</translation> <translation id="3161522574479303604">Všetky jazyky</translation> <translation id="3162853326462195145">Školský účet</translation> @@ -3229,6 +3232,7 @@ <translation id="4761104368405085019">Používať váš mikrofón</translation> <translation id="4762718786438001384">Kritický nedostatok miesta na disku zariadenia</translation> <translation id="4763408175235639573">Počas zobrazenia tejto stránky boli nastavené nasledujúce súbory cookie</translation> +<translation id="4764368918650455114">Obe zariadenia musia byť odomknuté, blízko seba a mať zapnuté rozhranie Bluetooth. Ak zdieľate s Chromebookom, uistite sa, či má zapnuté zdieľanie nablízku (otvorte stavovú oblasť výberom času a potom vyberte Zdieľanie nablízku). <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Umožňuje Správam pre Android prenášať textové správy z vášho telefónu do Chromebooku</translation> <translation id="476598255842811483">Nikto, kým v zariadení neotvoríte zdieľanie nablízku</translation> <translation id="4768332406694066911">Máte certifikáty z týchto organizácií, ktoré vás identifikujú</translation> @@ -3391,6 +3395,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Túto aplikáciu nainštaloval váš správca.</translation> <translation id="4964455510556214366">Usporiadanie</translation> +<translation id="496446150016900060">Synchronizujte siete Wi‑Fi so svojím telefónom</translation> <translation id="4965808351167763748">Naozaj chcete v tomto zariadení nastaviť službu Hangouts Meet?</translation> <translation id="496888482094675990">Aplikácia Súbory poskytuje rýchly prístup k súborom, ktoré ste uložili na Disk Google, do externého úložiska alebo do zariadenia so systémom OS Chrome.</translation> <translation id="4971412780836297815">Otvoriť po stiahnutí</translation> @@ -3697,6 +3702,7 @@ <translation id="5341980496415249280">Čakajte, prebieha balenie…</translation> <translation id="5342091991439452114">Minimálny počet číslic kódu PIN: <ph name="MINIMUM" /></translation> <translation id="5344036115151554031">Obnovuje sa Linux</translation> +<translation id="5345916423802287046">Spustiť aplikáciu pri prihlásení</translation> <translation id="5350293332385664455">Vypnúť Asistenta Google</translation> <translation id="535123479159372765">Text bol skopírovaný z iného zariadenia</translation> <translation id="5352033265844765294">Časová pečiatka</translation> @@ -4006,6 +4012,7 @@ <translation id="5704875434923668958">Synchronizácia do účtu</translation> <translation id="5705005699929844214">Vždy zobrazovať možnosti dostupnosti</translation> <translation id="5705882733397021510">Prejsť späť</translation> +<translation id="5707117624115653804">Prispôsobte veľkosť a štýl titulkov pre aplikácie a weby, ktoré toto nastavenie podporujú</translation> <translation id="5707185214361380026">Nepodarilo sa načítať rozšírenie zo zdroja</translation> <translation id="5708171344853220004">Hlavný názov Microsoft</translation> <translation id="5709557627224531708">Nastavte Chrome ako predvolený prehliadač</translation> @@ -4169,6 +4176,7 @@ <translation id="5904614460720589786"><ph name="APP_NAME" /> sa nepodarilo nastaviť pre problém s konfiguráciou. Kontaktujte správcu. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Aktualizácia je takmer hotová! Dokončite ju reštartovaním zariadenia.</translation> <translation id="5906732635754427568">Dáta priradené k danej aplikácii budú odstránené z tohto zariadenia.</translation> +<translation id="5908474332780919512">Spustiť aplikáciu pri prihlásení</translation> <translation id="5908695239556627796">Rýchlosť posúvania myšou</translation> <translation id="5908769186679515905">Zakázať webom spúšťať Flash</translation> <translation id="5910363049092958439">Uložiť &obrázok ako...</translation> @@ -4561,7 +4569,6 @@ <translation id="6345878117466430440">Označiť ako prečítané</translation> <translation id="6349101878882523185">Inštalovať aplikáciu <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Synchronizácia nefunguje. Skúste sa odhlásiť a znovu prihlásiť.</translation> -<translation id="6351063337294363751">Dáta prehliadania môžete vymazať v tejto ponuke</translation> <translation id="6354918092619878358">Eliptická krivka SECG secp256r1 (známa tiež ako ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Ponechajte zariadenie zapnuté</translation> <translation id="63566973648609420">Šifrované údaje môže čítať iba používateľ s prístupovou frázou. Prístupová fráza sa do Googlu neodosiela a Google ju ani neukladá. Ak zabudnete prístupovú frázu alebo budete chcieť zmeniť toto nastavenie zmeniť, musíte <ph name="BEGIN_LINK" />resetovať synchronizáciu<ph name="END_LINK" />.</translation> @@ -4709,6 +4716,7 @@ <translation id="6532527800157340614">Prihlásenie zlyhalo, pretože sa nepodarilo načítať prístupový token. Skontrolujte pripojenie k sieti a skúste to znova.</translation> <translation id="6532663472409656417">Zaregistrované v rámci podniku</translation> <translation id="6535331821390304775">Vždy povoliť zdroju <ph name="ORIGIN" /> otvárať odkazy tohto typu v pridruženej aplikácii</translation> +<translation id="6537613839935722475">Názov môže obsahovať písmená, čísla a spojovníky (-)</translation> <translation id="6538635548667167211">Aktuálne nastavenie spotreby dát: dáta</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Poznámka:<ph name="END_BOLD" /> Túto možnosť povoľte iba v prípade, ak viete, čo robíte, alebo ak vás o to niekto požiadal, pretože zhromažďovanie údajov môže znížiť výkonnosť.</translation> <translation id="6541638731489116978">Tomuto webu bol zablokovaný prístup k senzorom pohybu.</translation> @@ -4797,6 +4805,7 @@ <translation id="6650234781371031356">Heslo pre web <ph name="WEBSITE" /> máte uložené v tomto zariadení aj účte Google. Ktoré chcete odstrániť?</translation> <translation id="665061930738760572">Otvoriť v &novom okne</translation> <translation id="6651237644330755633">Dôverovať tomuto certifikátu na identifikáciu webových stránok</translation> +<translation id="6651495917527016072">Synchronizujte siete Wi‑Fi so svojím telefónom. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="665355505818177700">Integrácia <ph name="MS_AD_NAME" /> pre Chrome je podporovaná iba v platformách x86_64. Chromebooky zostavené na základe platformy ARM alebo x86 túto funkciu nepodporujú.</translation> <translation id="6654509035557065241">Preferovať sieť</translation> <translation id="6655190889273724601">Režim pre vývojárov</translation> @@ -5400,6 +5409,7 @@ <translation id="7375235221357833624">{0,plural, =1{Aktualizujte zariadenie do hodiny}few{Aktualizujte zariadenie do # hodín}many{Aktualizujte zariadenie do # hodiny}other{Aktualizujte zariadenie do # hodín}}</translation> <translation id="7376553024552204454">Zvýrazňovať kurzor myši, keď sa hýbe</translation> <translation id="7377451353532943397">Naďalej blokovať prístup k senzorom</translation> +<translation id="7378611153938412599">Slabé heslá sa dajú ľahko uhádnuť. Vždy sa snažte vytvárať silné heslá. <ph name="BEGIN_LINK" />Ďalšie tipy na zabezpečenie<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvoriť Internetový obchod Chrome</translation> <translation id="7378812711085314936">Získať dátové pripojenie</translation> <translation id="7380622428988553498">Názov zariadenia obsahuje neplatné znaky</translation> @@ -5924,6 +5934,7 @@ <translation id="7959074893852789871">Súbor obsahoval viacero certifikátov a niektoré z nich neboli importované:</translation> <translation id="7961015016161918242">Nikdy</translation> <translation id="7963001036288347286">Zrýchlenie touchpadu</translation> +<translation id="7963608432878156675">Tento názov sa zobrazuje ostatným zariadeniam v rámci pripojenia cez Bluetooth alebo sieť</translation> <translation id="7963826112438303517">Asistent pomocou týchto záznamov a vyslovených žiadostí vytvorí a aktualizuje váš hlasový model, ktorý je uložený iba v zariadeniach s aktivovanou funkciou Voice Match. Hlasovú aktivitu zobrazíte alebo zmeníte v nastaveniach Asistenta.</translation> <translation id="7966241909927244760">K&opírovať adresu obrázka</translation> <translation id="7966571622054096916">{COUNT,plural, =1{V zozname záložiek je 1 položka}few{V zozname záložiek sú {COUNT} položky}many{{COUNT} items in bookmark list}other{V zozname záložiek je {COUNT} položiek}}</translation> @@ -6387,6 +6398,7 @@ <translation id="850875081535031620">Nenašiel sa žiadny škodlivý softvér</translation> <translation id="8509177919508253835">Resetovanie bezpečnostných kľúčov a vytváranie kódov PIN</translation> <translation id="8509646642152301857">Sťahovanie slovníka na kontrolu pravopisu zlyhalo.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Nenašli sa žiadne slabé heslá}=1{Našlo sa {COUNT} slabé heslo}few{Našli sa {COUNT} slabé heslá}many{Found {COUNT} weak passwords}other{Našlo sa {COUNT} slabých hesiel}}</translation> <translation id="8512476990829870887">Ukončiť proces</translation> <translation id="851263357009351303">Vždy povoliť stránkam <ph name="HOST" /> zobrazovať obrázky</translation> <translation id="8513108775083588393">Aut. otáčanie</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 9a79d06..e3ec167a 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -4564,7 +4564,6 @@ <translation id="6345878117466430440">Označi kot prebrano</translation> <translation id="6349101878882523185">Namestite <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinhronizacija ne deluje. Poskusite se odjaviti in znova prijaviti.</translation> -<translation id="6351063337294363751">Podatke o brskanju lahko izbrišete v tem meniju</translation> <translation id="6354918092619878358">Eliptična krivulja SECG secp256r1 (oziroma ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Naprava naj ostane vklopljena</translation> <translation id="63566973648609420">Vaše šifrirane podatke lahko bere samo oseba z vašim geslom. Geslo ni poslano Googlu in ni shranjeno v Googlu. Če ga pozabite ali če želite spremeniti to nastavitev, boste morali <ph name="BEGIN_LINK" />sinhronizacijo ponastaviti<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 9f4b2eb..617eee22 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -4559,7 +4559,6 @@ <translation id="6345878117466430440">Shëno si të lexuar</translation> <translation id="6349101878882523185">Instalo <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinkronizimi nuk funksionoi. Provo të dalësh dhe të identifikohesh sërish.</translation> -<translation id="6351063337294363751">Mund t'i pastrosh të dhënat e shfletimit nga kjo meny</translation> <translation id="6354918092619878358">Kurba eliptike SECG secp256r1 (e njohur edhe si ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Mbaje pajisjen të aktivizuar</translation> <translation id="63566973648609420">Vetëm dikush me frazën tënde të kalimit mund të lexojë të dhënat e tua të koduara. Kjo frazë kalimi nuk dërgohet te Google dhe as nuk ruhet nga ai. Nëse e harron frazën tënde të kalimit apo dëshiron të ndryshosh këtë cilësim, duhet që të <ph name="BEGIN_LINK" />rivendosësh sinkronizimin<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 164c809c..6e21a962 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -925,6 +925,7 @@ <translation id="204914487372604757">Napravi prečicu</translation> <translation id="2050339315714019657">Vertikalno</translation> <translation id="2053312383184521053">Podaci o stanju mirovanja</translation> +<translation id="2054665754582400095">Prisustvo</translation> <translation id="2055585478631012616">Odjavićete se sa ovih sajtova, uključujući i one na otvorenim karticama</translation> <translation id="205560151218727633">Logotip Google pomoćnika</translation> <translation id="2058456167109518507">Otkriven je uređaj</translation> @@ -1211,6 +1212,7 @@ <translation id="2387052489799050037">Idite na početni ekran</translation> <translation id="2387458720915042159">Tip veze sa proksijem</translation> <translation id="2390347491606624519">Nije moguće povezati se sa proksijem. Prijavite se ponovo</translation> +<translation id="2390782873446084770">Wi-Fi sinhronizacija</translation> <translation id="2391082728065870591">Pošalji izveštaj sa povratnim informacijama</translation> <translation id="2391419135980381625">Standardni font</translation> <translation id="2392163307141705938">Dostigao/la si vremensko ograničenje koje je roditelj podesio za <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1867,6 +1869,7 @@ <translation id="3157931365184549694">Ponovo otvori</translation> <translation id="3158033540161634471">Podesite otisak prsta</translation> <translation id="3159493096109238499">Bež</translation> +<translation id="3159978855457658359">Izmenite naziv uređaja</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardver je sertifikovan)</translation> <translation id="3161522574479303604">Svi jezici</translation> <translation id="3162853326462195145">Školski nalog</translation> @@ -3227,6 +3230,7 @@ <translation id="4761104368405085019">Korišćenje mikrofona</translation> <translation id="4762718786438001384">Prostor na disku uređaja je zabrinjavajuće mali</translation> <translation id="4763408175235639573">Sledeći kolačići su postavljeni dok ste gledali ovu stranicu</translation> +<translation id="4764368918650455114">Uverite se da su oba uređaja otključana, blizu jedan drugom i da je uključen Bluetooth. Ako delite sa Chromebook-om, uverite se da mu je uključeno Deljenje u blizini (otvorite oblast statusa tako što ćete izabrati vreme, pa izaberite Deljenje u blizini). <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Dozvoljava da Android Messages prenosi SMS-ove sa telefona na Chromebook</translation> <translation id="476598255842811483">Niko ako ne otvorite Deljenje u blizini na svom uređaju</translation> <translation id="4768332406694066911">Imate sertifikate sledećih organizacija koji vas identifikuju</translation> @@ -3389,6 +3393,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Administrator je instalirao ovu aplikaciju.</translation> <translation id="4964455510556214366">Raspored</translation> +<translation id="496446150016900060">Sinhronizujte Wi-Fi mreže pomoću telefona</translation> <translation id="4965808351167763748">Želite li stvarno da podesite ovaj uređaj za korišćenje Hangouts Meet-a?</translation> <translation id="496888482094675990">Aplikacija Datoteke pruža brz pristup datotekama koje ste sačuvali na Google disku, u spoljnoj memoriji ili na Chrome OS uređaju.</translation> <translation id="4971412780836297815">Otvori kada bude dovršeno</translation> @@ -3695,6 +3700,7 @@ <translation id="5341980496415249280">Sačekajte, pakuje se...</translation> <translation id="5342091991439452114">PIN mora da ima najmanje <ph name="MINIMUM" /> cifre(ara)</translation> <translation id="5344036115151554031">Vraća se Linux</translation> +<translation id="5345916423802287046">Pokreni aplikaciju kada se prijavim</translation> <translation id="5350293332385664455">Isključite Google pomoćnik</translation> <translation id="535123479159372765">Tekst je kopiran sa nekog drugog uređaja</translation> <translation id="5352033265844765294">Označavanje vremena</translation> @@ -4005,6 +4011,7 @@ <translation id="5704875434923668958">Sinhronizuje se sa</translation> <translation id="5705005699929844214">Uvek prikazuj opcije pristupačnosti</translation> <translation id="5705882733397021510">Nazad</translation> +<translation id="5707117624115653804">Prilagodite veličinu i stil titla za aplikacije i sajtove koji podržavaju ovo podešavanje</translation> <translation id="5707185214361380026">Nije uspelo učitavanje dodatka iz:</translation> <translation id="5708171344853220004">Microsoft glavno ime</translation> <translation id="5709557627224531708">Podesite Chrome kao podrazumevani pregledač</translation> @@ -4168,6 +4175,7 @@ <translation id="5904614460720589786">Podešavanje aplikacije <ph name="APP_NAME" /> nije uspelo zbog problema sa konfiguracijom. Obratite se administratoru. Kôd greške: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Ažuriranje je skoro gotovo! Ponovo pokrenite uređaj da biste dovršili ažuriranje.</translation> <translation id="5906732635754427568">Podaci povezani sa ovom aplikacijom će biti uklonjeni sa ovog uređaja.</translation> +<translation id="5908474332780919512">Pokreni aplikaciju kada se prijavim</translation> <translation id="5908695239556627796">Brzina pomeranja mišem</translation> <translation id="5908769186679515905">Blokiraj sajtove da ne bi pokretali Flash</translation> <translation id="5910363049092958439">Sa&čuvaj sliku kao...</translation> @@ -4560,7 +4568,6 @@ <translation id="6345878117466430440">Označi kao pročitano</translation> <translation id="6349101878882523185">Instalirajte <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Sinhronizacija ne funkcioniše. Probajte da se odjavite i ponovo prijavite.</translation> -<translation id="6351063337294363751">Iz ovog menija možete da obrišete podatke pregledanja</translation> <translation id="6354918092619878358">Eliptična kriva SECG secp256r1 (takođe poznata kao ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Ne isključujte uređaj</translation> <translation id="63566973648609420">Samo neko ko ima pristupnu frazu može da čita šifrovane podatke. Google ne šalje niti čuva pristupnu frazu. Ako zaboravite pristupnu frazu ili želite da promenite ovo podešavanje, moraćete da <ph name="BEGIN_LINK" />resetujete sinhronizaciju<ph name="END_LINK" />.</translation> @@ -4708,6 +4715,7 @@ <translation id="6532527800157340614">Prijavljivanje nije uspelo jer nije preuzeta oznaka pristupa. Proverite mrežnu vezu i probajte ponovo.</translation> <translation id="6532663472409656417">Registrovano za preduzeće</translation> <translation id="6535331821390304775">Uvek dozvoli da <ph name="ORIGIN" /> otvara ovaj tip linkova u povezanoj aplikaciji</translation> +<translation id="6537613839935722475">Ime može da sadrži slova, brojeve i crtice (-)</translation> <translation id="6538635548667167211">Aktuelno podešavanje potrošnje podataka je „Podaci“</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> @@ -4796,6 +4804,7 @@ <translation id="6650234781371031356">Lozinka za <ph name="WEBSITE" /> se čuva na ovom uređaju i na vašem Google nalogu. Gde želite da je izbrišete?</translation> <translation id="665061930738760572">Otvori u &novom prozoru</translation> <translation id="6651237644330755633">Veruj ovom sertifikatu za identifikaciju veb-sajtova</translation> +<translation id="6651495917527016072">Sinhronizujte Wi-Fi mreže pomoću telefona. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" /> integracija je podržana samo na x86_64 platformama. Chromebook-ovi napravljeni na ARM ili x86 platformi ne podržavaju ovu funkciju.</translation> <translation id="6654509035557065241">Podesi kao prioritetnu mrežu</translation> <translation id="6655190889273724601">Režim programera</translation> @@ -5399,6 +5408,7 @@ <translation id="7375235221357833624">{0,plural, =1{Ažurirajte uređaj u roku od jednog sata}one{Ažurirajte uređaj u roku od # sata}few{Ažurirajte uređaj u roku od # sata}other{Ažurirajte uređaj u roku od # sati}}</translation> <translation id="7376553024552204454">Ističi kursor miša dok se kreće</translation> <translation id="7377451353532943397">Nastavi da blokiraš pristup senzorima</translation> +<translation id="7378611153938412599">Slabe lozinke lako mogu da se pogode. Obavezno napravite jake lozinke. <ph name="BEGIN_LINK" />Pogledajte još saveta za bezbednost.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Otvorite Chrome veb-prodavnicu</translation> <translation id="7378812711085314936">Korišćenje veze za prenos podataka</translation> <translation id="7380622428988553498">Ime uređaja sadrži nevažeće znakove</translation> @@ -5923,6 +5933,7 @@ <translation id="7959074893852789871">Datoteka sadrži više sertifikata, od kojih neki nisu uvezeni:</translation> <translation id="7961015016161918242">Nikad</translation> <translation id="7963001036288347286">Ubrzavanje tačpeda</translation> +<translation id="7963608432878156675">Ovo ime je vidljivo drugim uređajima za Bluetooth i mrežne veze</translation> <translation id="7963826112438303517">Pomoćnik koristi te snimke i glasovne zahteve da bi napravio i ažurirao glasovni model, koji se čuva samo na onim uređajima na kojima ste uključili Voice Match. Izbrišite ili ponovo uvežbajte glasovne aktivnosti u podešavanjima Pomoćnika.</translation> <translation id="7966241909927244760">K&opiraj adresu slike</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 stavka na listi obeleživača}one{{COUNT} stavka na listi obeleživača}few{{COUNT} stavke na listi obeleživača}other{{COUNT} stavki na listi obeleživača}}</translation> @@ -6387,6 +6398,7 @@ <translation id="850875081535031620">Nije pronađen nikakav štetan softver</translation> <translation id="8509177919508253835">Resetujte bezbednosne ključeve i napravite PIN-ove</translation> <translation id="8509646642152301857">Preuzimanje rečnika za proveru pravopisa nije uspelo.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Nije pronađena nijedna slaba lozinka}=1{Pronađena je {COUNT} slaba lozinka}one{Pronađena je {COUNT} slaba lozinka}few{Pronađene su {COUNT} slabe lozinke}other{Pronađeno je {COUNT} slabih lozinki}}</translation> <translation id="8512476990829870887">Završi proces</translation> <translation id="851263357009351303">Uvek dozvoli sajtu <ph name="HOST" /> da prikazuje slike</translation> <translation id="8513108775083588393">Autom. rotir.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 0bd6fef..0461682 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -925,6 +925,7 @@ <translation id="204914487372604757">Направи пречицу</translation> <translation id="2050339315714019657">Вертикално</translation> <translation id="2053312383184521053">Подаци о стању мировања</translation> +<translation id="2054665754582400095">Присуство</translation> <translation id="2055585478631012616">Одјавићете се са ових сајтова, укључујући и оне на отвореним картицама</translation> <translation id="205560151218727633">Логотип Google помоћника</translation> <translation id="2058456167109518507">Откривен је уређај</translation> @@ -1211,6 +1212,7 @@ <translation id="2387052489799050037">Идите на почетни екран</translation> <translation id="2387458720915042159">Тип везе са проксијем</translation> <translation id="2390347491606624519">Није могуће повезати се са проксијем. Пријавите се поново</translation> +<translation id="2390782873446084770">Wi-Fi синхронизација</translation> <translation id="2391082728065870591">Пошаљи извештај са повратним информацијама</translation> <translation id="2391419135980381625">Стандардни фонт</translation> <translation id="2392163307141705938">Достигао/ла си временско ограничење које је родитељ подесио за <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1867,6 +1869,7 @@ <translation id="3157931365184549694">Поново отвори</translation> <translation id="3158033540161634471">Подесите отисак прста</translation> <translation id="3159493096109238499">Беж</translation> +<translation id="3159978855457658359">Измените назив уређаја</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (хардвер је сертификован)</translation> <translation id="3161522574479303604">Сви језици</translation> <translation id="3162853326462195145">Школски налог</translation> @@ -3227,6 +3230,7 @@ <translation id="4761104368405085019">Коришћење микрофона</translation> <translation id="4762718786438001384">Простор на диску уређаја је забрињавајуће мали</translation> <translation id="4763408175235639573">Следећи колачићи су постављени док сте гледали ову страницу</translation> +<translation id="4764368918650455114">Уверите се да су оба уређаја откључана, близу један другом и да је укључен Bluetooth. Ако делите са Chromebook-ом, уверите се да му је укључено Дељење у близини (отворите област статуса тако што ћете изабрати време, па изаберите Дељење у близини). <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Дозвољава да Android Messages преноси SMS-ове са телефона на Chromebook</translation> <translation id="476598255842811483">Нико ако не отворите Дељење у близини на свом уређају</translation> <translation id="4768332406694066911">Имате сертификате следећих организација који вас идентификују</translation> @@ -3389,6 +3393,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Администратор је инсталирао ову апликацију.</translation> <translation id="4964455510556214366">Распоред</translation> +<translation id="496446150016900060">Синхронизујте Wi-Fi мреже помоћу телефона</translation> <translation id="4965808351167763748">Желите ли стварно да подесите овај уређај за коришћење Hangouts Meet-а?</translation> <translation id="496888482094675990">Апликација Датотеке пружа брз приступ датотекама које сте сачували на Google диску, у спољној меморији или на Chrome ОС уређају.</translation> <translation id="4971412780836297815">Отвори када буде довршено</translation> @@ -3695,6 +3700,7 @@ <translation id="5341980496415249280">Сачекајте, пакује се...</translation> <translation id="5342091991439452114">PIN мора да има најмање <ph name="MINIMUM" /> цифре(ара)</translation> <translation id="5344036115151554031">Враћа се Linux</translation> +<translation id="5345916423802287046">Покрени апликацију када се пријавим</translation> <translation id="5350293332385664455">Искључите Google помоћник</translation> <translation id="535123479159372765">Текст је копиран са неког другог уређаја</translation> <translation id="5352033265844765294">Означавање времена</translation> @@ -4005,6 +4011,7 @@ <translation id="5704875434923668958">Синхронизује се са</translation> <translation id="5705005699929844214">Увек приказуј опције приступачности</translation> <translation id="5705882733397021510">Назад</translation> +<translation id="5707117624115653804">Прилагодите величину и стил титла за апликације и сајтове који подржавају ово подешавање</translation> <translation id="5707185214361380026">Није успело учитавање додатка из:</translation> <translation id="5708171344853220004">Microsoft главно име</translation> <translation id="5709557627224531708">Подесите Chrome као подразумевани прегледач</translation> @@ -4168,6 +4175,7 @@ <translation id="5904614460720589786">Подешавање апликације <ph name="APP_NAME" /> није успело због проблема са конфигурацијом. Обратите се администратору. Кôд грешке: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Ажурирање је скоро готово! Поново покрените уређај да бисте довршили ажурирање.</translation> <translation id="5906732635754427568">Подаци повезани са овом апликацијом ће бити уклоњени са овог уређаја.</translation> +<translation id="5908474332780919512">Покрени апликацију када се пријавим</translation> <translation id="5908695239556627796">Брзина померања мишем</translation> <translation id="5908769186679515905">Блокирај сајтове да не би покретали Flash</translation> <translation id="5910363049092958439">Са&чувај слику као...</translation> @@ -4560,7 +4568,6 @@ <translation id="6345878117466430440">Означи као прочитано</translation> <translation id="6349101878882523185">Инсталирајте <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Синхронизација не функционише. Пробајте да се одјавите и поново пријавите.</translation> -<translation id="6351063337294363751">Из овог менија можете да обришете податке прегледања</translation> <translation id="6354918092619878358">Елиптична крива SECG secp256r1 (такође позната као ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Не искључујте уређај</translation> <translation id="63566973648609420">Само неко ко има приступну фразу може да чита шифроване податке. Google не шаље нити чува приступну фразу. Ако заборавите приступну фразу или желите да промените ово подешавање, мораћете да <ph name="BEGIN_LINK" />ресетујете синхронизацију<ph name="END_LINK" />.</translation> @@ -4708,6 +4715,7 @@ <translation id="6532527800157340614">Пријављивање није успело јер није преузета ознака приступа. Проверите мрежну везу и пробајте поново.</translation> <translation id="6532663472409656417">Регистровано за предузеће</translation> <translation id="6535331821390304775">Увек дозволи да <ph name="ORIGIN" /> отвара овај тип линкова у повезаној апликацији</translation> +<translation id="6537613839935722475">Име може да садржи слова, бројеве и цртице (-)</translation> <translation id="6538635548667167211">Актуелно подешавање потрошње података је „Подаци“</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Напомена:<ph name="END_BOLD" /> Омогућите ово само ако знате шта радите или ако је то неко затражио од вас јер прикупљање података може да погорша учинак.</translation> <translation id="6541638731489116978">Овом сајту је забрањено да приступа сензорима за покрет.</translation> @@ -4796,6 +4804,7 @@ <translation id="6650234781371031356">Лозинка за <ph name="WEBSITE" /> се чува на овом уређају и на вашем Google налогу. Где желите да је избришете?</translation> <translation id="665061930738760572">Отвори у &новом прозору</translation> <translation id="6651237644330755633">Веруј овом сертификату за идентификацију веб-сајтова</translation> +<translation id="6651495917527016072">Синхронизујте Wi-Fi мреже помоћу телефона. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" /> интеграција је подржана само на x86_64 платформама. Chromebook-ови направљени на ARM или x86 платформи не подржавају ову функцију.</translation> <translation id="6654509035557065241">Подеси као приоритетну мрежу</translation> <translation id="6655190889273724601">Режим програмера</translation> @@ -5399,6 +5408,7 @@ <translation id="7375235221357833624">{0,plural, =1{Ажурирајте уређај у року од једног сата}one{Ажурирајте уређај у року од # сата}few{Ажурирајте уређај у року од # сата}other{Ажурирајте уређај у року од # сати}}</translation> <translation id="7376553024552204454">Истичи курсор миша док се креће</translation> <translation id="7377451353532943397">Настави да блокираш приступ сензорима</translation> +<translation id="7378611153938412599">Слабе лозинке лако могу да се погоде. Обавезно направите јаке лозинке. <ph name="BEGIN_LINK" />Погледајте још савета за безбедност.<ph name="END_LINK" /></translation> <translation id="73786666777299047">Отворите Chrome веб-продавницу</translation> <translation id="7378812711085314936">Коришћење везе за пренос података</translation> <translation id="7380622428988553498">Име уређаја садржи неважеће знакове</translation> @@ -5923,6 +5933,7 @@ <translation id="7959074893852789871">Датотека садржи више сертификата, од којих неки нису увезени:</translation> <translation id="7961015016161918242">Никад</translation> <translation id="7963001036288347286">Убрзавање тачпеда</translation> +<translation id="7963608432878156675">Ово име је видљиво другим уређајима за Bluetooth и мрежне везе</translation> <translation id="7963826112438303517">Помоћник користи те снимке и гласовне захтеве да би направио и ажурирао гласовни модел, који се чува само на оним уређајима на којима сте укључили Voice Match. Избришите или поново увежбајте гласовне активности у подешавањима Помоћника.</translation> <translation id="7966241909927244760">К&опирај адресу слике</translation> <translation id="7966571622054096916">{COUNT,plural, =1{1 ставка на листи обележивача}one{{COUNT} ставка на листи обележивача}few{{COUNT} ставке на листи обележивача}other{{COUNT} ставки на листи обележивача}}</translation> @@ -6387,6 +6398,7 @@ <translation id="850875081535031620">Није пронађен никакав штетан софтвер</translation> <translation id="8509177919508253835">Ресетујте безбедносне кључеве и направите PIN-ове</translation> <translation id="8509646642152301857">Преузимање речника за проверу правописа није успело.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Није пронађена ниједна слаба лозинка}=1{Пронађена је {COUNT} слаба лозинка}one{Пронађена је {COUNT} слаба лозинка}few{Пронађене су {COUNT} слабе лозинке}other{Пронађено је {COUNT} слабих лозинки}}</translation> <translation id="8512476990829870887">Заврши процес</translation> <translation id="851263357009351303">Увек дозволи сајту <ph name="HOST" /> да приказује слике</translation> <translation id="8513108775083588393">Аутом. ротир.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 1408750..621c6d3f 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Markera som läst</translation> <translation id="6349101878882523185">Installera <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Det går inte att synkronisera. Testa att logga ut och logga in igen.</translation> -<translation id="6351063337294363751">Du kan rensa webbinformation från den här menyn</translation> <translation id="6354918092619878358">SECG med elliptisk kurva secp256r1 (kallas även ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Stäng inte av enheten</translation> <translation id="63566973648609420">Endast personer som har ditt lösenord kan läsa dina krypterade uppgifter. Lösenordet skickas inte till och sparas inte av Google. Om du glömmer lösenordet måste du <ph name="BEGIN_LINK" />återställa synkroniseringen<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index debd93f7..cd943ac 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -4565,7 +4565,6 @@ <translation id="6345878117466430440">Tia alama kuwa umesoma</translation> <translation id="6349101878882523185">Sakinisha <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Kipengele cha usawazishaji hakifanyi kazi. Jaribu kuondoka na uingie tena katika akaunti.</translation> -<translation id="6351063337294363751">Unaweza kufuta data yako ya kuvinjari kwenye menyu hii</translation> <translation id="6354918092619878358">SECG kizingo cha mviringo secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Usizime kifaa</translation> <translation id="63566973648609420">Ni mtu mwenye kauli yako ya siri tu anaweza kusoma data yako iliyosimbwa kwa njia fiche. Kauli ya siri haitumwi au kuhifadhiwa na Google. Ukisahau kauli yako ya siri, au unataka kubadilisha mipangilio hii, utahitaji <ph name="BEGIN_LINK" />kuweka upya usawazishaji<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index be4b938..095f9841 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">படித்ததாகக் குறி</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ஆப்ஸை நிறுவுக</translation> <translation id="6349170655202535379">ஒத்திசைவு வேலை செய்யவில்லை. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation> -<translation id="6351063337294363751">உலாவிய தரவை இந்த மெனுவிலிருந்து அழிக்கலாம்</translation> <translation id="6354918092619878358">SECG நீள்வட்ட வளைவான secp256r1 (ANSI X9.62 prime256v1 எனவும் அறியப்படும், NIST P-256)</translation> <translation id="635609604405270300">சாதனத்தை இயக்கத்தில் வைத்திருக்கவும்</translation> <translation id="63566973648609420">உங்கள் கடவுச்சொற்றொடரை அறிந்தவரால் மட்டுமே என்கிரிப்ட் செய்யப்பட்ட உங்கள் தரவைப் படிக்க முடியும். கடவுச்சொற்றொடரானது Googleக்கு அனுப்பப்படுவதில்லை அல்லது Google அதைச் சேமிப்பதில்லை. கடவுச்சொற்றொடரை மறந்துவிட்டால் அல்லது இந்த அமைப்பை மாற்ற விரும்பினால், நீங்கள் <ph name="BEGIN_LINK" />ஒத்திசைவை மீட்டமைக்க வேண்டும்<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index d185447a..3cf4d01 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -4570,7 +4570,6 @@ <translation id="6345878117466430440">చదివినట్లుగా గుర్తించు</translation> <translation id="6349101878882523185"><ph name="APP_NAME" />ను ఇన్స్టాల్ చేయండి</translation> <translation id="6349170655202535379">సింక్ పని చేయడం లేదు. సైన్ అవుట్ చేసి, తిరిగి మళ్లీ సైన్ ఇన్ చేయండి.</translation> -<translation id="6351063337294363751">మీరు ఈ మెనూ నుండి మీ బ్రౌజింగ్ డేటాను తీసివేయవచ్చు</translation> <translation id="6354918092619878358">SECG దీర్ఘవృత్తాకార వక్రం secp256r1 (ANSI X9.62 prime256v1, NIST P-256గా కూడా పిలువబడతాయి)</translation> <translation id="635609604405270300">పరికరాన్ని ఆన్ చేసి ఉంచండి</translation> <translation id="63566973648609420">మీ రహస్య పదబంధాన్ని కలిగి ఉన్న వారు మాత్రమే మీ ఎన్క్రిప్ట్ చేసిన డేటాను చదవగలరు. రహస్య పదబంధం ఎవరికీ పంపబడదు లేదా Googleలో నిల్వ చేయబడదు. మీరు మీ రహస్య పదబంధాన్ని మర్చిపోతే లేదా ఈ సెట్టింగ్ను మార్చాలనుకుంటే, సింక్ను రీసెట్ చేయాల్సి ఉంటుంది. <ph name="BEGIN_LINK" />సింక్ను రీసెట్ చేయండి<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 44d3ea5..a074233 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -4570,7 +4570,6 @@ <translation id="6345878117466430440">ทำเครื่องหมายว่าอ่านแล้ว</translation> <translation id="6349101878882523185">ติดตั้ง <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">การซิงค์ไม่ทำงาน ลองออกจากระบบแล้วลงชื่อเข้าใช้อีกครั้ง</translation> -<translation id="6351063337294363751">คุณสามารถล้างข้อมูลการท่องเว็บจากเมนูนี้ได้</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (เรียกอีกอย่างว่า ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">โปรดเปิดอุปกรณ์ไว้</translation> <translation id="63566973648609420">เฉพาะผู้ที่มีรหัสผ่านของคุณเท่านั้นจึงจะสามารถอ่านข้อมูลที่เข้ารหัสของคุณได้ Google จะไม่ส่งหรือจัดเก็บรหัสผ่านนี้ หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ คุณจะต้อง<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index e6f1f35..baa7889 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">Okundu olarak işaretle</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> uygulamasını yükle</translation> <translation id="6349170655202535379">Senkronizasyon çalışmıyor. Oturumu kapatıp tekrar açmayı deneyin.</translation> -<translation id="6351063337294363751">Bu menüyü kullanarak tarama verilerinizi temizleyebilirsiniz</translation> <translation id="6354918092619878358">SECG eliptik eğri secp256r1 (önceki adları ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Cihazı kapatmayın</translation> <translation id="63566973648609420">Yalnızca parolanızı bilen biri, şifrelenmiş verilerinizi okuyabilir. Parola Google'a gönderilmez veya Google tarafından saklanmaz. Parolanızı unutursanız veya bu ayarı değiştirmek isterseniz <ph name="BEGIN_LINK" />senkronizasyonu sıfırlamanız<ph name="END_LINK" /> gerekir.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 6081178d..d9b739d 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -928,6 +928,7 @@ <translation id="204914487372604757">Створити ярлик</translation> <translation id="2050339315714019657">Портретна</translation> <translation id="2053312383184521053">Дані про неактивний стан</translation> +<translation id="2054665754582400095">Дані про те, чи ви присутні</translation> <translation id="2055585478631012616">Ви вийдете з облікового запису на цих сайтах, зокрема у відкритих вкладках</translation> <translation id="205560151218727633">Логотип Google Асистент</translation> <translation id="2058456167109518507">Виявлено пристрій</translation> @@ -1214,6 +1215,7 @@ <translation id="2387052489799050037">На головний екран</translation> <translation id="2387458720915042159">Тип з’єднання з проксі-сервером</translation> <translation id="2390347491606624519">Не вдається підключитися до проксі, увійдіть в обліковий запис ще раз</translation> +<translation id="2390782873446084770">Синхронізація Wi-Fi</translation> <translation id="2391082728065870591">Надіслати відгук</translation> <translation id="2391419135980381625">Стандартний шрифт</translation> <translation id="2392163307141705938">Ви перевищили ліміт часу використання, який ваші батьки встановили для <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation> @@ -1870,6 +1872,7 @@ <translation id="3157931365184549694">Відновити</translation> <translation id="3158033540161634471">Налаштуйте відбиток</translation> <translation id="3159493096109238499">Бежевий</translation> +<translation id="3159978855457658359">Змінити назву пристрою</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (з апаратною підтримкою)</translation> <translation id="3161522574479303604">Усі мови</translation> <translation id="3162853326462195145">Обліковий запис закладу освіти</translation> @@ -3230,6 +3233,7 @@ <translation id="4761104368405085019">Використовувати ваш мікрофон</translation> <translation id="4762718786438001384">На диску пристрою дуже мало вільного місця</translation> <translation id="4763408175235639573">Файли cookie, створені під час перегляду сторінки</translation> +<translation id="4764368918650455114">Переконайтеся, що обидва пристрої розблоковані, розташовані поруч і на них увімкнено Bluetooth. Якщо ви хочете надіслати файли на комп'ютер Chromebook, увімкніть на ньому функцію "Передавання поблизу" (для цього відкрийте панель стану, натиснувши час, і виберіть "Передавання поблизу"). <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="4765582662863429759">Дозволяє сервісу Android Повідомлення передавати SMS із телефона на Chromebook</translation> <translation id="476598255842811483">Ніхто, якщо на вашому пристрої закрите вікно функції "Передавання поблизу"</translation> <translation id="4768332406694066911">Вас ідентифікують сертифікати від цих організацій</translation> @@ -3392,6 +3396,7 @@ <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="496185450405387901">Цей додаток установлено адміністратором.</translation> <translation id="4964455510556214366">Упорядкування</translation> +<translation id="496446150016900060">Синхронізувати мережі Wi-Fi із вашим телефоном</translation> <translation id="4965808351167763748">Налаштувати пристрій для роботи Hangouts Meet?</translation> <translation id="496888482094675990">Додаток Файли надає швидкий доступ до файлів, збережених на Google Диску, у зовнішній пам’яті або на пристрої з ОС Chrome.</translation> <translation id="4971412780836297815">Відкрити після завантаження</translation> @@ -3698,6 +3703,7 @@ <translation id="5341980496415249280">Пакування. Зачекайте…</translation> <translation id="5342091991439452114">Мінімальна кількість цифр у PIN-коді: <ph name="MINIMUM" /></translation> <translation id="5344036115151554031">Відновлення Linux</translation> +<translation id="5345916423802287046">Запускати додаток, коли ви входите в обліковий запис</translation> <translation id="5350293332385664455">Вимкнути Google Асистента</translation> <translation id="535123479159372765">Текст скопійовано з іншого пристрою</translation> <translation id="5352033265844765294">Встановлення позначки часу</translation> @@ -4007,6 +4013,7 @@ <translation id="5704875434923668958">Синхронізовано з</translation> <translation id="5705005699929844214">Завжди показувати параметри спеціальних можливостей</translation> <translation id="5705882733397021510">Назад</translation> +<translation id="5707117624115653804">Налаштуйте розмір і стиль субтитрів для додатків і сайтів, що підтримують цю функцію</translation> <translation id="5707185214361380026">Не вдалося завантажити розширення з:</translation> <translation id="5708171344853220004">Ім'я учасника Microsoft</translation> <translation id="5709557627224531708">Зробіть Chrome веб-переглядачем за умовчанням</translation> @@ -4170,6 +4177,7 @@ <translation id="5904614460720589786">Не вдалося налаштувати додаток <ph name="APP_NAME" /> через проблему з конфігурацією. Зв'яжіться з адміністратором. Код помилки: <ph name="ERROR_CODE" />.</translation> <translation id="5906655207909574370">Майже оновлено. Перезапустіть пристрій, щоб завершити оновлення.</translation> <translation id="5906732635754427568">Дані, пов’язані з цим додатком, буде видалено з пристрою.</translation> +<translation id="5908474332780919512">Запускати додаток, коли ви входите в обліковий запис</translation> <translation id="5908695239556627796">Швидкість прокрутки мишею</translation> <translation id="5908769186679515905">Не дозволяти сайтам запускати Flash</translation> <translation id="5910363049092958439">Збер&егти зображення як...</translation> @@ -4562,7 +4570,6 @@ <translation id="6345878117466430440">Позначити як прочитане</translation> <translation id="6349101878882523185">Установіть додаток <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Синхронізація не працює. Вийдіть з облікового запису та ввійдіть у нього знову.</translation> -<translation id="6351063337294363751">Ви можете очистити дані веб-перегляду з цього меню</translation> <translation id="6354918092619878358">Еліптична крива SECG secp256r1 (також відома як ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Не вимикайте пристрій</translation> <translation id="63566973648609420">Ваші зашифровані дані можуть переглядати лише користувачі, які знають вашу парольну фразу. Парольна фраза не надсилається й не зберігається в Google. Якщо ви забули її або хочете змінити це налаштування, <ph name="BEGIN_LINK" />скиньте синхронізацію<ph name="END_LINK" />.</translation> @@ -4710,6 +4717,7 @@ <translation id="6532527800157340614">Не вдалось отримати маркер доступу та ввійти. Перевірте з'єднання з мережею та повторіть спробу.</translation> <translation id="6532663472409656417">Зареєстровано підприємством</translation> <translation id="6535331821390304775">Завжди дозволяти сайту <ph name="ORIGIN" /> відкривати посилання цього типу у зв'язаному додатку</translation> +<translation id="6537613839935722475">Назва може містити літери, цифри та дефіси (-)</translation> <translation id="6538635548667167211">Поточне налаштування використання трафіку: "Трафік"</translation> <translation id="654039047105555694"><ph name="BEGIN_BOLD" />Примітка.<ph name="END_BOLD" /> Вмикайте, лише якщо ви знаєте, що робите, або вас попросили це зробити, оскільки збір даних може знизити ефективність.</translation> <translation id="6541638731489116978">Цьому сайту заборонено доступ до датчиків руху.</translation> @@ -4798,6 +4806,7 @@ <translation id="6650234781371031356">Ваш пароль для сайту <ph name="WEBSITE" /> збережено на цьому пристрої та в обліковому записі Google. Звідки його видалити?</translation> <translation id="665061930738760572">Відкрити в &новому вікні</translation> <translation id="6651237644330755633">Довіряти цьому сертифікату для ідентифікації веб-сайтів</translation> +<translation id="6651495917527016072">Синхронізувати мережі Wi-Fi із вашим телефоном. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="665355505818177700">Інтеграція Chrome <ph name="MS_AD_NAME" /> підтримується лише на платформах x86_64. Комп’ютери Chromebook на платформі ARM або x86 не підтримують цю функцію.</translation> <translation id="6654509035557065241">Основна мережа</translation> <translation id="6655190889273724601">Режим розробника</translation> @@ -5401,6 +5410,7 @@ <translation id="7375235221357833624">{0,plural, =1{Оновіть пристрій протягом години}one{Оновіть пристрій протягом # години}few{Оновіть пристрій протягом # годин}many{Оновіть пристрій протягом # годин}other{Оновіть пристрій протягом # години}}</translation> <translation id="7376553024552204454">Підсвічувати курсор миші під час руху</translation> <translation id="7377451353532943397">Продовжити блокувати доступ до датчиків</translation> +<translation id="7378611153938412599">Ненадійні паролі можна легко вгадати, тому переконайтеся, що ваші є безпечними. <ph name="BEGIN_LINK" />Перегляньте інші поради щодо безпеки<ph name="END_LINK" />.</translation> <translation id="73786666777299047">Відкрити Веб-магазин Chrome</translation> <translation id="7378812711085314936">Під’єднатися до мобільного Інтернету</translation> <translation id="7380622428988553498">Назва пристрою містить недійсні символи</translation> @@ -5925,6 +5935,7 @@ <translation id="7959074893852789871">Файл містив декілька сертифікатів, деякі з яких не було імпортовано:</translation> <translation id="7961015016161918242">Ніколи</translation> <translation id="7963001036288347286">Прискорення на сенсорній панелі</translation> +<translation id="7963608432878156675">Ця назва використовується для підключень через Bluetooth і з'єднань із мережею та видима на інших пристроях</translation> <translation id="7963826112438303517">За допомогою цих аудіозаписів і усних запитів Асистент створює й оновлює зразок вашого голосу, що зберігається лише на пристроях, на яких ви ввімкнули Voice Match. Переглянути чи оновити голосові команди можна в налаштуваннях Асистента.</translation> <translation id="7966241909927244760">Копіювати адресу зображення</translation> <translation id="7966571622054096916">{COUNT,plural, =1{У списку закладок 1 елемент}one{У списку закладок {COUNT} елемент}few{У списку закладок {COUNT} елементи}many{У списку закладок {COUNT} елементів}other{У списку закладок {COUNT} елемента}}</translation> @@ -6389,6 +6400,7 @@ <translation id="850875081535031620">Шкідливих програм не виявлено</translation> <translation id="8509177919508253835">Скинути ключі безпеки та створити PIN-коди</translation> <translation id="8509646642152301857">Помилка завантаження словника перевірки орфографії.</translation> +<translation id="8512396579636492893">{COUNT,plural, =0{Усі паролі надійні}=1{Виявлено {COUNT} ненадійний пароль}one{Виявлено {COUNT} ненадійний пароль}few{Виявлено {COUNT} ненадійні паролі}many{Виявлено {COUNT} ненадійних паролів}other{Виявлено {COUNT} ненадійного пароля}}</translation> <translation id="8512476990829870887">Закінчити процес</translation> <translation id="851263357009351303">Завжди дозволяти хосту <ph name="HOST" /> показувати зображення</translation> <translation id="8513108775083588393">Автообертання</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 70a6654..a7abd02a 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -4563,7 +4563,6 @@ <translation id="6345878117466430440">بطور پڑھا ہوا مارک کریں</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> انسٹال کریں</translation> <translation id="6349170655202535379">مطابقت پذیری کام نہیں کر رہی ہے۔ سائن آؤٹ اور پھر دوبارہ سائن کرنے کی کوشش کریں۔</translation> -<translation id="6351063337294363751">آپ اس مینو سے اپنا براؤزنگ ڈیٹا صاف کر سکتے ہیں</translation> <translation id="6354918092619878358">SECG elliptic curve secp256r1 (المعروف ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">آلے کو آن رکھیں</translation> <translation id="63566973648609420">صرف وہ شخص جس کے پاس آپ کا پاس فریز ہے آپ کے مرموز کردہ ڈیٹا کو پڑھ سکتا ہے۔ پاس فریز Google کو نہیں بھیجا جاتا یا اس کے ذریعے اسٹور نہیں کیا جاتا ہے۔ اگر آپ اپنا پاس فریز بھول جاتے ہیں یا اس ترتیب کو تبدیل کرنا چاہتے ہیں تو آپ کو <ph name="BEGIN_LINK" />مطابقت پذیری دوبارہ ترتیب دینے<ph name="END_LINK" /> کی ضرورت ہوگی۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 62fda3a5..fa22a2d 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -4568,7 +4568,6 @@ <translation id="6345878117466430440">Oʻqildi deb belgilash</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ilovasini oʻrnatish</translation> <translation id="6349170655202535379">Sinxronizatsiya ishlamayapti. Hisobingizdan chiqing va yana kiring.</translation> -<translation id="6351063337294363751">Brauzer foliyati haqidagi ma’lumotlarni ushbu menyu orqali tozalashingiz mumkin</translation> <translation id="6354918092619878358">SECG elliptik egri chiziqli secp256r1 (ANSI X9.62 prime256v1, NIST P-256) ochiq kalit algoritmi</translation> <translation id="635609604405270300">Qurilma yoniq tursin</translation> <translation id="63566973648609420">Shifrlangan ma’lumotlaringizni faqat kodli iborani biladiganlar ko‘ra oladi. Bu iborani Google bilmaydi va o‘z serverlarida saqlamaydi. Agar kodli iborani unutsangiz yoki bu sozlamani o‘zgaritrmoqchi bo‘lsangiz <ph name="BEGIN_LINK" />sinxronizatsiya sozlamalarini qayta tiklashingiz<ph name="END_LINK" /> lozim.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index c60cb5fd..79c46ce 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Đánh dấu là đã đọc</translation> <translation id="6349101878882523185">Cài đặt <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Đồng bộ hóa không hoạt động. Thử đăng xuất và đăng nhập lại.</translation> -<translation id="6351063337294363751">Bạn có thể xóa dữ liệu duyệt web khỏi menu này</translation> <translation id="6354918092619878358">Đường cong elip SECG secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Luôn bật thiết bị</translation> <translation id="63566973648609420">Chỉ người có cụm mật khẩu mới có thể đọc dữ liệu được mã hóa của bạn. Cụm mật khẩu không được gửi tới hoặc được lưu trữ bởi Google. Nếu bạn quên cụm mật khẩu hoặc muốn thay đổi cài đặt này, bạn sẽ cần <ph name="BEGIN_LINK" />đặt lại đồng bộ hóa<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 4825cf2..e38c69c 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -4557,7 +4557,6 @@ <translation id="6345878117466430440">标记为已读</translation> <translation id="6349101878882523185">安装“<ph name="APP_NAME" />”</translation> <translation id="6349170655202535379">无法同步。请尝试退出并重新登录。</translation> -<translation id="6351063337294363751">您可以使用此菜单清除浏览数据</translation> <translation id="6354918092619878358">SECG 椭圆曲线 secp256r1(又称 ANSI X9.62 prime256v1 或 NIST P-256)</translation> <translation id="635609604405270300">请勿关闭设备</translation> <translation id="63566973648609420">只有知道您密码的人才能读取您的已加密数据。系统不会将该密码发送给 Google,Google 也不会存储该密码。如果您忘记了密码或想更改此设置,则需<ph name="BEGIN_LINK" />重置同步<ph name="END_LINK" />。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index ba901552..3c420e54 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -4561,7 +4561,6 @@ <translation id="6345878117466430440">標示為已閱讀</translation> <translation id="6349101878882523185">安裝 <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">同步處理功能無法正常運作,請嘗試登出並重新登入。</translation> -<translation id="6351063337294363751">您可以從這個選單清除您的瀏覽資料</translation> <translation id="6354918092619878358">SECG 橢圓曲線 secp256r1 (亦稱為 ANSI X9.62 prime256v1、NIST P-256)</translation> <translation id="635609604405270300">保持裝置開啟</translation> <translation id="63566973648609420">只有知道密碼短語的使用者才能讀取您的加密資料。系統不會將密碼短語傳送給 Google,Google 也不會儲存密碼短語。如果您忘記自己的密碼短語,或希望變更這項設定,則必須<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" />。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 5c986f1..727fdd89 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -4560,7 +4560,6 @@ <translation id="6345878117466430440">標示為已讀取</translation> <translation id="6349101878882523185">安裝 <ph name="APP_NAME" /></translation> <translation id="6349170655202535379">同步功能無法正常運作。請嘗試登出,再重新登入。</translation> -<translation id="6351063337294363751">你可以使用這個選單清除瀏覽資料</translation> <translation id="6354918092619878358">SECG 橢圓曲線 secp256r1 (亦稱為 ANSI X9.62 prime256v1、NIST P-256)</translation> <translation id="635609604405270300">請讓裝置保持開啟</translation> <translation id="63566973648609420">只有知道通關密語的使用者可以讀取你的加密資料。系統不會將通關密語傳送給 Google,Google 也不會儲存通關密語。如果你忘記自己的通關密語,或是想變更這項設定,則必須<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" />。</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 4dd5a0bf..3f21084 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -4562,7 +4562,6 @@ <translation id="6345878117466430440">Maka njengokufundiwe</translation> <translation id="6349101878882523185">Faka i-<ph name="APP_NAME" /></translation> <translation id="6349170655202535379">Ukuvumelanisa akusebenzi. Zama ukuphuma ngemvume uphinde ungene futhi.</translation> -<translation id="6351063337294363751">Ungasula idatha yakho yokuphequlula kusuka kule menu</translation> <translation id="6354918092619878358">I-SECG elliptic curve secp256r1 (aka ANSI X9.62 prime256v1, NIST P-256)</translation> <translation id="635609604405270300">Gcina idivayisi ivuliwe</translation> <translation id="63566973648609420">Umuntu onomushwana wakho wokungena kuphela onafunda idatha yakho ebetheliwe. Umushwana wokungena awuthunyelwa ku-Google noma awugcinwa kuyo. Uma ukhohlwe umushwana wakho wokungena noma ufuna ukushintsha lesi silungiselelo, kuzomele <ph name="BEGIN_LINK" />usethe kabusha ukuvumelanisa<ph name="END_LINK" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index 60895a8..5807a7e 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">Jy is by Chrome aangemeld!</translation> <translation id="2885378588091291677">Taakbestuurder</translation> <translation id="2888126860611144412">Meer oor Chrome</translation> +<translation id="2926676257163822632">Swak wagwoorde is maklik om te raai. Laat Chrome <ph name="BEGIN_LINK" />sterk wagwoorde vir jou skep en onthou<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome het nie opgedateer nie; iets het skeefgeloop. <ph name="BEGIN_LINK" />Stel Chrome-opdateringprobleme en mislukte opdaterings reg.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Netwerkaanmelding – Chrome</translation> <translation id="3037838751736561277">Google Chrome is in agtergrondmodus.</translation> @@ -172,7 +173,6 @@ Google Chrome kan nie jou instellings terugstel nie.</translation> <translation id="556024056938947818">Google Chrome probeer tans om wagwoorde te wys.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Vra wanneer ek Chrome oopmaak</translation> <translation id="5657226924540934362">As 'n instelling nie op hierdie bIadsy verskyn nie, moet jy in jou <ph name="LINK_BEGIN" /> Chrome-bedryfstelselinstellings<ph name="LINK_END" /> kyk</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> kan gevaarlik wees en daarom het Chrome dit geblokkeer.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index f4484a7..22c8574 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">ወደ Chrome ገብተዋል!</translation> <translation id="2885378588091291677">ተግባር መሪ</translation> <translation id="2888126860611144412">ስለChrome</translation> +<translation id="2926676257163822632">ደካማ የይለፍ ቃላት ለመገመት ቀላል ናቸው። Chrome <ph name="BEGIN_LINK" /> ለእርስዎ ጠንካራ የይለፍ ቃላትን እንዲፈጥር እና እንዲያስታውስ<ph name="END_LINK" /> ይፍቀዱ።</translation> <translation id="2929907241665500097">Chrome አልተዘመነም፣ የሆነ ስክህተት ተከስቷል። <ph name="BEGIN_LINK" />የChrome ዝማኔ ችግሮችን እና ያልተሳኩ ዝማኔዎችን ያስተካክሉ።<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - በአውታረ መረብ ወደ መለያ መግባት - Chrome</translation> <translation id="3037838751736561277">Google Chrome በጀርባ ሁኔታ ላይ ነው።</translation> @@ -172,7 +173,6 @@ Google Chrome ቅንጅቶችዎን ማስመለስ አልቻለም።</translation> <translation id="556024056938947818">Google Chrome የይለፍ ቃላትን ለማሳየት እየሞከረ ነው።</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chromeን ስከፍት ጠይቅ</translation> <translation id="5657226924540934362">በዚህ ገጽ ላይ አንድ ቅንብር ካልታየ በእርስዎ <ph name="LINK_BEGIN" /> የ Chrome OS ቅንብሮች<ph name="LINK_END" /> ውስጥ ይመልከቱ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> አደገኛ ሊሆን ስለሚችል Chrome አግዶታል።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index dd88397..5728bb5 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -168,7 +168,6 @@ <translation id="5430073640787465221">ملف الإعدادات المفضّلة تالف أو غير صالح. يتعذر على Google Chrome استرداد إعداداتك.</translation> <translation id="556024056938947818">يحاول Google Chrome إظهار كلمات المرور.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">السؤال عند فتح متصفِّح Chrome</translation> <translation id="5657226924540934362">في حال عدم عرض إعداد على هذه الصفحة، انتقل إلى <ph name="LINK_BEGIN" /> إعدادات نظام التشغيل Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">قد يكون ملف <ph name="FILE_NAME" /> ضارًا، لذلك فقد حظره Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 72c1b84a..8693f776 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -172,7 +172,6 @@ Google Chromeএ আপোনাৰ ছেটিংসমূহ পুনৰুদ্ধাৰ কৰিবলৈ সক্ষম নহ'ল।</translation> <translation id="556024056938947818">Google Chromeএ পাছৱর্ডসমূহ দেখুৱাবলৈ চেষ্টা কৰি আছে।</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">মই Chrome খুলিলে সোধক</translation> <translation id="5657226924540934362">এই পৃষ্ঠাখনত যদি কোনোটো ছেটিং দেখা পোৱা নাযায়, তেন্তে আপোনাৰ <ph name="LINK_BEGIN" /> Chrome ব্ৰাউজাৰৰ ছেটিংসমূহ<ph name="LINK_END" />ত চাওক</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ক্ষতিকাৰক হ'ব পাৰে বাবে Chromiumএ ইয়াক অৱৰোধ কৰিছে</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index cd60a9c..2f01a38a 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -168,7 +168,6 @@ <translation id="5430073640787465221">Tərcih faylınız zədələnib və ya yanlışdır. Google Chrome ayarlarınızı bərpa edə bilmir.</translation> <translation id="556024056938947818">Google Chrome parolları göstərməyə cəhd edir.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chrome'u açdığım zaman soruşulsun</translation> <translation id="5657226924540934362">Hər hansı ayar bu səhifədə göstərilməsə, <ph name="LINK_BEGIN" /> Chrome OS ayarlarına<ph name="LINK_END" /> baxın</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> təlükəli ola bilər, bu səbəbdən Chrome onu blok etdi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 72e64aa..130e6a4b 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -172,7 +172,6 @@ Не ўдалося аднавіць налады ў браўзеры Google Chrome.</translation> <translation id="556024056938947818">Google Chrome спрабуе паказаць паролі.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Пытацца, калі я адкрываю Chrome</translation> <translation id="5657226924540934362">Калі налада адсутнічае на гэтай старонцы, перайдзіце ў <ph name="LINK_BEGIN" /> налады Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Файл "<ph name="FILE_NAME" />" можа быць небяспечным, таму Chrome заблакіраваў яго.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 16435bc..ef96823 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -166,7 +166,6 @@ <translation id="5430073640787465221">Файлът с предпочитанията ви е повреден или невалиден. Google Chrome не може да възстанови настройките ви.</translation> <translation id="556024056938947818">Google Chrome опитва да покаже паролите.</translation> <translation id="5566025111015594046">Google Chrome (входящ трафик за mDNS)</translation> -<translation id="5633355459292055250">Запитване, когато отворя Chrome</translation> <translation id="5657226924540934362">Ако дадена настройка не се показва на тази страница, потърсете в <ph name="LINK_BEGIN" />настройките на Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Chrome блокира „<ph name="FILE_NAME" />“, тъй като файлът може да е опасен.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Администраторът ви моли да рестартирате Chrome, за да се приложи тази актуализация}=1{Администраторът ви моли да рестартирате Chrome, за да се приложи тази актуализация. Прозорецът ви в режим „инкогнито“ няма да бъде отворен отново.}other{Администраторът ви моли да рестартирате Chrome, за да се приложи тази актуализация. Вашите # прозореца в режим „инкогнито“ няма да бъдат отворени отново.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 523428ee..dd180cb 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -161,7 +161,6 @@ <translation id="5430073640787465221">আপনার পছন্দের ফাইল ক্ষতিকর অথবা ভুল৷\n\nGoogle Chrome আপনার সেটিংস পুনরুদ্ধার করতে পারছে না৷</translation> <translation id="556024056938947818">Google Chrome পাসওয়ার্ডগুলি দেখানোর চেষ্টা করছে৷</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">আমি Chrome খুললে জিজ্ঞাসা করো</translation> <translation id="5657226924540934362">এই পৃষ্ঠাতে কোনও একটি সেটিং দেখা না গেলে, আপনার <ph name="LINK_BEGIN" /> Chrome OS সেটিংস<ph name="LINK_END" /> বিকল্পটি দেখুন</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> বিপজ্জনক হতে পারে, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 5a361f5..345d035 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">Prijavili ste se u Chrome!</translation> <translation id="2885378588091291677">Upravitelj zadataka</translation> <translation id="2888126860611144412">O Chromeu</translation> +<translation id="2926676257163822632">Slabe zaporke lako je pogoditi. Neka Chrome <ph name="BEGIN_LINK" />izradi i zapamti snažne zaporke za vas<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Ažuriranje Chromea nije uspjelo. Nešto nije uredu. <ph name="BEGIN_LINK" />Ispravite probleme s ažuriranjem Chromea i neuspjela ažuriranja.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – prijava na mrežu – Chrome</translation> <translation id="3037838751736561277">Google Chrome radi u pozadinskom načinu rada.</translation> @@ -170,7 +171,6 @@ <translation id="5430073640787465221">Datoteka vaših postavki oštećena je ili nevažeća. Google Chrome nema mogućnost oporavka vaših postavki.</translation> <translation id="556024056938947818">Google Chrome pokušava prikazati lozinke.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Traži odobrenje kada otvorim Chrome</translation> <translation id="5657226924540934362">Ako se postavka ne prikazuje na ovoj stranici, pogledajte u <ph name="LINK_BEGIN" /> postavkama preglednika Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Fajl <ph name="FILE_NAME" /> može biti opasan, pa ga je Chrome blokirao.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index e279d89..dd45632 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -75,6 +75,7 @@ <translation id="2871893339301912279">Teniu la sessió iniciada a Chrome.</translation> <translation id="2885378588091291677">Gestor de tasques</translation> <translation id="2888126860611144412">Sobre Chrome</translation> +<translation id="2926676257163822632">Les contrasenyes poc segures són fàcils d'endevinar. Deixa que Chrome <ph name="BEGIN_LINK" />creï i recordi contrasenyes segures en nom teu<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">No s'ha actualitzat Chrome. S'ha produït un error. <ph name="BEGIN_LINK" />Soluciona els problemes i errors d'actualització de Chrome<ph name="END_LINK" />.</translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Inici de sessió a la xarxa - Chrome</translation> <translation id="3037838751736561277">Google Chrome està en mode de segon pla.</translation> @@ -164,7 +165,6 @@ <translation id="5430073640787465221">El fitxer de preferències està malmès o no és vàlid. Google Chrome no pot recuperar la configuració.</translation> <translation id="556024056938947818">Google Chrome està provant de mostrar les contrasenyes.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Pregunta'm quan obri Chrome</translation> <translation id="5657226924540934362">Si alguna opció de configuració no es mostra en aquesta pàgina, consulta la <ph name="LINK_BEGIN" />configuració de Chrome OS<ph name="LINK_END" />.</translation> <translation id="565744775970812598">Chrome ha bloquejat <ph name="FILE_NAME" /> perquè pot ser perillós.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{L'administrador et demana que reiniciïs Chrome per aplicar aquesta actualització}=1{L'administrador et demana que reiniciïs Chrome per aplicar aquesta actualització. La finestra d'incògnit no es tornarà a obrir.}other{L'administrador et demana que reiniciïs Chrome per aplicar aquesta actualització. Les # finestres d'incògnit no es tornaran a obrir.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 34d482df..e9bd61d 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -172,7 +172,6 @@ Aplikace Google Chrome nemůže vaše nastavení obnovit.</translation> <translation id="556024056938947818">Google Chrome se pokouší zobrazit hesla.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Při otevření Chromu se zeptat</translation> <translation id="5657226924540934362">Pokud některé nastavení na této stránce není zobrazeno, podívejte se do <ph name="LINK_BEGIN" />nastavení systému Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Soubor <ph name="FILE_NAME" /> může být nebezpečný, proto jej Chrome zablokoval.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Váš administrátor vás žádá, abyste kvůli použití této aktualizace Chrome restartovali}=1{Váš administrátor vás žádá, abyste kvůli použití této aktualizace Chrome restartovali. Anonymní okno se neotevře znovu.}few{Váš administrátor vás žádá, abyste kvůli použití této aktualizace Chrome restartovali. # anonymní okna se neotevřou znovu.}many{Váš administrátor vás žádá, abyste kvůli použití této aktualizace Chrome restartovali. # anonymního okna se neotevře znovu.}other{Váš administrátor vás žádá, abyste kvůli použití této aktualizace Chrome restartovali. # anonymních oken se neotevře znovu.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 11253cab..cc9e059 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Din præferencefil er beskadiget eller ugyldig. Google Chrome kan ikke gendanne dine præferencer.</translation> <translation id="556024056938947818">Google Chrome forsøger at vise adgangskoder.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Spørg, når jeg åbner Chrome</translation> <translation id="5657226924540934362">Hvis en indstilling ikke vises på denne side, kan du kigge i <ph name="LINK_BEGIN" /> indstillingerne for Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> kan være skadelig, så Chrome har blokeret den.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index de60234..bf233e4 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Ihre Einstellungsdatei ist beschädigt oder ungültig. Google Chrome kann Ihre Einstellungen nicht wiederherstellen.</translation> <translation id="556024056938947818">Google Chrome versucht, Passwörter anzuzeigen.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Fragen, wenn ich Chrome öffne</translation> <translation id="5657226924540934362">Wenn Sie auf dieser Seite eine Einstellung nicht finden können, sehen Sie in den <ph name="LINK_BEGIN" />Einstellungen von Chrome OS<ph name="LINK_END" /> nach</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ist möglicherweise schädlich und wurde daher von Chrome blockiert.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Ihr Administrator empfiehlt Ihnen, Chrome neu zu starten, um dieses Update durchzuführen}=1{Ihr Administrator empfiehlt Ihnen, Chrome neu zu starten, um dieses Update durchzuführen. Ihr Inkognitofenster wird nicht wieder geöffnet.}other{Ihr Administrator empfiehlt Ihnen, Chrome neu starten, um dieses Update durchzuführen. Ihre # Inkognitofenster werden nicht wieder geöffnet.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 023e706..d9edca7 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -168,7 +168,6 @@ <translation id="5430073640787465221">Το αρχείο προτιμήσεών σας είναι κατεστραμμένο ή μη έγκυρο.Το Google Chrome δεν μπορεί να ανακτήσει τις ρυθμίσεις σας.</translation> <translation id="556024056938947818">Το Google Chrome επιχειρεί να εμφανίσει κωδικούς πρόσβασης.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Να γίνεται ερώτηση όταν ανοίγω το Chrome</translation> <translation id="5657226924540934362">Εάν μια ρύθμιση δεν εμφανίζεται σε αυτήν τη σελίδα, αναζητήστε την στις <ph name="LINK_BEGIN" /> ρυθμίσεις του Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Το αρχείο <ph name="FILE_NAME" /> μπορεί να είναι επικίνδυνο, επομένως έχει αποκλειστεί από το Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 68e1daf..fd095e7 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -173,7 +173,6 @@ Google Chrome is unable to recover your settings.</translation> <translation id="556024056938947818">Google Chrome is trying to show passwords.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Ask when I open Chrome</translation> <translation id="5657226924540934362">If a setting doesn't show on this page, look in your <ph name="LINK_BEGIN" /> Chrome OS settings<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> may be dangerous, so Chrome has blocked it.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 7d66c0a..dc8b92e 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Tu archivo de preferencias está dañado o no es válido. Google Chrome no puede recuperar tu configuración.</translation> <translation id="556024056938947818">Google Chrome está intentando mostrar contraseñas.</translation> <translation id="5566025111015594046">Google Chrome (tráfico mDNS entrante)</translation> -<translation id="5633355459292055250">Preguntar al abrir Chrome</translation> <translation id="5657226924540934362">Si no ves una opción de configuración en esta página, consulta la <ph name="LINK_BEGIN" /> configuración del Sistema operativo Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Chrome bloqueó <ph name="FILE_NAME" /> porque es posible que sea un archivo peligroso.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index c213a27..374cc123 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">Has iniciado sesión en Chrome</translation> <translation id="2885378588091291677">Administrador de tareas</translation> <translation id="2888126860611144412">Información de Chrome</translation> +<translation id="2926676257163822632">Las contraseñas poco seguras son fáciles de adivinar. Permite que Chrome <ph name="BEGIN_LINK" />cree y recuerde contraseñas seguras por ti<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome no se ha actualizado, algo no va bien. <ph name="BEGIN_LINK" />Soluciona los problemas y errores de actualización de Chrome<ph name="END_LINK" />.</translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" />, inicio de sesión en la red, Chrome</translation> <translation id="3037838751736561277">Google Chrome está en modo de segundo plano.</translation> @@ -172,7 +173,6 @@ Google Chrome no puede recuperar tu configuración.</translation> <translation id="556024056938947818">Google Chrome está intentando mostrar contraseñas.</translation> <translation id="5566025111015594046">Google Chrome (tráfico mDNS entrante)</translation> -<translation id="5633355459292055250">Preguntar cuando abra Chrome</translation> <translation id="5657226924540934362">Si no se muestra algún ajuste en esta página, consulta la <ph name="LINK_BEGIN" /> configuración de Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Es posible que <ph name="FILE_NAME" /> sea peligroso, por lo que Chrome lo ha bloqueado.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index 886d10fe..4bc3ca6 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -77,6 +77,7 @@ <translation id="2871893339301912279">Olete Chrome'i sisse logitud.</translation> <translation id="2885378588091291677">Tegumihaldur</translation> <translation id="2888126860611144412">Teave Chrome'i kohta</translation> +<translation id="2926676257163822632">Nõrku paroole on lihtne ära arvata. Laske Chrome'il <ph name="BEGIN_LINK" />teie jaoks luua ja meelde jätta tugevaid paroole<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome'i ei värskendatud, midagi läks valesti. <ph name="BEGIN_LINK" />Lahendage Chrome'i värskendamisprobleemid ja parandage ebaõnnestunud värskendused.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – võrku sisselogimine – Chrome</translation> <translation id="3037838751736561277">Google Chrome on taustarežiimis.</translation> @@ -168,7 +169,6 @@ <translation id="5430073640787465221">Teie eelistuste fail on rikutud või kehtetu. Google Chrome ei saa teie seadeid taastada.</translation> <translation id="556024056938947818">Google Chrome püüab näidata paroole.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Küsi, kui ma Chrome'i avan</translation> <translation id="5657226924540934362">Kui seadet sellel lehel ei kuvata, vaadake oma <ph name="LINK_BEGIN" /> Chrome OS-i seadeid<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> võib olla ohtlik, mistõttu Chrome blokeeris selle.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 1f874606..9a2b092 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -172,7 +172,6 @@ Google Chrome-k ezin ditu berreskuratu zure ezarpenak.</translation> <translation id="556024056938947818">Google Chrome pasahitzak erakusten saiatzen ari da.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Galdetu Chrome irekitzen dudanean</translation> <translation id="5657226924540934362">Ezarpenen bat orri honetan agertzen ez bada, bila ezazu <ph name="LINK_BEGIN" /> Chrome OS sistema eragilearen ezarpenetan.<ph name="LINK_END" /></translation> <translation id="565744775970812598">Baliteke <ph name="FILE_NAME" /> arriskutsua izatea; horregatik, blokeatu egin du Chrome-k.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 73c37616..37c2413 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">فایل اولویتهای شما خراب یا نامعتبر است. Google Chrome نمیتواند تنظیمات شما را بازیابی کند.</translation> <translation id="556024056938947818">Google Chrome میخواهد گذرواژهها را نمایش دهد.</translation> <translation id="5566025111015594046">Google Chrome (ورودی mDNS)</translation> -<translation id="5633355459292055250">وقتی Chrome را باز میکنم سؤال شود</translation> <translation id="5657226924540934362">اگر تنظیمی در این صفحه نشان داده نمیشود، در <ph name="LINK_BEGIN" /> تنظیمات مرورگر Chrome OS<ph name="LINK_END" /> آن را کنید</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ممکن است خطرناک باشد، بنابراین Chrome آن را مسدود کرده است.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index bcbf9643..a961eb43 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Asetustiedostosi on virheellinen. Google Chrome ei voi palauttaa asetuksiasi.</translation> <translation id="556024056938947818">Google Chrome yrittää näyttää salasanoja.</translation> <translation id="5566025111015594046">Google Chrome (saapuva mDNS)</translation> -<translation id="5633355459292055250">Kysy, kun avaan Chromen</translation> <translation id="5657226924540934362">Jos asetus ei näy tällä sivulla, siirry <ph name="LINK_BEGIN" /> Chrome-käyttöjärjestelmän asetuksiin<ph name="LINK_END" />.</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> voi olla vaarallinen, joten Chrome on estänyt sen.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index c0579714..45f0e2a8 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -172,7 +172,6 @@ Hindi magawang bawiin ng Google Chrome ang iyong mga setting.</translation> <translation id="556024056938947818">Sinusubukan ng Google Chrome na magpakita ng mga password.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Magtanong kapag binuksan ko ang Chrome</translation> <translation id="5657226924540934362">Kung hindi lumalabas ang isang setting sa page na ito, tingnan sa iyong <ph name="LINK_BEGIN" /> mga setting ng Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Maaaring mapanganib ang <ph name="FILE_NAME" />, kaya na-block ito ng Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 0e3c077e..372ead7 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -172,7 +172,6 @@ Google Chrome ne peut pas récupérer vos paramètres.</translation> <translation id="556024056938947818">Google Chrome essaie d'afficher les mots de passe.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Me demander quand j'ouvre Chrome</translation> <translation id="5657226924540934362">Si un paramètre ne s'affiche pas sur cette page, consultez les <ph name="LINK_BEGIN" />paramètres de Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Chrome a bloqué le fichier <ph name="FILE_NAME" />, car il peut être dangereux.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Votre administrateur vous recommande de relancer Chrome pour appliquer cette mise à jour}=1{Votre administrateur vous recommande de relancer Chrome pour appliquer cette mise à jour. Votre fenêtre de navigation privée ne sera pas rouverte.}one{Votre administrateur vous recommande de relancer Chrome pour appliquer cette mise à jour. Votre fenêtre de navigation privée ne sera pas rouverte.}other{Votre administrateur vous recommande de relancer Chrome pour appliquer cette mise à jour. Vos # fenêtres de navigation privée ne seront pas rouvertes.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 5b38bec..10795514 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -171,7 +171,6 @@ Google Chrome ne peut pas récupérer vos paramètres.</translation> <translation id="556024056938947818">Tentative d'affichage des mots de passe dans Google Chrome</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Me demander quand j'ouvre Chrome</translation> <translation id="5657226924540934362">Si un paramètre ne s'affiche pas sur cette page, accédez aux <ph name="LINK_BEGIN" />paramètres Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Chrome a bloqué <ph name="FILE_NAME" />, car ce fichier peut être dangereux.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Votre administrateur vous demande de relancer Chrome pour installer cette mise à jour}=1{Votre administrateur vous demande de relancer Chrome pour installer cette mise à jour. Sachez que la fenêtre de navigation privée ne sera pas rouverte.}one{Votre administrateur vous demande de relancer Chrome pour installer cette mise à jour. Sachez que la fenêtre de navigation privée (#) ne sera pas rouverte.}other{Votre administrateur vous demande de relancer Chrome pour installer cette mise à jour. Sachez que les # fenêtres de navigation privée ne seront pas rouvertes.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index 671b8081..3b1149f 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -172,7 +172,6 @@ Google Chrome non pode recuperar a túa configuración.</translation> <translation id="556024056938947818">Google Chrome está intentando mostrar contrasinais.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Preguntar cando abra Chrome</translation> <translation id="5657226924540934362">Se non se mostra algunha opción de configuración nesta páxina, accede á <ph name="LINK_BEGIN" /> configuración de Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> pode ser perigoso, así que Chrome bloqueouno.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index 976349b..007f56bf 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -172,7 +172,6 @@ Google Chrome તમારી સેટિંગ્સને પુનઃપ્રાપ્ત કરવામાં અક્ષમ છે.</translation> <translation id="556024056938947818">Google Chrome પાસવર્ડ્સ બતાવવાનો પ્રયાસ કરી રહ્યું છે.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">હું Chrome ખોલું ત્યારે પૂછો</translation> <translation id="5657226924540934362">જો આ પેજ પર સેટિંગ બતાવેલું ન હોય, તો તમારા <ph name="LINK_BEGIN" /> Chrome OS સેટિંગ<ph name="LINK_END" />માં જુઓ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> જોખમી હોઈ શકે છે, તેથી Chrome એ તેને અવરોધિત કરેલ છે.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index 27de698..26ab8f30 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -168,7 +168,6 @@ Google Chrome आपकी सेटिंग बहाल नहीं कर सकता.</translation> <translation id="556024056938947818">Google Chrome पासवर्ड दिखाने का प्रयास कर रहा है.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">जब मैं Chrome खोलूं, तब यह सवाल पूछें</translation> <translation id="5657226924540934362">अगर इस पेज पर सेटिंग नहीं दिखती है, तो अपनी <ph name="LINK_BEGIN" /> Chrome OS सेटिंग<ph name="LINK_END" /> देखें</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> खरतरनाक हो सकता है, इसलिए Chrome ने उसे अवरोधित कर दिया है.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index 08b7f30..2b867885 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -75,6 +75,7 @@ <translation id="2871893339301912279">Prijavljeni ste na Chrome!</translation> <translation id="2885378588091291677">Upravitelj zadataka</translation> <translation id="2888126860611144412">O Chromeu</translation> +<translation id="2926676257163822632">Slabe zaporke lako je pogoditi. Neka Chrome <ph name="BEGIN_LINK" />izradi i zapamti snažne zaporke za vas<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome se nije ažurirao zbog pogreške. <ph name="BEGIN_LINK" />Riješite probleme s ažuriranjem i neuspjela ažuriranja Chromea.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Prijava na mrežu – Chrome</translation> <translation id="3037838751736561277">Google Chrome radi u pozadini.</translation> @@ -164,7 +165,6 @@ <translation id="5430073640787465221">Datoteka vaših postavki oštećena je ili nevažeća. Google Chrome nema mogućnost oporavka vaših postavki.</translation> <translation id="556024056938947818">Google Chrome pokušava prikazati zaporke.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Pitaj kada otvorim Chrome</translation> <translation id="5657226924540934362">Ako se postavka ne prikazuje na ovoj stranici, pogledajte <ph name="LINK_BEGIN" /> postavke OS-a Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Datoteka <ph name="FILE_NAME" /> mogla bi biti opasna, pa ju je Chrome blokirao.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index 742fe52..8839aa06 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">A beállításait tartalmazó fájl hibás vagy érvénytelen. A Google Chrome nem tudja helyreállítani a beállításait.</translation> <translation id="556024056938947818">A Google Chrome megpróbálja megjeleníteni a jelszavakat.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Kérdezzen rá a Chrome megnyitásakor</translation> <translation id="5657226924540934362">Ha valamelyik beállítás nem látható ezen az oldalon, keresse a <ph name="LINK_BEGIN" />Chrome OS beállításai<ph name="LINK_END" /> között</translation> <translation id="565744775970812598">A(z) <ph name="FILE_NAME" /> veszélyes lehet, ezért a Chrome letiltotta.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Rendszergazdája arra kéri, hogy indítsa újra a Chrome-ot a frissítés alkalmazásához.}=1{Rendszergazdája arra kéri, hogy indítsa újra a Chrome-ot a frissítés alkalmazásához. Az inkognitó ablak nem fog újra megnyílni.}other{Rendszergazdája arra kéri, hogy indítsa újra a Chrome-ot a frissítés alkalmazásához. A(z) # inkognitó ablak nem fog újra megnyílni.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 3cf0b66a..8257cad 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -170,7 +170,6 @@ Google Chrome-ը չի կարողանում վերականգնել ձեր կարգավորումները:</translation> <translation id="556024056938947818">Google Chrome-ը փորձում է ցույց տալ գաղտնաբառերը:</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Հարցնել, երբ ես բացեմ Chrome-ը</translation> <translation id="5657226924540934362">Եթե որևէ կարգավորում չտեսնեք այս էջում, փնտրեք այն ձեր <ph name="LINK_BEGIN" /> Chrome OS-ի կարգավորումներում<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ֆայլը կարող է վտանգավոր լինել, և Chrome-ն արգելափակել է այն։</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 32436e2a..dd86ede 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">File preferensi Anda rusak atau tidak valid. Google Chrome tidak dapat memulihkan setelan Anda.</translation> <translation id="556024056938947818">Google Chrome mencoba menampilkan sandi.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Tanyakan saat saya membuka Chrome</translation> <translation id="5657226924540934362">Jika setelan tidak muncul di halaman ini, buka <ph name="LINK_BEGIN" /> setelan Chrome OS<ph name="LINK_END" /> Anda</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> mungkin berbahaya, sehingga Chrome memblokirnya.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb index 323e34c..67ed3448 100644 --- a/chrome/app/resources/google_chrome_strings_is.xtb +++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -172,7 +172,6 @@ Google Chrome getur ekki endurheimt stillingarnar þínar.</translation> <translation id="556024056938947818">Google Chrome er að reyna að birta aðgangsorð.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-inn)</translation> -<translation id="5633355459292055250">Spyrja þegar ég opna Chrome</translation> <translation id="5657226924540934362">Ef stilling sést ekki á þessari síðu skaltu athuga <ph name="LINK_BEGIN" /> stillingar Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> gæti verið skaðleg skrá og Chrome útilokaði hana.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index 75ef4a8..65fd5c6c 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Il file delle preferenze è danneggiato o non valido. Google Chrome non è in grado di recuperare le impostazioni.</translation> <translation id="556024056938947818">Google Chrome sta cercando di visualizzare le password.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chiedi all'apertura di Chrome</translation> <translation id="5657226924540934362">Se un'impostazione non viene mostrata in questa pagina, cercala nelle <ph name="LINK_BEGIN" />impostazioni del sistema operativo Chrome<ph name="LINK_END" />.</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> potrebbe essere pericoloso, pertanto è stato bloccato da Chrome.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{L'amministratore raccomanda il riavvio di Chrome per installare questo aggiornamento}=1{L'amministratore raccomanda il riavvio di Chrome per installare questo aggiornamento. La finestra di navigazione in incognito non verrà riaperta.}other{L'amministratore raccomanda il riavvio di Chrome per installare questo aggiornamento. Le # finestre di navigazione in incognito non verranno riaperte.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 96a08a9..b0cc5af 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">קובץ ההעדפות שלך פגום או לא חוקי. Google Chrome לא יכול לשחזר את ההגדרות שלך.</translation> <translation id="556024056938947818">Google Chrome מנסה להציג סיסמאות.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">הצגת שאלה בפתיחה של Chrome</translation> <translation id="5657226924540934362">אם הגדרה מסוימת לא מופיעה בדף הזה, אפשר לחפש אותה <ph name="LINK_BEGIN" /> בהגדרות ה-OS של Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> עלול להיות מסוכן, ולכן Chrome חסם אותו.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 476789c..920ba80c 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">ユーザー設定ファイルが壊れているか無効です。設定を復元できません。</translation> <translation id="556024056938947818">Google Chrome はパスワードを表示しようとしています。</translation> <translation id="5566025111015594046">Google Chrome(mDNS インバウンド)</translation> -<translation id="5633355459292055250">Chrome を開くときに確認する</translation> <translation id="5657226924540934362">このページに設定が表示されない場合は、<ph name="LINK_BEGIN" /> Chrome OS の設定<ph name="LINK_END" />を確認してください</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> は危険なファイルの可能性があるため、Chrome でブロックしました。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index f629b62f..792ff07 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -173,7 +173,6 @@ Google Chrome ვერ შეძლებს თქვენი პარამეტრების აღდგენას.</translation> <translation id="556024056938947818">Google Chrome ცდილობს პაროლების ჩვენებას.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">შეკითხვა Chrome-ის გახსნისას</translation> <translation id="5657226924540934362">თუ პარამეტრი ამ გვერდზე არ გამოჩნდება, ცადეთ მისი პოვნა <ph name="LINK_BEGIN" />Chrome OS-ის პარამეტრებში<ph name="LINK_END" /></translation> <translation id="565744775970812598">Chrome-მა დაბლოკა <ph name="FILE_NAME" />, რადგან ის შეიძლება სახიფათო იყოს.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{ამ განახლების მისასადაგებლად ადმინისტრატორი გთხოვთ Chrome-ის ხელახლა გაშვებას}=1{ამ განახლების მისასადაგებლად ადმინისტრატორი გთხოვთ Chrome-ის ხელახლა გაშვებას. თქვენი ინკოგნიტო ფანჯარა ხელახლა არ გაიხსნება.}other{ამ განახლების მისასადაგებლად ადმინისტრატორი გთხოვთ Chrome-ის ხელახლა გაშვებას. თქვენი # ინკოგნიტო ფანჯარა ხელახლა არ გაიხსნება.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb index 75e9d33..20015be 100644 --- a/chrome/app/resources/google_chrome_strings_kk.xtb +++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -172,7 +172,6 @@ Google Chrome параметрлеріңізді қалпына келтіре алмайды.</translation> <translation id="556024056938947818">Google Chrome құпия сөздерді көрсетпек.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chrome браузерін ашқанда сұралсын</translation> <translation id="5657226924540934362">Егер параметр бұл бетте көрсетілмесе, <ph name="LINK_BEGIN" /> Chrome операциялық жүйесінің параметрлері<ph name="LINK_END" /> бөлімінен қараңыз.</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> қауіпті болуы мүмкін болғандықтан, Chrome оны бөгеді.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb index cdf5df0..29eb86a1 100644 --- a/chrome/app/resources/google_chrome_strings_km.xtb +++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -172,7 +172,6 @@ Google Chrome មិនអាចសង្គ្រោះការកំណត់របស់អ្នកទេ។</translation> <translation id="556024056938947818">Google Chrome កំពុងព្យាយាមបង្ហាញពាក្យសម្ងាត់។</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">សួរនៅពេលខ្ញុំបើក Chrome</translation> <translation id="5657226924540934362">ប្រសិនបើការកំណត់មិនបង្ហាញនៅលើទំព័រនេះទេ សូមមើលនៅក្នុងការកំណត់កម្មវិធីរុករកតាមអ៊ីនធឺណិត <ph name="LINK_BEGIN" /> Chrome OS របស់អ្នក<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> អាចបង្កគ្រោះថ្នាក់ ដូច្នេះ Chrome បានរារាំងវា។</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index f9c871c0..e863bfc 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -166,7 +166,6 @@ <translation id="5430073640787465221">ನಿಮ್ಮ ಪ್ರಾಶಸ್ತ್ಯಗಳ ಫೈಲ್ ದೋಷಪೂರಿತವಾಗಿದೆ ಅಥವಾ ಅಮಾನ್ಯವಾಗಿದೆ. ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ Google Chrome ವಿಫಲಗೊಂಡಿದೆ.</translation> <translation id="556024056938947818">Google Chrome ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ತೋರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">ನಾನು Chrome ಅನ್ನು ತೆರೆದಾಗ ಕೇಳಿ</translation> <translation id="5657226924540934362">ಈ ಪುಟದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ ಒಂದು ಕಾಣಿಸದಿದ್ದರೆ, ನಿಮ್ಮ <ph name="LINK_BEGIN" />Chrome OS ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ<ph name="LINK_END" /> ನೋಡಿರಿ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಹಾಗಾಗಿ Chrome ಅದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{ಈ ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ವಿನಂತಿಸಿಕೊಂಡಿದ್ದಾರೆ}=1{ಈ ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ವಿನಂತಿಸಿಕೊಂಡಿದ್ದಾರೆ. ನಿಮ್ಮ ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}one{ಈ ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ವಿನಂತಿಸಿಕೊಂಡಿದ್ದಾರೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}other{ಈ ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ವಿನಂತಿಸಿಕೊಂಡಿದ್ದಾರೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 4be53848..fac9931d 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -172,7 +172,6 @@ Chrome에서 설정을 복구할 수 없습니다.</translation> <translation id="556024056938947818">Chrome에서 비밀번호를 표시하려고 합니다.</translation> <translation id="5566025111015594046">Chrome(mDNS-In)</translation> -<translation id="5633355459292055250">Chrome을 열 때 확인</translation> <translation id="5657226924540934362">페이지에 표시되지 않는 설정이 있다면 <ph name="LINK_BEGIN" /> Chrome OS 설정<ph name="LINK_END" />을 확인해 보세요.</translation> <translation id="565744775970812598"><ph name="FILE_NAME" />은(는) 위험할 수 있으므로 Chrome에서 차단했습니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index 40adac35..cdd49f3 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -172,7 +172,6 @@ Google Chrome жөндөөлөрүңүздү калыбына келтире албайт.</translation> <translation id="556024056938947818">Google Chrome сырсөздөрдү көрсөткөнгө аракет кылып жатат.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chrome'ду ачканда суралсын</translation> <translation id="5657226924540934362">Эгер жөндөө бул баракта көрүнбөсө, <ph name="LINK_BEGIN" /> Chrome OS жөндөөлөрүнөн<ph name="LINK_END" /> карап көрүңүз</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> файлы кооптуу болушу мүмкүн, ошондуктан Chrome аны бөгөттөп койду.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 30fe776..1f43d9f 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">ທ່ານລົງຊື່ເຂົ້າໃຊ້ Chrome ແລ້ວ.</translation> <translation id="2885378588091291677">ຕົວຈັດການໜ້າວຽກ</translation> <translation id="2888126860611144412">ກ່ຽວກັບ Chrome</translation> +<translation id="2926676257163822632">ລະຫັດຜ່ານງ່າຍແມ່ນລະຫັດຜ່ານທີ່ເດົາໄດ້ງ່າຍ. ອະນຸຍາດໃຫ້ Chrome <ph name="BEGIN_LINK" />ສ້າງ ແລະ ຈື່ລະຫັດຜ່ານຍາກສຳລັບທ່ານ<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome ບໍ່ອັບເດດ, ມີບາງຢ່າງຜິດພາດ. <ph name="BEGIN_LINK" />ແກ້ໄຂບັນຫາການອັບເດດ Chrome ແລະ ການອັບເດດທີ່ບໍ່ສຳເລັດ.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - ການເຂົ້າສູ່ລະບົບເຄືອຂ່າຍ - Chrome</translation> <translation id="3037838751736561277">Google Chrome ຢູ່ໃນໂໝດພື້ນຫຼັງ.</translation> @@ -172,7 +173,6 @@ Google Chrome ບໍ່ສາມາດກູ້ຄືນການຕັ້ງຄ່າໄດ້.</translation> <translation id="556024056938947818">Google Chrome ກໍາລັງພະຍາຍາມສະແດງລະຫັດຜ່ານ.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">ຖາມເມື່ອຂ້ອຍເປີດ Chrome</translation> <translation id="5657226924540934362">ຖ້າການຕັ້ງຄ່າບໍ່ສະແດງໃນໜ້ານີ້, ກະລຸນາກວດເບິ່ງໃນ <ph name="LINK_BEGIN" /> ການຕັ້ງຄ່າ Chrome OS<ph name="LINK_END" /> ຂອງທ່ານ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ອາດຈະອັນຕະລາຍ, ສະນັ້ນ Chrome ໄດ້ບລັອກມັນໄວ້ແລ້ວ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index d2da97aa..26d16f723 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -172,7 +172,6 @@ „Google Chrome“ negali atkurti nustatymų.</translation> <translation id="556024056938947818">„Google Chrome“ bando rodyti slaptažodžius.</translation> <translation id="5566025111015594046">„Google Chrome“ (mDNS-In)</translation> -<translation id="5633355459292055250">Klausti, kai atidarau „Chrome“</translation> <translation id="5657226924540934362">Jei nustatymai šiame puslapyje nerodomi, jų ieškokite <ph name="LINK_BEGIN" /> naršyklės „Chrome“ nustatymuose<ph name="LINK_END" /></translation> <translation id="565744775970812598">Failas „<ph name="FILE_NAME" />“ gali būti pavojingas, todėl „Chrome“ jį užblokavo.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index 54e7e608..1edcec9 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -168,7 +168,6 @@ <translation id="5430073640787465221">Jūsu preferenču fails ir bojāts vai nederīgs. Google Chrome nespēj atkopt jūsu iestatījumus.</translation> <translation id="556024056938947818">Google Chrome mēģina rādīt paroles.</translation> <translation id="5566025111015594046">Google Chrome (mDNS ienākošā datplūsma)</translation> -<translation id="5633355459292055250">Jautāt, kad atveru pārlūku Chrome</translation> <translation id="5657226924540934362">Ja šajā lapā iestatījums nav pieejams, skatiet to sadaļā <ph name="LINK_BEGIN" /> Chrome OS iestatījumi<ph name="LINK_END" />.</translation> <translation id="565744775970812598">Fails <ph name="FILE_NAME" /> var būt bīstams, tādēļ Chrome to bloķēja.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index e667055..eb928c113 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">Најавени сте на Chrome!</translation> <translation id="2885378588091291677">Управник со задачи</translation> <translation id="2888126860611144412">За Chrome</translation> +<translation id="2926676257163822632">Слабите лозинки се лесни за погаѓање. Дозволете Chrome да ви <ph name="BEGIN_LINK" />создаде и запомни силни лозинки<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome не се ажурираше, нешто тргна наопаку. <ph name="BEGIN_LINK" />Поправете ги проблемите со ажурирањето на Chrome и со неуспешните ажурирања.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Мрежно најавување - Chrome</translation> <translation id="3037838751736561277">Google Chrome е во заднински режим.</translation> @@ -172,7 +173,6 @@ Google Chrome не може да ги обнови вашите поставки.</translation> <translation id="556024056938947818">Google Chrome се обидува да прикаже лозинки.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Прашувај кога ќе го отворам Chrome</translation> <translation id="5657226924540934362">Ако некоја поставка не се прикажува на страницава, погледнете во <ph name="LINK_BEGIN" /> поставките за Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Датотеката <ph name="FILE_NAME" /> може да биде опасна, па затоа Chrome ја блокираше.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index fd0baaa..d28fe9c 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -173,7 +173,6 @@ നിങ്ങളുടെ ക്രമീകരണം വീണ്ടെടുക്കാൻ Google Chrome-ന് കഴിയില്ല.</translation> <translation id="556024056938947818">Google Chrome പാസ്വേഡുകൾ ദൃശ്യമാക്കാൻ ശ്രമിക്കുന്നു.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">ഞാൻ Chrome തുറക്കുമ്പോൾ ചോദിക്കുക</translation> <translation id="5657226924540934362">ഈ പേജിൽ ക്രമീകരണം കാണിക്കുന്നില്ലെങ്കിൽ, <ph name="LINK_BEGIN" /> Chrome OS ക്രമീകരണത്തിൽ<ph name="LINK_END" /> പരിശോധിക്കുക</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ, Chrome ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index 2d55ee6..31e221f 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -173,7 +173,6 @@ Google Chrome таны тохируулгыг дахин сэргээх боломжгүй байна.</translation> <translation id="556024056938947818">Google Chrome нууц харуулахыг хичээж байна.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Намайг Chrome-г нээх үед асуух</translation> <translation id="5657226924540934362">Хэрэв энэ хуудсан дээр тохиргоог харуулахгүй байгаа бол <ph name="LINK_BEGIN" /> Chrome үйлдлийн системийнхээ тохиргоо<ph name="LINK_END" /> дотроос хайна уу</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> аюултай байж болзошгүй тул үүнийг Chrome блок хийсэн.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index ba0a712..adc5b2b 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -170,7 +170,6 @@ Google Chrome तुमची सेटिंग्ज पुन्हा मिळवू शकत नाही.</translation> <translation id="556024056938947818">Google Chrome पासवर्ड दर्शवण्याचा प्रयत्न करत आहे.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-मध्ये)</translation> -<translation id="5633355459292055250">मी Chrome उघडल्यावर विचारा</translation> <translation id="5657226924540934362">या पेजवर सेटिंग दिसत नसल्यास, तुमच्या <ph name="LINK_BEGIN" /> Chrome OS सेटिंग्ज<ph name="LINK_END" /> मध्ये पाहा</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> धोकादायक असू शकते, त्यामुळे Chrom ने ते अवरोधित केले आहे.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index da834bf..fcb61e94 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Fail pilihan anda rosak atau tidak sah. Google Chrome tidak dapat mengembalikan tetapan anda.</translation> <translation id="556024056938947818">Google Chrome sedang cuba memaparkan kata laluan.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Tanya apabila saya membuka Chrome</translation> <translation id="5657226924540934362">Jika tetapan tidak ditunjukkan pada halaman ini, lihat dalam <ph name="LINK_BEGIN" /> tetapan OS Chrome<ph name="LINK_END" /> anda</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> mungkin berbahaya, jadi Chrome telah menyekat fail itu.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index 3177575..c65f451 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -172,7 +172,6 @@ Google Chrome သည် သင်၏ ဆက်တင်များကို ပြန်ပြီး မဖေါ်ထုတ်နိုင်ပါ။</translation> <translation id="556024056938947818">Google Chrome က စကားဝှက်များကို ပြပေးရန် ကြိုးစားနေသည်။</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chrome ကို ကျွန်ုပ်ဖွင့်လျှင်မေးရန်</translation> <translation id="5657226924540934362">ဤစာမျက်နှာပေါ်တွင် ဆက်တင်ကို မပြလျှင် သင်၏ <ph name="LINK_BEGIN" /> Chrome OS ဆက်တင်များ<ph name="LINK_END" /> တွင် ကြည့်ပါ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> သည် အန္တရာယ်ရှိနိုင်သောကြောင့် Chrome က ၎င်းကို ပိတ်ဆို့ထားပါသည်။</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index 2c4822c..df16179 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -168,7 +168,6 @@ Google Chrome ले तपाईंको सेटिङहरू पुन: प्राप्त गर्न सकदैन।</translation> <translation id="556024056938947818">Google Chrome ले पासवर्डहरू देखाउने प्रयास गरिरहेको छ।</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">मैले Chrome खोल्दा सोधियोस्</translation> <translation id="5657226924540934362">यो पृष्ठमा कुनै सेटिङ देखिएन भने आफ्नो <ph name="LINK_BEGIN" /> Chrome OS का सेटिङ<ph name="LINK_END" />मा गई हेर्नुहोस्</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> खतरनाक हुन सक्छ, त्यसैले Chrome ले यसमाथि रोक लगाएको छ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index 1580f03..a13ae12c 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -171,7 +171,6 @@ <translation id="5430073640787465221">Je bestand met voorkeuren is beschadigd of ongeldig. Google Chrome kan je instellingen niet herstellen.</translation> <translation id="556024056938947818">Google Chrome probeert wachtwoorden weer te geven.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Vragen als ik Chrome open</translation> <translation id="5657226924540934362">Als je een instelling niet ziet op deze pagina, kijk je in de <ph name="LINK_BEGIN" />Chrome OS-instellingen<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> kan gevaarlijk zijn en is daarom door Chrome geblokkeerd.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Je beheerder vraagt je Chrome opnieuw te starten om deze update uit te voeren.}=1{Je beheerder vraagt je Chrome opnieuw te starten om deze update uit te voeren. Je incognitovenster kan niet opnieuw worden geopend.}other{Je beheerder vraagt je Chrome opnieuw te starten om deze update uit te voeren. Je # incognitovensters kunnen niet opnieuw worden geopend.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index b65653f..991d8d8d 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -75,6 +75,7 @@ <translation id="2871893339301912279">Du er nå logget på Chrome.</translation> <translation id="2885378588091291677">Oppgavebehandling</translation> <translation id="2888126860611144412">Om Chrome</translation> +<translation id="2926676257163822632">Svake passord er enkle å gjette. La Chrome <ph name="BEGIN_LINK" />opprette og huske sterke passord for deg<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome ble ikke oppdatert. Noe gikk galt. <ph name="BEGIN_LINK" />Løs problemer med Chrome-oppdateringer og mislykkede oppdateringer.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – nettverkspålogging – Chrome</translation> <translation id="3037838751736561277">Google Chrome er i bakgrunnsmodus.</translation> @@ -164,7 +165,6 @@ <translation id="5430073640787465221">Innstillingsfilen er skadet eller ugyldig. Google Chrome kan ikke gjenopprette innstillingene dine.</translation> <translation id="556024056938947818">Google Chrome prøver å vise passord.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-Inn)</translation> -<translation id="5633355459292055250">Spør når jeg åpner Chrome</translation> <translation id="5657226924540934362">Hvis en innstilling ikke vises på denne siden, kan du gå til <ph name="LINK_BEGIN" /> innstillingene for Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> kan være farlig, så Chrome har blokkert den.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb index 59c3c6b5..2f1b0462 100644 --- a/chrome/app/resources/google_chrome_strings_or.xtb +++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -172,7 +172,6 @@ ଆପଣଙ୍କର ସେଟିଂସ୍ ପୁନରୁଦ୍ଧାର କରିବାକୁ Google Chrome ଅକ୍ଷମ ଅଟେ।</translation> <translation id="556024056938947818">Google Chrome ପାସ୍ୱାର୍ଡ ଦେଖାଇବାକୁ ଚାହୁଁଛି।</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">ମୁଁ Chrome ଖୋଲିଲେ ପଚାରନ୍ତୁ</translation> <translation id="5657226924540934362">ଯଦି ଏହି ପୃଷ୍ଠାରେ ଏକ ସେଟିଂ ଦେଖାଯାଉ ନାହିଁ, ତେବେ ଆପଣଙ୍କର <ph name="LINK_BEGIN" />Chrome OS ସେଟିଂସ୍<ph name="LINK_END" />ରେ ଦେଖନ୍ତୁ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ବିପଜ୍ଜନକ ହୋଇପାରେ, ତେଣୁ Chrome ଏହାକୁ ବ୍ଲକ୍ କରିଦେଇଛି।</translation> <translation id="5678190148303298925">{COUNT,plural, =0{ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ କହୁଛନ୍ତି ଯେ ଏହି ଅପ୍ଡେଟ୍ ଲାଗୁ କରିବାକୁ ଆପଣ Chromeକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ।}=1{ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ କହୁଛନ୍ତି ଯେ ଏହି ଅପ୍ଡେଟ୍ ଲାଗୁ କରିବାକୁ ଆପଣ Chromeକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ। ଆପଣଙ୍କର ଇନ୍କଗ୍ନିଟୋ ୱିଣ୍ଡୋ ପୁଣି ଖୋଲିବ ନାହିଁ।}other{ଆପଣଙ୍କର ଆଡ୍ମିନିଷ୍ଟ୍ରେଟର୍ କହୁଛନ୍ତି ଯେ ଏହି ଅପ୍ଡେଟ୍ ଲାଗୁ କରିବାକୁ ଆପଣ Chromeକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ। ଆପଣଙ୍କର #ଟି ଇନ୍କଗ୍ନିଟୋ ୱିଣ୍ଡୋ ପୁଣି ଖୋଲିବ ନାହିଁ।}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 97ba8b7..ca7fb35 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -172,7 +172,6 @@ Google Chrome ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਮੁੜ-ਹਾਸਲ ਨਹੀਂ ਕਰ ਸਕਿਆ।</translation> <translation id="556024056938947818">Google Chrome ਪਾਸਵਰਡ ਦਿਖਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ।</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">ਮੇਰੇ ਵੱਲੋਂ Chrome ਨੂੰ ਖੋਲ੍ਹੇ ਜਾਣ 'ਤੇ ਪੁੱਛੋ</translation> <translation id="5657226924540934362">ਜੇ ਸੈਟਿੰਗ ਇਸ ਪੰਨੇ 'ਤੇ ਨਹੀਂ ਦਿਸਦੀ, ਤਾਂ ਆਪਣੀਆਂ <ph name="LINK_BEGIN" /> Chrome OS ਸੈਟਿੰਗਾਂ<ph name="LINK_END" /> ਵਿੱਚ ਦੇਖੋ</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ, ਇਸ ਲਈ Chrome ਨੇ ਇਸਨੂੰ ਬਲਾਕ ਕਰ ਦਿੱਤਾ ਹੈ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index 8cbdab9..4790c89d 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -75,6 +75,7 @@ <translation id="2871893339301912279">Jesteś zalogowany w Chrome.</translation> <translation id="2885378588091291677">Menedżer zadań</translation> <translation id="2888126860611144412">Chrome – informacje</translation> +<translation id="2926676257163822632">Słabe hasła są łatwe do odgadnięcia. Pozwól Chrome <ph name="BEGIN_LINK" />utworzyć i zapamiętać silne hasła<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Coś poszło nie tak i nie udało się zaktualizować Chrome. <ph name="BEGIN_LINK" />Napraw nieudane aktualizacje Chrome i rozwiąż inne problemy z aktualizacjami<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – logowanie do sieci – Chrome</translation> <translation id="3037838751736561277">Google Chrome jest w trybie działania w tle</translation> @@ -164,7 +165,6 @@ <translation id="5430073640787465221">Plik ustawień jest uszkodzony lub nieprawidłowy. Google Chrome nie może odzyskać ustawień.</translation> <translation id="556024056938947818">Google Chrome próbuje pokazać hasła.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Pytaj, gdy otwieram Chrome</translation> <translation id="5657226924540934362">Jeśli ustawienia nie widać na tej stronie, zajrzyj do <ph name="LINK_BEGIN" />ustawień systemu operacyjnego Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Plik <ph name="FILE_NAME" /> może być niebezpieczny, dlatego został zablokowany przez Chrome.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Administrator prosi o ponowne uruchomienie Chrome, by przeglądarka mogła zainstalować tę aktualizację}=1{Administrator prosi o ponowne uruchomienie Chrome, by przeglądarka mogła zainstalować tę aktualizację. Okno incognito nie otworzy się ponownie.}few{Administrator prosi o ponowne uruchomienie Chrome, by przeglądarka mogła zainstalować tę aktualizację. # okna incognito nie otworzą się ponownie.}many{Administrator prosi o ponowne uruchomienie Chrome, by przeglądarka mogła zainstalować tę aktualizację. # okien incognito nie otworzy się ponownie.}other{Administrator prosi o ponowne uruchomienie Chrome, by przeglądarka mogła zainstalować tę aktualizację. # okna incognito nie otworzy się ponownie.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 3f2eb9ee..54fc6be 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -75,6 +75,7 @@ <translation id="2871893339301912279">Você fez login no Google Chrome.</translation> <translation id="2885378588091291677">Gerenciador de tarefas</translation> <translation id="2888126860611144412">Sobre o Google Chrome</translation> +<translation id="2926676257163822632">Senhas fracas são fáceis de adivinhar. Deixe o Chrome <ph name="BEGIN_LINK" />criar e guardar senhas fortes para você<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">A atualização do Chrome não foi concluída. Algo deu errado. <ph name="BEGIN_LINK" />Corrija as atualizações com falhas e os problemas de atualização do Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Login na rede - Chrome</translation> <translation id="3037838751736561277">O Google Chrome está em modo de segundo plano.</translation> @@ -164,7 +165,6 @@ <translation id="5430073640787465221">Seu arquivo de preferências está corrompido ou é inválido. O Google Chrome não foi capaz de recuperar suas configurações.</translation> <translation id="556024056938947818">O Google Chrome está tentando mostrar senhas.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Perguntar ao abrir o Chrome</translation> <translation id="5657226924540934362">Se uma configuração não for exibida nesta página, verifique as <ph name="LINK_BEGIN" />configurações do Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">O arquivo <ph name="FILE_NAME" /> pode ser perigoso. Por isso, ele foi bloqueado pelo Chrome.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Seu administrador pede que você reinicie o Chrome para que esta atualização seja feita.}=1{Seu administrador pede que você reinicie o Chrome para que esta atualização seja feita. Sua janela anônima não será aberta novamente.}one{Seu administrador pede que você reinicie o Chrome para que esta atualização seja feita. Sua janela anônima não será aberta novamente.}other{Seu administrador pede que você reinicie o Chrome para que esta atualização seja feita. Suas # janelas anônimas não serão abertas novamente.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index 6716ad72..70570c99 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">O ficheiro de preferências está danificado ou não é válido. O Google Chrome não consegue recuperar as suas definições.</translation> <translation id="556024056938947818">O Google Chrome está a tentar mostrar palavras-passe.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Perguntar quando abrir o Chrome</translation> <translation id="5657226924540934362">Se não encontrar uma definição nesta página, procure nas <ph name="LINK_BEGIN" /> Definições do Chrome OS<ph name="LINK_END" />.</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> pode ser perigoso, por isso o Chrome bloqueou-o.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 1871e44..4b4df4b 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Fișierul dvs. de preferințe este fie deteriorat, fie nevalid. Google Chrome nu poate recupera setările dvs.</translation> <translation id="556024056938947818">Google Chrome încearcă să afișeze parolele.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Întreabă atunci când deschid Chrome</translation> <translation id="5657226924540934362">Dacă o setare nu apare în pagină, încearcă <ph name="LINK_BEGIN" /> setările sistemului de operare Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Este posibil ca <ph name="FILE_NAME" /> să fie periculos, așadar Chrome l-a blocat.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 3af70129..88ef4730 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">Файл настроек поврежден или недействителен. Google Chrome не может восстановить ваши параметры.</translation> <translation id="556024056938947818">Вводимые пароли будут отображаться в Google Chrome.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Спрашивать во время запуска Chrome</translation> <translation id="5657226924540934362">Если нужного параметра нет на этой странице, откройте <ph name="LINK_BEGIN" />настройки Chrome OS<ph name="LINK_END" />.</translation> <translation id="565744775970812598">Chrome заблокировал файл <ph name="FILE_NAME" /> как потенциально опасный.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Администратор просит перезапустить Chrome для установки обновления.}=1{Администратор просит перезапустить Chrome для установки обновления. Окно в режиме инкогнито не будет открыто повторно.}one{Администратор просит перезапустить Chrome для установки обновления. # окно в режиме инкогнито не будет открыто повторно.}few{Администратор просит перезапустить Chrome для установки обновления. # окна в режиме инкогнито не будут открыты повторно.}many{Администратор просит перезапустить Chrome для установки обновления. # окон в режиме инкогнито не будут открыты повторно.}other{Администратор просит перезапустить Chrome для установки обновления. # окна в режиме инкогнито не будут открыты повторно.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index 9fd3d4c..6df7dcab 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -172,7 +172,6 @@ Google Chrome හට ඔබගේ සැකසුම් ප්රතිසාධනය කිරීමට නොහැක.</translation> <translation id="556024056938947818">Google Chrome මුරපද පෙන්වීමට උත්සහ කරයි.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">මා Chrome විවෘත කළ විට අසන්න</translation> <translation id="5657226924540934362">මෙම පිටුවෙහි සැකසීමක් නොපෙන්වන්නේ නම්, ඔබේ <ph name="LINK_BEGIN" /> Chrome OS සැකසීම්<ph name="LINK_END" /> තුළ සොයා බලන්න</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> අනතුරුදායක විය හැකිය, එම නිසා Chrome එය අවහිර කර ඇත.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 9765772..c9c6967 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -77,6 +77,7 @@ <translation id="2871893339301912279">Ste prihlásený/-á do prehliadača Chrome.</translation> <translation id="2885378588091291677">Správca úloh</translation> <translation id="2888126860611144412">O prehliadači Chrome</translation> +<translation id="2926676257163822632">Slabé heslá sa dajú ľahko uhádnuť. Povoľte Chromu, <ph name="BEGIN_LINK" />aby vám vytváral silné heslá a pamätal si ich<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome sa neaktualizoval. Vyskytol sa problém. <ph name="BEGIN_LINK" />Vyriešiť problémy so sťahovaním aktualizácií Chromu a neúspešnými aktualizáciami<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – prihlásenie do siete – Chrome</translation> <translation id="3037838751736561277">Google Chrome je v režime na pozadí.</translation> @@ -170,7 +171,6 @@ Prehliadač Google Chrome nedokáže obnoviť vaše nastavenia.</translation> <translation id="556024056938947818">Prehliadač Google Chrome sa snaží zobraziť heslá.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Opýtať sa pri otvorení Chromu</translation> <translation id="5657226924540934362">Ak nevidíte určité nastavenie na tejto stránke, skontrolujte <ph name="LINK_BEGIN" />nastavenia operačného systému Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný, a preto ho Chrome zablokoval.</translation> <translation id="5678190148303298925">{COUNT,plural, =0{Správca vás žiada o nové spustenie Chromu, aby sa použila táto aktualizácia}=1{Správca vás žiada o nové spustenie Chromu, aby sa použila táto aktualizácia. Vaše okno inkognito sa neotvorí.}few{Správca vás žiada o nové spustenie Chromu, aby sa použila táto aktualizácia. Vaše # okná inkognito sa neotvoria.}many{Správca vás žiada o nové spustenie Chromu, aby sa použila táto aktualizácia. Your # Incognito windows won't reopen.}other{Správca vás žiada o nové spustenie Chromu, aby sa použila táto aktualizácia. Vašich # okien inkognito sa neotvorí.}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index 6c01cbbe..4fea611 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -172,7 +172,6 @@ Google Chrome ne more obnoviti vaših nastavitev.</translation> <translation id="556024056938947818">Google Chrome poskuša prikazati gesla.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Vprašaj, ko odprem Chrome</translation> <translation id="5657226924540934362">Če nastavitev ni prikazana na tej strani, preverite <ph name="LINK_BEGIN" /> nastavitve sistema OS Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Datoteka <ph name="FILE_NAME" /> je morda nevarna, zato jo je Chrome blokiral.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index e2b0c15..d845515 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -172,7 +172,6 @@ Google Chrome nuk është në gjendje të rikuperojë cilësimet e tua.</translation> <translation id="556024056938947818">Google Chrome po përpiqet të shfaqë fjalëkalimet.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Pyet kur unë hap Chrome</translation> <translation id="5657226924540934362">Nëse cilësimi nuk shfaqet në këtë faqe, shiko te <ph name="LINK_BEGIN" /> cilësimet e sistemit operativ të Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> mund të jetë i rrezikshëm, prandaj Chrome e ka bllokuar.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb index 1c2e3486..07f4510 100644 --- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb +++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">Prijavljeni ste u Chrome!</translation> <translation id="2885378588091291677">Menadžer zadataka</translation> <translation id="2888126860611144412">O Chrome pregledaču</translation> +<translation id="2926676257163822632">Slabe lozinke lako mogu da se pogode. Dozvolite da Chrome <ph name="BEGIN_LINK" />pravi i pamti jake lozinke za vas<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome se nije ažurirao. Došlo je do greške. <ph name="BEGIN_LINK" />Otklonite probleme sa ažuriranjem Chrome-a i neuspela ažuriranja.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – prijavljivanje na mrežu – Chrome</translation> <translation id="3037838751736561277">Google Chrome je u pozadinskom režimu.</translation> @@ -172,7 +173,6 @@ Google Chrome ne može da vrati podešavanja.</translation> <translation id="556024056938947818">Google Chrome pokušava da prikaže lozinke.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Pitaj kada otvaram Chrome</translation> <translation id="5657226924540934362">Ako se podešavanje ne prikazuje na ovoj stranici, potražite ga u <ph name="LINK_BEGIN" /> podešavanjima Chrome OS-a<ph name="LINK_END" /></translation> <translation id="565744775970812598">Datoteka <ph name="FILE_NAME" /> je možda opasna, pa ju je Chrome blokirao.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index d0c57bc6..7606a6d 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -79,6 +79,7 @@ <translation id="2871893339301912279">Пријављени сте у Chrome!</translation> <translation id="2885378588091291677">Менаџер задатака</translation> <translation id="2888126860611144412">О Chrome прегледачу</translation> +<translation id="2926676257163822632">Слабе лозинке лако могу да се погоде. Дозволите да Chrome <ph name="BEGIN_LINK" />прави и памти јаке лозинке за вас<ph name="END_LINK" />.</translation> <translation id="2929907241665500097">Chrome се није ажурирао. Дошло је до грешке. <ph name="BEGIN_LINK" />Отклоните проблеме са ажурирањем Chrome-а и неуспела ажурирања.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – пријављивање на мрежу – Chrome</translation> <translation id="3037838751736561277">Google Chrome је у позадинском режиму.</translation> @@ -172,7 +173,6 @@ Google Chrome не може да врати подешавања.</translation> <translation id="556024056938947818">Google Chrome покушава да прикаже лозинке.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Питај када отварам Chrome</translation> <translation id="5657226924540934362">Ако се подешавање не приказује на овој страници, потражите га у <ph name="LINK_BEGIN" /> подешавањима Chrome ОС-а<ph name="LINK_END" /></translation> <translation id="565744775970812598">Датотека <ph name="FILE_NAME" /> је можда опасна, па ју је Chrome блокирао.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 02b48f65..fbd64d5 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -172,7 +172,6 @@ Google Chrome kan inte återställa dina inställningar.</translation> <translation id="556024056938947818">Google Chrome försöker visa lösenord.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Fråga när jag öppnar Chrome</translation> <translation id="5657226924540934362">Om en inställning saknas på den här sidan tittar du i <ph name="LINK_BEGIN" /> inställningarna för Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> kan vara skadlig och har blockerats av Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 1bf8ba06..ff57d86 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -173,7 +173,6 @@ Google Chrome haiwezi kufufua mipangilio yako.</translation> <translation id="556024056938947818">Google Chrome inajaribu kuonyesha manenosiri.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Uliza ninapofungua Chrome</translation> <translation id="5657226924540934362">Ikiwa mipangilio haionekani kwenye ukurasa huu, angalia katika <ph name="LINK_BEGIN" /> mipangilio ya mfumo wa uendeshaji wa Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Huenda <ph name="FILE_NAME" /> ni hatari, kwa hivyo Chromium imeizuia.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index e922f56..950cf98c 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">உங்கள் விருப்பத்தேர்வுகளின் கோப்பு சிதைவடைந்துள்ளது அல்லது தவறானது. உங்கள் அமைப்புகளை Google Chrome ஆல் மீட்டெடுக்க முடியவில்லை.</translation> <translation id="556024056938947818">Google Chrome ஆனது கடவுச்சொற்களைக் காட்ட முயற்சிக்கிறது.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">நான் Chromeமைத் திறக்கும்போது கேள்</translation> <translation id="5657226924540934362">இந்தப் பக்கத்தில் ஓர் அமைப்பு காட்டப்படவில்லை எனில் அதை <ph name="LINK_BEGIN" /> Chrome OS அமைப்புகளில்<ph name="LINK_END" /> பார்க்கவும்</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> ஆபத்தானதாக இருக்கலாம் என்பதால் Chrome அதைத் தடுத்துள்ளது.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index 6feab3bbe..e76813f 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -165,7 +165,6 @@ <translation id="5430073640787465221">మీ ప్రాధాన్యతల ఫైల్ పాడైంది లేదా చెల్లదు. Google Chrome మీ సెట్టింగ్లను తిరిగి పొందలేకపోయింది.</translation> <translation id="556024056938947818">Google Chrome పాస్వర్డ్లను చూపడానికి ప్రయత్నిస్తోంది.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">నేను Chrome తెరిచినప్పుడు అడుగు</translation> <translation id="5657226924540934362">ఏదైనా సెట్టింగ్ ఈ పేజీలో కనపడకపోతే, మీ <ph name="LINK_BEGIN" /> Chrome OS సెట్టింగ్లు<ph name="LINK_END" />లో చూడండి</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> హానికరం కావచ్చు, కావున Chrome దాన్ని బ్లాక్ చేసింది.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index 4b90913..68ee9d4 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -165,7 +165,6 @@ <translation id="5430073640787465221">ไฟล์ค่ากำหนดของคุณขัดข้องหรือไม่ถูกต้อง Google Chrome ไม่สามารถกู้คืนการตั้งค่าของคุณได้</translation> <translation id="556024056938947818">Google Chrome กำลังพยายามแสดงรหัสผ่าน</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">ถามเมื่อฉันเปิด Chrome</translation> <translation id="5657226924540934362">หากการตั้งค่าไม่แสดงในหน้านี้ โปรดดูที่<ph name="LINK_BEGIN" />การตั้งค่า Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> อาจเป็นอันตราย Chrome จึงบล็อกไว้</translation> <translation id="5678190148303298925">{COUNT,plural, =0{ผู้ดูแลระบบขอให้คุณเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดตนี้}=1{ผู้ดูแลระบบขอให้คุณเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดตนี้ หน้าต่างที่ไม่ระบุตัวตนจะไม่เปิดให้อีก}other{ผู้ดูแลระบบขอให้คุณเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดตนี้ หน้าต่างที่ไม่ระบุตัวตนจำนวน # หน้าต่างจะไม่เปิดให้อีก}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 80a947e..2531a9e7 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -166,7 +166,6 @@ <translation id="5430073640787465221">Tercih dosyanız bozuk veya geçersiz. Google Chrome, ayarlarınızı kurtaramıyor.</translation> <translation id="556024056938947818">Google Chrome şifreleri göstermeyi deniyor.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chrome'u açtığımda sor</translation> <translation id="5657226924540934362">Bir ayar bu sayfada görünmüyorsa <ph name="LINK_BEGIN" /> Chromium OS ayarlarınıza<ph name="LINK_END" /> bakın</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> tehlikeli olabileceği için Chrome tarafından engellendi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index e1236a8..257d7a1 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -75,6 +75,7 @@ <translation id="2871893339301912279">Ви ввійшли в Chrome.</translation> <translation id="2885378588091291677">Диспетчер завдань</translation> <translation id="2888126860611144412">Про Chrome</translation> +<translation id="2926676257163822632">Ненадійні паролі можна легко вгадати. Тому радимо <ph name="BEGIN_LINK" />створювати й зберігати безпечні паролі<ph name="END_LINK" /> в Chrome.</translation> <translation id="2929907241665500097">Не вдалось оновити веб-переглядач Chrome. <ph name="BEGIN_LINK" />Вирішіть проблеми з оновленням Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Вхід у мережу – Chrome</translation> <translation id="3037838751736561277">Google Chrome у фоновому режимі.</translation> @@ -164,7 +165,6 @@ <translation id="5430073640787465221">Ваш файл налаштувань пошкоджений або недійсний. Google Chrome не може відновити ваші налаштування.</translation> <translation id="556024056938947818">Google Chrome намагається показати паролі.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Запитувати, коли я відкриваю Chrome</translation> <translation id="5657226924540934362">Якщо налаштування не з'явиться на цій сторінці, пошукайте його в <ph name="LINK_BEGIN" /> налаштуваннях ОС Chrome<ph name="LINK_END" /></translation> <translation id="565744775970812598">Файл <ph name="FILE_NAME" /> може бути небезпечним, тому Chrome заблокував його.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 6ab4760..db8835f 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -172,7 +172,6 @@ Google Chrome آپ کی ترتیبات کو بازیافت کرنے سے قاصر ہے۔</translation> <translation id="556024056938947818">Google Chrome پاس ورڈز دکھانے کی کوشش کر رہا ہے۔</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">جب میں Chrome کھولتا ہوں تو پوچھیں</translation> <translation id="5657226924540934362">اگر اس صفحے پر کوئی ترتیب دکھائی نہیں دے رہی ہے تو اپنے <ph name="LINK_BEGIN" /> Chrome OS کی ترتیبات<ph name="LINK_END" /> میں دیکھیں</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> خطرناک ہو سکتی ہے، اس لیے Chrome نے اسے مسدود کر دیا ہے۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index 874f72e..d385cb9 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -170,7 +170,6 @@ Google Chrome sozlamalaringizni qaytadan tiklay olmadi.</translation> <translation id="556024056938947818">Kirtilgan parollar Google Chrome‘da ko‘rsatiladi.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Chrome ochilganda soʻralsin</translation> <translation id="5657226924540934362">Agar sozlama bu sahifada chiqmasa, <ph name="LINK_BEGIN" /> Chrome OS sozlamalarini<ph name="LINK_END" /> tekshiring.</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> zararli bo‘lishi mumkin, shuning uchun u Chrome tomonidan bloklandi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index ddddc26..1b9ab64f 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -168,7 +168,6 @@ <translation id="5430073640787465221">Tệp tùy chọn của bạn bị hỏng hoặc không hợp lệ. Google Chrome không thể khôi phục cài đặt của bạn.</translation> <translation id="556024056938947818">Google Chrome đang cố gắng hiển thị mật khẩu.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Hỏi khi tôi mở Chrome</translation> <translation id="5657226924540934362">Nếu một tùy chọn cài đặt không hiển thị trên trang này, hãy tìm trong mục <ph name="LINK_BEGIN" /> các tùy cài đặt của Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> có thể nguy hiểm, do đó Chrome đã chặn tệp.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index c36003c..d7dadbc 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -164,7 +164,6 @@ <translation id="5430073640787465221">您的偏好设置文件已损坏或无效。Google Chrome 浏览器无法恢复您的设置。</translation> <translation id="556024056938947818">Google Chrome 正尝试显示密码。</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">在我打开 Chrome 时询问</translation> <translation id="5657226924540934362">如果此页面中未显示某项设置,请在 <ph name="LINK_BEGIN" /> Chrome 操作系统设置<ph name="LINK_END" />中查找</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> 可能存在危险,因此 Chrome 已将其拦截。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index e51a5d2a3..cd9e90d5 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -172,7 +172,6 @@ Google Chrome 無法復原您的設定。</translation> <translation id="556024056938947818">Google Chrome 即將顯示密碼。</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">開啟 Chrome 時詢問我</translation> <translation id="5657226924540934362">如果此頁面沒有顯示設定,請前往 <ph name="LINK_BEGIN" />Chrome 作業系統設定<ph name="LINK_END" />。</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> 可能不安全,因此 Chrome 已封鎖此檔案。</translation> <translation id="5678190148303298925">{COUNT,plural, =0{管理員要求您重新啟動 Chrome,以套用此更新}=1{管理員要求您重新啟動 Chrome,以套用此更新。您的無痕式視窗不會重新開啟。}other{管理員要求您重新啟動 Chrome,以套用此更新。您的 # 個無痕式視窗不會重新開啟。}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index 7819007..47f67f9 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -166,7 +166,6 @@ Google Chrome 無法復原你的設定。</translation> <translation id="556024056938947818">Google Chrome 即將顯示密碼。</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">開啟 Chrome 時詢問我</translation> <translation id="5657226924540934362">如果這個頁面上未顯示你的設定,請檢查 <ph name="LINK_BEGIN" /> Chrome 作業系統設定<ph name="LINK_END" /></translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> 可能不安全,因此遭到 Chrome 封鎖。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index a4a778e..3115aee 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -172,7 +172,6 @@ I-Google Chrome ayikwazi ukuthola izilungiselelo zakho.</translation> <translation id="556024056938947818">I-Google Chrome izama ukubonisa amaphasiwedi.</translation> <translation id="5566025111015594046">I-Google Chrome (mDNS-In)</translation> -<translation id="5633355459292055250">Buza uma ngivula i-Chrome</translation> <translation id="5657226924540934362">Uma isilungiselelo singaveli kuleli khasi, bheka <ph name="LINK_BEGIN" /> kuzilungiselelo zakho ze-Chrome OS<ph name="LINK_END" /></translation> <translation id="565744775970812598">I-<ph name="FILE_NAME" /> kungenzeka ibe ingozi, ngakho-ke i-Chrome iyivimbile.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 8e4d8b96..bba5414 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -4159,6 +4159,8 @@ "metrics/perf/windowed_incognito_observer.h", "nearby_sharing/attachment_info.cc", "nearby_sharing/attachment_info.h", + "nearby_sharing/bluetooth_advertising_interval_client.cc", + "nearby_sharing/bluetooth_advertising_interval_client.h", "nearby_sharing/constants.h", "nearby_sharing/fast_initiation_manager.cc", "nearby_sharing/fast_initiation_manager.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index cdfc5f7..d53c197 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -5426,6 +5426,14 @@ FEATURE_VALUE_TYPE(features::kEnterpriseReportingInChromeOS)}, #endif // !defined(OS_CHROMEOS) +#if !defined(OS_ANDROID) + {"enterprise-realtime-extension-request", + flag_descriptions::kEnterpriseRealtimeExtensionRequestName, + flag_descriptions::kEnterpriseRealtimeExtensionRequestDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(features::kEnterpriseRealtimeExtensionRequest)}, +#endif // !defined(OS_ANDROID) + {"enable-unsafe-webgpu", flag_descriptions::kUnsafeWebGPUName, flag_descriptions::kUnsafeWebGPUDescription, kOsMac | kOsWin, SINGLE_VALUE_TYPE(switches::kEnableUnsafeWebGPU)},
diff --git a/chrome/browser/accessibility/accessibility_ui.cc b/chrome/browser/accessibility/accessibility_ui.cc index 42d79b56..f3152a4 100644 --- a/chrome/browser/accessibility/accessibility_ui.cc +++ b/chrome/browser/accessibility/accessibility_ui.cc
@@ -260,28 +260,6 @@ std::move(callback).Run(base::RefCountedString::TakeString(&json_string)); } -bool MatchesPropertyFilters( - const std::vector<AXPropertyFilter>& property_filters, - const std::string& text) { - bool allow = false; - for (const auto& filter : property_filters) { - if (base::MatchPattern(text, filter.match_str)) { - switch (filter.type) { - case AXPropertyFilter::ALLOW_EMPTY: - allow = true; - break; - case AXPropertyFilter::ALLOW: - allow = (!base::MatchPattern(text, "*=''")); - break; - case AXPropertyFilter::DENY: - allow = false; - break; - } - } - } - return allow; -} - std::string RecursiveDumpAXPlatformNodeAsString( ui::AXPlatformNode* node, int indent, @@ -293,7 +271,8 @@ std::vector<std::string> attributes = base::SplitString( line, " ", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); for (std::string attribute : attributes) { - if (MatchesPropertyFilters(property_filters, attribute)) { + if (content::AccessibilityTreeFormatter::MatchesPropertyFilters( + property_filters, attribute, false)) { str += attribute + " "; } }
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc index ff4fd75..e1cd62f 100644 --- a/chrome/browser/android/bookmarks/bookmark_bridge.cc +++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -920,6 +920,9 @@ return false; if (partner_bookmarks_shim_->IsPartnerBookmark(node)) return partner_bookmarks_shim_->IsEditable(node); + if (reading_list_manager_->IsReadingListBookmark(node)) + return reading_list_manager_->GetRoot() != node; + return managed_bookmark_service_->CanBeEditedByUser(node); }
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc index 85ef13ec..dbc3508d 100644 --- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc +++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -219,11 +219,14 @@ // The new behavior for multi-profile apps is to not close the app based on // which windows are open. Rather, the app must be explicitly closed via // the Quit menu, which will terminate the app (and the browser will be - // notified of the closed mojo pipe). - // https://crbug.com/1080729 + // notified of the closed mojo pipe). The app is closed automatically when + // it has been uninstalled for all profiles. + // https://crbug.com/1080729 for new behavior. + // https://crbug.com/1139254,1132223 for closing when profiles close. if (IsMultiProfile() && base::FeatureList::IsEnabled(features::kAppShimNewCloseBehavior)) { - return false; + return profiles.empty() && + AppShimRegistry::Get()->GetInstalledProfilesForApp(app_id).empty(); } // The old behavior, and the behavior for single-profile apps, is to close @@ -243,16 +246,12 @@ } AppShimManager::AppShimManager(std::unique_ptr<Delegate> delegate) - : delegate_(std::move(delegate)), weak_factory_(this) { + : delegate_(std::move(delegate)), + profile_manager_(g_browser_process->profile_manager()), + weak_factory_(this) { AppShimHostBootstrap::SetClient(this); - // This is instantiated in BrowserProcessImpl::PreMainMessageLoopRun with - // AppShimListener. Since PROFILE_CREATED is not fired until - // ProfileManager::GetLastUsedProfile/GetLastOpenedProfiles, this should catch - // notifications for all profiles. - registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED, - content::NotificationService::AllBrowserContextsAndSources()); - registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, - content::NotificationService::AllBrowserContextsAndSources()); + if (profile_manager_) + profile_manager_->AddObserver(this); BrowserList::AddObserver(this); } @@ -261,6 +260,14 @@ AppShimHostBootstrap::SetClient(nullptr); } +void AppShimManager::OnBeginTearDown() { + avatar_menu_.reset(); + if (profile_manager_) + profile_manager_->RemoveObserver(this); + profile_manager_ = nullptr; + weak_factory_.InvalidateWeakPtrs(); +} + AppShimHost* AppShimManager::FindHost(Profile* profile, const web_app::AppId& app_id) { auto found_app = apps_.find(app_id); @@ -626,18 +633,6 @@ return g_browser_process->platform_part()->app_shim_manager(); } -void AppShimManager::CloseShimsForProfile(Profile* profile) { - for (auto iter_app = apps_.begin(); iter_app != apps_.end();) { - AppState* app_state = iter_app->second.get(); - app_state->profiles.erase(profile); - - if (app_state->ShouldDeleteAppState()) - iter_app = apps_.erase(iter_app); - else - ++iter_app; - } -} - void AppShimManager::LoadProfileAndApp(const base::FilePath& profile_path, const web_app::AppId& app_id, LoadProfileAndAppCallback callback) { @@ -710,19 +705,19 @@ } Profile* AppShimManager::ProfileForPath(const base::FilePath& full_path) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - Profile* profile = profile_manager->GetProfileByPath(full_path); + if (!profile_manager_) + return nullptr; + Profile* profile = profile_manager_->GetProfileByPath(full_path); // Use IsValidProfile to check if the profile has been created. - return profile && profile_manager->IsValidProfile(profile) ? profile - : nullptr; + return profile && profile_manager_->IsValidProfile(profile) ? profile + : nullptr; } void AppShimManager::LoadProfileAsync( const base::FilePath& full_path, base::OnceCallback<void(Profile*)> callback) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - profile_manager->LoadProfileByPath(full_path, false, std::move(callback)); + profile_manager_->LoadProfileByPath(full_path, false, std::move(callback)); } void AppShimManager::WaitForAppRegistryReadyAsync( @@ -755,7 +750,7 @@ Profile* profile = profile_path.empty() ? nullptr : ProfileForPath(profile_path); if (!profile) - profile = g_browser_process->profile_manager()->GetLastUsedProfile(); + profile = profile_manager_->GetLastUsedProfile(); if (!profile) return; Browser* browser = @@ -858,34 +853,39 @@ std::vector<base::FilePath>(), base::DoNothing()); } -void AppShimManager::Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - switch (type) { - case chrome::NOTIFICATION_PROFILE_CREATED: { - Profile* profile = content::Source<Profile>(source).ptr(); - if (profile->IsOffTheRecord()) - return; +void AppShimManager::OnProfileAdded(Profile* profile) { + if (profile->IsOffTheRecord()) + return; - AppLifetimeMonitorFactory::GetForBrowserContext(profile)->AddObserver( - this); - break; - } - case chrome::NOTIFICATION_PROFILE_DESTROYED: { - Profile* profile = content::Source<Profile>(source).ptr(); - if (profile->IsOffTheRecord()) - return; + AppLifetimeMonitorFactory::GetForBrowserContext(profile)->AddObserver(this); +} - AppLifetimeMonitorFactory::GetForBrowserContext(profile)->RemoveObserver( - this); - CloseShimsForProfile(profile); - break; +void AppShimManager::OnProfileMarkedForPermanentDeletion(Profile* profile) { + if (profile->IsOffTheRecord()) + return; + + AppLifetimeMonitorFactory::GetForBrowserContext(profile)->RemoveObserver( + this); + + // Close app shims that were kept alive only for this profile. Note that this + // must be done as a posted task because closing shims may result in closing + // windows midway through BrowserList::TryToCloseBrowserList, which does not + // expect that behavior, and may result in crashes. + auto close_shims_lambda = [](base::WeakPtr<AppShimManager> manager) { + if (!manager) + return; + for (auto iter_app = manager->apps_.begin(); + iter_app != manager->apps_.end();) { + AppState* app_state = iter_app->second.get(); + if (app_state->ShouldDeleteAppState()) + iter_app = manager->apps_.erase(iter_app); + else + ++iter_app; } - default: { - NOTREACHED(); // Unexpected notification. - break; - } - } + }; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(close_shims_lambda, weak_factory_.GetWeakPtr())); } void AppShimManager::OnAppStart(content::BrowserContext* context, @@ -978,9 +978,8 @@ void AppShimManager::RebuildProfileMenuItemsFromAvatarMenu() { if (!avatar_menu_) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); avatar_menu_ = std::make_unique<AvatarMenu>( - &profile_manager->GetProfileAttributesStorage(), this, nullptr); + &profile_manager_->GetProfileAttributesStorage(), this, nullptr); } avatar_menu_->RebuildMenu(); profile_menu_items_.clear();
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.h b/chrome/browser/apps/app_shim/app_shim_manager_mac.h index 6275ade..f5cddc5 100644 --- a/chrome/browser/apps/app_shim/app_shim_manager_mac.h +++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.h
@@ -18,13 +18,13 @@ #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h" #include "chrome/browser/apps/app_shim/app_shim_host_mac.h" #include "chrome/browser/profiles/avatar_menu_observer.h" +#include "chrome/browser/profiles/profile_manager_observer.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/web_applications/components/web_app_id.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" class Profile; +class ProfileManager; namespace base { class FilePath; @@ -40,10 +40,10 @@ // extension. class AppShimManager : public AppShimHostBootstrap::Client, public AppShimHost::Client, - public content::NotificationObserver, public AppLifetimeMonitor::Observer, public BrowserListObserver, - public AvatarMenuObserver { + public AvatarMenuObserver, + public ProfileManagerObserver { public: class Delegate { public: @@ -113,6 +113,10 @@ explicit AppShimManager(std::unique_ptr<Delegate> delegate); ~AppShimManager() override; + // Called at the beginning of browser shut down. Is used to remove |this| as + // a ProfileManager and AvatarMenuObserver observer. + void OnBeginTearDown(); + // Get the host corresponding to a profile and app id, or null if there is // none. AppShimHost* FindHost(Profile* profile, const web_app::AppId& app_id); @@ -155,10 +159,9 @@ void OnAppStop(content::BrowserContext* context, const std::string& app_id) override; - // content::NotificationObserver overrides: - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; + // ProfileManagerObserver overrides: + void OnProfileAdded(Profile* profile) override; + void OnProfileMarkedForPermanentDeletion(Profile* profile) override; // BrowserListObserver overrides; void OnBrowserAdded(Browser* browser) override; @@ -213,9 +216,6 @@ // quitting due to apps being open. virtual void MaybeTerminate(); - // Exposed for testing. - content::NotificationRegistrar& registrar() { return registrar_; } - // Called when profile menu items may have changed. Rebuilds the profile // menu item list and sends updated lists to all apps. void UpdateAllProfileMenus(); @@ -311,11 +311,12 @@ ProfileState* GetOrCreateProfileState(Profile* profile, const web_app::AppId& app_id); + // Weak, reset during OnBeginTearDown. + ProfileManager* profile_manager_ = nullptr; + // Map from extension id to the state for that app. std::map<std::string, std::unique_ptr<AppState>> apps_; - content::NotificationRegistrar registrar_; - // The avatar menu instance used by all app shims. std::unique_ptr<AvatarMenu> avatar_menu_;
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc index 0411d9c..518ef379 100644 --- a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc +++ b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
@@ -159,8 +159,6 @@ return load_profile_callbacks_.erase(path); } - content::NotificationRegistrar& GetRegistrar() { return registrar(); } - private: std::map<base::FilePath, base::OnceCallback<void(Profile*)>> load_profile_callbacks_; @@ -621,6 +619,10 @@ scoped_feature_list_.InitWithFeatures({features::kAppShimNewCloseBehavior}, {}); + // This app is installed for profile A throughout this test. + AppShimRegistry::Get()->OnAppInstalledForProfile(kTestAppIdA, + profile_path_a_); + // When the app activates, a host is created. If there is no shim, one is // launched. manager_->SetHostForCreate(std::move(host_aa_unique_)); @@ -821,6 +823,11 @@ scoped_feature_list_.InitWithFeatures({features::kAppShimNewCloseBehavior}, {}); + AppShimRegistry::Get()->OnAppInstalledForProfile(kTestAppIdA, + profile_path_a_); + AppShimRegistry::Get()->OnAppInstalledForProfile(kTestAppIdB, + profile_path_a_); + // Launch shims, adding entries in the map. RegisterOnlyLaunch(bootstrap_aa_, std::move(host_aa_unique_)); EXPECT_EQ(chrome::mojom::AppShimLaunchResult::kSuccess, @@ -836,11 +843,45 @@ EXPECT_CALL(*manager_, MaybeTerminate()).Times(0); manager_->OnAppDeactivated(&profile_a_, kTestAppIdA); - // Quitting when it's the last shim should terminate. + // Quitting when it's the last shim should not terminate in the new behavior. EXPECT_CALL(*manager_, MaybeTerminate()).Times(0); manager_->OnAppDeactivated(&profile_a_, kTestAppIdB); } +TEST_F(AppShimManagerTest, MaybeTerminateOnUninstall) { + scoped_feature_list_.InitWithFeatures({features::kAppShimNewCloseBehavior}, + {}); + + AppShimRegistry::Get()->OnAppInstalledForProfile(kTestAppIdA, + profile_path_a_); + AppShimRegistry::Get()->OnAppInstalledForProfile(kTestAppIdB, + profile_path_a_); + + // Launch shims, adding entries in the map. + RegisterOnlyLaunch(bootstrap_aa_, std::move(host_aa_unique_)); + EXPECT_EQ(chrome::mojom::AppShimLaunchResult::kSuccess, + *bootstrap_aa_result_); + EXPECT_EQ(host_aa_.get(), manager_->FindHost(&profile_a_, kTestAppIdA)); + + RegisterOnlyLaunch(bootstrap_ab_, std::move(host_ab_unique_)); + EXPECT_EQ(chrome::mojom::AppShimLaunchResult::kSuccess, + *bootstrap_ab_result_); + EXPECT_EQ(host_ab_.get(), manager_->FindHost(&profile_a_, kTestAppIdB)); + + // Quitting when there's another shim should not terminate. + AppShimRegistry::Get()->OnAppUninstalledForProfile(kTestAppIdA, + profile_path_a_); + EXPECT_CALL(*manager_, MaybeTerminate()).Times(0); + manager_->OnAppDeactivated(&profile_a_, kTestAppIdA); + + // Quitting when it's the last shim and the app is uninstalled should + // terminate. + AppShimRegistry::Get()->OnAppUninstalledForProfile(kTestAppIdB, + profile_path_a_); + EXPECT_CALL(*manager_, MaybeTerminate()).Times(1); + manager_->OnAppDeactivated(&profile_a_, kTestAppIdB); +} + TEST_F(AppShimManagerTest, MaybeTerminateOld) { scoped_feature_list_.InitWithFeatures({}, {features::kAppShimNewCloseBehavior});
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 7dd45b7..03a5aa3 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -3,8 +3,6 @@ // found in the LICENSE file. #include "build/build_config.h" -// Disable all tests in this file on Mac for flake (crbug.com/1079249) -#if !defined(OS_MAC) #include <string> #include <tuple> @@ -345,14 +343,6 @@ return std::move(response); } - content::WebContents* GetWebContents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - content::RenderViewHost* GetRenderViewHost() { - return GetWebContents()->GetRenderViewHost(); - } - void CreateTestProfile() { AutofillProfile profile; test::SetProfileInfo(&profile, "Milton", "C.", "Waddams", @@ -3506,5 +3496,3 @@ AutofillRestrictUnownedFieldsTest, testing::Bool()); } // namespace autofill - -#endif // !defined(OS_MAC)
diff --git a/chrome/browser/autofill/autofill_uitest.cc b/chrome/browser/autofill/autofill_uitest.cc index b405c19..3cf7e2a6 100644 --- a/chrome/browser/autofill/autofill_uitest.cc +++ b/chrome/browser/autofill/autofill_uitest.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/autofill/autofill_uitest.h" #include "chrome/browser/autofill/personal_data_manager_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/interactive_test_utils.h" @@ -72,7 +73,9 @@ LOG(ERROR) << "crbug/967588: AutofillUiTest::SetUpOnMainThread() entered"; // Don't want Keychain coming up on Mac. test::DisableSystemServices(browser()->profile()->GetPrefs()); - + // Make autofill popup stay open by ignoring external changes when possible. + ChromeAutofillClient::FromWebContents(GetWebContents()) + ->KeepPopupOpenForTesting(); // Inject the test delegate into the AutofillManager of the main frame. RenderFrameHostChanged(/* old_host = */ nullptr, /* new_host = */ GetWebContents()->GetMainFrame());
diff --git a/chrome/browser/browser_commands_unittest.cc b/chrome/browser/browser_commands_unittest.cc index 2e9e6eb..4ba8644 100644 --- a/chrome/browser/browser_commands_unittest.cc +++ b/chrome/browser/browser_commands_unittest.cc
@@ -5,6 +5,7 @@ #include <stddef.h> #include "base/test/scoped_feature_list.h" +#include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/ui/browser_command_controller.h" @@ -447,8 +448,17 @@ pref_service->SetBoolean(prefs::kCaretBrowsingEnabled, false); pref_service->SetBoolean(prefs::kShowCaretBrowsingDialog, false); +#if defined(OS_MAC) + // On Mac, caret browsing should be disabled unless focus is in web content. + // Make sure it's disabled initially and doesn't toggle if executed. + EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_CARET_BROWSING_TOGGLE)); + chrome::ExecuteCommand(browser(), IDC_CARET_BROWSING_TOGGLE); + EXPECT_FALSE(pref_service->GetBoolean(prefs::kCaretBrowsingEnabled)); +#endif + // Create multiple tabs to test if caret browsing mode gets broadcast to all - // tabs when toggled. + // tabs when toggled. (For the purposes of testing, this simulates + // putting focus in web contents as a side effect.) GURL about_blank(url::kAboutBlankURL); int tab_count = 3; for (int i = 0; i < tab_count; ++i) { @@ -456,6 +466,7 @@ } // Toggle on caret browsing. + EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_CARET_BROWSING_TOGGLE)); chrome::ExecuteCommand(browser(), IDC_CARET_BROWSING_TOGGLE); EXPECT_TRUE(pref_service->GetBoolean(prefs::kCaretBrowsingEnabled));
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 443348c..5ae174f 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc
@@ -370,6 +370,8 @@ tearing_down_ = true; DCHECK(IsShuttingDown()); + platform_part()->BeginStartTearDown(); + metrics_services_manager_.reset(); intranet_redirect_detector_.reset(); if (safe_browsing_service_.get())
diff --git a/chrome/browser/browser_process_platform_part_base.cc b/chrome/browser/browser_process_platform_part_base.cc index bc42939..27e565a 100644 --- a/chrome/browser/browser_process_platform_part_base.cc +++ b/chrome/browser/browser_process_platform_part_base.cc
@@ -18,6 +18,8 @@ const base::CommandLine& /* command_line */) { } +void BrowserProcessPlatformPartBase::BeginStartTearDown() {} + void BrowserProcessPlatformPartBase::StartTearDown() { }
diff --git a/chrome/browser/browser_process_platform_part_base.h b/chrome/browser/browser_process_platform_part_base.h index e352dae..af7e815 100644 --- a/chrome/browser/browser_process_platform_part_base.h +++ b/chrome/browser/browser_process_platform_part_base.h
@@ -26,7 +26,10 @@ virtual void PlatformSpecificCommandLineProcessing( const base::CommandLine& command_line); - // Called from BrowserProcessImpl::StartTearDown(). + // Called at the very beginning of BrowserProcessImpl::StartTearDown(). + virtual void BeginStartTearDown(); + + // Called in the middle of BrowserProcessImpl::StartTearDown(). virtual void StartTearDown(); // Called from AttemptExitInternal().
diff --git a/chrome/browser/browser_process_platform_part_mac.h b/chrome/browser/browser_process_platform_part_mac.h index 62e567e..53e59af 100644 --- a/chrome/browser/browser_process_platform_part_mac.h +++ b/chrome/browser/browser_process_platform_part_mac.h
@@ -23,6 +23,7 @@ ~BrowserProcessPlatformPart() override; // Overridden from BrowserProcessPlatformPartBase: + void BeginStartTearDown() override; void StartTearDown() override; void AttemptExit(bool try_to_quit_application) override; void PreMainMessageLoopRun() override;
diff --git a/chrome/browser/browser_process_platform_part_mac.mm b/chrome/browser/browser_process_platform_part_mac.mm index 38b39a0..7dea867 100644 --- a/chrome/browser/browser_process_platform_part_mac.mm +++ b/chrome/browser/browser_process_platform_part_mac.mm
@@ -21,6 +21,11 @@ BrowserProcessPlatformPart::~BrowserProcessPlatformPart() { } +void BrowserProcessPlatformPart::BeginStartTearDown() { + if (app_shim_manager_) + app_shim_manager_->OnBeginTearDown(); +} + void BrowserProcessPlatformPart::StartTearDown() { app_shim_listener_ = nullptr; }
diff --git a/chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc b/chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc index bf77b56..2fcd63ae 100644 --- a/chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc +++ b/chrome/browser/chromeos/input_method/ui/suggestion_window_view.cc
@@ -197,7 +197,7 @@ delegate->AssistiveWindowButtonClicked( {.id = ButtonId::kSmartInputsSettingLink}); }; - setting_link_->set_callback( + setting_link_->SetCallback( base::BindRepeating(on_setting_link_clicked, delegate_)); setting_link_->SetVisible(false);
diff --git a/chrome/browser/chromeos/web_applications/media_app_integration_browsertest.cc b/chrome/browser/chromeos/web_applications/media_app_integration_browsertest.cc index c635c0f..0c22c9e 100644 --- a/chrome/browser/chromeos/web_applications/media_app_integration_browsertest.cc +++ b/chrome/browser/chromeos/web_applications/media_app_integration_browsertest.cc
@@ -43,6 +43,10 @@ // A 640x480 image/jpeg (all green pixels). constexpr char kFileJpeg640x480[] = "image3.jpg"; +// A RAW file from an Olympus camera with the original preview/thumbnail data +// swapped out with "exif.jpg". +constexpr char kRaw378x272[] = "raw.orf"; + // A 1-second long 648x486 VP9-encoded video with stereo Opus-encoded audio. constexpr char kFileVideoVP9[] = "world.webm"; @@ -172,6 +176,19 @@ EXPECT_EQ("640x480", WaitForImageAlt(app, kFileJpeg640x480)); } +// Test that the MediaApp can load a RAW file passed on launch params. +IN_PROC_BROWSER_TEST_P(MediaAppIntegrationTest, HandleRawFile) { + WaitForTestSystemAppInstall(); + auto params = LaunchParamsForApp(web_app::SystemAppType::MEDIA); + + // Add the handcrafted RAW file to launch params and launch. + params.launch_files.push_back(TestFile(kRaw378x272)); + content::WebContents* web_ui = LaunchApp(params); + PrepareAppForTest(web_ui); + + EXPECT_EQ("378x272", WaitForImageAlt(web_ui, kRaw378x272)); +} + // Ensures that chrome://media-app is available as a file task for the ChromeOS // file manager and eligible for opening appropriate files / mime types. IN_PROC_BROWSER_TEST_P(MediaAppIntegrationAllProfilesTest,
diff --git a/chrome/browser/devtools/devtools_eye_dropper.cc b/chrome/browser/devtools/devtools_eye_dropper.cc index fd1611d1..d4cc1e6 100644 --- a/chrome/browser/devtools/devtools_eye_dropper.cc +++ b/chrome/browser/devtools/devtools_eye_dropper.cc
@@ -20,7 +20,6 @@ #include "media/base/video_frame.h" #include "media/capture/mojom/video_capture_types.mojom.h" #include "mojo/public/cpp/bindings/remote.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/common/input/web_mouse_event.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -185,7 +184,7 @@ kCursorSize * device_scale_factor); result.eraseARGB(0, 0, 0, 0); - SkCanvas canvas(result, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(result); canvas.scale(device_scale_factor, device_scale_factor); canvas.translate(0.5f, 0.5f);
diff --git a/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc b/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc index 0a205f7..c7eedeb97 100644 --- a/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc +++ b/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
@@ -77,11 +77,11 @@ : public FakeShillThirdPartyVpnDriverClient { public: void SetParameters(const std::string& object_path_value, - const base::DictionaryValue& parameters, + const base::Value& parameters, StringCallback callback, ErrorCallback error_callback) override { set_parameters_counter_++; - parameters_ = parameters.DeepCopy(); + parameters_ = parameters.Clone(); FakeShillThirdPartyVpnDriverClient::SetParameters( object_path_value, parameters, std::move(callback), std::move(error_callback)); @@ -110,7 +110,7 @@ } int set_parameters_counter_ = 0; - base::DictionaryValue* parameters_ = nullptr; + base::Value parameters_; int update_connection_state_counter_ = 0; uint32_t connection_state_; int send_packet_counter_ = 0; @@ -288,10 +288,10 @@ EXPECT_EQ(api_vpn::VPN_CONNECTION_STATE_CONNECTED, test_client_->update_connection_state_counter_); for (size_t i = 0; i < base::size(kParameterValues); ++i) { - std::string value; - EXPECT_TRUE( - test_client_->parameters_->GetString(kParameterKeys[i], &value)); - EXPECT_EQ(kParameterValues[i], value); + const std::string* value = + test_client_->parameters_.FindStringKey(kParameterKeys[i]); + ASSERT_TRUE(value); + EXPECT_EQ(kParameterValues[i], *value); } const char kPacket[] = "feebdaed"; std::vector<char> packet(&kPacket[0], &kPacket[8]);
diff --git a/chrome/browser/extensions/extension_special_storage_policy.cc b/chrome/browser/extensions/extension_special_storage_policy.cc index 339cecb..292b389 100644 --- a/chrome/browser/extensions/extension_special_storage_policy.cc +++ b/chrome/browser/extensions/extension_special_storage_policy.cc
@@ -171,7 +171,9 @@ bool ExtensionSpecialStoragePolicy::NeedsProtection( const extensions::Extension* extension) { - return extension->is_hosted_app() && !extension->from_bookmark(); + // Default-installed apps should never be granted protected storage. + return extension->is_hosted_app() && !extension->from_bookmark() && + !extension->was_installed_by_default(); } const extensions::ExtensionSet*
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 398b865..c91cf70a 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2429,6 +2429,11 @@ "expiry_milestone": 92 }, { + "name": "enterprise-realtime-extension-request", + "owners": ["zmin", "pastarmovj"], + "expiry_milestone": 94 + }, + { "name": "enterprise-reporting-in-chromeos", "owners": [ "anqing" ], "expiry_milestone": 87 @@ -2671,7 +2676,7 @@ { "name": "forced-colors", "owners": [ "weblayout@microsoft.com" ], - "expiry_milestone": 88 + "expiry_milestone": 90 }, { "name": "form-controls-dark-mode",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index dfebabd..d09b1c5 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -3267,6 +3267,12 @@ "Adds an item to the context menu to allow a user to copy a link to the " "page with the selected text highlighted."; +const char kEnterpriseRealtimeExtensionRequestName[] = + "Enterprise real-time extension request report"; +const char kEnterpriseRealtimeExtensionRequestDescription[] = + "Enable the real-time extension request uploading. The feature requires " + "the enterprise reporting and extension request being enabled."; + const char kGlobalMediaControlsCastStartStopName[] = "Global media controls control Cast start/stop"; const char kGlobalMediaControlsCastStartStopDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 0651a4dd..d9c16eb6 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1874,6 +1874,9 @@ extern const char kCopyLinkToTextName[]; extern const char kCopyLinkToTextDescription[]; +extern const char kEnterpriseRealtimeExtensionRequestName[]; +extern const char kEnterpriseRealtimeExtensionRequestDescription[]; + extern const char kGlobalMediaControlsCastStartStopName[]; extern const char kGlobalMediaControlsCastStartStopDescription[];
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc index d369537..12d3741 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -117,63 +117,6 @@ return params; } -// Records the possible ways a Presentation URL can be used to start a -// presentation, both by the kind of URL and the type of the sink the URL will -// be presented on. "Normal" (https:, file:, or chrome-extension:) URLs are -// typically implemented by loading them into an offscreen tab for streaming, -// while Cast and DIAL URLs are sent directly to a compatible device. -enum class PresentationUrlBySink { - kUnknown = 0, - kNormalUrlToChromecast = 1, - kNormalUrlToExtension = 2, - kNormalUrlToWiredDisplay = 3, - kCastUrlToChromecast = 4, - kDialUrlToDial = 5, - // Add new values immediately above this line. Also update kMaxValue below - // and the enum of the same name in tools/metrics/histograms/enums.xml. - kMaxValue = kDialUrlToDial, -}; - -// NOTE: To record this on Android, will need to move to -// //components/media_router and refactor to avoid the extensions dependency. -void RecordPresentationRequestUrlBySink(const MediaSource& source, - MediaRouteProviderId provider_id) { - PresentationUrlBySink value = PresentationUrlBySink::kUnknown; - // URLs that can be rendered in offscreen tabs (for cloud or Chromecast - // sinks), or on a wired display. - bool is_normal_url = source.url().SchemeIs(url::kHttpsScheme) || - source.url().SchemeIs(extensions::kExtensionScheme) || - source.url().SchemeIs(url::kFileScheme); - switch (provider_id) { - case MediaRouteProviderId::EXTENSION: - if (is_normal_url) { - value = PresentationUrlBySink::kNormalUrlToExtension; - } - break; - case MediaRouteProviderId::WIRED_DISPLAY: - if (is_normal_url) { - value = PresentationUrlBySink::kNormalUrlToWiredDisplay; - } - break; - case MediaRouteProviderId::CAST: - if (source.IsCastPresentationUrl()) { - value = PresentationUrlBySink::kCastUrlToChromecast; - } else if (is_normal_url) { - value = PresentationUrlBySink::kNormalUrlToChromecast; - } - break; - case MediaRouteProviderId::DIAL: - if (source.IsDialSource()) { - value = PresentationUrlBySink::kDialUrlToDial; - } - break; - case MediaRouteProviderId::UNKNOWN: - break; - } - base::UmaHistogramEnumeration("MediaRouter.PresentationRequest.UrlBySink", - value); -} - } // namespace using SinkAvailability = mojom::MediaRouter::SinkAvailability; @@ -329,13 +272,14 @@ } MediaRouterMetrics::RecordMediaSinkType(sink->icon_type()); - const MediaRouteProviderId provider_id = FixProviderId(sink->provider_id()); // Record which of the possible ways the sink may render the source's // presentation URL (if it has one). if (source.url().is_valid()) { - RecordPresentationRequestUrlBySink(source, provider_id); + RecordPresentationRequestUrlBySink(source, sink->provider_id()); } + const MediaRouteProviderId provider_id = FixProviderId(sink->provider_id()); + const std::string presentation_id = MediaRouterBase::CreatePresentationId(); auto mr_callback = base::BindOnce( &MediaRouterMojoImpl::RouteResponseReceived, weak_factory_.GetWeakPtr(), @@ -1104,6 +1048,51 @@ return nullptr; } +// NOTE: To record this on Android, will need to move to +// //components/media_router and refactor to avoid the extensions dependency. +void MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + const MediaSource& source, + MediaRouteProviderId provider_id) { + PresentationUrlBySink value = PresentationUrlBySink::kUnknown; + // URLs that can be rendered in offscreen tabs (for cloud or Chromecast + // sinks), or on a wired display. + bool is_normal_url = source.url().SchemeIs(url::kHttpsScheme) || + source.url().SchemeIs(extensions::kExtensionScheme) || + source.url().SchemeIs(url::kFileScheme); + switch (provider_id) { + case MediaRouteProviderId::EXTENSION: + if (source.IsCastPresentationUrl()) { + // This "should not happen," but the code that creates media routes is + // tricky and we want to catch all possible cases. + value = PresentationUrlBySink::kCastUrlToChromecast; + } else if (is_normal_url) { + value = PresentationUrlBySink::kNormalUrlToExtension; + } + break; + case MediaRouteProviderId::WIRED_DISPLAY: + if (is_normal_url) { + value = PresentationUrlBySink::kNormalUrlToWiredDisplay; + } + break; + case MediaRouteProviderId::CAST: + if (source.IsCastPresentationUrl()) { + value = PresentationUrlBySink::kCastUrlToChromecast; + } else if (is_normal_url) { + value = PresentationUrlBySink::kNormalUrlToChromecast; + } + break; + case MediaRouteProviderId::DIAL: + if (source.IsDialSource()) { + value = PresentationUrlBySink::kDialUrlToDial; + } + break; + case MediaRouteProviderId::UNKNOWN: + break; + } + base::UmaHistogramEnumeration("MediaRouter.PresentationRequest.UrlBySink", + value); +} + void MediaRouterMojoImpl::CreateRouteWithSelectedDesktop( MediaRouteProviderId provider_id, const std::string& sink_id,
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.h b/chrome/browser/media/router/mojo/media_router_mojo_impl.h index 03b05ce..49679d6f 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.h +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
@@ -20,6 +20,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/optional.h" +#include "base/test/metrics/histogram_tester.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/media/webrtc/desktop_media_picker_controller.h" #include "components/media_router/browser/issue_manager.h" @@ -163,6 +164,8 @@ PresentationConnectionStateChangedCallback); FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, PresentationConnectionStateChangedCallbackRemoved); + FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImpl, + TestRecordPresentationRequestUrlBySink); FRIEND_TEST_ALL_PREFIXES(MediaRouterDesktopTest, SyncStateToMediaRouteProvider); FRIEND_TEST_ALL_PREFIXES(ExtensionMediaRouteProviderProxyTest, @@ -392,6 +395,28 @@ // Returns a nullptr if none is found. const MediaSink* GetSinkById(const MediaSink::Id& sink_id) const; + // Used by RecordPresentationRequestUrlBySink to record the possible ways a + // Presentation URL can be used to start a presentation, both by the kind of + // URL and the type of the sink the URL will be presented on. "Normal" + // (https:, file:, or chrome-extension:) URLs are typically implemented by + // loading them into an offscreen tab for streaming, while Cast and DIAL URLs + // are sent directly to a compatible device. + enum class PresentationUrlBySink { + kUnknown = 0, + kNormalUrlToChromecast = 1, + kNormalUrlToExtension = 2, + kNormalUrlToWiredDisplay = 3, + kCastUrlToChromecast = 4, + kDialUrlToDial = 5, + // Add new values immediately above this line. Also update kMaxValue below + // and the enum of the same name in tools/metrics/histograms/enums.xml. + kMaxValue = kDialUrlToDial, + }; + + static void RecordPresentationRequestUrlBySink( + const MediaSource& source, + MediaRouteProviderId provider_id); + base::flat_map<MediaSource::Id, std::unique_ptr<MediaSinksQuery>> sinks_queries_;
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc index f0d12a31..f8f98f9 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc
@@ -18,6 +18,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" +#include "base/strings/strcat.h" #include "base/test/gmock_callback_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" @@ -44,6 +45,7 @@ #include "mojo/public/cpp/bindings/remote.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" using blink::mojom::PresentationConnectionCloseReason; using blink::mojom::PresentationConnectionState; @@ -1264,4 +1266,50 @@ UpdateRoutes(MediaRouteProviderId::WIRED_DISPLAY, {}, kSource, {}); } +TEST(MediaRouterMojoImpl, TestRecordPresentationRequestUrlBySink) { + using base::Bucket; + using PresentationUrlBySink = MediaRouterMojoImpl::PresentationUrlBySink; + + MediaSource cast_source("cast:ABCD1234"); + MediaSource dial_source( + GURL(base::StrCat({kCastDialPresentationUrlScheme, ":YouTube"}))); + MediaSource presentation_url(GURL("https://www.example.com")); + + base::HistogramTester tester; + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + cast_source, MediaRouteProviderId::CAST); + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + dial_source, MediaRouteProviderId::DIAL); + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + presentation_url, MediaRouteProviderId::CAST); + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + presentation_url, MediaRouteProviderId::WIRED_DISPLAY); + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + presentation_url, MediaRouteProviderId::EXTENSION); + // DIAL devices don't support normal URLs, so this will get logged as + // kUnknown. + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + presentation_url, MediaRouteProviderId::DIAL); + // Normally, Cast sources are sent to the CAST provider, but in case it gets + // routed to the EXTENSION provider instead. + MediaRouterMojoImpl::RecordPresentationRequestUrlBySink( + cast_source, MediaRouteProviderId::EXTENSION); + + EXPECT_THAT( + tester.GetAllSamples("MediaRouter.PresentationRequest.UrlBySink"), + testing::UnorderedElementsAre( + Bucket(static_cast<int>(PresentationUrlBySink::kUnknown), 1), + Bucket( + static_cast<int>(PresentationUrlBySink::kNormalUrlToChromecast), + 1), + Bucket(static_cast<int>(PresentationUrlBySink::kNormalUrlToExtension), + 1), + Bucket( + static_cast<int>(PresentationUrlBySink::kNormalUrlToWiredDisplay), + 1), + Bucket(static_cast<int>(PresentationUrlBySink::kCastUrlToChromecast), + 2), + Bucket(static_cast<int>(PresentationUrlBySink::kDialUrlToDial), 1))); +} + } // namespace media_router
diff --git a/chrome/browser/media/webrtc/tab_desktop_media_list.cc b/chrome/browser/media/webrtc/tab_desktop_media_list.cc index 7a89cf2..76e92110 100644 --- a/chrome/browser/media/webrtc/tab_desktop_media_list.cc +++ b/chrome/browser/media/webrtc/tab_desktop_media_list.cc
@@ -38,7 +38,7 @@ // Create a bitmap. SkBitmap result; result.allocN32Pixels(size.width(), size.height(), false); - SkCanvas canvas(result, SkSurfaceProps{}); + SkCanvas canvas(result); canvas.clear(SK_ColorTRANSPARENT); // Draw the favicon image into the center of result image. If the favicon is
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 70e1b04..7bf09aa 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -391,6 +391,14 @@ return g_browser_process->profile_manager()->GetNumberOfProfiles(); } + PrefService* GetPrefService() override { + Profile* profile = cached_metrics_profile_.GetMetricsProfile(); + if (!profile) + return nullptr; + + return profile->GetPrefs(); + } + syncer::SyncService* GetSyncService() override { Profile* profile = cached_metrics_profile_.GetMetricsProfile(); if (!profile)
diff --git a/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc b/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc index 30aae0b..670a0615 100644 --- a/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc +++ b/chrome/browser/metrics/metrics_service_user_demographics_browsertest.cc
@@ -146,7 +146,7 @@ uma_proto->user_demographics().birth_year()); EXPECT_EQ(test_gender, uma_proto->user_demographics().gender()); histogram.ExpectUniqueSample("UMA.UserDemographics.Status", - syncer::UserDemographicsStatus::kSuccess, 1); + UserDemographicsStatus::kSuccess, 1); } else { EXPECT_FALSE(uma_proto->has_user_demographics()); histogram.ExpectTotalCount("UMA.UserDemographics.Status", /*count=*/0);
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc index 5bd4a7e8..f8e98fc 100644 --- a/chrome/browser/metrics/ukm_browsertest.cc +++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -658,7 +658,7 @@ report->user_demographics().birth_year()); EXPECT_EQ(test_gender, report->user_demographics().gender()); histogram.ExpectUniqueSample("UKM.UserDemographics.Status", - syncer::UserDemographicsStatus::kSuccess, 1); + UserDemographicsStatus::kSuccess, 1); } else { EXPECT_FALSE(report->has_user_demographics()); histogram.ExpectTotalCount("UKM.UserDemographics.Status", /*count=*/0);
diff --git a/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.cc b/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.cc new file mode 100644 index 0000000..154c061 --- /dev/null +++ b/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.cc
@@ -0,0 +1,67 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.h" + +#include <utility> + +#include "base/bind_helpers.h" +#include "base/time/time.h" +#include "chrome/browser/nearby_sharing/logging/logging.h" +#include "device/bluetooth/bluetooth_adapter.h" + +namespace { + +constexpr base::TimeDelta kIntervalMin = base::TimeDelta::FromMilliseconds(100); +constexpr base::TimeDelta kIntervalMax = base::TimeDelta::FromMilliseconds(100); + +// A value of 0 will restore the interval to the system default. +constexpr base::TimeDelta kDefaultIntervalMin = + base::TimeDelta::FromMilliseconds(0); +constexpr base::TimeDelta kDefaultIntervalMax = + base::TimeDelta::FromMilliseconds(0); + +} // namespace + +BluetoothAdvertisingIntervalClient::BluetoothAdvertisingIntervalClient( + scoped_refptr<device::BluetoothAdapter> adapter) + : adapter_(adapter) {} + +BluetoothAdvertisingIntervalClient::~BluetoothAdvertisingIntervalClient() { + RestoreDefaultInterval(); +} + +void BluetoothAdvertisingIntervalClient::ReduceInterval( + base::OnceClosure callback, + base::OnceClosure error_callback) { + adapter_->SetAdvertisingInterval( + kIntervalMin, kIntervalMax, std::move(callback), + base::BindOnce( + &BluetoothAdvertisingIntervalClient::OnSetIntervalForAdvertisingError, + weak_ptr_factory_.GetWeakPtr(), std::move(error_callback))); +} + +void BluetoothAdvertisingIntervalClient::RestoreDefaultInterval() { + adapter_->SetAdvertisingInterval( + kDefaultIntervalMin, kDefaultIntervalMax, base::DoNothing(), + base::BindOnce( + &BluetoothAdvertisingIntervalClient::OnRestoreDefaultIntervalError, + weak_ptr_factory_.GetWeakPtr())); +} + +void BluetoothAdvertisingIntervalClient::OnSetIntervalForAdvertisingError( + base::OnceClosure error_callback, + device::BluetoothAdvertisement::ErrorCode code) { + NS_LOG(WARNING) << __func__ + << "SetAdvertisingInterval() failed with error code = " + << code; + std::move(error_callback).Run(); +} + +void BluetoothAdvertisingIntervalClient::OnRestoreDefaultIntervalError( + device::BluetoothAdvertisement::ErrorCode code) { + NS_LOG(WARNING) << __func__ + << "SetAdvertisingInterval() failed with error code = " + << code; +}
diff --git a/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.h b/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.h new file mode 100644 index 0000000..c5985c4 --- /dev/null +++ b/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.h
@@ -0,0 +1,48 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_NEARBY_SHARING_BLUETOOTH_ADVERTISING_INTERVAL_CLIENT_H_ +#define CHROME_BROWSER_NEARBY_SHARING_BLUETOOTH_ADVERTISING_INTERVAL_CLIENT_H_ + +#include <memory> + +#include "base/callback.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "device/bluetooth/bluetooth_advertisement.h" + +namespace device { +class BluetoothAdapter; +} // namespace device + +// BluetoothAdvertisingIntervalClient is responsible for setting the Bluetooth +// advertising interval to a lower value when we start advertising for Nearby +// Share, and then restores the interval to the system default when advertising +// stops. +class BluetoothAdvertisingIntervalClient { + public: + BluetoothAdvertisingIntervalClient( + scoped_refptr<device::BluetoothAdapter> adapter); + ~BluetoothAdvertisingIntervalClient(); + + // Sets the advertising interval to a lowered value to allow for faster + // connections. + void ReduceInterval(base::OnceClosure callback, + base::OnceClosure error_callback); + // Restores the advertising interval to the system default. + void RestoreDefaultInterval(); + + private: + void OnSetIntervalForAdvertisingError( + base::OnceClosure error_callback, + device::BluetoothAdvertisement::ErrorCode code); + void OnRestoreDefaultIntervalError( + device::BluetoothAdvertisement::ErrorCode code); + + scoped_refptr<device::BluetoothAdapter> adapter_; + base::WeakPtrFactory<BluetoothAdvertisingIntervalClient> weak_ptr_factory_{ + this}; +}; + +#endif // CHROME_BROWSER_NEARBY_SHARING_BLUETOOTH_ADVERTISING_INTERVAL_CLIENT_H_
diff --git a/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client_unittest.cc b/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client_unittest.cc new file mode 100644 index 0000000..65ceb1c1 --- /dev/null +++ b/chrome/browser/nearby_sharing/bluetooth_advertising_interval_client_unittest.cc
@@ -0,0 +1,154 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.h" + +#include "device/bluetooth/test/mock_bluetooth_adapter.h" + +using ::testing::_; +using testing::NiceMock; + +namespace { + +const int64_t kInterval = 100; +const int64_t kDefaultInterval = 0; + +} // namespace + +class MockBluetoothAdapterWithInterval : public device::MockBluetoothAdapter { + public: + MOCK_METHOD2(OnSetAdvertisingInterval, void(int64_t, int64_t)); + MOCK_METHOD0(OnSetAdvertisingIntervalError, void()); + + void SetAdvertisingInterval( + const base::TimeDelta& min, + const base::TimeDelta& max, + base::OnceClosure callback, + AdvertisementErrorCallback error_callback) override { + if (set_advertising_interval_error_) { + std::move(error_callback) + .Run(device::BluetoothAdvertisement::ErrorCode:: + ERROR_INVALID_ADVERTISEMENT_INTERVAL); + OnSetAdvertisingIntervalError(); + } else { + std::move(callback).Run(); + OnSetAdvertisingInterval(min.InMilliseconds(), max.InMilliseconds()); + } + } + + void SetAdvertisingIntervalError(bool error) { + set_advertising_interval_error_ = error; + } + + protected: + ~MockBluetoothAdapterWithInterval() override = default; + + bool set_advertising_interval_error_ = false; +}; + +class BluetoothAdvertisingIntervalClientTest : public testing::Test { + protected: + void SetUp() override { + mock_adapter_ = + base::MakeRefCounted<NiceMock<MockBluetoothAdapterWithInterval>>(); + ON_CALL(*mock_adapter_, OnSetAdvertisingInterval(_, _)) + .WillByDefault(Invoke( + this, + &BluetoothAdvertisingIntervalClientTest::OnSetAdvertisingInterval)); + ON_CALL(*mock_adapter_, OnSetAdvertisingIntervalError()) + .WillByDefault(Invoke(this, &BluetoothAdvertisingIntervalClientTest:: + OnSetAdvertisingIntervalError)); + client_ = + std::make_unique<BluetoothAdvertisingIntervalClient>(mock_adapter_); + } + + void SetAdvertisingInterval() { + client_->ReduceInterval( + base::BindOnce(&BluetoothAdvertisingIntervalClientTest:: + OnSetAdvertisingIntervalCallback, + base::Unretained(this)), + base::BindOnce(&BluetoothAdvertisingIntervalClientTest:: + OnSetAdvertisingIntervalErrorCallback, + base::Unretained(this))); + } + + void OnSetAdvertisingInterval(int64_t min, int64_t max) { + ++set_advertising_interval_call_count_; + last_advertising_interval_min_ = min; + last_advertising_interval_max_ = max; + } + + void OnSetAdvertisingIntervalError() { + ++set_advertising_interval_error_call_count_; + } + + void OnSetAdvertisingIntervalCallback() { + ++set_advertising_interval_callback_call_count_; + } + + void OnSetAdvertisingIntervalErrorCallback() { + ++set_advertising_interval_error_callback_call_count_; + } + + void RestoreDefaultInterval() { client_->RestoreDefaultInterval(); } + + const size_t set_advertising_interval_call_count() { + return set_advertising_interval_call_count_; + } + + const size_t set_advertising_interval_error_call_count() { + return set_advertising_interval_error_call_count_; + } + + const size_t set_advertising_interval_callback_call_count() { + return set_advertising_interval_callback_call_count_; + } + + const size_t set_advertising_interval_error_callback_call_count() { + return set_advertising_interval_error_callback_call_count_; + } + + const int64_t last_advertising_interval_min() { + return last_advertising_interval_min_; + } + + const int64_t last_advertising_interval_max() { + return last_advertising_interval_max_; + } + + scoped_refptr<NiceMock<MockBluetoothAdapterWithInterval>> mock_adapter_; + std::unique_ptr<BluetoothAdvertisingIntervalClient> client_; + size_t set_advertising_interval_call_count_ = 0u; + size_t set_advertising_interval_error_call_count_ = 0u; + size_t set_advertising_interval_callback_call_count_ = 0u; + size_t set_advertising_interval_error_callback_call_count_ = 0u; + int64_t last_advertising_interval_min_ = 0; + int64_t last_advertising_interval_max_ = 0; +}; + +TEST_F(BluetoothAdvertisingIntervalClientTest, SetAndRestore) { + SetAdvertisingInterval(); + EXPECT_EQ(1, set_advertising_interval_call_count()); + EXPECT_EQ(0, set_advertising_interval_error_call_count()); + EXPECT_EQ(1, set_advertising_interval_callback_call_count()); + EXPECT_EQ(0, set_advertising_interval_error_callback_call_count()); + EXPECT_EQ(kInterval, last_advertising_interval_min()); + EXPECT_EQ(kInterval, last_advertising_interval_max()); + + RestoreDefaultInterval(); + EXPECT_EQ(2, set_advertising_interval_call_count()); + EXPECT_EQ(0, set_advertising_interval_error_call_count()); + EXPECT_EQ(0, set_advertising_interval_error_callback_call_count()); + EXPECT_EQ(kDefaultInterval, last_advertising_interval_min()); + EXPECT_EQ(kDefaultInterval, last_advertising_interval_max()); +} + +TEST_F(BluetoothAdvertisingIntervalClientTest, SetError) { + mock_adapter_->SetAdvertisingIntervalError(true); + SetAdvertisingInterval(); + EXPECT_EQ(0, set_advertising_interval_call_count()); + EXPECT_EQ(1, set_advertising_interval_error_call_count()); + EXPECT_EQ(0, set_advertising_interval_callback_call_count()); + EXPECT_EQ(1, set_advertising_interval_error_callback_call_count()); +}
diff --git a/chrome/browser/policy/messaging_layer/storage/storage_queue.cc b/chrome/browser/policy/messaging_layer/storage/storage_queue.cc index cbd5616..cec9ee55 100644 --- a/chrome/browser/policy/messaging_layer/storage/storage_queue.cc +++ b/chrome/browser/policy/messaging_layer/storage/storage_queue.cc
@@ -171,9 +171,33 @@ // data, but must have metadata for the last data, because metadata is only // removed once data is written. So we are picking the metadata matching the // last sequencing number and load both digest and generation id from there. - // If there is no match, we bail out for now; later on we will instead - // start a new generation from the next sequencing number (with no digest!) - RETURN_IF_ERROR(RestoreMetadata(&used_files_set)); + const Status status = RestoreMetadata(&used_files_set); + // If there is no match, clear up everything we've found before and start + // a new generation from scratch. + // In the future we could possibly consider preserving the previous + // generation data, but will need to resolve multiple issues: + // 1) we would need to send the old generation before starting to send + // the new one, which could trigger a loss of data in the new generation. + // 2) we could end up with 3 or more generations, if the loss of metadata + // repeats. Which of them should be sent first (which one is expected + // by the server)? + // 3) different generations might include the same sequencing ids; + // how do we resolve file naming then? Should we add generation id + // to the file name too? + // Because of all this, for now we just drop the old generation data + // and start the new one from scratch. + if (!status.ok()) { + LOG(ERROR) << "Failed to restore metadata, status=" << status; + // Reset all parameters as they were at the beginning of Init(). + // Some of them might have been changed earlier. + next_seq_number_ = 0; + first_seq_number_ = 0; + first_unconfirmed_seq_number_ = base::nullopt; + last_record_digest_ = base::nullopt; + // Delete all files. + files_.clear(); + used_files_set.clear(); + } } // Delete all files except used ones. DeleteUnusedFiles(used_files_set); @@ -532,7 +556,7 @@ base::StrCat({"Cannot read metafile=", meta_file->name(), " status=", read_result.status().ToString()})); } - generation_id_ = + const uint64_t generation_id = *reinterpret_cast<const uint64_t*>(read_result.ValueOrDie().data()); // Read last record digest. read_result = @@ -543,6 +567,8 @@ base::StrCat({"Cannot read metafile=", meta_file->name(), " status=", read_result.status().ToString()})); } + // Everything read successfully, set the queue up. + generation_id_ = generation_id; last_record_digest_ = std::string(read_result.ValueOrDie()); // Store used metadata file. used_files_set->emplace(meta_file_path);
diff --git a/chrome/browser/policy/messaging_layer/storage/storage_queue.h b/chrome/browser/policy/messaging_layer/storage/storage_queue.h index bf118c6..c34b2082 100644 --- a/chrome/browser/policy/messaging_layer/storage/storage_queue.h +++ b/chrome/browser/policy/messaging_layer/storage/storage_queue.h
@@ -185,6 +185,9 @@ // Test only: makes specified records fail on reading. void TestInjectBlockReadErrors(std::initializer_list<uint64_t> seq_numbers); + // Access queue options. + const Options& options() const { return options_; } + StorageQueue(const StorageQueue& other) = delete; StorageQueue& operator=(const StorageQueue& other) = delete;
diff --git a/chrome/browser/policy/messaging_layer/storage/storage_queue_unittest.cc b/chrome/browser/policy/messaging_layer/storage/storage_queue_unittest.cc index bffa309a..699282b1 100644 --- a/chrome/browser/policy/messaging_layer/storage/storage_queue_unittest.cc +++ b/chrome/browser/policy/messaging_layer/storage/storage_queue_unittest.cc
@@ -9,6 +9,8 @@ #include <utility> #include <vector> +#include "base/files/file_path.h" +#include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/optional.h" #include "base/strings/strcat.h" @@ -36,6 +38,9 @@ namespace reporting { namespace { +// Metadata file name prefix. +const base::FilePath::CharType METADATA_NAME[] = FILE_PATH_LITERAL("META"); + // Usage (in tests only): // // TestEvent<ResType> e; @@ -98,13 +103,15 @@ if (generation_id_.has_value() && generation_id_.value() != sequencing_information.generation_id()) { std::move(processed_cb) - .Run(UploadRecordFailure(Status( - error::DATA_LOSS, - base::StrCat({"Generation id mismatch, expected=", - base::NumberToString(generation_id_.value()), - " actual=", - base::NumberToString( - sequencing_information.generation_id())})))); + .Run(UploadRecordFailure( + sequencing_information.sequencing_id(), + Status( + error::DATA_LOSS, + base::StrCat( + {"Generation id mismatch, expected=", + base::NumberToString(generation_id_.value()), " actual=", + base::NumberToString( + sequencing_information.generation_id())})))); return; } if (!generation_id_.has_value()) { @@ -122,9 +129,16 @@ if (record_digest != wrapped_record.record_digest()) { std::move(processed_cb) .Run(UploadRecordFailure( + sequencing_information.sequencing_id(), Status(error::DATA_LOSS, "Record digest mismatch"))); return; } + // Store record digest for the next record in sequence to verify. + last_record_digest_map_->emplace( + std::make_pair(sequencing_information.sequencing_id(), + sequencing_information.generation_id()), + record_digest); + // If last record digest is present, match it and validate. if (wrapped_record.has_last_record_digest()) { auto it = last_record_digest_map_->find( std::make_pair(sequencing_information.sequencing_id() - 1, @@ -134,14 +148,11 @@ it->second.value() != wrapped_record.last_record_digest())) { std::move(processed_cb) .Run(UploadRecordFailure( + sequencing_information.sequencing_id(), Status(error::DATA_LOSS, "Last record digest mismatch"))); return; } } - last_record_digest_map_->emplace( - std::make_pair(sequencing_information.sequencing_id(), - sequencing_information.generation_id()), - record_digest); } std::move(processed_cb) @@ -156,13 +167,15 @@ if (generation_id_.has_value() && generation_id_.value() != sequencing_information.generation_id()) { std::move(processed_cb) - .Run(UploadRecordFailure(Status( - error::DATA_LOSS, - base::StrCat({"Generation id mismatch, expected=", - base::NumberToString(generation_id_.value()), - " actual=", - base::NumberToString( - sequencing_information.generation_id())})))); + .Run(UploadRecordFailure( + sequencing_information.sequencing_id(), + Status( + error::DATA_LOSS, + base::StrCat( + {"Generation id mismatch, expected=", + base::NumberToString(generation_id_.value()), " actual=", + base::NumberToString( + sequencing_information.generation_id())})))); return; } if (!generation_id_.has_value()) { @@ -181,7 +194,7 @@ void Completed(Status status) override { UploadComplete(status); } MOCK_METHOD(bool, UploadRecord, (uint64_t, base::StringPiece), (const)); - MOCK_METHOD(bool, UploadRecordFailure, (Status), (const)); + MOCK_METHOD(bool, UploadRecordFailure, (uint64_t, Status), (const)); MOCK_METHOD(bool, UploadGap, (uint64_t, uint64_t), (const)); MOCK_METHOD(void, UploadComplete, (Status), (const)); @@ -191,9 +204,6 @@ public: explicit SetUp(MockUploadClient* client) : client_(client) {} ~SetUp() { - EXPECT_CALL(*client_, UploadRecordFailure(_)) - .Times(0) - .InSequence(client_->test_upload_sequence_); EXPECT_CALL(*client_, UploadComplete(Eq(Status::StatusOK()))) .Times(1) .InSequence(client_->test_upload_sequence_); @@ -231,6 +241,13 @@ return *this; } + SetUp& Failure(uint64_t sequence_number, Status error) { + EXPECT_CALL(*client_, UploadRecordFailure(Eq(sequence_number), Eq(error))) + .InSequence(client_->test_upload_sequence_) + .WillOnce(Return(true)); + return *this; + } + private: MockUploadClient* const client_; }; @@ -430,6 +447,110 @@ task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); } +TEST_P(StorageQueueTest, + WriteIntoNewStorageQueueReopenWithMissingMetadataWriteMoreAndUpload) { + CreateStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); + WriteStringOrDie(data[0]); + WriteStringOrDie(data[1]); + WriteStringOrDie(data[2]); + + // Save copy of options. + const StorageQueue::Options options = storage_queue_->options(); + + storage_queue_.reset(); + + // Delete all metadata files. + base::FileEnumerator dir_enum( + options.directory(), + /*recursive=*/false, base::FileEnumerator::FILES, + base::StrCat({METADATA_NAME, FILE_PATH_LITERAL(".*")})); + base::FilePath full_name; + while (full_name = dir_enum.Next(), !full_name.empty()) { + base::DeleteFile(full_name); + } + + // Reopen, starting a new generation. + CreateStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); + WriteStringOrDie(more_data[0]); + WriteStringOrDie(more_data[1]); + WriteStringOrDie(more_data[2]); + + // Set uploader expectations. Previous data is all lost. + EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) + .WillOnce(Invoke([](MockUploadClient* mock_upload_client) { + MockUploadClient::SetUp(mock_upload_client) + .Required(0, more_data[0]) + .Required(1, more_data[1]) + .Required(2, more_data[2]); + })); + + // Trigger upload. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); +} + +TEST_P(StorageQueueTest, + WriteIntoNewStorageQueueReopenWithMissingDataWriteMoreAndUpload) { + CreateStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); + WriteStringOrDie(data[0]); + WriteStringOrDie(data[1]); + WriteStringOrDie(data[2]); + + // Save copy of options. + const StorageQueue::Options options = storage_queue_->options(); + + storage_queue_.reset(); + + // Reopen with the same generation and sequencing information. + CreateStorageQueueOrDie(BuildStorageQueueOptionsPeriodic()); + + // Delete the first data file. + base::FilePath full_name = options.directory().Append( + base::StrCat({options.file_prefix(), FILE_PATH_LITERAL(".0")})); + base::DeleteFile(full_name); + + // Write more data. + WriteStringOrDie(more_data[0]); + WriteStringOrDie(more_data[1]); + WriteStringOrDie(more_data[2]); + + // Set uploader expectations. Previous data is all lost. + // The expected results depend on the test configuration. + switch (options.single_file_size()) { + case 1: // single record in file - deletion killed the first record + EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) + .WillOnce(Invoke([](MockUploadClient* mock_upload_client) { + MockUploadClient::SetUp(mock_upload_client) + .PossibleGap(0, 1) + .Required(1, data[1]) + .Required(2, data[2]) + .Required(3, more_data[0]) + .Required(4, more_data[1]) + .Required(5, more_data[2]); + })); + break; + case 256: // two records in file - deletion killed the first two records. + EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) + .WillOnce(Invoke([](MockUploadClient* mock_upload_client) { + MockUploadClient::SetUp(mock_upload_client) + .PossibleGap(0, 2) + .Failure( + 2, Status(error::DATA_LOSS, "Last record digest mismatch")) + .Required(3, more_data[0]) + .Required(4, more_data[1]) + .Required(5, more_data[2]); + })); + break; + default: // UNlimited file size - deletion above killed all the data. + EXPECT_CALL(set_mock_uploader_expectations_, Call(NotNull())) + .WillOnce(Invoke([](MockUploadClient* mock_upload_client) { + MockUploadClient::SetUp(mock_upload_client).PossibleGap(0, 1); + })); + } + + // Trigger upload. + task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1)); +} + TEST_P(StorageQueueTest, WriteIntoNewStorageQueueAndFlush) { CreateStorageQueueOrDie(BuildStorageQueueOptionsOnlyManual()); WriteStringOrDie(data[0]); @@ -849,8 +970,8 @@ INSTANTIATE_TEST_SUITE_P(VaryingFileSize, StorageQueueTest, testing::Values(128 * 1024LL * 1024LL, - 64 /* two records in file */, - 32 /* single record in file */)); + 256 /* two records in file */, + 1 /* single record in file */)); // TODO(b/157943006): Additional tests: // 1) Options object with a bad path.
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index b3a36523..5a80af8 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -111,6 +111,7 @@ #include "components/language/content/browser/ulp_language_code_locator/ulp_language_code_locator.h" #include "components/language/core/browser/language_prefs.h" #include "components/lookalikes/core/lookalike_url_util.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/metrics/metrics_pref_names.h" #include "components/network_time/network_time_tracker.h" #include "components/ntp_tiles/most_visited_sites.h" @@ -776,6 +777,7 @@ MediaDeviceIDSalt::RegisterProfilePrefs(registry); MediaEngagementService::RegisterProfilePrefs(registry); MediaStorageIdSalt::RegisterProfilePrefs(registry); + metrics::RegisterDemographicsProfilePrefs(registry); NotificationDisplayServiceImpl::RegisterProfilePrefs(registry); NotifierStateTracker::RegisterProfilePrefs(registry); ntp_tiles::MostVisitedSites::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/privacy/java/res/layout/secure_dns_provider_spinner_item.xml b/chrome/browser/privacy/java/res/layout/secure_dns_provider_spinner_item.xml index 2251f3d..78a7906 100644 --- a/chrome/browser/privacy/java/res/layout/secure_dns_provider_spinner_item.xml +++ b/chrome/browser/privacy/java/res/layout/secure_dns_provider_spinner_item.xml
@@ -6,7 +6,7 @@ <!-- Copy of @layout/preference_spinner_single_line_item with padding removed. --> <TextView xmlns:android="http://schemas.android.com/apk/res/android" style="?android:attr/spinnerItemStyle" - android:maxLines="1" + android:singleLine="true" android:textAppearance="@style/TextAppearance.TextLarge.Primary" android:layout_width="wrap_content" android:layout_height="wrap_content"
diff --git a/chrome/browser/profiles/profile_avatar_icon_util.cc b/chrome/browser/profiles/profile_avatar_icon_util.cc index b05714f0..ae031fd 100644 --- a/chrome/browser/profiles/profile_avatar_icon_util.cc +++ b/chrome/browser/profiles/profile_avatar_icon_util.cc
@@ -760,7 +760,7 @@ SkBitmap badged_bitmap; badged_bitmap.allocN32Pixels(app_icon_bitmap.width(), app_icon_bitmap.height()); - SkCanvas offscreen_canvas(badged_bitmap, SkSurfaceProps{}); + SkCanvas offscreen_canvas(badged_bitmap); offscreen_canvas.clear(SK_ColorTRANSPARENT); offscreen_canvas.drawBitmap(app_icon_bitmap, 0, 0);
diff --git a/chrome/browser/resources/bookmarks/BUILD.gn b/chrome/browser/resources/bookmarks/BUILD.gn index 200e3089..4c3c39a 100644 --- a/chrome/browser/resources/bookmarks/BUILD.gn +++ b/chrome/browser/resources/bookmarks/BUILD.gn
@@ -38,6 +38,7 @@ if (optimize_webui) { deps = [ ":build" ] manifest_files = [ "$target_gen_dir/$build_manifest" ] + resource_path_rewrites = [ "bookmarks.rollup.js|bookmarks.js" ] } else { deps = [ ":preprocess",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/cursors.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/cursors.js index bec866b4..5cf0236 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/cursors.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/cursors.js
@@ -458,7 +458,7 @@ throw Error('Unrecognized unit: ' + unit); } newNode = newNode || originalNode; - newIndex = goog.isDef(newIndex) ? newIndex : this.index_; + newIndex = (newIndex !== undefined) ? newIndex : this.index_; return new cursors.Cursor(newNode, newIndex); }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_input_handler.js index ebfacdc..91b3bcb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_input_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_input_handler.js
@@ -406,7 +406,7 @@ // so that these keys work even if the Braille IME is not active. const keyName = /** @type {string} */ (event.standardKeyCode); const numericCode = BrailleKeyEvent.keyCodeToLegacyCode(keyName); - if (!goog.isDef(numericCode)) { + if (!numericCode) { throw Error('Unknown key code in event: ' + JSON.stringify(event)); } EventGenerator.sendKeyPress(numericCode, {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis.js b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis.js index 7cf5429..3b6d7a8 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/liblouis.js
@@ -32,8 +32,7 @@ * Path to translation tables. * @private {?string} */ - this.tablesDir_ = goog.isDef(opt_tablesDir) ? opt_tablesDir : null; - + this.tablesDir_ = (opt_tablesDir !== undefined) ? opt_tablesDir : null; /** * Whether liblouis is loaded.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/nav_braille.js b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/nav_braille.js index 116c683..445c6cb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/nav_braille.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/nav_braille.js
@@ -39,14 +39,15 @@ * Selection start index. * @type {number} */ - this.startIndex = goog.isDef(kwargs.startIndex) ? kwargs.startIndex : -1; + this.startIndex = + (kwargs.startIndex !== undefined) ? kwargs.startIndex : -1; /** * Selection end index. * @type {number} */ this.endIndex = - goog.isDef(kwargs.endIndex) ? kwargs.endIndex : this.startIndex; + (kwargs.endIndex !== undefined) ? kwargs.endIndex : this.startIndex; } /**
diff --git a/chrome/browser/resources/downloads/BUILD.gn b/chrome/browser/resources/downloads/BUILD.gn index 4467d81..e7f71b0 100644 --- a/chrome/browser/resources/downloads/BUILD.gn +++ b/chrome/browser/resources/downloads/BUILD.gn
@@ -47,6 +47,7 @@ if (optimize_webui) { deps = [ ":build" ] manifest_files = [ "$target_gen_dir/$build_manifest" ] + resource_path_rewrites = [ "downloads.rollup.js|downloads.js" ] } else { deps = [ ":preprocess",
diff --git a/chrome/browser/resources/extensions/BUILD.gn b/chrome/browser/resources/extensions/BUILD.gn index 385008e..017696b5 100644 --- a/chrome/browser/resources/extensions/BUILD.gn +++ b/chrome/browser/resources/extensions/BUILD.gn
@@ -44,6 +44,7 @@ if (optimize_webui) { deps = [ ":build" ] + resource_path_rewrites = [ "extensions.rollup.js|extensions.js" ] manifest_files = [ "$target_gen_dir/$build_manifest" ] } else { deps = [
diff --git a/chrome/browser/resources/extensions/detail_view.html b/chrome/browser/resources/extensions/detail_view.html index fc42d32..17bb9b7 100644 --- a/chrome/browser/resources/extensions/detail_view.html +++ b/chrome/browser/resources/extensions/detail_view.html
@@ -377,7 +377,8 @@ external></cr-link-row> <cr-link-row class="hr" id="extensionsActivityLogLink" hidden$="[[!showActivityLog]]" - label="$i18n{viewActivityLog}" on-click="onActivityLogTap_"> + label="$i18n{viewActivityLog}" on-click="onActivityLogTap_" + role-description="$i18n{subpageArrowRoleDescription}"> </cr-link-row> <cr-link-row class="hr" hidden="[[!data.manifestHomePageUrl.length]]" id="extensionWebsite" label="$i18n{extensionWebsite}"
diff --git a/chrome/browser/resources/history/BUILD.gn b/chrome/browser/resources/history/BUILD.gn index f1f8dd6..f9f7034 100644 --- a/chrome/browser/resources/history/BUILD.gn +++ b/chrome/browser/resources/history/BUILD.gn
@@ -52,6 +52,10 @@ if (optimize_webui) { deps = [ ":build" ] manifest_files = [ "$target_gen_dir/$build_manifest" ] + resource_path_rewrites = [ + "history.rollup.js|history.js", + "lazy_load.rollup.js|lazy_load.js", + ] } else { deps = [ ":preprocess",
diff --git a/chrome/browser/resources/ntp4/new_tab.css b/chrome/browser/resources/ntp4/new_tab.css index eba46bc..67dd344d 100644 --- a/chrome/browser/resources/ntp4/new_tab.css +++ b/chrome/browser/resources/ntp4/new_tab.css
@@ -54,10 +54,6 @@ 2x); } -[is='action-link'] { - margin-inline-start: 0.5em; -} - #card-slider-frame { /* Must match #footer height. */ bottom: 50px; @@ -164,10 +160,6 @@ right: auto; } -#login-container [is='action-link'] { - margin-inline-start: 0; -} - .login-status-icon { background-position: right center; background-repeat: no-repeat;
diff --git a/chrome/browser/resources/ntp4/new_tab_theme.css b/chrome/browser/resources/ntp4/new_tab_theme.css index 48aea93..9fb4bd5 100644 --- a/chrome/browser/resources/ntp4/new_tab_theme.css +++ b/chrome/browser/resources/ntp4/new_tab_theme.css
@@ -20,11 +20,6 @@ overflow: auto; } -[is='action-link'], -[is='action-link']:active { - color: rgb($i18n{colorLink}); -} - #attribution { color: $i18n{colorTextLight}; display: $i18n{displayAttribution};
diff --git a/chrome/browser/resources/print_preview/BUILD.gn b/chrome/browser/resources/print_preview/BUILD.gn index 872b96f..c27e8e04 100644 --- a/chrome/browser/resources/print_preview/BUILD.gn +++ b/chrome/browser/resources/print_preview/BUILD.gn
@@ -39,6 +39,7 @@ input_files_base_dir = rebase_path(".", "//") if (optimize_webui) { deps = [ ":build" ] + resource_path_rewrites = [ "print_preview.rollup.js|print_preview.js" ] manifest_files = [ "$target_gen_dir/$build_manifest" ] } else { deps = [
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index 46624e2e..142c3f6 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -70,6 +70,10 @@ if (optimize_webui) { deps = [ ":build" ] manifest_files = [ "$target_gen_dir/$build_manifest" ] + resource_path_rewrites = [ + "settings.rollup.js|settings.js", + "lazy_load.rollup.js|lazy_load.js", + ] } else { deps = [ ":preprocess",
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html index 900b96e..e630df5f 100644 --- a/chrome/browser/resources/settings/people_page/sync_page.html +++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -161,6 +161,7 @@ <div id="other-sync-items" class="list-frame"> <cr-link-row id="sync-advanced-row" label="$i18n{syncAdvancedPageTitle}" + role-description="$i18n{subpageArrowRoleDescription}" on-click="onSyncAdvancedClick_"></cr-link-row> <cr-link-row class="hr"
diff --git a/chrome/browser/resources/settings/privacy_page/cookies_page.html b/chrome/browser/resources/settings/privacy_page/cookies_page.html index c7c892c..bf4f565 100644 --- a/chrome/browser/resources/settings/privacy_page/cookies_page.html +++ b/chrome/browser/resources/settings/privacy_page/cookies_page.html
@@ -138,7 +138,8 @@ on-settings-boolean-control-change="onNetworkPredictionChange_"> </settings-toggle-button> <cr-link-row id="site-data-trigger" class="hr" - on-click="onSiteDataClick_" label="$i18n{siteSettingsCookieLink}"> + on-click="onSiteDataClick_" label="$i18n{siteSettingsCookieLink}" + role-description="$i18n{subpageArrowRoleDescription}"> </cr-link-row> <div id="exceptionHeader" hidden="[[!enableContentSettingsRedesign_]]"> <h2>$i18n{siteSettingsCustomizedBehaviors}</h2>
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.html b/chrome/browser/resources/settings/privacy_page/personalization_options.html index 2b94f37..350712a 100644 --- a/chrome/browser/resources/settings/privacy_page/personalization_options.html +++ b/chrome/browser/resources/settings/privacy_page/personalization_options.html
@@ -109,7 +109,7 @@ </template> <if expr="not chromeos"> - <cr-toast id="toast" open="[[showRestartToast_]]"> + <cr-toast id="toast"> <div>$i18n{restartToApplyChanges}</div> <cr-button on-click="onRestartTap_">$i18n{restart}</cr-button> </cr-toast>
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.js b/chrome/browser/resources/settings/privacy_page/personalization_options.js index e8f2212..2b737b6 100644 --- a/chrome/browser/resources/settings/privacy_page/personalization_options.js +++ b/chrome/browser/resources/settings/privacy_page/personalization_options.js
@@ -49,9 +49,6 @@ /** @private */ showRestart_: Boolean, - - /** @private */ - showRestartToast_: Boolean, // </if> /** @private */ @@ -192,7 +189,7 @@ /** @type {!SettingsToggleButtonElement} */ ( this.$$('#signinAllowedToggle')) .sendPrefChange(); - this.showRestartToast_ = true; + this.$.toast.show(); } }, @@ -205,7 +202,7 @@ /** @type {!SettingsToggleButtonElement} */ ( this.$$('#signinAllowedToggle')) .sendPrefChange(); - this.showRestartToast_ = true; + this.$.toast.show(); } this.showSignoutDialog_ = false; },
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index 8696879f..fa8c91d0 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -19,15 +19,18 @@ <cr-link-row id="cookiesLinkRow" start-icon="settings:cookie" class="hr" label="$i18n{cookiePageTitle}" sub-label="[[cookieSettingDescription_]]" - on-click="onCookiesClick_"></cr-link-row> + on-click="onCookiesClick_" + role-description="$i18n{subpageArrowRoleDescription}"></cr-link-row> <cr-link-row id="securityLinkRow" start-icon="cr:security" class="hr" label="$i18n{securityPageTitle}" sub-label="$i18n{securityPageDescription}" - on-click="onSecurityPageClick_"></cr-link-row> + on-click="onSecurityPageClick_" + role-description="$i18n{subpageArrowRoleDescription}"></cr-link-row> <cr-link-row id="permissionsLinkRow" start-icon="settings:permissions" class="hr" label="$i18n{siteSettings}" sub-label="$i18n{permissionsPageDescription}" - on-click="onPermissionsPageClick_"></cr-link-row> + on-click="onPermissionsPageClick_" + role-description="$i18n{subpageArrowRoleDescription}"></cr-link-row> </div> <if expr="use_nss_certs">
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html index 90ad748..d6404f47 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.html +++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -160,7 +160,8 @@ class="hr" label="$i18n{securityKeysTitle}" sub-label="$i18n{securityKeysDesc}" - on-click="onSecurityKeysClick_"></cr-link-row> + on-click="onSecurityKeysClick_" + role-description="$i18n{subpageArrowRoleDescription}"></cr-link-row> </template> <if expr="use_nss_certs or is_win or is_macosx"> <cr-link-row id="manageCertificates" @@ -168,6 +169,9 @@ <if expr="not use_nss_certs"> external </if> +<if expr="use_nss_certs"> + role-description="$i18n{subpageArrowRoleDescription}" +</if> label="$i18n{manageCertificates}" sub-label="$i18n{manageCertificatesDescription}" on-click="onManageCertificatesClick_"></cr-link-row>
diff --git a/chrome/browser/send_tab_to_self/desktop_notification_handler_unittest.cc b/chrome/browser/send_tab_to_self/desktop_notification_handler_unittest.cc index eb5506e..73808d1f 100644 --- a/chrome/browser/send_tab_to_self/desktop_notification_handler_unittest.cc +++ b/chrome/browser/send_tab_to_self/desktop_notification_handler_unittest.cc
@@ -19,7 +19,7 @@ #include "components/send_tab_to_self/send_tab_to_self_sync_service.h" #include "components/send_tab_to_self/test_send_tab_to_self_model.h" #include "components/sync/base/model_type.h" -#include "components/sync/model/fake_model_type_controller_delegate.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/image/image.h"
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc index c8edb4a..afb5beb7 100644 --- a/chrome/browser/sync/chrome_sync_client.cc +++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -64,6 +64,7 @@ #include "components/history/core/common/pref_names.h" #include "components/invalidation/impl/invalidation_switches.h" #include "components/invalidation/impl/profile_invalidation_provider.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/password_manager/core/browser/password_store.h" #include "components/prefs/pref_service.h" #include "components/search_engines/template_url_service.h" @@ -701,6 +702,10 @@ #endif } +void ChromeSyncClient::OnLocalSyncTransportDataCleared() { + metrics::ClearDemographicsPrefs(profile_->GetPrefs()); +} + #if BUILDFLAG(ENABLE_EXTENSIONS) std::unique_ptr<syncer::ModelTypeController> ChromeSyncClient::CreateAppsModelTypeController(
diff --git a/chrome/browser/sync/chrome_sync_client.h b/chrome/browser/sync/chrome_sync_client.h index 141426cd..ed4f077 100644 --- a/chrome/browser/sync/chrome_sync_client.h +++ b/chrome/browser/sync/chrome_sync_client.h
@@ -66,6 +66,7 @@ GetControllerDelegateForModelType(syncer::ModelType type) override; syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override; syncer::SyncTypePreferenceProvider* GetPreferenceProvider() override; + void OnLocalSyncTransportDataCleared() override; private: // Convenience function used during controller creation.
diff --git a/chrome/browser/taskbar/taskbar_decorator_win.cc b/chrome/browser/taskbar/taskbar_decorator_win.cc index 3e64486c..e5e2345c 100644 --- a/chrome/browser/taskbar/taskbar_decorator_win.cc +++ b/chrome/browser/taskbar/taskbar_decorator_win.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/profiles/profile_manager.h" #include "skia/ext/image_operations.h" -#include "skia/ext/legacy_display_globals.h" #include "skia/ext/platform_canvas.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -80,7 +79,7 @@ // way profile icons are rendered in the profile switcher. SkBitmap offscreen_bitmap; offscreen_bitmap.allocN32Pixels(kOverlayIconSize, kOverlayIconSize); - SkCanvas offscreen_canvas(offscreen_bitmap, SkSurfaceProps{}); + SkCanvas offscreen_canvas(offscreen_bitmap); offscreen_canvas.clear(SK_ColorTRANSPARENT); static const SkRRect overlay_icon_clip = @@ -132,8 +131,7 @@ auto badge = std::make_unique<SkBitmap>(); badge->allocN32Pixels(kOverlayIconSize, kOverlayIconSize); - SkCanvas canvas(*badge.get(), - skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(*badge.get()); SkPaint paint; paint.setAntiAlias(true);
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc index 63506fe..c78a982 100644 --- a/chrome/browser/themes/browser_theme_pack.cc +++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -364,7 +364,7 @@ SkBitmap scaled_bitmap; scaled_bitmap.allocN32Pixels(scaled_size.width(), scaled_size.height()); scaled_bitmap.eraseARGB(0, 0, 0, 0); - SkCanvas canvas(scaled_bitmap, SkSurfaceProps{}); + SkCanvas canvas(scaled_bitmap); SkRect scaled_bounds = RectToSkRect(gfx::Rect(scaled_size)); // Note(oshima): The following scaling code doesn't work with // a mask image.
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 2edbd4f5..d579f4b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Bestuur</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> aflaaie is uitgevee</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> as 'n sekuriteitsleutel</translation> <translation id="3856096718352044181">Bevestig dat dit 'n geldige verskaffer is of probeer later weer</translation> <translation id="3861633093716975811">Gewilde video's</translation> <translation id="3892148308691398805">Kopieer teks</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 474e54cd..0c0edc35 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ቪዲዮ</translation> <translation id="3810973564298564668">አቀናብር</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> የሚወርዱ ተሰርዘዋል</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> እንደ የደህንነት ቁልፍ</translation> <translation id="3856096718352044181">ይህ ልክ የሆነ አገልግሎት አቅራቢ መሆኑን እባክዎ ያረጋግጡ ወይም ቆይተው እንደገና ይሞክሩ</translation> <translation id="3861633093716975811">ታዋቂ ቪዲዮዎች</translation> <translation id="3892148308691398805">ጽሑፍ ቅዳ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 0fbb3186..cff28a1a 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">الفيديوهات</translation> <translation id="3810973564298564668">إدارة محرّكات البحث</translation> <translation id="3819178904835489326">تم إلغاء <ph name="NUMBER_OF_DOWNLOADS" /> من عمليات التنزيل</translation> -<translation id="3848957262889631524">تطبيق <ph name="APP_NAME" /> من Google كمفتاح أمان</translation> <translation id="3856096718352044181">يُرجى إثبات صلاحية مقدّم الخدمة أو المحاولة مجددًا.</translation> <translation id="3861633093716975811">الفيديوهات الرائجة</translation> <translation id="3892148308691398805">نسخ النص</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index c0cd396..99de602 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ভিডিঅ’</translation> <translation id="3810973564298564668">পৰিচালনা কৰক</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" />টা ডাউনল'ড মচা হ'ল</translation> -<translation id="3848957262889631524">এটা সুৰক্ষা সম্পৰ্কীয় চাবি হিচাপে Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">অনুগ্ৰহ কৰি এইটো কোনো মান্য প্ৰদানকাৰীৰ বুলি সত্যাপন কৰক অথবা পাছত আকৌ চেষ্টা কৰক</translation> <translation id="3861633093716975811">জনপ্ৰিয় ভিডিঅ’</translation> <translation id="3892148308691398805">পাঠৰ প্ৰতিলিপি কৰক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index e927a10..7fdd43c5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">İdarə edin</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> endirmə silindi</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> Təhlükəsizlik Açarıdır</translation> <translation id="3856096718352044181">Bunun etibarlı təminatçı olduğunu doğrulayın, ya da daha sonra təkrar cəhd edin</translation> <translation id="3861633093716975811">Populyar videolar</translation> <translation id="3892148308691398805">Mətni kopyalayın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index ec30b57..fd1fec8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Відэа</translation> <translation id="3810973564298564668">Кіраваць</translation> <translation id="3819178904835489326">Выдалена спамповак: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> як ключ бяспекі</translation> <translation id="3856096718352044181">Праверце, ці сапраўдны гэта аператар, або паўтарыце спробу</translation> <translation id="3861633093716975811">Папулярныя відэа</translation> <translation id="3892148308691398805">Скапіраваць тэкст</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 475dce8..3941c6d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3810973564298564668">Управление</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> изтегляния бяха изтрити</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> като ключ за сигурност</translation> <translation id="3856096718352044181">Моля, проверете дали този доставчик е валиден или опитайте отново по-късно</translation> <translation id="3861633093716975811">Популярни видеоклипове</translation> <translation id="3892148308691398805">Копиране на текста</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index a890ff99..102d5bb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Videozapis</translation> <translation id="3810973564298564668">Upravljaj</translation> <translation id="3819178904835489326">Broj izbrisanih preuzimanja: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> kao sigurnosni ključ</translation> <translation id="3856096718352044181">Potvrdite da je ovo važeći pružalac usluga ili pokušajte ponovo kasnije</translation> <translation id="3861633093716975811">Popularni videozapisi</translation> <translation id="3892148308691398805">Kopiraj tekst</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 a9ecf7de3d2..4705d50c 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3810973564298564668">Gestiona</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> baixades suprimides</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> com a clau de seguretat</translation> <translation id="3856096718352044181">Verifica que aquest és un proveïdor vàlid o torna-ho a provar més tard</translation> <translation id="3861633093716975811">Vídeos populars</translation> <translation id="3892148308691398805">Copia el text</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 2c3d06fe..f63fc2e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Spravovat</translation> <translation id="3819178904835489326">Počet smazaných stažených souborů: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> jako bezpečnostní klíč</translation> <translation id="3856096718352044181">Zkontrolujte, zda se jedná o platného poskytovatele, nebo to zkuste znovu později</translation> <translation id="3861633093716975811">Populární videa</translation> <translation id="3892148308691398805">Kopírovat text</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index b7b6b05d..ab20743 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Valgmuligheder</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads blev slettet</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> som en sikkerhedsnøgle</translation> <translation id="3856096718352044181">Bekræft, at dette er en gyldig udbyder, eller prøv igen senere</translation> <translation id="3861633093716975811">Populære videoer</translation> <translation id="3892148308691398805">Kopiér tekst</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index 019276d..8c7cde2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -16,6 +16,7 @@ <translation id="1105960400813249514">Bildschirmaufnahme</translation> <translation id="1111673857033749125">Hier werden die Lesezeichen angezeigt, die auf Ihren anderen Geräten gespeichert sind.</translation> <translation id="1113597929977215864">Vereinfachte Ansicht anzeigen</translation> +<translation id="1123070903960493543">Interaktion mit Chrome, ausgewählte Einstellungen, Details von Chrome-Abstürzen</translation> <translation id="1126809382673880764">Sie werden nicht vor schädlichen Websites, Downloads und Erweiterungen geschützt. Sofern verfügbar, sind Sie in anderen Google-Diensten, wie Gmail und der Google Suche, durch Safe Browsing geschützt.</translation> <translation id="1129510026454351943">Details: <ph name="ERROR_DESCRIPTION" /></translation> <translation id="1141800923049248244">{FILE_COUNT,plural, =1{1 Download ausstehend.}other{# Downloads ausstehend.}}</translation> @@ -72,6 +73,7 @@ <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> kann nicht geteilt werden</translation> <translation id="1477626028522505441"><ph name="FILE_NAME" /> konnte aufgrund von Serverproblemen nicht heruntergeladen werden.</translation> <translation id="1506061864768559482">Suchmaschine</translation> +<translation id="151267239139452619">Zu Downloads hinzufügen</translation> <translation id="1513352483775369820">Lesezeichen und Webprotokoll</translation> <translation id="1513858653616922153">Passwort löschen</translation> <translation id="1521774566618522728">Heute aktiv</translation> @@ -157,6 +159,7 @@ <translation id="2131665479022868825"><ph name="DATA" /> eingespart</translation> <translation id="213279576345780926"><ph name="TAB_TITLE" /> geschlossen</translation> <translation id="2139186145475833000">Zum Startbildschirm zufügen</translation> +<translation id="214888715418183969">Wählen Sie aus, welche Messwerte für Chrome freigegeben werden sollen. Die freigegebenen Messwerte werden verwendet, um die Funktionen, die Leistung und die Stabilität von Chrome zu verbessern.</translation> <translation id="2154484045852737596">Karte bearbeiten</translation> <translation id="2154710561487035718">URL kopieren</translation> <translation id="2156074688469523661">Restliche Websites (<ph name="NUMBER_OF_SITES" />)</translation> @@ -166,6 +169,7 @@ <translation id="2175927920773552910">QR-Code</translation> <translation id="218608176142494674">Freigabe</translation> <translation id="2195339740518523951">Höchste Sicherheit in Chrome erhalten</translation> +<translation id="2200113223741723867">Freigabe von Nutzungsdaten verwalten</translation> <translation id="2227444325776770048">Als <ph name="USER_FULL_NAME" /> fortfahren</translation> <translation id="2234876718134438132">Synchronisierung und Google-Dienste</translation> <translation id="2239812875700136898">Über die Schaltfläche "Optionen für Discover" können Sie festlegen, welche Meldungen Ihnen angezeigt werden</translation> @@ -370,12 +374,14 @@ <translation id="3771290962915251154">Diese Einstellung ist deaktiviert, weil die Jugendschutzeinstellungen aktiviert sind</translation> <translation id="3771694256347217732">Google-Nutzungsbedingungen</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Aktivieren Sie Bluetooth<ph name="END_LINK" />, um die Kopplung zu ermöglichen</translation> +<translation id="3773856050682458546">Die grundlegenden Daten plus Informationen über die Websites, die Sie besuchen, und die Apps, die Sie nutzen</translation> <translation id="3775705724665058594">An meine Geräte senden</translation> <translation id="3778956594442850293">Zum Startbildschirm hinzugefügt</translation> <translation id="3789841737615482174">Installieren</translation> <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Verwalten</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> Downloads gelöscht</translation> +<translation id="3848957262889631524">Google <ph name="APP_NAME" /> als Sicherheitsschlüssel</translation> <translation id="3856096718352044181">Vergewissern Sie sich, dass dies ein gültiger Provider ist, oder versuchen Sie es später noch einmal</translation> <translation id="3861633093716975811">Beliebte Videos</translation> <translation id="3892148308691398805">Text kopieren</translation> @@ -403,7 +409,9 @@ <translation id="3988466920954086464">Instant-Suchergebnisse in diesem Feld ansehen</translation> <translation id="4000212216660919741">Offline-Startseite</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# h}other{# h}}</translation> +<translation id="4045764304651014138">Nutzungsdaten</translation> <translation id="4056223980640387499">Sepia</translation> +<translation id="4057643060762047384">Hinzufügen zu:</translation> <translation id="4060598801229743805">Optionen sind oben auf dem Bildschirm verfügbar</translation> <translation id="4062305924942672200">Rechtliche Hinweise</translation> <translation id="4084682180776658562">Lesezeichen</translation> @@ -544,6 +552,7 @@ <translation id="5039804452771397117">Zulassen</translation> <translation id="5040262127954254034">Datenschutz</translation> <translation id="5087580092889165836">Karte hinzufügen</translation> +<translation id="5091249083535528968">Erweiterte Nutzungsdaten</translation> <translation id="509429900233858213">Ein Fehler ist aufgetreten.</translation> <translation id="510275257476243843">1 Stunde übrig</translation> <translation id="5123685120097942451">Inkognitotab</translation> @@ -650,6 +659,7 @@ <translation id="5833984609253377421">Link teilen</translation> <translation id="5836192821815272682">Chrome-Update wird heruntergeladen…</translation> <translation id="5853623416121554550">pausiert</translation> +<translation id="5854512288214985237">Es werden keine Statistiken oder Absturzberichte an Google gesendet</translation> <translation id="5854790677617711513">Älter als 30 Tage</translation> <translation id="5855546874025048181">Eingrenzen: <ph name="REFINE_TEXT" /></translation> <translation id="5858741533101922242">Chrome kann den Bluetooth-Adapter nicht aktivieren</translation> @@ -722,6 +732,7 @@ <translation id="6303969859164067831">Abmelden und die Synchronisierung ausschalten</translation> <translation id="6312687380483398334">Web-Apps (stumm)</translation> <translation id="6316139424528454185">Android-Version nicht unterstützt</translation> +<translation id="6321526113093607004">Zu Lesezeichen hinzufügen</translation> <translation id="6324034347079777476">Android-Systemsynchronisierung deaktiviert</translation> <translation id="6333140779060797560">Über <ph name="APPLICATION" /> teilen</translation> <translation id="6337234675334993532">Verschlüsselung</translation> @@ -739,6 +750,7 @@ <translation id="6402652558933147609"><ph name="ERROR_CODE" /> auf <ph name="VIOLATED_URL" /></translation> <translation id="6404511346730675251">Lesezeichen bearbeiten</translation> <translation id="6406506848690869874">Synchronisierung</translation> +<translation id="6410404864818553978">Grundlegende Nutzungsdaten</translation> <translation id="6410883413783534063">Öffnen Sie Tabs, um mehrere Seiten gleichzeitig zu besuchen</translation> <translation id="6412673304250309937">Prüft URLs anhand einer Liste unsicherer Websites, die in Chrome gespeichert wird. Wenn eine Website versucht, Ihr Passwort zu stehlen, oder wenn Sie eine schädliche Datei herunterladen, kann Chrome auch URLs, einschließlich Teile von Seiteninhalten, an Safe Browsing senden.</translation> <translation id="641643625718530986">Drucken...</translation> @@ -832,6 +844,7 @@ <translation id="7015203776128479407">Die erstmalige Einrichtung der Synchronisierung wurde nicht abgeschlossen. Synchronisierung ist deaktiviert.</translation> <translation id="7022756207310403729">Im Browser öffnen</translation> <translation id="702463548815491781">Empfohlen, wenn TalkBack oder der Schalterzugriff aktiviert ist</translation> +<translation id="7027549951530753705">Wiederhergestellt: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Passwörter</translation> <translation id="703523980599857277">Startseite ändern</translation> <translation id="7054588988317389591">Bildbeschreibungen abrufen?</translation> @@ -1013,6 +1026,7 @@ <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> und weitere Websites</translation> <translation id="8327155640814342956">Noch besser und komfortabler surfen – jetzt Chrome öffnen und aktualisieren</translation> <translation id="8349013245300336738">Nach Menge der verwendeten Daten sortieren</translation> +<translation id="835847953965672673"><ph name="NUMBER_OF_DOWNLOADS" /> Downloads wurden wiederhergestellt</translation> <translation id="8364299278605033898">Beliebte Websites ansehen</translation> <translation id="8368027906805972958">Unbekanntes oder nicht unterstütztes Gerät (<ph name="DEVICE_ID" />)</translation> <translation id="8372925856448695381"><ph name="LANG" /> ist bereit.</translation> @@ -1121,6 +1135,7 @@ <translation id="9148126808321036104">Erneut anmelden</translation> <translation id="9155898266292537608">Sie können auch kurz auf ein Wort tippen, um eine Suche zu starten</translation> <translation id="9169507124922466868">Navigationsverlauf ist halb geöffnet</translation> +<translation id="9191031968346938109">Hinzufügen zu…</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{Zuletzt geprüft: vor 1 Minute}other{Zuletzt geprüft: vor # Minuten}}</translation> <translation id="9204836675896933765">Noch 1 Datei</translation> <translation id="9206873250291191720">A</translation> @@ -1133,6 +1148,7 @@ <translation id="938850635132480979">Fehler: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Passphrase eingeben</translation> <translation id="95817756606698420">Chrome kann in China <ph name="BEGIN_BOLD" />Sogou<ph name="END_BOLD" /> für die Suche verwenden. Sie können dies unter <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> ändern.</translation> +<translation id="962979164594783469">App installieren</translation> <translation id="968900484120156207">Von Ihnen besuchte Seiten werden hier angezeigt</translation> <translation id="970715775301869095"><ph name="MINUTES" /> Minuten übrig</translation> <translation id="974555521953189084">Geben Sie Ihre Passphrase ein, um die Synchronisierung zu starten</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 133d16b..45e3f04 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Βίντεο</translation> <translation id="3810973564298564668">Διαχείριση</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> λήψεις διαγράφηκαν</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ως κλειδί ασφαλείας</translation> <translation id="3856096718352044181">Βεβαιωθείτε ότι πρόκειται για έγκυρο πάροχο ή δοκιμάστε ξανά αργότερα</translation> <translation id="3861633093716975811">Δημοφιλή βίντεο</translation> <translation id="3892148308691398805">Αντιγραφή κειμένου</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 d94b9994..d7b1d4b5b 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Manage</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads deleted</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> as a security key</translation> <translation id="3856096718352044181">Please verify that this is a valid provider or try again later</translation> <translation id="3861633093716975811">Popular videos</translation> <translation id="3892148308691398805">Copy text</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 6ee9f98..60a4bb2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Administrar</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> descargas borradas</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> como llave de seguridad</translation> <translation id="3856096718352044181">Verifica que sea un proveedor válido o vuelve a intentarlo más tarde</translation> <translation id="3861633093716975811">Videos populares</translation> <translation id="3892148308691398805">Copiar texto</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 cb4bdd9..a7215d4 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3810973564298564668">Gestionar</translation> <translation id="3819178904835489326">Descargas eliminadas: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> como llave de seguridad</translation> <translation id="3856096718352044181">Verifica que este sea un proveedor válido o inténtalo de nuevo más tarde.</translation> <translation id="3861633093716975811">Vídeos populares</translation> <translation id="3892148308691398805">Copiar texto</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 60117ce..5c0b274 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Halda</translation> <translation id="3819178904835489326">Tuvastati <ph name="NUMBER_OF_DOWNLOADS" /> allalaadimist</translation> -<translation id="3848957262889631524">Google'i rakendus <ph name="APP_NAME" /> turvavõtmena</translation> <translation id="3856096718352044181">Veenduge, et tegemist oleks kehtiva teenusepakkujaga, või proovige hiljem uuesti</translation> <translation id="3861633093716975811">Populaarsed videod</translation> <translation id="3892148308691398805">Kopeeri tekst</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index e785c0e..76bbce0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Bideoa</translation> <translation id="3810973564298564668">Kudeatu</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> deskarga ezabatu dira</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> segurtasun-giltza gisa</translation> <translation id="3856096718352044181">Egiaztatu hornitzaile horrek balio duela edo saiatu berriro geroago</translation> <translation id="3861633093716975811">Bideo arrakastatsuak</translation> <translation id="3892148308691398805">Kopiatu testua</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index e2f3814..f78dafd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">فیلم</translation> <translation id="3810973564298564668">مدیریت</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> بارگیری حذف شد</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> بهعنوان کلید امنیتی</translation> <translation id="3856096718352044181">لطفاً تأیید کنید این ارائهدهندهْ معتبر است یا بعداً دوباره امتحان کنید</translation> <translation id="3861633093716975811">ویدیوهای پرطرفدار</translation> <translation id="3892148308691398805">کپی کردن نوشتار</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 58de008..81948c9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Hallinnoi</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> latausta poistettiin.</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> suojausavaimena</translation> <translation id="3856096718352044181">Varmista, että tämä on kelvollinen palveluntarjoaja, tai yritä myöhemmin uudelleen</translation> <translation id="3861633093716975811">Suositut videot</translation> <translation id="3892148308691398805">Kopioi teksti</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 b385aa7e..b97d4e39 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Mamahala</translation> <translation id="3819178904835489326">Na-delete ang <ph name="NUMBER_OF_DOWNLOADS" /> (na) pag-download</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> bilang Security Key</translation> <translation id="3856096718352044181">Paki-verify na valid na provider ito o subukan ulit sa ibang pagkakataon</translation> <translation id="3861633093716975811">Mga sikat na video</translation> <translation id="3892148308691398805">Kopyahin ang text</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 8dd77ff..f1bde2f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vidéo</translation> <translation id="3810973564298564668">Gérer</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> téléchargements supprimés</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> comme clé de sécurité</translation> <translation id="3856096718352044181">Veuillez vérifier qu'il s'agit d'un fournisseur valide ou réessayer plus tard</translation> <translation id="3861633093716975811">Vidéos populaires</translation> <translation id="3892148308691398805">Copier le texte</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 dcc1cc74..8355d9f4 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vidéo</translation> <translation id="3810973564298564668">Gérer</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> téléchargements supprimés</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> comme clé de sécurité</translation> <translation id="3856096718352044181">Veuillez vérifier qu'il s'agit d'un fournisseur valide ou réessayer plus tard</translation> <translation id="3861633093716975811">Vidéos populaires</translation> <translation id="3892148308691398805">Copier le texte</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 48ffdcc..585dca8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3810973564298564668">Xestionar</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> descargas eliminadas</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> como chave de seguranza</translation> <translation id="3856096718352044181">Verifica que se trate dun fornecedor válido ou téntao de novo máis tarde.</translation> <translation id="3861633093716975811">Vídeos populares</translation> <translation id="3892148308691398805">Copiar texto</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 838b381..8fd1c65 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">વીડિયો</translation> <translation id="3810973564298564668">મેનેજ કરો</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ડાઉનલોડ કાઢી નાખ્યાં</translation> -<translation id="3848957262889631524">સિક્યુરિટી કી તરીકે Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">કૃપા કરીને ચકાસણી કરો કે આ માન્ય પ્રદાતા છે અથવા પછીથી ફરી પ્રયાસ કરો</translation> <translation id="3861633093716975811">લોકપ્રિય વીડિયો</translation> <translation id="3892148308691398805">ટેક્સ્ટ કૉપિ કરો</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 1536530..0d8cb04e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">वीडियो</translation> <translation id="3810973564298564668">प्रबंधित करें</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> डाउनलोड हटाए गए</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> सुरक्षा कुंजी</translation> <translation id="3856096718352044181">कृपया पुष्टि करें कि यह एक मान्य डीएनएस सेवा है या थोड़ी देर बाद कोशिश करें</translation> <translation id="3861633093716975811">लोकप्रिय वीडियो</translation> <translation id="3892148308691398805">टेक्स्ट कॉपी करें</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index d568afc..f0de649d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Upravljaj</translation> <translation id="3819178904835489326">Izbrisano preuzimanja: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ima sigurnosni ključ</translation> <translation id="3856096718352044181">Potvrdite da je to valjani davatelj ili pokušajte ponovo kasnije</translation> <translation id="3861633093716975811">Popularni videozapisi</translation> <translation id="3892148308691398805">Kopiranje teksta</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index 8dc80d05..b852c141 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Videó</translation> <translation id="3810973564298564668">Szerkesztés</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> letöltés törölve</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> használata biztonsági kulcsként</translation> <translation id="3856096718352044181">Ellenőrizze a szolgáltató érvényességét, vagy próbálkozzon újra.</translation> <translation id="3861633093716975811">Népszerű videók</translation> <translation id="3892148308691398805">Szöveg másolása</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index 3141af0..1ee0d04 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Տեսանյութ</translation> <translation id="3810973564298564668">Կառավարել</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ներբեռնում ջնջվեց</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> հավելվածը որպես անվտանգության բանալի</translation> <translation id="3856096718352044181">Հաստատեք, որ սա վավեր մատակարար է կամ նորից փորձեք</translation> <translation id="3861633093716975811">Հաճախ դիտվող տեսանյութեր</translation> <translation id="3892148308691398805">Պատճենել տեքստը</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 884ca1b..da25401 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Kelola</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> download dihapus</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> sebagai Kunci Keamanan</translation> <translation id="3856096718352044181">Verifikasi bahwa ini adalah penyedia yang valid atau coba lagi nanti</translation> <translation id="3861633093716975811">Video populer</translation> <translation id="3892148308691398805">Salin teks</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 7a6b669..975271c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Myndskeið</translation> <translation id="3810973564298564668">Stjórna</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> niðurhölum eytt</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> sem öryggislykill</translation> <translation id="3856096718352044181">Gakktu úr skugga um að þetta sé staðfest veita eða reyndu aftur síðar</translation> <translation id="3861633093716975811">Vinsæl myndskeið</translation> <translation id="3892148308691398805">Afrita texta</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index 79d2273..f4be17e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Gestisci</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> download eliminati</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> come token di sicurezza</translation> <translation id="3856096718352044181">Verifica che questo fornitore sia valido e riprova più tardi</translation> <translation id="3861633093716975811">Video più visti</translation> <translation id="3892148308691398805">Copia testo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index e0fd809..4caf3bac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">וידאו</translation> <translation id="3810973564298564668">נהל</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> הורדות נמחקו</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> כמפתח אבטחה</translation> <translation id="3856096718352044181">יש לאמת שהספק הזה חוקי או לנסות שוב מאוחר יותר</translation> <translation id="3861633093716975811">סרטונים פופולריים</translation> <translation id="3892148308691398805">העתקת הטקסט</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 20f97648..66056cd1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ვიდეო</translation> <translation id="3810973564298564668">მართვა</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ჩამოტვირთული ფაილი წაიშალა</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> უსაფრთხოების გასაღების სახით</translation> <translation id="3856096718352044181">დაადასტურეთ პროვაიდერის სისწორე ან ცადეთ მოგვიანებით</translation> <translation id="3861633093716975811">პოპულარული ვიდეოები</translation> <translation id="3892148308691398805">ტექსტის კოპირება</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 d77ff05..f8390b8 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Бейне</translation> <translation id="3810973564298564668">Басқару</translation> <translation id="3819178904835489326">Жүктелген <ph name="NUMBER_OF_DOWNLOADS" /> файл жойылды</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> қауіпсіздік кілті ретінде</translation> <translation id="3856096718352044181">Мұның жарамды провайдер екенін тексеріңіз немесе кейінірек қайталап көріңіз.</translation> <translation id="3861633093716975811">Танымал бейнелер</translation> <translation id="3892148308691398805">Мәтінді көшіру</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 4c3ccb1..65d3e94 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">វីដេអូ</translation> <translation id="3810973564298564668">គ្រប់គ្រង</translation> <translation id="3819178904835489326">បានលុបការទាញយក <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ជាសោសុវត្ថិភាព</translation> <translation id="3856096718352044181">សូមផ្ទៀងផ្ទាត់ថា នេះគឺជាក្រុមហ៊ុនផ្ដល់សេវាត្រឹមត្រូវ ឬព្យាយាមម្ដងទៀតនៅពេលក្រោយ</translation> <translation id="3861633093716975811">វីដេអូពេញនិយម</translation> <translation id="3892148308691398805">ចម្លងអត្ថបទ</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 1a67270..e65ddf08 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">동영상</translation> <translation id="3810973564298564668">관리</translation> <translation id="3819178904835489326">다운로드 <ph name="NUMBER_OF_DOWNLOADS" />개 삭제됨</translation> -<translation id="3848957262889631524">보안 키로 Google <ph name="APP_NAME" /> 사용</translation> <translation id="3856096718352044181">유효한 제공업체인지 확인하거나 나중에 다시 시도하세요.</translation> <translation id="3861633093716975811">인기 동영상</translation> <translation id="3892148308691398805">텍스트 복사</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 236b23c..3b7ab5370 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3810973564298564668">Башкаруу</translation> <translation id="3819178904835489326">Жүктөлүп алынган <ph name="NUMBER_OF_DOWNLOADS" /> нерсе өчүрүлдү</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> Коопсуздук ачкычы катары иштей алат</translation> <translation id="3856096718352044181">Бул жарамдуу кызмат көрсөтүүчү экенин текшерип, кайра аракет кылыңыз</translation> <translation id="3861633093716975811">Таанымал видеолор</translation> <translation id="3892148308691398805">Текстти көчүрүү</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 270878b..d647e18 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ວິດີໂອ</translation> <translation id="3810973564298564668">ຈັດການ</translation> <translation id="3819178904835489326">ລຶບ <ph name="NUMBER_OF_DOWNLOADS" /> ການດາວໂຫຼດແລ້ວ</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ເປັນກະແຈຄວາມປອດໄພ</translation> <translation id="3856096718352044181">ກະລຸນາຢັ້ງຢືນວ່ານີ້ແມ່ນຜູ້ໃຫ້ບໍລິການທີ່ຖືກຕ້ອງ ຫຼື ລອງໃໝ່ໃນພາຍຫຼັງ</translation> <translation id="3861633093716975811">ວິດີໂອຍອດນິຍົມ</translation> <translation id="3892148308691398805">ສຳເນົາຂໍ້ຄວາມ</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 5ca13bbf..66c12f4 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vaizdo</translation> <translation id="3810973564298564668">Valdyti</translation> <translation id="3819178904835489326">Ištrinta atsisiuntimų: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">„Google <ph name="APP_NAME" />“ kaip saugos raktas</translation> <translation id="3856096718352044181">Patvirtinkite, kad tai yra tinkamas paslaugų teikėjas, arba vėliau bandykite dar kartą</translation> <translation id="3861633093716975811">Populiarūs vaizdo įrašai</translation> <translation id="3892148308691398805">Kopijuoti tekstą</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index b92d8af7..caaa4127 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Pārvaldīt</translation> <translation id="3819178904835489326">Izdzēsti <ph name="NUMBER_OF_DOWNLOADS" /> lejupielādētie vienumi</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> kā drošības atslēga</translation> <translation id="3856096718352044181">Pārbaudiet, vai pakalpojumu sniedzējs ir derīgs, vai arī vēlāk mēģiniet vēlreiz</translation> <translation id="3861633093716975811">Populāri videoklipi</translation> <translation id="3892148308691398805">Kopēt tekstu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index 968d33a2..92d83e6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3810973564298564668">Управувај</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> преземања се избришани</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> како безбедносен клуч</translation> <translation id="3856096718352044181">Потврдете дека ова е вистински давател на услуги или обидете се повторно подоцна</translation> <translation id="3861633093716975811">Популарни видеа</translation> <translation id="3892148308691398805">Копирај текст</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 5cd3f35..29ae93f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">വീഡിയോ</translation> <translation id="3810973564298564668">മാനേജ് ചെയ്യുക</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ഡൗൺലോഡുകൾ ഇല്ലാതാക്കി</translation> -<translation id="3848957262889631524">ഒരു സുരക്ഷാ കീയായി Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">ഇത് സാധുതയുള്ളൊരു ദാതാവാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക അല്ലെങ്കിൽ പിന്നീട് വീണ്ടും ശ്രമിക്കുക</translation> <translation id="3861633093716975811">ജനപ്രിയ വീഡിയോകൾ</translation> <translation id="3892148308691398805">ടെക്സ്റ്റ് പകർത്തുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index b23d2ca..1e9e9dc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3810973564298564668">удирдах</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> таталтыг устгасан</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" />-г Аюулгүй байдлын түлхүүрээр ашиглах</translation> <translation id="3856096718352044181">Энэ нь хүчинтэй нийлүүлэгч болохыг бататгах эсвэл дараа дахин оролдоно уу</translation> <translation id="3861633093716975811">Түгээмэл видеонууд</translation> <translation id="3892148308691398805">Текстийг хуулах</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 3c92ae5..0d27380 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">व्हिडिओ</translation> <translation id="3810973564298564668">व्यवस्थापित करा</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> डाउनलोड हटविले</translation> -<translation id="3848957262889631524">सिक्युरिटी की म्हणून Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">कृपया हा वैध पुरवठादार आहे याची पडताळणी करा किंवा नंतर पुन्हा प्रयत्न करा</translation> <translation id="3861633093716975811">लोकप्रिय व्हिडिओ</translation> <translation id="3892148308691398805">मजकूर कॉपी करा</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 2fa4785..d6b31a4 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Urus</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> muat turun dipadamkan</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> sebagai Kunci Keselamatan</translation> <translation id="3856096718352044181">Sila sahkan bahawa penyedia ini sah atau cuba lagi nanti</translation> <translation id="3861633093716975811">Video popular</translation> <translation id="3892148308691398805">Salin teks</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 6f8304ab..199f584 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ဗီဒီယို</translation> <translation id="3810973564298564668">စီမံရန်</translation> <translation id="3819178904835489326">ဒေါင်းလုဒ် <ph name="NUMBER_OF_DOWNLOADS" /> ခုကို ဖျက်လိုက်သည်</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ကို 'လုံခြုံရေးကီး' အဖြစ်သုံးခြင်း</translation> <translation id="3856096718352044181">မှန်ကန်သည့် ဝန်ဆောင်မှုပေးသူ ဟုတ်မဟုတ် အတည်ပြုပါ သို့မဟုတ် နောက်မှ ထပ်စမ်းကြည့်ပါ</translation> <translation id="3861633093716975811">လူကြိုက်များသော ဗီဒီယိုများ</translation> <translation id="3892148308691398805">စာသား မိတ္တူကူးရန်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 98ec0d92..e05ed5f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Beheren</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads verwijderd</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> als beveiligingssleutel</translation> <translation id="3856096718352044181">Controleer of dit een geldige provider is of probeer het later opnieuw</translation> <translation id="3861633093716975811">Populaire video's</translation> <translation id="3892148308691398805">Tekst kopiëren</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index ba6e9f47..3560d76 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Administrer</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> nedlastinger er slettet</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> som sikkerhetsnøkkel</translation> <translation id="3856096718352044181">Verifiser at dette er en gyldig leverandør, eller prøv på nytt senere</translation> <translation id="3861633093716975811">Populære videoer</translation> <translation id="3892148308691398805">Kopiér teksten</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 1fb9060..456b146 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ଭିଡିଓ</translation> <translation id="3810973564298564668">ପରିଚାଳନା</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" />ଟି ଡାଉନ୍ଲୋଡ୍ ଡିଲିଟ୍ କରାଯାଇଛି</translation> -<translation id="3848957262889631524">ଏକ ସୁରକ୍ଷା କୀ ଭାବରେ Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">ଏହା ଏକ ବୈଧ ପ୍ରଦାନକାରୀ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> <translation id="3861633093716975811">ଲୋକପ୍ରିୟ ଭିଡିଓଗୁଡ଼ିକ</translation> <translation id="3892148308691398805">ଟେକ୍ସଟ୍ କପି କରନ୍ତୁ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 1996f673..010cd71 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Wideo</translation> <translation id="3810973564298564668">Zarządzaj</translation> <translation id="3819178904835489326">Usunięte pobrane pliki: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> jako klucz bezpieczeństwa</translation> <translation id="3856096718352044181">Sprawdź, czy jest to prawidłowy dostawca, lub spróbuj ponownie później</translation> <translation id="3861633093716975811">Popularne filmy</translation> <translation id="3892148308691398805">Kopiuj tekst</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 8ed2e47..710cb6b8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3810973564298564668">Gerenciar</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> downloads excluídos</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> como chave de segurança</translation> <translation id="3856096718352044181">Verifique se o provedor é válido ou tente novamente mais tarde</translation> <translation id="3861633093716975811">Vídeos mais acessados</translation> <translation id="3892148308691398805">Copiar texto</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index a2d6dce..83576422 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Vídeo</translation> <translation id="3810973564298564668">Gerir</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> transferências eliminadas</translation> -<translation id="3848957262889631524">O Google <ph name="APP_NAME" /> como uma chave de segurança</translation> <translation id="3856096718352044181">Confirme que se trata de um fornecedor válido ou tente novamente mais tarde.</translation> <translation id="3861633093716975811">Vídeos populares</translation> <translation id="3892148308691398805">Copiar texto</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index b39e119..6f35542b7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Gestionează</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> descărcări șterse</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> drept cheie de securitate</translation> <translation id="3856096718352044181">Confirmă dacă acesta este un furnizor valid sau încearcă din nou mai târziu</translation> <translation id="3861633093716975811">Videoclipuri populare</translation> <translation id="3892148308691398805">Copiază textul</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 8577108..f494cf7 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3810973564298564668">Настроить</translation> <translation id="3819178904835489326">Удаленные скачивания: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> как электронный ключ</translation> <translation id="3856096718352044181">Убедитесь, что это действительный поставщик услуг, или повторите попытку позже.</translation> <translation id="3861633093716975811">Популярные видео</translation> <translation id="3892148308691398805">Копировать текст</translation> @@ -480,7 +479,7 @@ <translation id="4605958867780575332">Удалено: <ph name="ITEM_TITLE" /></translation> <translation id="4616150815774728855">Открыть <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Использовать пароль</translation> -<translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 раскрытый пароль}one{# раскрытый пароль}few{# раскрытых пароля}many{# раскрытых паролей}other{# раскрытого пароля}}</translation> +<translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 раскрытый пароль.}one{# раскрытый пароль.}few{# раскрытых пароля.}many{# раскрытых паролей.}other{# раскрытого пароля.}}</translation> <translation id="4650364565596261010">По умолчанию</translation> <translation id="465657074423018424">Функция "Безопасный просмотр" защищает вас от вводящих в заблуждение сайтов. После ее отключения будьте особенно осторожны, посещая сайты, прежде всего когда вводите пароли.</translation> <translation id="4662373422909645029">Название не должно содержать цифры.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index a76b50e..cf2f8093 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">වීඩියෝ</translation> <translation id="3810973564298564668">කළමනාකරණය</translation> <translation id="3819178904835489326">බාගැනීම් <ph name="NUMBER_OF_DOWNLOADS" />ක් මැකිණි</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ආරක්ෂක යතුරක් ලෙස</translation> <translation id="3856096718352044181">මෙය වලංගු සැපයුම්කරුවෙක් බව සත්යාපන කරන්න, නැති නම් පසුව නැවත උත්සාහ කරන්න</translation> <translation id="3861633093716975811">ජනප්රිය වීඩියෝ</translation> <translation id="3892148308691398805">පෙළ පිටපත් කරන්න</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 1b558a6..17c6141 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Spravovať</translation> <translation id="3819178904835489326">Počet odstránených stiahnutých súborov: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524"><ph name="APP_NAME" /> Google ako bezpečnostný kľúč</translation> <translation id="3856096718352044181">Overte, že ide o platného poskytovateľa, alebo to skúste znova</translation> <translation id="3861633093716975811">Populárne videá</translation> <translation id="3892148308691398805">Kopírovať text</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 13bd2495..e5beb76 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Upravljanje</translation> <translation id="3819178904835489326">Št. izbrisanih prenosov: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> kot varnostni ključ.</translation> <translation id="3856096718352044181">Preverite, ali je ponudnik veljaven, in poskusite pozneje znova</translation> <translation id="3861633093716975811">Priljubljeni videoposnetki</translation> <translation id="3892148308691398805">Kopiraj besedilo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index ceb60c76..4e78dc1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Menaxho</translation> <translation id="3819178904835489326">U fshinë <ph name="NUMBER_OF_DOWNLOADS" /> shkarkime</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> si çelës sigurie</translation> <translation id="3856096718352044181">Verifiko që ky është një ofrues i vlefshëm ose provo përsëri më vonë</translation> <translation id="3861633093716975811">Video të njohura</translation> <translation id="3892148308691398805">Kopjo tekstin</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 5982183f7..8fa0715 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Promeni</translation> <translation id="3819178904835489326">Izbrisana preuzimanja: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> kao bezbednosni ključ</translation> <translation id="3856096718352044181">Proverite da li je ovo važeći dobavljač usluge ili probajte ponovo kasnije</translation> <translation id="3861633093716975811">Popularni video snimci</translation> <translation id="3892148308691398805">Kopiraj tekst</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 ad317d5..1a340c1 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Видео</translation> <translation id="3810973564298564668">Промени</translation> <translation id="3819178904835489326">Избрисана преузимања: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> као безбедносни кључ</translation> <translation id="3856096718352044181">Проверите да ли је ово важећи добављач услуге или пробајте поново касније</translation> <translation id="3861633093716975811">Популарни видео снимци</translation> <translation id="3892148308691398805">Копирај текст</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 5e81c263..48617a01 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Hantera</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> nedladdningar har raderats</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> som säkerhetsnyckel</translation> <translation id="3856096718352044181">Verifiera att detta är en giltig leverantör eller försök igen senare</translation> <translation id="3861633093716975811">Populära videor</translation> <translation id="3892148308691398805">Kopiera text</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index fdb165a..baef279 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Dhibiti</translation> <translation id="3819178904835489326">Vipakuliwa <ph name="NUMBER_OF_DOWNLOADS" /> vimefutwa</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> kama Ufunguo wa Usalama</translation> <translation id="3856096718352044181">Tafadhali thibitisha kuwa huyu ni mtoa huduma sahihi au ujaribu tena baadaye</translation> <translation id="3861633093716975811">Video maarufu</translation> <translation id="3892148308691398805">Nakili maandishi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index d4a07384e..81044a7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">வீடியோ</translation> <translation id="3810973564298564668">நிர்வகி</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> பதிவிறக்கங்கள் உள்ளன</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> ஐப் பாதுகாப்பு விசையாகப் பயன்படுத்தும் வசதி</translation> <translation id="3856096718352044181">இது சரியான வழங்குநர்தான் என்பதைச் சரிபார்க்கவும் அல்லது பிறகு முயலவும்</translation> <translation id="3861633093716975811">பிரபலமான வீடியோக்கள்</translation> <translation id="3892148308691398805">உரையை நகலெடு</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 2855471..3880fcb2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">వీడియో</translation> <translation id="3810973564298564668">నిర్వహించు</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> డౌన్లోడ్లు తొలగించబడ్డాయి</translation> -<translation id="3848957262889631524">'సెక్యూరిటీ కీ'గా Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">దయచేసి ఇది చెల్లుబాటు అయ్యే ప్రొవైడర్ అని వెరిఫై చేయండి లేదా తర్వాత మళ్లీ ట్రై చేయండి</translation> <translation id="3861633093716975811">జనాదరణ పొందిన వీడియోలు</translation> <translation id="3892148308691398805">టెక్స్ట్ను కాపీ చేయి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 649c6991..80fe5392 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">วิดีโอ</translation> <translation id="3810973564298564668">จัดการ</translation> <translation id="3819178904835489326">ลบการดาวน์โหลด <ph name="NUMBER_OF_DOWNLOADS" /> รายการแล้ว</translation> -<translation id="3848957262889631524">ใช้ Google <ph name="APP_NAME" /> เป็นคีย์ความปลอดภัย</translation> <translation id="3856096718352044181">โปรดยืนยันว่านี่เป็นผู้ให้บริการที่ถูกต้องหรือลองอีกครั้งภายหลัง</translation> <translation id="3861633093716975811">วิดีโอยอดนิยม</translation> <translation id="3892148308691398805">คัดลอกข้อความ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 9ccda44e..d8ce592e0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Yönet</translation> <translation id="3819178904835489326">İndirilen <ph name="NUMBER_OF_DOWNLOADS" /> dosya silindi</translation> -<translation id="3848957262889631524">Güvenlik Anahtarı olarak Google <ph name="APP_NAME" /></translation> <translation id="3856096718352044181">Lütfen bunun geçerli bir sağlayıcı olduğunu doğrulayın veya daha sonra tekrar deneyin</translation> <translation id="3861633093716975811">Popüler videolar</translation> <translation id="3892148308691398805">Metni kopyala</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 79d37b5..995736c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Відео</translation> <translation id="3810973564298564668">Змінити</translation> <translation id="3819178904835489326">Видалено завантажених файлів: <ph name="NUMBER_OF_DOWNLOADS" /></translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> як ключ безпеки</translation> <translation id="3856096718352044181">Підтвердьте, що цей постачальник активний, або повторіть спробу пізніше</translation> <translation id="3861633093716975811">Популярні відео</translation> <translation id="3892148308691398805">Копіювати текст</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 394953e..2880623 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
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">ویڈیو</translation> <translation id="3810973564298564668">نظم کریں</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ڈاؤن لوڈز کو حذف کر دیا گیا</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> بطور سیکیورٹی کلید</translation> <translation id="3856096718352044181">براہ کرم توثیق کریں کہ یہ درست فراہم کنندہ ہے یا بعد میں دوبارہ کوشش کریں</translation> <translation id="3861633093716975811">مقبول ویڈیوز</translation> <translation id="3892148308691398805">ٹیکسٹ کاپی کریں</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 63d386e..192cedb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Sozlash</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ta yuklanma o‘chirib tashlandi</translation> -<translation id="3848957262889631524">Google <ph name="APP_NAME" /> Elektron kalit sifatida</translation> <translation id="3856096718352044181">Bu ishonchli xizmat ekanini tekshiring yoki keyinroq qayta urining</translation> <translation id="3861633093716975811">Mashhur videolar</translation> <translation id="3892148308691398805">Matnni nusxalash</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 9c363137..0f6023e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Video</translation> <translation id="3810973564298564668">Quản lý</translation> <translation id="3819178904835489326">Đã xóa <ph name="NUMBER_OF_DOWNLOADS" /> bản tải xuống</translation> -<translation id="3848957262889631524"><ph name="APP_NAME" /> của Google là Khóa bảo mật</translation> <translation id="3856096718352044181">Vui lòng xác minh rằng đây là nhà cung cấp hợp lệ hoặc thử lại sau</translation> <translation id="3861633093716975811">Video phổ biến</translation> <translation id="3892148308691398805">Sao chép văn bản</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 873f65e4..5733a3e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">视频</translation> <translation id="3810973564298564668">管理</translation> <translation id="3819178904835489326">已删除 <ph name="NUMBER_OF_DOWNLOADS" /> 项下载内容</translation> -<translation id="3848957262889631524">使用 Google <ph name="APP_NAME" /> 作为安全密钥</translation> <translation id="3856096718352044181">请检查并确保这是一个有效的提供商,或者稍后重试</translation> <translation id="3861633093716975811">热门视频</translation> <translation id="3892148308691398805">复制文字</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 76c105a..3bef50d2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">影片</translation> <translation id="3810973564298564668">管理</translation> <translation id="3819178904835489326">已刪除 <ph name="NUMBER_OF_DOWNLOADS" /> 個下載項目</translation> -<translation id="3848957262889631524">使用 Google <ph name="APP_NAME" /> 作為安全密鑰</translation> <translation id="3856096718352044181">請驗證供應商的有效性,或稍後再試</translation> <translation id="3861633093716975811">熱門影片</translation> <translation id="3892148308691398805">複製文字</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 8209b06..953067a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">影片</translation> <translation id="3810973564298564668">管理</translation> <translation id="3819178904835489326">已刪除 <ph name="NUMBER_OF_DOWNLOADS" /> 個下載項目</translation> -<translation id="3848957262889631524">使用 Google <ph name="APP_NAME" /> 做為安全金鑰</translation> <translation id="3856096718352044181">請驗證供應商是否有效,或稍後再試</translation> <translation id="3861633093716975811">熱門影片</translation> <translation id="3892148308691398805">複製文字</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index b167623..8c10e97 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -381,7 +381,6 @@ <translation id="3810838688059735925">Ividiyo</translation> <translation id="3810973564298564668">Phatha</translation> <translation id="3819178904835489326"><ph name="NUMBER_OF_DOWNLOADS" /> ukulanda kutholakele</translation> -<translation id="3848957262889631524">I-Google <ph name="APP_NAME" /> Njengokhiye wokuqinisekisa ubunikazi</translation> <translation id="3856096718352044181">Sicela uqinisekise ukuthi lo ngumhlinzeki wangempela noma uzame futhi kamuva</translation> <translation id="3861633093716975811">Amavidiyo adumile</translation> <translation id="3892148308691398805">Kopisha umbhalo</translation>
diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc index 2f3290a..1932583 100644 --- a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc +++ b/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc
@@ -203,6 +203,61 @@ TabModel::BroadcastSessionRestoreComplete(); } +inline static base::TimeDelta GetTimeDelta(jlong ms) { + return base::TimeDelta::FromMilliseconds(static_cast<int64_t>(ms)); +} + +void JNI_TabModelJniBridge_LogFromCloseMetric( + JNIEnv* env, + jlong ms, + jboolean perceived) { + if (perceived) { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromCloseLatency_Perceived", + GetTimeDelta(ms)); + } else { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromCloseLatency_Actual", + GetTimeDelta(ms)); + } +} + +void JNI_TabModelJniBridge_LogFromExitMetric( + JNIEnv* env, + jlong ms, + jboolean perceived) { + if (perceived) { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromExitLatency_Perceived", + GetTimeDelta(ms)); + } else { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromExitLatency_Actual", + GetTimeDelta(ms)); + } +} + +void JNI_TabModelJniBridge_LogFromNewMetric(JNIEnv* env, + jlong ms, + jboolean perceived) { + if (perceived) { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromNewLatency_Perceived", + GetTimeDelta(ms)); + } else { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromNewLatency_Actual", + GetTimeDelta(ms)); + } +} + +void JNI_TabModelJniBridge_LogFromUserMetric( + JNIEnv* env, + jlong ms, + jboolean perceived) { + if (perceived) { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromUserLatency_Perceived", + GetTimeDelta(ms)); + } else { + UMA_HISTOGRAM_TIMES("Tabs.SwitchFromUserLatency_Actual", + GetTimeDelta(ms)); + } +} + TabModelJniBridge::~TabModelJniBridge() { TabModelList::RemoveTabModel(this); }
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc index b70b958..b138ce7 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -204,6 +204,10 @@ reason == PopupHidingReason::kEndEditing)) { return; // Don't close the popup while waiting for an update. } + // For tests, keep open when hiding is due to external stimuli. + if (keep_popup_open_for_testing_ && + reason == PopupHidingReason::kWidgetChanged) + return; // Don't close the popup because the browser window is resized. if (delegate_) { delegate_->ClearPreviewedForm(); delegate_->OnPopupHidden();
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.h b/chrome/browser/ui/autofill/autofill_popup_controller_impl.h index 724f4cb..c633d33 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.h +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.h
@@ -67,6 +67,8 @@ // view is destroyed. void PinView(); + void KeepPopupOpenForTesting() { keep_popup_open_for_testing_ = true; } + // Returns (not elided) suggestions currently held by the controller. base::span<const Suggestion> GetUnelidedSuggestions() const; @@ -173,6 +175,10 @@ // The current Autofill query values. std::vector<Suggestion> suggestions_; + // If set to true, the popup will stay open regardless of external changes on + // the machine that would normally cause the popup to be hidden. + bool keep_popup_open_for_testing_ = false; + // The line that is currently selected by the user, null indicates that no // line is currently selected. base::Optional<int> selected_line_;
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 95bc882..4b959f7f 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -501,6 +501,12 @@ popup_controller_->Show(open_args.suggestions, open_args.autoselect_first_suggestion.value(), open_args.popup_type); + + // When testing, try to keep popup open when the reason to hide is from an + // external browser frame resize that is extraneous to our testing goals. + if (keep_popup_open_for_testing_ && popup_controller_.get()) { + popup_controller_->KeepPopupOpenForTesting(); + } } void ChromeAutofillClient::UpdateAutofillPopupDataListValues(
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index d8d8f7ed..1233d02 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -160,6 +160,7 @@ base::WeakPtr<AutofillPopupControllerImpl> popup_controller_for_testing() { return popup_controller_; } + void KeepPopupOpenForTesting() { keep_popup_open_for_testing_ = true; } #if !defined(OS_ANDROID) // ZoomObserver implementation. @@ -180,6 +181,9 @@ base::WeakPtr<AutofillPopupControllerImpl> popup_controller_; CardUnmaskPromptControllerImpl unmask_controller_; std::unique_ptr<LogManager> log_manager_; + // If set to true, the popup will stay open regardless of external changes on + // the test machine, that may normally cause the popup to be hidden + bool keep_popup_open_for_testing_ = false; #if defined(OS_ANDROID) CardExpirationDateFixFlowControllerImpl card_expiration_date_fix_flow_controller_;
diff --git a/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm index 2b6d5c9..29b77112 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_builder_mac.mm
@@ -83,24 +83,39 @@ objectForKey:notification_constants:: kNotificationCloseButtonTag]]; - // Display the Settings button as the action button if there are either no - // developer-provided action buttons, or the alternate action menu is not - // available on this Mac version. This avoids needlessly showing the menu. - if (![_notificationData - objectForKey:notification_constants::kNotificationButtonOne] || - ![toast respondsToSelector:@selector(_alwaysShowAlternateActionMenu)]) { - if (settingsButton) { - [toast setActionButtonTitle: - [_notificationData - objectForKey:notification_constants:: - kNotificationSettingsButtonTag]]; - } else { - [toast setHasActionButton:NO]; + NSMutableArray* buttons = [NSMutableArray arrayWithCapacity:3]; + if ([_notificationData + objectForKey:notification_constants::kNotificationButtonOne]) { + [buttons addObject:[_notificationData + objectForKey:notification_constants:: + kNotificationButtonOne]]; + } + if ([_notificationData + objectForKey:notification_constants::kNotificationButtonTwo]) { + [buttons addObject:[_notificationData + objectForKey:notification_constants:: + kNotificationButtonTwo]]; + } + if (settingsButton) { + // If we can't show an action menu but need a settings button, only show + // the settings button and don't show developer provided actions. + if (![toast + respondsToSelector:@selector(_alwaysShowAlternateActionMenu)]) { + [buttons removeAllObjects]; } + [buttons addObject:[_notificationData + objectForKey:notification_constants:: + kNotificationSettingsButtonTag]]; + } + if ([buttons count] == 0) { + // Don't show action button if no actions needed. + [toast setHasActionButton:NO]; + } else if ([buttons count] == 1) { + // Only one action so we don't need a menu. Just set the button title. + [toast setActionButtonTitle:[buttons firstObject]]; } else { - // Otherwise show the alternate menu, then show the developer actions and - // finally the settings one if needed. + // Show the alternate menu with developer actions and settings if needed. DCHECK( [toast respondsToSelector:@selector(_alwaysShowAlternateActionMenu)]); DCHECK( @@ -110,24 +125,6 @@ objectForKey:notification_constants:: kNotificationOptionsButtonTag]]; [toast setValue:@YES forKey:@"_alwaysShowAlternateActionMenu"]; - - NSMutableArray* buttons = [NSMutableArray arrayWithCapacity:3]; - [buttons addObject:[_notificationData - objectForKey:notification_constants:: - kNotificationButtonOne]]; - if ([_notificationData - objectForKey:notification_constants::kNotificationButtonTwo]) { - [buttons addObject:[_notificationData - objectForKey:notification_constants:: - kNotificationButtonTwo]]; - } - if (settingsButton) { - [buttons - addObject:[_notificationData - objectForKey:notification_constants:: - kNotificationSettingsButtonTag]]; - } - [toast setValue:buttons forKey:@"_alternateActionButtonTitles"]; } }
diff --git a/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm index 4ef150a..0eb8427 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm
@@ -152,6 +152,34 @@ EXPECT_EQ("Close", base::SysNSStringToUTF8([notification otherButtonTitle])); } +TEST(NotificationBuilderMacTest, TestNotificationExtensionOneButton) { + base::scoped_nsobject<NotificationBuilder> builder( + [[NotificationBuilder alloc] initWithCloseLabel:@"Close" + optionsLabel:@"Options" + settingsLabel:@"Settings"]); + [builder setTitle:@"Title"]; + [builder setSubTitle:@"https://www.miguel.com"]; + [builder setContextMessage:@"SubTitle"]; + [builder setButtons:@"Button1" secondaryButton:@""]; + [builder setNotificationId:@"notificationId"]; + [builder setProfileId:@"profileId"]; + [builder setIncognito:false]; + [builder setCreatorPid:@1]; + [builder setNotificationType:[NSNumber + numberWithInteger:static_cast<int>( + NotificationHandler:: + Type::EXTENSION)]]; + [builder setShowSettingsButton:false]; + + NSUserNotification* notification = [builder buildUserNotification]; + + // No settings button but one action button without overflow menu. + EXPECT_TRUE([notification hasActionButton]); + EXPECT_EQ("Button1", + base::SysNSStringToUTF8([notification actionButtonTitle])); + EXPECT_EQ("Close", base::SysNSStringToUTF8([notification otherButtonTitle])); +} + TEST(NotificationBuilderMacTest, TestNotificationExtensionButtons) { base::scoped_nsobject<NotificationBuilder> builder( [[NotificationBuilder alloc] initWithCloseLabel:@"Close"
diff --git a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm index 963848d..71faf5a 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm
@@ -53,37 +53,30 @@ // Determine whether the user clicked on a button, and if they did, whether it // was a developer-provided button or the Settings button. if (activationType == NSUserNotificationActivationTypeActionButtonClicked) { - NSArray* alternateButtons = @[]; + int buttonCount = 1; if ([notification respondsToSelector:@selector(_alternateActionButtonTitles)]) { - alternateButtons = - [notification valueForKey:@"_alternateActionButtonTitles"]; + buttonCount = + [[notification valueForKey:@"_alternateActionButtonTitles"] count]; + } + + if (buttonCount > 1) { + // There are multiple buttons in the overflow menu. Get the clicked index. + buttonIndex = + [[notification valueForKey:@"_alternateActionIndex"] intValue]; + } else { + // There was only one button so we know it was clicked. + buttonIndex = 0; + buttonCount = 1; } BOOL settingsButtonRequired = [hasSettingsButton boolValue]; - BOOL multipleButtons = (alternateButtons.count > 0); + BOOL clickedLastButton = buttonIndex == buttonCount - 1; - // No developer actions, just the settings button. - if (!multipleButtons) { - DCHECK(settingsButtonRequired); + // The settings button is always the last button if present. + if (clickedLastButton && settingsButtonRequired) { operation = NotificationOperation::NOTIFICATION_SETTINGS; buttonIndex = notification_constants::kNotificationInvalidButtonIndex; - } else { - // 0 based array containing. - // Button 1 - // Button 2 (optional) - // Settings (if required) - NSNumber* actionIndex = - [notification valueForKey:@"_alternateActionIndex"]; - operation = settingsButtonRequired && (actionIndex.unsignedLongValue == - alternateButtons.count - 1) - ? NotificationOperation::NOTIFICATION_SETTINGS - : NotificationOperation::NOTIFICATION_CLICK; - buttonIndex = - settingsButtonRequired && - (actionIndex.unsignedLongValue == alternateButtons.count - 1) - ? notification_constants::kNotificationInvalidButtonIndex - : actionIndex.intValue; } }
diff --git a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm index e24a294..dfb63a8 100644 --- a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac_unittest.mm
@@ -142,6 +142,30 @@ EXPECT_EQ(0, buttonIndex.intValue); } +TEST_F(NotificationResponseBuilderMacTest, + TestNotificationOneActionNoSettingsClick) { + base::scoped_nsobject<NotificationBuilder> builder = + NewTestBuilder(NotificationHandler::Type::EXTENSION); + [builder setButtons:@"Button1" secondaryButton:@""]; + + NSUserNotification* notification = [builder buildUserNotification]; + + // This will be set by the notification center to indicate the only available + // button was clicked. + [notification setValue:@(NSUserNotificationActivationTypeActionButtonClicked) + forKey:@"_activationType"]; + NSDictionary* response = + [NotificationResponseBuilder buildActivatedDictionary:notification]; + + NSNumber* operation = + [response objectForKey:notification_constants::kNotificationOperation]; + NSNumber* buttonIndex = + [response objectForKey:notification_constants::kNotificationButtonIndex]; + EXPECT_EQ(static_cast<int>(NotificationOperation::NOTIFICATION_CLICK), + operation.intValue); + EXPECT_EQ(0, buttonIndex.intValue); +} + TEST_F(NotificationResponseBuilderMacTest, TestNotificationTwoActionClick) { base::scoped_nsobject<NotificationBuilder> builder = NewTestBuilder(NotificationHandler::Type::WEB_PERSISTENT);
diff --git a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc index 2f326bbf..09119fb 100644 --- a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc +++ b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
@@ -738,8 +738,9 @@ } // Verifies that https://crbug.com/45260 doesn't regress. -IN_PROC_BROWSER_TEST_F(OmniboxViewTest, - RendererInitiatedFocusSelectsAllWhenStartingBlurred) { +IN_PROC_BROWSER_TEST_F( + OmniboxViewTest, + DISABLED_RendererInitiatedFocusSelectsAllWhenStartingBlurred) { ASSERT_NO_FATAL_FAILURE(NavigateExpectUrl(GURL("about:blank"))); OmniboxView* omnibox_view = nullptr;
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc index e909ab3..0a28b8c7 100644 --- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc +++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -100,16 +100,16 @@ auto* high_contrast = AddChildView(std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_HIGH_CONTRAST_EXT), views::style::CONTEXT_DIALOG_BODY_TEXT)); - high_contrast->set_callback(base::BindRepeating(&InvertBubbleView::OpenLink, - base::Unretained(this), - kHighContrastExtensionUrl)); + high_contrast->SetCallback(base::BindRepeating(&InvertBubbleView::OpenLink, + base::Unretained(this), + kHighContrastExtensionUrl)); auto* dark_theme = AddChildView( std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_DARK_THEME), views::style::CONTEXT_DIALOG_BODY_TEXT)); - dark_theme->set_callback(base::BindRepeating(&InvertBubbleView::OpenLink, - base::Unretained(this), - kDarkThemeSearchUrl)); + dark_theme->SetCallback(base::BindRepeating(&InvertBubbleView::OpenLink, + base::Unretained(this), + kDarkThemeSearchUrl)); // Switching to high-contrast mode has a nasty habit of causing Chrome // top-level windows to lose focus, so closing the bubble on deactivate
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.cc index 1587910..dffddf8 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.cc
@@ -96,7 +96,7 @@ vertical_info_container_ptr->AddChildView(std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_APPLICATION_INFO_WEB_STORE_LINK))); view_in_store_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); - view_in_store_link->set_callback(base::BindRepeating( + view_in_store_link->SetCallback(base::BindRepeating( &AppInfoHeaderPanel::ShowAppInWebStore, base::Unretained(this))); view_in_store_link->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); } else {
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc index 0b6f2ae..aa7c0d3 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc
@@ -139,7 +139,7 @@ auto* link = description_and_labels_stack->AddChildView( std::make_unique<views::Link>(l10n_util::GetStringUTF16(message_id))); link->SetHorizontalAlignment(gfx::ALIGN_LEFT); - link->set_callback(base::BindRepeating(ptr, base::Unretained(this))); + link->SetCallback(base::BindRepeating(ptr, base::Unretained(this))); link->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); }; if (CanShowAppHomePage()) { @@ -200,7 +200,7 @@ std::make_unique<views::Combobox>(launch_options_combobox_model_.get()); launch_options_combobox->SetAccessibleName( l10n_util::GetStringUTF16(IDS_APPLICATION_INFO_LAUNCH_OPTIONS_ACCNAME)); - launch_options_combobox->set_callback(base::BindRepeating( + launch_options_combobox->SetCallback(base::BindRepeating( &AppInfoSummaryPanel::LaunchOptionsChanged, base::Unretained(this))); launch_options_combobox->SetSelectedIndex( launch_options_combobox_model_->GetIndexForLaunchType(GetLaunchType()));
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/arc_app_info_links_panel.cc b/chrome/browser/ui/views/apps/app_info_dialog/arc_app_info_links_panel.cc index eef8527..b2f2ae2 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/arc_app_info_links_panel.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/arc_app_info_links_panel.cc
@@ -31,7 +31,7 @@ auto manage_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_ARC_APPLICATION_INFO_MANAGE_LINK)); manage_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); - manage_link->set_callback(base::BindRepeating( + manage_link->SetCallback(base::BindRepeating( &ArcAppInfoLinksPanel::LinkClicked, base::Unretained(this))); manage_link->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); manage_link_ = AddChildView(std::move(manage_link));
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc index 7eb2453..3d3eb13 100644 --- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc +++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
@@ -201,7 +201,7 @@ auto new_card_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_UNMASK_NEW_CARD_LINK)); - new_card_link->set_callback(base::BindRepeating( + new_card_link->SetCallback(base::BindRepeating( &CardUnmaskPromptViews::LinkClicked, base::Unretained(this))); new_card_link_ = input_row_->AddChildView(std::move(new_card_link)); } @@ -350,13 +350,13 @@ // Add the month and year comboboxes if the expiration date is needed. auto month_input = std::make_unique<views::Combobox>(&month_combobox_model_); - month_input->set_callback(base::BindRepeating( + month_input->SetCallback(base::BindRepeating( &CardUnmaskPromptViews::DateChanged, base::Unretained(this))); month_input->SetAccessibleName( l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_UNMASK_EXPIRATION_MONTH)); month_input_ = input_row->AddChildView(std::move(month_input)); auto year_input = std::make_unique<views::Combobox>(&year_combobox_model_); - year_input->set_callback(base::BindRepeating( + year_input->SetCallback(base::BindRepeating( &CardUnmaskPromptViews::DateChanged, base::Unretained(this))); year_input->SetAccessibleName( l10n_util::GetStringUTF16(IDS_AUTOFILL_CARD_UNMASK_EXPIRATION_YEAR));
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc index be1f9fe..cd4f962 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -226,7 +226,7 @@ // Set up the month and year comboboxes. month_input_dropdown_ = new views::Combobox(&month_combobox_model_); - month_input_dropdown_->set_callback(base::BindRepeating( + month_input_dropdown_->SetCallback(base::BindRepeating( &SaveCardOfferBubbleViews::DialogModelChanged, base::Unretained(this))); month_input_dropdown_->SetAccessibleName( l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_MONTH)); @@ -241,7 +241,7 @@ } year_input_dropdown_ = new views::Combobox(&year_combobox_model_); - year_input_dropdown_->set_callback(base::BindRepeating( + year_input_dropdown_->SetCallback(base::BindRepeating( &SaveCardOfferBubbleViews::DialogModelChanged, base::Unretained(this))); year_input_dropdown_->SetAccessibleName( l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_EXPIRY_YEAR));
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc index 6aa36368..0810b8c 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.cc +++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -137,7 +137,7 @@ auto combobox = std::make_unique<views::Combobox>(std::move(combobox_model)); combobox->SetEnabled(combobox_enabled); - combobox->set_callback(base::BindRepeating(callback, combobox.get())); + combobox->SetCallback(base::BindRepeating(callback, combobox.get())); combobox->SetSelectedIndex(combobox_selected_index); layout->AddView(std::move(combobox)); } @@ -248,7 +248,7 @@ auto link = std::make_unique<views::Link>(item.title); link->SetElideBehavior(gfx::ELIDE_MIDDLE); link->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - link->set_callback(base::BindRepeating( + link->SetCallback(base::BindRepeating( [](const std::vector<Row>* items, const views::Link* link, ContentSettingBubbleContents* parent, const ui::Event& event) { const auto it = base::ranges::find(*items, link, &Row::second); @@ -526,7 +526,7 @@ std::make_unique<views::Link>(bubble_content.custom_link); custom_link->SetEnabled(bubble_content.custom_link_enabled); custom_link->SetMultiLine(true); - custom_link->set_callback( + custom_link->SetCallback( base::BindRepeating(&ContentSettingBubbleContents::CustomLinkClicked, base::Unretained(this))); custom_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc index 3a9cc580..eeba033 100644 --- a/chrome/browser/ui/views/create_application_shortcut_view.cc +++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -251,7 +251,7 @@ const std::string& pref_path) { auto checkbox = std::make_unique<views::Checkbox>(text, views::Button::PressedCallback()); - checkbox->set_callback(base::BindRepeating( + checkbox->SetCallback(base::BindRepeating( &CreateChromeApplicationShortcutView::CheckboxPressed, base::Unretained(this), pref_path, base::Unretained(checkbox.get()))); checkbox->SetChecked(profile_->GetPrefs()->GetBoolean(pref_path));
diff --git a/chrome/browser/ui/views/device_chooser_content_view.cc b/chrome/browser/ui/views/device_chooser_content_view.cc index 112f9052..d7d251b 100644 --- a/chrome/browser/ui/views/device_chooser_content_view.cc +++ b/chrome/browser/ui/views/device_chooser_content_view.cc
@@ -62,7 +62,7 @@ auto re_scan_button = std::make_unique<views::MdTextButton>( views::Button::PressedCallback(), l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN)); - re_scan_button->set_callback(base::BindRepeating( + re_scan_button->SetCallback(base::BindRepeating( [](views::MdTextButton* button, ChooserController* chooser_controller) { // Refreshing will cause the table view to yield focus, which will land // on the help button. Instead, briefly let the rescan button take
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc index b948a40..e3b1a2a 100644 --- a/chrome/browser/ui/views/download/download_item_view.cc +++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -256,7 +256,7 @@ // views to localize functionality and simplify this class. open_button_ = AddChildView(std::make_unique<TransparentButton>(this)); - open_button_->set_callback(base::BindRepeating( + open_button_->SetCallback(base::BindRepeating( &DownloadItemView::OpenButtonPressed, base::Unretained(this))); file_name_label_ = AddChildView(std::make_unique<views::StyledLabel>());
diff --git a/chrome/browser/ui/views/extensions/expandable_container_view.cc b/chrome/browser/ui/views/extensions/expandable_container_view.cc index 7800e59..e33ce1f 100644 --- a/chrome/browser/ui/views/extensions/expandable_container_view.cc +++ b/chrome/browser/ui/views/extensions/expandable_container_view.cc
@@ -58,7 +58,7 @@ details_view_->SetVisible(false); auto details_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_DETAILS)); - details_link->set_callback(base::BindRepeating( + details_link->SetCallback(base::BindRepeating( &ExpandableContainerView::ToggleDetailLevel, base::Unretained(this))); details_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); details_link_ = AddChildView(std::move(details_link));
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc index 5f945c5a..6c708dba 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -231,7 +231,7 @@ if (prompt_->has_webstore_data()) { auto store_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_STORE_LINK)); - store_link->set_callback(base::BindRepeating( + store_link->SetCallback(base::BindRepeating( &ExtensionInstallDialogView::LinkClicked, base::Unretained(this))); SetExtraView(std::move(store_link)); } else if (prompt_->ShouldDisplayWithholdingUI()) {
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index a7aaf2378..757b9d5 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -244,7 +244,7 @@ if (model_->show_key_binding()) { auto* manage_shortcut = AddChildView(std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALLED_MANAGE_SHORTCUTS))); - manage_shortcut->set_callback(base::BindRepeating( + manage_shortcut->SetCallback(base::BindRepeating( &ExtensionInstalledBubbleView::LinkClicked, base::Unretained(this))); }
diff --git a/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc b/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc index c346a400..2802b93 100644 --- a/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc +++ b/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc
@@ -225,7 +225,7 @@ auto* gallery_view = container->AddChildView(std::make_unique<MediaGalleryCheckboxView>( gallery.pref_info, trailing_vertical_space, this)); - gallery_view->checkbox()->set_callback(base::BindRepeating( + gallery_view->checkbox()->SetCallback(base::BindRepeating( &MediaGalleriesDialogViews::ButtonPressed, base::Unretained(this), base::BindRepeating( [](MediaGalleriesDialogController* controller,
diff --git a/chrome/browser/ui/views/find_bar_view.cc b/chrome/browser/ui/views/find_bar_view.cc index 37b4b14d..07dfc25e 100644 --- a/chrome/browser/ui/views/find_bar_view.cc +++ b/chrome/browser/ui/views/find_bar_view.cc
@@ -162,7 +162,7 @@ .SetTooltipText( l10n_util::GetStringUTF16(IDS_FIND_IN_PAGE_PREVIOUS_TOOLTIP)) .Build(); - find_previous_button->set_callback(base::BindRepeating( + find_previous_button->SetCallback(base::BindRepeating( &FindBarView::FindNext, base::Unretained(this), true)); find_previous_button_ = AddChildView(std::move(find_previous_button)); SetCommonButtonAttributes(find_previous_button_); @@ -174,7 +174,7 @@ l10n_util::GetStringUTF16(IDS_FIND_IN_PAGE_NEXT_TOOLTIP)) .SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_NEXT)) .Build(); - find_next_button->set_callback(base::BindRepeating( + find_next_button->SetCallback(base::BindRepeating( &FindBarView::FindNext, base::Unretained(this), false)); find_next_button_ = AddChildView(std::move(find_next_button)); SetCommonButtonAttributes(find_next_button_); @@ -185,8 +185,8 @@ IDS_FIND_IN_PAGE_CLOSE_TOOLTIP)) .SetAnimationDuration(base::TimeDelta()) .Build(); - close_button->set_callback(base::BindRepeating(&FindBarView::EndFindSession, - base::Unretained(this))); + close_button->SetCallback(base::BindRepeating(&FindBarView::EndFindSession, + base::Unretained(this))); close_button_ = AddChildView(std::move(close_button)); SetCommonButtonAttributes(close_button_);
diff --git a/chrome/browser/ui/views/first_run_dialog.cc b/chrome/browser/ui/views/first_run_dialog.cc index ab8380f..adcdaefa 100644 --- a/chrome/browser/ui/views/first_run_dialog.cc +++ b/chrome/browser/ui/views/first_run_dialog.cc
@@ -71,9 +71,9 @@ SetButtons(ui::DIALOG_BUTTON_OK); SetExtraView( std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE))) - ->set_callback(base::BindRepeating(&platform_util::OpenExternal, - base::Unretained(profile), - GURL(chrome::kLearnMoreReportingURL))); + ->SetCallback(base::BindRepeating(&platform_util::OpenExternal, + base::Unretained(profile), + GURL(chrome::kLearnMoreReportingURL))); set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType( views::TEXT, views::TEXT));
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc index 599de30..78e57dc 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -580,7 +580,7 @@ views::Button::PressedCallback callback, int accessibility_string_id, ViewID view_id) { - button->set_callback(std::move(callback)); + button->SetCallback(std::move(callback)); button->SetAccessibleName(l10n_util::GetStringUTF16(accessibility_string_id)); button->SetID(view_id); AddChildView(button);
diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_device_selector_view.cc b/chrome/browser/ui/views/global_media_controls/media_notification_device_selector_view.cc index 7d0adb50..8453aba 100644 --- a/chrome/browser/ui/views/global_media_controls/media_notification_device_selector_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_notification_device_selector_view.cc
@@ -102,7 +102,7 @@ expand_button_ = expand_button_strip_->AddChildView( std::make_unique<ExpandDeviceSelectorButton>(this)); - expand_button_->set_callback(base::BindRepeating( + expand_button_->SetCallback(base::BindRepeating( &MediaNotificationDeviceSelectorView::ExpandButtonPressed, base::Unretained(this)));
diff --git a/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc b/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc index feaa74c..148b845 100644 --- a/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc +++ b/chrome/browser/ui/views/hung_plugin_tab_helper_unittest.cc
@@ -79,7 +79,7 @@ ASSERT_EQ(1u, infobar_service->infobar_count()); auto* infobar = static_cast<ConfirmInfoBar*>(infobar_service->infobar_at(0)); views::MdTextButton* ok_button = infobar->ok_button_for_testing(); - ok_button->set_callback( + ok_button->SetCallback( base::BindRepeating(&RemoveOnlyOnce, base::Unretained(infobar))); views::test::ButtonTestApi(ok_button).NotifyClick(DummyEvent()); EXPECT_EQ(0u, infobar_service->infobar_count());
diff --git a/chrome/browser/ui/views/infobars/infobar_view.cc b/chrome/browser/ui/views/infobars/infobar_view.cc index 8701890..7cf1744 100644 --- a/chrome/browser/ui/views/infobars/infobar_view.cc +++ b/chrome/browser/ui/views/infobars/infobar_view.cc
@@ -275,7 +275,7 @@ views::Link* link = new views::Link(text, views::style::CONTEXT_DIALOG_BODY_TEXT); SetLabelDetails(link); - link->set_callback( + link->SetCallback( base::BindRepeating(&InfoBarView::LinkClicked, base::Unretained(this))); link->SetProperty(kLabelType, LabelType::kLink); return link;
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc index 493ef920..b4f699c4 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -142,7 +142,7 @@ l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE)); auto link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE)); - link->set_callback( + link->SetCallback( base::BindRepeating(&CookieControlsBubbleView::NotWorkingLinkClicked, base::Unretained(this))); extra_view_ = SetExtraView(std::move(link)); @@ -203,7 +203,7 @@ auto cookie_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_BLOCKED_COOKIES_INFO)); cookie_link->SetMultiLine(true); - cookie_link->set_callback( + cookie_link->SetCallback( base::BindRepeating(&CookieControlsBubbleView::ShowCookiesLinkClicked, base::Unretained(this))); cookie_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc index d644a73..f4194e1f 100644 --- a/chrome/browser/ui/views/network_profile_bubble_view.cc +++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -57,7 +57,7 @@ SetButtons(ui::DIALOG_BUTTON_OK); auto* learn_more = SetExtraView( std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE))); - learn_more->set_callback(base::BindRepeating( + learn_more->SetCallback(base::BindRepeating( &NetworkProfileBubbleView::LinkClicked, base::Unretained(this))); chrome::RecordDialogCreation( chrome::DialogIdentifier::NETWORK_SHARE_PROFILE_WARNING);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc index c25350c..6e263cab 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
@@ -393,7 +393,14 @@ EXPECT_EQ(color_before_focus, omnibox_view()->GetBackgroundColor()); } -IN_PROC_BROWSER_TEST_F(OmniboxPopupContentsViewTest, EmitAccessibilityEvents) { +// Flaky on Mac: https://crbug.com/1140153. +#if defined(OS_MAC) +#define MAYBE_EmitAccessibilityEvents DISABLED_EmitAccessibilityEvents +#else +#define MAYBE_EmitAccessibilityEvents EmitAccessibilityEvents +#endif +IN_PROC_BROWSER_TEST_F(OmniboxPopupContentsViewTest, + MAYBE_EmitAccessibilityEvents) { // Creation and population of the popup should not result in a text/name // change accessibility event. TestAXEventObserver observer;
diff --git a/chrome/browser/ui/views/page_info/permission_selector_row.cc b/chrome/browser/ui/views/page_info/permission_selector_row.cc index 558ea90..72a5c05 100644 --- a/chrome/browser/ui/views/page_info/permission_selector_row.cc +++ b/chrome/browser/ui/views/page_info/permission_selector_row.cc
@@ -121,8 +121,8 @@ bool enabled, bool use_default) : views::Combobox(model), model_(model) { - set_callback(base::BindRepeating(&PermissionCombobox::PermissionChanged, - base::Unretained(this))); + SetCallback(base::BindRepeating(&PermissionCombobox::PermissionChanged, + base::Unretained(this))); SetEnabled(enabled); UpdateSelectedIndex(use_default); SetSizeToLargestLabel(false);
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc index 388d300..2e1eaa6 100644 --- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
@@ -627,13 +627,13 @@ // If the user clicks 'leave site', the warning should re-appear when the user // re-visits the page. // Flaky on Mac: https://crbug.com/1139955 -#if defined(OS_MAC) +#if defined(OS_MAC) || defined(OS_WIN) #define MAYBE_LeaveSiteStillWarnsAfter DISABLED_LeaveSiteStillWarnsAfter #else #define MAYBE_LeaveSiteStillWarnsAfter LeaveSiteStillWarnsAfter #endif IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest, - LeaveSiteStillWarnsAfter) { + MAYBE_LeaveSiteStillWarnsAfter) { auto kNavigatedUrl = GetURL("site1.com"); if (!IsSuspiciousSiteWarningEnabled()) { @@ -861,7 +861,7 @@ #define MAYBE_SafetyTipShownHistogram SafetyTipShownHistogram #endif IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest, - SafetyTipShownHistogram) { + MAYBE_SafetyTipShownHistogram) { const char kHistogramName[] = "Security.SafetyTips.SafetyTipShown"; base::HistogramTester histograms; @@ -1032,7 +1032,7 @@ #define MAYBE_TimeOpenHistogram TimeOpenHistogram #endif IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest, - TimeOpenHistogram) { + MAYBE_TimeOpenHistogram) { if (!IsSuspiciousSiteWarningEnabled()) { return; } @@ -1284,7 +1284,7 @@ WarningDismissalCausesUkmRecordingForBlocklist #endif IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest, - WarningDismissalCausesUkmRecordingForBlocklist) { + MAYBE_WarningDismissalCausesUkmRecordingForBlocklist) { // Only test when any UI is actually enabled. if (!IsSuspiciousSiteWarningEnabled()) { return;
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc index 8a2ecb98..07f1f15 100644 --- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
@@ -82,7 +82,7 @@ auto* row_view = AddChildView(std::make_unique<views::View>()); auto* checkbox = row_view->AddChildView(std::make_unique<views::Checkbox>( base::string16(), views::Button::PressedCallback())); - checkbox->set_callback(base::BindRepeating( + checkbox->SetCallback(base::BindRepeating( &PasswordSaveUnsyncedCredentialsLocallyView::ButtonPressed, base::Unretained(this), base::Unretained(checkbox))); checkbox->SetBorder(views::CreateEmptyBorder(
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc index 0cf6b33a..5074f611 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -286,11 +286,11 @@ } else { std::unique_ptr<views::EditableCombobox> username_dropdown = CreateUsernameEditableCombobox(password_form); - username_dropdown->set_callback(base::BindRepeating( + username_dropdown->SetCallback(base::BindRepeating( &PasswordSaveUpdateView::OnContentChanged, base::Unretained(this))); std::unique_ptr<views::EditableCombobox> password_dropdown = CreatePasswordEditableCombobox(password_form, are_passwords_revealed_); - password_dropdown->set_callback(base::BindRepeating( + password_dropdown->SetCallback(base::BindRepeating( &PasswordSaveUpdateView::OnContentChanged, base::Unretained(this))); std::unique_ptr<views::ToggleImageButton> password_view_button =
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc index 9612985..e6287b5 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
@@ -377,7 +377,7 @@ controller_.GetPrimaryAccountEmail(), controller_.GetPrimaryAccountAvatar(ComboboxIconSize()), controller_.IsUsingAccountStore()); - destination_dropdown->set_callback(base::BindRepeating( + destination_dropdown->SetCallback(base::BindRepeating( &PasswordSaveUpdateWithAccountStoreView::DestinationChanged, base::Unretained(this))); destination_dropdown_ = destination_dropdown.get(); @@ -414,12 +414,12 @@ } else { std::unique_ptr<views::EditableCombobox> username_dropdown = CreateUsernameEditableCombobox(password_form); - username_dropdown->set_callback(base::BindRepeating( + username_dropdown->SetCallback(base::BindRepeating( &PasswordSaveUpdateWithAccountStoreView::OnContentChanged, base::Unretained(this))); std::unique_ptr<views::EditableCombobox> password_dropdown = CreatePasswordEditableCombobox(password_form, are_passwords_revealed_); - password_dropdown->set_callback(base::BindRepeating( + password_dropdown->SetCallback(base::BindRepeating( &PasswordSaveUpdateWithAccountStoreView::OnContentChanged, base::Unretained(this))); std::unique_ptr<views::ToggleImageButton> password_view_button =
diff --git a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc index b3970891..572ed215 100644 --- a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc +++ b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc
@@ -189,7 +189,7 @@ layout->StartRow(views::GridLayout::kFixedSize, 1); if (requesting_expiration) { auto month = std::make_unique<views::Combobox>(&month_combobox_model_); - month->set_callback(base::BindRepeating( + month->SetCallback(base::BindRepeating( &CvcUnmaskViewController::OnPerformAction, base::Unretained(this))); month->SetID(static_cast<int>(DialogViewID::CVC_MONTH)); month->SelectValue(credit_card_.Expiration2DigitMonthAsString()); @@ -197,7 +197,7 @@ layout->AddView(std::move(month)); auto year = std::make_unique<views::Combobox>(&year_combobox_model_); - year->set_callback(base::BindRepeating( + year->SetCallback(base::BindRepeating( &CvcUnmaskViewController::OnPerformAction, base::Unretained(this))); year->SetID(static_cast<int>(DialogViewID::CVC_YEAR)); year->SelectValue(credit_card_.Expiration4DigitYearAsString());
diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc index 67a21f6..bcce73d 100644 --- a/chrome/browser/ui/views/payments/editor_view_controller.cc +++ b/chrome/browser/ui/views/payments/editor_view_controller.cc
@@ -221,7 +221,7 @@ // Using autofill field type as a view ID. combobox->SetID(GetInputFieldViewId(field.type)); - combobox->set_callback( + combobox->SetCallback( base::BindRepeating(&EditorViewController::OnPerformAction, base::Unretained(this), combobox.get())); comboboxes_.insert(std::make_pair(combobox.get(), field));
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc index 12c2918e..f3c0804 100644 --- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc +++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
@@ -146,7 +146,7 @@ message_container_view->AddChildView(message_label_); learn_more_link_ = new views::Link(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); - learn_more_link_->set_callback(base::BindRepeating( + learn_more_link_->SetCallback(base::BindRepeating( &PluginVmInstallerView::OnLinkClicked, base::Unretained(this))); learn_more_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); message_container_view->AddChildView(learn_more_link_);
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc index 727ac14..c79291a1 100644 --- a/chrome/browser/ui/views/sad_tab_view.cc +++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -557,7 +557,7 @@ auto help_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(GetHelpLinkTitle())); - help_link->set_callback(base::BindRepeating( + help_link->SetCallback(base::BindRepeating( &SadTab::PerformAction, base::Unretained(this), Action::HELP_LINK)); layout->StartRowWithPadding(views::GridLayout::kFixedSize, column_set_id, views::GridLayout::kFixedSize,
diff --git a/chrome/browser/ui/views/screen_capture_notification_ui_views.cc b/chrome/browser/ui/views/screen_capture_notification_ui_views.cc index 8a680b0..0bb507da 100644 --- a/chrome/browser/ui/views/screen_capture_notification_ui_views.cc +++ b/chrome/browser/ui/views/screen_capture_notification_ui_views.cc
@@ -148,7 +148,7 @@ auto hide_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_HIDE)); - hide_link->set_callback(base::BindRepeating( + hide_link->SetCallback(base::BindRepeating( [](ScreenCaptureNotificationUIViews* view) { view->GetWidget()->Minimize(); },
diff --git a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc index dfdf8c6e..405d463 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc +++ b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc
@@ -104,7 +104,7 @@ auto learn_more_link = std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE)); - learn_more_link->set_callback( + learn_more_link->SetCallback( base::BindRepeating(&OneClickSigninLinksDelegate::OnLearnMoreLinkClicked, std::move(delegate), true)); learn_more_link->SetHorizontalAlignment(gfx::ALIGN_LEFT); @@ -113,7 +113,7 @@ auto advanced_link = std::make_unique<views::Link>( l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_ADVANCED)); - advanced_link->set_callback(base::BindRepeating( + advanced_link->SetCallback(base::BindRepeating( [](OneClickSigninDialogView* view) { if (view->Accept()) Hide();
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 8826c77..e242617 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -18,6 +18,7 @@ #include "base/containers/adapters.h" #include "base/containers/flat_map.h" #include "base/feature_list.h" +#include "base/memory/weak_ptr.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" @@ -477,7 +478,14 @@ drag_controller_->event_source() == EventSourceFromEvent(event)) { gfx::Point screen_location(event.location()); views::View::ConvertPointToScreen(view, &screen_location); + + // Note: |tab_strip_| can be destroyed during drag, also destroying + // |this|. + base::WeakPtr<TabDragContext> weak_ptr(weak_factory_.GetWeakPtr()); drag_controller_->Drag(screen_location); + + if (!weak_ptr) + return; } // Note: |drag_controller| can be set to null during the drag above. @@ -1038,6 +1046,8 @@ // The controller for a drag initiated from a Tab. Valid for the lifetime of // the drag session. std::unique_ptr<TabDragController> drag_controller_; + + base::WeakPtrFactory<TabDragContext> weak_factory_{this}; }; ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc index 34911e3d..fd6bf791 100644 --- a/chrome/browser/ui/views/translate/translate_bubble_view.cc +++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -696,7 +696,7 @@ std::make_unique<views::MdTextButtonWithDownArrow>( views::Button::PressedCallback(), l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_OPTIONS_MENU_BUTTON)); - translate_options_button->set_callback(base::BindRepeating( + translate_options_button->SetCallback(base::BindRepeating( &TranslateBubbleView::ShowOptionsMenu, base::Unretained(this), base::Unretained(translate_options_button.get()))); translate_options_button->SetID(BUTTON_ID_OPTIONS_MENU); @@ -804,7 +804,7 @@ advanced_always_translate_checkbox->SetID(BUTTON_ID_ALWAYS_TRANSLATE); } - source_language_combobox->set_callback(base::BindRepeating( + source_language_combobox->SetCallback(base::BindRepeating( &TranslateBubbleView::SourceLanguageChanged, base::Unretained(this))); source_language_combobox_ = source_language_combobox.get(); @@ -838,7 +838,7 @@ auto target_language_combobox = std::make_unique<views::Combobox>(target_language_combobox_model_.get()); - target_language_combobox->set_callback(base::BindRepeating( + target_language_combobox->SetCallback(base::BindRepeating( &TranslateBubbleView::TargetLanguageChanged, base::Unretained(this))); target_language_combobox_ = target_language_combobox.get(); @@ -1008,7 +1008,7 @@ auto tab_translate_options_button = views::CreateVectorImageButtonWithNativeTheme( views::Button::PressedCallback(), kBrowserToolsIcon); - tab_translate_options_button->set_callback(base::BindRepeating( + tab_translate_options_button->SetCallback(base::BindRepeating( &TranslateBubbleView::ShowOptionsMenu, base::Unretained(this), base::Unretained(tab_translate_options_button.get()))); InstallCircleHighlightPathGenerator(tab_translate_options_button.get());
diff --git a/chrome/browser/ui/webui/app_launcher_login_handler.cc b/chrome/browser/ui/webui/app_launcher_login_handler.cc index 25b2776f..9dfbd2f 100644 --- a/chrome/browser/ui/webui/app_launcher_login_handler.cc +++ b/chrome/browser/ui/webui/app_launcher_login_handler.cc
@@ -51,7 +51,7 @@ const int kLength = 27; SkBitmap bmp = skia::ImageOperations::Resize(*image.ToSkBitmap(), skia::ImageOperations::RESIZE_BEST, kLength, kLength); - SkCanvas canvas(bmp, SkSurfaceProps{}); + SkCanvas canvas(bmp); // Draw a gray border on the inside of the icon. SkPaint paint;
diff --git a/chrome/browser/ui/webui/chromeos/login/l10n_util.cc b/chrome/browser/ui/webui/chromeos/login/l10n_util.cc index 169c7f9..fd5b887 100644 --- a/chrome/browser/ui/webui/chromeos/login/l10n_util.cc +++ b/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
@@ -496,18 +496,6 @@ return fallback_locale; } -std::unique_ptr<base::ListValue> GetAcceptLanguageList() { - // Collect the language codes from the supported accept-languages. - const std::string app_locale = g_browser_process->GetApplicationLocale(); - std::vector<std::string> accept_language_codes; - l10n_util::GetAcceptLanguagesForLocale(app_locale, &accept_language_codes); - return GetLanguageList( - *input_method::InputMethodManager::Get()->GetSupportedInputMethods(), - accept_language_codes, - StartupCustomizationDocument::GetInstance()->configured_locales(), - false); -} - std::unique_ptr<base::ListValue> GetAndActivateLoginKeyboardLayouts( const std::string& locale, const std::string& selected, @@ -593,13 +581,4 @@ base::BindOnce(&GetKeyboardLayoutsForResolvedLocale, locale, callback)); } -std::unique_ptr<base::DictionaryValue> GetCurrentKeyboardLayout() { - const input_method::InputMethodDescriptor current_input_method = - input_method::InputMethodManager::Get() - ->GetActiveIMEState() - ->GetCurrentInputMethod(); - return CreateInputMethodsEntry(current_input_method, - current_input_method.id()); -} - } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/l10n_util.h b/chrome/browser/ui/webui/chromeos/login/l10n_util.h index 53a71fb..52e435a 100644 --- a/chrome/browser/ui/webui/chromeos/login/l10n_util.h +++ b/chrome/browser/ui/webui/chromeos/login/l10n_util.h
@@ -14,7 +14,6 @@ #include "chrome/browser/chromeos/base/locale_util.h" namespace base { -class DictionaryValue; class ListValue; } @@ -66,13 +65,6 @@ const base::ListValue& available_locales, const std::string& fallback_locale); -// Return a list of supported accept languages. The listed languages can be used -// in the Accept-Language header. The return value will look like: -// [{'code': 'fi', 'displayName': 'Finnish', 'nativeDisplayName': 'suomi'}, ...] -// The most relevant languages, read from initial_locale in VPD, will be first -// in the list. -std::unique_ptr<base::ListValue> GetAcceptLanguageList(); - // Return a list of keyboard layouts that can be used for |locale| on the login // screen. Each list entry is a dictionary that contains data such as an ID and // a display name. The list will consist of the device's hardware layouts, @@ -100,10 +92,6 @@ const GetKeyboardLayoutsForLocaleCallback& callback, const std::string& locale); -// Returns the current keyboard layout, expressed as a dictionary that contains -// data such as an ID and a display name. -std::unique_ptr<base::DictionaryValue> GetCurrentKeyboardLayout(); - } // namespace chromeos #endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_L10N_UTIL_H_
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc index 93c38ae..8d67180 100644 --- a/chrome/browser/ui/webui/extensions/extensions_ui.cc +++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -236,6 +236,7 @@ {"shortcutIncludeStartModifier", IDS_EXTENSIONS_INCLUDE_START_MODIFIER}, {"shortcutTooManyModifiers", IDS_EXTENSIONS_TOO_MANY_MODIFIERS}, {"shortcutNeedCharacter", IDS_EXTENSIONS_NEED_CHARACTER}, + {"subpageArrowRoleDescription", IDS_EXTENSIONS_SUBPAGE_BUTTON}, {"toolbarDevMode", IDS_EXTENSIONS_DEVELOPER_MODE}, {"toolbarLoadUnpacked", IDS_EXTENSIONS_TOOLBAR_LOAD_UNPACKED}, {"toolbarPack", IDS_EXTENSIONS_TOOLBAR_PACK},
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc index 688fddd..2fd2dad8a 100644 --- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc +++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -601,8 +601,6 @@ // Colors. substitutions["colorBackground"] = color_utils::SkColorToRgbaString(color_background); - substitutions["colorLink"] = color_utils::SkColorToRgbString( - GetThemeColor(tp, ThemeProperties::COLOR_NTP_LINK)); substitutions["backgroundBarDetached"] = GetNewTabBackgroundCSS(tp, false); substitutions["backgroundBarAttached"] = GetNewTabBackgroundCSS(tp, true); substitutions["backgroundTiling"] = GetNewTabBackgroundTilingCSS(tp);
diff --git a/chrome/browser/ukm_worker_browsertest.cc b/chrome/browser/ukm_worker_browsertest.cc index 4b4d488a..d7a6ae3 100644 --- a/chrome/browser/ukm_worker_browsertest.cc +++ b/chrome/browser/ukm_worker_browsertest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <algorithm> + #include "base/bind.h" #include "build/build_config.h" #include "chrome/browser/ui/browser.h" @@ -43,14 +45,15 @@ } // namespace -IN_PROC_BROWSER_TEST_F(UkmWorkerBrowserTest, DocumentClientIdIsPlumbed) { +IN_PROC_BROWSER_TEST_F(UkmWorkerBrowserTest, + SharedWorker_DocumentClientIdIsPlumbed) { using DocumentCreatedEntry = ukm::builders::DocumentCreated; using AddedEntry = ukm::builders::Worker_ClientAdded; embedded_test_server()->RegisterRequestHandler(base::BindRepeating( [](const net::test_server::HttpRequest& request) -> std::unique_ptr<net::test_server::HttpResponse> { - if (request.GetURL().path() != "/worker_script") + if (request.GetURL().path() != "/shared_worker_script") return nullptr; auto response = std::make_unique<net::test_server::BasicHttpResponse>(); response->set_content_type("text/javascript"); @@ -62,9 +65,9 @@ content::DOMMessageQueue messages; ASSERT_TRUE(content::NavigateToURL( - web_contents(), - embedded_test_server()->GetURL( - "/workers/create_shared_worker.html?worker_url=/worker_script"))); + web_contents(), embedded_test_server()->GetURL( + "/workers/create_shared_worker.html?worker_url=/" + "shared_worker_script"))); // Wait until the worker script is loaded and executed, to ensure the UKM is // logged. @@ -94,3 +97,159 @@ EXPECT_EQ(static_cast<int64_t>(WorkerType::kSharedWorker), worker_type); } + +IN_PROC_BROWSER_TEST_F(UkmWorkerBrowserTest, + ServiceWorker_DocumentClientIdIsPlumbed) { + using DocumentCreatedEntry = ukm::builders::DocumentCreated; + using AddedEntry = ukm::builders::Worker_ClientAdded; + + ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(content::NavigateToURL( + web_contents(), embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html"))); + + // Wait until the worker script is loaded and executed, to ensure the UKM is + // logged. + EXPECT_EQ("DONE", EvalJs(web_contents(), + "register('fetch_event_respond_with_fetch.js');")); + + std::vector<const ukm::mojom::UkmEntry*> doc_created_entries = + test_ukm_recorder().GetEntriesByName(DocumentCreatedEntry::kEntryName); + ASSERT_EQ(1u, doc_created_entries.size()); + const ukm::SourceId document_source_id = doc_created_entries[0]->source_id; + + // Check that we got the Worker.ClientAdded event. + std::vector<const ukm::mojom::UkmEntry*> connected_entries = + test_ukm_recorder().GetEntriesByName(AddedEntry::kEntryName); + ASSERT_EQ(1u, connected_entries.size()); + const ukm::SourceId client_source_id = *test_ukm_recorder().GetEntryMetric( + connected_entries[0], AddedEntry::kClientSourceIdName); + const ukm::SourceId worker_source_id = connected_entries[0]->source_id; + const int64_t worker_type = *test_ukm_recorder().GetEntryMetric( + connected_entries[0], AddedEntry::kWorkerTypeName); + + // Check that we have two source IDs in play (namely that of the + // client/document, and the ServiceWorker) and that they are different. + EXPECT_EQ(document_source_id, client_source_id); + EXPECT_NE(worker_source_id, client_source_id); + + EXPECT_EQ(static_cast<int64_t>(WorkerType::kServiceWorker), worker_type); +} + +IN_PROC_BROWSER_TEST_F(UkmWorkerBrowserTest, + ServiceWorker_DedicatedWorkerClientIdIsIgnored) { + ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(content::NavigateToURL( + web_contents(), embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html"))); + EXPECT_EQ("DONE", EvalJs(web_contents(), + "register('fetch_event_respond_with_fetch.js');")); + + // Wait until the worker script is loaded and executed, to ensure the UKM is + // logged. + EXPECT_EQ("loaded", EvalJs(web_contents(), R"SCRIPT( + const worker = new Worker('../workers/dedicated_worker.js'); + const onmessage_promise = new Promise(r => worker.onmessage = r); + async function waitForMessage() { + const message = await onmessage_promise; + return message.data; + } + waitForMessage(); + )SCRIPT")); + + // Check that we only have the single Worker.ClientAdded event (for the + // document). + std::vector<const ukm::mojom::UkmEntry*> connected_entries = + test_ukm_recorder().GetEntriesByName( + ukm::builders::Worker_ClientAdded::kEntryName); + EXPECT_EQ(1u, connected_entries.size()); +} + +IN_PROC_BROWSER_TEST_F(UkmWorkerBrowserTest, + ServiceWorker_SharedWorkerClientIdIsPlumbed) { + using AddedEntry = ukm::builders::Worker_ClientAdded; + + embedded_test_server()->RegisterRequestHandler(base::BindRepeating( + [](const net::test_server::HttpRequest& request) + -> std::unique_ptr<net::test_server::HttpResponse> { + if (request.GetURL().path() != "/shared_worker_script") + return nullptr; + auto response = std::make_unique<net::test_server::BasicHttpResponse>(); + response->set_content_type("text/javascript"); + response->set_content( + R"(self.onconnect = e => { e.ports[0].postMessage('DONE'); };)"); + return response; + })); + + ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(content::NavigateToURL( + web_contents(), embedded_test_server()->GetURL( + "/service_worker/create_service_worker.html"))); + + // Wait for the service worker to load. + EXPECT_EQ("DONE", EvalJs(web_contents(), + "register('fetch_event_respond_with_fetch.js');")); + + // Wait for the shared worker to load. + EXPECT_EQ("DONE", EvalJs(web_contents(), R"SCRIPT( + const worker = new SharedWorker('/shared_worker_script'); + const onmessage_promise = new Promise(r => worker.port.onmessage = r); + async function waitForMessage() { + const message = await onmessage_promise; + return message.data; + } + waitForMessage(); + )SCRIPT")); + + // Check that we have a Worker.ClientAdded event for all three pairs: + // document-shared worker, document-service worker, and shared worker-service + // worker. + std::vector<const ukm::mojom::UkmEntry*> connected_entries = + test_ukm_recorder().GetEntriesByName(AddedEntry::kEntryName); + ASSERT_EQ(3u, connected_entries.size()); + + // Get the document and shared worker ids from the shared worker event. + ukm::SourceId document_source_id = ukm::kInvalidSourceId; + ukm::SourceId shared_worker_source_id = ukm::kInvalidSourceId; + int shared_worker_event_index; + for (int i = 0; i < 3; i++) { + const int64_t worker_type = *test_ukm_recorder().GetEntryMetric( + connected_entries[i], AddedEntry::kWorkerTypeName); + if (worker_type == static_cast<int64_t>(WorkerType::kSharedWorker)) { + EXPECT_EQ(document_source_id, ukm::kInvalidSourceId); + EXPECT_EQ(shared_worker_source_id, ukm::kInvalidSourceId); + document_source_id = *test_ukm_recorder().GetEntryMetric( + connected_entries[i], AddedEntry::kClientSourceIdName); + shared_worker_source_id = connected_entries[i]->source_id; + shared_worker_event_index = i; + } + } + ASSERT_NE(document_source_id, ukm::kInvalidSourceId); + ASSERT_NE(shared_worker_source_id, ukm::kInvalidSourceId); + EXPECT_NE(document_source_id, shared_worker_source_id); + + // Remove the shared worker event to leave just the service worker events. + connected_entries.erase(connected_entries.begin() + + shared_worker_event_index); + + // Check the events contain the expected information without enforcing any + // ordering. + ukm::SourceId service_worker_source_id = connected_entries[0]->source_id; + EXPECT_EQ(service_worker_source_id, connected_entries[1]->source_id); + + EXPECT_EQ(*test_ukm_recorder().GetEntryMetric(connected_entries[0], + AddedEntry::kWorkerTypeName), + static_cast<int64_t>(WorkerType::kServiceWorker)); + EXPECT_EQ(*test_ukm_recorder().GetEntryMetric(connected_entries[1], + AddedEntry::kWorkerTypeName), + static_cast<int64_t>(WorkerType::kServiceWorker)); + + ukm::SourceId client_source_id_1 = *test_ukm_recorder().GetEntryMetric( + connected_entries[0], AddedEntry::kClientSourceIdName); + ukm::SourceId client_source_id_2 = *test_ukm_recorder().GetEntryMetric( + connected_entries[1], AddedEntry::kClientSourceIdName); + + EXPECT_EQ( + std::set<ukm::SourceId>({document_source_id, shared_worker_source_id}), + std::set<ukm::SourceId>({client_source_id_1, client_source_id_2})); +}
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 48cf78f..686b30f 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1603107412-6ef156ac52bac5f4e53402d26e81a7a7c88be584.profdata +chrome-linux-master-1603130327-dbd07cac207addae1d1c691d346f030844c1739d.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 1088ab3..916f605 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -354,6 +354,12 @@ "EventBasedStatusReporting", base::FEATURE_ENABLED_BY_DEFAULT}; #endif +#if !defined(OS_ANDROID) +// Enables real-time reporting for extension request +const base::Feature kEnterpriseRealtimeExtensionRequest{ + "EnterpriseRealtimeExtensionRequest", base::FEATURE_DISABLED_BY_DEFAULT}; +#endif + // If enabled, this feature's |kExternalInstallDefaultButtonKey| field trial // parameter value controls which |ExternalInstallBubbleAlert| button is the // default.
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index be6587c0..9b023e4 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -236,6 +236,11 @@ extern const base::Feature kEventBasedStatusReporting; #endif +#if !defined(OS_ANDROID) +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::Feature kEnterpriseRealtimeExtensionRequest; +#endif + COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kExternalExtensionDefaultButtonControl;
diff --git a/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc b/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc index 2d1aa6a..fbdbf60 100644 --- a/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc +++ b/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc
@@ -40,7 +40,7 @@ dino_bitmap_.allocN32Pixels(dino_image::kDinoWidth, dino_image::kDinoHeight); dino_bitmap_.eraseARGB(0xFF, 0xFF, 0xFF, 0xFF); - SkCanvas canvas(dino_bitmap_, SkSurfaceProps{}); + SkCanvas canvas(dino_bitmap_); SkPaint paint; paint.setColor(SK_ColorBLACK); @@ -176,7 +176,7 @@ bitmap.allocN32Pixels(data_size.width() * kModuleSizePixels, data_size.height() * kModuleSizePixels); bitmap.eraseARGB(0xFF, 0xFF, 0xFF, 0xFF); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); SkPaint paint_black; paint_black.setColor(SK_ColorBLACK); SkPaint paint_white;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 7d5261dc..4b149e7 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4838,6 +4838,7 @@ "../browser/metrics/perf/process_type_collector_unittest.cc", "../browser/metrics/perf/profile_provider_chromeos_unittest.cc", "../browser/metrics/perf/windowed_incognito_observer_unittest.cc", + "../browser/nearby_sharing/bluetooth_advertising_interval_client_unittest.cc", "../browser/nearby_sharing/fake_nearby_connection.cc", "../browser/nearby_sharing/fake_nearby_connection.h", "../browser/nearby_sharing/fake_nearby_connections_manager.cc",
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc index 078efff2..3613befb 100644 --- a/chrome/test/chromedriver/element_commands.cc +++ b/chrome/test/chromedriver/element_commands.cc
@@ -993,8 +993,8 @@ // view port. However, CaptureScreenshot expects a location relative to the // document origin. We make the adjustment using the scroll amount of the top // level window. Scrolling of frames has already been included in |location|. - // Scroll information can be in either document.documentElement or - // document.body, depending on document compatibility mode. The parentheses + // Use window.pageXOffset and widnow.pageYOffset for scroll information, + // should always return scroll amount regardless of doctype. The parentheses // around the JavaScript code below is needed because JavaScript syntax // doesn't allow a statement to start with an object literal. // document.documentElement.clientHeight and Width provide viewport height @@ -1002,8 +1002,8 @@ std::unique_ptr<base::Value> browser_info; status = web_view->EvaluateScript( std::string(), - "({x: document.documentElement.scrollLeft || document.body.scrollLeft," - " y: document.documentElement.scrollTop || document.body.scrollTop," + "({x: window.pageXOffset," + " y: window.pageYOffset," " height: document.documentElement.clientHeight," " width: document.documentElement.clientWidth," " device_pixel_ratio: window.devicePixelRatio})",
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index e4007bec..67cfa03a 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -4691,12 +4691,6 @@ ] }, - "ContentPackDefaultFilteringBehavior": {}, - - "ContentPackManualBehaviorHosts": {}, - - "ContentPackManualBehaviorURLs": {}, - "ManagedBookmarks": {}, "FullscreenAllowed": {
diff --git a/chrome/test/data/webui/cr_elements/cr_toast_test.js b/chrome/test/data/webui/cr_elements/cr_toast_test.js index a23cc43..e80c797 100644 --- a/chrome/test/data/webui/cr_elements/cr_toast_test.js +++ b/chrome/test/data/webui/cr_elements/cr_toast_test.js
@@ -128,23 +128,4 @@ mockTimer.tick(1); assertFalse(toast.open); }); - - test('setting duration using show(duration)', function() { - const duration = 100; - toast.show(duration); - assertTrue(toast.open); - - mockTimer.tick(duration); - assertFalse(toast.open); - }); - - test('setting text', function() { - const duration = 100; - const text = 'foo'; - assertEquals('', toast.textContent); - toast.show(undefined, text); - assertEquals(text, toast.textContent); - toast.show(duration); - assertEquals(text, toast.textContent); - }); });
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js index 4a5e2c03..e046f52 100644 --- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -586,19 +586,30 @@ expected, devicePage.prefs.settings.touchpad.natural_scroll.value); } + /** + * Returns whether the element both exists and is visible. + * @param {?Element} element + * @return {boolean} + */ + function isVisible(element) { + // offsetWidth and offsetHeight reflect more ways that an element could be + // hidden, compared to checking the hidden attribute directly. + return !!element && element.offsetWidth > 0 && element.offsetHeight > 0; + } + test(assert(TestNames.DevicePage), function() { - expectLT(0, devicePage.$$('#pointersRow').offsetHeight); - expectLT(0, devicePage.$$('#keyboardRow').offsetHeight); - expectLT(0, devicePage.$$('#displayRow').offsetHeight); + expectTrue(isVisible(devicePage.$$('#pointersRow'))); + expectTrue(isVisible(devicePage.$$('#keyboardRow'))); + expectTrue(isVisible(devicePage.$$('#displayRow'))); cr.webUIListenerCallback('has-mouse-changed', false); - expectLT(0, devicePage.$$('#pointersRow').offsetHeight); + expectTrue(isVisible(devicePage.$$('#pointersRow'))); cr.webUIListenerCallback('has-pointing-stick-changed', false); - expectLT(0, devicePage.$$('#pointersRow').offsetHeight); + expectTrue(isVisible(devicePage.$$('#pointersRow'))); cr.webUIListenerCallback('has-touchpad-changed', false); - expectEquals(0, devicePage.$$('#pointersRow').offsetHeight); + expectFalse(isVisible(devicePage.$$('#pointersRow'))); cr.webUIListenerCallback('has-mouse-changed', true); - expectLT(0, devicePage.$$('#pointersRow').offsetHeight); + expectTrue(isVisible(devicePage.$$('#pointersRow'))); }); suite(assert(TestNames.Pointers), function() { @@ -615,58 +626,58 @@ assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertLT(0, pointersPage.$$('#mouse').offsetHeight); - assertLT(0, pointersPage.$$('#touchpad').offsetHeight); - assertLT(0, pointersPage.$$('#mouse h2').offsetHeight); - assertLT(0, pointersPage.$$('#touchpad h2').offsetHeight); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertTrue(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-touchpad-changed', false); assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertLT(0, pointersPage.$$('#mouse').offsetHeight); - assertEquals(0, pointersPage.$$('#touchpad').offsetHeight); - assertEquals(0, pointersPage.$$('#mouse h2').offsetHeight); - assertEquals(0, pointersPage.$$('#touchpad h2').offsetHeight); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertFalse(isVisible(pointersPage.$$('#mouse h2'))); + assertFalse(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-pointing-stick-changed', false); assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertLT(0, pointersPage.$$('#mouse').offsetHeight); - assertEquals(0, pointersPage.$$('#touchpad').offsetHeight); - assertEquals(0, pointersPage.$$('#mouse h2').offsetHeight); - assertEquals(0, pointersPage.$$('#touchpad h2').offsetHeight); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertFalse(isVisible(pointersPage.$$('#mouse h2'))); + assertFalse(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-mouse-changed', false); assertEquals( settings.routes.DEVICE, settings.Router.getInstance().getCurrentRoute()); - assertEquals(0, devicePage.$$('#main #pointersRow').offsetHeight); + assertFalse(isVisible(devicePage.$$('#main #pointersRow'))); cr.webUIListenerCallback('has-touchpad-changed', true); - assertLT(0, devicePage.$$('#main #pointersRow').offsetHeight); + assertTrue(isVisible(devicePage.$$('#main #pointersRow'))); return showAndGetDeviceSubpage('pointers', settings.routes.POINTERS) .then(function(page) { - assertEquals(0, pointersPage.$$('#mouse').offsetHeight); - assertLT(0, pointersPage.$$('#touchpad').offsetHeight); - assertEquals(0, pointersPage.$$('#mouse h2').offsetHeight); - assertEquals(0, pointersPage.$$('#touchpad h2').offsetHeight); + assertFalse(isVisible(pointersPage.$$('#mouse'))); + assertFalse(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-mouse-changed', true); assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertLT(0, pointersPage.$$('#mouse').offsetHeight); - assertLT(0, pointersPage.$$('#touchpad').offsetHeight); - assertLT(0, pointersPage.$$('#mouse h2').offsetHeight); - assertLT(0, pointersPage.$$('#touchpad h2').offsetHeight); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertTrue(isVisible(pointersPage.$$('#touchpad h2'))); }); }); test('mouse', function() { - expectLT(0, pointersPage.$$('#mouse').offsetHeight); + expectTrue(isVisible(pointersPage.$$('#mouse'))); const slider = assert(pointersPage.$$('#mouse settings-slider')); expectEquals(4, slider.pref.value); @@ -679,7 +690,7 @@ }); test('touchpad', function() { - expectLT(0, pointersPage.$$('#touchpad').offsetHeight); + expectTrue(isVisible(pointersPage.$$('#touchpad'))); expectTrue(pointersPage.$$('#touchpad #enableTapToClick').checked); expectFalse(pointersPage.$$('#touchpad #enableTapDragging').checked); @@ -757,81 +768,65 @@ }); test('subpage responds to pointer attach/detach', function() { - const assertElementVisible = (element) => { - assertNotEquals(element, null, 'element should exist'); - // offsetWidth and offsetHeight reflect more ways that an element - // could be hidden than checking the hidden attribute directly. - assertTrue( - element.offsetWidth > 0 && element.offsetHeight > 0, - 'element should be visible'); - }; - - const assertElementHidden = (element) => { - assertNotEquals(element, null, 'element should exist'); - assertTrue( - element.offsetWidth === 0 && element.offsetHeight === 0, - 'element should be hidden'); - }; - assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertElementVisible(pointersPage.$$('#mouse')); - assertElementVisible(pointersPage.$$('#mouse h2')); - assertElementVisible(pointersPage.$$('#pointingStick')); - assertElementVisible(pointersPage.$$('#pointingStick h2')); - assertElementVisible(pointersPage.$$('#touchpad')); - assertElementVisible(pointersPage.$$('#touchpad h2')); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick h2'))); + assertTrue(isVisible(pointersPage.$$('#touchpad'))); + assertTrue(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-touchpad-changed', false); assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertElementVisible(pointersPage.$$('#mouse')); - assertElementVisible(pointersPage.$$('#mouse h2')); - assertElementVisible(pointersPage.$$('#pointingStick')); - assertElementVisible(pointersPage.$$('#pointingStick h2')); - assertElementHidden(pointersPage.$$('#touchpad')); - assertElementHidden(pointersPage.$$('#touchpad h2')); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertTrue(isVisible(pointersPage.$$('#mouse h2'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick'))); + assertTrue(isVisible(pointersPage.$$('#pointingStick h2'))); + assertFalse(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-pointing-stick-changed', false); assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertElementVisible(pointersPage.$$('#mouse')); - assertElementHidden(pointersPage.$$('#mouse h2')); - assertElementHidden(pointersPage.$$('#pointingStick')); - assertElementHidden(pointersPage.$$('#pointingStick h2')); - assertElementHidden(pointersPage.$$('#touchpad')); - assertElementHidden(pointersPage.$$('#touchpad h2')); + assertTrue(isVisible(pointersPage.$$('#mouse'))); + assertFalse(isVisible(pointersPage.$$('#mouse h2'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick'))); + assertFalse(isVisible(pointersPage.$$('#pointingStick h2'))); + assertFalse(isVisible(pointersPage.$$('#touchpad'))); + assertFalse(isVisible(pointersPage.$$('#touchpad h2'))); cr.webUIListenerCallback('has-mouse-changed', false); assertEquals( settings.routes.DEVICE, settings.Router.getInstance().getCurrentRoute()); - assertElementHidden(devicePage.$$('#main #pointersRow')); + assertFalse(isVisible(devicePage.$$('#main #pointersRow'))); cr.webUIListenerCallback('has-touchpad-changed', true); - assertElementVisible(devicePage.$$('#main #pointersRow')); + assertTrue(isVisible(devicePage.$$('#main #pointersRow'))); return showAndGetDeviceSubpage('pointers', settings.routes.POINTERS) .then(function(page) { - assertElementHidden(page.$$('#mouse')); - assertElementHidden(page.$$('#mouse h2')); - assertElementHidden(page.$$('#pointingStick')); - assertElementHidden(page.$$('#pointingStick h2')); - assertElementVisible(page.$$('#touchpad')); - assertElementHidden(page.$$('#touchpad h2')); + assertFalse(isVisible(page.$$('#mouse'))); + assertFalse(isVisible(page.$$('#mouse h2'))); + assertFalse(isVisible(page.$$('#pointingStick'))); + assertFalse(isVisible(page.$$('#pointingStick h2'))); + assertTrue(isVisible(page.$$('#touchpad'))); + assertFalse(isVisible(page.$$('#touchpad h2'))); cr.webUIListenerCallback('has-mouse-changed', true); assertEquals( settings.routes.POINTERS, settings.Router.getInstance().getCurrentRoute()); - assertElementVisible(page.$$('#mouse')); - assertElementVisible(page.$$('#mouse h2')); - assertElementHidden(page.$$('#pointingStick')); - assertElementHidden(page.$$('#pointingStick h2')); - assertElementVisible(page.$$('#touchpad')); - assertElementVisible(page.$$('#touchpad h2')); + assertTrue(isVisible(page.$$('#mouse'))); + assertTrue(isVisible(page.$$('#mouse h2'))); + assertFalse(isVisible(page.$$('#pointingStick'))); + assertFalse(isVisible(page.$$('#pointingStick h2'))); + assertTrue(isVisible(page.$$('#touchpad'))); + assertTrue(isVisible(page.$$('#touchpad h2'))); }); }); }); @@ -1908,14 +1903,6 @@ return stylusPage.$$('#keep-last-note-on-lock-screen-toggle'); } - /** - * @param {?Element} element - * @return {boolean} - */ - function isVisible(element) { - return !!element && element.offsetWidth > 0 && element.offsetHeight > 0; - } - test('stylus tools prefs', function() { // Both stylus tools prefs are intially false. assertFalse(devicePage.prefs.settings.enable_stylus_tools.value); @@ -2423,15 +2410,6 @@ } /** - * @param {?Element} element - * @return {boolean} - */ - function isHidden(element) { - return !element || - (element.offsetWidth === 0 && element.offsetHeight === 0); - } - - /** * @param {string} id * @return {string} */ @@ -2474,8 +2452,8 @@ '9.1 GB', '0.9 GB', 0.91, settings.StorageSpaceState.LOW); assertEquals('91%', storagePage.$.inUseLabelArea.style.width); assertEquals('9%', storagePage.$.availableLabelArea.style.width); - assertFalse(isHidden(storagePage.$$('#lowMessage'))); - assertTrue(isHidden(storagePage.$$('#criticallyLowMessage'))); + assertTrue(isVisible(storagePage.$$('#lowMessage'))); + assertFalse(isVisible(storagePage.$$('#criticallyLowMessage'))); assertTrue(!!storagePage.$$('#bar.space-low')); assertFalse(!!storagePage.$$('#bar.space-critically-low')); assertEquals( @@ -2493,8 +2471,8 @@ settings.StorageSpaceState.CRITICALLY_LOW); assertEquals('97%', storagePage.$.inUseLabelArea.style.width); assertEquals('3%', storagePage.$.availableLabelArea.style.width); - assertTrue(isHidden(storagePage.$$('#lowMessage'))); - assertFalse(isHidden(storagePage.$$('#criticallyLowMessage'))); + assertFalse(isVisible(storagePage.$$('#lowMessage'))); + assertTrue(isVisible(storagePage.$$('#criticallyLowMessage'))); assertFalse(!!storagePage.$$('#bar.space-low')); assertTrue(!!storagePage.$$('#bar.space-critically-low')); assertEquals( @@ -2511,8 +2489,8 @@ '2.5 GB', '7.5 GB', 0.25, settings.StorageSpaceState.NORMAL); assertEquals('25%', storagePage.$.inUseLabelArea.style.width); assertEquals('75%', storagePage.$.availableLabelArea.style.width); - assertTrue(isHidden(storagePage.$$('#lowMessage'))); - assertTrue(isHidden(storagePage.$$('#criticallyLowMessage'))); + assertFalse(isVisible(storagePage.$$('#lowMessage'))); + assertFalse(isVisible(storagePage.$$('#criticallyLowMessage'))); assertFalse(!!storagePage.$$('#bar.space-low')); assertFalse(!!storagePage.$$('#bar.space-critically-low')); assertEquals( @@ -2538,7 +2516,7 @@ // In guest mode, the system row should be hidden. storagePage.isGuest_ = true; Polymer.dom.flush(); - assertTrue(isHidden(storagePage.$$('#systemSize'))); + assertFalse(isVisible(storagePage.$$('#systemSize'))); }); test('apps extensions size', async function() { @@ -2555,7 +2533,7 @@ test('other users size', async function() { // The other users row is visible by default, displaying // "calculating...". - assertFalse(isHidden(storagePage.$$('#otherUsersSize'))); + assertTrue(isVisible(storagePage.$$('#otherUsersSize'))); assertEquals( 'Other users', getStorageItemLabelFromId('otherUsersSize')); assertEquals( @@ -2565,13 +2543,13 @@ cr.webUIListenerCallback( 'storage-other-users-size-changed', '0 B', true); Polymer.dom.flush(); - assertTrue(isHidden(storagePage.$$('#otherUsersSize'))); + assertFalse(isVisible(storagePage.$$('#otherUsersSize'))); // Send other users callback with a size that is not null. cr.webUIListenerCallback( 'storage-other-users-size-changed', '322 MB', false); Polymer.dom.flush(); - assertFalse(isHidden(storagePage.$$('#otherUsersSize'))); + assertTrue(isVisible(storagePage.$$('#otherUsersSize'))); assertEquals('322 MB', getStorageItemSubLabelFromId('otherUsersSize')); // If the user is in Guest mode, the row is not visible. @@ -2579,7 +2557,7 @@ cr.webUIListenerCallback( 'storage-other-users-size-changed', '322 MB', false); Polymer.dom.flush(); - assertTrue(isHidden(storagePage.$$('#otherUsersSize'))); + assertFalse(isVisible(storagePage.$$('#otherUsersSize'))); }); }); });
diff --git a/chrome/test/data/webui/settings/personalization_options_test.js b/chrome/test/data/webui/settings/personalization_options_test.js index 381e089..69c7151 100644 --- a/chrome/test/data/webui/settings/personalization_options_test.js +++ b/chrome/test/data/webui/settings/personalization_options_test.js
@@ -98,8 +98,7 @@ assertTrue(testElement.$.toast.open); // Reset toast. - testElement.showRestartToast_ = false; - assertFalse(testElement.$.toast.open); + testElement.$.toast.hide(); // When the user is part way through sync setup, the toggle should be // disabled in an on state.
diff --git a/chrome/test/data/workers/dedicated_worker.js b/chrome/test/data/workers/dedicated_worker.js new file mode 100644 index 0000000..5793aef --- /dev/null +++ b/chrome/test/data/workers/dedicated_worker.js
@@ -0,0 +1,5 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +postMessage("loaded");
diff --git a/chromecast/android/lint-suppressions.xml b/chromecast/android/lint-suppressions.xml index ba8cca8..6b3d7959 100644 --- a/chromecast/android/lint-suppressions.xml +++ b/chromecast/android/lint-suppressions.xml
@@ -56,8 +56,6 @@ <ignore regexp="chromecast/internal"/> </issue> <issue id="UnusedResources"> - <!-- 1 resource used by android tv to generate resources.zip file --> - <ignore regexp="chromecast/internal/shell/browser/android/java/res/drawable-hdpi/ic_settings_cast.png"/> <!-- 1 resource used by android tv to generate MediaShell.apk file --> <ignore regexp="chromecast/internal/android/prebuilt/google-play-services-first-party"/> </issue>
diff --git a/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.html b/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.html index efc43bb..dc81780 100644 --- a/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.html +++ b/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.html
@@ -24,12 +24,12 @@ } /* TODO(joonbug): Update with real colors as vars */ - .user-line { - stroke: blue; + .user-area { + fill: orange; } - .system-line { - stroke: orange; + .system-area { + fill: blue; } </style> @@ -44,8 +44,8 @@ <g id="gridLines" class="grid"></g> <g id="plotGroup" clip-path="url(#defClip)"> - <path class="user-line"></path> - <path class="system-line"></path> + <path class="user-area"></path> + <path class="system-area"></path> </g> </g> </svg>
diff --git a/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.js b/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.js index 5a069c0..08d7513 100644 --- a/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.js +++ b/chromeos/components/diagnostics_ui/resources/realtime_cpu_chart.js
@@ -13,8 +13,8 @@ /** * @fileoverview - * 'realtime-cpu-chart' is a moving line graph component used to display a - * realtime cpu usage information. + * 'realtime-cpu-chart' is a moving stacked area graph component used to display + * a realtime cpu usage information. */ Polymer({ is: 'realtime-cpu-chart', @@ -169,48 +169,52 @@ // Feed data array to the plot group. plotGroup.datum(this.data_); - // Select each line and configure the transition for animation. + // Select each area and configure the transition for animation. // d3.transition API @ https://github.com/d3/d3-transition#d3-transition. // d3.easing API @ https://github.com/d3/d3-ease#api-reference. - plotGroup.select('.user-line') + plotGroup.select('.user-area') .transition() .duration(this.refreshInterval_) .ease(d3.easeLinear) // Linear transition - .on('start', this.drawChartLine_.bind(this, 'user-line')); - plotGroup.select('.system-line') + .on('start', this.drawChartArea_.bind(this, 'user-area')); + plotGroup.select('.system-area') .transition() .duration(this.refreshInterval_) .ease(d3.easeLinear) // Linear transition - .on('start', this.drawChartLine_.bind(this, 'system-line')); + .on('start', this.drawChartArea_.bind(this, 'system-area')); }, /** - * @param {string} lineClass class string for <path> element. - * @return {d3.Line} + * @param {string} areaClass class string for <path> element. + * @return {d3.Area} * @private */ - getLineDefinition_(lineClass) { + getAreaDefinition_(areaClass) { return d3 - .line() - // Curved line + .area() + // Curved area outline .curve(d3.curveBasis) // Take the index of each data as x values. .x((data, i) => this.xAxisScaleFn_(i)) - // Pick system or user numbers to use as y values. - .y(data => this.yAxisScaleFn_( - lineClass === 'user-line' ? data.user : data.system)); + // Bottom coordinates of each area. + .y0(data => this.yAxisScaleFn_( + areaClass === 'system-area' ? 0 : data.system)) + // Top coordinates of each area. + .y1(data => this.yAxisScaleFn_( + areaClass === 'system-area' ? data.system : + data.system + data.user)); }, /** * Takes a snapshot of current CPU readings and appends to the data array. - * This method is called by each line after each transition. + * This method is called by each area after each transition. * @private */ appendDataSnapshot_() { const now = new Date().getTime(); // We only want to append the data once per refreshInterval cycle even with - // multiple lines. Roughly limit the call so that at least half of the + // multiple areas. Roughly limit the call so that at least half of the // refreshInterval has elapsed since the last update. if (now - this.dataLastUpdated_ > this.refreshInterval_ / 2) { this.dataLastUpdated_ = now; @@ -220,26 +224,26 @@ }, /** - * @param {string} lineClass class string for <path> element. + * @param {string} areaClass class string for <path> element. * @private */ - drawChartLine_(lineClass) { + drawChartArea_(areaClass) { this.appendDataSnapshot_(); - const lineElement = assert(this.$$(`path.${lineClass}`)); + const areaElement = assert(this.$$(`path.${areaClass}`)); - // Reset the animation (transform) and redraw the line with new data. + // Reset the animation (transform) and redraw the area with new data. // this.data_ is already associated with the plotGroup, so no need to // specify it directly here. - d3.select(lineElement) - .attr('d', this.getLineDefinition_(lineClass)) + d3.select(areaElement) + .attr('d', this.getAreaDefinition_(areaClass)) .attr('transform', null); - // Start animation of the line towards left by one tick outside the chart + // Start animation of the area towards left by one tick outside the chart // boundary, then repeat the process. - d3.active(lineElement) + d3.active(areaElement) .attr('transform', 'translate(' + this.xAxisScaleFn_(-1) + ', 0)') .transition() - .on('start', this.drawChartLine_.bind(this, lineClass)); + .on('start', this.drawChartArea_.bind(this, areaClass)); }, });
diff --git a/chromeos/components/media_app_ui/BUILD.gn b/chromeos/components/media_app_ui/BUILD.gn index 67c7fbd..1f472fb 100644 --- a/chromeos/components/media_app_ui/BUILD.gn +++ b/chromeos/components/media_app_ui/BUILD.gn
@@ -33,6 +33,7 @@ "//content/public/browser", "//mojo/public/cpp/bindings", "//mojo/public/cpp/platform", + "//ui/file_manager:resources", "//ui/webui", ] }
diff --git a/chromeos/components/media_app_ui/DEPS b/chromeos/components/media_app_ui/DEPS index 9a43f61..6b7eb06 100644 --- a/chromeos/components/media_app_ui/DEPS +++ b/chromeos/components/media_app_ui/DEPS
@@ -7,5 +7,6 @@ "+components/content_settings/core/common", "+content/public/browser", "+content/public/common", + "+ui/file_manager/grit", "+ui/webui", ]
diff --git a/chromeos/components/media_app_ui/media_app_guest_ui.cc b/chromeos/components/media_app_ui/media_app_guest_ui.cc index e3161f8..c8178ee0 100644 --- a/chromeos/components/media_app_ui/media_app_guest_ui.cc +++ b/chromeos/components/media_app_ui/media_app_guest_ui.cc
@@ -13,6 +13,7 @@ #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" #include "services/network/public/mojom/content_security_policy.mojom.h" +#include "ui/file_manager/grit/file_manager_resources.h" namespace chromeos { @@ -24,6 +25,12 @@ source->AddResourcePath("app.html", IDR_MEDIA_APP_APP_HTML); source->AddResourcePath("media_app_app_scripts.js", IDR_MEDIA_APP_APP_SCRIPTS_JS); + source->AddResourcePath("piex_module_scripts.js", + IDR_MEDIA_APP_PIEX_MODULE_SCRIPTS_JS); + + // Add shared resources from chromeos_file_manager_resources.pak. + source->AddResourcePath("piex/piex.js.wasm", IDR_IMAGE_LOADER_PIEX_WASM_JS); + source->AddResourcePath("piex/piex.out.wasm", IDR_IMAGE_LOADER_PIEX_WASM); // Add resources from chromeos_media_app_bundle_resources.pak that are also // needed for mocks. If enable_cros_media_app = true, then these calls will @@ -59,6 +66,12 @@ source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::StyleSrc, "style-src 'self' 'unsafe-inline';"); + + // Allow wasm. + source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::ScriptSrc, + "script-src 'self' 'wasm-eval';"); + // TODO(crbug.com/1098685): Trusted Type remaining WebUI. source->DisableTrustedTypesCSP(); return source;
diff --git a/chromeos/components/media_app_ui/resources/js/BUILD.gn b/chromeos/components/media_app_ui/resources/js/BUILD.gn index 0e27cd6..8f1a164d 100644 --- a/chromeos/components/media_app_ui/resources/js/BUILD.gn +++ b/chromeos/components/media_app_ui/resources/js/BUILD.gn
@@ -56,10 +56,19 @@ externs_list = [ "$externs_path/crash_report_private.js" ] } +js_library("piex_module_loader") { +} + +js_library("piex_module") { + deps = [ "//ui/file_manager/image_loader:piex_loader" ] +} + js_library("receiver") { externs_list = [ "media_app.externs.js" ] deps = [ ":message_types", + ":piex_module", + ":piex_module_loader", "//chromeos/components/system_apps/public/js:message_pipe", "//ui/webui/resources/js:load_time_data", ]
diff --git a/chromeos/components/media_app_ui/resources/js/launch.js b/chromeos/components/media_app_ui/resources/js/launch.js index bd032af..1708789 100644 --- a/chromeos/components/media_app_ui/resources/js/launch.js +++ b/chromeos/components/media_app_ui/resources/js/launch.js
@@ -601,6 +601,15 @@ } /** + * Returns whether `filename` has an extension indicating a possible RAW image. + * @param {string} filename + * @return {boolean} + */ +function isRawImageFile(filename) { + return /\.(arw|cr2|dng|nef|nrw|orf|raf|rw2)$/.test(filename.toLowerCase()); +} + +/** * Returns whether `file` is a video or image file. * @param {!File} file * @return {boolean} @@ -609,7 +618,7 @@ // Check for .mkv explicitly because it is not a web-supported type, but is in // common use on ChromeOS. return /^(image)|(video)\//.test(file.type) || - /\.mkv$/.test(file.name.toLowerCase()); + /\.mkv$/.test(file.name.toLowerCase()) || isRawImageFile(file.name); } /**
diff --git a/chromeos/components/media_app_ui/resources/js/media_app.externs.js b/chromeos/components/media_app_ui/resources/js/media_app.externs.js index 5d3616df..9fd0ec4 100644 --- a/chromeos/components/media_app_ui/resources/js/media_app.externs.js +++ b/chromeos/components/media_app_ui/resources/js/media_app.externs.js
@@ -166,6 +166,13 @@ * @return {!Promise<undefined>} */ mediaApp.ClientApiDelegate.prototype.openFile = function() {}; +/** + * Attempts to extract a JPEG "preview" from a RAW image file. Throws on any + * failure. Note this is typically a full-sized preview, not a thumbnail. + * @param {!Blob} file + * @return {!Promise<!File>} A Blob-backed File with type: image/jpeg. + */ +mediaApp.ClientApiDelegate.prototype.extractPreview = function(file) {}; /** * The client Api for interacting with the media app instance.
diff --git a/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js b/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js index cb6443e..b532d0f 100644 --- a/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js +++ b/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js
@@ -7,5 +7,6 @@ // <include src="../../../../../ui/webui/resources/js/load_time_data.js"> // <include src="../../../system_apps/public/js/message_pipe.js"> // <include src="message_types.js"> +// <include src="piex_module_loader.js"> // <include src="receiver.js"> // <include src="app_context_test_support.js">
diff --git a/chromeos/components/media_app_ui/resources/js/piex_module.js b/chromeos/components/media_app_ui/resources/js/piex_module.js new file mode 100644 index 0000000..04098db --- /dev/null +++ b/chromeos/components/media_app_ui/resources/js/piex_module.js
@@ -0,0 +1,32 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Set when PiexLoader has an unrecoverable error to disable future attempts. + * @type {boolean} + */ +let piexEnabled = true; + +/** Handles wasm load failures. */ +function onPiexModuleFailed() { + piexEnabled = false; +} + +/** + * Extracts a JPEG from a RAW Image ArrayBuffer. + * @param {!ArrayBuffer} buffer + * @return {!Promise<!File>} + */ +async function extractFromRawImageBuffer(buffer) { + if (!piexEnabled) { + throw new Error('Piex disabled'); + } + const response = await PiexLoader.load(buffer, onPiexModuleFailed); + // Note the "thumbnail" is usually the full-sized image "preview", but may + // fall back to a thumbnail when that is unavailable. + // The mime type may be unsupported - let the caller deal with that. + // TOD(b/169717921): Apply `response.orientation`. + return new File( + [response.thumbnail], 'raw-preview', {type: response.mimeType}); +}
diff --git a/chromeos/components/media_app_ui/resources/js/piex_module_loader.js b/chromeos/components/media_app_ui/resources/js/piex_module_loader.js new file mode 100644 index 0000000..106b170 --- /dev/null +++ b/chromeos/components/media_app_ui/resources/js/piex_module_loader.js
@@ -0,0 +1,33 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** @type {?Promise} */ +let _piexLoadPromise = null; + +/** + * Loads PIEX, the "Preview Image Extractor", via wasm. + * @return {!Promise} + */ +function loadPiex() { + async function startLoad() { + /** @type {function(string): !Promise} */ + const loadJs = (/** string */ path) => new Promise((resolve, reject) => { + const script = + /** @type {!HTMLScriptElement} */ (document.createElement('script')); + script.onload = resolve; + script.onerror = reject; + script.src = path; + assertCast(document.head).appendChild(script); + }); + await loadJs('piex/piex.js.wasm'); + await loadJs('piex_module_scripts.js'); + await new Promise(resolve => { + PiexModule['onRuntimeInitialized'] = resolve; + }); + } + if (!_piexLoadPromise) { + _piexLoadPromise = startLoad(); + } + return _piexLoadPromise; +}
diff --git a/chromeos/components/media_app_ui/resources/js/piex_module_scripts.js b/chromeos/components/media_app_ui/resources/js/piex_module_scripts.js new file mode 100644 index 0000000..49d567a --- /dev/null +++ b/chromeos/components/media_app_ui/resources/js/piex_module_scripts.js
@@ -0,0 +1,9 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** @fileoverview Concatenation of JS files for loading Piex WASM. */ + +// <include +// src="../../../../../ui/file_manager/image_loader/piex_loader.js"> +// <include src="piex_module.js">
diff --git a/chromeos/components/media_app_ui/resources/js/receiver.js b/chromeos/components/media_app_ui/resources/js/receiver.js index c75c79d..0aed57c5 100644 --- a/chromeos/components/media_app_ui/resources/js/receiver.js +++ b/chromeos/components/media_app_ui/resources/js/receiver.js
@@ -239,6 +239,23 @@ */ async openFile() { await parentMessagePipe.sendMessage(Message.OPEN_FILE); + }, + /** + * @param {!Blob} file + * @return {!Promise<!File>} + */ + async extractPreview(file) { + try { + const [buffer] = /** @type {!Array<!ArrayBuffer>} */ ( + await Promise.all([file.arrayBuffer(), loadPiex()])); + return await extractFromRawImageBuffer(buffer); + } catch (/** @type {!Error} */ e) { + console.warn(e); + if (e.name === 'Error') { + e.name = 'JpegNotFound'; + } + throw e; + } } };
diff --git a/chromeos/components/media_app_ui/resources/media_app_resources.grd b/chromeos/components/media_app_ui/resources/media_app_resources.grd index ae1f8d30..b0ed0d5 100644 --- a/chromeos/components/media_app_ui/resources/media_app_resources.grd +++ b/chromeos/components/media_app_ui/resources/media_app_resources.grd
@@ -27,6 +27,7 @@ <!-- Unprivileged guest contents. --> <include name="IDR_MEDIA_APP_APP_HTML" file="app.html" type="BINDATA" /> <include name="IDR_MEDIA_APP_APP_SCRIPTS_JS" file="js/media_app_app_scripts.js" flattenhtml="true" compress="brotli" type="BINDATA" /> + <include name="IDR_MEDIA_APP_PIEX_MODULE_SCRIPTS_JS" file="js/piex_module_scripts.js" flattenhtml="true" compress="brotli" type="BINDATA" /> </includes> </release> </grit>
diff --git a/chromeos/components/media_app_ui/resources/mock/js/app_main.js b/chromeos/components/media_app_ui/resources/mock/js/app_main.js index b573a93..a83356b 100644 --- a/chromeos/components/media_app_ui/resources/mock/js/app_main.js +++ b/chromeos/components/media_app_ui/resources/mock/js/app_main.js
@@ -25,10 +25,10 @@ }; /** @type {ModuleHandler} */ -const createImgChild = async (blobSrc, altText) => { +const createImgChild = async (blobSrc, fileName) => { const img = /** @type {!HTMLImageElement} */ (document.createElement('img')); img.src = blobSrc; - img.alt = altText; + img.alt = fileName; try { await img.decode(); } catch (error) { @@ -55,12 +55,30 @@ this.appendChild(this.currentMedia); /** @type {?mediaApp.AbstractFileList} */ this.files; + /** @type {?mediaApp.ClientApiDelegate} */ + this.delegate; + } + + /** + * Emulates the preprocessing done in the "real" BacklightApp to hook in the + * RAW file converter. See go/media-app-element. + * + * @param {?mediaApp.AbstractFile} file + * @private + */ + async preprocessFile(file) { + // This mock is only used for tests (which only test a .orf RAW file). We + // don't maintain the full list of RAW extensions here. + if (file && file.name.toLowerCase().endsWith('.orf')) { + file.blob = await this.delegate.extractPreview(file.blob); + } } /** @override */ async loadFiles(files) { let child; const file = files.item(0); + await this.preprocessFile(file); if (file) { const isVideo = file.mimeType.match('^video/'); const factory = isVideo ? createVideoChild : createImgChild; @@ -88,7 +106,9 @@ } /** @override */ - setDelegate(delegate) {} + setDelegate(delegate) { + this.delegate = delegate; + } /** @param {!mediaApp.AbstractFileList} files */ onNewFiles(files) {
diff --git a/chromeos/dbus/shill/fake_shill_profile_client.cc b/chromeos/dbus/shill/fake_shill_profile_client.cc index 33fa8a9..11edfbd 100644 --- a/chromeos/dbus/shill/fake_shill_profile_client.cc +++ b/chromeos/dbus/shill/fake_shill_profile_client.cc
@@ -26,9 +26,11 @@ namespace chromeos { struct FakeShillProfileClient::ProfileProperties { - std::string path; // Profile path - base::DictionaryValue entries; // Dictionary of Service Dictionaries - base::DictionaryValue properties; // Dictionary of Profile properties + std::string profile_path; + // Dictionary of Service Dictionaries + base::Value entries{base::Value::Type::DICTIONARY}; + // Dictionary of Profile properties + base::Value properties{base::Value::Type::DICTIONARY}; }; FakeShillProfileClient::FakeShillProfileClient() = default; @@ -141,10 +143,10 @@ CHECK(profile_path != GetSharedProfilePath() || profiles_.empty()) << "Shared profile must be added before any user profile."; - auto profile = std::make_unique<ProfileProperties>(); - profile->properties.SetKey(shill::kUserHashProperty, base::Value(userhash)); - profile->path = profile_path; - profiles_.emplace_back(std::move(profile)); + ProfileProperties profile; + profile.properties.SetKey(shill::kUserHashProperty, base::Value(userhash)); + profile.profile_path = profile_path; + profiles_.push_back(std::move(profile)); ShillManagerClient::Get()->GetTestInterface()->AddProfile(profile_path); } @@ -167,7 +169,7 @@ << " for: " << service_path; return false; } - if (profile->entries.HasKey(service_path)) + if (profile->entries.FindKey(service_path)) return false; return AddOrUpdateServiceImpl(profile_path, service_path, profile); } @@ -180,7 +182,7 @@ << " for: " << service_path; return false; } - if (!profile->entries.HasKey(service_path)) { + if (!profile->entries.FindKey(service_path)) { LOG(ERROR) << "UpdateService: Profile: " << profile_path << " does not contain Service: " << service_path; return false; @@ -219,16 +221,16 @@ void FakeShillProfileClient::GetProfilePaths( std::vector<std::string>* profiles) { for (const auto& profile : profiles_) - profiles->push_back(profile->path); + profiles->push_back(profile.profile_path); } void FakeShillProfileClient::GetProfilePathsContainingService( const std::string& service_path, std::vector<std::string>* profiles) { for (const auto& profile : profiles_) { - if (profile->entries.FindKeyOfType(service_path, - base::Value::Type::DICTIONARY)) { - profiles->push_back(profile->path); + if (profile.entries.FindKeyOfType(service_path, + base::Value::Type::DICTIONARY)) { + profiles->push_back(profile.profile_path); } } } @@ -239,10 +241,10 @@ // Returns the entry added latest. for (const auto& profile : base::Reversed(profiles_)) { - const base::Value* entry = profile->entries.FindDictKey(service_path); + const base::Value* entry = profile.entries.FindDictKey(service_path); if (!entry) continue; - *profile_path = profile->path; + *profile_path = profile.profile_path; return entry->Clone(); } return base::Value(); @@ -250,8 +252,8 @@ bool FakeShillProfileClient::HasService(const std::string& service_path) { for (const auto& profile : profiles_) { - if (profile->entries.FindKeyOfType(service_path, - base::Value::Type::DICTIONARY)) { + if (profile.entries.FindKeyOfType(service_path, + base::Value::Type::DICTIONARY)) { return true; } } @@ -271,8 +273,8 @@ FakeShillProfileClient::ProfileProperties* FakeShillProfileClient::GetProfile( const dbus::ObjectPath& profile_path) { for (auto& profile : profiles_) { - if (profile->path == profile_path.value()) - return profile.get(); + if (profile.profile_path == profile_path.value()) + return &profile; } return nullptr; }
diff --git a/chromeos/dbus/shill/fake_shill_profile_client.h b/chromeos/dbus/shill/fake_shill_profile_client.h index 7945a47..1981c2ae 100644 --- a/chromeos/dbus/shill/fake_shill_profile_client.h +++ b/chromeos/dbus/shill/fake_shill_profile_client.h
@@ -74,10 +74,9 @@ ProfileProperties* GetProfile(const dbus::ObjectPath& profile_path); // List of profiles known to the client in order they were added, and in the - // reverse order of priority. - // |AddProfile| will encure that shared profile is never added after a user - // profile. - std::vector<std::unique_ptr<ProfileProperties>> profiles_; + // reverse order of priority. |AddProfile| will ensure that shared profile is + // never added after a user profile. + std::vector<ProfileProperties> profiles_; FakeShillSimulatedResult simulate_delete_result_ = FakeShillSimulatedResult::kSuccess;
diff --git a/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.cc b/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.cc index f8c406f3..73f3e24 100644 --- a/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.cc +++ b/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.cc
@@ -43,7 +43,7 @@ void FakeShillThirdPartyVpnDriverClient::SetParameters( const std::string& object_path_value, - const base::DictionaryValue& parameters, + const base::Value& parameters, StringCallback callback, ErrorCallback error_callback) { base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.h b/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.h index 8207894..2874866 100644 --- a/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.h +++ b/chromeos/dbus/shill/fake_shill_third_party_vpn_driver_client.h
@@ -35,7 +35,7 @@ void RemoveShillThirdPartyVpnObserver( const std::string& object_path_value) override; void SetParameters(const std::string& object_path_value, - const base::DictionaryValue& parameters, + const base::Value& parameters, StringCallback callback, ErrorCallback error_callback) override; void UpdateConnectionState(const std::string& object_path_value,
diff --git a/chromeos/dbus/shill/fake_sms_client.cc b/chromeos/dbus/shill/fake_sms_client.cc index 3575f84..77920cb 100644 --- a/chromeos/dbus/shill/fake_sms_client.cc +++ b/chromeos/dbus/shill/fake_sms_client.cc
@@ -27,14 +27,15 @@ const dbus::ObjectPath& object_path, GetAllCallback callback) { if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - chromeos::switches::kSmsTestMessages)) + chromeos::switches::kSmsTestMessages)) { return; - + } // Ownership passed to callback - base::DictionaryValue sms; - sms.SetString("Number", "000-000-0000"); - sms.SetString("Text", "FakeSMSClient: Test Message: " + object_path.value()); - sms.SetString("Timestamp", "Fri Jun 8 13:26:04 EDT 2012"); + base::Value sms(base::Value::Type::DICTIONARY); + sms.SetStringKey("Number", "000-000-0000"); + sms.SetStringKey("Text", + "FakeSMSClient: Test Message: " + object_path.value()); + sms.SetStringKey("Timestamp", "Fri Jun 8 13:26:04 EDT 2012"); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), std::move(sms)));
diff --git a/chromeos/dbus/shill/shill_client_unittest_base.cc b/chromeos/dbus/shill/shill_client_unittest_base.cc index 64e6fffa..b70cbc2 100644 --- a/chromeos/dbus/shill/shill_client_unittest_base.cc +++ b/chromeos/dbus/shill/shill_client_unittest_base.cc
@@ -30,22 +30,22 @@ namespace { // Pops a string-to-string dictionary from the reader. -base::DictionaryValue* PopStringToStringDictionary( +std::unique_ptr<base::Value> PopStringToStringDictionary( dbus::MessageReader* reader) { - dbus::MessageReader array_reader(NULL); + dbus::MessageReader array_reader(nullptr); if (!reader->PopArray(&array_reader)) - return NULL; - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue); + return nullptr; + auto result = std::make_unique<base::Value>(base::Value::Type::DICTIONARY); while (array_reader.HasMoreData()) { - dbus::MessageReader entry_reader(NULL); + dbus::MessageReader entry_reader(nullptr); std::string key; std::string value; if (!array_reader.PopDictEntry(&entry_reader) || !entry_reader.PopString(&key) || !entry_reader.PopString(&value)) - return NULL; + return nullptr; result->SetKey(key, base::Value(value)); } - return result.release(); + return result; } } // namespace @@ -85,7 +85,7 @@ const dbus::ObjectPath& object_path) : interface_name_(interface_name), object_path_(object_path), - response_(NULL) {} + response_(nullptr) {} ShillClientUnittestBase::~ShillClientUnittestBase() = default; @@ -234,16 +234,6 @@ } // static -void ShillClientUnittestBase::ExpectValueArgument( - const base::Value* expected_value, - dbus::MessageReader* reader) { - std::unique_ptr<base::Value> value(dbus::PopDataAsValue(reader)); - ASSERT_TRUE(value.get()); - EXPECT_TRUE(value->Equals(expected_value)); - EXPECT_FALSE(reader->HasMoreData()); -} - -// static void ShillClientUnittestBase::ExpectStringAndValueArguments( const std::string& expected_string, const base::Value* expected_value, @@ -258,34 +248,35 @@ } // static -void ShillClientUnittestBase::ExpectDictionaryValueArgument( - const base::DictionaryValue* expected_dictionary, +void ShillClientUnittestBase::ExpectValueDictionaryArgument( + const base::Value* expected_dictionary, bool string_valued, dbus::MessageReader* reader) { - dbus::MessageReader array_reader(NULL); + ASSERT_TRUE(expected_dictionary->is_dict()); + dbus::MessageReader array_reader(nullptr); ASSERT_TRUE(reader->PopArray(&array_reader)); while (array_reader.HasMoreData()) { - dbus::MessageReader entry_reader(NULL); + dbus::MessageReader entry_reader(nullptr); ASSERT_TRUE(array_reader.PopDictEntry(&entry_reader)); std::string key; ASSERT_TRUE(entry_reader.PopString(&key)); if (string_valued) { std::string value; - std::string expected_value; ASSERT_TRUE(entry_reader.PopString(&value)); - EXPECT_TRUE(expected_dictionary->GetStringWithoutPathExpansion( - key, &expected_value)); - EXPECT_EQ(expected_value, value); + const std::string* expected_value = + expected_dictionary->FindStringKey(key); + ASSERT_TRUE(expected_value); + EXPECT_EQ(*expected_value, value); continue; } - dbus::MessageReader variant_reader(NULL); + dbus::MessageReader variant_reader(nullptr); ASSERT_TRUE(entry_reader.PopVariant(&variant_reader)); std::unique_ptr<base::Value> value; // Variants in the dictionary can be basic types or string-to-string // dictinoary. switch (variant_reader.GetDataType()) { case dbus::Message::ARRAY: - value.reset(PopStringToStringDictionary(&variant_reader)); + value = PopStringToStringDictionary(&variant_reader); break; case dbus::Message::BOOL: case dbus::Message::INT32: @@ -296,26 +287,24 @@ NOTREACHED(); } ASSERT_TRUE(value.get()); - const base::Value* expected_value = NULL; - EXPECT_TRUE( - expected_dictionary->GetWithoutPathExpansion(key, &expected_value)); + const base::Value* expected_value = expected_dictionary->FindKey(key); + ASSERT_TRUE(expected_value); EXPECT_TRUE(value->Equals(expected_value)); } } // static -base::DictionaryValue* -ShillClientUnittestBase::CreateExampleServiceProperties() { - base::DictionaryValue* properties = new base::DictionaryValue; - properties->SetKey(shill::kGuidProperty, - base::Value("00000000-0000-0000-0000-000000000000")); - properties->SetKey(shill::kModeProperty, base::Value(shill::kModeManaged)); - properties->SetKey(shill::kTypeProperty, base::Value(shill::kTypeWifi)); +base::Value ShillClientUnittestBase::CreateExampleServiceProperties() { + base::Value properties(base::Value::Type::DICTIONARY); + properties.SetKey(shill::kGuidProperty, + base::Value("00000000-0000-0000-0000-000000000000")); + properties.SetKey(shill::kModeProperty, base::Value(shill::kModeManaged)); + properties.SetKey(shill::kTypeProperty, base::Value(shill::kTypeWifi)); const std::string ssid = "testssid"; - properties->SetKey(shill::kWifiHexSsid, - base::Value(base::HexEncode(ssid.c_str(), ssid.size()))); - properties->SetKey(shill::kSecurityClassProperty, - base::Value(shill::kSecurityPsk)); + properties.SetKey(shill::kWifiHexSsid, + base::Value(base::HexEncode(ssid.c_str(), ssid.size()))); + properties.SetKey(shill::kSecurityClassProperty, + base::Value(shill::kSecurityPsk)); return properties; } @@ -346,8 +335,8 @@ } // static -void ShillClientUnittestBase::ExpectDictionaryValueResultWithoutStatus( - const base::DictionaryValue* expected_result, +void ShillClientUnittestBase::ExpectValueResultWithoutStatus( + const base::Value* expected_result, base::Value result) { std::string expected_result_string; base::JSONWriter::Write(*expected_result, &expected_result_string); @@ -357,12 +346,12 @@ } // static -void ShillClientUnittestBase::ExpectDictionaryValueResult( - const base::DictionaryValue* expected_result, +void ShillClientUnittestBase::ExpectValueResult( + const base::Value* expected_result, base::Optional<base::Value> result) { EXPECT_TRUE(result); - ExpectDictionaryValueResultWithoutStatus( - expected_result, std::move(result).value_or(base::Value())); + ExpectValueResultWithoutStatus(expected_result, + std::move(result).value_or(base::Value())); } void ShillClientUnittestBase::OnConnectToPlatformMessage(
diff --git a/chromeos/dbus/shill/shill_client_unittest_base.h b/chromeos/dbus/shill/shill_client_unittest_base.h index 27d0521a..a753645 100644 --- a/chromeos/dbus/shill/shill_client_unittest_base.h +++ b/chromeos/dbus/shill/shill_client_unittest_base.h
@@ -29,11 +29,8 @@ using ::testing::MatchResultListener; namespace base { - class Value; -class DictionaryValue; - -} // namespace base +} namespace dbus { @@ -125,24 +122,19 @@ const std::vector<std::string>& expected_strings, dbus::MessageReader* reader); - // Expects the reader to have a Value. - static void ExpectValueArgument(const base::Value* expected_value, - dbus::MessageReader* reader); - // Expects the reader to have a string and a Value. static void ExpectStringAndValueArguments(const std::string& expected_string, const base::Value* expected_value, dbus::MessageReader* reader); // Expects the reader to have a string-to-variant dictionary. - static void ExpectDictionaryValueArgument( - const base::DictionaryValue* expected_dictionary, + static void ExpectValueDictionaryArgument( + const base::Value* expected_dictionary, bool string_valued, dbus::MessageReader* reader); - // Creates a DictionaryValue with example Service properties. The caller owns - // the result. - static base::DictionaryValue* CreateExampleServiceProperties(); + // Creates a dictionary Value with example Service properties. + static base::Value CreateExampleServiceProperties(); // Expects the call status to be SUCCESS. static void ExpectNoResultValue(bool result); @@ -158,14 +150,12 @@ const std::string& result); // Checks the result and expects the call status to be SUCCESS. - static void ExpectDictionaryValueResult( - const base::DictionaryValue* expected_result, - base::Optional<base::Value> result); + static void ExpectValueResult(const base::Value* expected_result, + base::Optional<base::Value> result); // Expects the |expected_result| to match the |result|. - static void ExpectDictionaryValueResultWithoutStatus( - const base::DictionaryValue* expected_result, - base::Value result); + static void ExpectValueResultWithoutStatus(const base::Value* expected_result, + base::Value result); // A message loop to emulate asynchronous behavior. base::test::SingleThreadTaskEnvironment task_environment_;
diff --git a/chromeos/dbus/shill/shill_device_client_unittest.cc b/chromeos/dbus/shill/shill_device_client_unittest.cc index 6ebde2d..8feda34 100644 --- a/chromeos/dbus/shill/shill_device_client_unittest.cc +++ b/chromeos/dbus/shill/shill_device_client_unittest.cc
@@ -127,13 +127,13 @@ writer.CloseContainer(&array_writer); // Set expectations. - base::DictionaryValue value; + base::Value value(base::Value::Type::DICTIONARY); value.SetKey(shill::kCellularAllowRoamingProperty, base::Value(kValue)); PrepareForMethodCall(shill::kGetPropertiesFunction, base::BindRepeating(&ExpectNoArgument), response.get()); // Call method. client_->GetProperties(dbus::ObjectPath(kExampleDevicePath), - base::BindOnce(&ExpectDictionaryValueResult, &value)); + base::BindOnce(&ExpectValueResult, &value)); // Run the message loop. base::RunLoop().RunUntilIdle(); }
diff --git a/chromeos/dbus/shill/shill_ipconfig_client_unittest.cc b/chromeos/dbus/shill/shill_ipconfig_client_unittest.cc index 9126a33..d857274 100644 --- a/chromeos/dbus/shill/shill_ipconfig_client_unittest.cc +++ b/chromeos/dbus/shill/shill_ipconfig_client_unittest.cc
@@ -106,7 +106,7 @@ writer.CloseContainer(&array_writer); // Create the expected value. - base::DictionaryValue value; + base::Value value(base::Value::Type::DICTIONARY); value.SetKey(shill::kAddressProperty, base::Value(kAddress)); value.SetKey(shill::kMtuProperty, base::Value(kMtu)); @@ -115,7 +115,7 @@ base::BindRepeating(&ExpectNoArgument), response.get()); // Call method. client_->GetProperties(dbus::ObjectPath(kExampleIPConfigPath), - base::BindOnce(&ExpectDictionaryValueResult, &value)); + base::BindOnce(&ExpectValueResult, &value)); // Run the message loop. base::RunLoop().RunUntilIdle(); }
diff --git a/chromeos/dbus/shill/shill_manager_client_unittest.cc b/chromeos/dbus/shill/shill_manager_client_unittest.cc index 1aa514a..2253e2f 100644 --- a/chromeos/dbus/shill/shill_manager_client_unittest.cc +++ b/chromeos/dbus/shill/shill_manager_client_unittest.cc
@@ -114,13 +114,13 @@ writer.CloseContainer(&array_writer); // Create the expected value. - base::DictionaryValue value; + base::Value value(base::Value::Type::DICTIONARY); value.SetKey(shill::kArpGatewayProperty, base::Value(true)); // Set expectations. PrepareForMethodCall(shill::kGetPropertiesFunction, base::BindRepeating(&ExpectNoArgument), response.get()); // Call method. - client_->GetProperties(base::BindOnce(&ExpectDictionaryValueResult, &value)); + client_->GetProperties(base::BindOnce(&ExpectValueResult, &value)); // Run the message loop. base::RunLoop().RunUntilIdle(); } @@ -153,20 +153,20 @@ writer.CloseContainer(&type_dict_writer); // Create the expected value. - auto property_dict_value = std::make_unique<base::DictionaryValue>(); - property_dict_value->SetKey(shill::kGeoMacAddressProperty, - base::Value("01:23:45:67:89:AB")); - auto type_entry_value = std::make_unique<base::ListValue>(); - type_entry_value->Append(std::move(property_dict_value)); - base::DictionaryValue type_dict_value; - type_dict_value.SetWithoutPathExpansion("wifi", std::move(type_entry_value)); + base::Value property_dict_value(base::Value::Type::DICTIONARY); + property_dict_value.SetKey(shill::kGeoMacAddressProperty, + base::Value("01:23:45:67:89:AB")); + base::Value type_entry_value(base::Value::Type::LIST); + type_entry_value.Append(std::move(property_dict_value)); + base::Value type_dict_value(base::Value::Type::DICTIONARY); + type_dict_value.SetKey("wifi", std::move(type_entry_value)); // Set expectations. PrepareForMethodCall(shill::kGetNetworksForGeolocation, base::BindRepeating(&ExpectNoArgument), response.get()); // Call method. client_->GetNetworksForGeolocation( - base::BindOnce(&ExpectDictionaryValueResult, &type_dict_value)); + base::BindOnce(&ExpectValueResult, &type_dict_value)); // Run the message loop. base::RunLoop().RunUntilIdle(); @@ -285,18 +285,18 @@ dbus::MessageWriter writer(response.get()); writer.AppendObjectPath(object_path); // Create the argument dictionary. - std::unique_ptr<base::DictionaryValue> arg(CreateExampleServiceProperties()); + base::Value arg = CreateExampleServiceProperties(); // Use a variant valued dictionary rather than a string valued one. const bool string_valued = false; // Set expectations. - PrepareForMethodCall(shill::kConfigureServiceFunction, - base::BindRepeating(&ExpectDictionaryValueArgument, - arg.get(), string_valued), - response.get()); + PrepareForMethodCall( + shill::kConfigureServiceFunction, + base::BindRepeating(&ExpectValueDictionaryArgument, &arg, string_valued), + response.get()); // Call method. base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; client_->ConfigureService( - *arg, base::BindOnce(&ExpectObjectPathResultWithoutStatus, object_path), + arg, base::BindOnce(&ExpectObjectPathResultWithoutStatus, object_path), mock_error_callback.Get()); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); @@ -311,18 +311,18 @@ dbus::MessageWriter writer(response.get()); writer.AppendObjectPath(object_path); // Create the argument dictionary. - std::unique_ptr<base::DictionaryValue> arg(CreateExampleServiceProperties()); + base::Value arg = CreateExampleServiceProperties(); // Use a variant valued dictionary rather than a string valued one. const bool string_valued = false; // Set expectations. - PrepareForMethodCall(shill::kGetServiceFunction, - base::BindRepeating(&ExpectDictionaryValueArgument, - arg.get(), string_valued), - response.get()); + PrepareForMethodCall( + shill::kGetServiceFunction, + base::BindRepeating(&ExpectValueDictionaryArgument, &arg, string_valued), + response.get()); // Call method. base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; client_->GetService( - *arg, base::BindOnce(&ExpectObjectPathResultWithoutStatus, object_path), + arg, base::BindOnce(&ExpectObjectPathResultWithoutStatus, object_path), mock_error_callback.Get()); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
diff --git a/chromeos/dbus/shill/shill_profile_client_unittest.cc b/chromeos/dbus/shill/shill_profile_client_unittest.cc index ddd2f1a..cb78b715 100644 --- a/chromeos/dbus/shill/shill_profile_client_unittest.cc +++ b/chromeos/dbus/shill/shill_profile_client_unittest.cc
@@ -109,10 +109,10 @@ writer.CloseContainer(&array_writer); // Create the expected value. - auto entries = std::make_unique<base::ListValue>(); - entries->AppendString(kExampleEntryPath); - base::DictionaryValue value; - value.SetWithoutPathExpansion(shill::kEntriesProperty, std::move(entries)); + base::Value entries(base::Value::Type::LIST); + entries.Append(kExampleEntryPath); + base::Value value(base::Value::Type::DICTIONARY); + value.SetKey(shill::kEntriesProperty, std::move(entries)); // Set expectations. PrepareForMethodCall(shill::kGetPropertiesFunction, base::BindRepeating(&ExpectNoArgument), response.get()); @@ -120,7 +120,7 @@ base::MockCallback<ShillProfileClient::ErrorCallback> error_callback; client_->GetProperties( dbus::ObjectPath(kDefaultProfilePath), - base::BindOnce(&ExpectDictionaryValueResultWithoutStatus, &value), + base::BindOnce(&ExpectValueResultWithoutStatus, &value), error_callback.Get()); EXPECT_CALL(error_callback, Run(_, _)).Times(0); @@ -142,7 +142,7 @@ writer.CloseContainer(&array_writer); // Create the expected value. - base::DictionaryValue value; + base::Value value(base::Value::Type::DICTIONARY); value.SetKey(shill::kTypeProperty, base::Value(shill::kTypeWifi)); // Set expectations. PrepareForMethodCall( @@ -151,10 +151,9 @@ response.get()); // Call method. base::MockCallback<ShillProfileClient::ErrorCallback> error_callback; - client_->GetEntry( - dbus::ObjectPath(kDefaultProfilePath), kExampleEntryPath, - base::BindOnce(&ExpectDictionaryValueResultWithoutStatus, &value), - error_callback.Get()); + client_->GetEntry(dbus::ObjectPath(kDefaultProfilePath), kExampleEntryPath, + base::BindOnce(&ExpectValueResultWithoutStatus, &value), + error_callback.Get()); EXPECT_CALL(error_callback, Run(_, _)).Times(0); // Run the message loop. base::RunLoop().RunUntilIdle(); @@ -165,7 +164,7 @@ std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); // Create the expected value. - base::DictionaryValue value; + base::Value value(base::Value::Type::DICTIONARY); value.SetKey(shill::kArpGatewayProperty, base::Value(true)); // Set expectations. PrepareForMethodCall(
diff --git a/chromeos/dbus/shill/shill_service_client_unittest.cc b/chromeos/dbus/shill/shill_service_client_unittest.cc index 44144b6..4e7196b 100644 --- a/chromeos/dbus/shill/shill_service_client_unittest.cc +++ b/chromeos/dbus/shill/shill_service_client_unittest.cc
@@ -99,13 +99,13 @@ writer.CloseContainer(&array_writer); // Set expectations. - base::DictionaryValue value; + base::Value value(base::Value::Type::DICTIONARY); value.SetKey(shill::kSignalStrengthProperty, base::Value(kValue)); PrepareForMethodCall(shill::kGetPropertiesFunction, base::BindRepeating(&ExpectNoArgument), response.get()); // Call method. client_->GetProperties(dbus::ObjectPath(kExampleServicePath), - base::BindOnce(&ExpectDictionaryValueResult, &value)); + base::BindOnce(&ExpectValueResult, &value)); // Run the message loop. base::RunLoop().RunUntilIdle(); } @@ -139,18 +139,18 @@ std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); // Set expectations. - std::unique_ptr<base::DictionaryValue> arg(CreateExampleServiceProperties()); + base::Value arg = CreateExampleServiceProperties(); // Use a variant valued dictionary rather than a string valued one. const bool string_valued = false; - PrepareForMethodCall(shill::kSetPropertiesFunction, - base::BindRepeating(&ExpectDictionaryValueArgument, - arg.get(), string_valued), - response.get()); + PrepareForMethodCall( + shill::kSetPropertiesFunction, + base::BindRepeating(&ExpectValueDictionaryArgument, &arg, string_valued), + response.get()); // Call method. base::MockCallback<base::OnceClosure> mock_closure; base::MockCallback<ShillServiceClient::ErrorCallback> mock_error_callback; - client_->SetProperties(dbus::ObjectPath(kExampleServicePath), *arg, + client_->SetProperties(dbus::ObjectPath(kExampleServicePath), arg, mock_closure.Get(), mock_error_callback.Get()); EXPECT_CALL(mock_closure, Run()).Times(1); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
diff --git a/chromeos/dbus/shill/shill_third_party_vpn_driver_client.cc b/chromeos/dbus/shill/shill_third_party_vpn_driver_client.cc index f1b8b44..b395b32 100644 --- a/chromeos/dbus/shill/shill_third_party_vpn_driver_client.cc +++ b/chromeos/dbus/shill/shill_third_party_vpn_driver_client.cc
@@ -55,7 +55,7 @@ const std::string& object_path_value) override; void SetParameters(const std::string& object_path_value, - const base::DictionaryValue& parameters, + const base::Value& parameters, StringCallback callback, ErrorCallback error_callback) override; @@ -205,7 +205,7 @@ void ShillThirdPartyVpnDriverClientImpl::SetParameters( const std::string& object_path_value, - const base::DictionaryValue& parameters, + const base::Value& parameters, StringCallback callback, ErrorCallback error_callback) { dbus::MethodCall method_call(shill::kFlimflamThirdPartyVpnInterface, @@ -213,21 +213,19 @@ dbus::MessageWriter writer(&method_call); dbus::MessageWriter array_writer(nullptr); writer.OpenArray("{ss}", &array_writer); - for (base::DictionaryValue::Iterator it(parameters); !it.IsAtEnd(); - it.Advance()) { - if (valid_keys_.find(it.key()) == valid_keys_.end()) { - LOG(WARNING) << "Unknown key " << it.key(); + for (auto it : parameters.DictItems()) { + if (valid_keys_.find(it.first) == valid_keys_.end()) { + LOG(WARNING) << "Unknown key " << it.first; continue; } - std::string value; - if (!it.value().GetAsString(&value)) { - LOG(WARNING) << "Non string value " << it.value(); + if (!it.second.is_string()) { + LOG(WARNING) << "Non string value " << it.second; continue; } dbus::MessageWriter entry_writer(nullptr); array_writer.OpenDictEntry(&entry_writer); - entry_writer.AppendString(it.key()); - entry_writer.AppendString(value); + entry_writer.AppendString(it.first); + entry_writer.AppendString(it.second.GetString()); array_writer.CloseContainer(&entry_writer); } writer.CloseContainer(&array_writer);
diff --git a/chromeos/dbus/shill/shill_third_party_vpn_driver_client.h b/chromeos/dbus/shill/shill_third_party_vpn_driver_client.h index 81a287f..87f179d64 100644 --- a/chromeos/dbus/shill/shill_third_party_vpn_driver_client.h +++ b/chromeos/dbus/shill/shill_third_party_vpn_driver_client.h
@@ -15,8 +15,8 @@ #include "chromeos/dbus/shill/shill_client_helper.h" namespace base { -class DictionaryValue; -} // namespace base +class Value; +} namespace dbus { class Bus; @@ -69,10 +69,11 @@ virtual void RemoveShillThirdPartyVpnObserver( const std::string& object_path_value) = 0; - // Calls SetParameters method. - // |callback| is called after the method call succeeds. + // Calls the SetParameters DBus method for |object_path_value| with + // |parameters| which must be a dictionary Value. Invokes |callback| on + // success or |error_callback| on failure. virtual void SetParameters(const std::string& object_path_value, - const base::DictionaryValue& parameters, + const base::Value& parameters, StringCallback callback, ErrorCallback error_callback) = 0;
diff --git a/chromeos/dbus/shill/shill_third_party_vpn_driver_client_unittest.cc b/chromeos/dbus/shill/shill_third_party_vpn_driver_client_unittest.cc index a298d62..88f36e1 100644 --- a/chromeos/dbus/shill/shill_third_party_vpn_driver_client_unittest.cc +++ b/chromeos/dbus/shill/shill_third_party_vpn_driver_client_unittest.cc
@@ -136,7 +136,7 @@ dbus::MessageWriter writer(response.get()); writer.AppendString(std::string("deadbeef")); - base::DictionaryValue parameters; + base::Value parameters(base::Value::Type::DICTIONARY); const std::string kAddress("1.1.1.1"); parameters.SetKey(shill::kAddressParameterThirdPartyVpn, base::Value(kAddress)); @@ -145,7 +145,7 @@ PrepareForMethodCall( shill::kSetParametersFunction, - base::BindRepeating(&ExpectDictionaryValueArgument, ¶meters, true), + base::BindRepeating(&ExpectValueDictionaryArgument, ¶meters, true), response.get()); client_->SetParameters(
diff --git a/chromeos/dbus/shill/sms_client.cc b/chromeos/dbus/shill/sms_client.cc index 670f22ef..2b37157 100644 --- a/chromeos/dbus/shill/sms_client.cc +++ b/chromeos/dbus/shill/sms_client.cc
@@ -62,10 +62,10 @@ return; if (number_.is_valid() && text_.is_valid() && timestamp_.is_valid()) { - base::DictionaryValue sms; - sms.SetString(SMSClient::kSMSPropertyNumber, number_.value()); - sms.SetString(SMSClient::kSMSPropertyText, text_.value()); - sms.SetString(SMSClient::kSMSPropertyTimestamp, timestamp_.value()); + base::Value sms(base::Value::Type::DICTIONARY); + sms.SetStringKey(SMSClient::kSMSPropertyNumber, number_.value()); + sms.SetStringKey(SMSClient::kSMSPropertyText, text_.value()); + sms.SetStringKey(SMSClient::kSMSPropertyTimestamp, timestamp_.value()); // Move |callback_| to the task to ensure that |callback_| is only called // once. Since |callback_| may destruct this object, schedule it to the // task runner to run after this method returns. @@ -120,7 +120,7 @@ private: void OnSMSReceived(const dbus::ObjectPath& object_path, GetAllCallback callback, - const base::DictionaryValue& sms) { + const base::Value& sms) { sms_receive_handlers_.erase(object_path); std::move(callback).Run(sms); }
diff --git a/chromeos/dbus/shill/sms_client.h b/chromeos/dbus/shill/sms_client.h index 89a6673e..0f1b4dc 100644 --- a/chromeos/dbus/shill/sms_client.h +++ b/chromeos/dbus/shill/sms_client.h
@@ -13,7 +13,7 @@ namespace base { class Bus; -class DictionaryValue; +class Value; } // namespace base namespace dbus { @@ -29,8 +29,7 @@ // DBusThreadManager instance. class COMPONENT_EXPORT(SHILL_CLIENT) SMSClient { public: - using GetAllCallback = - base::OnceCallback<void(const base::DictionaryValue& sms)>; + using GetAllCallback = base::OnceCallback<void(const base::Value& sms)>; static const char kSMSPropertyState[]; static const char kSMSPropertyNumber[];
diff --git a/chromeos/network/network_sms_handler.cc b/chromeos/network/network_sms_handler.cc index 70e1a06c..8f2198fa 100644 --- a/chromeos/network/network_sms_handler.cc +++ b/chromeos/network/network_sms_handler.cc
@@ -57,11 +57,11 @@ private: void ListCallback(base::Optional<std::vector<dbus::ObjectPath>> paths); void SmsReceivedCallback(const dbus::ObjectPath& path, bool complete); - void GetCallback(const base::DictionaryValue& dictionary); + void GetCallback(const base::Value& dictionary); void DeleteMessages(); void DeleteCallback(bool success); void GetMessages(); - void MessageReceived(const base::DictionaryValue& dictionary); + void MessageReceived(const base::Value& dictionary); NetworkSmsHandler* host_; std::string service_name_; @@ -172,10 +172,8 @@ delete_queue_.push_back(sms_path); } -void NetworkSmsHandler:: -ModemManager1NetworkSmsDeviceHandler::SmsReceivedCallback( - const dbus::ObjectPath& sms_path, - bool complete) { +void NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler:: + SmsReceivedCallback(const dbus::ObjectPath& sms_path, bool complete) { // Only handle complete messages. if (!complete) return; @@ -185,29 +183,29 @@ } void NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler::GetCallback( - const base::DictionaryValue& dictionary) { + const base::Value& dictionary) { MessageReceived(dictionary); GetMessages(); } -void NetworkSmsHandler:: -ModemManager1NetworkSmsDeviceHandler::MessageReceived( - const base::DictionaryValue& dictionary) { +void NetworkSmsHandler::ModemManager1NetworkSmsDeviceHandler::MessageReceived( + const base::Value& dictionary) { // The keys of the ModemManager1.SMS interface do not match the // exported keys, so a new dictionary is created with the expected // key namaes. - base::DictionaryValue new_dictionary; - std::string text, number, timestamp; - if (dictionary.GetStringWithoutPathExpansion(SMSClient::kSMSPropertyNumber, - &number)) - new_dictionary.SetString(kNumberKey, number); - if (dictionary.GetStringWithoutPathExpansion(SMSClient::kSMSPropertyText, - &text)) - new_dictionary.SetString(kTextKey, text); - // TODO(jglasgow): consider normalizing timestamp. - if (dictionary.GetStringWithoutPathExpansion(SMSClient::kSMSPropertyTimestamp, - ×tamp)) - new_dictionary.SetString(kTimestampKey, timestamp); + base::Value new_dictionary(base::Value::Type::DICTIONARY); + const std::string* number = + dictionary.FindStringKey(SMSClient::kSMSPropertyNumber); + if (number) + new_dictionary.SetStringKey(kNumberKey, *number); + const std::string* text = + dictionary.FindStringKey(SMSClient::kSMSPropertyText); + if (text) + new_dictionary.SetStringKey(kTextKey, *text); + const std::string* timestamp = + dictionary.FindStringKey(SMSClient::kSMSPropertyTimestamp); + if (timestamp) + new_dictionary.SetStringKey(kTimestampKey, *timestamp); host_->MessageReceived(new_dictionary); } @@ -234,7 +232,7 @@ // If we already received messages and |request_existing| is true, send // updates for existing messages. for (const auto& message : received_messages_) { - NotifyMessageReceived(*message); + NotifyMessageReceived(message); } // Request updates from each device. for (auto& handler : device_handlers_) { @@ -259,20 +257,18 @@ // Private methods -void NetworkSmsHandler::AddReceivedMessage( - const base::DictionaryValue& message) { +void NetworkSmsHandler::AddReceivedMessage(const base::Value& message) { if (received_messages_.size() >= kMaxReceivedMessages) received_messages_.erase(received_messages_.begin()); - received_messages_.push_back(message.CreateDeepCopy()); + received_messages_.push_back(message.Clone()); } -void NetworkSmsHandler::NotifyMessageReceived( - const base::DictionaryValue& message) { +void NetworkSmsHandler::NotifyMessageReceived(const base::Value& message) { for (auto& observer : observers_) observer.MessageReceived(message); } -void NetworkSmsHandler::MessageReceived(const base::DictionaryValue& message) { +void NetworkSmsHandler::MessageReceived(const base::Value& message) { AddReceivedMessage(message); NotifyMessageReceived(message); }
diff --git a/chromeos/network/network_sms_handler.h b/chromeos/network/network_sms_handler.h index 427efa7..ca036ca 100644 --- a/chromeos/network/network_sms_handler.h +++ b/chromeos/network/network_sms_handler.h
@@ -18,7 +18,6 @@ #include "chromeos/dbus/shill/shill_property_changed_observer.h" namespace base { -class DictionaryValue; class Value; } @@ -36,9 +35,10 @@ public: virtual ~Observer() {} - // Called when a new message arrives. |message| contains the message. - // The contents of the dictionary include the keys listed above. - virtual void MessageReceived(const base::DictionaryValue& message) = 0; + // Called when a new message arrives. |message| contains the message which + // is a dictionary value containing entries for kNumberKey, kTextKey, and + // kTimestampKey. + virtual void MessageReceived(const base::Value& message) = 0; }; ~NetworkSmsHandler() override; @@ -71,13 +71,13 @@ // Adds |message| to the list of received messages. If the length of the // list exceeds the maximum number of retained messages, erase the least // recently received message. - void AddReceivedMessage(const base::DictionaryValue& message); + void AddReceivedMessage(const base::Value& message); // Notify observers that |message| was received. - void NotifyMessageReceived(const base::DictionaryValue& message); + void NotifyMessageReceived(const base::Value& message); - // Called from NetworkSmsDeviceHandler when a message is received. - void MessageReceived(const base::DictionaryValue& message); + // Called from NetworkSmsDeviceHandler when a message is received. + void MessageReceived(const base::Value& message); // Callback to handle the manager properties with the list of devices. void ManagerPropertiesCallback(base::Optional<base::Value> properties); @@ -92,7 +92,7 @@ base::ObserverList<Observer, true>::Unchecked observers_; std::vector<std::unique_ptr<NetworkSmsDeviceHandler>> device_handlers_; - std::vector<std::unique_ptr<base::DictionaryValue>> received_messages_; + std::vector<base::Value> received_messages_; base::WeakPtrFactory<NetworkSmsHandler> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(NetworkSmsHandler);
diff --git a/chromeos/network/network_sms_handler_unittest.cc b/chromeos/network/network_sms_handler_unittest.cc index af545d4..a0f1c41 100644 --- a/chromeos/network/network_sms_handler_unittest.cc +++ b/chromeos/network/network_sms_handler_unittest.cc
@@ -26,12 +26,11 @@ TestObserver() = default; ~TestObserver() override = default; - void MessageReceived(const base::DictionaryValue& message) override { - std::string text; - if (message.GetStringWithoutPathExpansion( - NetworkSmsHandler::kTextKey, &text)) { - messages_.insert(text); - } + void MessageReceived(const base::Value& message) override { + const std::string* text = + message.FindStringKey(NetworkSmsHandler::kTextKey); + if (text) + messages_.insert(*text); } void ClearMessages() {
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index e819a3be..9cc6b96 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-88-4277.0-1602497703-benchmark-88.0.4294.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-88-4280.20-1603104419-benchmark-88.0.4296.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index bb27874..9098e79f 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-88-4277.0-1602498827-benchmark-88.0.4294.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-88-4280.20-1603100572-benchmark-88.0.4296.0-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb index 454ae8b..78537e43 100644 --- a/chromeos/strings/chromeos_strings_af.xtb +++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="af"> <translation id="1018656279737460067">Gekanselleer</translation> <translation id="1195447618553298278">Onbekende fout.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Misluk – Filter het misluk</translation> <translation id="1468664791493211953">Aanbiedings</translation> <translation id="1478594628797167447">Skandeerder</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Wagwoord verval oor <ph name="TIME" /></translation> <translation id="4238516577297848345">Geen druktake aan die gang nie</translation> <translation id="4297501883039923494">Gestop – onbekende fout</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberos-kaartjie verval binnekort</translation> <translation id="445059817448385655">Ou wagwoord</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> van <ph name="TOTAL_PAGE_NUMBER" />. Druk om die druktaak te kanselleer.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Voer jou ou en nuwe wagwoord in om dit te voltooi</translation> <translation id="6106186594183574873">Voer jou ou wagwoord in om dit te voltooi</translation> <translation id="6146993107019042706">Voer jou nuwe wagwoord in om dit te voltooi</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Onderneminginskrywing</translation> <translation id="649050271426829538">Gestop – papierknoop</translation> <translation id="6517239166834772319">Verken</translation> @@ -82,6 +85,7 @@ <translation id="6747215703636344499">Gestop – uitvoer is vol</translation> <translation id="7162487448488904999">Galery</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> +<translation id="7359657277149375382">Lêertipe</translation> <translation id="7561454561030345039">Jou administrateur bestuur hierdie handeling</translation> <translation id="7658239707568436148">Kanselleer</translation> <translation id="7690294790491645610">Bevestig nuwe wagwoord</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb index 7e94c993..757d247 100644 --- a/chromeos/strings/chromeos_strings_am.xtb +++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="am"> <translation id="1018656279737460067">ተሰርዟል</translation> <translation id="1195447618553298278">ያልታወቀ ስህተት።</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">አልተሳካም - ማጣሪያ አልተሳካም</translation> <translation id="1468664791493211953">ቅናሽ</translation> <translation id="1478594628797167447">ቃኚ</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">የይለፍ ቃል በ <ph name="TIME" /> ውስጥ አገልግሎት ጊዜው ያበቃል</translation> <translation id="4238516577297848345">በሂደት ላይ ያሉ ምንም የህትመት ስራዎች የሉም</translation> <translation id="4297501883039923494">ቆሟል - ያልታወቀ ስህተት</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">የKerberos ቲኬት ጊዜው በቅርቡ ያበቃል</translation> <translation id="445059817448385655">የቀድሞው የይለፍ ቃል</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />፣ <ph name="PRINTER_NAME" />፣ <ph name="CREATION_TIME" />፣ <ph name="PRINTED_PAGE_NUMBER" /> ከ<ph name="TOTAL_PAGE_NUMBER" /> ዉስጥ የሕትመት ሥራን ለመሰረዝ እባክዎ ያስገቡ።</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">ለማጠናቀቅ፣ የእርስዎን አሮጌ እና አዲስ የይለፍ ቃላት ያስገቡ</translation> <translation id="6106186594183574873">ለማጠናቀቅ፣ የእርስዎን ይለፍ ቃል ያስገቡ</translation> <translation id="6146993107019042706">ለማጠናቀቅ፣ የእርስዎን አዲስ የይለፍ ቃል ያስገቡ</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">የድርጅት ምዝገባ</translation> <translation id="649050271426829538">ቆሟል - የወረቀት መታጨቅ</translation> <translation id="6517239166834772319">ያስሱ</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 9842b87..398c62a 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="bs"> <translation id="1018656279737460067">Otkazano</translation> <translation id="1195447618553298278">Nepoznata greška.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Nije uspjelo – filter ne radi</translation> <translation id="1468664791493211953">Ponude</translation> <translation id="1478594628797167447">Skener</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Lozinka će isteći za <ph name="TIME" /></translation> <translation id="4238516577297848345">Nema aktivnih zadataka za štampanje</translation> <translation id="4297501883039923494">Zaustavljeno – nepoznata greška</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberos tiket uskoro ističe</translation> <translation id="445059817448385655">Stara lozinka</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> od <ph name="TOTAL_PAGE_NUMBER" />. Pritisnite enter da otkažete zadatak štampanja.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Unesite staru i novu lozinku da završite</translation> <translation id="6106186594183574873">Unesite staru lozinku da završite</translation> <translation id="6146993107019042706">Unesite novu lozinku da završite</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Prijava preduzeća</translation> <translation id="649050271426829538">Zaustavljeno – papir je zaglavljen</translation> <translation id="6517239166834772319">Istražite</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index 886c3260..eba43b72 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ca"> <translation id="1018656279737460067">S'ha cancel·lat</translation> <translation id="1195447618553298278">Error desconegut.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Error: error en el filtre</translation> <translation id="1468664791493211953">Ofertes</translation> <translation id="1478594628797167447">Escàners</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">La contrasenya caduca d'aquí a <ph name="TIME" /></translation> <translation id="4238516577297848345">No hi ha tasques d'impressió en curs</translation> <translation id="4297501883039923494">S'ha aturat: error desconegut</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">El tiquet de Kerberos caducarà aviat</translation> <translation id="445059817448385655">Contrasenya antiga</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de <ph name="TOTAL_PAGE_NUMBER" />. Prem Retorn per cancel·lar la tasca d'impressió.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Per acabar, introdueix la contrasenya antiga i la nova</translation> <translation id="6106186594183574873">Per acabar, introdueix la contrasenya antiga</translation> <translation id="6146993107019042706">Per acabar, introdueix la contrasenya nova</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Inscripció empresarial</translation> <translation id="649050271426829538">S'ha aturat: embús de paper</translation> <translation id="6517239166834772319">Explora</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 1ea061d..ac801ed6 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -18,6 +18,7 @@ <translation id="1979103255016296513">Passwortänderung überfällig</translation> <translation id="2049639323467105390">Dieses Gerät wird durch <ph name="DOMAIN" /> verwaltet.</translation> <translation id="2161394479394250669">Druckauftrag abbrechen</translation> +<translation id="2326139988748364651"><ph name="RESOLUTION_VALUE" /> dpi</translation> <translation id="2338501278241028356">Aktivieren Sie Bluetooth, damit Geräte in der Nähe gefunden werden</translation> <translation id="2375079107209812402">Noch <ph name="ATTEMPTS_LEFT" /> Versuche</translation> <translation id="2517472476991765520">Suchen</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 499c51d..5ab685ba 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="es"> <translation id="1018656279737460067">Cancelado</translation> <translation id="1195447618553298278">Error desconocido.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">No se ha podido imprimir - Error de filtro</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1478594628797167447">Escáner</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">La contraseña caducará dentro de <ph name="TIME" /></translation> <translation id="4238516577297848345">No hay ningún trabajo de impresión en curso</translation> <translation id="4297501883039923494">Detenido: error desconocido</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">El ticket de Kerberos caducará pronto</translation> <translation id="445059817448385655">Contraseña antigua</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de <ph name="TOTAL_PAGE_NUMBER" />. Pulsa Intro para cancelar el trabajo de impresión.</translation> @@ -72,6 +74,7 @@ <translation id="6058625436358447366">Para finalizar, introduce tu contraseña anterior y la nueva</translation> <translation id="6106186594183574873">Para finalizar, introduce tu contraseña anterior</translation> <translation id="6146993107019042706">Para finalizar, introduce tu contraseña nueva</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Registro de empresa</translation> <translation id="649050271426829538">Detenido: atasco de papel</translation> <translation id="6517239166834772319">Explorar</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 79b8d22d..2ba3696 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="et"> <translation id="1018656279737460067">Tühistatud</translation> <translation id="1195447618553298278">Tundmatu viga.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Ebaõnnestus – filter ei toiminud</translation> <translation id="1468664791493211953">Pakkumised</translation> <translation id="1478594628797167447">Skanner</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Parooli aegumiseni on jäänud <ph name="TIME" /></translation> <translation id="4238516577297848345">Ühtegi prinditööd pole pooleli</translation> <translation id="4297501883039923494">Peatatud – tundmatu viga</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberose pilet aegub peagi</translation> <translation id="445059817448385655">Vana parool</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" />/<ph name="TOTAL_PAGE_NUMBER" />. Prinditöö tühistamiseks vajutage sisestusklahvi.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Toimingu lõpuleviimiseks sisestage oma vana ja uus parool</translation> <translation id="6106186594183574873">Toimingu lõpuleviimiseks sisestage oma vana parool</translation> <translation id="6146993107019042706">Toimingu lõpuleviimiseks sisestage oma uus parool</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Ettevõtte registreerimine</translation> <translation id="649050271426829538">Peatatud – paberiummistus</translation> <translation id="6517239166834772319">Avastamine</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 4027b18..96c879a 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="hr"> <translation id="1018656279737460067">Otkazano</translation> <translation id="1195447618553298278">Nepoznata pogreška.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Nije uspjelo – filtar ne radi</translation> <translation id="1468664791493211953">Ponude</translation> <translation id="1478594628797167447">Skener</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Zaporka istječe za <ph name="TIME" /></translation> <translation id="4238516577297848345">Nema zadataka ispisa u tijeku</translation> <translation id="4297501883039923494">Zaustavljeno – nepoznata pogreška</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberosov tiket uskoro istječe</translation> <translation id="445059817448385655">Stara zaporka</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> od <ph name="TOTAL_PAGE_NUMBER" />. Pritisnite tipku Enter da biste otkazali zadatak ispisa.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Za dovršetak unesite staru i novu zaporku</translation> <translation id="6106186594183574873">Za dovršetak unesite staru zaporku</translation> <translation id="6146993107019042706">Za dovršetak unesite novu zaporku</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Prijava poduzeća</translation> <translation id="649050271426829538">Zaustavljeno – zaglavljeni papir</translation> <translation id="6517239166834772319">Istražite</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index a6a8c34..09672b5 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="lo"> <translation id="1018656279737460067">ຍົກເລີກແລ້ວ</translation> <translation id="1195447618553298278">ຄວາມຜິດພາດທີ່ບໍ່ຮູ້ຈັກ.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">ບໍ່ສຳເລັດ, ຕົວກັ່ນຕອງຂັດຂ້ອງ</translation> <translation id="1468664791493211953">ຂໍ້ສະເໜີ</translation> <translation id="1478594628797167447">ເຄື່ອງສະແກນ</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">ລະຫັດຜ່ານໝົດອາຍຸໃນ <ph name="TIME" /></translation> <translation id="4238516577297848345">ບໍ່ມີວຽກການພິມທີ່ພວມດຳເນີນຢູ່</translation> <translation id="4297501883039923494">ຢຸດພິມ, ບໍ່ຮູ້ຈັກຂໍ້ຜິດພາດ</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">ປີ້ Kerberos ຈະໝົດອາຍຸໃນໄວໆນີ້</translation> <translation id="445059817448385655">ລະຫັດຜ່ານເກົ່າ</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> ຈາກທັງໝົດ <ph name="TOTAL_PAGE_NUMBER" />. ກົດ Enter ເພື່ອຍົກເລີກວຽກພິມ.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">ເພື່ອສຳເລັດກະລຸນາປ້ອນລະຫັດຜ່ານເກົ່າ ແລະ ໃໝ່ຂອງທ່ານ</translation> <translation id="6106186594183574873">ເພື່ອສຳເລັດ, ກະລຸນາປ້ອນລະຫັດຜ່ານເກົ່າຂອງທ່ານ</translation> <translation id="6146993107019042706">ເພື່ອດຳເນີນການໃຫ້ສຳເລັດ, ກະລຸນາປ້ອນລະຫັດຜ່ານໃໝ່ຂອງທ່ານ</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">ການລົງທະບຽນວິສາຫະກິດ</translation> <translation id="649050271426829538">ຢຸດພິມ - ເຈ້ຍຕິດ</translation> <translation id="6517239166834772319">ສຳຫຼວດ</translation> @@ -82,6 +85,7 @@ <translation id="6747215703636344499">ຢຸດພິມ, ຖາດເຈ້ຍອອກເຕັມແລ້ວ</translation> <translation id="7162487448488904999">ຄັງຮູບ</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> +<translation id="7359657277149375382">ປະເພດໄຟລ໌</translation> <translation id="7561454561030345039">ການດຳເນີນການນີ້ຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="7658239707568436148">ຍົກເລີກ</translation> <translation id="7690294790491645610">ຢືນຢັນລະຫັດຜ່ານໃໝ່</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb index ce95293..b2a518b 100644 --- a/chromeos/strings/chromeos_strings_mk.xtb +++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="mk"> <translation id="1018656279737460067">Откажано</translation> <translation id="1195447618553298278">Непозната грешка.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Неуспешно - филтерот не успеа</translation> <translation id="1468664791493211953">Понуди</translation> <translation id="1478594628797167447">Скенер</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Лозинката истекува за <ph name="TIME" /></translation> <translation id="4238516577297848345">Нема задачи за печатење во тек</translation> <translation id="4297501883039923494">Запрено - непозната грешка</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Билетот на Kerberos истекува наскоро</translation> <translation id="445059817448385655">Стара лозинка</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> од <ph name="TOTAL_PAGE_NUMBER" />. Притиснете Enter за да го откажете налогот за печатење.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">За да завршите, внесете ги старата и новата лозинка</translation> <translation id="6106186594183574873">За да завршите, внесете ја старата лозинка</translation> <translation id="6146993107019042706">За да завршите, внесете ја новата лозинка</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Запишување компанија</translation> <translation id="649050271426829538">Запрено - заглавена хартија</translation> <translation id="6517239166834772319">Explore</translation> @@ -82,6 +85,7 @@ <translation id="6747215703636344499">Запрено - излезната фиока е полна</translation> <translation id="7162487448488904999">Галерија</translation> <translation id="7274587244503383581"><ph name="PRINTED_PAGES_NUMBER" />/<ph name="TOTAL_PAGES_NUMBER" /></translation> +<translation id="7359657277149375382">Вид датотека</translation> <translation id="7561454561030345039">Администраторот управува со дејствово</translation> <translation id="7658239707568436148">Откажи</translation> <translation id="7690294790491645610">Потврдете ја новата лозинка</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index a9a85c2..90fb237 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="no"> <translation id="1018656279737460067">Avbrutt</translation> <translation id="1195447618553298278">Ukjent feil.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Mislykket – filtersvikt</translation> <translation id="1468664791493211953">Tilbud</translation> <translation id="1478594628797167447">Skanner</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Passordet utløper om <ph name="TIME" /></translation> <translation id="4238516577297848345">Ingen utskriftsjobber pågår</translation> <translation id="4297501883039923494">Stoppet – ukjent feil</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberos-saken utløper snart</translation> <translation id="445059817448385655">Gammelt passord</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> av <ph name="TOTAL_PAGE_NUMBER" />. Trykk på Enter for å avbryte utskriftsjobben.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">For å fullføre passordendringen, skriv inn det gamle og det nye passordet</translation> <translation id="6106186594183574873">For å fullføre passordendringen, skriv inn det gamle passordet</translation> <translation id="6146993107019042706">For å fullføre passordendringen, skriv inn det nye passordet</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Bedriftsregistrering</translation> <translation id="649050271426829538">Stoppet – papirstopp</translation> <translation id="6517239166834772319">Utforsk</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index bd7a018..789b331 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="pl"> <translation id="1018656279737460067">Anulowano</translation> <translation id="1195447618553298278">Nieznany błąd.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Niepowodzenie – błąd filtra</translation> <translation id="1468664791493211953">Oferty</translation> <translation id="1478594628797167447">Skanery</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Hasło wygasa za <ph name="TIME" /></translation> <translation id="4238516577297848345">Brak zadań drukowania w toku</translation> <translation id="4297501883039923494">Zatrzymano – nieznany błąd</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Bilet Kerberos wkrótce straci ważność</translation> <translation id="445059817448385655">Stare hasło</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> z <ph name="TOTAL_PAGE_NUMBER" />. Naciśnij Enter, by anulować zadanie drukowania.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Aby zakończyć, wpisz stare i nowe hasło</translation> <translation id="6106186594183574873">Aby zakończyć, wpisz stare hasło</translation> <translation id="6146993107019042706">Aby zakończyć, wpisz nowe hasło</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Rejestracja w firmie</translation> <translation id="649050271426829538">Zatrzymano – zacięcie papieru</translation> <translation id="6517239166834772319">Odkrywaj</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index d84e017..7ff1bb1 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="pt-BR"> <translation id="1018656279737460067">Cancelado</translation> <translation id="1195447618553298278">Erro desconhecido.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Falha - Falha no filtro</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1478594628797167447">Scanner</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">A senha expirará em <ph name="TIME" /></translation> <translation id="4238516577297848345">Nenhum trabalho de impressão em andamento</translation> <translation id="4297501883039923494">Parado (erro desconhecido)</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">O tíquete do Kerberos expirará em breve</translation> <translation id="445059817448385655">Senha antiga</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> de <ph name="TOTAL_PAGE_NUMBER" />. Pressione "Enter" para cancelar o trabalho de impressão.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Para concluir, insira a senha antiga e a nova</translation> <translation id="6106186594183574873">Para concluir, insira sua senha antiga</translation> <translation id="6146993107019042706">Para concluir, insira a nova senha</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Registro da empresa</translation> <translation id="649050271426829538">Parado (atolamento de papel)</translation> <translation id="6517239166834772319">Explorar</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 0e132875..f05e960 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sk"> <translation id="1018656279737460067">Zrušené</translation> <translation id="1195447618553298278">Neznáma chyba.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Nepodarilo sa – zlyhal filter</translation> <translation id="1468664791493211953">Ponuky</translation> <translation id="1478594628797167447">Skener</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Platnosť hesla vyprší o <ph name="TIME" /></translation> <translation id="4238516577297848345">Neprebiehajú žiadne tlačové úlohy</translation> <translation id="4297501883039923494">Zastavené – neznáma chyba</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Platnosť tiketu Kerberos čoskoro uplynie</translation> <translation id="445059817448385655">Staré heslo</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> z <ph name="TOTAL_PAGE_NUMBER" />. Tlačovú úlohu zrušíte stlačením klávesa Enter.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Ak chcete zmenu dokončiť, zadajte staré a nové heslo</translation> <translation id="6106186594183574873">Ak chcete zmenu dokončiť, zadajte staré heslo</translation> <translation id="6146993107019042706">Ak chcete zmenu dokončiť, zadajte nové heslo</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Registrácia podniku</translation> <translation id="649050271426829538">Zastavené – zaseknutý papier</translation> <translation id="6517239166834772319">Preskúmať</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 229e6c16..fb3dd5f 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sr-Latn"> <translation id="1018656279737460067">Otkazano</translation> <translation id="1195447618553298278">Nepoznata greška.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Nije uspelo – filter je otkazao</translation> <translation id="1468664791493211953">Ponude</translation> <translation id="1478594628797167447">Skener</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Lozinka ističe za <ph name="TIME" /></translation> <translation id="4238516577297848345">Nijedan zadatak štampanja nije u toku</translation> <translation id="4297501883039923494">Zaustavljeno – nepoznata greška</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberos tiket uskoro ističe</translation> <translation id="445059817448385655">Stara lozinka</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> od <ph name="TOTAL_PAGE_NUMBER" />. Pritisnite taster Enter da biste otkazali zadatak štampanja.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Da biste završili, unesite staru i novu lozinku</translation> <translation id="6106186594183574873">Da biste završili, unesite staru lozinku</translation> <translation id="6146993107019042706">Da biste završili, unesite novu lozinku</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Prijavljivanje za izdanje za preduzeća</translation> <translation id="649050271426829538">Zaustavljeno – papir je zaglavljen</translation> <translation id="6517239166834772319">Istražite</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 5975278d..6e1c0d0aa 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sr"> <translation id="1018656279737460067">Отказано</translation> <translation id="1195447618553298278">Непозната грешка.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Није успело – филтер је отказао</translation> <translation id="1468664791493211953">Понуде</translation> <translation id="1478594628797167447">Скенер</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Лозинка истиче за <ph name="TIME" /></translation> <translation id="4238516577297848345">Ниједан задатак штампања није у току</translation> <translation id="4297501883039923494">Заустављено – непозната грешка</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Kerberos тикет ускоро истиче</translation> <translation id="445059817448385655">Стара лозинка</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> од <ph name="TOTAL_PAGE_NUMBER" />. Притисните тастер Enter да бисте отказали задатак штампања.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Да бисте завршили, унесите стару и нову лозинку</translation> <translation id="6106186594183574873">Да бисте завршили, унесите стару лозинку</translation> <translation id="6146993107019042706">Да бисте завршили, унесите нову лозинку</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Пријављивање за издање за предузећа</translation> <translation id="649050271426829538">Заустављено – папир је заглављен</translation> <translation id="6517239166834772319">Истражите</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb index 14a97c3..a4a5e94d 100644 --- a/chromeos/strings/chromeos_strings_uk.xtb +++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="uk"> <translation id="1018656279737460067">Скасовано</translation> <translation id="1195447618553298278">Невідома помилка.</translation> +<translation id="1330426557709298164">JPG</translation> <translation id="1413240736185167732">Не надруковано – помилка фільтра</translation> <translation id="1468664791493211953">Пропозиції</translation> <translation id="1478594628797167447">Сканери</translation> @@ -46,6 +47,7 @@ <translation id="4227825898293920515">Термін дії пароля закінчиться через <ph name="TIME" /></translation> <translation id="4238516577297848345">Немає активних завдань друку</translation> <translation id="4297501883039923494">Зупинено – невідома помилка</translation> +<translation id="4382484599443659549">PDF</translation> <translation id="4429881212383817840">Термін дії квитка Kerberos незабаром минає</translation> <translation id="445059817448385655">Старий пароль</translation> <translation id="4627232916386272576"><ph name="DOCUMENT_TITLE" />, <ph name="PRINTER_NAME" />, <ph name="CREATION_TIME" />, <ph name="PRINTED_PAGE_NUMBER" /> з <ph name="TOTAL_PAGE_NUMBER" />. Натисніть Enter, щоб скасувати завдання друку.</translation> @@ -73,6 +75,7 @@ <translation id="6058625436358447366">Щоб завершити, введіть старий і новий паролі</translation> <translation id="6106186594183574873">Щоб завершити, введіть старий пароль</translation> <translation id="6146993107019042706">Щоб завершити, введіть новий пароль</translation> +<translation id="6147514244879357420">PNG</translation> <translation id="636850387210749493">Реєстрація підприємства</translation> <translation id="649050271426829538">Зупинено – зам'яло папір</translation> <translation id="6517239166834772319">Можливості</translation>
diff --git a/codelabs/OWNERS b/codelabs/OWNERS index f59ec20..e2fe7c6 100644 --- a/codelabs/OWNERS +++ b/codelabs/OWNERS
@@ -1 +1,4 @@ -* \ No newline at end of file +* + +# Primary +pwnall@chromium.org \ No newline at end of file
diff --git a/components/arc/arc_features.cc b/components/arc/arc_features.cc index 5cb36aa3..87398b9 100644 --- a/components/arc/arc_features.cc +++ b/components/arc/arc_features.cc
@@ -6,11 +6,6 @@ namespace arc { -// Controls whether ARC++ app runtime performance statistics collection is -// enabled. -const base::Feature kAppRuntimePerormanceStatistics{ - "AppRuntimePerormanceStatistics", base::FEATURE_ENABLED_BY_DEFAULT}; - // Controls ACTION_BOOT_COMPLETED broadcast for third party applications on ARC. // When disabled, third party apps will not receive this broadcast. const base::Feature kBootCompletedBroadcastFeature {
diff --git a/components/arc/arc_features.h b/components/arc/arc_features.h index 0c935e2..8aa7e18 100644 --- a/components/arc/arc_features.h +++ b/components/arc/arc_features.h
@@ -12,7 +12,6 @@ namespace arc { // Please keep alphabetized. -extern const base::Feature kAppRuntimePerormanceStatistics; extern const base::Feature kBootCompletedBroadcastFeature; extern const base::Feature kCleanArcDataOnRegularToChildTransitionFeature; extern const base::Feature kCustomTabsExperimentFeature;
diff --git a/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line_item.xml b/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line_item.xml index 481f1b4..3d4e7819 100644 --- a/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line_item.xml +++ b/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line_item.xml
@@ -8,7 +8,7 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?android:attr/spinnerItemStyle" - android:maxLines="1" + android:singleLine="true" android:textAppearance="@style/TextAppearance.TextLarge.Primary" android:layout_width="wrap_content" android:layout_height="wrap_content"
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index f293fa119..4c23fd91 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">Werf-URL</translation> <translation id="2025115093177348061">Aangevulde realiteit</translation> <translation id="2030769033451695672">Tik om na <ph name="URL_OF_THE_CURRENT_TAB" /> terug te keer</translation> +<translation id="2054665754582400095">Jou teenwoordigheid</translation> <translation id="2079545284768500474">Ontdoen</translation> <translation id="2091887806945687916">Klank</translation> <translation id="2107397443965016585">Vra voordat jy werwe toelaat om beskermde inhoud te speel (aanbeveel)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index 197c0cc..c4f4af9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">የጣቢያ ዩአርኤል</translation> <translation id="2025115093177348061">የላቀ እውነታ</translation> <translation id="2030769033451695672">ወደ <ph name="URL_OF_THE_CURRENT_TAB" /> ለመመለስ መታ ያድርጉ</translation> +<translation id="2054665754582400095">የእርስዎ መገኘት</translation> <translation id="2079545284768500474">ቀልብስ</translation> <translation id="2091887806945687916">ድምፅ</translation> <translation id="2107397443965016585">ጣቢያዎች የተጠበቀ ይዘትን እንዲያጫውቱ ከመፍቀድዎ በፊት ይጠይቁ (የሚመከር)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index 12fcbdc6..b0b032f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL web lokacije</translation> <translation id="2025115093177348061">Proširena realnost</translation> <translation id="2030769033451695672">Dodirnite da se vratite na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Vaša prisutnost</translation> <translation id="2079545284768500474">Vrati</translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2107397443965016585">Web lokacije moraju tražiti dozvolu za reprodukciju zaštićenog sadržaja (preporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb index 58d7bbd0..122603f3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL del lloc web</translation> <translation id="2025115093177348061">Realitat augmentada</translation> <translation id="2030769033451695672">Toca per tornar a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">La teva presència</translation> <translation id="2079545284768500474">Desfés</translation> <translation id="2091887806945687916">So</translation> <translation id="2107397443965016585">Pregunta abans de permetre que els llocs web reprodueixin contingut protegit (opció recomanada)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index 2729ebb7..38d2ac7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL del sitio</translation> <translation id="2025115093177348061">Realidad aumentada</translation> <translation id="2030769033451695672">Toca para volver a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Tu presencia</translation> <translation id="2079545284768500474">Deshacer</translation> <translation id="2091887806945687916">Sonido</translation> <translation id="2107397443965016585">Preguntar antes de permitir que los sitios web reproduzcan contenido protegido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index e9393b9..f78c9d4c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">Saidi URL</translation> <translation id="2025115093177348061">Liitreaalsus</translation> <translation id="2030769033451695672">Puudutage vahelehele <ph name="URL_OF_THE_CURRENT_TAB" /> naasmiseks</translation> +<translation id="2054665754582400095">Teie kohalolek</translation> <translation id="2079545284768500474">Võta tagasi</translation> <translation id="2091887806945687916">Heli</translation> <translation id="2107397443965016585">Küsi enne saidile kaitstud sisu esitamiseks loa andmist (soovitatav)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index 3567ce0..62c955ff 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL web-lokacije</translation> <translation id="2025115093177348061">Proširena stvarnost</translation> <translation id="2030769033451695672">Dodirnite da biste se vratili na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Vaša prisutnost</translation> <translation id="2079545284768500474">Poništi</translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2107397443965016585">Web-lokacije moraju tražiti dopuštenje za reprodukciju zaštićenog sadržaja (preporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index 979c8c8..9a4d12b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL ເວັບໄຊທ໌</translation> <translation id="2025115093177348061">ອາກິວເມັນ ຣີອາລິຕີ</translation> <translation id="2030769033451695672">ແຕະເພື່ອກັບຄືນຫາ <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">ການນຳໃຊ້ຂອງທ່ານ</translation> <translation id="2079545284768500474">ບໍ່ເຮັດ</translation> <translation id="2091887806945687916">ສຽງ</translation> <translation id="2107397443965016585">ຖາມກ່ອນທີ່ຈະອະນຸຍາດໃຫ້ເວັບໄຊຫຼິ້ນເນື້ອຫາທີ່ມີການປົກປ້ອງ (ແນະນຳ)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index 0ad4803..7ff89f7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL на локацијата</translation> <translation id="2025115093177348061">Проширена реалност</translation> <translation id="2030769033451695672">Допрете за да се вратите на <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Вашето присуство</translation> <translation id="2079545284768500474">Врати</translation> <translation id="2091887806945687916">Звук</translation> <translation id="2107397443965016585">Прашај пред да дозволиш сајтовите да пуштаат заштитени содржини (се препорачува)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb index c712a9c..e74ba573e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">Nettadressen til nettstedet</translation> <translation id="2025115093177348061">Utvidet virkelighet</translation> <translation id="2030769033451695672">Trykk for å gå tilbake til <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Tilstedeværelsen din</translation> <translation id="2079545284768500474">Angre</translation> <translation id="2091887806945687916">Lyd</translation> <translation id="2107397443965016585">Spør før nettsteder får tillatelse til å spille beskyttet innhold (anbefalt)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index 26193f74..80c3caf5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL strony</translation> <translation id="2025115093177348061">Rzeczywistość rozszerzona</translation> <translation id="2030769033451695672">Kliknij, by wrócić na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Twoja obecność</translation> <translation id="2079545284768500474">Cofnij</translation> <translation id="2091887806945687916">Dźwięk</translation> <translation id="2107397443965016585">Pytaj, zanim pozwolisz stronom na odtwarzanie treści chronionej (zalecane)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index 8186d50..73e4496 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL do site</translation> <translation id="2025115093177348061">Realidade aumentada</translation> <translation id="2030769033451695672">Toque para voltar para <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Sua presença</translation> <translation id="2079545284768500474">Desfazer</translation> <translation id="2091887806945687916">Som</translation> <translation id="2107397443965016585">Perguntar antes de permitir que sites reproduzam conteúdo protegido (recomendado)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index 39b9d65..32a89050 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">Webová adresa</translation> <translation id="2025115093177348061">Rozšírená realita</translation> <translation id="2030769033451695672">Klepnutím sa vrátite na kartu <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Vaša prítomnosť</translation> <translation id="2079545284768500474">Späť</translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2107397443965016585">Pýtať sa, či chcete povoliť webu prehrávať chránený obsah (odporúčané)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb index 70e67cf..47e374b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL sajta</translation> <translation id="2025115093177348061">Proširena realnost</translation> <translation id="2030769033451695672">Dodirnite da biste se vratili na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Prisustvo</translation> <translation id="2079545284768500474">Opozovi</translation> <translation id="2091887806945687916">Zvuk</translation> <translation id="2107397443965016585">Upit se prikazuje pre nego što dozvolite sajtovima da puštaju zaštićeni sadržaj (preporučeno)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb index b769fbab8..7a7fdcc 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL сајта</translation> <translation id="2025115093177348061">Проширена реалност</translation> <translation id="2030769033451695672">Додирните да бисте се вратили на <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Присуство</translation> <translation id="2079545284768500474">Опозови</translation> <translation id="2091887806945687916">Звук</translation> <translation id="2107397443965016585">Упит се приказује пре него што дозволите сајтовима да пуштају заштићени садржај (препоручено)</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 8c66c6f..f01a1ce 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -38,6 +38,7 @@ <translation id="1994173015038366702">URL-адреса сайту</translation> <translation id="2025115093177348061">Доповнена реальність</translation> <translation id="2030769033451695672">Натисніть, щоб повернутися на сторінку <ph name="URL_OF_THE_CURRENT_TAB" /></translation> +<translation id="2054665754582400095">Дані про те, чи ви присутні</translation> <translation id="2079545284768500474">Відмінити</translation> <translation id="2091887806945687916">Сигнал</translation> <translation id="2107397443965016585">Запитувати, перш ніж дозволяти сайтам відтворювати захищений вміст (рекомендовано)</translation>
diff --git a/components/browser_ui/widget/android/java/res/values/attrs.xml b/components/browser_ui/widget/android/java/res/values/attrs.xml index 88126ce..456acb5 100644 --- a/components/browser_ui/widget/android/java/res/values/attrs.xml +++ b/components/browser_ui/widget/android/java/res/values/attrs.xml
@@ -4,7 +4,7 @@ found in the LICENSE file. --> <resources> - <declare-styleable name="BoundedView"> + <declare-styleable name="BoundedLinearLayout"> <attr name="maxWidthLandscape" format="dimension" /> <attr name="maxWidthPortrait" format="dimension" /> <attr name="maxHeight" format="dimension" />
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java index f0162f0..8fd4302 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java
@@ -38,11 +38,12 @@ public BoundedLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BoundedView); - int maxHeight = a.getDimensionPixelSize(R.styleable.BoundedView_maxHeight, NOT_SPECIFIED); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BoundedLinearLayout); + int maxHeight = + a.getDimensionPixelSize(R.styleable.BoundedLinearLayout_maxHeight, NOT_SPECIFIED); - a.getValue(R.styleable.BoundedView_maxWidthLandscape, mMaxWidthLandscape); - a.getValue(R.styleable.BoundedView_maxWidthPortrait, mMaxWidthPortrait); + a.getValue(R.styleable.BoundedLinearLayout_maxWidthLandscape, mMaxWidthLandscape); + a.getValue(R.styleable.BoundedLinearLayout_maxWidthPortrait, mMaxWidthPortrait); a.recycle();
diff --git a/components/consent_auditor/consent_auditor_impl_unittest.cc b/components/consent_auditor/consent_auditor_impl_unittest.cc index bdd22e3..566b920 100644 --- a/components/consent_auditor/consent_auditor_impl_unittest.cc +++ b/components/consent_auditor/consent_auditor_impl_unittest.cc
@@ -14,7 +14,7 @@ #include "base/time/default_clock.h" #include "components/consent_auditor/pref_names.h" #include "components/prefs/testing_pref_service.h" -#include "components/sync/model/fake_model_type_controller_delegate.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" #include "testing/gtest/include/gtest/gtest.h" using ArcPlayTermsOfServiceConsent =
diff --git a/components/exo/DEPS b/components/exo/DEPS index 33bc20f..948a6a70 100644 --- a/components/exo/DEPS +++ b/components/exo/DEPS
@@ -16,7 +16,6 @@ "+net/base", "+services/data_decoder/public/cpp", "+services/viz/privileged/mojom/compositing/vsync_parameter_observer.mojom.h", - "+skia/ext", "+third_party/blink/public/common", "+third_party/khronos", "+third_party/skia",
diff --git a/components/exo/wayland/clients/client_base.cc b/components/exo/wayland/clients/client_base.cc index ce06570..cd9b1959 100644 --- a/components/exo/wayland/clients/client_base.cc +++ b/components/exo/wayland/clients/client_base.cc
@@ -32,7 +32,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/unguessable_token.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkSurface.h" @@ -885,11 +884,10 @@ return nullptr; } - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); buffer->sk_surface = SkSurface::MakeRasterDirect( SkImageInfo::Make(size.width(), size.height(), kColorType, kOpaque_SkAlphaType), - mapped_data, stride, &props); + mapped_data, stride); DCHECK(buffer->sk_surface); }
diff --git a/components/favicon_base/favicon_util.cc b/components/favicon_base/favicon_util.cc index 2458d92d..44f90a73 100644 --- a/components/favicon_base/favicon_util.cc +++ b/components/favicon_base/favicon_util.cc
@@ -127,7 +127,7 @@ if (!best_bitmap.isOpaque()) bitmap.eraseARGB(0, 0, 0, 0); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawBitmapRect(best_bitmap, SkRect::MakeIWH(desired_size, desired_size), nullptr); return bitmap;
diff --git a/components/favicon_base/select_favicon_frames.cc b/components/favicon_base/select_favicon_frames.cc index 6694ddd..90b58e6 100644 --- a/components/favicon_base/select_favicon_frames.cc +++ b/components/favicon_base/select_favicon_frames.cc
@@ -43,7 +43,7 @@ bitmap.eraseARGB(0, 0, 0, 0); { - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawBitmapRect(contents, SkRect::MakeIWH(desired_size, desired_size), nullptr); }
diff --git a/components/metrics/demographics/BUILD.gn b/components/metrics/demographics/BUILD.gn index 68f8ea6..40b91cd 100644 --- a/components/metrics/demographics/BUILD.gn +++ b/components/metrics/demographics/BUILD.gn
@@ -8,6 +8,8 @@ sources = [ "demographic_metrics_provider.cc", "demographic_metrics_provider.h", + "user_demographics.cc", + "user_demographics.h", ] public_deps = [ "//third_party/metrics_proto" ] @@ -15,6 +17,8 @@ deps = [ "//base", "//components/metrics", + "//components/pref_registry", + "//components/prefs", "//components/sync/base", "//components/sync/driver", ] @@ -22,7 +26,10 @@ source_set("unit_tests") { testonly = true - sources = [ "demographic_metrics_provider_unittest.cc" ] + sources = [ + "demographic_metrics_provider_unittest.cc", + "user_demographics_unittest.cc", + ] deps = [ ":demographics", "//base", @@ -31,6 +38,7 @@ "//components/sync/base", "//components/sync/driver", "//components/sync/driver:test_support", + "//components/sync_preferences:test_support", "//testing/gmock", "//testing/gtest", "//third_party/metrics_proto", @@ -47,10 +55,10 @@ deps = [ "//base", "//components/metrics", + "//components/metrics/demographics", "//components/network_time", "//components/prefs", "//components/sync", - "//components/sync/base", "//components/sync/test/fake_server", "//third_party/metrics_proto", "//third_party/zlib/google:compression_utils",
diff --git a/components/metrics/demographics/DEPS b/components/metrics/demographics/DEPS index 4461b3ee..35537e1 100644 --- a/components/metrics/demographics/DEPS +++ b/components/metrics/demographics/DEPS
@@ -1,5 +1,7 @@ include_rules = [ "+components/network_time", + "+components/pref_registry", "+components/prefs", "+components/sync", + "+components/sync_preferences", ]
diff --git a/components/metrics/demographics/demographic_metrics_provider.cc b/components/metrics/demographics/demographic_metrics_provider.cc index 6112a3d..a1d1846 100644 --- a/components/metrics/demographics/demographic_metrics_provider.cc +++ b/components/metrics/demographics/demographic_metrics_provider.cc
@@ -27,7 +27,7 @@ DemographicMetricsProvider::~DemographicMetricsProvider() {} -base::Optional<syncer::UserDemographics> +base::Optional<UserDemographics> DemographicMetricsProvider::ProvideSyncedUserNoisedBirthYearAndGender() { // Skip if feature disabled. if (!base::FeatureList::IsEnabled(kDemographicMetricsReporting)) @@ -38,7 +38,7 @@ // cannot determine if there is more than 1 distinct user using the Profile. if (profile_client_->GetNumberOfProfilesOnDisk() != 1) { LogUserDemographicsStatusInHistogram( - syncer::UserDemographicsStatus::kMoreThanOneProfile); + UserDemographicsStatus::kMoreThanOneProfile); return base::nullopt; } @@ -46,13 +46,19 @@ // Skip if no sync service. if (!sync_service) { LogUserDemographicsStatusInHistogram( - syncer::UserDemographicsStatus::kNoSyncService); + UserDemographicsStatus::kNoSyncService); return base::nullopt; } - syncer::UserDemographicsResult demographics_result = - sync_service->GetUserNoisedBirthYearAndGender( - profile_client_->GetNetworkTime()); + if (!sync_service->CanUploadDemographicsToGoogle()) { + LogUserDemographicsStatusInHistogram( + UserDemographicsStatus::kSyncNotEnabled); + return base::nullopt; + } + + UserDemographicsResult demographics_result = + GetUserNoisedBirthYearAndGenderFromPrefs( + profile_client_->GetNetworkTime(), profile_client_->GetPrefService()); LogUserDemographicsStatusInHistogram(demographics_result.status()); if (demographics_result.IsSuccess()) @@ -72,7 +78,7 @@ } void DemographicMetricsProvider::LogUserDemographicsStatusInHistogram( - syncer::UserDemographicsStatus status) { + UserDemographicsStatus status) { switch (metrics_service_type_) { case MetricsLogUploader::MetricServiceType::UMA: base::UmaHistogramEnumeration("UMA.UserDemographics.Status", status);
diff --git a/components/metrics/demographics/demographic_metrics_provider.h b/components/metrics/demographics/demographic_metrics_provider.h index c23d3fe..b52b05b 100644 --- a/components/metrics/demographics/demographic_metrics_provider.h +++ b/components/metrics/demographics/demographic_metrics_provider.h
@@ -8,14 +8,16 @@ #include <memory> #include "base/time/time.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/metrics/metrics_log_uploader.h" #include "components/metrics/metrics_provider.h" #include "components/metrics/ukm_demographic_metrics_provider.h" -#include "components/sync/base/user_demographics.h" #include "components/sync/driver/sync_service.h" #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h" #include "third_party/metrics_proto/user_demographics.pb.h" +class PrefService; + namespace base { struct Feature; } @@ -42,9 +44,14 @@ // for the browser. virtual int GetNumberOfProfilesOnDisk() = 0; - // Gets a weak pointer to the ProfileSyncService of the Profile. + // Gets a pointer to the SyncService of the profile, which is required to + // determine whether priority preferences carrying demographics information + // is being synced. virtual syncer::SyncService* GetSyncService() = 0; + // Gets a pointer to the PrefService of the profile. + virtual PrefService* GetPrefService() = 0; + // Gets the network time that represents now. virtual base::Time GetNetworkTime() const = 0; }; @@ -63,7 +70,7 @@ void ProvideSyncedUserNoisedBirthYearAndGender(ReportType* report) { DCHECK(report); - base::Optional<syncer::UserDemographics> user_demographics = + base::Optional<UserDemographics> user_demographics = ProvideSyncedUserNoisedBirthYearAndGender(); if (user_demographics.has_value()) { report->mutable_user_demographics()->set_birth_year( @@ -84,15 +91,11 @@ // Feature switch to report user's noised birth year and gender. static const base::Feature kDemographicMetricsReporting; - protected: - // Provides the synced user's noised birth year and gender. Virtual for - // testing. - virtual base::Optional<syncer::UserDemographics> - ProvideSyncedUserNoisedBirthYearAndGender(); - private: - void LogUserDemographicsStatusInHistogram( - syncer::UserDemographicsStatus status); + // Provides the synced user's noised birth year and gender. + base::Optional<UserDemographics> ProvideSyncedUserNoisedBirthYearAndGender(); + + void LogUserDemographicsStatusInHistogram(UserDemographicsStatus status); std::unique_ptr<ProfileClient> profile_client_;
diff --git a/components/metrics/demographics/demographic_metrics_provider_unittest.cc b/components/metrics/demographics/demographic_metrics_provider_unittest.cc index fd6b1f3..64fe6df 100644 --- a/components/metrics/demographics/demographic_metrics_provider_unittest.cc +++ b/components/metrics/demographics/demographic_metrics_provider_unittest.cc
@@ -10,10 +10,11 @@ #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" #include "base/time/time.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/metrics/metrics_log_uploader.h" #include "components/sync/base/sync_prefs.h" -#include "components/sync/base/user_demographics.h" #include "components/sync/driver/test_sync_service.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h" @@ -22,20 +23,46 @@ namespace metrics { namespace { +constexpr int kTestBirthYear = 1983; +constexpr UserDemographicsProto::Gender kTestGender = + UserDemographicsProto::GENDER_FEMALE; + +enum TestSyncServiceState { + NULL_SYNC_SERVICE, + SYNC_SERVICE_NOT_ENABLED, + SYNC_SERVICE_ENABLED +}; + // Profile client for testing that gets fake Profile information and services. class TestProfileClient : public DemographicMetricsProvider::ProfileClient { public: ~TestProfileClient() override = default; - TestProfileClient(std::unique_ptr<syncer::SyncService> sync_service, - int number_of_profiles) - : sync_service_(std::move(sync_service)), - number_of_profiles_(number_of_profiles) {} + TestProfileClient(int number_of_profiles, + TestSyncServiceState sync_service_state) + : number_of_profiles_(number_of_profiles) { + RegisterDemographicsProfilePrefs(pref_service_.registry()); + + switch (sync_service_state) { + case NULL_SYNC_SERVICE: + break; + case SYNC_SERVICE_NOT_ENABLED: + sync_service_ = std::make_unique<syncer::TestSyncService>(); + sync_service_->SetCanUploadDemographicsToGoogle(false); + break; + case SYNC_SERVICE_ENABLED: + sync_service_ = std::make_unique<syncer::TestSyncService>(); + sync_service_->SetCanUploadDemographicsToGoogle(true); + break; + } + } int GetNumberOfProfilesOnDisk() override { return number_of_profiles_; } syncer::SyncService* GetSyncService() override { return sync_service_.get(); } + PrefService* GetPrefService() override { return &pref_service_; } + base::Time GetNetworkTime() const override { base::Time time; auto result = base::Time::FromString("17 Jun 2019 00:00:00 UDT", &time); @@ -43,68 +70,62 @@ return time; } + void SetDemographicsInPrefs(int birth_year, + metrics::UserDemographicsProto_Gender gender) { + base::DictionaryValue dict; + dict.SetIntPath(kSyncDemographicsBirthYearPath, birth_year); + dict.SetIntPath(kSyncDemographicsGenderPath, static_cast<int>(gender)); + pref_service_.Set(kSyncDemographicsPrefName, dict); + } + private: - std::unique_ptr<syncer::SyncService> sync_service_; + sync_preferences::TestingPrefServiceSyncable pref_service_; + std::unique_ptr<syncer::TestSyncService> sync_service_; const int number_of_profiles_; base::SimpleTestClock clock_; DISALLOW_COPY_AND_ASSIGN(TestProfileClient); }; -// Make arbitrary user demographics to provide. -syncer::UserDemographicsResult GetDemographics() { - syncer::UserDemographics user_demographics; - user_demographics.birth_year = 1983; - user_demographics.gender = UserDemographicsProto::GENDER_FEMALE; - return syncer::UserDemographicsResult::ForValue(std::move(user_demographics)); -} - -std::unique_ptr<TestProfileClient> MakeTestProfileClient( - const syncer::UserDemographicsResult& user_demographics_result, - int number_of_profiles, - bool has_sync_service) { - std::unique_ptr<syncer::TestSyncService> sync_service = nullptr; - if (has_sync_service) { - sync_service = std::make_unique<syncer::TestSyncService>(); - sync_service->SetUserDemographics(user_demographics_result); - } - return std::make_unique<TestProfileClient>(std::move(sync_service), - number_of_profiles); -} - TEST(DemographicMetricsProviderTest, ProvideSyncedUserNoisedBirthYearAndGender_FeatureEnabled) { base::HistogramTester histogram; + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/1, + SYNC_SERVICE_ENABLED); + client->SetDemographicsInPrefs(kTestBirthYear, kTestGender); + + // Set birth year noise offset to not have it randomized. + const int kBirthYearOffset = 3; + client->GetPrefService()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, + kBirthYearOffset); + // Run demographics provider. DemographicMetricsProvider provider( - MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/1, - /*has_sync_service=*/true), - MetricsLogUploader::MetricServiceType::UMA); + std::move(client), MetricsLogUploader::MetricServiceType::UMA); ChromeUserMetricsExtension uma_proto; provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto); // Verify provided demographics. - EXPECT_EQ(GetDemographics().value().birth_year, + EXPECT_EQ(kTestBirthYear + kBirthYearOffset, uma_proto.user_demographics().birth_year()); - EXPECT_EQ(GetDemographics().value().gender, - uma_proto.user_demographics().gender()); + EXPECT_EQ(kTestGender, uma_proto.user_demographics().gender()); // Verify histograms. histogram.ExpectUniqueSample("UMA.UserDemographics.Status", - syncer::UserDemographicsStatus::kSuccess, 1); + UserDemographicsStatus::kSuccess, 1); } TEST(DemographicMetricsProviderTest, ProvideSyncedUserNoisedBirthYearAndGender_NoSyncService) { base::HistogramTester histogram; + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/1, + NULL_SYNC_SERVICE); + // Run demographics provider. DemographicMetricsProvider provider( - MakeTestProfileClient(GetDemographics(), - /*number_of_profiles=*/1, - /*has_sync_service=*/false), - MetricsLogUploader::MetricServiceType::UMA); + std::move(client), MetricsLogUploader::MetricServiceType::UMA); ChromeUserMetricsExtension uma_proto; provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto); @@ -114,8 +135,29 @@ // Verify histograms. histogram.ExpectUniqueSample("UMA.UserDemographics.Status", - syncer::UserDemographicsStatus::kNoSyncService, - 1); + UserDemographicsStatus::kNoSyncService, 1); +} + +TEST(DemographicMetricsProviderTest, + ProvideSyncedUserNoisedBirthYearAndGender_SyncNotEnabled) { + base::HistogramTester histogram; + + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/1, + SYNC_SERVICE_NOT_ENABLED); + + // Run demographics provider. + DemographicMetricsProvider provider( + std::move(client), MetricsLogUploader::MetricServiceType::UMA); + ChromeUserMetricsExtension uma_proto; + provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto); + + // Expect the proto fields to be not set and left to default. + EXPECT_FALSE(uma_proto.user_demographics().has_birth_year()); + EXPECT_FALSE(uma_proto.user_demographics().has_gender()); + + // Verify histograms. + histogram.ExpectUniqueSample("UMA.UserDemographics.Status", + UserDemographicsStatus::kSyncNotEnabled, 1); } TEST(DemographicMetricsProviderTest, @@ -127,11 +169,13 @@ base::HistogramTester histogram; + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/1, + SYNC_SERVICE_ENABLED); + client->SetDemographicsInPrefs(kTestBirthYear, kTestGender); + // Run demographics provider. DemographicMetricsProvider provider( - MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/1, - /*has_sync_service=*/true), - MetricsLogUploader::MetricServiceType::UMA); + std::move(client), MetricsLogUploader::MetricServiceType::UMA); ChromeUserMetricsExtension uma_proto; provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto); @@ -147,11 +191,13 @@ ProvideSyncedUserNoisedBirthYearAndGender_NotExactlyOneProfile) { base::HistogramTester histogram; + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/2, + SYNC_SERVICE_ENABLED); + client->SetDemographicsInPrefs(kTestBirthYear, kTestGender); + // Run demographics provider with not exactly one Profile on disk. DemographicMetricsProvider provider( - MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/2, - /*has_sync_service=*/true), - MetricsLogUploader::MetricServiceType::UMA); + std::move(client), MetricsLogUploader::MetricServiceType::UMA); ChromeUserMetricsExtension uma_proto; provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto); @@ -160,24 +206,24 @@ EXPECT_FALSE(uma_proto.user_demographics().has_gender()); // Verify histograms. - histogram.ExpectUniqueSample( - "UMA.UserDemographics.Status", - syncer::UserDemographicsStatus::kMoreThanOneProfile, 1); + histogram.ExpectUniqueSample("UMA.UserDemographics.Status", + UserDemographicsStatus::kMoreThanOneProfile, 1); } TEST(DemographicMetricsProviderTest, ProvideSyncedUserNoisedBirthYearAndGender_NoUserDemographics) { base::HistogramTester histogram; + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/1, + SYNC_SERVICE_ENABLED); + // Set some ineligible values to prefs. + client->SetDemographicsInPrefs(/*birth_year=*/-17, + UserDemographicsProto::GENDER_UNKNOWN); + // Run demographics provider with a ProfileClient that does not provide // demographics because of some error. DemographicMetricsProvider provider( - MakeTestProfileClient( - syncer::UserDemographicsResult::ForStatus( - syncer::UserDemographicsStatus::kIneligibleDemographicsData), - /*number_of_profiles=*/1, - /*has_sync_service=*/true), - MetricsLogUploader::MetricServiceType::UMA); + std::move(client), MetricsLogUploader::MetricServiceType::UMA); ChromeUserMetricsExtension uma_proto; provider.ProvideSyncedUserNoisedBirthYearAndGender(&uma_proto); @@ -185,34 +231,39 @@ EXPECT_FALSE(uma_proto.user_demographics().has_birth_year()); EXPECT_FALSE(uma_proto.user_demographics().has_gender()); - // Verify that there are no histograms for user demographics. We expect - // histograms to be logged by the sync libraries. + // Verify that there are no histograms for user demographics. histogram.ExpectUniqueSample( "UMA.UserDemographics.Status", - syncer::UserDemographicsStatus::kIneligibleDemographicsData, 1); + UserDemographicsStatus::kIneligibleDemographicsData, 1); } TEST(DemographicMetricsProviderTest, - ProvideSyncedUserNoisedBirthYearAndGenderToReport) { + ProvideSyncedUserNoisedBirthYearAndGenderToUkmReport) { base::HistogramTester histogram; + auto client = std::make_unique<TestProfileClient>(/*number_of_profiles=*/1, + SYNC_SERVICE_ENABLED); + client->SetDemographicsInPrefs(kTestBirthYear, kTestGender); + + // Set birth year noise offset to not have it randomized. + const int kBirthYearOffset = 3; + client->GetPrefService()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, + kBirthYearOffset); + // Run demographics provider. DemographicMetricsProvider provider( - MakeTestProfileClient(GetDemographics(), /*number_of_profiles=*/1, - /*has_sync_service=*/true), - MetricsLogUploader::MetricServiceType::UKM); + std::move(client), MetricsLogUploader::MetricServiceType::UKM); ukm::Report report; provider.ProvideSyncedUserNoisedBirthYearAndGenderToReport(&report); // Verify provided demographics. - EXPECT_EQ(GetDemographics().value().birth_year, + EXPECT_EQ(kTestBirthYear + kBirthYearOffset, report.user_demographics().birth_year()); - EXPECT_EQ(GetDemographics().value().gender, - report.user_demographics().gender()); + EXPECT_EQ(kTestGender, report.user_demographics().gender()); // Verify histograms. histogram.ExpectUniqueSample("UKM.UserDemographics.Status", - syncer::UserDemographicsStatus::kSuccess, 1); + UserDemographicsStatus::kSuccess, 1); } } // namespace
diff --git a/components/metrics/demographics/demographic_metrics_test_utils.cc b/components/metrics/demographics/demographic_metrics_test_utils.cc index 0ba8ef7..594399e 100644 --- a/components/metrics/demographics/demographic_metrics_test_utils.cc +++ b/components/metrics/demographics/demographic_metrics_test_utils.cc
@@ -7,8 +7,8 @@ #include "base/strings/stringprintf.h" #include "base/time/default_clock.h" #include "base/time/default_tick_clock.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/metrics/log_decoder.h" -#include "components/sync/base/user_demographics.h" #include "components/sync/engine_impl/loopback_server/persistent_unique_client_entity.h" #include "components/sync/protocol/sync.pb.h" #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h" @@ -22,13 +22,13 @@ UserDemographicsProto::Gender gender) { sync_pb::EntitySpecifics specifics; specifics.mutable_priority_preference()->mutable_preference()->set_name( - syncer::kSyncDemographicsPrefName); + kSyncDemographicsPrefName); specifics.mutable_priority_preference()->mutable_preference()->set_value( base::StringPrintf("{\"birth_year\":%d,\"gender\":%d}", birth_year, static_cast<int>(gender))); fake_server->InjectEntity( syncer::PersistentUniqueClientEntity::CreateFromSpecificsForTesting( - /*non_unique_name=*/syncer::kSyncDemographicsPrefName, + /*non_unique_name=*/kSyncDemographicsPrefName, /*client_tag=*/specifics.preference().name(), specifics, /*creation_time=*/0, /*last_modified_time=*/0)); @@ -60,9 +60,8 @@ } int GetMaximumEligibleBirthYear(const base::Time& now) { - constexpr int kEligibleAge = - syncer::kUserDemographicsMinAgeInYears + - syncer::kUserDemographicsBirthYearNoiseOffsetRange; + constexpr int kEligibleAge = kUserDemographicsMinAgeInYears + + kUserDemographicsBirthYearNoiseOffsetRange; base::Time::Exploded exploded_time; now.UTCExplode(&exploded_time); @@ -78,7 +77,7 @@ int GetNoisedBirthYear(const PrefService& pref_service, int raw_birth_year) { int birth_year_offset = - pref_service.GetInteger(syncer::kSyncDemographicsBirthYearOffsetPrefName); + pref_service.GetInteger(kSyncDemographicsBirthYearOffsetPrefName); return birth_year_offset + raw_birth_year; }
diff --git a/components/sync/base/user_demographics.cc b/components/metrics/demographics/user_demographics.cc similarity index 90% rename from components/sync/base/user_demographics.cc rename to components/metrics/demographics/user_demographics.cc index 5d0bea1..6ad61d4 100644 --- a/components/sync/base/user_demographics.cc +++ b/components/metrics/demographics/user_demographics.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/sync/base/user_demographics.h" +#include "components/metrics/demographics/user_demographics.h" #include <utility> @@ -13,7 +13,7 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -namespace syncer { +namespace metrics { // Root dictionary pref to store the user's birth year and gender that are // provided by the sync server. This is a read-only syncable priority pref, sent @@ -40,7 +40,7 @@ // This pref value is subordinate to the kSyncDemographics dictionary pref and // is synced to the client. It stores the self-reported gender of the syncing // user, as provided by the sync server. The gender is encoded using the Gender -// enum defined in metrics::UserDemographicsProto +// enum defined in UserDemographicsProto // (see third_party/metrics_proto/user_demographics.proto). const char kSyncDemographicsGenderPath[] = "gender"; @@ -63,9 +63,8 @@ // Determines whether the synced user has provided a birth year to Google which // is eligible, once aggregated and anonymized, to measure usage of Chrome -// features by age groups. See doc of metrics::DemographicMetricsProvider in -// components/metrics/demographics/demographic_metrics_provider.h for more -// details. +// features by age groups. See doc of DemographicMetricsProvider in +// demographic_metrics_provider.h for more details. bool HasEligibleBirthYear(base::Time now, int user_birth_year, int offset) { // Compute user age. base::Time::Exploded exploded_now_time; @@ -100,8 +99,7 @@ } // Gets the synced user's birth year from synced prefs, see doc of -// metrics::DemographicMetricsProvider in -// components/metrics/demographics/demographic_metrics_provider.h for more +// DemographicMetricsProvider in demographic_metrics_provider.h for more // details. base::Optional<int> GetUserBirthYear( const base::DictionaryValue* demographics) { @@ -119,10 +117,9 @@ } // Gets the synced user's gender from synced prefs, see doc of -// metrics::DemographicMetricsProvider in -// components/metrics/demographics/demographic_metrics_provider.h for more +// DemographicMetricsProvider in demographic_metrics_provider.h for more // details. -base::Optional<metrics::UserDemographicsProto_Gender> GetUserGender( +base::Optional<UserDemographicsProto_Gender> GetUserGender( const base::DictionaryValue* demographics) { const base::Value* value = demographics->FindPath(kSyncDemographicsGenderPath); @@ -136,15 +133,15 @@ // Verify that the gender number is a valid UserDemographicsProto_Gender // encoding. - if (!metrics::UserDemographicsProto_Gender_IsValid(gender_int)) + if (!UserDemographicsProto_Gender_IsValid(gender_int)) return base::nullopt; - auto gender = metrics::UserDemographicsProto_Gender(gender_int); + auto gender = UserDemographicsProto_Gender(gender_int); // Verify that the gender is in a large enough population set to preserve // anonymity. - if (gender != metrics::UserDemographicsProto::GENDER_FEMALE && - gender != metrics::UserDemographicsProto::GENDER_MALE) { + if (gender != UserDemographicsProto::GENDER_FEMALE && + gender != UserDemographicsProto::GENDER_MALE) { return base::nullopt; } @@ -216,7 +213,7 @@ // Get the synced user’s noised birth year and gender from synced prefs. Only // one error status code should be used to represent the case where // demographics are ineligible, see doc of UserDemographicsStatus in - // components/sync/base/user_demographics.h for more details. + // user_demographics.h for more details. // Get the pref that contains the user's birth year and gender. const base::DictionaryValue* demographics = @@ -231,7 +228,7 @@ } // Get the user's gender. - base::Optional<metrics::UserDemographicsProto_Gender> gender = + base::Optional<UserDemographicsProto_Gender> gender = GetUserGender(demographics); if (!gender.has_value()) { return UserDemographicsResult::ForStatus( @@ -253,4 +250,4 @@ return UserDemographicsResult::ForValue(std::move(user_demographics)); } -} // namespace syncer +} // namespace metrics
diff --git a/components/sync/base/user_demographics.h b/components/metrics/demographics/user_demographics.h similarity index 89% rename from components/sync/base/user_demographics.h rename to components/metrics/demographics/user_demographics.h index b957cda..de2249ba 100644 --- a/components/sync/base/user_demographics.h +++ b/components/metrics/demographics/user_demographics.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_SYNC_BASE_USER_DEMOGRAPHICS_H_ -#define COMPONENTS_SYNC_BASE_USER_DEMOGRAPHICS_H_ +#ifndef COMPONENTS_METRICS_DEMOGRAPHICS_USER_DEMOGRAPHICS_H_ +#define COMPONENTS_METRICS_DEMOGRAPHICS_USER_DEMOGRAPHICS_H_ #include "base/time/time.h" #include "third_party/metrics_proto/user_demographics.pb.h" @@ -12,17 +12,16 @@ namespace user_prefs { class PrefRegistrySyncable; -} +} // namespace user_prefs -namespace syncer { +namespace metrics { // Default value for user gender when no value has been set. constexpr int kUserDemographicsGenderDefaultValue = -1; // Default value for user gender enum when no value has been set. -constexpr metrics::UserDemographicsProto_Gender - kUserDemographicGenderDefaultEnumValue = - metrics::UserDemographicsProto_Gender_Gender_MIN; +constexpr UserDemographicsProto_Gender kUserDemographicGenderDefaultEnumValue = + UserDemographicsProto_Gender_Gender_MIN; // Default value for user gender when no value has been set. constexpr int kUserDemographicsBirthYearDefaultValue = -1; @@ -54,8 +53,7 @@ // Container of user demographics. struct UserDemographics { int birth_year = 0; - metrics::UserDemographicsProto_Gender gender = - metrics::UserDemographicsProto::Gender_MIN; + UserDemographicsProto_Gender gender = UserDemographicsProto::Gender_MIN; }; // Represents the status of providing user demographics (noised birth year and @@ -78,10 +76,10 @@ // Could not get the time needed to compute the user's age. kCannotGetTime = 3, // There is more than one Profile for the Chrome browser. This entry is used - // by the metrics::DemographicMetricsProvider client. + // by the DemographicMetricsProvider client. kMoreThanOneProfile = 4, // There is no sync service available for the loaded Profile. This entry is - // used by the metrics::DemographicMetricsProvider client. + // used by the DemographicMetricsProvider client. kNoSyncService = 5, // Upper boundary of the enum that is needed for the histogram. kMaxValue = kNoSyncService @@ -136,6 +134,6 @@ base::Time now, PrefService* pref_service); -} // namespace syncer +} // namespace metrics -#endif // COMPONENTS_SYNC_BASE_USER_DEMOGRAPHICS_H_ +#endif // COMPONENTS_METRICS_DEMOGRAPHICS_USER_DEMOGRAPHICS_H_
diff --git a/components/sync/base/user_demographics_unittest.cc b/components/metrics/demographics/user_demographics_unittest.cc similarity index 79% rename from components/sync/base/user_demographics_unittest.cc rename to components/metrics/demographics/user_demographics_unittest.cc index 37a8a43..301819f 100644 --- a/components/sync/base/user_demographics_unittest.cc +++ b/components/metrics/demographics/user_demographics_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/sync/base/user_demographics.h" +#include "components/metrics/demographics/user_demographics.h" #include <utility> @@ -10,7 +10,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/metrics_proto/user_demographics.pb.h" -namespace syncer { +namespace metrics { namespace { @@ -28,8 +28,7 @@ TEST(UserDemographicsTest, UserDemographicsResult_ForValue) { int user_birth_year = 1982; - metrics::UserDemographicsProto_Gender user_gender = - metrics::UserDemographicsProto::GENDER_MALE; + UserDemographicsProto_Gender user_gender = UserDemographicsProto::GENDER_MALE; UserDemographics user_demographics; user_demographics.birth_year = user_birth_year; @@ -60,8 +59,7 @@ RegisterDemographicsProfilePrefs(pref_service_.registry()); } - void SetDemographics(int birth_year, - metrics::UserDemographicsProto::Gender gender) { + void SetDemographics(int birth_year, UserDemographicsProto::Gender gender) { base::DictionaryValue dict; dict.SetIntPath(kSyncDemographicsBirthYearPath, birth_year); dict.SetIntPath(kSyncDemographicsGenderPath, static_cast<int>(gender)); @@ -73,8 +71,8 @@ TEST_F(UserDemographicsPrefsTest, ReadDemographicsWithRandomOffset) { int user_demographics_birth_year = 1983; - metrics::UserDemographicsProto_Gender user_demographics_gender = - metrics::UserDemographicsProto::GENDER_MALE; + UserDemographicsProto_Gender user_demographics_gender = + UserDemographicsProto::GENDER_MALE; // Set user demographic prefs. SetDemographics(user_demographics_birth_year, user_demographics_gender); @@ -113,7 +111,7 @@ // Set demographic prefs directly from the pref service interface because // demographic prefs will only be set on the server-side. The SyncPrefs // interface cannot set demographic prefs. - SetDemographics(1983, metrics::UserDemographicsProto::GENDER_FEMALE); + SetDemographics(1983, UserDemographicsProto::GENDER_FEMALE); // Set birth year noise offset to not have it randomized. pref_service_.SetInteger(kSyncDemographicsBirthYearOffsetPrefName, 2); @@ -148,8 +146,7 @@ int birth_year_offset = kUserDemographicsBirthYearNoiseOffsetDefaultValue; // Gender of the user. - metrics::UserDemographicsProto_Gender gender = - kUserDemographicGenderDefaultEnumValue; + UserDemographicsProto_Gender gender = kUserDemographicGenderDefaultEnumValue; // Status of the retrieval of demographics. UserDemographicsStatus status = UserDemographicsStatus::kMaxValue; @@ -198,21 +195,21 @@ DemographicsTestParam{ /*birth_year=*/1997, /*birth_year_offset=*/2, - /*gender=*/metrics::UserDemographicsProto::GENDER_FEMALE, + /*gender=*/UserDemographicsProto::GENDER_FEMALE, /*status=*/UserDemographicsStatus::kIneligibleDemographicsData}, // Test where birth year should not be provided because |birth_year| - 2 // > 1998. DemographicsTestParam{ /*birth_year=*/2001, /*birth_year_offset=*/-2, - /*gender=*/metrics::UserDemographicsProto::GENDER_FEMALE, + /*gender=*/UserDemographicsProto::GENDER_FEMALE, /*status=*/UserDemographicsStatus::kIneligibleDemographicsData}, // Test where birth year should not be provided because age of user is // |kUserDemographicsMaxAge| + 1, which is over the max age. DemographicsTestParam{ /*birth_year=*/1933, /*birth_year_offset=*/0, - /*gender=*/metrics::UserDemographicsProto::GENDER_FEMALE, + /*gender=*/UserDemographicsProto::GENDER_FEMALE, /*status=*/UserDemographicsStatus::kIneligibleDemographicsData}, // Test where gender should not be provided because it has a low // population that can have their privacy compromised because of high @@ -220,49 +217,43 @@ DemographicsTestParam{ /*birth_year=*/1986, /*birth_year_offset=*/0, - /*gender=*/metrics::UserDemographicsProto::GENDER_CUSTOM_OR_OTHER, + /*gender=*/UserDemographicsProto::GENDER_CUSTOM_OR_OTHER, /*status=*/UserDemographicsStatus::kIneligibleDemographicsData}, // Test where birth year can be provided because |birth_year| + 2 == // 1998. - DemographicsTestParam{ - /*birth_year=*/1996, - /*birth_year_offset=*/2, - /*gender=*/metrics::UserDemographicsProto::GENDER_FEMALE, - /*status=*/UserDemographicsStatus::kSuccess}, + DemographicsTestParam{/*birth_year=*/1996, + /*birth_year_offset=*/2, + /*gender=*/UserDemographicsProto::GENDER_FEMALE, + /*status=*/UserDemographicsStatus::kSuccess}, // Test where birth year can be provided because |birth_year| - 2 == // 1998. - DemographicsTestParam{ - /*birth_year=*/2000, - /*birth_year_offset=*/-2, - /*gender=*/metrics::UserDemographicsProto::GENDER_MALE, - /*status=*/UserDemographicsStatus::kSuccess}, + DemographicsTestParam{/*birth_year=*/2000, + /*birth_year_offset=*/-2, + /*gender=*/UserDemographicsProto::GENDER_MALE, + /*status=*/UserDemographicsStatus::kSuccess}, // Test where birth year can be provided because |birth_year| + 2 < // 1998. - DemographicsTestParam{ - /*birth_year=*/1995, - /*birth_year_offset=*/2, - /*gender=*/metrics::UserDemographicsProto::GENDER_FEMALE, - /*status=*/UserDemographicsStatus::kSuccess}, + DemographicsTestParam{/*birth_year=*/1995, + /*birth_year_offset=*/2, + /*gender=*/UserDemographicsProto::GENDER_FEMALE, + /*status=*/UserDemographicsStatus::kSuccess}, // Test where birth year can be provided because |birth_year| - 2 < // 1998. - DemographicsTestParam{ - /*birth_year=*/1999, - /*birth_year_offset=*/-2, - /*gender=*/metrics::UserDemographicsProto::GENDER_MALE, - /*status=*/UserDemographicsStatus::kSuccess}, + DemographicsTestParam{/*birth_year=*/1999, + /*birth_year_offset=*/-2, + /*gender=*/UserDemographicsProto::GENDER_MALE, + /*status=*/UserDemographicsStatus::kSuccess}, // Test where gender can be provided because it is part of a large // population with a low entropy. - DemographicsTestParam{ - /*birth_year=*/1986, - /*birth_year_offset=*/0, - /*gender=*/metrics::UserDemographicsProto::GENDER_FEMALE, - /*status=*/UserDemographicsStatus::kSuccess}, + DemographicsTestParam{/*birth_year=*/1986, + /*birth_year_offset=*/0, + /*gender=*/UserDemographicsProto::GENDER_FEMALE, + /*status=*/UserDemographicsStatus::kSuccess}, // Test where gender can be provided because it is part of a large // population with a low entropy. - DemographicsTestParam{ - /*birth_year=*/1986, - /*birth_year_offset=*/0, - /*gender=*/metrics::UserDemographicsProto::GENDER_MALE, - /*status=*/UserDemographicsStatus::kSuccess})); + DemographicsTestParam{/*birth_year=*/1986, + /*birth_year_offset=*/0, + /*gender=*/UserDemographicsProto::GENDER_MALE, + /*status=*/UserDemographicsStatus::kSuccess})); -} // namespace syncer +} // namespace metrics
diff --git a/components/paint_preview/common/serialized_recording_unittest.cc b/components/paint_preview/common/serialized_recording_unittest.cc index 0cce745..d930225 100644 --- a/components/paint_preview/common/serialized_recording_unittest.cc +++ b/components/paint_preview/common/serialized_recording_unittest.cc
@@ -75,7 +75,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32Premul(cull_rect.width(), cull_rect.height())); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); SkMatrix matrix; matrix.setScaleTranslate(1, 1, -cull_rect.x(), -cull_rect.y()); canvas.drawPicture(pic, &matrix, nullptr);
diff --git a/components/paint_preview/renderer/paint_preview_recorder_browsertest.cc b/components/paint_preview/renderer/paint_preview_recorder_browsertest.cc index b5bed8d3..cdad89e 100644 --- a/components/paint_preview/renderer/paint_preview_recorder_browsertest.cc +++ b/components/paint_preview/renderer/paint_preview_recorder_browsertest.cc
@@ -138,7 +138,7 @@ SkBitmap bitmap; ASSERT_TRUE(bitmap.tryAllocN32Pixels(pic->cullRect().width(), pic->cullRect().height())); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawPicture(pic); // This should be inside the top right corner of the first top level div. // Success means there was no horizontal clipping as this region is red, @@ -191,7 +191,7 @@ SkBitmap bitmap; ASSERT_TRUE(bitmap.tryAllocN32Pixels(pic->cullRect().width(), pic->cullRect().height())); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawPicture(pic); // This should be inside the top right corner of the top div. Success means // there was no horizontal or vertical clipping as this region is red,
diff --git a/components/payments/content/android/java/res/layout/payment_request_header.xml b/components/payments/content/android/java/res/layout/payment_request_header.xml index 581ab28..901b761 100644 --- a/components/payments/content/android/java/res/layout/payment_request_header.xml +++ b/components/payments/content/android/java/res/layout/payment_request_header.xml
@@ -49,7 +49,6 @@ android:paddingStart="6dp" android:gravity="center_vertical" android:ellipsize="start" - android:maxLines="1" android:singleLine="true" android:textAppearance="@style/TextAppearance.TextMedium.Secondary" /> </LinearLayout>
diff --git a/components/policy/core/common/policy_merger.cc b/components/policy/core/common/policy_merger.cc index de04769..7df3d3e2 100644 --- a/components/policy/core/common/policy_merger.cc +++ b/components/policy/core/common/policy_merger.cc
@@ -15,8 +15,7 @@ namespace { -constexpr std::array<const char*, 7> kDictionaryPoliciesToMerge{ - key::kContentPackManualBehaviorURLs, +constexpr std::array<const char*, 6> kDictionaryPoliciesToMerge{ key::kExtensionSettings, key::kDeviceLoginScreenPowerManagement, key::kKeyPermissions,
diff --git a/components/policy/core/common/policy_service_impl_unittest.cc b/components/policy/core/common/policy_service_impl_unittest.cc index ebeb3e4..704913f 100644 --- a/components/policy/core/common/policy_service_impl_unittest.cc +++ b/components/policy/core/common/policy_service_impl_unittest.cc
@@ -927,7 +927,7 @@ std::unique_ptr<base::Value> policy = std::make_unique<base::Value>(base::Value::Type::LIST); - policy->Append(base::Value(policy::key::kContentPackManualBehaviorURLs)); + policy->Append(base::Value(key::kExtensionSettings)); auto policy_bundle1 = std::make_unique<PolicyBundle>(); PolicyMap& policy_map1 = policy_bundle1->Get(chrome_namespace); @@ -937,14 +937,14 @@ PolicyMap::Entry entry_dict_1(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM, std::move(dict1), nullptr); - policy_map1.Set(key::kContentPackManualBehaviorURLs, entry_dict_1.DeepCopy()); + policy_map1.Set(key::kExtensionSettings, entry_dict_1.DeepCopy()); auto policy_bundle2 = std::make_unique<PolicyBundle>(); PolicyMap& policy_map2 = policy_bundle2->Get(chrome_namespace); PolicyMap::Entry entry_dict_2(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_PRIORITY_CLOUD, std::move(dict2), nullptr); - policy_map2.Set(key::kContentPackManualBehaviorURLs, entry_dict_2.DeepCopy()); + policy_map2.Set(key::kExtensionSettings, entry_dict_2.DeepCopy()); PolicyMap expected_chrome; expected_chrome.Set(key::kPolicyDictionaryMultipleSourceMergeList, @@ -958,7 +958,7 @@ merged.AddConflictingPolicy(entry_dict_1.DeepCopy()); merged.AddConflictingPolicy(entry_dict_2.DeepCopy()); merged.AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); - expected_chrome.Set(key::kContentPackManualBehaviorURLs, std::move(merged)); + expected_chrome.Set(key::kExtensionSettings, std::move(merged)); provider0_.UpdatePolicy(std::move(policy_bundle1)); provider1_.UpdatePolicy(std::move(policy_bundle2));
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 30d3914..3423a90 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -712,9 +712,6 @@ 'caption': '''Locally managed users settings''', 'desc': '''Configure settings for managed users.''', 'policies': [ - 'ContentPackDefaultFilteringBehavior', - 'ContentPackManualBehaviorHosts', - 'ContentPackManualBehaviorURLs', 'SupervisedUsersEnabled', 'SupervisedUserCreationEnabled', 'SupervisedUserContentProviderEnabled', @@ -3539,6 +3536,8 @@ 'features': { 'dynamic_refresh': False, 'per_profile': False, + # TODO(crbug.com/1149118): Query cloud policies before using + # UserDataDir so this policy won't need to be platform_only anymore. 'platform_only': True, }, 'example_value': '${users}/${user_name}/Chrome', @@ -8744,13 +8743,12 @@ 'owners': ['file://components/policy/resources/OWNERS'], 'type': 'main', 'schema': { 'type': 'boolean' }, - 'supported_on': ['chrome_os:20-'], + 'future_on': ['chrome_os'], 'supported_chrome_os_management': ['google_cloud'], 'device_only': True, 'features': { 'dynamic_refresh': True, }, - 'future': True, 'example_value': False, 'id': 143, 'caption': '''Report device location''', @@ -13132,100 +13130,6 @@ 'id': 221, }, { - 'name': 'ContentPackDefaultFilteringBehavior', - 'owners': ['file://components/policy/resources/OWNERS'], - 'future': True, - 'deprecated': True, - 'type': 'int-enum', - 'schema': { - 'type': 'integer', - 'enum': [ 0, 1, 2 ], - }, - 'items': [ - { - 'name': 'Allow', - 'value': 0, - 'caption': '''Allow access to sites outside of content packs''', - }, - { - 'name': 'Warn', - 'value': 1, - 'caption': '''Warn when visiting sites outside of content packs''', - }, - { - 'name': 'Block', - 'value': 2, - 'caption': '''Block access to sites outside of content packs''', - }, - ], - 'supported_on': ['chrome.*:28-', 'chrome_os:28-'], - 'features': { - 'dynamic_refresh': True, - 'per_profile': True - }, - 'example_value': 2, - 'id': 204, - 'caption': '''Default behavior for sites not in any content pack''', - 'tags': [], - 'desc': '''This policy is for internal use by <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> itself.''', - }, - { - 'name': 'ContentPackManualBehaviorHosts', - 'owners': ['file://components/policy/resources/OWNERS'], - 'future': True, - 'deprecated': True, - 'type': 'dict', - 'schema': { - 'type': 'object', - 'additionalProperties': { - 'type': 'boolean' - } - }, - 'supported_on': ['chrome.*:28-', 'chrome_os:28-'], - 'features': { - 'dynamic_refresh': True, - 'per_profile': True - }, - 'example_value': { - 'www.example.com': True, - 'moose.org': False - }, - 'id': 205, - 'caption': '''Managed user manual exception hosts''', - 'tags': [], - 'desc': '''A dictionary mapping hostnames to a boolean flag specifying whether access to the host should be allowed (true) or blocked (false). - - This policy is for internal use by <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> itself.''', - }, - { - 'name': 'ContentPackManualBehaviorURLs', - 'owners': ['file://components/policy/resources/OWNERS'], - 'future': True, - 'deprecated': True, - 'type': 'dict', - 'schema': { - 'type': 'object', - 'additionalProperties': { - 'type': 'boolean' - } - }, - 'supported_on': ['chrome.*:28-', 'chrome_os:28-'], - 'features': { - 'dynamic_refresh': True, - 'per_profile': True - }, - 'example_value': { - 'https://www.example.com': True, - 'https://moose.org': False - }, - 'id': 206, - 'caption': '''Managed user manual exception URLs''', - 'tags': [], - 'desc': '''A dictionary mapping URLs to a boolean flag specifying whether access to the host should be allowed (true) or blocked (false). - - This policy is for internal use by <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> itself.''', - }, - { 'name': 'SupervisedUsersEnabled', 'owners': ['file://components/policy/resources/OWNERS'], 'type': 'main', @@ -15054,8 +14958,7 @@ 'type': 'string', 'schema' : { 'type': 'string' }, 'tags': ['filtering', 'admin-sharing'], - 'supported_on': ['webview_android:54-'], - 'future': True, + 'future_on': ['webview_android'], 'caption': '''Set an external source of URL restrictions''', 'desc' : '''When this policy is set to a non-empty string the WebView will read URL restrictions from the content provider with the given authority name.''', 'features': { @@ -16696,8 +16599,8 @@ 'owners': ['file://components/policy/resources/OWNERS'], 'type': 'main', 'schema': { 'type': 'boolean' }, - 'supported_on': ['chrome_os:62-'], - 'future': True, + 'future_on': ['chrome_os'], + 'deprecated': True, 'features': { 'dynamic_refresh': True, 'per_profile': True, @@ -16716,9 +16619,9 @@ 'owners': ['file://components/policy/resources/OWNERS'], 'type': 'string', 'schema': { 'type': 'string' }, - 'supported_on': ['chrome_os:62-'], + 'future_on': ['chrome_os'], + 'deprecated': True, 'device_only': True, - 'future': True, 'features': { 'dynamic_refresh': True, 'per_profile': False, @@ -18913,8 +18816,7 @@ 'per_profile': True, 'cloud_only': True, }, - 'supported_on': ['chrome.*:70-'], - 'future': True, + 'future_on': ['chrome.*'], 'caption': '''Report OS and <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> Version Information''', 'example_value': False, 'desc': '''This policy controls whether to report version information, such as OS version, OS platform, OS architecture, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> version and <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> channel. @@ -18939,8 +18841,7 @@ 'per_profile': True, 'cloud_only': True, }, - 'supported_on': ['chrome.*:70-'], - 'future': True, + 'future_on': ['chrome.*'], 'caption': '''Report <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> Policy Information''', 'example_value': False, 'desc': '''This policy controls whether to report policy data and time of policy fetch. @@ -18965,8 +18866,7 @@ 'per_profile': True, 'cloud_only': True, }, - 'supported_on': ['chrome.*:70-'], - 'future': True, + 'future_on': ['chrome.*'], 'caption': '''Report Machine Identification information''', 'example_value': False, 'desc': '''This policy controls whether to report information that can be used to identify machines, such as machine name and network addresses. @@ -18990,8 +18890,7 @@ 'per_profile': True, 'cloud_only': True, }, - 'supported_on': ['chrome.*:70-'], - 'future': True, + 'future_on': ['chrome.*'], 'caption': '''Report User Identification information''', 'example_value': False, 'desc': '''This policy controls whether to report information that can be used to identify users, such as OS login, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> Profile login, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> Profile name, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> Profile path and <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> executable path. @@ -19016,8 +18915,7 @@ 'per_profile': True, 'cloud_only': True, }, - 'supported_on': ['chrome.*:72-'], - 'future': True, + 'future_on': ['chrome.*'], 'caption': '''Report Extensions and Plugins information''', 'example_value': False, 'desc': '''This policy controls whether to report extensions and plugins information. @@ -24335,16 +24233,6 @@ ], }, { - 'id': 19, - 'name': 'ContentPack', - 'caption': '''Content pack''', - 'policies': [ - 'ContentPackDefaultFilteringBehavior', - 'ContentPackManualBehaviorHosts', - 'ContentPackManualBehaviorURLs', - ], - }, - { 'id': 20, 'name': 'SupervisedUsers', 'caption': '''Supervised users''', @@ -24599,8 +24487,8 @@ }, ], 'placeholders': [], - 'deleted_policy_ids': [114, 115, 412, 476, 544, 546, 562, 569, 578, 583, 589], - 'deleted_atomic_policy_group_ids': [], + 'deleted_policy_ids': [114, 115, 204, 205, 206, 412, 476, 544, 546, 562, 569, 578, 583, 589], + 'deleted_atomic_policy_group_ids': [19], 'highest_id_currently_used': 800, 'highest_atomic_group_id_currently_used': 40 }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 10b14f8..90efb046 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -41,6 +41,11 @@ Diese Richtlinie betrifft nur Nutzer, deren Domain der Geräteanmeldedomain entspricht. Bei allen anderen Nutzern werden die vom IdP gesetzten Cookies nur während der ersten Anmeldung auf dem Gerät an das Nutzerprofil gesendet.</translation> <translation id="1029052664284722254">Bei Nutzerabmeldung Geräteneustart erzwingen</translation> +<translation id="1032533786864478457">Wenn die Richtlinie aktiviert ist, können Nutzer die SMS auf ihren Geräten mit Chromebooks synchronisieren. Diese Funktion muss durch die Nutzer eingerichtet und explizit freigeschaltet werden. Anschließend können sie auf ihren Chromebooks SMS senden und empfangen. + + Ist die Richtlinie deaktiviert, kann die Synchronisierung von SMS nicht eingerichtet werden. + + Ist sie nicht konfiguriert, gilt die Standardeinstellung, in der diese Funktion zwar für verwaltete Nutzer nicht zulässig ist, für andere Nutzer jedoch schon.</translation> <translation id="1040446814317236570">Stripping von PAC-URLs für https:// aktivieren</translation> <translation id="1046484220783400299">Veraltete Webplattformfunktionen für einen begrenzten Zeitraum aktivieren</translation> <translation id="1047128214168693844">Verfolgung des physischen Standorts der Nutzer für keine Website zulassen</translation> @@ -645,6 +650,9 @@ <translation id="2057317273526988987">Zugriff auf eine Liste mit URLs erlauben</translation> <translation id="2061810934846663491">Erforderliche Domainnamen für Remotezugriff-Hosts konfigurieren</translation> <translation id="2067011586099792101">Zugriff auf Websites außerhalb von Inhaltspaketen blockieren</translation> +<translation id="2069350366303315077">Wenn die Richtlinie aktiviert ist, erzwingt <ph name="PRODUCT_NAME" /> Gastsitzungen und verhindert die Anmeldung über Nutzerprofile. Gastsitzungen basieren auf <ph name="PRODUCT_NAME" />-Profilen, bei denen die Programmfenster im Inkognitomodus ausgeführt werden. + + Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist bzw. der Gastmodus des Browsers durch <ph name="BROWSER_GUEST_MODE_ENABLED_POLICY_NAME" /> deaktiviert ist, können sowohl neue als auch vorhandene Profile verwendet werden.</translation> <translation id="2073552873076775140">Anmeldung in <ph name="PRODUCT_NAME" /> erlauben</translation> <translation id="2075732129949889165">Crostini-Ansible-Playbook</translation> <translation id="2077129598763517140">Hardwarebeschleunigung verwenden, falls verfügbar</translation> @@ -980,6 +988,11 @@ <translation id="2482676533225429905">Natives Messaging</translation> <translation id="2483146640187052324">Netzwerkaktionen über alle Netzwerkverbindungen vervollständigen</translation> <translation id="2498238926436517902">Ablage immer automatisch ausblenden</translation> +<translation id="250022556568924228">Wenn die Richtlinie aktiviert ist, lädt <ph name="PRODUCT_OS_NAME" /> Nutzungsbedingungen herunter und zeigt sie jedes Mal an, wenn eine Sitzung mit einem lokalen Gerätekonto gestartet wird. Die Nutzer können sich erst in der Sitzung anmelden, nachdem sie die Nutzungsbedingungen akzeptiert haben. + + Wenn die Richtlinie nicht konfiguriert ist, werden keine Nutzungsbedingungen angezeigt. + + Für die Richtlinie muss eine URL angegeben werden, von der <ph name="PRODUCT_OS_NAME" /> die Nutzungsbedingungen herunterladen kann. Die Nutzungsbedingungen sind im MIME-Typformat „Nur Text“ bereitzustellen. Es ist kein Markup möglich.</translation> <translation id="2502467045153796624">Verhalten zum Versionsdowngrade</translation> <translation id="250670737672448119">Mit dieser Richtlinie wird die Bedienungshilfe "Textcursor hervorheben" aktiviert. @@ -1164,6 +1177,13 @@ Diese Unternehmensrichtlinie kann nur übergangsweise verwendet werden und wird in Chrome 88 entfernt.</translation> <translation id="2759224876420453487">Nutzerverhalten in Mehrfachprofil-Sitzung steuern</translation> +<translation id="2759426227259007018">Mit der Konfiguration der Richtlinie werden die Apps festgelegt, die Nutzer als Notizen-App auf dem Sperrbildschirm von <ph name="PRODUCT_OS_NAME" /> aktivieren können. + + Wenn die bevorzugte App für den Sperrbildschirm konfiguriert ist, erscheint ein UI-Element zum Starten der bevorzugten Notizen-App auf dem Bildschirm. Nach dem Starten der App wird über dem Sperrbildschirm ein Fenster eingeblendet, in das Notizen eingegeben werden können. Sie können einstellen, dass die App nach dem Entsperren Notizen in die Hauptsitzung importiert. Nur <ph name="PRODUCT_NAME" />-Notizen-Apps werden auf dem Sperrbildschirm unterstützt. + + Wenn die Richtlinie aktiviert und die Erweiterungs-ID einer App in der entsprechenden Liste aufgeführt ist, können Nutzer diese App auf dem Sperrbildschirm starten. Die Vorgabe einer leeren Liste führt demnach dazu, dass auf dem Sperrbildschirm keine Notizen erstellt werden können. Die Konfiguration der Richtlinie mit einer App-ID bedeutet jedoch nicht unbedingt, dass Nutzer die jeweilige App als Notizen-App auf dem Sperrbildschirm aktivieren können. Bei <ph name="PRODUCT_NAME" /> 61 ist beispielsweise auch durch die Plattform festgelegt, welche Apps verfügbar sind. + + Wenn die Richtlinie nicht konfiguriert ist, werden dadurch die Apps, die Nutzer auf dem Sperrbildschirm aktivieren können, nicht durch die Richtlinie eingeschränkt.</translation> <translation id="2761483219396643566">Inaktivitätsspanne bis zur Warnung im Akkubetrieb</translation> <translation id="2765601181281280493">Wenn diese Richtlinie konfiguriert ist, können Sie eine Liste mit URL-Mustern erstellen, die angeben, welche Websites Nutzer nicht um Zugriff auf einen seriellen Port bitten dürfen. @@ -1502,6 +1522,9 @@ <translation id="3251500716404598358">Konfigurieren Sie Richtlinien, um zwischen Browsern zu wechseln. Konfigurierte Websites werden automatisch in einem anderen Browser als <ph name="PRODUCT_NAME" /> geöffnet.</translation> +<translation id="3255624750680556186">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, kann ein Gerät Powerwash auslösen. + + Ist sie deaktiviert, kann ein Gerät Powerwash nicht auslösen. Als Ausnahme ist Powerwash dennoch möglich, wenn <ph name="TPM_FIRMWARE_UPDATE_SETTINGS_NAME" /> auf einen Wert gesetzt wird, der ein Update der TPM-Firmware zulässt, dieses aber noch nicht durchgeführt wurde.</translation> <translation id="3255762580838224124">Wenn die Richtlinie konfiguriert ist, wird jeder Bildschirm anhand der festgelegten Bildschirmausrichtung gedreht, wenn das Gerät neugestartet oder der Bildschirm nach einer Änderung des Richtlinienwerts zum ersten Mal angeschlossen wird. Nachdem ein Nutzer sich angemeldet hat, kann er die Bildschirmausrichtung auf der Einstellungsseite ändern, sie wird aber nach dem nächsten Neustart zurückgesetzt. Diese Richtlinie gilt sowohl für primäre als auch sekundäre Bildschirme. Ist die Richtlinie nicht konfiguriert, wird der Standardwert von 0 Grad verwendet und Nutzer können die Bildschirmausrichtung ändern. Die Bildschirmausrichtung wird dann nach dem Neustart nicht zurückgesetzt.</translation> @@ -2622,6 +2645,9 @@ Wenn diese Richtlinie deaktiviert ist, treten beim Aufrufen von Bildschirmfreigabe-APIs Fehler auf.</translation> +<translation id="5025239932007658691">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, sendet <ph name="PRODUCT_NAME" /> gelegentlich Abfragen an einen Google-Server, um einen korrekten Zeitstempel abzurufen. + + Wird die Richtlinie deaktiviert, sendet <ph name="PRODUCT_NAME" /> solche Abfragen nicht mehr.</translation> <translation id="5032164758660626397">Verhindern, dass Nutzer große Dateien übertragen</translation> <translation id="5047604665028708335">Zugriff auf Websites außerhalb von Inhaltspaketen erlauben</translation> <translation id="5056708224511062314">Lupe deaktiviert</translation> @@ -3398,6 +3424,9 @@ <translation id="6034341625190551415">Legt die Typen für öffentliche Sitzungen und Kiosk-Konten fest.</translation> <translation id="6034603289689965535">Erlaubt einer Seite, während des Unloads Pop-ups einzublenden</translation> <translation id="6036523166753287175">Firewallausnahme über Host für Remotezugriff aktivieren</translation> +<translation id="603768430528561926">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, können Nutzer von Geräten in Unternehmen Angebote einlösen, indem sie <ph name="PRODUCT_OS_NAME" /> registrieren. + + Ist die Richtlinie deaktiviert, können solche Nutzer diese Angebote nicht einlösen.</translation> <translation id="6038407313189625985">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, ist Renderer-Codeintegrität aktiviert. Sie sollte nur deaktiviert werden, wenn Kompatibilitätsprobleme mit Drittanbieter-Software auftreten, die innerhalb der Rendererprozesse von Chrome ausgeführt werden muss. Eine Deaktivierung hat negative Auswirkungen auf die Sicherheit und Stabilität von Chrome, da dann unbekannter und potenziell schädlicher Code in den Rendererprozessen von Chrome geladen werden kann. Weitere Informationen finden Sie unter: https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox.md#Process-mitigation-policies.</translation> @@ -3618,6 +3647,7 @@ Falls diese Richtlinie nicht konfiguriert oder die Liste leer ist, besteht in <ph name="PRODUCT_NAME" /> Zugriff auf alle Schemas.</translation> <translation id="6338982178236723271">Systeminformationen melden</translation> <translation id="6342187235303612558">Nutzer am Hoch- oder Herunterladen von Dateien hindern, bei denen der Schutz vor Datenverlust oder der Malware-Scan nicht unterstützt wird.</translation> +<translation id="6353890097388312479">Wenn die Richtlinie auf „Alle“ (0) gesetzt oder nicht konfiguriert ist, können Nutzer Vertrauenseinstellungen für alle CA-Zertifikate bearbeiten, von Nutzern importierte Zertifikate entfernen und Zertifikate mit dem Zertifikat-Manager importieren. Wenn die Richtlinie auf „Nur Nutzer“ (1) gesetzt ist, können Nutzer zwar von Nutzern importierte Zertifikate verwalten, aber die Vertrauenseinstellungen integrierter Zertifikate nicht ändern. Ist sie auf „Keine“ (2) gesetzt, können Nutzer CA-Zertifikate ansehen, aber nicht verwalten.</translation> <translation id="6366574325767783825">Wenn die Richtlinie auf "True" gesetzt oder nicht konfiguriert ist, werden von <ph name="PRODUCT_NAME" /> Webinhalte akzeptiert, die als Signed HTTP Exchanges implementiert sind. Wenn die Richtlinie auf "False" gesetzt ist, werden die Signed HTTP Exchanges nicht geladen.</translation> @@ -3709,6 +3739,15 @@ Die empfohlene Vorgehensweise ist, die Bildschirmsperre bei Ruhemodus zu aktivieren und <ph name="PRODUCT_OS_NAME" /> anzuweisen, nach der Inaktivitätsverzögerung in den Ruhemodus zu wechseln. Diese Richtlinie sollte nur verwendet werden, wenn die Bildschirmsperre erheblich früher als der Ruhemodus eintreten oder der Ruhemodus bei Inaktivität gar nicht aktiviert werden soll. Der Wert für die Richtlinie muss in Millisekunden angegeben werden. Werte müssen kleiner als der Wert für die Inaktivitätsverzögerung sein.</translation> +<translation id="6506239283767807745">Diese Richtlinie wurde eingestellt. Bitte verwenden Sie stattdessen die Richtlinie <ph name="NOTE_TAKING_APPS_LOCK_SCREEN_ALLOWLIST" />. + + Mit der Konfiguration der Richtlinie werden die Apps festgelegt, die Nutzer als Notizen-App auf dem Sperrbildschirm von <ph name="PRODUCT_OS_NAME" /> aktivieren können. + + Wenn die bevorzugte App für den Sperrbildschirm konfiguriert ist, erscheint ein UI-Element zum Starten der bevorzugten Notizen-App auf dem Bildschirm. Nach dem Starten der App wird über dem Sperrbildschirm ein Fenster eingeblendet, in das Notizen eingegeben werden können. Sie können einstellen, dass die App nach dem Entsperren Notizen in die Hauptsitzung importiert. Nur <ph name="PRODUCT_NAME" />-Notizen-Apps werden auf dem Sperrbildschirm unterstützt. + + Wenn die Richtlinie aktiviert und die Erweiterungs-ID einer App in der entsprechenden Liste aufgeführt ist, können Nutzer diese App auf dem Sperrbildschirm starten. Die Vorgabe einer leeren Liste führt demnach dazu, dass auf dem Sperrbildschirm keine Notizen erstellt werden können. Die Konfiguration der Richtlinie mit einer App-ID bedeutet jedoch nicht unbedingt, dass Nutzer die jeweilige App als Notizen-App auf dem Sperrbildschirm aktivieren können. Bei <ph name="PRODUCT_NAME" /> 61 ist beispielsweise auch durch die Plattform festgelegt, welche Apps verfügbar sind. + + Wenn die Richtlinie nicht konfiguriert ist, werden dadurch die Apps, die Nutzer auf dem Sperrbildschirm aktivieren können, nicht eingeschränkt.</translation> <translation id="6506486086262398387">Wenn die Richtlinie aktiviert ist, verwendet die Funktion zur Netzwerkfreigabe für <ph name="PRODUCT_OS_NAME" /> bei Bedarf NTLM zur Authentifizierung gegenüber SMB-Freigaben. Ist die Richtlinie deaktiviert, wird die NTLM-Authentifizierung gegenüber SMB-Freigaben ausgeschaltet. Ist sie nicht konfiguriert, wird dieses Verhalten für verwaltete Nutzer standardmäßig deaktiviert und für andere Nutzer hingegen aktiviert.</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 1747857c..97396a1 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -1479,6 +1479,11 @@ <translation id="316778957754360075">Esta opción no está disponible desde la versión 29 de <ph name="PRODUCT_NAME" />. La forma recomendada de configurar colecciones de aplicaciones o extensiones alojadas por una organización es incluir el sitio que aloja los paquetes CRX en la política ExtensionInstallSources y colocar enlaces de descarga directa de los paquetes en una página web. También se puede crear un menú de aplicaciones para la página web con la política ExtensionInstallForcelist.</translation> <translation id="3168968618972302728">Políticas relacionadas con la autenticación Kerberos.</translation> <translation id="3171369832001535378">Plantilla de nombre de host de red de dispositivo</translation> +<translation id="3176903288465566098">Si se habilita esta opción, los usuarios que ya usen la función Mi teléfono podrán enviar o recibir las notificaciones de su teléfono en Chrome OS. + + Si se inhabilita esta opción, los usuarios no podrán usar esta función. Si se inhabilita la política PhoneHubAllowed, los usuarios tampoco podrán usar esta función. + + Si no se asigna ningún valor a esta política o no se establece, el valor predeterminado para los usuarios gestionados por una empresa y para los no gestionados es permitir esta función.</translation> <translation id="3177802893484440532">Requiere comprobaciones de OCSP/CRL online para los anclajes de veracidad locales</translation> <translation id="3184161739683646075">Controla el modo DNS-over-HTTPS</translation> <translation id="3185009703220253572">desde la versión <ph name="SINCE_VERSION" /></translation> @@ -2959,6 +2964,7 @@ Si se le asigna el valor "false", se inhabilitará la redirección de puertos a contenedores de Crostini.</translation> <translation id="538108065117008131">Permitir que <ph name="PRODUCT_FRAME_NAME" /> gestione los tipos de contenido que se indican a continuación.</translation> +<translation id="5383436189211119400">Si se establece la política DeviceArcDataSnapshotHours, se activa el mecanismo de vista general de datos de ARC. Además, se puede iniciar automáticamente la actualización de la vista general de datos de ARC durante los intervalos de tiempo definidos. Cuando comienza un intervalo, si se necesita una actualización de vista general de ARC y ningún usuario ha iniciado sesión, se inicia el proceso de actualización de la vista general de los datos de ARC sin notificar al usuario. Si la sesión del usuario está activa, se muestra la notificación en la UI, que se tiene que aceptar para poder reiniciar el dispositivo e iniciar el proceso de actualización de los datos de ARC. Nota: El uso del dispositivo se bloquea durante el proceso de actualización de la vista general de los datos de ARC.</translation> <translation id="538768040137709073">Habilita la función de portapapeles compartido, que permite a los usuarios enviar texto entre versiones de Chrome para ordenador y dispositivos Android cuando la sincronización está habilitada y el usuario ha iniciado sesión. Si se asigna el valor "True" a esta política, se habilita la capacidad de enviar texto entre dispositivos para los usuarios de Chrome. @@ -4237,6 +4243,7 @@ <translation id="7068108874199666656">Permite aplicar la configuración de red a todos los usuarios de un dispositivo <ph name="PRODUCT_OS_NAME" />. La configuración de red es una cadena escrita en formato JSON, tal como se define en la especificación Open Network Configuration.</translation> <translation id="7070525176564511548">Es obligatorio introducir la contraseña cada semana (cada 168 horas)</translation> <translation id="7072208053150563108">Frecuencia de cambio de contraseña de dispositivo</translation> +<translation id="7072567600438630966">Permite habilitar Mi teléfono.</translation> <translation id="7079519252486108041">Bloquear pop-ups en estos sitios</translation> <translation id="7080072532759721791">Permitir a los usuarios la subida o descarga de archivos protegidos con contraseña</translation> <translation id="7086677522575756117">Especifica el porcentaje de ajuste del retraso de atenuación de pantalla cuando se observa la actividad del usuario con la pantalla atenuada o poco después de que esta se haya desactivado. @@ -4415,6 +4422,7 @@ Si la política no se configura o no se le asigna ningún valor, el usuario puede establecer cualquier cuenta de Google como la cuenta principal de navegador en <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Configurar la longitud mínima del PIN para la pantalla de bloqueo</translation> <translation id="7234280155140786597">Nombres de hosts de mensajes nativos no permitidos (o * para todos)</translation> +<translation id="7246767840750730334">Permite habilitar las notificaciones de Mi teléfono.</translation> <translation id="7249828445670652637">Habilitar los certificados de CA de <ph name="PRODUCT_OS_NAME" /> a las aplicaciones ARC</translation> <translation id="7252681704926980614">Enviar los nombres de usuario y de archivo al servidor de impresoras nativas con cada trabajo de impresión. Los nombres no se envían de forma predeterminada. @@ -4521,6 +4529,11 @@ Esta política está obsoleta. Usa la política <ph name="PRINTERS_BULK_BLOCKLIST" /> en su lugar. </translation> +<translation id="7358744897221281073">Si se habilita esta opción, los usuarios que ya usen la función Mi teléfono podrán continuar tareas (como ver las páginas web de su teléfono) en Chrome OS. + + Si se inhabilita esta opción, los usuarios no podrán usar esta función. Si se inhabilita la política PhoneHubAllowed, los usuarios tampoco podrán usar esta función. + + Si no se asigna ningún valor a esta política o no se establece, el valor predeterminado para los usuarios gestionados por una empresa y para los no gestionados es permitir esta función.</translation> <translation id="7360181094056034924">Controla el comportamiento de <ph name="PRODUCT_NAME" /> con los datos subidos y descargados que deban analizarse. Retrasar la entrega implica que <ph name="PRODUCT_NAME" /> no permitirá que el usuario acceda a un archivo descargado, seleccione un archivo para subir, pegue datos desde el portapapeles ni arrastre y suelte datos hasta que se haya analizado el contenido y se conozca el diagnóstico del análisis. Esta restricción solo se aplica a los archivos o datos que deban analizarse, según se especifique en las políticas <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> y en las políticas que controlan la lista de dominios en los que se hayan habilitado las comprobaciones. Si no se define esta política o se le asigna el valor "Ninguno", <ph name="PRODUCT_NAME" /> no retrasará la subida de archivos, los datos pegados en el portapapeles ni los datos arrastrados y soltados. Tampoco retrasará el acceso a los archivos descargados. El análisis se llevará a cabo en segundo plano. @@ -4718,6 +4731,7 @@ Si no se le asigna ningún valor, el cursor grande está desactivado en la pantalla de inicio de sesión. Los usuarios pueden activar el cursor grande cuando quieran y su estado en la pantalla de inicio de sesión permanece entre usuarios. Nota: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> anula esta política si se especifica la anterior.</translation> +<translation id="7632147323011514740">Intervalos en los que se puede iniciar el proceso de actualización de la vista general de los datos de ARC en sesiones de invitado gestionadas</translation> <translation id="7632724434767231364">Nombre de biblioteca GSSAPI</translation> <translation id="7643883929273267746">Restringir cuentas que se muestran en <ph name="PRODUCT_NAME" /></translation> <translation id="7648907905084499629">Usar el comportamiento de cookies de <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> en todos los sitios web</translation> @@ -4998,6 +5012,7 @@ Para <ph name="PRODUCT_OS_NAME" />, esta política siempre es efectiva.</translation> <translation id="8050080920415773384">Impresión nativa</translation> <translation id="8053580360728293758">Anula el modo predeterminado de impresión en color. Si el modo no está disponible, se ignora la política.</translation> +<translation id="8056237304861875584">Permite habilitar la continuación de tareas de Mi teléfono.</translation> <translation id="8059164285174960932">URL en la que los clientes de acceso remoto deben obtener su token de autenticación</translation> <translation id="8077245272412229388">Añade cuentas de Kerberos rellenadas previamente. Si las credenciales de Kerberos coinciden con las credenciales de inicio de sesión, se puede configurar una cuenta que reutilice las credenciales de inicio de sesión estableciendo "<ph name="LOGIN_EMAIL_PLACEHOLDER" />" y "<ph name="PASSWORD_PLACEHOLDER" />" como nombre de usuario y contraseña, respectivamente. Así, el ticket de Kerberos podrá obtenerse automáticamente, a menos que esté configurada la autenticación de dos factores. Los usuarios no podrán modificar las cuentas que se añadan a través de esta política. @@ -5758,6 +5773,11 @@ <translation id="9084985621503260744">Especificar si la actividad de vídeo afecta a la administración de energía</translation> <translation id="9088433379343318874">Habilitar el proveedor de contenido de usuarios supervisados</translation> <translation id="9088444059179765143">Configura el método de detección automática de la zona horaria</translation> +<translation id="9095999573959728902">Si se habilita esta opción, los usuarios podrán usar la función Mi teléfono, que les permite interactuar con su teléfono desde un dispositivo Chrome OS. + + Si se inhabilita esta opción, los usuarios no podrán usar Mi teléfono. + + Si no se le asigna ningún valor a esta política o no se establece, la opción predeterminada no estará disponible para usuarios gestionados por empresas, aunque sí lo estará para aquellos no gestionados por empresas.</translation> <translation id="9096086085182305205">Lista de admisión de servidores de autenticación</translation> <translation id="9105265795073104888">Solo se habilita la disponibilidad de un subconjunto de opciones de proxy para las aplicaciones de Android. Estas pueden elegir voluntariamente el uso del proxy. No puedes forzarlas a que utilicen un proxy.</translation> <translation id="9106865192244721694">Permitir WebUSB en estos sitios web</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 90a6fc69..57c2cdd 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -1461,6 +1461,11 @@ <translation id="316778957754360075">Questa impostazione non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_NAME" />. Il metodo consigliato per la configurazione di raccolte di estensioni/app ospitate dall'organizzazione consiste nell'includere il sito che ospita i pacchetti CRX in ExtensionInstallSources e inserire link di download diretti per i pacchetti in una pagina web. È possibile creare una funzione Avvio applicazioni per la pagina web utilizzando la norma ExtensionInstallForcelist.</translation> <translation id="3168968618972302728">Criteri relativi all'autenticazione per Kerberos.</translation> <translation id="3171369832001535378">Modello del nome host della rete del dispositivo</translation> +<translation id="3176903288465566098">Se questa impostazione viene attivata, gli utenti che hanno già attivato Phone Hub potranno inviare e ricevere notifiche del loro telefono su Chrome OS. + + Se viene disattivata, gli utenti non potranno usare questa funzionalità. Gli utenti non potranno usare questa funzionalità anche se viene disattivato il criterio PhoneHubAllowed. + + Se questo criterio non viene configurato, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation> <translation id="3177802893484440532">Richiedi controlli OCSP/CRL online per i trust anchor</translation> <translation id="3184161739683646075">Controlla la modalità di DNS over HTTPS</translation> <translation id="3185009703220253572">a partire dalla versione <ph name="SINCE_VERSION" /></translation> @@ -2937,6 +2942,7 @@ Se il criterio viene impostato su False, il port forwarding nei container Crostini viene disattivato.</translation> <translation id="538108065117008131">Consenti a <ph name="PRODUCT_FRAME_NAME" /> di gestire i seguenti tipi di contenuto.</translation> +<translation id="5383436189211119400">Se il criterio "DeviceArcDataSnapshotHours" viene impostato, viene attivato il meccanismo di creazione di istantanee dei dati ARC. L'aggiornamento delle istantanee dei dati ARC può essere avviato automaticamente durante gli intervalli di tempo definiti. Quando inizia un intervallo, l'aggiornamento delle istantanee dei dati ARC è necessario e non ci sono utenti che hanno eseguito l'accesso, la procedura di aggiornamento delle istantanee dei dati ARC viene avviata senza informare l'utente. Se è attiva la sessione utente, nell'interfaccia utente viene mostrata la notifica, che deve essere accettata per poter riavviare un dispositivo e avviare la procedura di aggiornamento delle istantanee dei dati ARC. Nota: durante la procedura di aggiornamento delle istantanee dei dati ARC non è possibile usare il dispositivo.</translation> <translation id="538768040137709073">Consente di attivare la funzione Appunti condivisi che permette agli utenti di inviare testi tra computer desktop Chrome e un dispositivo Android quando la sincronizzazione è attivata e l'utente ha effettuato l'accesso. Se il criterio è impostato su true, la funzionalità di invio testi tra dispositivi è attivata per gli utenti Chrome. @@ -4214,6 +4220,7 @@ <translation id="7068108874199666656">Consente di forzare l'applicazione della configurazione di rete per tutti gli utenti di un dispositivo <ph name="PRODUCT_OS_NAME" />. La configurazione di rete è una stringa in formato JSON come definita nel formato Open Network Configuration.</translation> <translation id="7070525176564511548">Richiedi l'inserimento della password ogni settimana (168 ore)</translation> <translation id="7072208053150563108">Frequenza di modifica della password del computer</translation> +<translation id="7072567600438630966">Consenti l'attivazione di Phone Hub</translation> <translation id="7079519252486108041">Blocca popup su questi siti</translation> <translation id="7080072532759721791">Consenti agli utenti di caricare o scaricare file protetti da password</translation> <translation id="7086677522575756117">Consente di specificare la percentuale di regolazione del ritardo di oscuramento dello schermo quando viene osservata l'attività dell'utente mentre lo schermo è oscurato o subito dopo lo spegnimento dello schermo. @@ -4392,6 +4399,7 @@ Se questa norma non viene impostata o viene lasciata vuota, l'utente potrà impostare qualsiasi Account Google come account principale del browser in <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Imposta la lunghezza minima del PIN per la schermata di blocco</translation> <translation id="7234280155140786597">Nomi degli host di messaggi nativi vietati (o * per indicarli tutti)</translation> +<translation id="7246767840750730334">Consenti l'attivazione delle notifiche Phone Hub</translation> <translation id="7249828445670652637">Attiva i certificati CA <ph name="PRODUCT_OS_NAME" /> per le app ARC</translation> <translation id="7252681704926980614">Invia nome utente e nome file al server delle stampanti native per ogni processo di stampa. L'impostazione predefinita non prevede l'invio. @@ -4496,6 +4504,11 @@ Questo criterio è deprecato. Usa il criterio <ph name="PRINTERS_BULK_BLOCKLIST" />. </translation> +<translation id="7358744897221281073">Se questa impostazione viene attivata, gli utenti che hanno già attivato Phone Hub potranno continuare su Chrome OS attività quali la visualizzazione delle pagine web del loro telefono. + + Se viene disattivata, gli utenti non potranno usare questa funzionalità. Gli utenti non potranno usare questa funzionalità anche se viene disattivato il criterio PhoneHubAllowed. + + Se questo criterio non viene configurato, per impostazione predefinita la funzionalità è consentita sia per gli utenti gestiti a livello aziendale sia per quelli non gestiti.</translation> <translation id="7360181094056034924">Consente di controllare il modo in cui <ph name="PRODUCT_NAME" /> si comporta con i dati caricati e scaricati che sono considerati da analizzare. Un ritardo nella consegna significa che <ph name="PRODUCT_NAME" /> non permetterà all'utente di accedere a un file scaricato, selezionare un file per caricarlo, incollare dagli appunti o trascinare dati finché non verranno analizzati e il risultato dell'analisi non sarà reso noto. Tale limitazione si applica esclusivamente ai file o ai dati che dovrebbero essere analizzati secondo quanto stabilito da <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> e dai criteri che controllano l'elenco di domini per i quali è attiva l'analisi. Se questo criterio non viene impostato o se viene impostato su "Nessuno", <ph name="PRODUCT_NAME" /> non ritarderà il caricamento di alcun file, né le operazioni di copia e incolla dagli appunti, il trascinamento di dati o l'accesso a qualsiasi file scaricato. L'analisi verrà eseguita in background. @@ -4692,6 +4705,7 @@ Se il criterio non è impostato, il cursore grande risulta disattivato nella schermata di accesso. Gli utenti possono attivarlo in qualsiasi momento e il suo stato nella schermata di accesso persiste per tutti gli utenti. Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> sostituisce questo criterio.</translation> +<translation id="7632147323011514740">Intervalli in cui è possibile avviare la procedura di aggiornamento delle istantanee dei dati ARC per le sessioni Ospite gestite</translation> <translation id="7632724434767231364">Nome della libreria GSSAPI</translation> <translation id="7643883929273267746">Limita gli account visibili in <ph name="PRODUCT_NAME" /></translation> <translation id="7648907905084499629">Usa il comportamento <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> per i cookie su tutti i siti</translation> @@ -4968,6 +4982,7 @@ Questo criterio viene sempre applicato per <ph name="PRODUCT_OS_NAME" />.</translation> <translation id="8050080920415773384">Stampa nativa</translation> <translation id="8053580360728293758">Consente di eseguire l'override della modalità di stampa a colori predefinita. Se la modalità non è disponibile, questa norma viene ignorata.</translation> +<translation id="8056237304861875584">Consenti l'attivazione della continuazione di attività Phone Hub</translation> <translation id="8059164285174960932">URL su cui i client di accesso remoto dovrebbero ottenere il token di autenticazione</translation> <translation id="8077245272412229388">Aggiunge account Kerberos compilati automaticamente. Se le credenziali di Kerberos corrispondono alle credenziali di accesso, un account può essere configurato in modo da riutilizzare le credenziali di accesso specificando "<ph name="LOGIN_EMAIL_PLACEHOLDER" />" e "<ph name="PASSWORD_PLACEHOLDER" />" rispettivamente per l'account principale e la password, in modo che le richieste di Kerberos possano essere recuperate automaticamente, a meno che non sia configurata l'autenticazione a due fattori. Gli utenti non possono modificare gli account aggiunti tramite questo criterio. @@ -5711,6 +5726,11 @@ <translation id="9084985621503260744">Specifica se l'attività video incide sulla gestione dell'alimentazione</translation> <translation id="9088433379343318874">Abilita il provider di contenuti dell'utente supervisionato</translation> <translation id="9088444059179765143">Configura il metodo di rilevamento automatico del fuso orario</translation> +<translation id="9095999573959728902">Se questa impostazione viene attivata, gli utenti potranno attivare Phone Hub, che consente loro di interagire con il proprio telefono su un dispositivo Chrome OS. + + Se viene disattivata, gli utenti non potranno attivare Phone Hub. + + Se questo criterio non viene configurato, per impostazione predefinita la funzionalità non è consentita per gli utenti gestiti a livello aziendale ed è consentita per gli utenti non gestiti.</translation> <translation id="9096086085182305205">Whitelist server di autenticazione</translation> <translation id="9105265795073104888">Solo un sottoinsieme di opzioni di configurazione del proxy viene reso disponibile alle app Android, che decidono volontariamente se rispettarlo o meno. Non puoi forzarle a utilizzare un proxy.</translation> <translation id="9106865192244721694">Consenti WebUSB su questi siti</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 26d4baec..6ec6aab 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1462,6 +1462,11 @@ <translation id="316778957754360075">Esta configuração foi descontinuada a partir da versão 29 do <ph name="PRODUCT_NAME" />. O modo recomendado de configurar as coleções de extensões/aplicativos hospedados pela organização é incluir na hospedagem do site os pacotes CRX em ExtensionInstallSources e colocar links de download direto para os pacotes em uma página da Web. É possível criar um iniciador da página da Web usando a política ExtensionInstallForcelist.</translation> <translation id="3168968618972302728">Políticas relacionadas à autenticação do Kerberos.</translation> <translation id="3171369832001535378">Modelo de nome do host da rede do dispositivo</translation> +<translation id="3176903288465566098">Se esta configuração estiver ativada, os usuários que já ativaram o recurso "Seu smartphone" poderão enviar/receber as notificações do smartphone no Chrome OS. + + Se esta configuração estiver desativada, os usuários não terão permissão para usar o recurso. Se a política PhoneHubAllowed estiver desativada, os usuários também não terão permissão para usar o recurso. + + Se esta política não for definida, o padrão será permitido tanto para usuários gerenciados por empresas quanto para usuários não gerenciados.</translation> <translation id="3177802893484440532">Exigir verificações on-line de OCSP/CRL para âncoras de confiança locais</translation> <translation id="3184161739683646075">Controla o modo de DNS sobre HTTPS</translation> <translation id="3185009703220253572">desde a versão <ph name="SINCE_VERSION" /></translation> @@ -2922,6 +2927,7 @@ Se esta política for definida como falsa, o encaminhamento de portas em contêineres Crostini será desativado.</translation> <translation id="538108065117008131">Permitir que o <ph name="PRODUCT_FRAME_NAME" /> lide com os seguintes tipos de conteúdo.</translation> +<translation id="5383436189211119400">Se a política DeviceArcDataSnapshotHours for definida, o mecanismo de resumo de dados ARC será ativado e a atualização dele poderá ser iniciada automaticamente durante os intervalos de tempo definidos. Quando um intervalo for iniciado, a atualização for necessária e nenhum usuário estiver conectado, o processo de atualização do resumo de dados ARC será iniciado sem notificar o usuário. Se a sessão do usuário estiver ativa, a notificação da IU será exibida e precisará ser aceita para reinicializar um dispositivo e iniciar o processo de atualização do resumo de dados ARC. Observação: não é possível usar o dispositivo durante o processo de atualização do resumo de dados ARC.</translation> <translation id="538768040137709073">Ativar o recurso de área de transferência compartilhada, que permite que os usuários enviem texto entre computadores Chrome e um dispositivo Android quando a sincronização está ativada e o usuário está conectado. Se esta política for definida como verdadeira, a capacidade de enviar texto entre dispositivos ficará ativada para o usuário do Chrome. @@ -4188,6 +4194,7 @@ <translation id="7068108874199666656">Permite que a configuração de rede seja aplicada a todos os usuários de dispositivos <ph name="PRODUCT_OS_NAME" />. A configuração de rede é uma string formatada em JSON, conforme definido pelo formato Open Network Configuration.</translation> <translation id="7070525176564511548">A senha precisa ser digitada uma vez por semana (a cada 168 horas).</translation> <translation id="7072208053150563108">Taxa de alteração da senha da máquina</translation> +<translation id="7072567600438630966">Permitir a ativação do recurso "Seu smartphone".</translation> <translation id="7079519252486108041">Bloquear pop-ups nestes sites</translation> <translation id="7080072532759721791">Permitir que usuários façam upload ou download de arquivos protegidos por senha</translation> <translation id="7086677522575756117">Especifica o percentual pelo qual o intervalo de escurecimento da tela é calculado quando a atividade do usuário é observada enquanto a tela é escurecida ou pouco depois de a tela ter sido desligada. @@ -4365,6 +4372,7 @@ Se esta política for deixada sem definição ou em branco, o usuário poderá configurar qualquer Conta do Google como uma conta principal do navegador no <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Definir o tamanho mínimo do PIN da tela de bloqueio</translation> <translation id="7234280155140786597">Nomes dos hosts de mensagens nativas proibidos (ou "*" para todos)</translation> +<translation id="7246767840750730334">Permitir a ativação das notificações do "Seu smartphone".</translation> <translation id="7249828445670652637">Ativar certificados de CA (Autoridade de certificação) do <ph name="PRODUCT_OS_NAME" /> para apps ARC</translation> <translation id="7252681704926980614">Envia o nome de usuário e de arquivo para o servidor de impressoras nativas com cada trabalho de impressão. O padrão é não enviar. @@ -4469,6 +4477,11 @@ Esta política está obsoleta. Use <ph name="PRINTERS_BULK_BLOCKLIST" />. </translation> +<translation id="7358744897221281073">Se esta configuração estiver ativada, os usuários que já ativaram o recurso "Seu smartphone" poderão continuar tarefas no Chrome OS, como visualizar as páginas da Web do smartphone. + + Se esta configuração estiver desativada, os usuários não terão permissão para usar o recurso. Se a política PhoneHubAllowed estiver desativada, os usuários também não terão permissão para usar o recurso. + + Se esta política não for definida, o padrão será permitido tanto para usuários gerenciados por empresas quanto para usuários não gerenciados.</translation> <translation id="7360181094056034924">Controla como o <ph name="PRODUCT_NAME" /> se comporta com dados enviados e transferidos por download que exigem verificação. Atrasar o envio significa que o <ph name="PRODUCT_NAME" /> não permitirá que o usuário acesse o arquivo transferido por download, selecione um arquivo para upload, cole da área de transferência ou arraste e solte dados até que sejam verificados e que o resultado seja conhecido. Essa restrição aplica-se apenas a arquivos ou dados que precisam ser verificados, conforme determinado por <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> e pelas políticas que controlam a lista de domínios com verificações ativadas. Se esta política não for configurada ou for definida como "Nenhum", o <ph name="PRODUCT_NAME" /> não atrasará nenhum arquivo para upload, colado da área de transferência ou dados arrastados e soltados nem atrasará o acesso a arquivos transferidos por download. A verificação continuará em segundo plano. @@ -4666,6 +4679,7 @@ Se a política não for definida, o cursor grande será desativado na tela de login. Os usuários podem ativá-lo sempre que quiserem, e o estado na tela de login irá persistir para todos os usuários. Observação: se <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> for especificada, ela substituirá esta política.</translation> +<translation id="7632147323011514740">Intervalos em que o processo de atualização do resumo de dados ARC pode ser iniciado em sessões de visitante gerenciadas</translation> <translation id="7632724434767231364">Nome da biblioteca GSSAPI</translation> <translation id="7643883929273267746">Contas restritas que estão visíveis no <ph name="PRODUCT_NAME" /></translation> <translation id="7648907905084499629">Use o comportamento <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> para cookies em todos os sites</translation> @@ -4941,6 +4955,7 @@ Para o <ph name="PRODUCT_OS_NAME" />, ela sempre é eficaz.</translation> <translation id="8050080920415773384">Impressão nativa</translation> <translation id="8053580360728293758">Modifica o modo de cor de impressão padrão. Se o modo não estiver disponível, esta política será ignorada.</translation> +<translation id="8056237304861875584">Permitir que a continuação da tarefa do recurso "Seu smartphone" seja ativada.</translation> <translation id="8059164285174960932">URL no qual clientes de acesso remoto devem receber seu token de autenticação</translation> <translation id="8077245272412229388">Adiciona contas já preenchidas do Kerberos. Se as credenciais do Kerberos coincidirem com as credenciais de login, uma conta poderá ser configurada para reutilizar as credenciais de login especificando "<ph name="LOGIN_EMAIL_PLACEHOLDER" />" e "<ph name="PASSWORD_PLACEHOLDER" />" como conta principal e senha, respectivamente. Assim, o tíquete do Kerberos poderá ser recuperado automaticamente, a não ser que a "autenticação de dois fatores" esteja configurada. O usuário não poderá modificar contas adicionadas por meio desta política. @@ -5700,6 +5715,11 @@ <translation id="9084985621503260744">Especifica se a atividade de vídeo afeta o gerenciamento de energia</translation> <translation id="9088433379343318874">Ativar o provedor de conteúdo de usuário supervisionado</translation> <translation id="9088444059179765143">Configurar o método de detecção automática de fuso horário</translation> +<translation id="9095999573959728902">Se esta configuração estiver ativada, os usuários não terão permissão para ativar o recurso "Seu smartphone", que permite que eles interajam com o smartphone em um dispositivo Chrome OS. + + Se esta configuração estiver desativada, os usuários não terão permissão para usar o recurso "Seu smartphone". + + Se esta política for deixada sem definição, o comportamento padrão será não permitir para usuários gerenciados por empresas e permitir para usuários não gerenciados.</translation> <translation id="9096086085182305205">Lista branca do servidor de autenticação</translation> <translation id="9105265795073104888">Somente um subconjunto de opções de configuração de proxy é disponibilizado para apps Android. Esses apps podem optar voluntariamente por usar o proxy. Não é possível forçá-los a usar um proxy.</translation> <translation id="9106865192244721694">Permitir WebUSB nesses sites</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 736feef3..32433915 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -1467,6 +1467,11 @@ <translation id="316778957754360075">Это правило не поддерживается в <ph name="PRODUCT_NAME" /> версии 29 и будет исключено из более поздних версий. Чтобы создать коллекцию приложений и расширений организации, рекомендуем указать адрес сайта, где хранятся CRX-пакеты, в правиле ExtensionInstallSources и разместить прямые ссылки на скачивание приложений на специальной веб-странице. Панель запуска для этой страницы можно создать с помощью правила ExtensionInstallForcelist.</translation> <translation id="3168968618972302728">Определяет правила, связанные с аутентификацией при помощи Kerberos.</translation> <translation id="3171369832001535378">Шаблон сетевого имени хоста устройства</translation> +<translation id="3176903288465566098">Если параметр задан, пользователи, у которых включена функция "Управление телефоном", смогут управлять уведомлениями с телефона в Chrome OS. + + Если параметр не задан, эта функция будет недоступна. Если правило PhoneHubAllowed отключено, эта функция также будет недоступна. + + Если правило не настроено, по умолчанию параметр будет включен как для корпоративных, так и для обычных аккаунтов.</translation> <translation id="3177802893484440532">Настроить обязательное выполнение онлайн-проверок OCSP/CRL для локальных якорей доверия</translation> <translation id="3184161739683646075">Настроить режим использования протокола "DNS поверх HTTPS"</translation> <translation id="3185009703220253572">начиная с версии <ph name="SINCE_VERSION" /></translation> @@ -2946,6 +2951,7 @@ Если установлено значение False, возможность переадресации портов в контейнеры Crostini недоступна.</translation> <translation id="538108065117008131">Разрешить <ph name="PRODUCT_FRAME_NAME" /> обрабатывать следующие типы содержания.</translation> +<translation id="5383436189211119400">Если правило DeviceArcDataSnapshotHours настроено, механизм снимков данных ARC будет включен. При этом обновление снимков данных ARC может запускаться автоматически в течение заданных промежутков времени. Если в начале такого промежутка потребуется обновление снимков данных ARC и в системе не будет ни одного пользователя, процесс обновления будет запущен без уведомления. Если будет активен хотя бы один сеанс, появится уведомление. Пользователь должен принять его, чтобы перезагрузить устройство и запустить процесс обновления снимков данных ARC. Примечание. Во время обновления снимков данных ARC устройство блокируется.</translation> <translation id="538768040137709073">Включить функцию "Общий буфер обмена", которая позволяет пользователям отправлять текст с компьютера под управлением Chrome OS на устройство Android и обратно (для этого необходимо, чтобы была включена синхронизация и пользователь вошел в аккаунт). Если для правила задано значение True, у пользователей Chrome будет возможность отправлять текст с одного устройства на другое. @@ -4218,6 +4224,7 @@ <translation id="7068108874199666656">Позволяет принудительно применить конфигурацию сети для всех пользователей устройства с <ph name="PRODUCT_OS_NAME" />. Конфигурация сети представляет собой строку в формате JSON согласно стандарту Open Network Configuration.</translation> <translation id="7070525176564511548">Обязательный ввод пароля каждые 168 часов</translation> <translation id="7072208053150563108">Частота смены пароля на устройстве</translation> +<translation id="7072567600438630966">Разрешить включать функцию "Управление телефоном"</translation> <translation id="7079519252486108041">Блокировать всплывающие окна на этих сайтах</translation> <translation id="7080072532759721791">Разрешить пользователям загружать или скачивать файлы, защищенные паролем</translation> <translation id="7086677522575756117">Определяет, на сколько процентов увеличивается время до затемнения экрана, если пользователь выполняет действия на устройстве после затемнения или вскоре после отключения экрана. @@ -4394,6 +4401,7 @@ Если это правило не настроено или значения для него отсутствуют, пользователь может выбрать любой аккаунт Google и назначить его основным в <ph name="PRODUCT_NAME" />.</translation> <translation id="723103540848640830">Указать минимальную длину PIN-кода для разблокировки экрана</translation> <translation id="7234280155140786597">Имена запрещенных хостов обмена сообщениями с оригинальными приложениями (используйте звездочку (*), чтобы включить все хосты)</translation> +<translation id="7246767840750730334">Разрешить управлять уведомлениями с телефона на устройстве Chrome OS</translation> <translation id="7249828445670652637">Разрешить приложениям ARC использовать сертификаты <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7252681704926980614">Отправляет имя пользователя и название файла на сервер локальных принтеров вместе с каждым заданием печати. По умолчанию отправка отключена. @@ -4498,6 +4506,11 @@ Это правило больше не поддерживается. Вместо него используется правило <ph name="PRINTERS_BULK_BLOCKLIST" />. </translation> +<translation id="7358744897221281073">Если параметр задан, пользователи, у которых включена функция "Управление телефоном", смогут продолжать выполнять действия, начатые на телефоне (например, просмотр веб-страниц), в Chrome OS. + + Если параметр не задан, эта функция будет недоступна. Если правило PhoneHubAllowed отключено, эта функция также будет недоступна. + + Если правило не настроено, по умолчанию параметр будет включен как для корпоративных, так и для обычных аккаунтов.</translation> <translation id="7360181094056034924">Определяет действия <ph name="PRODUCT_NAME" /> в отношении загруженных и скачанных данных, которые подлежат проверке. Задержка доставки означает, что <ph name="PRODUCT_NAME" /> не разрешит пользователю открыть скачанный файл, выбрать контент для загрузки, вставить данные из буфера обмена или перетащить объект, пока не завершится проверка и не станет известен ее результат. Данное ограничение действует только в отношении файлов и данных, которые требуют проверки в соответствии с правилами <ph name="SEND_FILES_FOR_MALWARE_CHECK_POLICY_NAME" />, <ph name="CHECK_CONTENT_COMPLIANCE_POLICY_NAME" /> и правилами, определяющими список доменов, для которых включены проверки. Если правило не настроено или для него задано значение None, <ph name="PRODUCT_NAME" /> не будет ограничивать выбор контента для загрузки, вставку из буфера обмена и перетаскивание объектов, а также задерживать предоставление доступа к скачанным файлам. Проверка будет выполняться в фоновом режиме. @@ -4693,6 +4706,7 @@ Если правило не настроено, большой курсор на экране входа будет выключен. Пользователи могут включить его в любое время, и тогда эта настройка будет действовать для всех пользователей на экране входа. Примечание. Если настроено правило <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />, его значение будет иметь приоритет над этим правилом.</translation> +<translation id="7632147323011514740">Промежутки, в которые обновление снимков данных ARC может запускаться для управляемых гостевых сеансов</translation> <translation id="7632724434767231364">название библиотеки GSSAPI</translation> <translation id="7643883929273267746">Ограничить число аккаунтов, которые видны в <ph name="PRODUCT_NAME" /></translation> <translation id="7648907905084499629">Использовать поведение <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> для файлов cookie на всех сайтах</translation> @@ -4968,6 +4982,7 @@ Для <ph name="PRODUCT_OS_NAME" /> это правило используется всегда.</translation> <translation id="8050080920415773384">Оригинальная печать</translation> <translation id="8053580360728293758">Переопределяет цветную печать по умолчанию. Если этот режим недоступен, правило не действует.</translation> +<translation id="8056237304861875584">Разрешить продолжать действия, начатые на телефоне, на устройстве Chrome OS</translation> <translation id="8059164285174960932">URL, по которому клиенты удаленного доступа должны получать токены аутентификации</translation> <translation id="8077245272412229388">Добавляет предварительно настроенные аккаунты Kerberos. Если учетные данные Kerberos совпадают с данными для входа, в аккаунте можно настроить повторное использование последних, указав <ph name="LOGIN_EMAIL_PLACEHOLDER" /> и <ph name="PASSWORD_PLACEHOLDER" /> для субъекта и пароля. В этом случае билет Kerberos будет выдаваться автоматически. Исключение составляют случаи, когда требуется дополнительная аутентификация (двухэтапная аутентификация). Пользователи не могут изменять аккаунты, добавленные с помощью этого правила. @@ -5727,6 +5742,11 @@ <translation id="9084985621503260744">Определяет, влияет ли воспроизведение видео на режим энергопотребления</translation> <translation id="9088433379343318874">Открыть доступ к поставщику контента для контролируемых профилей</translation> <translation id="9088444059179765143">Определять часовой пояс автоматически</translation> +<translation id="9095999573959728902">Если параметр задан, пользователи смогут включать функцию "Управление телефоном", которая позволяет взаимодействовать с телефоном на устройстве Chrome OS. + + Если параметр не задан, пользователи не смогут включать функцию "Управление телефоном". + + Если правило не настроено, по умолчанию функция будет отключена для корпоративных аккаунтов и включена для остальных пользователей.</translation> <translation id="9096086085182305205">Белый список аутентификации сервера</translation> <translation id="9105265795073104888">Приложениям Android доступна только часть параметров конфигурации прокси-сервера. Вы не можете принудить приложения Android использовать прокси-сервер. Приложения сами определяют, делать это или нет.</translation> <translation id="9106865192244721694">Разрешить WebUSB на этих сайтах.</translation>
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/DEPS b/components/safe_browsing/content/renderer/phishing_classifier/DEPS index 1d01a3d..5a34e477 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/DEPS +++ b/components/safe_browsing/content/renderer/phishing_classifier/DEPS
@@ -8,7 +8,6 @@ "+components/safe_browsing/core/features.h", "+cc/paint", "+crypto", - "+skia/ext", "+third_party/skia/include", "+third_party/smhasher", "+ui/base/page_transition_types.h",
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc index a307d48..a831651 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc
@@ -30,7 +30,6 @@ #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" #include "crypto/sha2.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/public/web/web_document.h" @@ -185,7 +184,7 @@ SkAlphaType::kUnpremul_SkAlphaType, rec2020); if (!bitmap_->tryAllocPixels(bitmap_info)) return VisualExtractionFinished(/*success=*/false); - SkCanvas sk_canvas(*bitmap_, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas sk_canvas(*bitmap_); cc::SkiaPaintCanvas cc_canvas(&sk_canvas); auto tracker = std::make_unique<paint_preview::PaintPreviewTracker>( base::UnguessableToken::Create(), frame->GetEmbeddingToken(),
diff --git a/components/security_interstitials_strings.grdp b/components/security_interstitials_strings.grdp index e937a43..60915b88 100644 --- a/components/security_interstitials_strings.grdp +++ b/components/security_interstitials_strings.grdp
@@ -246,7 +246,7 @@ Help improve security on the web for everyone by sending <ph name="BEGIN_WHITEPAPER_LINK"><a href="#" id="whitepaper-link"></ph>URLs of some pages you visit, limited system information, and some page content<ph name="END_WHITEPAPER_LINK"></a></ph> to Google. <ph name="BEGIN_PRIVACY_PAGE_LINK"><a id="privacy-link" href="#"></ph>Privacy policy<ph name="END_PRIVACY_PAGE_LINK"></a></ph> </message> <message name="IDS_SAFE_BROWSING_ENHANCED_PROTECTION_MESSAGE" desc="SafeBrowsing enhanced protection promo message"> - To get Chrome’s highest level of security, <ph name="BEGIN_ENHANCED_PROTECTION_LINK"><a href="#" id="enhanced-protection-link"></ph>turn on enhanced protection<ph name="END_ENHANCED_PROTECTION_LINK"></a></ph>. + To get Chrome’s highest level of security, <ph name="BEGIN_ENHANCED_PROTECTION_LINK"><a href="#" id="enhanced-protection-link"></ph>turn on enhanced protection<ph name="END_ENHANCED_PROTECTION_LINK"></a></ph> </message> <!-- Harmful download interstitial -->
diff --git a/components/security_interstitials_strings_grdp/IDS_SAFE_BROWSING_ENHANCED_PROTECTION_MESSAGE.png.sha1 b/components/security_interstitials_strings_grdp/IDS_SAFE_BROWSING_ENHANCED_PROTECTION_MESSAGE.png.sha1 index a5f14bad..7ef6953 100644 --- a/components/security_interstitials_strings_grdp/IDS_SAFE_BROWSING_ENHANCED_PROTECTION_MESSAGE.png.sha1 +++ b/components/security_interstitials_strings_grdp/IDS_SAFE_BROWSING_ENHANCED_PROTECTION_MESSAGE.png.sha1
@@ -1 +1 @@ -cde64677e5f70e3056eff7e0858284fa89f1e686 \ No newline at end of file +a965238ac08afa3d3655942ada3d42d4783104fa \ No newline at end of file
diff --git a/components/services/paint_preview_compositor/DEPS b/components/services/paint_preview_compositor/DEPS index 3585cec..ce653bb 100644 --- a/components/services/paint_preview_compositor/DEPS +++ b/components/services/paint_preview_compositor/DEPS
@@ -5,7 +5,6 @@ "+content/public/child", # Windows direct write proxy access. "+content/public/utility", "+mojo/public/cpp", - "+skia/ext", "+third_party/skia/include", "+ui/gfx/geometry", ]
diff --git a/components/services/paint_preview_compositor/paint_preview_compositor_impl.cc b/components/services/paint_preview_compositor/paint_preview_compositor_impl.cc index d1f50161..eae216f2 100644 --- a/components/services/paint_preview_compositor/paint_preview_compositor_impl.cc +++ b/components/services/paint_preview_compositor/paint_preview_compositor_impl.cc
@@ -17,7 +17,6 @@ #include "components/paint_preview/common/serial_utils.h" #include "components/paint_preview/common/serialized_recording.h" #include "components/services/paint_preview_compositor/public/mojom/paint_preview_compositor.mojom.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImageInfo.h" @@ -93,7 +92,7 @@ clip_rect.width(), clip_rect.height(), kOpaque_SkAlphaType))) { return base::nullopt; } - SkCanvas canvas(bitmap, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(bitmap); SkMatrix matrix; matrix.setScaleTranslate(scale_factor, scale_factor, -clip_rect.x(), -clip_rect.y());
diff --git a/components/services/paint_preview_compositor/paint_preview_compositor_impl_unittest.cc b/components/services/paint_preview_compositor/paint_preview_compositor_impl_unittest.cc index 69fe46e..b3b9cbf 100644 --- a/components/services/paint_preview_compositor/paint_preview_compositor_impl_unittest.cc +++ b/components/services/paint_preview_compositor/paint_preview_compositor_impl_unittest.cc
@@ -601,7 +601,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32(rect.width(), rect.height(), kOpaque_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.scale(scale_factor, scale_factor); DrawDummyTestPicture(&canvas, SK_ColorDKGRAY, root_frame_scroll_extent); compositor.BitmapForSeparatedFrame( @@ -673,7 +673,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32(rect.width(), rect.height(), kOpaque_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.scale(scale_factor, scale_factor); DrawDummyTestPicture(&canvas, SK_ColorDKGRAY, root_frame_scroll_extent); compositor.BitmapForSeparatedFrame( @@ -723,7 +723,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32(rect.width(), rect.height(), kOpaque_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.scale(scale_factor, scale_factor); DrawDummyTestPicture(&canvas, SK_ColorDKGRAY, root_frame_scroll_extent); compositor.BitmapForMainFrame( @@ -778,7 +778,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32(rect.width(), rect.height(), kOpaque_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.scale(scale_factor, scale_factor); DrawDummyTestPicture(&canvas, SK_ColorDKGRAY, root_frame_scroll_extent); // Draw the subframe where we embedded it while populating the proto. @@ -837,7 +837,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32(rect.width(), rect.height(), kOpaque_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.scale(scale_factor, scale_factor); DrawDummyTestPicture(&canvas, SK_ColorDKGRAY, root_frame_scroll_extent); // Draw the subframe where we embedded it while populating the proto. @@ -899,7 +899,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32(rect.width(), rect.height(), kOpaque_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.scale(scale_factor, scale_factor); // Offset the canvas to simulate the root frame being scrolled. canvas.translate(-root_frame_clip_rect.x(), -root_frame_clip_rect.y());
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index b72b161..dfce5bd0 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Meld aan om wagwoorde te gebruik wat in jou Google-rekening gestoor is</translation> <translation id="2053111141626950936">Bladsye in <ph name="LANGUAGE" /> sal nie vertaal word nie.</translation> <translation id="2053553514270667976">Poskode</translation> +<translation id="2054665754582400095">Jou teenwoordigheid</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 voorstel}other{# voorstelle}}</translation> <translation id="2079545284768500474">Ontdoen</translation> <translation id="20817612488360358">Stelsel se instaanbedienerinstellings word gestel om gebruik te word, maar doelbewuste instaanbedieneropstelling word ook gespesifiseer.</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index b0463a9..d01f1a56 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -279,6 +279,7 @@ <translation id="204357726431741734">በእርስዎ Google መለያ ውስጥ የተከማቹ የይለፍ ቃላትን ለመጠቀም ይግቡ</translation> <translation id="2053111141626950936">በ<ph name="LANGUAGE" /> ያሉ ገጾች አይተረጎሙም።</translation> <translation id="2053553514270667976">ዚፕ ኮድ</translation> +<translation id="2054665754582400095">የእርስዎ መገኘት</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 የአስተያየት ጥቆማ}one{# የአስተያየት ጥቆማዎች}other{# የአስተያየት ጥቆማዎች}}</translation> <translation id="2079545284768500474">ቀልብስ</translation> <translation id="20817612488360358">የስርዓት ተኪ ቅንብሮች ስራ ላይ እንዲውሉ ተቀናብረዋል ግን ግልጽ የሆነ የተኪ ውቅርም ተገልጿል።</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 4c7222e..430e5d8 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Prijavite se da koristite lozinke sačuvane na Google računu</translation> <translation id="2053111141626950936">Stranice čiji jezik je <ph name="LANGUAGE" />, neće se prevoditi.</translation> <translation id="2053553514270667976">Poštanski broj</translation> +<translation id="2054665754582400095">Vaša prisutnost</translation> <translation id="2064691555167957331">{COUNT,plural, =1{Jedan prijedlog}one{# prijedlog}few{# prijedloga}other{# prijedloga}}</translation> <translation id="2079545284768500474">Vrati</translation> <translation id="20817612488360358">Postavke sistema proksi servera su postavljene za korištenje, ali je određena i eksplicitna konfiguracija proksi servera.</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 64e7f85..3734dd6 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -279,6 +279,7 @@ <translation id="204357726431741734">Inicia la sessió per utilitzar les contrasenyes desades al teu Compte de Google</translation> <translation id="2053111141626950936">Les pàgines en <ph name="LANGUAGE" /> no es traduiran.</translation> <translation id="2053553514270667976">Codi postal</translation> +<translation id="2054665754582400095">La teva presència</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 suggeriment}other{# suggeriments}}</translation> <translation id="2079545284768500474">Desfés</translation> <translation id="20817612488360358">S'ha definit la configuració del servidor intermediari del sistema perquè es pugui utilitzar, però també s'ha especificat una configuració del servidor intermediari explícita.</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 8d909a5..a507ecb 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -895,6 +895,7 @@ <translation id="4597348597567598915">Größe 8</translation> <translation id="4600854749408232102">C6/C5 (Umschlag)</translation> <translation id="4628948037717959914">Foto</translation> +<translation id="4631649115723685955">Cashback zugeordnet</translation> <translation id="464342062220857295">Suchfunktionen</translation> <translation id="4644670975240021822">Umgekehrte Reihenfolge mit der Vorderseite nach unten</translation> <translation id="4646534391647090355">Jetzt aufrufen</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 626a314..47d6859e 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Inicia sesión para poder usar las contraseñas guardadas en tu cuenta de Google</translation> <translation id="2053111141626950936">No se traducirán las páginas en <ph name="LANGUAGE" />.</translation> <translation id="2053553514270667976">Código postal</translation> +<translation id="2054665754582400095">Tu presencia</translation> <translation id="2064691555167957331">{COUNT,plural, =1{Una sugerencia}other{# sugerencias}}</translation> <translation id="2079545284768500474">Deshacer</translation> <translation id="20817612488360358">Se ha establecido la configuración del proxy del sistema, pero también se han especificado ajustes de proxy explícitos.</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 9bcb342..70b49df 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -282,6 +282,7 @@ <translation id="204357726431741734">Logige sisse, et kasutada oma Google'i kontole salvestatud paroole</translation> <translation id="2053111141626950936">Selles keeles lehti ei tõlgita: <ph name="LANGUAGE" />.</translation> <translation id="2053553514270667976">Postiindeks</translation> +<translation id="2054665754582400095">Teie kohalolek</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 soovitus}other{# soovitust}}</translation> <translation id="2079545284768500474">Võta tagasi</translation> <translation id="20817612488360358">Kasutamiseks on määratud süsteemi puhverserveri seaded, kuid määratud on ka konkreetne puhverserveri konfigureerimine.</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 393491e..bdcdfeb 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Prijavite se kako biste upotrebljavali zaporke spremljene na Google računu</translation> <translation id="2053111141626950936">Neće se prevoditi <ph name="LANGUAGE" />.</translation> <translation id="2053553514270667976">ZIP kôd</translation> +<translation id="2054665754582400095">Vaša prisutnost</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 prijedlog}one{# prijedlog}few{# prijedloga}other{# prijedloga}}</translation> <translation id="2079545284768500474">Poništi</translation> <translation id="20817612488360358">Postavljena je upotreba sistemskih postavki proxy poslužitelja, ali također je određena izričita konfiguracija proxy poslužitelja.</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index f9924932..8469fc71 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -905,7 +905,7 @@ <translation id="4597348597567598915">Dimensione 8</translation> <translation id="4600854749408232102">C6/C5 (Envelope)</translation> <translation id="4628948037717959914">Foto</translation> -<translation id="4631649115723685955">Rimborso in contanti collegato</translation> +<translation id="4631649115723685955">Rimborso collegato</translation> <translation id="464342062220857295">Funzionalità di ricerca</translation> <translation id="4644670975240021822">Ordine inverso a faccia in giù</translation> <translation id="4646534391647090355">Vai subito</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 2307067..d802c1b 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -495,7 +495,7 @@ <translation id="295526156371527179">אזהרה: המדיניות הזו לא עברה מיזוג כמילון בהתאם למדיניות, מאחר שהיא אינה מילון.</translation> <translation id="2955913368246107853">סגור את חלונית החיפוש</translation> <translation id="2969319727213777354">כדי ליצור חיבור מאובטח, השעון צריך להיות מוגדר כהלכה. הסיבה לכך היא שהאישורים שבאמצעותם אתרים מזהים את עצמם תקפים רק למשך פרקי זמן מסוימים. מאחר שהשעון במכשיר שלך שגוי, Google Chrome לא יכול לאמת את האישורים האלה.</translation> -<translation id="2972581237482394796">&בצע שנית</translation> +<translation id="2972581237482394796">&ביצוע חוזר</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, בחירה נוכחית. <ph name="ROW_CONTENT" /></translation> <translation id="2985306909656435243">אם האפשרות תופעל, Chromium יאחסן עותק של הכרטיס שלך במכשיר הזה למילוי מהיר יותר של טפסים.</translation> <translation id="2985398929374701810">עליך להזין כתובת חוקית</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index df9dcf45..f713b0c 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">ເຂົ້າສູ່ລະບົບເພື່ອໃຊ້ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ໃນບັນຊີ Google ຂອງທ່ານ</translation> <translation id="2053111141626950936">ລະບົບຈະບໍ່ແປໜ້າເປັນ <ph name="LANGUAGE" />.</translation> <translation id="2053553514270667976">ລະຫັດຊິບ</translation> +<translation id="2054665754582400095">ການນຳໃຊ້ຂອງທ່ານ</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 ຄຳແນະນຳ}other{# ຄຳແນະນຳ}}</translation> <translation id="2079545284768500474">ບໍ່ເຮັດ</translation> <translation id="20817612488360358">ການຕັ້ງຄ່າພຣັອກຊີລະບົບຖືກຕັ້ງໃຫ້ຖືກນໍາໃຊ້ ແຕ່ການປັບຕັ້ງຄ່າພຣັອກຊີທີ່ຈະແຈ້ງໄດ້ຖືກລະບຸແຈ້ງນໍາອີກ.</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index cbd55bb..36ee7dd 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Најавете се за да користите лозинки зачувани во вашата сметка на Google</translation> <translation id="2053111141626950936">Страниците на <ph name="LANGUAGE" /> нема да се преведуваат.</translation> <translation id="2053553514270667976">Поштенски број</translation> +<translation id="2054665754582400095">Вашето присуство</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 предлог}one{# предлог}other{# предлози}}</translation> <translation id="2079545284768500474">Врати</translation> <translation id="20817612488360358">Поставките на прокси на системот се поставени да се користат, но назначена е и јасна конфигурација на прокси.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index b1a5f22..5418000 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Logg på for å bruke passord som er lagret i Google-kontoen din</translation> <translation id="2053111141626950936">Sider på <ph name="LANGUAGE" /> oversettes ikke.</translation> <translation id="2053553514270667976">Postnummer</translation> +<translation id="2054665754582400095">Tilstedeværelsen din</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 forslag}other{# forslag}}</translation> <translation id="2079545284768500474">Angre</translation> <translation id="20817612488360358">Innstillinger for systemmellomtjener er stilt inn på å brukes, men en uttrykkelig mellomtjenerkonfigurasjon er også angitt.</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index aa53607..d658553 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -279,6 +279,7 @@ <translation id="204357726431741734">Zaloguj się, by używać haseł zapisanych na Twoim koncie Google</translation> <translation id="2053111141626950936">Strony w tym języku (<ph name="LANGUAGE" />) nie będą tłumaczone.</translation> <translation id="2053553514270667976">Kod pocztowy</translation> +<translation id="2054665754582400095">Twoja obecność</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 podpowiedź}few{# podpowiedzi}many{# podpowiedzi}other{# podpowiedzi}}</translation> <translation id="2079545284768500474">Cofnij</translation> <translation id="20817612488360358">Skonfigurowano używanie systemowych ustawień proxy, ale podano też jawną konfigurację proxy.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index a61651f..100f7a4 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -279,6 +279,7 @@ <translation id="204357726431741734">Faça login para usar as senhas salvas na sua Conta do Google</translation> <translation id="2053111141626950936">Páginas em <ph name="LANGUAGE" /> não serão traduzidas.</translation> <translation id="2053553514270667976">CEP</translation> +<translation id="2054665754582400095">Sua presença</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 sugestão}one{# sugestão}other{# sugestões}}</translation> <translation id="2079545284768500474">Desfazer</translation> <translation id="20817612488360358">As configurações de proxy do sistema são definidas para serem utilizadas, mas uma configuração explícita de proxy também foi especificada.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 9eb2a6d..197bbf1 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -279,6 +279,7 @@ <translation id="204357726431741734">Prihlásiť sa a používať heslá uložené vo vašom účte Google</translation> <translation id="2053111141626950936">Stránky v jazyku <ph name="LANGUAGE" /> nebudú prekladané.</translation> <translation id="2053553514270667976">PSČ</translation> +<translation id="2054665754582400095">Vaša prítomnosť</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 návrh}few{# návrhy}many{# návrhu}other{# návrhov}}</translation> <translation id="2079545284768500474">Späť</translation> <translation id="20817612488360358">Používanie systémových nastavení servera proxy je nastavené, avšak je určená aj explicitná konfigurácia servera proxy.</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 1e8bbda..b9def76 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Prijavite se da biste koristili lozinke sačuvane na Google nalogu</translation> <translation id="2053111141626950936">Stranice na jeziku <ph name="LANGUAGE" /> neće biti prevedene.</translation> <translation id="2053553514270667976">Poštanski broj</translation> +<translation id="2054665754582400095">Prisustvo</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 predlog}one{# predlog}few{# predloga}other{# predloga}}</translation> <translation id="2079545284768500474">Opozovi</translation> <translation id="20817612488360358">Podešeno je da se koriste sistemska podešavanja proksija, ali je navedena eksplicitna konfiguracija proksija.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 64bb1c7..1ca0e5c 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Пријавите се да бисте користили лозинке сачуване на Google налогу</translation> <translation id="2053111141626950936">Странице на језику <ph name="LANGUAGE" /> неће бити преведене.</translation> <translation id="2053553514270667976">Поштански број</translation> +<translation id="2054665754582400095">Присуство</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 предлог}one{# предлог}few{# предлога}other{# предлога}}</translation> <translation id="2079545284768500474">Опозови</translation> <translation id="20817612488360358">Подешено је да се користе системска подешавања проксија, али је наведена експлицитна конфигурација проксија.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 216e214..60b7972 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -283,6 +283,7 @@ <translation id="204357726431741734">Увійдіть, щоб користуватися паролями, збереженими в обліковому записі Google</translation> <translation id="2053111141626950936">Сторінки цією мовою (<ph name="LANGUAGE" />) не перекладатимуться.</translation> <translation id="2053553514270667976">Поштовий індекс</translation> +<translation id="2054665754582400095">Дані про те, чи ви присутні</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 пропозиція}one{# пропозиція}few{# пропозиції}many{# пропозицій}other{# пропозиції}}</translation> <translation id="2079545284768500474">Відмінити</translation> <translation id="20817612488360358">Системні параметри проксі-сервера налаштовано для використання, але чітко вказано налаштування проксі-сервера.</translation>
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index 7f7eadb..2a72573d 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -355,26 +355,24 @@ static_library("test_support_model") { testonly = true sources = [ - "model/data_type_error_handler_mock.cc", - "model/data_type_error_handler_mock.h", - "model/fake_model_type_controller_delegate.cc", - "model/fake_model_type_controller_delegate.h", - "model/fake_model_type_sync_bridge.cc", - "model/fake_model_type_sync_bridge.h", "model/fake_sync_change_processor.cc", "model/fake_sync_change_processor.h", "model/model_type_store_test_util.cc", "model/model_type_store_test_util.h", - "model/stub_model_type_sync_bridge.cc", - "model/stub_model_type_sync_bridge.h", "model/sync_change_processor_wrapper_for_test.cc", "model/sync_change_processor_wrapper_for_test.h", "model/sync_error_factory_mock.cc", "model/sync_error_factory_mock.h", - "model/test_model_type_store_service.cc", - "model/test_model_type_store_service.h", + "test/model/fake_model_type_controller_delegate.cc", + "test/model/fake_model_type_controller_delegate.h", + "test/model/fake_model_type_sync_bridge.cc", + "test/model/fake_model_type_sync_bridge.h", "test/model/mock_model_type_change_processor.cc", "test/model/mock_model_type_change_processor.h", + "test/model/stub_model_type_sync_bridge.cc", + "test/model/stub_model_type_sync_bridge.h", + "test/model/test_model_type_store_service.cc", + "test/model/test_model_type_store_service.h", ] public_deps = [ "//components/sync/base:test_support" ] @@ -410,7 +408,6 @@ "base/sync_util_unittest.cc", "base/system_encryptor_unittest.cc", "base/unique_position_unittest.cc", - "base/user_demographics_unittest.cc", "base/weak_handle_unittest.cc", "driver/backend_migrator_unittest.cc", "driver/data_type_manager_impl_unittest.cc", @@ -505,7 +502,6 @@ "//base/test:test_support", "//components/gcm_driver:test_support", "//components/invalidation/impl", - "//components/metrics", "//components/os_crypt", "//components/os_crypt:test_support", "//components/prefs:test_support",
diff --git a/components/sync/base/BUILD.gn b/components/sync/base/BUILD.gn index ab987ab..3d6549525 100644 --- a/components/sync/base/BUILD.gn +++ b/components/sync/base/BUILD.gn
@@ -65,8 +65,6 @@ "unique_position.h", "unrecoverable_error_info.cc", "unrecoverable_error_info.h", - "user_demographics.cc", - "user_demographics.h", "user_selectable_type.cc", "user_selectable_type.h", "weak_handle.cc",
diff --git a/components/sync/base/DEPS b/components/sync/base/DEPS index b35cdc74..e1441b2 100644 --- a/components/sync/base/DEPS +++ b/components/sync/base/DEPS
@@ -4,10 +4,8 @@ "+components/os_crypt", "+components/pref_registry", "+components/prefs", - "+components/reading_list/features", "+components/sync/protocol", "+components/sync_preferences", - "+third_party/metrics_proto", "+third_party/zlib", # For UniquePosition compression "+net", "+ui/base",
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc index 0e9d19b..26b5489 100644 --- a/components/sync/base/sync_prefs.cc +++ b/components/sync/base/sync_prefs.cc
@@ -191,8 +191,6 @@ false); #endif // defined(OS_ANDROID) - RegisterDemographicsProfilePrefs(registry); - // Obsolete prefs that will be removed after a grace period. RegisterObsoleteUserTypePrefs(registry); registry->RegisterBooleanPref(kSyncPassphraseEncryptionTransitionInProgress, @@ -218,8 +216,6 @@ void SyncPrefs::ClearLocalSyncTransportData() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - ClearDemographicsPrefs(pref_service_); - pref_service_->ClearPref(prefs::kSyncLastSyncedTime); pref_service_->ClearPref(prefs::kSyncLastPollTime); pref_service_->ClearPref(prefs::kSyncPollIntervalSeconds);
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h index f6910211..5010a54 100644 --- a/components/sync/base/sync_prefs.h +++ b/components/sync/base/sync_prefs.h
@@ -20,10 +20,8 @@ #include "build/build_config.h" #include "components/prefs/pref_member.h" #include "components/sync/base/model_type.h" -#include "components/sync/base/user_demographics.h" #include "components/sync/base/user_selectable_type.h" #include "components/sync/protocol/sync.pb.h" -#include "third_party/metrics_proto/user_demographics.pb.h" class PrefService;
diff --git a/components/sync/driver/fake_data_type_controller.h b/components/sync/driver/fake_data_type_controller.h index 9b7b26c..3562597b 100644 --- a/components/sync/driver/fake_data_type_controller.h +++ b/components/sync/driver/fake_data_type_controller.h
@@ -7,7 +7,7 @@ #include "components/sync/base/sync_mode.h" #include "components/sync/driver/model_type_controller.h" -#include "components/sync/model/fake_model_type_controller_delegate.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" namespace syncer {
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc index 7ab4d06..d0bc3a8a 100644 --- a/components/sync/driver/fake_sync_service.cc +++ b/components/sync/driver/fake_sync_service.cc
@@ -155,10 +155,8 @@ const std::vector<uint8_t>& public_key, base::OnceClosure callback) {} -UserDemographicsResult FakeSyncService::GetUserNoisedBirthYearAndGender( - base::Time now) { - return UserDemographicsResult::ForStatus( - UserDemographicsStatus::kIneligibleDemographicsData); +bool FakeSyncService::CanUploadDemographicsToGoogle() { + return false; } void FakeSyncService::Shutdown() {}
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h index 13eb4fb..f18a87d 100644 --- a/components/sync/driver/fake_sync_service.h +++ b/components/sync/driver/fake_sync_service.h
@@ -71,8 +71,7 @@ const std::string& gaia_id, const std::vector<uint8_t>& public_key, base::OnceClosure callback) override; - UserDemographicsResult GetUserNoisedBirthYearAndGender( - base::Time now) override; + bool CanUploadDemographicsToGoogle() override; // KeyedService implementation. void Shutdown() override;
diff --git a/components/sync/driver/mock_sync_service.h b/components/sync/driver/mock_sync_service.h index 365b3a9..4c747de 100644 --- a/components/sync/driver/mock_sync_service.h +++ b/components/sync/driver/mock_sync_service.h
@@ -78,10 +78,7 @@ const std::vector<uint8_t>& public_key, base::OnceClosure callback), (override)); - MOCK_METHOD(UserDemographicsResult, - GetUserNoisedBirthYearAndGender, - (base::Time now), - (override)); + MOCK_METHOD(bool, CanUploadDemographicsToGoogle, (), (override)); MOCK_METHOD(void, AddObserver, (SyncServiceObserver * observer), (override)); MOCK_METHOD(void, RemoveObserver,
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc index 2b7895e5..985e174 100644 --- a/components/sync/driver/profile_sync_service.cc +++ b/components/sync/driver/profile_sync_service.cc
@@ -527,7 +527,7 @@ // everything away and start from scratch with a new cache GUID, which also // cascades into datatypes throwing away their dangling sync metadata due to // cache GUID mismatches. - sync_prefs_.ClearLocalSyncTransportData(); + ClearLocalTransportDataAndNotify(); sync_prefs_.SetCacheGuid(GenerateCacheGUID()); sync_prefs_.SetGaiaId(authenticated_account_info.gaia); } @@ -615,7 +615,8 @@ sync_client_->GetSyncApiComponentFactory() ->DeleteLegacyDirectoryFilesAndNigoriStorage(); } - sync_prefs_.ClearLocalSyncTransportData(); + + ClearLocalTransportDataAndNotify(); } return; } @@ -666,7 +667,7 @@ } if (reason == ShutdownReason::DISABLE_SYNC) { - sync_prefs_.ClearLocalSyncTransportData(); + ClearLocalTransportDataAndNotify(); } NotifyObservers(); @@ -1725,18 +1726,11 @@ gaia_id, public_key, std::move(callback)); } -UserDemographicsResult ProfileSyncService::GetUserNoisedBirthYearAndGender( - base::Time now) { +bool ProfileSyncService::CanUploadDemographicsToGoogle() { // Do not provide the synced user’s birth year and gender when sync is // disabled or paused because the user’s birth year and gender should only be // provided when the sync prefs are synced with the sync server. - if (!IsSyncFeatureEnabled() || auth_manager_->IsSyncPaused()) { - return UserDemographicsResult::ForStatus( - UserDemographicsStatus::kSyncNotEnabled); - } - - return GetUserNoisedBirthYearAndGenderFromPrefs( - now, sync_client_->GetPrefService()); + return IsSyncFeatureEnabled() && !auth_manager_->IsSyncPaused(); } base::WeakPtr<JsController> ProfileSyncService::GetJsController() { @@ -1957,4 +1951,9 @@ } } +void ProfileSyncService::ClearLocalTransportDataAndNotify() { + sync_prefs_.ClearLocalSyncTransportData(); + sync_client_->OnLocalSyncTransportDataCleared(); +} + } // namespace syncer
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/profile_sync_service.h index bd17fe7c..99ece8b 100644 --- a/components/sync/driver/profile_sync_service.h +++ b/components/sync/driver/profile_sync_service.h
@@ -136,8 +136,7 @@ const std::string& gaia_id, const std::vector<uint8_t>& public_key, base::OnceClosure callback) override; - UserDemographicsResult GetUserNoisedBirthYearAndGender( - base::Time now) override; + bool CanUploadDemographicsToGoogle() override; void AddObserver(SyncServiceObserver* observer) override; void RemoveObserver(SyncServiceObserver* observer) override; bool HasObserver(const SyncServiceObserver* observer) const override; @@ -365,7 +364,8 @@ // Called by SyncServiceCrypto when its required user action changes. void OnRequiredUserActionChanged(); - std::string GetExperimentalAuthenticationSecret() const; + // Helper function to prevent future bugs that avoid notyfing while clearing. + void ClearLocalTransportDataAndNotify(); // This profile's SyncClient, which abstracts away non-Sync dependencies and // the Sync API component factory.
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/profile_sync_service_unittest.cc index 560aff4..28b0edf1 100644 --- a/components/sync/driver/profile_sync_service_unittest.cc +++ b/components/sync/driver/profile_sync_service_unittest.cc
@@ -24,7 +24,6 @@ #include "components/sync/base/model_type.h" #include "components/sync/base/pref_names.h" #include "components/sync/base/sync_util.h" -#include "components/sync/base/user_demographics.h" #include "components/sync/base/user_selectable_type.h" #include "components/sync/driver/configure_context.h" #include "components/sync/driver/fake_data_type_controller.h" @@ -40,7 +39,6 @@ #include "components/version_info/version_info_values.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/metrics_proto/user_demographics.pb.h" using testing::_; using testing::ByMove; @@ -51,16 +49,9 @@ namespace { -// Age of a user that is old enough to provide demographics when now time is -// |kNowTimeInStringFormat|. -constexpr int kOldEnoughForDemographicsUserBirthYear = 1983; - constexpr char kTestUser[] = "test_user@gmail.com"; constexpr char kTestCacheGuid[] = "test_cache_guid"; -// Now time in string format. -constexpr char kNowTimeInStringFormat[] = "23 Mar 2019 16:00:00 UDT"; - class FakeDataTypeManager : public DataTypeManager { public: using ConfigureCalled = base::RepeatingCallback<void(ConfigureReason)>; @@ -197,6 +188,7 @@ std::unique_ptr<SyncClientMock> sync_client = profile_sync_service_bundle_.CreateSyncClientMock(); + sync_client_ = sync_client.get(); ON_CALL(*sync_client, CreateDataTypeControllers(_)) .WillByDefault(Return(ByMove(std::move(controllers)))); @@ -222,6 +214,7 @@ std::unique_ptr<SyncClientMock> sync_client = profile_sync_service_bundle_.CreateSyncClientMock(); + sync_client_ = sync_client.get(); ON_CALL(*sync_client, CreateDataTypeControllers(_)) .WillByDefault(Return(ByMove(std::move(controllers)))); @@ -308,6 +301,8 @@ ProfileSyncService* service() { return service_.get(); } + SyncClientMock* sync_client() { return sync_client_; } + sync_preferences::TestingPrefServiceSyncable* prefs() { return profile_sync_service_bundle_.pref_service(); } @@ -320,34 +315,11 @@ return profile_sync_service_bundle_.sync_invalidations_service(); } - void SetDemographics(int birth_year, - metrics::UserDemographicsProto_Gender gender) { - base::DictionaryValue dict; - dict.SetIntPath(kSyncDemographicsBirthYearPath, birth_year); - dict.SetIntPath(kSyncDemographicsGenderPath, static_cast<int>(gender)); - prefs()->Set(kSyncDemographicsPrefName, dict); - } - - static bool HasBirthYearDemographic(const PrefService* pref_service) { - return pref_service->HasPrefPath(kSyncDemographicsPrefName) && - pref_service->GetDictionary(kSyncDemographicsPrefName) - ->FindIntPath(kSyncDemographicsBirthYearPath); - } - - static bool HasGenderDemographic(const PrefService* pref_service) { - return pref_service->HasPrefPath(kSyncDemographicsPrefName) && - pref_service->GetDictionary(kSyncDemographicsPrefName) - ->FindIntPath(kSyncDemographicsGenderPath); - } - - static bool HasBirthYearOffset(const PrefService* pref_service) { - return pref_service->HasPrefPath(kSyncDemographicsBirthYearOffsetPrefName); - } - private: base::test::TaskEnvironment task_environment_; ProfileSyncServiceBundle profile_sync_service_bundle_; std::unique_ptr<ProfileSyncService> service_; + SyncClientMock* sync_client_; // Owned by |service_|. }; class ProfileSyncServiceTestWithStopSyncInPausedState @@ -378,14 +350,6 @@ base::test::ScopedFeatureList override_features_; }; -// Gets the now time used for testing user demographics. -base::Time GetNowTime() { - base::Time now; - bool result = base::Time::FromString(kNowTimeInStringFormat, &now); - DCHECK(result); - return now; -} - // Verify that the server URLs are sane. TEST_F(ProfileSyncServiceTest, InitialState) { CreateService(ProfileSyncService::AUTO_START); @@ -949,18 +913,9 @@ ASSERT_LT(base::Time::Now() - last_synced_time, base::TimeDelta::FromMinutes(1)); - // Set demographic prefs that are normally fetched from server when syncing. - SetDemographics(kOldEnoughForDemographicsUserBirthYear, - metrics::UserDemographicsProto_Gender_GENDER_FEMALE); - - // Set the birth year offset pref that would be normally set when calling - // GetUserNoisedBirthYearAndGenderFromPrefs(). - prefs()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, 2); - - // Verify that the demographics prefs exist (i.e., that the test is set up). - ASSERT_TRUE(HasBirthYearDemographic(prefs())); - ASSERT_TRUE(HasGenderDemographic(prefs())); - ASSERT_TRUE(HasBirthYearOffset(prefs())); + // Local transport data should be cleared and the client notified. + EXPECT_CALL(*sync_client(), OnLocalSyncTransportDataCleared()) + .Times(testing::AtLeast(1)); // Sign out. service()->StopAndClear(); @@ -972,50 +927,19 @@ EXPECT_FALSE(service()->IsSyncFeatureEnabled()); EXPECT_NE(service()->GetLastSyncedTimeForDebugging(), last_synced_time); - - // Check that the demographic prefs are cleared. - EXPECT_FALSE(prefs()->HasPrefPath(kSyncDemographicsPrefName)); - EXPECT_FALSE(HasBirthYearDemographic(prefs())); - EXPECT_FALSE(HasGenderDemographic(prefs())); - - // Verify that the random offset is preserved. If the user signs in again, - // we don't want them to start reporting a different randomized birth year - // as this could narrow down or ever reveal their true birth year. - EXPECT_TRUE(HasBirthYearOffset(prefs())); } // Verify that demographic prefs are cleared when the service is initializing // and account is signed out. TEST_F(ProfileSyncServiceTest, ClearDemographicsOnInitializeWhenSignedOut) { - // Set demographic prefs that are leftovers from previous sync. We can imagine - // that due to some crash, sync service did not clear demographics when - // account was signed out. - SetDemographics(kOldEnoughForDemographicsUserBirthYear, - metrics::UserDemographicsProto_Gender_GENDER_FEMALE); - - // Set the birth year offset pref that would be normally set when calling - // GetUserNoisedBirthYearAndGenderFromPrefs(). - prefs()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, 2); - - // Verify that the demographics prefs exist (i.e., that the test is set up). - ASSERT_TRUE(HasBirthYearDemographic(prefs())); - ASSERT_TRUE(HasGenderDemographic(prefs())); - ASSERT_TRUE(HasBirthYearOffset(prefs())); - // Don't sign-in before creating the service. CreateService(ProfileSyncService::AUTO_START); - // Initialize when signed out to trigger clearing of demographic prefs. + + // Local transport data should be cleared and the client notified. + EXPECT_CALL(*sync_client(), OnLocalSyncTransportDataCleared()); + + // Initialize when signed out to trigger clearing of prefs. InitializeForNthSync(); - - // Verify that the demographic prefs are cleared. - EXPECT_FALSE(prefs()->HasPrefPath(kSyncDemographicsPrefName)); - EXPECT_FALSE(HasBirthYearDemographic(prefs())); - EXPECT_FALSE(HasGenderDemographic(prefs())); - - // Verify that the random offset is preserved. If the user signs in again, - // we don't want them to start reporting a different randomized birth year - // as this could narrow down or ever reveal their true birth year. - EXPECT_TRUE(HasBirthYearOffset(prefs())); } TEST_F(ProfileSyncServiceTest, CancelSyncAfterSignOut) { @@ -1366,26 +1290,7 @@ ASSERT_EQ(SyncService::TransportState::ACTIVE, service()->GetTransportState()); - const int user_demographics_birth_year = - kOldEnoughForDemographicsUserBirthYear; - const int birth_year_offset = 2; - const metrics::UserDemographicsProto_Gender user_demographics_gender = - metrics::UserDemographicsProto_Gender_GENDER_FEMALE; - - // Set demographic prefs that are normally fetched from server when syncing. - SetDemographics(user_demographics_birth_year, user_demographics_gender); - - // Directly set birth year offset in demographic prefs to avoid it being set - // with a random value when calling GetUserNoisedBirthYearAndGender(). - prefs()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, - birth_year_offset); - - UserDemographicsResult user_demographics_result = - service()->GetUserNoisedBirthYearAndGender(GetNowTime()); - ASSERT_TRUE(user_demographics_result.IsSuccess()); - EXPECT_EQ(user_demographics_birth_year + birth_year_offset, - user_demographics_result.value().birth_year); - EXPECT_EQ(user_demographics_gender, user_demographics_result.value().gender); + EXPECT_TRUE(service()->CanUploadDemographicsToGoogle()); } // Test whether sync service does not provide user demographics when sync is @@ -1397,20 +1302,7 @@ ASSERT_EQ(SyncService::TransportState::DISABLED, service()->GetTransportState()); - // Set demographic prefs that should normally be cleared when sync is - // disabled. We keep the demographic prefs available in this test to make - // sure that they are not provided when sync is disabled (we want - // base::nullopt in any case). - SetDemographics(kOldEnoughForDemographicsUserBirthYear, - metrics::UserDemographicsProto_Gender_GENDER_FEMALE); - - // Verify that demographic prefs exist (i.e., the test is set up). - ASSERT_TRUE(HasBirthYearDemographic(prefs())); - ASSERT_TRUE(HasGenderDemographic(prefs())); - - // Verify that we don't get demographics when sync is off. - EXPECT_FALSE( - service()->GetUserNoisedBirthYearAndGender(GetNowTime()).IsSuccess()); + EXPECT_FALSE(service()->CanUploadDemographicsToGoogle()); } // Test whether sync service does not provide user demographics and does not @@ -1423,25 +1315,7 @@ InitializeForNthSync(); ASSERT_EQ(SyncService::TransportState::ACTIVE, service()->GetTransportState()); - - const int user_demographics_birth_year = - kOldEnoughForDemographicsUserBirthYear; - const int birth_year_offset = 2; - const metrics::UserDemographicsProto_Gender user_demographics_gender = - metrics::UserDemographicsProto_Gender_GENDER_FEMALE; - - // Set demographic prefs that are normally fetched from server when syncing. - SetDemographics(user_demographics_birth_year, user_demographics_gender); - - // Set birth year noise offset that is usually set when calling - // GetUserNoisedBirthYearAndGenderFromPrefs(). - prefs()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, - static_cast<int>(birth_year_offset)); - - // Verify that demographic prefs exist (i.e., the test is set up). - ASSERT_TRUE(HasBirthYearDemographic(prefs())); - ASSERT_TRUE(HasGenderDemographic(prefs())); - ASSERT_TRUE(HasBirthYearOffset(prefs())); + ASSERT_TRUE(service()->CanUploadDemographicsToGoogle()); // Temporarily disable sync without turning it off. service()->GetUserSettings()->SetSyncRequested(false); @@ -1450,16 +1324,7 @@ SyncService::DisableReasonSet(SyncService::DISABLE_REASON_USER_CHOICE), service()->GetDisableReasons()); - // Verify that sync service does not provide demographics when it is - // temporarily disabled. - UserDemographicsResult user_demographics_result = - service()->GetUserNoisedBirthYearAndGender(GetNowTime()); - EXPECT_FALSE(user_demographics_result.IsSuccess()); - - // Verify that demographic prefs are not cleared. - EXPECT_TRUE(HasBirthYearDemographic(prefs())); - EXPECT_TRUE(HasGenderDemographic(prefs())); - EXPECT_TRUE(HasBirthYearOffset(prefs())); + EXPECT_FALSE(service()->CanUploadDemographicsToGoogle()); } // Test whether sync service does not provide user demographics and does not @@ -1475,23 +1340,14 @@ // Initialize service with sync enabled at start. SignIn(); CreateService(ProfileSyncService::AUTO_START); + + // Local transport data should not be cleared. + EXPECT_CALL(*sync_client(), OnLocalSyncTransportDataCleared()).Times(0); + InitializeForNthSync(); ASSERT_EQ(SyncService::TransportState::ACTIVE, service()->GetTransportState()); - // Set demographic prefs that are normally fetched from server when syncing. - SetDemographics(kOldEnoughForDemographicsUserBirthYear, - metrics::UserDemographicsProto_Gender_GENDER_FEMALE); - - // Set birth year noise offset that is usually set when calling - // GetUserNoisedBirthYearAndGenderFromPrefs(). - prefs()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, 2); - - // Verify that demographic prefs exist (i.e., the test is set up). - ASSERT_TRUE(HasBirthYearDemographic(prefs())); - ASSERT_TRUE(HasGenderDemographic(prefs())); - ASSERT_TRUE(HasBirthYearOffset(prefs())); - // Simulate sign out using an invalid auth error. identity_test_env()->SetInvalidRefreshTokenForPrimaryAccount(); ASSERT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, @@ -1499,14 +1355,7 @@ ASSERT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons()); // Verify that sync service does not provide demographics when sync is paused. - UserDemographicsResult user_demographics_result = - service()->GetUserNoisedBirthYearAndGender(GetNowTime()); - EXPECT_FALSE(user_demographics_result.IsSuccess()); - - // Verify that demographic prefs are not cleared. - EXPECT_TRUE(HasBirthYearDemographic(prefs())); - EXPECT_TRUE(HasGenderDemographic(prefs())); - EXPECT_TRUE(HasBirthYearOffset(prefs())); + EXPECT_FALSE(service()->CanUploadDemographicsToGoogle()); } // Test whether sync service does not provide user demographics and does not @@ -1522,23 +1371,14 @@ // Initialize service with sync enabled at start. SignIn(); CreateService(ProfileSyncService::AUTO_START); + + // Local transport data should not be cleared. + EXPECT_CALL(*sync_client(), OnLocalSyncTransportDataCleared()).Times(0); + InitializeForNthSync(); ASSERT_EQ(SyncService::TransportState::ACTIVE, service()->GetTransportState()); - // Set demographic prefs that are normally fetched from server when syncing. - SetDemographics(kOldEnoughForDemographicsUserBirthYear, - metrics::UserDemographicsProto_Gender_GENDER_FEMALE); - - // Set birth year noise offset that is usually set when calling - // GetUserNoisedBirthYearAndGenderFromPrefs(). - prefs()->SetInteger(kSyncDemographicsBirthYearOffsetPrefName, 2); - - // Verify that demographic prefs exist (i.e., the test is set up). - ASSERT_TRUE(HasBirthYearDemographic(prefs())); - ASSERT_TRUE(HasGenderDemographic(prefs())); - ASSERT_TRUE(HasBirthYearOffset(prefs())); - // Simulate sign out using an invalid auth error. identity_test_env()->SetInvalidRefreshTokenForPrimaryAccount(); ASSERT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, @@ -1548,14 +1388,7 @@ ASSERT_TRUE(service()->GetDisableReasons().Empty()); // Verify that sync service does not provide demographics when sync is paused. - UserDemographicsResult user_demographics_result = - service()->GetUserNoisedBirthYearAndGender(GetNowTime()); - EXPECT_FALSE(user_demographics_result.IsSuccess()); - - // Verify that demographic prefs are not cleared. - EXPECT_TRUE(HasBirthYearDemographic(prefs())); - EXPECT_TRUE(HasGenderDemographic(prefs())); - EXPECT_TRUE(HasBirthYearOffset(prefs())); + EXPECT_FALSE(service()->CanUploadDemographicsToGoogle()); } TEST_F(ProfileSyncServiceTest, GenerateCacheGUID) {
diff --git a/components/sync/driver/sync_client.h b/components/sync/driver/sync_client.h index d9f755e..055472b8 100644 --- a/components/sync/driver/sync_client.h +++ b/components/sync/driver/sync_client.h
@@ -66,6 +66,12 @@ // Returns the preference provider, or null if none exists. virtual SyncTypePreferenceProvider* GetPreferenceProvider() = 0; + + // Notifies the client that local sync metadata in preferences has been + // cleared. + // TODO(crbug.com/1137346): Replace this mechanism with a more universal one, + // e.g. using SyncServiceObserver. + virtual void OnLocalSyncTransportDataCleared() = 0; }; } // namespace syncer
diff --git a/components/sync/driver/sync_client_mock.h b/components/sync/driver/sync_client_mock.h index 775d855a..986f2fa 100644 --- a/components/sync/driver/sync_client_mock.h +++ b/components/sync/driver/sync_client_mock.h
@@ -43,6 +43,7 @@ GetPreferenceProvider, (), (override)); + MOCK_METHOD(void, OnLocalSyncTransportDataCleared, (), (override)); private: DISALLOW_COPY_AND_ASSIGN(SyncClientMock);
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h index 026b3cd..c24eea4d 100644 --- a/components/sync/driver/sync_service.h +++ b/components/sync/driver/sync_service.h
@@ -17,7 +17,6 @@ #include "components/keyed_service/core/keyed_service.h" #include "components/sync/base/enum_set.h" #include "components/sync/base/model_type.h" -#include "components/sync/base/user_demographics.h" #include "components/sync/driver/sync_service_observer.h" struct CoreAccountInfo; @@ -371,14 +370,11 @@ // USER DEMOGRAPHICS ////////////////////////////////////////////////////////////////////////////// - // Gets the synced user’s noised birth year and gender, see doc of - // metrics::DemographicMetricsProvider in - // components/metrics/demographics/demographic_metrics_provider.h for more - // details. Returns an error status with an empty value when the user's birth - // year or gender cannot be provided. You need to provide an accurate |now| - // time that represents the current time. - virtual UserDemographicsResult GetUserNoisedBirthYearAndGender( - base::Time now) = 0; + // Returns whether sync's current state allows uploading demographics data to + // servers. + // TODO(crbug.com/1137346): Remove this API in favor of integrating with + // GetUploadToGoogleState. + virtual bool CanUploadDemographicsToGoogle() = 0; ////////////////////////////////////////////////////////////////////////////// // OBSERVERS
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc index 7a5a7e0..e9b2c2cd1 100644 --- a/components/sync/driver/test_sync_service.cc +++ b/components/sync/driver/test_sync_service.cc
@@ -39,9 +39,7 @@ : user_settings_(this), preferred_data_types_(ModelTypeSet::All()), active_data_types_(ModelTypeSet::All()), - last_cycle_snapshot_(MakeDefaultCycleSnapshot()), - user_demographics_result_(UserDemographicsResult::ForStatus( - UserDemographicsStatus::kIneligibleDemographicsData)) {} + last_cycle_snapshot_(MakeDefaultCycleSnapshot()) {} TestSyncService::~TestSyncService() = default; @@ -97,11 +95,6 @@ last_cycle_snapshot_ = snapshot; } -void TestSyncService::SetUserDemographics( - const UserDemographicsResult& user_demographics_result) { - user_demographics_result_ = user_demographics_result; -} - void TestSyncService::SetEmptyLastCycleSnapshot() { SetLastCycleSnapshot(SyncCycleSnapshot()); } @@ -138,6 +131,10 @@ user_settings_.SetIsUsingSecondaryPassphrase(enabled); } +void TestSyncService::SetCanUploadDemographicsToGoogle(bool value) { + can_upload_demographics_to_google_ = value; +} + void TestSyncService::FireStateChanged() { for (auto& observer : observers_) observer.OnStateChanged(this); @@ -298,9 +295,8 @@ const std::vector<uint8_t>& public_key, base::OnceClosure callback) {} -UserDemographicsResult TestSyncService::GetUserNoisedBirthYearAndGender( - base::Time now) { - return user_demographics_result_; +bool TestSyncService::CanUploadDemographicsToGoogle() { + return can_upload_demographics_to_google_; } void TestSyncService::Shutdown() {}
diff --git a/components/sync/driver/test_sync_service.h b/components/sync/driver/test_sync_service.h index e2f7eec..ec6d833 100644 --- a/components/sync/driver/test_sync_service.h +++ b/components/sync/driver/test_sync_service.h
@@ -40,8 +40,6 @@ void SetActiveDataTypes(const ModelTypeSet& types); void SetBackedOffDataTypes(const ModelTypeSet& types); void SetLastCycleSnapshot(const SyncCycleSnapshot& snapshot); - void SetUserDemographics( - const UserDemographicsResult& user_demographics_result); // Convenience versions of the above, for when the caller doesn't care about // the particular values in the snapshot, just whether there is one. void SetEmptyLastCycleSnapshot(); @@ -52,6 +50,7 @@ void SetTrustedVaultKeyRequired(bool required); void SetTrustedVaultKeyRequiredForPreferredDataTypes(bool required); void SetIsUsingSecondaryPassphrase(bool enabled); + void SetCanUploadDemographicsToGoogle(bool value); void FireStateChanged(); void FireSyncCycleCompleted(); @@ -108,8 +107,7 @@ const std::string& gaia_id, const std::vector<uint8_t>& public_key, base::OnceClosure callback) override; - UserDemographicsResult GetUserNoisedBirthYearAndGender( - base::Time now) override; + bool CanUploadDemographicsToGoogle() override; // KeyedService implementation. void Shutdown() override; @@ -138,7 +136,7 @@ GURL sync_service_url_; - UserDemographicsResult user_demographics_result_; + bool can_upload_demographics_to_google_ = false; DISALLOW_COPY_AND_ASSIGN(TestSyncService); };
diff --git a/components/sync/model/data_type_error_handler_mock.cc b/components/sync/model/data_type_error_handler_mock.cc deleted file mode 100644 index cd555fae..0000000 --- a/components/sync/model/data_type_error_handler_mock.cc +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/sync/model/data_type_error_handler_mock.h" - -namespace syncer { - -DataTypeErrorHandlerMock::DataTypeErrorHandlerMock() {} - -DataTypeErrorHandlerMock::~DataTypeErrorHandlerMock() { - DCHECK_EQ(SyncError::UNSET, expected_error_type_); -} - -void DataTypeErrorHandlerMock::OnUnrecoverableError(const SyncError& error) { - DCHECK_NE(SyncError::UNSET, expected_error_type_); - DCHECK(error.IsSet()); - DCHECK_EQ(expected_error_type_, error.error_type()); - expected_error_type_ = SyncError::UNSET; -} - -SyncError DataTypeErrorHandlerMock::CreateAndUploadError( - const base::Location& location, - const std::string& message, - ModelType type) { - return SyncError(location, SyncError::DATATYPE_ERROR, message, type); -} - -void DataTypeErrorHandlerMock::ExpectError(SyncError::ErrorType error_type) { - DCHECK_EQ(SyncError::UNSET, expected_error_type_); - expected_error_type_ = error_type; -} - -std::unique_ptr<DataTypeErrorHandler> DataTypeErrorHandlerMock::Copy() const { - return nullptr; -} - -} // namespace syncer
diff --git a/components/sync/model/data_type_error_handler_mock.h b/components/sync/model/data_type_error_handler_mock.h deleted file mode 100644 index 6dfc834..0000000 --- a/components/sync/model/data_type_error_handler_mock.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SYNC_MODEL_DATA_TYPE_ERROR_HANDLER_MOCK_H__ -#define COMPONENTS_SYNC_MODEL_DATA_TYPE_ERROR_HANDLER_MOCK_H__ - -#include <memory> -#include <string> - -#include "components/sync/base/model_type.h" -#include "components/sync/model/data_type_error_handler.h" - -namespace syncer { - -// A mock DataTypeErrorHandler for testing. Set the expected error type with -// ExpectError and OnUnrecoverableError will pass. If the error is not called -// this object's destructor will DCHECK. -class DataTypeErrorHandlerMock : public DataTypeErrorHandler { - public: - DataTypeErrorHandlerMock(); - ~DataTypeErrorHandlerMock() override; - - void OnUnrecoverableError(const SyncError& error) override; - SyncError CreateAndUploadError(const base::Location& location, - const std::string& message, - ModelType type) override; - std::unique_ptr<DataTypeErrorHandler> Copy() const override; - - // Set the |error_type| to expect. - void ExpectError(SyncError::ErrorType error_type); - - private: - // The error type to expect. - SyncError::ErrorType expected_error_type_ = SyncError::UNSET; -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_MODEL_DATA_TYPE_ERROR_HANDLER_MOCK_H__
diff --git a/components/sync/model/model_type_sync_bridge_unittest.cc b/components/sync/model/model_type_sync_bridge_unittest.cc index 2e073c7e..c57af72 100644 --- a/components/sync/model/model_type_sync_bridge_unittest.cc +++ b/components/sync/model/model_type_sync_bridge_unittest.cc
@@ -10,9 +10,9 @@ #include "base/bind_helpers.h" #include "components/sync/model/conflict_resolution.h" #include "components/sync/model/metadata_batch.h" -#include "components/sync/model/stub_model_type_sync_bridge.h" #include "components/sync/protocol/model_type_state.pb.h" #include "components/sync/test/model/mock_model_type_change_processor.h" +#include "components/sync/test/model/stub_model_type_sync_bridge.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc index a886d33..0a57b8c 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
@@ -25,8 +25,8 @@ #include "components/sync/engine/data_type_activation_response.h" #include "components/sync/model/conflict_resolution.h" #include "components/sync/model/data_type_activation_request.h" -#include "components/sync/model/fake_model_type_sync_bridge.h" #include "components/sync/test/engine/mock_model_type_worker.h" +#include "components/sync/test/model/fake_model_type_sync_bridge.h" #include "testing/gtest/include/gtest/gtest.h" using sync_pb::AutofillWalletSpecifics;
diff --git a/components/sync/model_impl/client_tag_based_remote_update_handler_unittest.cc b/components/sync/model_impl/client_tag_based_remote_update_handler_unittest.cc index c8169f6..6edeb93 100644 --- a/components/sync/model_impl/client_tag_based_remote_update_handler_unittest.cc +++ b/components/sync/model_impl/client_tag_based_remote_update_handler_unittest.cc
@@ -6,11 +6,11 @@ #include <utility> -#include "components/sync/model/fake_model_type_sync_bridge.h" #include "components/sync/model/metadata_batch.h" #include "components/sync/model_impl/processor_entity_tracker.h" #include "components/sync/test/engine/mock_model_type_processor.h" #include "components/sync/test/engine/mock_model_type_worker.h" +#include "components/sync/test/model/fake_model_type_sync_bridge.h" #include "components/sync/test/model/mock_model_type_change_processor.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/sync/model/fake_model_type_controller_delegate.cc b/components/sync/test/model/fake_model_type_controller_delegate.cc similarity index 97% rename from components/sync/model/fake_model_type_controller_delegate.cc rename to components/sync/test/model/fake_model_type_controller_delegate.cc index 957a0b7..3b03946 100644 --- a/components/sync/model/fake_model_type_controller_delegate.cc +++ b/components/sync/test/model/fake_model_type_controller_delegate.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/sync/model/fake_model_type_controller_delegate.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" #include <utility>
diff --git a/components/sync/model/fake_model_type_controller_delegate.h b/components/sync/test/model/fake_model_type_controller_delegate.h similarity index 90% rename from components/sync/model/fake_model_type_controller_delegate.h rename to components/sync/test/model/fake_model_type_controller_delegate.h index c283a8de..e0f8c800 100644 --- a/components/sync/model/fake_model_type_controller_delegate.h +++ b/components/sync/test/model/fake_model_type_controller_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_SYNC_MODEL_FAKE_MODEL_TYPE_CONTROLLER_DELEGATE_H_ -#define COMPONENTS_SYNC_MODEL_FAKE_MODEL_TYPE_CONTROLLER_DELEGATE_H_ +#ifndef COMPONENTS_SYNC_TEST_MODEL_FAKE_MODEL_TYPE_CONTROLLER_DELEGATE_H_ +#define COMPONENTS_SYNC_TEST_MODEL_FAKE_MODEL_TYPE_CONTROLLER_DELEGATE_H_ #include <memory> #include <string> @@ -59,4 +59,4 @@ } // namespace syncer -#endif // COMPONENTS_SYNC_MODEL_FAKE_MODEL_TYPE_CONTROLLER_DELEGATE_H_ +#endif // COMPONENTS_SYNC_TEST_MODEL_FAKE_MODEL_TYPE_CONTROLLER_DELEGATE_H_
diff --git a/components/sync/model/fake_model_type_sync_bridge.cc b/components/sync/test/model/fake_model_type_sync_bridge.cc similarity index 99% rename from components/sync/model/fake_model_type_sync_bridge.cc rename to components/sync/test/model/fake_model_type_sync_bridge.cc index 8230e4637..dc0f4bfb 100644 --- a/components/sync/model/fake_model_type_sync_bridge.cc +++ b/components/sync/test/model/fake_model_type_sync_bridge.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/sync/model/fake_model_type_sync_bridge.h" +#include "components/sync/test/model/fake_model_type_sync_bridge.h" #include <set> #include <utility> @@ -17,8 +17,8 @@ #include "components/sync/model_impl/in_memory_metadata_change_list.h" #include "testing/gtest/include/gtest/gtest.h" -using sync_pb::EntitySpecifics; using sync_pb::EntityMetadata; +using sync_pb::EntitySpecifics; using sync_pb::ModelTypeState; namespace syncer {
diff --git a/components/sync/model/fake_model_type_sync_bridge.h b/components/sync/test/model/fake_model_type_sync_bridge.h similarity index 97% rename from components/sync/model/fake_model_type_sync_bridge.h rename to components/sync/test/model/fake_model_type_sync_bridge.h index d4606095..35a0bc28 100644 --- a/components/sync/model/fake_model_type_sync_bridge.h +++ b/components/sync/test/model/fake_model_type_sync_bridge.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_SYNC_MODEL_FAKE_MODEL_TYPE_SYNC_BRIDGE_H_ -#define COMPONENTS_SYNC_MODEL_FAKE_MODEL_TYPE_SYNC_BRIDGE_H_ +#ifndef COMPONENTS_SYNC_TEST_MODEL_FAKE_MODEL_TYPE_SYNC_BRIDGE_H_ +#define COMPONENTS_SYNC_TEST_MODEL_FAKE_MODEL_TYPE_SYNC_BRIDGE_H_ #include <map> #include <memory> @@ -208,4 +208,4 @@ } // namespace syncer -#endif // COMPONENTS_SYNC_MODEL_FAKE_MODEL_TYPE_SYNC_BRIDGE_H_ +#endif // COMPONENTS_SYNC_TEST_MODEL_FAKE_MODEL_TYPE_SYNC_BRIDGE_H_
diff --git a/components/sync/model/stub_model_type_sync_bridge.cc b/components/sync/test/model/stub_model_type_sync_bridge.cc similarity index 95% rename from components/sync/model/stub_model_type_sync_bridge.cc rename to components/sync/test/model/stub_model_type_sync_bridge.cc index 9b38341..3efafff 100644 --- a/components/sync/model/stub_model_type_sync_bridge.cc +++ b/components/sync/test/model/stub_model_type_sync_bridge.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/sync/model/stub_model_type_sync_bridge.h" +#include "components/sync/test/model/stub_model_type_sync_bridge.h" #include <utility>
diff --git a/components/sync/model/stub_model_type_sync_bridge.h b/components/sync/test/model/stub_model_type_sync_bridge.h similarity index 86% rename from components/sync/model/stub_model_type_sync_bridge.h rename to components/sync/test/model/stub_model_type_sync_bridge.h index 0b8af5f..dbcdb3f 100644 --- a/components/sync/model/stub_model_type_sync_bridge.h +++ b/components/sync/test/model/stub_model_type_sync_bridge.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_SYNC_MODEL_STUB_MODEL_TYPE_SYNC_BRIDGE_H_ -#define COMPONENTS_SYNC_MODEL_STUB_MODEL_TYPE_SYNC_BRIDGE_H_ +#ifndef COMPONENTS_SYNC_TEST_MODEL_STUB_MODEL_TYPE_SYNC_BRIDGE_H_ +#define COMPONENTS_SYNC_TEST_MODEL_STUB_MODEL_TYPE_SYNC_BRIDGE_H_ #include <memory> #include <string> @@ -36,4 +36,4 @@ } // namespace syncer -#endif // COMPONENTS_SYNC_MODEL_STUB_MODEL_TYPE_SYNC_BRIDGE_H_ +#endif // COMPONENTS_SYNC_TEST_MODEL_STUB_MODEL_TYPE_SYNC_BRIDGE_H_
diff --git a/components/sync/model/test_model_type_store_service.cc b/components/sync/test/model/test_model_type_store_service.cc similarity index 93% rename from components/sync/model/test_model_type_store_service.cc rename to components/sync/test/model/test_model_type_store_service.cc index 277deef6..b5cf0ea 100644 --- a/components/sync/model/test_model_type_store_service.cc +++ b/components/sync/test/model/test_model_type_store_service.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/sync/model/test_model_type_store_service.h" +#include "components/sync/test/model/test_model_type_store_service.h" #include "base/threading/sequenced_task_runner_handle.h" #include "components/sync/model/model_type_store_test_util.h"
diff --git a/components/sync/model/test_model_type_store_service.h b/components/sync/test/model/test_model_type_store_service.h similarity index 84% rename from components/sync/model/test_model_type_store_service.h rename to components/sync/test/model/test_model_type_store_service.h index 6d71a4b..2a0389d 100644 --- a/components/sync/model/test_model_type_store_service.h +++ b/components/sync/test/model/test_model_type_store_service.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_SYNC_MODEL_TEST_MODEL_TYPE_STORE_SERVICE_H_ -#define COMPONENTS_SYNC_MODEL_TEST_MODEL_TYPE_STORE_SERVICE_H_ +#ifndef COMPONENTS_SYNC_TEST_MODEL_TEST_MODEL_TYPE_STORE_SERVICE_H_ +#define COMPONENTS_SYNC_TEST_MODEL_TEST_MODEL_TYPE_STORE_SERVICE_H_ #include <memory> @@ -38,4 +38,4 @@ } // namespace syncer -#endif // COMPONENTS_SYNC_MODEL_TEST_MODEL_TYPE_STORE_SERVICE_H_ +#endif // COMPONENTS_SYNC_TEST_MODEL_TEST_MODEL_TYPE_STORE_SERVICE_H_
diff --git a/components/sync_device_info/device_info_sync_bridge_unittest.cc b/components/sync_device_info/device_info_sync_bridge_unittest.cc index d2a5bff..c70d096 100644 --- a/components/sync_device_info/device_info_sync_bridge_unittest.cc +++ b/components/sync_device_info/device_info_sync_bridge_unittest.cc
@@ -20,7 +20,6 @@ #include "components/sync/base/time.h" #include "components/sync/model/data_batch.h" #include "components/sync/model/data_type_activation_request.h" -#include "components/sync/model/data_type_error_handler_mock.h" #include "components/sync/model/entity_data.h" #include "components/sync/model/metadata_batch.h" #include "components/sync/model/model_type_store_test_util.h"
diff --git a/components/sync_device_info/fake_device_info_sync_service.h b/components/sync_device_info/fake_device_info_sync_service.h index 884f31ada..f1a51b5 100644 --- a/components/sync_device_info/fake_device_info_sync_service.h +++ b/components/sync_device_info/fake_device_info_sync_service.h
@@ -6,7 +6,7 @@ #define COMPONENTS_SYNC_DEVICE_INFO_FAKE_DEVICE_INFO_SYNC_SERVICE_H_ #include "base/callback.h" -#include "components/sync/model/fake_model_type_controller_delegate.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" #include "components/sync_device_info/device_info_sync_service.h" #include "components/sync_device_info/fake_device_info_tracker.h" #include "components/sync_device_info/fake_local_device_info_provider.h"
diff --git a/components/sync_user_events/fake_user_event_service.h b/components/sync_user_events/fake_user_event_service.h index 5f83f7bd..7b3bee3 100644 --- a/components/sync_user_events/fake_user_event_service.h +++ b/components/sync_user_events/fake_user_event_service.h
@@ -10,8 +10,8 @@ #include <vector> #include "base/macros.h" -#include "components/sync/model/fake_model_type_controller_delegate.h" #include "components/sync/protocol/user_event_specifics.pb.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" #include "components/sync_user_events/user_event_service.h" namespace syncer {
diff --git a/components/viz/client/client_resource_provider.cc b/components/viz/client/client_resource_provider.cc index e5cc307..b25ecbc 100644 --- a/components/viz/client/client_resource_provider.cc +++ b/components/viz/client/client_resource_provider.cc
@@ -365,7 +365,7 @@ GLenum texture_target, const gfx::Size& size, ResourceFormat format, - SkSurfaceProps surface_props, + bool can_use_lcd_text, int msaa_sample_count) { GrGLTextureInfo texture_info; texture_info.fID = texture_id; @@ -373,6 +373,7 @@ texture_info.fFormat = TextureStorageFormat(format); GrBackendTexture backend_texture(size.width(), size.height(), GrMipMapped::kNo, texture_info); + SkSurfaceProps surface_props = ComputeSurfaceProps(can_use_lcd_text); // This type is used only for gpu raster, which implies gpu compositing. bool gpu_compositing = true; surface_ = SkSurface::MakeFromBackendTexture( @@ -386,6 +387,19 @@ surface_->flushAndSubmit(); } +SkSurfaceProps ClientResourceProvider::ScopedSkSurface::ComputeSurfaceProps( + bool can_use_lcd_text) { + uint32_t flags = 0; + // Use unknown pixel geometry to disable LCD text. + SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); + if (can_use_lcd_text) { + // LegacyFontHost will get LCD text and skia figures out what type to use. + surface_props = + SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); + } + return surface_props; +} + void ClientResourceProvider::ValidateResource(ResourceId id) const { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(id);
diff --git a/components/viz/client/client_resource_provider.h b/components/viz/client/client_resource_provider.h index 178b09c4..eaadace 100644 --- a/components/viz/client/client_resource_provider.h +++ b/components/viz/client/client_resource_provider.h
@@ -118,12 +118,14 @@ GLenum texture_target, const gfx::Size& size, ResourceFormat format, - SkSurfaceProps surface_props, + bool can_use_lcd_text, int msaa_sample_count); ~ScopedSkSurface(); SkSurface* surface() const { return surface_.get(); } + static SkSurfaceProps ComputeSurfaceProps(bool can_use_lcd_text); + private: sk_sp<SkSurface> surface_;
diff --git a/components/viz/common/delegated_ink_metadata.cc b/components/viz/common/delegated_ink_metadata.cc index 13c964a..3215d5c6 100644 --- a/components/viz/common/delegated_ink_metadata.cc +++ b/components/viz/common/delegated_ink_metadata.cc
@@ -12,10 +12,11 @@ std::string DelegatedInkMetadata::ToString() const { std::string str = base::StringPrintf( "point: %s, diameter: %f, color: %u, timestamp: %" PRId64 - ", presentation_area: %s", + ", presentation_area: %s, frame_time: %" PRId64, point_.ToString().c_str(), diameter_, color_, timestamp_.since_origin().InMicroseconds(), - presentation_area_.ToString().c_str()); + presentation_area_.ToString().c_str(), + frame_time_.since_origin().InMicroseconds()); return str; }
diff --git a/components/viz/common/delegated_ink_metadata.h b/components/viz/common/delegated_ink_metadata.h index 240310e..4d297f9 100644 --- a/components/viz/common/delegated_ink_metadata.h +++ b/components/viz/common/delegated_ink_metadata.h
@@ -34,6 +34,18 @@ color_(color), timestamp_(timestamp), presentation_area_(area) {} + DelegatedInkMetadata(const gfx::PointF& pt, + double diameter, + SkColor color, + base::TimeTicks timestamp, + const gfx::RectF& area, + base::TimeTicks frame_time) + : point_(pt), + diameter_(diameter), + color_(color), + timestamp_(timestamp), + presentation_area_(area), + frame_time_(frame_time) {} DelegatedInkMetadata(const DelegatedInkMetadata& other) = default; const gfx::PointF& point() const { return point_; } @@ -41,6 +53,9 @@ SkColor color() const { return color_; } base::TimeTicks timestamp() const { return timestamp_; } const gfx::RectF& presentation_area() const { return presentation_area_; } + base::TimeTicks frame_time() const { return frame_time_; } + + void set_frame_time(base::TimeTicks frame_time) { frame_time_ = frame_time; } std::string ToString() const; @@ -59,6 +74,9 @@ // The rect to clip the ink trail to, defaults to the containing viewport. gfx::RectF presentation_area_; + + // Frame time of the layer tree that this metadata is on. + base::TimeTicks frame_time_; }; } // namespace viz
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index 5daaddd6..ed87fd5 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -202,7 +202,6 @@ "//media/mojo/services", "//services/tracing/public/cpp:cpp", "//services/viz/privileged/mojom", - "//skia", "//skia:skcms", "//third_party/libyuv", "//ui/display/types",
diff --git a/components/viz/service/DEPS b/components/viz/service/DEPS index 7162bc5c..9adce7e 100644 --- a/components/viz/service/DEPS +++ b/components/viz/service/DEPS
@@ -10,7 +10,6 @@ "+gpu/ipc/common/surface_handle.h", "+services/viz/privileged/mojom", "+services/viz/public/mojom", - "+skia/ext", "+third_party/skia", "+ui/latency", "+ui/ozone/public",
diff --git a/components/viz/service/display/delegated_ink_point_pixel_test_helper.cc b/components/viz/service/display/delegated_ink_point_pixel_test_helper.cc index 2d39446..c1a587c 100644 --- a/components/viz/service/display/delegated_ink_point_pixel_test_helper.cc +++ b/components/viz/service/display/delegated_ink_point_pixel_test_helper.cc
@@ -38,8 +38,9 @@ SkColor color, const gfx::RectF& presentation_area) { DCHECK(renderer_); - metadata_ = DelegatedInkMetadata(point, diameter, color, - base::TimeTicks::Now(), presentation_area); + metadata_ = + DelegatedInkMetadata(point, diameter, color, base::TimeTicks::Now(), + presentation_area, base::TimeTicks::Now()); GetInkRenderer()->SetDelegatedInkMetadata( std::make_unique<DelegatedInkMetadata>(metadata_)); } @@ -48,7 +49,8 @@ DCHECK(renderer_); metadata_ = DelegatedInkMetadata( ink_points_.back().point(), metadata_.diameter(), metadata_.color(), - ink_points_.back().timestamp(), metadata_.presentation_area()); + ink_points_.back().timestamp(), metadata_.presentation_area(), + metadata_.frame_time()); GetInkRenderer()->SetDelegatedInkMetadata( std::make_unique<DelegatedInkMetadata>(metadata_)); }
diff --git a/components/viz/service/display/delegated_ink_point_renderer_base.cc b/components/viz/service/display/delegated_ink_point_renderer_base.cc index e0e4403..05032e47 100644 --- a/components/viz/service/display/delegated_ink_point_renderer_base.cc +++ b/components/viz/service/display/delegated_ink_point_renderer_base.cc
@@ -27,6 +27,14 @@ receiver_.Bind(std::move(receiver)); } +void DelegatedInkPointRendererBase::SetDelegatedInkMetadata( + std::unique_ptr<DelegatedInkMetadata> metadata) { + // Frame time is set later than everything else due to what is available + // at time of creation, so confirm that it was actually set. + DCHECK_NE(metadata->frame_time(), base::TimeTicks()); + metadata_ = std::move(metadata); +} + std::vector<DelegatedInkPoint> DelegatedInkPointRendererBase::FilterPoints() { if (points_.size() == 0) return {};
diff --git a/components/viz/service/display/delegated_ink_point_renderer_base.h b/components/viz/service/display/delegated_ink_point_renderer_base.h index 5f951eb..9ef14e5 100644 --- a/components/viz/service/display/delegated_ink_point_renderer_base.h +++ b/components/viz/service/display/delegated_ink_point_renderer_base.h
@@ -42,9 +42,7 @@ mojo::PendingReceiver<mojom::DelegatedInkPointRenderer> receiver); void StoreDelegatedInkPoint(const DelegatedInkPoint& point) override; - void SetDelegatedInkMetadata(std::unique_ptr<DelegatedInkMetadata> metadata) { - metadata_ = std::move(metadata); - } + void SetDelegatedInkMetadata(std::unique_ptr<DelegatedInkMetadata> metadata); virtual void FinalizePathForDraw() = 0; virtual gfx::Rect GetDamageRect() = 0;
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc index ab6e02a..0b41661 100644 --- a/components/viz/service/display/display_unittest.cc +++ b/components/viz/service/display/display_unittest.cc
@@ -4563,7 +4563,7 @@ DelegatedInkMetadata metadata(ink_points_[index].point(), diameter, color, ink_points_[index].timestamp(), - presentation_area); + presentation_area, base::TimeTicks::Now()); SendMetadata(metadata); return metadata; }
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc index 106f5634..aac9365 100644 --- a/components/viz/service/display/renderer_pixeltest.cc +++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -3541,7 +3541,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(32, 32); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); gfx::Size tile_size(32, 32); @@ -4006,7 +4006,7 @@ SkImageInfo info = SkImageInfo::Make(2, 2, ct, kPremul_SkAlphaType); SkBitmap bitmap; bitmap.allocPixels(info); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); draw_point_color(&canvas, 0, 0, SK_ColorGREEN); draw_point_color(&canvas, 0, 1, SK_ColorBLUE); draw_point_color(&canvas, 1, 0, SK_ColorBLUE); @@ -4061,7 +4061,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(2, 2); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); draw_point_color(&canvas, 0, 0, SK_ColorGREEN); draw_point_color(&canvas, 0, 1, SK_ColorBLUE); draw_point_color(&canvas, 1, 0, SK_ColorBLUE); @@ -4113,7 +4113,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(2, 2); { - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); draw_point_color(&canvas, 0, 0, SK_ColorGREEN); draw_point_color(&canvas, 0, 1, SK_ColorBLUE); draw_point_color(&canvas, 1, 0, SK_ColorBLUE); @@ -4459,7 +4459,7 @@ SkBitmap bitmap; bitmap.allocPixels( SkImageInfo::MakeN32Premul(mask_rect.width(), mask_rect.height())); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); paint.setStrokeWidth(SkIntToScalar(4)); @@ -4541,7 +4541,7 @@ // layer rect red. SkBitmap bitmap; bitmap.allocN32Pixels(tile_size.width(), tile_size.height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); SkPaint red; red.setColor(SK_ColorRED); canvas.drawRect(SkRect::MakeWH(tile_size.width(), tile_size.height()), red);
diff --git a/components/viz/service/display/software_output_device.cc b/components/viz/service/display/software_output_device.cc index 0ac4106..73e22fb8 100644 --- a/components/viz/service/display/software_output_device.cc +++ b/components/viz/service/display/software_output_device.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/check.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/gfx/vsync_provider.h" @@ -39,8 +38,7 @@ SkImageInfo::MakeN32(viewport_pixel_size.width(), viewport_pixel_size.height(), kOpaque_SkAlphaType); viewport_pixel_size_ = viewport_pixel_size; - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - surface_ = SkSurface::MakeRaster(info, &props); + surface_ = SkSurface::MakeRaster(info); } SkCanvas* SoftwareOutputDevice::BeginPaint(const gfx::Rect& damage_rect) {
diff --git a/components/viz/service/display/software_renderer.cc b/components/viz/service/display/software_renderer.cc index bf14c42..a7db4ee 100644 --- a/components/viz/service/display/software_renderer.cc +++ b/components/viz/service/display/software_renderer.cc
@@ -30,7 +30,6 @@ #include "components/viz/service/display/renderer_utils.h" #include "components/viz/service/display/software_output_device.h" #include "skia/ext/image_operations.h" -#include "skia/ext/legacy_display_globals.h" #include "skia/ext/opacity_filter_canvas.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" @@ -147,8 +146,7 @@ DCHECK(it != render_pass_bitmaps_.end()); SkBitmap& bitmap = it->second; - current_framebuffer_canvas_ = std::make_unique<SkCanvas>( - bitmap, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + current_framebuffer_canvas_ = std::make_unique<SkCanvas>(bitmap); current_canvas_ = current_framebuffer_canvas_.get(); } @@ -878,7 +876,7 @@ if (!bitmap.tryAllocPixels(info)) base::TerminateBecauseOutOfMemory(info.computeMinByteSize()); - SkCanvas canvas(bitmap, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(bitmap); // Clip the filtered image to the (rounded) bounding box of the element. if (backdrop_filter_bounds) {
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc index c4dbdd5..0db4f9f 100644 --- a/components/viz/service/display/surface_aggregator.cc +++ b/components/viz/service/display/surface_aggregator.cc
@@ -1224,11 +1224,6 @@ if (in_moved_pixel_rp) moved_pixel_passes_.insert(remapped_pass_id); - gfx::Transform root_to_target_transform(gfx::Transform::kSkipInitialization); - const bool transform_inverted = - target_to_root_transform.GetInverse(&root_to_target_transform); - DCHECK(transform_inverted); - const CompositorFrame& frame = surface->GetActiveFrame(); CompositorRenderPass* last_pass = frame.render_pass_list.back().get(); gfx::Rect full_damage = last_pass->output_rect; @@ -1240,8 +1235,12 @@ gfx::Rect surface_root_rp_damage = DamageRectForSurface(surface, *last_pass, full_damage); if (!surface_root_rp_damage.IsEmpty()) { - surface_root_rp_damage = cc::MathUtil::ProjectEnclosingClippedRect( - root_to_target_transform, surface_root_rp_damage); + gfx::Transform root_to_target_transform( + gfx::Transform::kSkipInitialization); + if (target_to_root_transform.GetInverse(&root_to_target_transform)) { + surface_root_rp_damage = cc::MathUtil::ProjectEnclosingClippedRect( + root_to_target_transform, surface_root_rp_damage); + } } gfx::Rect damage_rect; @@ -1896,7 +1895,7 @@ parent_quad_to_root_target_transform.TransformRect(&area); delegated_ink_metadata_ = std::make_unique<DelegatedInkMetadata>( point, metadata->diameter(), metadata->color(), metadata->timestamp(), - area); + area, metadata->frame_time()); TRACE_EVENT_INSTANT2( "viz", "SurfaceAggregator::TransformAndStoreDelegatedInkMetadata",
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc index 77e457b..443abe64 100644 --- a/components/viz/service/display/surface_aggregator_unittest.cc +++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -8210,6 +8210,7 @@ rhs.presentation_area().width()); EXPECT_FLOAT_EQ(lhs.presentation_area().height(), rhs.presentation_area().height()); + EXPECT_EQ(lhs.frame_time(), rhs.frame_time()); } // Basic test to confirm that ink metadata on a child surface will be @@ -8221,9 +8222,9 @@ Pass(child_quads, CompositorRenderPassId{1}, gfx::Size(100, 100))}; CompositorFrame child_frame = MakeEmptyCompositorFrame(); - DelegatedInkMetadata metadata(gfx::PointF(100, 100), 1.5, SK_ColorRED, - base::TimeTicks::Now(), - gfx::RectF(10, 10, 200, 200)); + DelegatedInkMetadata metadata( + gfx::PointF(100, 100), 1.5, SK_ColorRED, base::TimeTicks::Now(), + gfx::RectF(10, 10, 200, 200), base::TimeTicks::Now()); child_frame.metadata.delegated_ink_metadata = std::make_unique<DelegatedInkMetadata>(metadata); AddPasses(&child_frame.render_pass_list, child_passes, @@ -8266,8 +8267,9 @@ root_frame.render_pass_list[0] ->shared_quad_state_list.ElementAt(0) ->quad_to_target_transform.TransformRect(&area); - metadata = DelegatedInkMetadata(pt, metadata.diameter(), metadata.color(), - metadata.timestamp(), area); + metadata = + DelegatedInkMetadata(pt, metadata.diameter(), metadata.color(), + metadata.timestamp(), area, metadata.frame_time()); root_sink_->SubmitCompositorFrame(root_local_surface_id_, std::move(root_frame)); @@ -8298,9 +8300,9 @@ std::vector<Pass> greatgrandchild_passes = {Pass( greatgrandchild_quads, CompositorRenderPassId{1}, gfx::Size(100, 100))}; - DelegatedInkMetadata metadata(gfx::PointF(100, 100), 1.5, SK_ColorRED, - base::TimeTicks::Now(), - gfx::RectF(10, 10, 200, 200)); + DelegatedInkMetadata metadata( + gfx::PointF(100, 100), 1.5, SK_ColorRED, base::TimeTicks::Now(), + gfx::RectF(10, 10, 200, 200), base::TimeTicks::Now()); CompositorFrame greatgrandchild_frame = MakeEmptyCompositorFrame(); greatgrandchild_frame.metadata.delegated_ink_metadata = std::make_unique<DelegatedInkMetadata>(metadata); @@ -8419,8 +8421,9 @@ root_local_surface_id_); auto aggregated_frame = AggregateFrame(root_surface_id); - metadata = DelegatedInkMetadata(pt, metadata.diameter(), metadata.color(), - metadata.timestamp(), area); + metadata = + DelegatedInkMetadata(pt, metadata.diameter(), metadata.color(), + metadata.timestamp(), area, metadata.frame_time()); std::unique_ptr<DelegatedInkMetadata> actual_metadata = std::move(aggregated_frame.delegated_ink_metadata); @@ -8467,7 +8470,7 @@ DelegatedInkMetadata metadata = DelegatedInkMetadata( gfx::PointF(88, 34), 1.8, SK_ColorBLACK, base::TimeTicks::Now(), - gfx::RectF(50, 50, 300, 300)); + gfx::RectF(50, 50, 300, 300), base::TimeTicks::Now()); CompositorFrame child_2_frame = MakeEmptyCompositorFrame(); child_2_frame.metadata.delegated_ink_metadata = std::make_unique<DelegatedInkMetadata>(metadata); @@ -8550,8 +8553,9 @@ root_local_surface_id_); auto aggregated_frame = AggregateFrame(root_surface_id); - metadata = DelegatedInkMetadata(pt, metadata.diameter(), metadata.color(), - metadata.timestamp(), area); + metadata = + DelegatedInkMetadata(pt, metadata.diameter(), metadata.color(), + metadata.timestamp(), area, metadata.frame_time()); std::unique_ptr<DelegatedInkMetadata> actual_metadata = std::move(aggregated_frame.delegated_ink_metadata); @@ -8603,11 +8607,12 @@ // issues with both metadatas sometimes having the same time in Release. DelegatedInkMetadata early_metadata = DelegatedInkMetadata( gfx::PointF(88, 34), 1.8, SK_ColorBLACK, base::TimeTicks::Now(), - gfx::RectF(50, 50, 300, 300)); + gfx::RectF(50, 50, 300, 300), base::TimeTicks::Now()); DelegatedInkMetadata later_metadata = DelegatedInkMetadata( gfx::PointF(92, 35), 0.08, SK_ColorYELLOW, base::TimeTicks::Now() + base::TimeDelta::FromMicroseconds(50), - gfx::RectF(35, 55, 128, 256)); + gfx::RectF(35, 55, 128, 256), + base::TimeTicks::Now() + base::TimeDelta::FromMicroseconds(52)); CompositorFrame child_2_frame = MakeEmptyCompositorFrame(); child_2_frame.metadata.delegated_ink_metadata = @@ -8696,7 +8701,7 @@ DelegatedInkMetadata expected_metadata = DelegatedInkMetadata( pt, later_metadata.diameter(), later_metadata.color(), - later_metadata.timestamp(), area); + later_metadata.timestamp(), area, later_metadata.frame_time()); std::unique_ptr<DelegatedInkMetadata> actual_metadata = std::move(aggregated_frame.delegated_ink_metadata); @@ -8719,9 +8724,9 @@ Pass(child_quads, CompositorRenderPassId{1}, gfx::Size(100, 100))}; CompositorFrame child_frame = MakeEmptyCompositorFrame(); - DelegatedInkMetadata metadata(gfx::PointF(34, 89), 1.597, SK_ColorBLUE, - base::TimeTicks::Now(), - gfx::RectF(2.3, 3.2, 177, 212)); + DelegatedInkMetadata metadata( + gfx::PointF(34, 89), 1.597, SK_ColorBLUE, base::TimeTicks::Now(), + gfx::RectF(2.3, 3.2, 177, 212), base::TimeTicks::Now()); child_frame.metadata.delegated_ink_metadata = std::make_unique<DelegatedInkMetadata>(metadata); AddPasses(&child_frame.render_pass_list, child_passes,
diff --git a/components/viz/service/display_embedder/output_presenter.cc b/components/viz/service/display_embedder/output_presenter.cc index 48710f3b..a1ea3f8 100644 --- a/components/viz/service/display_embedder/output_presenter.cc +++ b/components/viz/service/display_embedder/output_presenter.cc
@@ -9,7 +9,6 @@ #include "components/viz/service/display_embedder/skia_output_surface_dependency.h" #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image_factory.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/gpu/GrBackendSemaphore.h" #include "third_party/skia/include/gpu/GrDirectContext.h" @@ -53,8 +52,9 @@ DCHECK(end_semaphores_.empty()); std::vector<GrBackendSemaphore> begin_semaphores; - SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + // LegacyFontHost will get LCD text and skia figures out what type to use. + SkSurfaceProps surface_props(0 /* flags */, + SkSurfaceProps::kLegacyFontHost_InitType); // Buffer queue is internal to GPU proc and handles texture initialization, // so allow uncleared access.
diff --git a/components/viz/service/display_embedder/skia_output_device_dawn.cc b/components/viz/service/display_embedder/skia_output_device_dawn.cc index 3a6daaa..8da1084 100644 --- a/components/viz/service/display_embedder/skia_output_device_dawn.cc +++ b/components/viz/service/display_embedder/skia_output_device_dawn.cc
@@ -9,7 +9,6 @@ #include "base/check_op.h" #include "base/notreached.h" #include "components/viz/common/gpu/dawn_context_provider.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/dawn/src/include/dawn_native/D3D12Backend.h" #include "ui/gfx/presentation_feedback.h" #include "ui/gfx/vsync_provider.h" @@ -123,8 +122,9 @@ GrBackendRenderTarget backend_target( size_.width(), size_.height(), /*sampleCnt=*/0, /*stencilBits=*/0, info); DCHECK(backend_target.isValid()); - SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + // LegacyFontHost will get LCD text and skia figures out what type to use. + SkSurfaceProps surface_props(/*flags=*/0, + SkSurfaceProps::kLegacyFontHost_InitType); sk_surface_ = SkSurface::MakeFromBackendRenderTarget( context_provider_->GetGrContext(), backend_target, capabilities_.output_surface_origin == gfx::SurfaceOrigin::kTopLeft
diff --git a/components/viz/service/display_embedder/skia_output_device_gl.cc b/components/viz/service/display_embedder/skia_output_device_gl.cc index 24977c9..10b989a 100644 --- a/components/viz/service/display_embedder/skia_output_device_gl.cc +++ b/components/viz/service/display_embedder/skia_output_device_gl.cc
@@ -19,7 +19,6 @@ #include "gpu/command_buffer/service/shared_image_factory.h" #include "gpu/command_buffer/service/texture_base.h" #include "gpu/command_buffer/service/texture_manager.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkSurfaceProps.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" @@ -220,7 +219,7 @@ return false; } SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + SkSurfaceProps(0, SkSurfaceProps::kLegacyFontHost_InitType); GrGLFramebufferInfo framebuffer_info; framebuffer_info.fFBOID = 0;
diff --git a/components/viz/service/display_embedder/skia_output_device_offscreen.cc b/components/viz/service/display_embedder/skia_output_device_offscreen.cc index 1c57be3e..a6948f6 100644 --- a/components/viz/service/display_embedder/skia_output_device_offscreen.cc +++ b/components/viz/service/display_embedder/skia_output_device_offscreen.cc
@@ -7,7 +7,6 @@ #include <utility> #include "gpu/command_buffer/service/skia_utils.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkSurface.h" namespace viz { @@ -137,8 +136,9 @@ std::vector<GrBackendSemaphore>* end_semaphores) { DCHECK(backend_texture_.isValid()); if (!sk_surface_) { - SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + // LegacyFontHost will get LCD text and skia figures out what type to use. + SkSurfaceProps surface_props(0 /* flags */, + SkSurfaceProps::kLegacyFontHost_InitType); sk_surface_ = SkSurface::MakeFromBackendTexture( context_state_->gr_context(), backend_texture_, capabilities_.output_surface_origin == gfx::SurfaceOrigin::kTopLeft
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan.cc b/components/viz/service/display_embedder/skia_output_device_vulkan.cc index f9239300..12cfa7dd 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan.cc
@@ -18,7 +18,6 @@ #include "gpu/vulkan/vulkan_function_pointers.h" #include "gpu/vulkan/vulkan_implementation.h" #include "gpu/vulkan/vulkan_surface.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/GrBackendSemaphore.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" @@ -192,7 +191,7 @@ if (UNLIKELY(!sk_surface)) { SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + SkSurfaceProps(0, SkSurfaceProps::kLegacyFontHost_InitType); const auto surface_format = vulkan_surface_->surface_format().format; DCHECK(surface_format == VK_FORMAT_B8G8R8A8_UNORM || surface_format == VK_FORMAT_R8G8B8A8_UNORM);
diff --git a/components/viz/service/display_embedder/skia_output_device_webview.cc b/components/viz/service/display_embedder/skia_output_device_webview.cc index a4af3e19..74f8c33 100644 --- a/components/viz/service/display_embedder/skia_output_device_webview.cc +++ b/components/viz/service/display_embedder/skia_output_device_webview.cc
@@ -9,7 +9,6 @@ #include "gpu/command_buffer/common/swap_buffers_complete_params.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/shared_context_state.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkSurface.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gl/gl_bindings.h" @@ -100,7 +99,7 @@ last_frame_buffer_object_ = fbo; SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + SkSurfaceProps(0, SkSurfaceProps::kLegacyFontHost_InitType); GrGLFramebufferInfo framebuffer_info; framebuffer_info.fFBOID = fbo;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc index 4297765..cc3766bb 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -33,7 +33,6 @@ #include "gpu/ipc/single_task_sequence.h" #include "gpu/vulkan/buildflags.h" #include "skia/buildflags.h" -#include "skia/ext/legacy_display_globals.h" #include "ui/gfx/skia_util.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_gl_api_implementation.h" @@ -534,7 +533,6 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); // Make sure there is no unsubmitted PaintFrame or PaintRenderPass. DCHECK(!current_paint_); - DCHECK(resource_sync_tokens_.empty()); SkSurfaceCharacterization characterization = CreateSkSurfaceCharacterization( size, BufferFormat(format), mipmap, std::move(color_space), @@ -719,6 +717,11 @@ [](const CALayerOverlay& overlay) { return !!overlay.ddl; }) != overlays.end(); + // Append |resource_sync_tokens_| which are depended by drawing render passes + // to overlay backings. + std::move(resource_sync_tokens_.begin(), resource_sync_tokens_.end(), + std::back_inserter(sync_tokens)); + resource_sync_tokens_.clear(); #else bool make_current = false; #endif @@ -842,8 +845,9 @@ return SkSurfaceCharacterization(); auto cache_max_resource_bytes = impl_on_gpu_->max_resource_cache_bytes(); - SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + // LegacyFontHost will get LCD text and skia figures out what type to use. + SkSurfaceProps surface_props(0 /*flags */, + SkSurfaceProps::kLegacyFontHost_InitType); if (is_root_render_pass) { const auto format_index = static_cast<int>(format); const auto& color_type = capabilities_.sk_color_types[format_index];
diff --git a/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc b/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc index 33a1f3f..3f288ed5 100644 --- a/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc +++ b/components/viz/service/frame_sinks/video_capture/video_capture_overlay_unittest.cc
@@ -98,7 +98,7 @@ kTestImageSize.width(), kTestImageSize.height(), GetLinearSRGB().ToSkColorSpace()); CHECK(result.tryAllocPixels(info, info.minRowBytes())); - SkCanvas canvas(result, SkSurfaceProps{}); + SkCanvas canvas(result); canvas.drawColor(kTestImageBackground); for (size_t i = 0; i < base::size(kTestImageColors); ++i) { const size_t idx = (i + cycle) % base::size(kTestImageColors);
diff --git a/components/viz/service/main/viz_main_impl.cc b/components/viz/service/main/viz_main_impl.cc index c14240c3..9db285f4 100644 --- a/components/viz/service/main/viz_main_impl.cc +++ b/components/viz/service/main/viz_main_impl.cc
@@ -23,7 +23,7 @@ #include "media/gpu/buildflags.h" #include "services/metrics/public/cpp/delegating_ukm_recorder.h" #include "services/metrics/public/cpp/mojo_ukm_recorder.h" -#include "skia/ext/legacy_display_globals.h" +#include "third_party/skia/include/core/SkFontLCDConfig.h" namespace { @@ -166,8 +166,11 @@ discardable_shared_memory_manager_.get()); } - skia::LegacyDisplayGlobals::SetCachedPixelGeometry( - gfx::FontRenderParams::SubpixelRenderingToSkiaPixelGeometry( + SkFontLCDConfig::SetSubpixelOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + subpixel_rendering)); + SkFontLCDConfig::SetSubpixelOrientation( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( subpixel_rendering)); gpu_service_->Bind(std::move(pending_receiver));
diff --git a/components/viz/test/data/backdrop_filter_blur_radius_skia_dawn.png b/components/viz/test/data/backdrop_filter_blur_radius_skia_dawn.png index 43264078..5d14ba8 100644 --- a/components/viz/test/data/backdrop_filter_blur_radius_skia_dawn.png +++ b/components/viz/test/data/backdrop_filter_blur_radius_skia_dawn.png Binary files differ
diff --git a/components/viz/test/data/backdrop_filter_rotated_skia_dawn.png b/components/viz/test/data/backdrop_filter_rotated_skia_dawn.png index 4c1f61a0..9d3af379 100644 --- a/components/viz/test/data/backdrop_filter_rotated_skia_dawn.png +++ b/components/viz/test/data/backdrop_filter_rotated_skia_dawn.png Binary files differ
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index e181d51..9ffd33a 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -1611,6 +1611,8 @@ "service_worker/service_worker_fetch_dispatcher.h", "service_worker/service_worker_host.cc", "service_worker/service_worker_host.h", + "service_worker/service_worker_identifiability_metrics.cc", + "service_worker/service_worker_identifiability_metrics.h", "service_worker/service_worker_info.cc", "service_worker/service_worker_info.h", "service_worker/service_worker_installed_script_loader.cc",
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_mac.mm index 5792496..b41aef4 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm +++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
@@ -498,7 +498,13 @@ continue; } - // Special processing for position and size. + // Special case: children. + // Children are used to generate the tree + // itself, thus no sense to expose them on each node. + if (item.first == kChildrenDictAttr) { + continue; + } + // Special case: position. if (item.first == kPositionDictAttr) { WriteAttribute(false, FormatCoordinates( @@ -507,6 +513,7 @@ &line); continue; } + // Special case: size. if (item.first == kSizeDictAttr) { WriteAttribute( false,
diff --git a/content/browser/indexed_db/indexed_db_origin_state.cc b/content/browser/indexed_db/indexed_db_origin_state.cc index 4f63b3f..c065df2 100644 --- a/content/browser/indexed_db/indexed_db_origin_state.cc +++ b/content/browser/indexed_db/indexed_db_origin_state.cc
@@ -184,6 +184,16 @@ backing_store_->active_blob_registry()->ForceShutdown(); has_blobs_outstanding_ = false; } + + // Don't run the preclosing tasks after a ForceClose, whether or not we've + // started them. Compaction in particular can run long and cannot be + // interrupted, so it can cause shutdown hangs. + close_timer_.AbandonAndStop(); + if (pre_close_task_queue_) { + pre_close_task_queue_->Stop( + IndexedDBPreCloseTaskQueue::StopReason::FORCE_CLOSE); + pre_close_task_queue_.reset(); + } skip_closing_sequence_ = true; } @@ -242,7 +252,8 @@ closing_stage_ = ClosingState::kNotClosing; close_timer_.AbandonAndStop(); if (pre_close_task_queue_) { - pre_close_task_queue_->StopForNewConnection(); + pre_close_task_queue_->Stop( + IndexedDBPreCloseTaskQueue::StopReason::NEW_CONNECTION); pre_close_task_queue_.reset(); } }
diff --git a/content/browser/indexed_db/indexed_db_pre_close_task_queue.cc b/content/browser/indexed_db/indexed_db_pre_close_task_queue.cc index 976af6d..71c76559 100644 --- a/content/browser/indexed_db/indexed_db_pre_close_task_queue.cc +++ b/content/browser/indexed_db/indexed_db_pre_close_task_queue.cc
@@ -40,12 +40,12 @@ task_runner_(base::SequencedTaskRunnerHandle::Get()) {} IndexedDBPreCloseTaskQueue::~IndexedDBPreCloseTaskQueue() = default; -void IndexedDBPreCloseTaskQueue::StopForNewConnection() { +void IndexedDBPreCloseTaskQueue::Stop(StopReason reason) { if (!started_ || done_) return; DCHECK(!tasks_.empty()); while (!tasks_.empty()) { - tasks_.front()->Stop(StopReason::NEW_CONNECTION); + tasks_.front()->Stop(reason); tasks_.pop_front(); } OnComplete();
diff --git a/content/browser/indexed_db/indexed_db_pre_close_task_queue.h b/content/browser/indexed_db/indexed_db_pre_close_task_queue.h index eec9bb7..776c7e73 100644 --- a/content/browser/indexed_db/indexed_db_pre_close_task_queue.h +++ b/content/browser/indexed_db/indexed_db_pre_close_task_queue.h
@@ -48,6 +48,8 @@ TIMEOUT, // There was an error reading the database metadata. METADATA_ERROR, + // Force closed due to shutdown. + FORCE_CLOSE, }; // Defines a task that will be run after closing an IndexedDB backing store @@ -103,7 +105,7 @@ // Stops all tasks and destroys them. The |on_complete| callback will be // immediately called. - void StopForNewConnection(); + void Stop(StopReason reason); // Starts running tasks. Can only be called once. MetadataFetcher is expected // to load the metadata from the database on disk.
diff --git a/content/browser/indexed_db/indexed_db_pre_close_task_queue_unittest.cc b/content/browser/indexed_db/indexed_db_pre_close_task_queue_unittest.cc index ae68442..990cc182 100644 --- a/content/browser/indexed_db/indexed_db_pre_close_task_queue_unittest.cc +++ b/content/browser/indexed_db/indexed_db_pre_close_task_queue_unittest.cc
@@ -244,7 +244,7 @@ EXPECT_CALL(*task1, Stop(StopReason::NEW_CONNECTION)); EXPECT_CALL(*task2, Stop(StopReason::NEW_CONNECTION)); - queue.StopForNewConnection(); + queue.Stop(StopReason::NEW_CONNECTION); task_environment_.RunUntilIdle(); @@ -284,7 +284,7 @@ EXPECT_CALL(*task, Stop(StopReason::NEW_CONNECTION)); - queue.StopForNewConnection(); + queue.Stop(StopReason::NEW_CONNECTION); task_environment_.RunUntilIdle(); @@ -326,7 +326,7 @@ EXPECT_CALL(*task2, Stop(StopReason::NEW_CONNECTION)); - queue.StopForNewConnection(); + queue.Stop(StopReason::NEW_CONNECTION); task_environment_.RunUntilIdle();
diff --git a/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc b/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc index c1a7e79..5976b4b0 100644 --- a/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc +++ b/content/browser/indexed_db/indexed_db_tombstone_sweeper.cc
@@ -163,6 +163,10 @@ case StopReason::METADATA_ERROR: NOTREACHED(); break; + case StopReason::FORCE_CLOSE: + uma_count_label.append("ForceClose"); + uma_size_label.append("ForceClose"); + break; } } else if (status) { switch (status.value()) {
diff --git a/content/browser/loader/quic_transport_browsertest.cc b/content/browser/loader/quic_transport_browsertest.cc index dc494a2..27aa21c 100644 --- a/content/browser/loader/quic_transport_browsertest.cc +++ b/content/browser/loader/quic_transport_browsertest.cc
@@ -17,6 +17,7 @@ #include "base/test/bind_test_util.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" +#include "build/build_config.h" #include "components/network_session_configurator/common/network_switches.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" @@ -276,7 +277,13 @@ ASSERT_TRUE(WaitForTitle(ASCIIToUTF16("PASS"), {ASCIIToUTF16("FAIL")})); } -IN_PROC_BROWSER_TEST_F(QuicTransportBrowserTest, ReceiveStream) { +#if defined(OS_WIN) +// ReceiveStream is flaky on Windows: crbug.com/1140193. +#define MAYBE_ReceiveStream DISABLED_ReceiveStream +#else +#define MAYBE_ReceiveStream ReceiveStream +#endif +IN_PROC_BROWSER_TEST_F(QuicTransportBrowserTest, MAYBE_ReceiveStream) { ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE( NavigateToURL(shell(), embedded_test_server()->GetURL("/title2.html")));
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.cc b/content/browser/renderer_host/agent_scheduling_group_host.cc index da6b9f8..337b39f 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.cc +++ b/content/browser/renderer_host/agent_scheduling_group_host.cc
@@ -251,9 +251,13 @@ mojo_remote_.get()->CreateView(std::move(params)); } -void AgentSchedulingGroupHost::DestroyView(int32_t routing_id) { +void AgentSchedulingGroupHost::DestroyView( + int32_t routing_id, + mojom::AgentSchedulingGroup::DestroyViewCallback callback) { if (mojo_remote_.is_bound()) - mojo_remote_.get()->DestroyView(routing_id); + mojo_remote_.get()->DestroyView(routing_id, std::move(callback)); + else + std::move(callback).Run(); } void AgentSchedulingGroupHost::CreateFrameProxy(
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.h b/content/browser/renderer_host/agent_scheduling_group_host.h index 4d13d699..3a3a2fd 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.h +++ b/content/browser/renderer_host/agent_scheduling_group_host.h
@@ -80,7 +80,8 @@ mojom::RouteProvider* GetRemoteRouteProvider(); void CreateFrame(mojom::CreateFrameParamsPtr params); void CreateView(mojom::CreateViewParamsPtr params); - void DestroyView(int32_t routing_id); + void DestroyView(int32_t routing_id, + mojom::AgentSchedulingGroup::DestroyViewCallback callback); void CreateFrameProxy( int32_t routing_id, int32_t render_view_routing_id,
diff --git a/content/browser/renderer_host/input/wheel_scroll_latching_browsertest.cc b/content/browser/renderer_host/input/wheel_scroll_latching_browsertest.cc index 5ff317d..e095c71 100644 --- a/content/browser/renderer_host/input/wheel_scroll_latching_browsertest.cc +++ b/content/browser/renderer_host/input/wheel_scroll_latching_browsertest.cc
@@ -3,7 +3,9 @@ // found in the LICENSE file. #include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "cc/base/features.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_input_event_router.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -146,6 +148,10 @@ #define MAYBE_WheelEventTarget WheelEventTarget #endif IN_PROC_BROWSER_TEST_F(WheelScrollLatchingBrowserTest, MAYBE_WheelEventTarget) { + base::FeatureList::ScopedDisallowOverrides disallow_feature_overrides( + nullptr); + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(::features::kWheelEventRegions); LoadURL(kWheelEventLatchingDataURL); EXPECT_EQ(0, ExecuteScriptAndExtractInt("documentWheelEventCounter")); EXPECT_EQ(0, ExecuteScriptAndExtractInt("scrollableDivWheelEventCounter"));
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 510e880..edd9aa8 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -3209,6 +3209,11 @@ } } + // Generate a UKM source and track it on NavigationRequest. This will be + // passed down to the blink::Document to be created, if any, and used for UKM + // source creation when navigation has successfully committed. + commit_params_->document_ukm_source_id = ukm::UkmRecorder::GetNewSourceID(); + blink::mojom::ServiceWorkerContainerInfoForClientPtr service_worker_container_info; if (service_worker_handle_) { @@ -3222,7 +3227,8 @@ render_frame_host_->GetProcess()->GetID(), render_frame_host_->GetRoutingID(), render_frame_host_->cross_origin_embedder_policy(), - std::move(reporter_remote), &service_worker_container_info); + std::move(reporter_remote), &service_worker_container_info, + commit_params_->document_ukm_source_id); } if (web_bundle_handle_) { @@ -3247,11 +3253,6 @@ GetStartingSiteInstance()); } - // Generate a UKM source and track it on NavigationRequest. This will be - // passed down to the blink::Document to be created, if any, and used for UKM - // source creation when navigation has successfully committed. - commit_params_->document_ukm_source_id = ukm::UkmRecorder::GetNewSourceID(); - auto common_params = common_params_->Clone(); auto commit_params = commit_params_.Clone(); auto response_head = response_head_.Clone();
diff --git a/content/browser/renderer_host/render_frame_host_delegate.h b/content/browser/renderer_host/render_frame_host_delegate.h index e2cdbcc4..b70b462a5 100644 --- a/content/browser/renderer_host/render_frame_host_delegate.h +++ b/content/browser/renderer_host/render_frame_host_delegate.h
@@ -579,14 +579,6 @@ blink_widget_host, mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) {} - // Creates a full screen RenderWidget. Similar to above. - virtual void CreateNewFullscreenWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> - blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) {} - // Return true if the popup is shown through WebContentsObserver. // BrowserPluginGuest for the guest WebContents will show the popup on Mac, // then, we should skip to show the popup at RenderViewHostDelegateView.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index b39ca425..5119fbc 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -239,6 +239,7 @@ #include "third_party/blink/public/mojom/timing/resource_timing.mojom.h" #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h" #include "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom.h" +#include "ui/accessibility/ax_common.h" #include "ui/accessibility/ax_tree.h" #include "ui/accessibility/ax_tree_id_registry.h" #include "ui/accessibility/ax_tree_update.h" @@ -267,14 +268,14 @@ namespace content { -#if DCHECK_IS_ON() || !defined(NDEBUG) -// Wrapping this in DCHECK_IS_ON() will enable it to run on -// clusterfuzz, which should help narrow down illegal ax trees more quickly. +#if defined(AX_FAIL_FAST_BUILD) +// Enable fast fails on clusterfuzz and other builds used to debug Chrome, +// which should help narrow down illegal ax trees more quickly. // static int RenderFrameHostImpl::max_accessibility_resets_ = 0; #else int RenderFrameHostImpl::max_accessibility_resets_ = 4; -#endif +#endif // AX_FAIL_FAST_BUILD struct RenderFrameHostOrProxy { RenderFrameHostImpl* const frame; @@ -5281,17 +5282,6 @@ std::move(blink_widget)); } -void RenderFrameHostImpl::CreateNewFullscreenWidget( - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget, - CreateNewFullscreenWidgetCallback callback) { - int32_t widget_route_id = GetProcess()->GetNextRoutingID(); - std::move(callback).Run(widget_route_id); - delegate_->CreateNewFullscreenWidget(agent_scheduling_group_, widget_route_id, - std::move(blink_widget_host), - std::move(blink_widget)); -} - void RenderFrameHostImpl::IssueKeepAliveHandle( mojo::PendingReceiver<mojom::KeepAliveHandle> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 77d7849d..8c48f77f 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -2020,11 +2020,6 @@ blink_widget_host, mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget, CreateNewWidgetCallback callback) override; - void CreateNewFullscreenWidget( - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> - blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget, - CreateNewFullscreenWidgetCallback callback) override; void IssueKeepAliveHandle( mojo::PendingReceiver<mojom::KeepAliveHandle> receiver) override; void DidCommitProvisionalLoad(
diff --git a/content/browser/renderer_host/render_frame_host_impl_unittest.cc b/content/browser/renderer_host/render_frame_host_impl_unittest.cc index 4e45298..17565fc 100644 --- a/content/browser/renderer_host/render_frame_host_impl_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
@@ -92,13 +92,6 @@ EXPECT_EQ(initial_rfh, main_rfh()); } -// Create a full screen popup RenderWidgetHost and View. -TEST_F(RenderFrameHostImplTest, CreateFullscreenWidget) { - main_test_rfh()->CreateNewFullscreenWidget( - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost>(), - mojo::PendingAssociatedRemote<blink::mojom::Widget>(), base::DoNothing()); -} - TEST_F(RenderFrameHostImplTest, PolicyContainerLifecycle) { TestRenderFrameHost* main_rfh = contents()->GetMainFrame(); ASSERT_NE(main_rfh->policy_container(), nullptr);
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 7877f06..3f788463 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3662,17 +3662,6 @@ return false; mark_child_process_activity_time(); - if (msg.routing_id() == MSG_ROUTING_CONTROL) { - // Dispatch control messages. - IPC_BEGIN_MESSAGE_MAP(RenderProcessHostImpl, msg) - IPC_MESSAGE_HANDLER(WidgetHostMsg_Close_ACK, OnCloseACK) - // Adding single handlers for your service here is fine, but once your - // service needs more than one handler, please extract them into a new - // message filter and add that filter to CreateMessageFilters(). - IPC_END_MESSAGE_MAP() - - return true; - } // Dispatch incoming messages to the appropriate IPC::Listener. IPC::Listener* listener = listeners_.Lookup(msg.routing_id()); @@ -4732,20 +4721,33 @@ g_analyze_hung_renderer = analyze_hung_renderer; } -void RenderProcessHostImpl::ReleaseOnCloseACK( +void RenderProcessHostImpl::DidDestroyRenderView(int process_id, + int closed_view_route_id) { + RenderProcessHost* host = RenderProcessHost::FromID(process_id); + if (!host) + return; + SessionStorageHolder* holder = static_cast<SessionStorageHolder*>( + host->GetUserData(kSessionStorageHolderKey)); + if (!holder) + return; + holder->Release(closed_view_route_id); +} + +void RenderProcessHostImpl::WillDestroyRenderView( RenderProcessHost* host, const SessionStorageNamespaceMap& sessions, - int widget_route_id) { + int view_route_id) { DCHECK(host); if (sessions.empty()) return; SessionStorageHolder* holder = static_cast<SessionStorageHolder*>( host->GetUserData(kSessionStorageHolderKey)); if (!holder) { - holder = new SessionStorageHolder(); - host->SetUserData(kSessionStorageHolderKey, base::WrapUnique(holder)); + auto empty_holder = std::make_unique<SessionStorageHolder>(); + holder = empty_holder.get(); + host->SetUserData(kSessionStorageHolderKey, std::move(empty_holder)); } - holder->Hold(sessions, widget_route_id); + holder->Hold(sessions, view_route_id); } void RenderProcessHostImpl::SuddenTerminationChanged(bool enabled) { @@ -5045,14 +5047,6 @@ ProcessDied(true, &info); } -void RenderProcessHostImpl::OnCloseACK(int closed_widget_route_id) { - SessionStorageHolder* holder = - static_cast<SessionStorageHolder*>(GetUserData(kSessionStorageHolderKey)); - if (!holder) - return; - holder->Release(closed_widget_route_id); -} - // static RenderProcessHost* RenderProcessHostImpl::FindReusableProcessHostForSiteInstance(
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h index d86657e..cb221416 100644 --- a/content/browser/renderer_host/render_process_host_impl.h +++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -312,14 +312,19 @@ child_process_activity_time_ = base::TimeTicks::Now(); } - // Used to extend the lifetime of the sessions until the render view + // Called when the renderer has fully destroyed the associated RenderView + // identified by |closed_view_route_id|. This is static because its also + // called with mock hosts as input in test cases. + static void DidDestroyRenderView(int process_id, int closed_view_route_id); + + // Used to extend the lifetime of the sessions until the RenderView // in the renderer is fully closed. This is static because its also called - // with mock hosts as input in test cases. The RenderWidget routing associated - // with the view is used as the key since the WidgetMsg_Close and - // WidgetHostMsg_Close_ACK logic is centered around RenderWidgets. - static void ReleaseOnCloseACK(RenderProcessHost* host, - const SessionStorageNamespaceMap& sessions, - int widget_route_id); + // with mock hosts as input in test cases. The RenderView routing id is used + // as the key. A subsequent call to |DidDestroyRenderView| will be called + // once the renderer has completed its work. + static void WillDestroyRenderView(RenderProcessHost* host, + const SessionStorageNamespaceMap& sessions, + int view_route_id); // Register/unregister the host identified by the host id in the global host // list. @@ -815,9 +820,6 @@ mojo::PendingRemote<memory_instrumentation::mojom::ClientProcess> client_process) override; - // Control message handlers. - void OnCloseACK(int closed_widget_route_id); - // Generates a command line to be used to spawn a renderer and appends the // results to |*command_line|. void AppendRendererCommandLine(base::CommandLine* command_line);
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 6b2a2ef..393502b 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -331,8 +331,8 @@ // brief window where the internal ChannelProxy is null. This ensures that the // ChannelProxy is re-initialized in such cases so that subsequent messages // make their way to the new renderer once its restarted. - // TODO(crbug.com/1111231): Should this go via ASGH? Is it even needed after - // the migration? + // TODO(crbug.com/1111231): Should this go via AgentSchedulerGroupHost? Is it + // even needed after the migration? GetProcess()->EnableSendQueue(); if (!is_active()) @@ -358,21 +358,25 @@ // We can't release the SessionStorageNamespace until our peer // in the renderer has wound down. - // TODO(crbug.com/1111231): `ReleaseOnCloseACK()` should probably be called on - // the ASGH rather than the RPHI. If that happens, does it still make sense to - // test if the process is still alive, or should that be encapsulated in - // `ASGH::ReleaseOnCloseAck()`? + // TODO(crbug.com/1111231): `WillDestroyRenderView()` should probably be + // called on the AgentSchedulerGroupHost rather than the + // RenderProcessHostImpl. If that happens, does it still make sense to test if + // the process is still alive, or should that be encapsulated in + // `AgentSchedulerGroupHost::WillDestroyRenderView()`? if (GetProcess()->IsInitializedAndNotDead()) { - RenderProcessHostImpl::ReleaseOnCloseACK( + RenderProcessHostImpl::WillDestroyRenderView( GetProcess(), delegate_->GetSessionStorageNamespaceMap(), - GetWidget()->GetRoutingID()); + GetRoutingID()); } // Destroy the RenderWidgetHost. GetWidget()->ShutdownAndDestroyWidget(false); if (IsRenderViewLive()) { // Destroy the RenderView, which will also destroy the RenderWidget. - GetAgentSchedulingGroup().DestroyView(GetRoutingID()); + GetAgentSchedulingGroup().DestroyView( + GetRoutingID(), + base::BindOnce(&RenderProcessHostImpl::DidDestroyRenderView, + GetProcess()->GetID(), GetRoutingID())); } ui::GpuSwitchingManager::GetInstance()->RemoveObserver(this);
diff --git a/content/browser/renderer_host/render_widget_host_browsertest.cc b/content/browser/renderer_host/render_widget_host_browsertest.cc index f80a4ee..554b58fa 100644 --- a/content/browser/renderer_host/render_widget_host_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_browsertest.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/run_loop.h" #include "base/test/bind_test_util.h" +#include "base/test/test_timeouts.h" #include "base/time/time.h" #include "build/build_config.h" #include "content/browser/renderer_host/input/input_router_impl.h" @@ -528,6 +529,21 @@ // a FrameHostMsg_ShowPopup to ask the browser to build and display the actual // popup using native controls. #if !defined(OS_MAC) && !defined(OS_ANDROID) + +namespace { + +// Helper to use inside a loop instead of using RunLoop::RunUntilIdle() to avoid +// the loop being a busy loop that prevents renderer from doing its job. Use +// only when there is no better way to synchronize. +void GiveItSomeTime(base::TimeDelta delta) { + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), delta); + run_loop.Run(); +} + +} // namespace + IN_PROC_BROWSER_TEST_F(RenderWidgetHostSitePerProcessTest, BrowserClosesSelectPopup) { // Navigate to a page with a <select> element. @@ -594,25 +610,25 @@ ASSERT_TRUE(popup_widget_host); ASSERT_NE(popup_widget_host, root_frame_host->GetRenderWidgetHost()); - // A class to wait for WidgetHostMsg_Close_ACK. - auto close_filter = base::MakeRefCounted<ObserveMessageFilter>( - WidgetMsgStart, WidgetHostMsg_Close_ACK::ID); - process->AddFilter(close_filter.get()); - + auto* popup_widget_host_impl = + static_cast<RenderWidgetHostImpl*>(popup_widget_host); if (browser_closes) { // Close the popup RenderWidget from the browser side. - auto* popup_widget_host_impl = - static_cast<RenderWidgetHostImpl*>(popup_widget_host); popup_widget_host_impl->ShutdownAndDestroyWidget(true); } else { + base::WeakPtr<RenderWidgetHostImpl> popup_weak_ptr = + popup_widget_host_impl->GetWeakPtr(); + // Close the popup RenderWidget from the renderer side by removing focus. EXPECT_TRUE( ExecuteScript(root_frame_host, "document.activeElement.blur()")); - } - // In either case, wait until closing the popup RenderWidget is complete to - // know it worked by waiting for the WidgetHostMsg_Close_ACK. - close_filter->Wait(); + // Ensure that the RenderWidgetHostImpl gets destroyed, which implies the + // close step has also been sent to the renderer process. + while (popup_weak_ptr) { + GiveItSomeTime(TestTimeouts::tiny_timeout()); + } + } // Ensure the renderer didn't explode :). { base::string16 title_when_done[] = {base::UTF8ToUTF16("done 0"),
diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc index 38678fcc..b2139c2 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.cc +++ b/content/browser/renderer_host/render_widget_host_view_base.cc
@@ -243,7 +243,7 @@ const gfx::Vector2d offset, const SkBitmap& main_image, const SkBitmap& popup_image) { // Draw popup_image into main_image. - SkCanvas canvas(main_image, SkSurfaceProps{}); + SkCanvas canvas(main_image); canvas.drawBitmap(popup_image, offset.x(), offset.y()); std::move(final_callback).Run(main_image); },
diff --git a/content/browser/service_worker/service_worker_container_host.cc b/content/browser/service_worker/service_worker_container_host.cc index 5cb7b2d..b53444f 100644 --- a/content/browser/service_worker/service_worker_container_host.cc +++ b/content/browser/service_worker/service_worker_container_host.cc
@@ -726,7 +726,8 @@ int container_frame_id, const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> - coep_reporter) { + coep_reporter, + ukm::SourceId document_ukm_source_id) { DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); DCHECK(IsContainerForWindowClient()); @@ -772,6 +773,9 @@ container_process_id, frame_id_, client_uuid(), GetWeakPtr())); } + DCHECK_EQ(ukm_source_id_, ukm::kInvalidSourceId); + ukm_source_id_ = document_ukm_source_id; + TransitionToClientPhase(ClientPhase::kResponseCommitted); } @@ -789,7 +793,8 @@ } void ServiceWorkerContainerHost::CompleteWebWorkerPreparation( - const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy) { + const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, + ukm::SourceId worker_ukm_source_id) { DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); DCHECK(IsContainerForWorkerClient()); @@ -804,6 +809,9 @@ mojo::NullRemote()); } + DCHECK_EQ(ukm_source_id_, ukm::kInvalidSourceId); + ukm_source_id_ = worker_ukm_source_id; + TransitionToClientPhase(ClientPhase::kResponseCommitted); SetExecutionReady(); } @@ -1184,6 +1192,9 @@ DCHECK(!is_execution_ready()); TransitionToClientPhase(ClientPhase::kExecutionReady); RunExecutionReadyCallbacks(); + + if (context_) + context_->NotifyClientIsExecutionReady(*this); } void ServiceWorkerContainerHost::RunExecutionReadyCallbacks() {
diff --git a/content/browser/service_worker/service_worker_container_host.h b/content/browser/service_worker/service_worker_container_host.h index 0310de5..2f99755 100644 --- a/content/browser/service_worker/service_worker_container_host.h +++ b/content/browser/service_worker/service_worker_container_host.h
@@ -23,6 +23,7 @@ #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/cookies/site_for_cookies.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_container.mojom.h" @@ -266,7 +267,8 @@ int container_frame_id, const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> - coep_reporter); + coep_reporter, + ukm::SourceId document_ukm_source_id); // For service worker window clients. Called after the navigation commits to a // render frame host. At this point, the previous ServiceWorkerContainerHost @@ -279,7 +281,8 @@ // After this is called, is_response_committed() and is_execution_ready() // return true. void CompleteWebWorkerPreparation( - const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy); + const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, + ukm::SourceId worker_ukm_source_id); // Sets |url_|, |site_for_cookies_| and |top_frame_origin_|. For service // worker clients, updates the client uuid if it's a cross-origin transition. @@ -447,6 +450,8 @@ base::WeakPtr<ServiceWorkerContainerHost> GetWeakPtr(); + ukm::SourceId ukm_source_id() const { return ukm_source_id_; } + private: friend class ServiceWorkerContainerHostTest; friend class service_worker_object_host_unittest::ServiceWorkerObjectHostTest; @@ -649,6 +654,9 @@ // The type of client. const base::Optional<ServiceWorkerClientInfo> client_info_; + // The source id of the client's ExecutionContext, set on response commit. + ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId; + // For window clients only --------------------------------------------------- // A token used internally to identify this context in requests. Corresponds
diff --git a/content/browser/service_worker/service_worker_container_host_unittest.cc b/content/browser/service_worker/service_worker_container_host_unittest.cc index 3cb6a22..0c62865 100644 --- a/content/browser/service_worker/service_worker_container_host_unittest.cc +++ b/content/browser/service_worker/service_worker_container_host_unittest.cc
@@ -37,6 +37,7 @@ #include "content/test/test_content_browser_client.h" #include "content/test/test_content_client.h" #include "mojo/public/cpp/system/functions.h" +#include "services/metrics/public/cpp/ukm_recorder.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/loader/network_utils.h" @@ -212,7 +213,8 @@ // process right before navigation commit. container_host->OnBeginNavigationCommit( helper_->mock_render_process_id(), 1 /* route_id */, - network::CrossOriginEmbedderPolicy(), std::move(reporter)); + network::CrossOriginEmbedderPolicy(), std::move(reporter), + ukm::UkmRecorder::GetNewSourceID()); } blink::mojom::ServiceWorkerErrorType Register( @@ -1004,7 +1006,8 @@ url::Origin::Create(url)); EXPECT_FALSE(CanFindClientContainerHost(container_host.get())); container_host->CompleteWebWorkerPreparation( - network::CrossOriginEmbedderPolicy()); + network::CrossOriginEmbedderPolicy(), + ukm::UkmRecorder::GetNewSourceID()); EXPECT_TRUE(CanFindClientContainerHost(container_host.get())); } @@ -1093,7 +1096,7 @@ container_host->UpdateUrls(url, net::SiteForCookies::FromUrl(url), url::Origin::Create(url)); container_host->CompleteWebWorkerPreparation( - network::CrossOriginEmbedderPolicy()); + network::CrossOriginEmbedderPolicy(), ukm::UkmRecorder::GetNewSourceID()); EXPECT_TRUE(container_host->is_response_committed()); EXPECT_TRUE(container_host->is_execution_ready());
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc index 7496c57..e58b69d 100644 --- a/content/browser/service_worker/service_worker_context_core.cc +++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -479,6 +479,11 @@ ServiceWorkerContainerHost* container_host = container_host_receivers_->current_context(); + observer_list_->Notify(FROM_HERE, + &ServiceWorkerContextCoreObserver::OnClientDestroyed, + container_host->ukm_source_id(), container_host->url(), + container_host->GetClientType()); + size_t removed = container_host_by_uuid_.erase(container_host->client_uuid()); DCHECK_EQ(removed, 1u); } @@ -611,6 +616,15 @@ return next_embedded_worker_id_++; } +void ServiceWorkerContextCore::NotifyClientIsExecutionReady( + const ServiceWorkerContainerHost& container_host) { + DCHECK(container_host.is_execution_ready()); + observer_list_->Notify( + FROM_HERE, &ServiceWorkerContextCoreObserver::OnClientIsExecutionReady, + container_host.ukm_source_id(), container_host.url(), + container_host.GetClientType()); +} + void ServiceWorkerContextCore::RegistrationComplete( const GURL& scope, ServiceWorkerContextCore::RegistrationCallback callback, @@ -731,6 +745,9 @@ &ServiceWorkerContextCoreObserver::OnStopped, id); } + observer_list_->Notify( + FROM_HERE, &ServiceWorkerContextCoreObserver::OnLiveVersionDestroyed, id); + live_versions_.erase(it); }
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h index 8f4baec..58f199cb 100644 --- a/content/browser/service_worker/service_worker_context_core.h +++ b/content/browser/service_worker/service_worker_context_core.h
@@ -358,6 +358,9 @@ int GetNextEmbeddedWorkerId(); + void NotifyClientIsExecutionReady( + const ServiceWorkerContainerHost& container_host); + private: friend class ServiceWorkerContextCoreTest; FRIEND_TEST_ALL_PREFIXES(ServiceWorkerContextCoreTest, FailureInfo);
diff --git a/content/browser/service_worker/service_worker_context_core_observer.h b/content/browser/service_worker/service_worker_context_core_observer.h index 74ff362d..b6959b6 100644 --- a/content/browser/service_worker/service_worker_context_core_observer.h +++ b/content/browser/service_worker/service_worker_context_core_observer.h
@@ -16,6 +16,7 @@ #include "content/public/browser/global_routing_id.h" #include "content/public/browser/service_worker_context_observer.h" #include "third_party/blink/public/common/tokens/tokens.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_container_type.mojom.h" #include "url/gurl.h" @@ -30,6 +31,7 @@ virtual void OnNewLiveRegistration(int64_t registration_id, const GURL& scope) {} virtual void OnNewLiveVersion(const ServiceWorkerVersionInfo& version_info) {} + virtual void OnLiveVersionDestroyed(int64_t version_id) {} virtual void OnStarting(int64_t version_id) {} virtual void OnStarted(int64_t version_id, const GURL& scope, @@ -104,6 +106,18 @@ // data is wiped out. virtual void OnStorageWiped() {} + // Called when a container host representing a client is execution ready. See + // https://html.spec.whatwg.org/multipage/webappapis.html#concept-environment-execution-ready-flag + virtual void OnClientIsExecutionReady( + ukm::SourceId source_id, + const GURL& url, + blink::mojom::ServiceWorkerClientType type) {} + + // Called when a container host representing a client is destroyed. + virtual void OnClientDestroyed(ukm::SourceId source_id, + const GURL& url, + blink::mojom::ServiceWorkerClientType type) {} + protected: virtual ~ServiceWorkerContextCoreObserver() {} };
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index 976abee5..159908a 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -48,6 +48,7 @@ #include "storage/browser/quota/quota_client_type.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/quota/special_storage_policy.h" +#include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h" #include "third_party/blink/public/common/service_worker/service_worker_scope_match.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h" @@ -225,6 +226,12 @@ // Add this object as an observer of the wrapped |context_core_|. This lets us // forward observer methods to observers outside of content. core_observer_list_->AddObserver(this); + + if (blink::IdentifiabilityStudySettings::Get()->IsActive()) { + identifiability_metrics_ = + std::make_unique<ServiceWorkerIdentifiabilityMetrics>(); + core_observer_list_->AddObserver(identifiability_metrics_.get()); + } } void ServiceWorkerContextWrapper::Init( @@ -1554,6 +1561,8 @@ // tests where this object is not guaranteed to outlive the // ServiceWorkerContextCore it wraps. core_observer_list_->RemoveObserver(this); + if (identifiability_metrics_) + core_observer_list_->RemoveObserver(identifiability_metrics_.get()); DCHECK(!resource_context_); }
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index 139e5ff..6c38e4d8 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -20,6 +20,7 @@ #include "base/observer_list_threadsafe.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_context_core_observer.h" +#include "content/browser/service_worker/service_worker_identifiability_metrics.h" #include "content/common/content_export.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/global_routing_id.h" @@ -610,6 +611,8 @@ bool registrations_initialized_ = false; base::OnceClosure on_registrations_initialized_; + std::unique_ptr<ServiceWorkerIdentifiabilityMetrics> identifiability_metrics_; + // Temporary for moving context core to the UI thread. scoped_refptr<base::TaskRunner> core_thread_task_runner_;
diff --git a/content/browser/service_worker/service_worker_identifiability_metrics.cc b/content/browser/service_worker/service_worker_identifiability_metrics.cc new file mode 100644 index 0000000..8a5c3be --- /dev/null +++ b/content/browser/service_worker/service_worker_identifiability_metrics.cc
@@ -0,0 +1,119 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/service_worker/service_worker_identifiability_metrics.h" + +#include "base/stl_util.h" +#include "content/public/browser/worker_type.h" +#include "services/metrics/public/cpp/delegating_ukm_recorder.h" +#include "services/metrics/public/cpp/ukm_builders.h" +#include "third_party/blink/public/common/privacy_budget/identifiability_sample_collector.h" +#include "url/gurl.h" + +namespace content { + +ServiceWorkerIdentifiabilityMetrics::ServiceWorkerIdentifiabilityMetrics() = + default; +ServiceWorkerIdentifiabilityMetrics::~ServiceWorkerIdentifiabilityMetrics() = + default; + +void ServiceWorkerIdentifiabilityMetrics::OnNewLiveVersion( + const ServiceWorkerVersionInfo& version_info) { + int64_t version_id = version_info.version_id; + auto version_it = version_map_.find(version_id); + if (version_it != version_map_.end()) { + DCHECK_EQ(version_it->second.ukm_source_id, version_info.ukm_source_id); + DCHECK_EQ(version_it->second.origin, version_info.origin.GetURL()); + return; + } + + GURL origin = version_info.origin.GetURL(); + version_map_.emplace(version_id, VersionIdentifiabilityInfo( + version_info.ukm_source_id, origin)); + + auto client_it = client_source_ids_by_origin_.find(origin); + if (client_it == client_source_ids_by_origin_.end()) { + return; + } + + for (const auto& client_source_id : client_it->second) { + EmitClientAddedEvent(version_info.ukm_source_id, client_source_id); + } +} + +void ServiceWorkerIdentifiabilityMetrics::OnLiveVersionDestroyed( + int64_t version_id) { + auto version_it = version_map_.find(version_id); + if (version_it == version_map_.end()) { + return; + } + + if (ukm::DelegatingUkmRecorder* ukm_recorder = + ukm::DelegatingUkmRecorder::Get()) { + blink::IdentifiabilitySampleCollector::Get()->FlushSource( + ukm_recorder, version_it->second.ukm_source_id); + } + version_map_.erase(version_it); +} + +void ServiceWorkerIdentifiabilityMetrics::OnClientIsExecutionReady( + ukm::SourceId client_source_id, + const GURL& url, + blink::mojom::ServiceWorkerClientType type) { + GURL client_origin = url.GetOrigin(); + + // Don't track dedicated workers as they simply inherit the source id of their + // parents. + if (type == blink::mojom::ServiceWorkerClientType::kDedicatedWorker) { + // TODO(crbug.com/1138622): Re-enable once dedicated worker source ids are + // propagated. Also include dedicated workers in the valid source id DCHECK. + // DCHECK(base::Contains(client_source_ids_by_origin_, client_origin) && + // base::Contains(client_source_ids_by_origin_[client_origin], + // client_source_id)); + return; + } + DCHECK_NE(client_source_id, ukm::kInvalidSourceId); + client_source_ids_by_origin_[client_origin].insert(client_source_id); + + for (const auto& version : version_map_) { + if (version.second.origin == client_origin) { + EmitClientAddedEvent(version.second.ukm_source_id, client_source_id); + } + } +} + +void ServiceWorkerIdentifiabilityMetrics::OnClientDestroyed( + ukm::SourceId client_source_id, + const GURL& url, + blink::mojom::ServiceWorkerClientType type) { + GURL client_origin = url.GetOrigin(); + + // Don't track dedicated workers as they simply inherit the source id of their + // parents. + if (type == blink::mojom::ServiceWorkerClientType::kDedicatedWorker) { + return; + } + + auto client_it = client_source_ids_by_origin_.find(client_origin); + if (client_it != client_source_ids_by_origin_.end()) { + client_it->second.erase(client_source_id); + if (client_it->second.empty()) { + client_source_ids_by_origin_.erase(client_it); + } + } +} + +void ServiceWorkerIdentifiabilityMetrics::EmitClientAddedEvent( + ukm::SourceId version_ukm_source_id, + ukm::SourceId client_ukm_source_id) { + if (ukm::DelegatingUkmRecorder* ukm_recorder = + ukm::DelegatingUkmRecorder::Get()) { + ukm::builders::Worker_ClientAdded(version_ukm_source_id) + .SetClientSourceId(client_ukm_source_id) + .SetWorkerType(static_cast<int64_t>(WorkerType::kServiceWorker)) + .Record(ukm_recorder); + } +} + +} // namespace content \ No newline at end of file
diff --git a/content/browser/service_worker/service_worker_identifiability_metrics.h b/content/browser/service_worker/service_worker_identifiability_metrics.h new file mode 100644 index 0000000..24ccdda --- /dev/null +++ b/content/browser/service_worker/service_worker_identifiability_metrics.h
@@ -0,0 +1,65 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_IDENTIFIABILITY_METRICS_H_ +#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_IDENTIFIABILITY_METRICS_H_ + +#include <stdint.h> + +#include <map> +#include <set> + +#include "content/browser/service_worker/service_worker_context_core_observer.h" +#include "content/browser/service_worker/service_worker_info.h" +#include "content/common/content_export.h" +#include "services/metrics/public/cpp/ukm_source_id.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h" + +namespace content { + +struct VersionIdentifiabilityInfo { + VersionIdentifiabilityInfo() = default; + VersionIdentifiabilityInfo(ukm::SourceId ukm_source_id, const GURL& origin) + : ukm_source_id(ukm_source_id), origin(origin) {} + + ukm::SourceId ukm_source_id = ukm::kInvalidSourceId; + GURL origin; +}; + +// Used to emit a UKM event to associate each worker with each client that it +// has the potential to communicate with (whether or not they actually do). Only +// created when the identifiability study is active. +class CONTENT_EXPORT ServiceWorkerIdentifiabilityMetrics + : public ServiceWorkerContextCoreObserver { + public: + ServiceWorkerIdentifiabilityMetrics(); + ~ServiceWorkerIdentifiabilityMetrics() override; + + private: + // ServiceWorkerContextCoreObserver implements + void OnNewLiveVersion(const ServiceWorkerVersionInfo& version_info) override; + void OnLiveVersionDestroyed(int64_t version_id) override; + void OnClientIsExecutionReady( + ukm::SourceId client_source_id, + const GURL& url, + blink::mojom::ServiceWorkerClientType type) override; + void OnClientDestroyed(ukm::SourceId client_source_id, + const GURL& url, + blink::mojom::ServiceWorkerClientType type) override; + + void EmitClientAddedEvent(ukm::SourceId version_ukm_source_id, + ukm::SourceId client_ukm_source_id); + + // Stores information about ServiceWorkerVersions keyed by version_id. + std::map<int64_t, VersionIdentifiabilityInfo> version_map_; + + // Stores the UKM source IDs of all clients that are execution ready. They are + // partitioned by the origin of the client's URL. A GURL, not urL::Origin, is + // used to avoid unnecessary conversions as GURL::GetOrigin() returns a GURL. + std::map<GURL, std::set<ukm::SourceId>> client_source_ids_by_origin_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_IDENTIFIABILITY_METRICS_H_
diff --git a/content/browser/service_worker/service_worker_info.cc b/content/browser/service_worker/service_worker_info.cc index 22e1f627..ea14403c 100644 --- a/content/browser/service_worker/service_worker_info.cc +++ b/content/browser/service_worker/service_worker_info.cc
@@ -22,7 +22,8 @@ version_id(blink::mojom::kInvalidServiceWorkerVersionId), process_id(ChildProcessHost::kInvalidUniqueID), thread_id(ServiceWorkerConsts::kInvalidEmbeddedWorkerThreadId), - devtools_agent_route_id(MSG_ROUTING_NONE) {} + devtools_agent_route_id(MSG_ROUTING_NONE), + ukm_source_id(ukm::kInvalidSourceId) {} ServiceWorkerVersionInfo::ServiceWorkerVersionInfo( EmbeddedWorkerStatus running_status, @@ -34,7 +35,8 @@ int64_t version_id, int process_id, int thread_id, - int devtools_agent_route_id) + int devtools_agent_route_id, + ukm::SourceId ukm_source_id) : running_status(running_status), status(status), fetch_handler_existence(fetch_handler_existence), @@ -44,7 +46,8 @@ version_id(version_id), process_id(process_id), thread_id(thread_id), - devtools_agent_route_id(devtools_agent_route_id) {} + devtools_agent_route_id(devtools_agent_route_id), + ukm_source_id(ukm_source_id) {} ServiceWorkerVersionInfo::ServiceWorkerVersionInfo( const ServiceWorkerVersionInfo& other) = default;
diff --git a/content/browser/service_worker/service_worker_info.h b/content/browser/service_worker/service_worker_info.h index e4746be..72809c0f 100644 --- a/content/browser/service_worker/service_worker_info.h +++ b/content/browser/service_worker/service_worker_info.h
@@ -14,6 +14,7 @@ #include "base/time/time.h" #include "content/browser/service_worker/service_worker_version.h" #include "content/common/content_export.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "third_party/blink/public/mojom/service_worker/service_worker_container_type.mojom.h" #include "url/gurl.h" #include "url/origin.h" @@ -36,7 +37,8 @@ int64_t version_id, int process_id, int thread_id, - int devtools_agent_route_id); + int devtools_agent_route_id, + ukm::SourceId ukm_source_id); ServiceWorkerVersionInfo(const ServiceWorkerVersionInfo& other); ~ServiceWorkerVersionInfo(); @@ -51,6 +53,7 @@ int process_id; int thread_id; int devtools_agent_route_id; + ukm::SourceId ukm_source_id = ukm::kInvalidSourceId; base::Time script_response_time; base::Time script_last_modified; std::map<std::string, ServiceWorkerClientInfo> clients;
diff --git a/content/browser/service_worker/service_worker_main_resource_handle.cc b/content/browser/service_worker/service_worker_main_resource_handle.cc index 43565c71..aef9b87c 100644 --- a/content/browser/service_worker/service_worker_main_resource_handle.cc +++ b/content/browser/service_worker/service_worker_main_resource_handle.cc
@@ -49,7 +49,8 @@ const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> coep_reporter, - blink::mojom::ServiceWorkerContainerInfoForClientPtr* out_container_info) { + blink::mojom::ServiceWorkerContainerInfoForClientPtr* out_container_info, + ukm::SourceId document_ukm_source_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); // We may have failed to pre-create the container host. if (!container_info_) @@ -59,7 +60,8 @@ base::BindOnce( &ServiceWorkerMainResourceHandleCore::OnBeginNavigationCommit, base::Unretained(core_), render_process_id, render_frame_id, - cross_origin_embedder_policy, std::move(coep_reporter))); + cross_origin_embedder_policy, std::move(coep_reporter), + document_ukm_source_id)); *out_container_info = std::move(container_info_); } @@ -73,12 +75,14 @@ } void ServiceWorkerMainResourceHandle::OnBeginWorkerCommit( - const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy) { + const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, + ukm::SourceId worker_ukm_source_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); ServiceWorkerContextWrapper::RunOrPostTaskOnCoreThread( FROM_HERE, base::BindOnce(&ServiceWorkerMainResourceHandleCore::OnBeginWorkerCommit, - base::Unretained(core_), cross_origin_embedder_policy)); + base::Unretained(core_), cross_origin_embedder_policy, + worker_ukm_source_id)); } } // namespace content
diff --git a/content/browser/service_worker/service_worker_main_resource_handle.h b/content/browser/service_worker/service_worker_main_resource_handle.h index 13caaaa9..fcd2d3f 100644 --- a/content/browser/service_worker/service_worker_main_resource_handle.h +++ b/content/browser/service_worker/service_worker_main_resource_handle.h
@@ -9,6 +9,7 @@ #include "base/memory/weak_ptr.h" #include "content/browser/service_worker/service_worker_accessed_callback.h" #include "content/common/content_export.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/mojom/network_context.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h" @@ -84,7 +85,8 @@ const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> coep_reporter, - blink::mojom::ServiceWorkerContainerInfoForClientPtr* out_container_info); + blink::mojom::ServiceWorkerContainerInfoForClientPtr* out_container_info, + ukm::SourceId document_ukm_source_id); // Called after the renderer reports back that the navigation has been // committed. @@ -95,7 +97,8 @@ // |cross_origin_embedder_policy| is passed to the pre-created container // host. void OnBeginWorkerCommit( - const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy); + const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, + ukm::SourceId worker_ukm_source_id); blink::mojom::ServiceWorkerContainerInfoForClientPtr TakeContainerInfo() { return std::move(container_info_);
diff --git a/content/browser/service_worker/service_worker_main_resource_handle_core.cc b/content/browser/service_worker/service_worker_main_resource_handle_core.cc index 62766a4..3af4fe3 100644 --- a/content/browser/service_worker/service_worker_main_resource_handle_core.cc +++ b/content/browser/service_worker/service_worker_main_resource_handle_core.cc
@@ -32,12 +32,13 @@ int render_frame_id, const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> - coep_reporter) { + coep_reporter, + ukm::SourceId document_ukm_source_id) { DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); if (container_host_) { - container_host_->OnBeginNavigationCommit(render_process_id, render_frame_id, - cross_origin_embedder_policy, - std::move(coep_reporter)); + container_host_->OnBeginNavigationCommit( + render_process_id, render_frame_id, cross_origin_embedder_policy, + std::move(coep_reporter), document_ukm_source_id); } } void ServiceWorkerMainResourceHandleCore::OnEndNavigationCommit() { @@ -47,10 +48,12 @@ } void ServiceWorkerMainResourceHandleCore::OnBeginWorkerCommit( - const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy) { + const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, + ukm::SourceId worker_ukm_source_id) { DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); if (container_host_) { - container_host_->CompleteWebWorkerPreparation(cross_origin_embedder_policy); + container_host_->CompleteWebWorkerPreparation(cross_origin_embedder_policy, + worker_ukm_source_id); } }
diff --git a/content/browser/service_worker/service_worker_main_resource_handle_core.h b/content/browser/service_worker/service_worker_main_resource_handle_core.h index 5397df2..b0736715 100644 --- a/content/browser/service_worker/service_worker_main_resource_handle_core.h +++ b/content/browser/service_worker/service_worker_main_resource_handle_core.h
@@ -15,6 +15,7 @@ #include "content/browser/service_worker/service_worker_container_host.h" #include "content/browser/service_worker/service_worker_controllee_request_handler.h" #include "content/common/content_export.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/mojom/network_context.mojom.h" namespace network { @@ -48,10 +49,12 @@ int render_frame_id, const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter> - coep_reporter); + coep_reporter, + ukm::SourceId document_ukm_source_id); void OnEndNavigationCommit(); void OnBeginWorkerCommit( - const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy); + const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy, + ukm::SourceId worker_ukm_source_id); ServiceWorkerContextWrapper* context_wrapper() const { return context_wrapper_.get();
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc index 4296e47..6d01b76 100644 --- a/content/browser/service_worker/service_worker_test_utils.cc +++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -327,9 +327,9 @@ // In production code this is called from NavigationRequest in the browser // process right before navigation commit. - container_host->OnBeginNavigationCommit(process_id, 1 /* route_id */, - network::CrossOriginEmbedderPolicy(), - std::move(reporter)); + container_host->OnBeginNavigationCommit( + process_id, 1 /* route_id */, network::CrossOriginEmbedderPolicy(), + std::move(reporter), ukm::kInvalidSourceId); return container_host; }
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index d360afea..b11c0391 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -389,7 +389,7 @@ running_status(), status(), fetch_handler_existence(), script_url(), origin(), registration_id(), version_id(), embedded_worker()->process_id(), embedded_worker()->thread_id(), - embedded_worker()->worker_devtools_agent_route_id()); + embedded_worker()->worker_devtools_agent_route_id(), ukm_source_id()); for (const auto& controllee : controllee_map_) { ServiceWorkerContainerHost* container_host = controllee.second; info.clients.emplace(container_host->client_uuid(),
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc index ea4c6c1..8340b02 100644 --- a/content/browser/service_worker/service_worker_version_unittest.cc +++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -35,6 +35,7 @@ #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_service.mojom.h" #include "content/public/test/test_utils.h" +#include "services/metrics/public/cpp/ukm_recorder.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h" @@ -1222,7 +1223,7 @@ container_host->OnBeginNavigationCommit( version_->embedded_worker()->process_id(), /* render_frame_id = */ 1, network::CrossOriginEmbedderPolicy(), - std::move(reporter)); + std::move(reporter), ukm::UkmRecorder::GetNewSourceID()); // RenderProcessHost should be notified of foreground worker. base::RunLoop().RunUntilIdle();
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index ba7589de..8348fe9 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -12685,6 +12685,54 @@ EXPECT_TRUE(compositing_rect.Contains(visible_rect)); } +IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, + NestedIframeTransformedIntoViewViewportIntersection) { + GURL http_url(embedded_test_server()->GetURL( + "a.com", "/frame_tree/page_with_frame_transformed_into_viewport.html")); + EXPECT_TRUE(NavigateToURL(shell(), http_url)); + + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root(); + FrameTreeNode* child_b = root->child_at(0); + + NavigateFrameToURL( + child_b, + embedded_test_server()->GetURL( + "bar.com", "/frame_tree/page_with_cross_origin_frame_at_half.html")); + + EXPECT_EQ( + " Site A ------------ proxies for B C\n" + " +--Site B ------- proxies for A C\n" + " +--Site C -- proxies for A B\n" + "Where A = http://a.com/\n" + " B = http://bar.com/\n" + " C = http://baz.com/", + DepictFrameTree(root)); + + FrameTreeNode* child_c = child_b->child_at(0); + RenderFrameProxyHost* child_c_proxy = + child_c->render_manager()->GetProxyToParent(); + auto filter = + std::make_unique<UpdateViewportIntersectionMessageFilter>(child_c_proxy); + + // Scroll the div containing the 'Site B' iframe to trigger a viewport + // intersection update. + ASSERT_TRUE(EvalJsAfterLifecycleUpdate( + child_b->current_frame_host(), + "document.getElementsByTagName('div')[0].scrollTo(0, 5000);", + "") + .error.empty()); + ASSERT_TRUE(filter->MessageReceived()); + + // Check that we currently intersect with the viewport. + gfx::Rect viewport_intersection = + filter->GetIntersectionState()->viewport_intersection; + + EXPECT_GT(viewport_intersection.height(), 0); + EXPECT_GT(viewport_intersection.width(), 0); +} + // Verify that OOPIF select element popup menu coordinates account for scroll // offset in containers embedding frame. // TODO(crbug.com/859552): Reenable this.
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 0178c7b1..98875af 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3759,31 +3759,9 @@ int32_t route_id, mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> blink_widget_host, mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) { - CreateNewWidget(agent_scheduling_group, route_id, - /*is_fullscreen=*/false, std::move(blink_widget_host), - std::move(blink_widget)); -} - -void WebContentsImpl::CreateNewFullscreenWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) { - CreateNewWidget(agent_scheduling_group, route_id, - /*is_fullscreen=*/true, std::move(blink_widget_host), - std::move(blink_widget)); -} - -void WebContentsImpl::CreateNewWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - bool is_fullscreen, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) { OPTIONAL_TRACE_EVENT1( "content", "WebContentsImpl::CreateNewWidget", "params", - base::trace_event::TracedValue::Build( - {{"route_id", route_id}, {"is_fullscreen", is_fullscreen}})); + base::trace_event::TracedValue::Build({{"route_id", route_id}})); RenderProcessHost* process = agent_scheduling_group.GetProcess(); // A message to create a new widget can only come from an active process for // this WebContentsImpl instance. If any other process sends the request, @@ -3804,10 +3782,7 @@ view_->CreateViewForChildWidget(widget_host)); if (!widget_view) return; - // Fullscreen child widgets are frames, other child widgets are popups, and - // popups should not get activated. - if (!is_fullscreen) - widget_view->SetWidgetType(WidgetType::kPopup); + widget_view->SetWidgetType(WidgetType::kPopup); // Save the created widget associated with the route so we can show it later. pending_widget_views_[GlobalRoutingID(process->GetID(), route_id)] = widget_view;
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 2c4da68..7bb80ab 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -738,13 +738,6 @@ blink_widget_host, mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) override; - void CreateNewFullscreenWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> - blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) - override; bool ShowPopupMenu( RenderFrameHostImpl* render_frame_host, mojo::PendingRemote<blink::mojom::PopupMenuClient>* popup_client, @@ -1570,15 +1563,6 @@ // not provided since it may be invalid/changed after being committed. The // current navigation entry is in the NavigationController at this point. - // Helper for CreateNewWidget/CreateNewFullscreenWidget. - void CreateNewWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - bool is_fullscreen, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> - blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget); - // Finds the new RenderWidgetHost and returns it. Note that this can only be // called once as this call also removes it from the internal map. RenderWidgetHostView* GetCreatedWidget(int process_id, int route_id);
diff --git a/content/browser/webui/web_ui_data_source_impl.cc b/content/browser/webui/web_ui_data_source_impl.cc index c03fa7cc..6adf2b9 100644 --- a/content/browser/webui/web_ui_data_source_impl.cc +++ b/content/browser/webui/web_ui_data_source_impl.cc
@@ -277,6 +277,9 @@ if (base::EndsWith(file_path, ".mp4", base::CompareCase::INSENSITIVE_ASCII)) return "video/mp4"; + if (base::EndsWith(file_path, ".wasm", base::CompareCase::INSENSITIVE_ASCII)) + return "application/wasm"; + return "text/html"; }
diff --git a/content/browser/webui/web_ui_data_source_unittest.cc b/content/browser/webui/web_ui_data_source_unittest.cc index 08bb19d8..e6b8966 100644 --- a/content/browser/webui/web_ui_data_source_unittest.cc +++ b/content/browser/webui/web_ui_data_source_unittest.cc
@@ -223,6 +223,7 @@ const char* html = "text/html"; const char* js = "application/javascript"; const char* png = "image/png"; + EXPECT_EQ(GetMimeType(std::string()), html); EXPECT_EQ(GetMimeType("foo"), html); EXPECT_EQ(GetMimeType("foo.html"), html); @@ -243,6 +244,14 @@ EXPECT_EQ(GetMimeType("foo.html?abc?abc"), html); EXPECT_EQ(GetMimeType("foo.css?abc?abc"), css); EXPECT_EQ(GetMimeType("foo.js?abc?abc"), js); + + EXPECT_EQ(GetMimeType("foo.json"), "application/json"); + EXPECT_EQ(GetMimeType("foo.pdf"), "application/pdf"); + EXPECT_EQ(GetMimeType("foo.svg"), "image/svg+xml"); + EXPECT_EQ(GetMimeType("foo.jpg"), "image/jpeg"); + EXPECT_EQ(GetMimeType("foo.mp4"), "video/mp4"); + EXPECT_EQ(GetMimeType("foo.js.wasm"), "application/wasm"); + EXPECT_EQ(GetMimeType("foo.out.wasm"), "application/wasm"); } TEST_F(WebUIDataSourceTest, ShouldServeMimeTypeAsContentTypeHeader) {
diff --git a/content/browser/worker_host/dedicated_worker_host.cc b/content/browser/worker_host/dedicated_worker_host.cc index 49753098..bf9bce4 100644 --- a/content/browser/worker_host/dedicated_worker_host.cc +++ b/content/browser/worker_host/dedicated_worker_host.cc
@@ -201,6 +201,9 @@ appcache_host ? appcache_host->GetWeakPtr() : nullptr, std::move(blob_url_loader_factory), nullptr, storage_partition_impl, partition_domain, + + // TODO(crbug.com/1138622): Propagate dedicated worker ukm::SourceId here. + ukm::kInvalidSourceId, base::BindOnce(&DedicatedWorkerHost::DidStartScriptLoad, weak_factory_.GetWeakPtr())); }
diff --git a/content/browser/worker_host/shared_worker_host.h b/content/browser/worker_host/shared_worker_host.h index 66928a6..ac039dfc 100644 --- a/content/browser/worker_host/shared_worker_host.h +++ b/content/browser/worker_host/shared_worker_host.h
@@ -141,6 +141,8 @@ const SharedWorkerInstance& instance() const { return instance_; } + ukm::SourceId ukm_source_id() const { return ukm_source_id_; } + const base::UnguessableToken& GetDevToolsToken() const; // Signals the remote worker to terminate and returns the mojo::Remote
diff --git a/content/browser/worker_host/shared_worker_service_impl.cc b/content/browser/worker_host/shared_worker_service_impl.cc index 5cc3fb6..8d89d05 100644 --- a/content/browser/worker_host/shared_worker_service_impl.cc +++ b/content/browser/worker_host/shared_worker_service_impl.cc
@@ -332,7 +332,7 @@ blink::mojom::ResourceType::kSharedWorker, service_worker_context_, service_worker_handle_raw, std::move(appcache_host), std::move(blob_url_loader_factory), url_loader_factory_override_, - storage_partition_, storage_domain, + storage_partition_, storage_domain, host->ukm_source_id(), base::BindOnce(&SharedWorkerServiceImpl::StartWorker, weak_factory_.GetWeakPtr(), weak_host, message_port, std::move(cloned_outside_fetch_client_settings_object)));
diff --git a/content/browser/worker_host/worker_script_fetch_initiator.cc b/content/browser/worker_host/worker_script_fetch_initiator.cc index deb5879..8499da2 100644 --- a/content/browser/worker_host/worker_script_fetch_initiator.cc +++ b/content/browser/worker_host/worker_script_fetch_initiator.cc
@@ -77,6 +77,7 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_override, StoragePartitionImpl* storage_partition, const std::string& storage_domain, + ukm::SourceId worker_source_id, CompletionCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(storage_partition); @@ -180,7 +181,8 @@ std::move(subresource_loader_factories), std::move(service_worker_context), service_worker_handle, std::move(appcache_host), std::move(blob_url_loader_factory), - std::move(url_loader_factory_override), std::move(callback)); + std::move(url_loader_factory_override), worker_source_id, + std::move(callback)); } std::unique_ptr<blink::PendingURLLoaderFactoryBundle> @@ -302,6 +304,7 @@ base::WeakPtr<AppCacheHost> appcache_host, scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_override, + ukm::SourceId worker_source_id, CompletionCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -385,7 +388,7 @@ std::make_unique<WorkerScriptLoaderFactory>( worker_process_id, worker_token, service_worker_handle, std::move(appcache_host), browser_context_getter, - std::move(url_loader_factory)), + std::move(url_loader_factory), worker_source_id), std::move(throttles), std::move(resource_request), base::BindOnce(WorkerScriptFetchInitiator::DidCreateScriptLoader, std::move(callback),
diff --git a/content/browser/worker_host/worker_script_fetch_initiator.h b/content/browser/worker_host/worker_script_fetch_initiator.h index bf19568..02bad88e 100644 --- a/content/browser/worker_host/worker_script_fetch_initiator.h +++ b/content/browser/worker_host/worker_script_fetch_initiator.h
@@ -15,6 +15,7 @@ #include "content/common/content_export.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/service_worker_client_info.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/mojom/fetch_api.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/network/public/mojom/url_response_head.mojom.h" @@ -86,6 +87,7 @@ url_loader_factory_override, StoragePartitionImpl* storage_partition, const std::string& storage_domain, + ukm::SourceId worker_source_id, CompletionCallback callback); // Used for specifying how URLLoaderFactoryBundle is used. @@ -129,6 +131,7 @@ scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_override, + ukm::SourceId worker_source_id, CompletionCallback callback); static void DidCreateScriptLoader(
diff --git a/content/browser/worker_host/worker_script_loader.cc b/content/browser/worker_host/worker_script_loader.cc index 29cd7f5d..7dafa70 100644 --- a/content/browser/worker_host/worker_script_loader.cc +++ b/content/browser/worker_host/worker_script_loader.cc
@@ -31,7 +31,8 @@ base::WeakPtr<AppCacheHost> appcache_host, const BrowserContextGetter& browser_context_getter, scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + ukm::SourceId ukm_source_id) : routing_id_(routing_id), request_id_(request_id), options_(options), @@ -40,7 +41,8 @@ service_worker_handle_(std::move(service_worker_handle)), browser_context_getter_(browser_context_getter), default_loader_factory_(std::move(default_loader_factory)), - traffic_annotation_(traffic_annotation) { + traffic_annotation_(traffic_annotation), + ukm_source_id_(ukm_source_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!service_worker_handle_) { @@ -328,7 +330,7 @@ // TODO(https://crbug.com/999049): Parse the COEP header and pass it to // the service worker handle. service_worker_handle_->OnBeginWorkerCommit( - network::CrossOriginEmbedderPolicy()); + network::CrossOriginEmbedderPolicy(), ukm_source_id_); } client_->OnComplete(status);
diff --git a/content/browser/worker_host/worker_script_loader.h b/content/browser/worker_host/worker_script_loader.h index cf66c353..ac5fefc 100644 --- a/content/browser/worker_host/worker_script_loader.h +++ b/content/browser/worker_host/worker_script_loader.h
@@ -80,7 +80,8 @@ base::WeakPtr<AppCacheHost> appcache_host, const BrowserContextGetter& browser_context_getter, scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation); + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, + ukm::SourceId ukm_source_id); ~WorkerScriptLoader() override; // network::mojom::URLLoader: @@ -155,6 +156,7 @@ BrowserContextGetter browser_context_getter_; scoped_refptr<network::SharedURLLoaderFactory> default_loader_factory_; net::MutableNetworkTrafficAnnotationTag traffic_annotation_; + const ukm::SourceId ukm_source_id_; base::Optional<net::RedirectInfo> redirect_info_; int redirect_limit_ = net::URLRequest::kMaxRedirects;
diff --git a/content/browser/worker_host/worker_script_loader_factory.cc b/content/browser/worker_host/worker_script_loader_factory.cc index ca56530..bc07499 100644 --- a/content/browser/worker_host/worker_script_loader_factory.cc +++ b/content/browser/worker_host/worker_script_loader_factory.cc
@@ -26,12 +26,14 @@ ServiceWorkerMainResourceHandle* service_worker_handle, base::WeakPtr<AppCacheHost> appcache_host, const BrowserContextGetter& browser_context_getter, - scoped_refptr<network::SharedURLLoaderFactory> loader_factory) + scoped_refptr<network::SharedURLLoaderFactory> loader_factory, + ukm::SourceId worker_source_id) : process_id_(process_id), worker_token_(worker_token), appcache_host_(std::move(appcache_host)), browser_context_getter_(browser_context_getter), - loader_factory_(std::move(loader_factory)) { + loader_factory_(std::move(loader_factory)), + worker_source_id_(worker_source_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (service_worker_handle) { @@ -64,7 +66,7 @@ process_id_, worker_token_, routing_id, request_id, options, resource_request, std::move(client), service_worker_handle_, appcache_host_, browser_context_getter_, loader_factory_, - traffic_annotation); + traffic_annotation, worker_source_id_); script_loader_ = script_loader->GetWeakPtr(); mojo::MakeSelfOwnedReceiver(std::move(script_loader), std::move(receiver)); }
diff --git a/content/browser/worker_host/worker_script_loader_factory.h b/content/browser/worker_host/worker_script_loader_factory.h index e2850d7a..34b50d67 100644 --- a/content/browser/worker_host/worker_script_loader_factory.h +++ b/content/browser/worker_host/worker_script_loader_factory.h
@@ -11,6 +11,7 @@ #include "content/public/browser/service_worker_client_info.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "third_party/blink/public/common/tokens/tokens.h" @@ -54,7 +55,8 @@ ServiceWorkerMainResourceHandle* service_worker_handle, base::WeakPtr<AppCacheHost> appcache_host, const BrowserContextGetter& browser_context_getter, - scoped_refptr<network::SharedURLLoaderFactory> loader_factory); + scoped_refptr<network::SharedURLLoaderFactory> loader_factory, + ukm::SourceId worker_source_id); ~WorkerScriptLoaderFactory() override; // network::mojom::URLLoaderFactory: @@ -79,6 +81,7 @@ base::WeakPtr<AppCacheHost> appcache_host_; BrowserContextGetter browser_context_getter_; scoped_refptr<network::SharedURLLoaderFactory> loader_factory_; + const ukm::SourceId worker_source_id_; // This is owned by SelfOwnedReceiver associated with the given // mojo::PendingReceiver<URLLoader>, and invalidated after receiver completion
diff --git a/content/browser/worker_host/worker_script_loader_factory_unittest.cc b/content/browser/worker_host/worker_script_loader_factory_unittest.cc index 8af70181..9fae25f 100644 --- a/content/browser/worker_host/worker_script_loader_factory_unittest.cc +++ b/content/browser/worker_host/worker_script_loader_factory_unittest.cc
@@ -97,7 +97,7 @@ auto factory = std::make_unique<WorkerScriptLoaderFactory>( kProcessId, DedicatedOrSharedWorkerToken(), service_worker_handle_.get(), /*appcache_host=*/nullptr, browser_context_getter_, - network_loader_factory_); + network_loader_factory_, ukm::kInvalidSourceId); // Load the script. GURL url("https://www.example.com/worker.js"); @@ -122,7 +122,7 @@ auto factory = std::make_unique<WorkerScriptLoaderFactory>( kProcessId, DedicatedOrSharedWorkerToken(), service_worker_handle_.get(), nullptr /* appcache_host */, browser_context_getter_, - network_loader_factory_); + network_loader_factory_, ukm::kInvalidSourceId); // Destroy the handle. service_worker_handle_.reset(); @@ -146,7 +146,7 @@ auto factory = std::make_unique<WorkerScriptLoaderFactory>( kProcessId, DedicatedOrSharedWorkerToken(), service_worker_handle_.get(), nullptr /* appcache_host */, browser_context_getter_, - network_loader_factory_); + network_loader_factory_, ukm::kInvalidSourceId); // Set a null browser context. helper_->context_wrapper()->Shutdown();
diff --git a/content/common/agent_scheduling_group.mojom b/content/common/agent_scheduling_group.mojom index 19106e8..132ea76f 100644 --- a/content/common/agent_scheduling_group.mojom +++ b/content/common/agent_scheduling_group.mojom
@@ -211,8 +211,9 @@ // Tells the renderer to destroy an existing view. This method must be called // exactly once for each invocation of CreateView. |view_id| is synonymous - // with |routing_id|. - DestroyView(int32 view_id); + // with |routing_id|. A callback is provided so the browser receives + // notification the destruction is complete. + DestroyView(int32 view_id) => (); // Tells the renderer to create a new RenderFrame. CreateFrame(CreateFrameParams params);
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index 6f122e19..1f64242 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -426,12 +426,6 @@ pending_associated_remote<blink.mojom.Widget> blink_widget) => (int32 routing_id); - // Similar to CreateNewWidget except the widget is a full screen window. - [Sync] CreateNewFullscreenWidget( - pending_associated_receiver<blink.mojom.WidgetHost> blink_widget_host, - pending_associated_remote<blink.mojom.Widget> blink_widget) - => (int32 routing_id); - // Creates and returns a KeepAliveHandle. IssueKeepAliveHandle(pending_receiver<KeepAliveHandle> keep_alive_handle);
diff --git a/content/common/widget_messages.h b/content/common/widget_messages.h index 84a6dbf..74b682a 100644 --- a/content/common/widget_messages.h +++ b/content/common/widget_messages.h
@@ -59,8 +59,4 @@ // APIs, and the browser may ignore this message. IPC_MESSAGE_ROUTED1(WidgetHostMsg_RequestSetBounds, gfx::Rect /* bounds */) -// Indicates that the render widget has been closed in response to a -// Close message. -IPC_MESSAGE_CONTROL1(WidgetHostMsg_Close_ACK, int /* old_route_id */) - #endif // CONTENT_COMMON_WIDGET_MESSAGES_H_
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index ec5f5da..0b54d6d 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -147,8 +147,9 @@ ToImpl(render_thread_).CreateView(std::move(params), PassKey()); } -void AgentSchedulingGroup::DestroyView(int32_t view_id) { - ToImpl(render_thread_).DestroyView(view_id, PassKey()); +void AgentSchedulingGroup::DestroyView(int32_t view_id, + DestroyViewCallback callback) { + ToImpl(render_thread_).DestroyView(view_id, std::move(callback), PassKey()); } void AgentSchedulingGroup::CreateFrame(mojom::CreateFrameParamsPtr params) {
diff --git a/content/renderer/agent_scheduling_group.h b/content/renderer/agent_scheduling_group.h index 8fcdc84..4ae51353 100644 --- a/content/renderer/agent_scheduling_group.h +++ b/content/renderer/agent_scheduling_group.h
@@ -108,7 +108,7 @@ // mojom::AgentSchedulingGroup: void CreateView(mojom::CreateViewParamsPtr params) override; - void DestroyView(int32_t view_id) override; + void DestroyView(int32_t view_id, DestroyViewCallback callback) override; void CreateFrame(mojom::CreateFrameParamsPtr params) override; void CreateFrameProxy( int32_t routing_id,
diff --git a/content/renderer/pepper/ppb_image_data_impl.cc b/content/renderer/pepper/ppb_image_data_impl.cc index e90ec2e..2bb3464 100644 --- a/content/renderer/pepper/ppb_image_data_impl.cc +++ b/content/renderer/pepper/ppb_image_data_impl.cc
@@ -18,7 +18,6 @@ #include "ppapi/c/pp_resource.h" #include "ppapi/c/ppb_image_data.h" #include "ppapi/thunk/thunk.h" -#include "skia/ext/legacy_display_globals.h" #include "skia/ext/platform_canvas.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColorPriv.h" @@ -239,8 +238,7 @@ skia_bitmap_.setPixels(shm_mapping_.memory()); // Our platform bitmaps are set to opaque by default, which we don't want. skia_bitmap_.setAlphaType(kPremul_SkAlphaType); - skia_canvas_ = std::make_unique<SkCanvas>( - skia_bitmap_, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + skia_canvas_ = std::make_unique<SkCanvas>(skia_bitmap_); } return skia_bitmap_.isNull() ? nullptr : skia_bitmap_.getAddr32(0, 0); }
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index ecf345a..0998f754 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -1033,6 +1033,8 @@ chrome_untrusted_scheme); WebSecurityPolicy::RegisterURLSchemeAsSupportingFetchAPI( chrome_untrusted_scheme); + WebSecurityPolicy::RegisterURLSchemeAsAllowingWasmEvalCSP( + chrome_untrusted_scheme); // devtools: WebString devtools_scheme(WebString::FromASCII(kChromeDevToolsScheme)); @@ -1669,8 +1671,10 @@ GetWebMainThreadScheduler()->DefaultTaskRunner()); } -void RenderThreadImpl::DestroyView(int32_t view_id, - PassKey<AgentSchedulingGroup>) { +void RenderThreadImpl::DestroyView( + int32_t view_id, + mojom::AgentSchedulingGroup::DestroyViewCallback callback, + PassKey<AgentSchedulingGroup>) { RenderViewImpl* view = RenderViewImpl::FromRoutingID(view_id); DCHECK(view); @@ -1681,7 +1685,13 @@ // RenderViewImpl instance. https://crbug.com/1000035. base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask( FROM_HERE, - base::BindOnce(&RenderViewImpl::Destroy, base::Unretained(view))); + base::BindOnce( + [](RenderViewImpl* view, + mojom::AgentSchedulingGroup::DestroyViewCallback callback) { + view->Destroy(); + std::move(callback).Run(); + }, + base::Unretained(view), std::move(callback))); } void RenderThreadImpl::CreateFrame(mojom::CreateFrameParamsPtr params,
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 14e1dd4..cab50f7e 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -212,7 +212,9 @@ // Formerly in mojom::Renderer (moved to mojom::AgentSchedulingGroup): void CreateView(mojom::CreateViewParamsPtr params, util::PassKey<AgentSchedulingGroup>); - void DestroyView(int32_t view_id, util::PassKey<AgentSchedulingGroup>); + void DestroyView(int32_t view_id, + mojom::AgentSchedulingGroup::DestroyViewCallback, + util::PassKey<AgentSchedulingGroup>); void CreateFrame(mojom::CreateFrameParamsPtr params, util::PassKey<AgentSchedulingGroup>); void CreateFrameProxy(
diff --git a/content/renderer/render_view_fuchsia.cc b/content/renderer/render_view_fuchsia.cc index 383a88cb..0250cf74 100644 --- a/content/renderer/render_view_fuchsia.cc +++ b/content/renderer/render_view_fuchsia.cc
@@ -4,7 +4,6 @@ #include "content/renderer/render_view_impl.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/platform/web_font_render_style.h" namespace content { @@ -36,8 +35,11 @@ RendererPreferencesToSkiaHinting(prefs)); blink::WebFontRenderStyle::SetAutoHint(prefs.use_autohinter); blink::WebFontRenderStyle::SetUseBitmaps(prefs.use_bitmaps); - skia::LegacyDisplayGlobals::SetCachedPixelGeometry( - gfx::FontRenderParams::SubpixelRenderingToSkiaPixelGeometry( + SkFontLCDConfig::SetSubpixelOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + prefs.subpixel_rendering)); + SkFontLCDConfig::SetSubpixelOrientation( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( prefs.subpixel_rendering)); blink::WebFontRenderStyle::SetAntiAlias(prefs.should_antialias_text); blink::WebFontRenderStyle::SetSubpixelRendering(
diff --git a/content/renderer/render_view_linux.cc b/content/renderer/render_view_linux.cc index 64adc50..62f45e5 100644 --- a/content/renderer/render_view_linux.cc +++ b/content/renderer/render_view_linux.cc
@@ -4,9 +4,9 @@ #include "content/renderer/render_view_impl.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #include "third_party/blink/public/platform/web_font_render_style.h" +#include "third_party/skia/include/core/SkFontLCDConfig.h" #include "ui/gfx/font_render_params.h" using blink::WebFontRenderStyle; @@ -56,8 +56,11 @@ WebFontRenderStyle::SetHinting(RendererPreferencesToSkiaHinting(prefs)); WebFontRenderStyle::SetAutoHint(prefs.use_autohinter); WebFontRenderStyle::SetUseBitmaps(prefs.use_bitmaps); - skia::LegacyDisplayGlobals::SetCachedPixelGeometry( - gfx::FontRenderParams::SubpixelRenderingToSkiaPixelGeometry( + SkFontLCDConfig::SetSubpixelOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + prefs.subpixel_rendering)); + SkFontLCDConfig::SetSubpixelOrientation( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( prefs.subpixel_rendering)); WebFontRenderStyle::SetAntiAlias(prefs.should_antialias_text); WebFontRenderStyle::SetSubpixelRendering(
diff --git a/content/renderer/render_view_win.cc b/content/renderer/render_view_win.cc index dd0ae6b..40bf7a6 100644 --- a/content/renderer/render_view_win.cc +++ b/content/renderer/render_view_win.cc
@@ -4,9 +4,9 @@ #include "content/child/webthemeengine_impl_default.h" #include "content/renderer/render_view_impl.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #include "third_party/blink/public/web/win/web_font_rendering.h" +#include "third_party/skia/include/core/SkFontLCDConfig.h" #include "ui/gfx/font_render_params.h" using blink::WebFontRendering; @@ -27,8 +27,11 @@ blink::WebFontRendering::SetStatusFontMetrics( prefs.status_font_family_name.c_str(), prefs.status_font_height); - skia::LegacyDisplayGlobals::SetCachedPixelGeometry( - gfx::FontRenderParams::SubpixelRenderingToSkiaPixelGeometry( + SkFontLCDConfig::SetSubpixelOrder( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( + prefs.subpixel_rendering)); + SkFontLCDConfig::SetSubpixelOrientation( + gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( prefs.subpixel_rendering)); blink::WebFontRendering::SetAntialiasedTextEnabled(
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index aafa30a..38562b8 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -470,9 +470,6 @@ // use the WebWidgetClient while unloading the Frame so we clear this // after. layer_tree_host_ = nullptr; - - // Note the ACK is a control message going to the RenderProcessHost. - agent_scheduling_group_.Send(new WidgetHostMsg_Close_ACK(routing_id())); } blink::WebFrameWidget* RenderWidget::GetFrameWidget() const {
diff --git a/content/renderer/skia_benchmarking_extension.cc b/content/renderer/skia_benchmarking_extension.cc index b5350f5..af81a67 100644 --- a/content/renderer/skia_benchmarking_extension.cc +++ b/content/renderer/skia_benchmarking_extension.cc
@@ -19,7 +19,6 @@ #include "gin/handle.h" #include "gin/object_template_builder.h" #include "skia/ext/benchmarking_canvas.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/web/blink.h" #include "third_party/blink/public/web/web_array_buffer.h" #include "third_party/blink/public/web/web_array_buffer_converter.h" @@ -200,7 +199,7 @@ return; bitmap.eraseARGB(0, 0, 0, 0); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.translate(SkIntToScalar(-clip_rect.x()), SkIntToScalar(-clip_rect.y())); canvas.clipRect(gfx::RectToSkRect(snapped_clip)); @@ -244,9 +243,7 @@ if (!picture.get()) return; - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - SkCanvas canvas(picture->layer_rect.width(), picture->layer_rect.height(), - &props); + SkCanvas canvas(picture->layer_rect.width(), picture->layer_rect.height()); skia::BenchmarkingCanvas benchmarking_canvas(&canvas); picture->picture->playback(&benchmarking_canvas); @@ -271,14 +268,14 @@ // Measure the total time by drawing straight into a bitmap-backed canvas. SkBitmap bitmap; bitmap.allocN32Pixels(bounds.width(), bounds.height()); - SkCanvas bitmap_canvas(bitmap, SkSurfaceProps{}); + SkCanvas bitmap_canvas(bitmap); bitmap_canvas.clear(SK_ColorTRANSPARENT); base::TimeTicks t0 = base::TimeTicks::Now(); picture->picture->playback(&bitmap_canvas); base::TimeDelta total_time = base::TimeTicks::Now() - t0; // Gather per-op timing info by drawing into a BenchmarkingCanvas. - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); skia::BenchmarkingCanvas benchmarking_canvas(&canvas); picture->picture->playback(&benchmarking_canvas);
diff --git a/content/test/data/frame_tree/page_with_cross_origin_frame_at_half.html b/content/test/data/frame_tree/page_with_cross_origin_frame_at_half.html new file mode 100644 index 0000000..0478ca62 --- /dev/null +++ b/content/test/data/frame_tree/page_with_cross_origin_frame_at_half.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<style> +div { + position: absolute; + top: 60%; + width: 100px; + height: 200px; + overflow: scroll; +} +iframe { + width: 100px; + height: 10000px; + border: 0; +} +</style> +<html> +<body> +<div> +<iframe src="/cross-site/baz.com/title1.html"></iframe> +</div> +This page contains a positioned cross-origin iframe. +</body> +</html> \ No newline at end of file
diff --git a/content/test/data/frame_tree/page_with_frame_transformed_into_viewport.html b/content/test/data/frame_tree/page_with_frame_transformed_into_viewport.html new file mode 100644 index 0000000..2b86e7f --- /dev/null +++ b/content/test/data/frame_tree/page_with_frame_transformed_into_viewport.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<style> +div { + transform-origin: top left; + transform: scale(0.5); +} +iframe { + height: 200vh; + width: 100vw; +} +</style> + +<html> +<body> +<div> +<iframe src="about:blank"></iframe> +</div> +</body> +</html>
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 3695e10..0e97202 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -755,11 +755,15 @@ crbug.com/1130118 [ mac apple-apple-a12z ] deqp/functional/gles3/framebufferblit/default_framebuffer_00.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/textures/webgl_canvas/tex-3d-r32f-red-float.html [ RetryOnFailure ] crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/rendering/framebuffer-completeness-unaffected.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z passthrough angle-opengl ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/fbocompleteness.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/fbodepthbuffer.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/shadertexturefunction/texturegrad.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/textureshadow/cube_linear_mipmap_linear_greater.html [ RetryOnFailure ] +crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/textureshadow/cube_linear_mipmap_linear_less.html [ RetryOnFailure ] +crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/texturespecification/texstorage2d_format_size.html [ RetryOnFailure ] crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ]
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index fd97f84..3461b8c 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -148,14 +148,6 @@ std::move(callback).Run(MSG_ROUTING_NONE); } - void CreateNewFullscreenWidget( - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> - blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget, - CreateNewFullscreenWidgetCallback callback) override { - std::move(callback).Run(MSG_ROUTING_NONE); - } - void CreatePortal(mojo::PendingAssociatedReceiver<blink::mojom::Portal>, mojo::PendingAssociatedRemote<blink::mojom::PortalClient>, CreatePortalCallback callback) override {
diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h index 7270986..02e14c7 100644 --- a/content/test/test_render_frame_host.h +++ b/content/test/test_render_frame_host.h
@@ -215,9 +215,6 @@ // callbacks. void SimulateLoadingCompleted(LoadingScenario loading_scenario); - // Expose CreateNewFullscreenWidget for tests. - using RenderFrameHostImpl::CreateNewFullscreenWidget; - protected: void SendCommitNavigation( mojom::NavigationClient* navigation_client,
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index 8cf45c5..3117f4b 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -392,12 +392,6 @@ mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> blink_widget_host, mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) {} -void TestWebContents::CreateNewFullscreenWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) {} - void TestWebContents::ShowCreatedWindow(RenderFrameHost* opener, int route_id, WindowOpenDisposition disposition,
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h index 7b32a99..0cf1a1b 100644 --- a/content/test/test_web_contents.h +++ b/content/test/test_web_contents.h
@@ -181,13 +181,6 @@ blink_widget_host, mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) override; - void CreateNewFullscreenWidget( - AgentSchedulingGroupHost& agent_scheduling_group, - int32_t route_id, - mojo::PendingAssociatedReceiver<blink::mojom::WidgetHost> - blink_widget_host, - mojo::PendingAssociatedRemote<blink::mojom::Widget> blink_widget) - override; void ShowCreatedWindow(RenderFrameHost* opener, int route_id, WindowOpenDisposition disposition,
diff --git a/content/web_test/renderer/test_plugin.cc b/content/web_test/renderer/test_plugin.cc index e476d17..8ea680e 100644 --- a/content/web_test/renderer/test_plugin.cc +++ b/content/web_test/renderer/test_plugin.cc
@@ -429,7 +429,7 @@ SkImageInfo::MakeN32Premul(rect_.width, rect_.height); SkBitmap bitmap; bitmap.installPixels(info, memory, info.minRowBytes()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(background_color); if (scene_.primitive != PrimitiveNone) {
diff --git a/device/fido/auth_token_requester.cc b/device/fido/auth_token_requester.cc index 6dc8b5c..b054f136 100644 --- a/device/fido/auth_token_requester.cc +++ b/device/fido/auth_token_requester.cc
@@ -177,8 +177,8 @@ } if (status == CtapDeviceResponseCode::kCtap2ErrUvInvalid) { - authenticator_->GetUvRetries(base::BindOnce( - &AuthTokenRequester::OnGetUVRetries, weak_factory_.GetWeakPtr())); + // The attempt failed, but a retry is possible. + ObtainTokenFromInternalUV(); return; } @@ -199,10 +199,7 @@ return; } - if (status != CtapDeviceResponseCode::kSuccess) { - NOTREACHED(); - return; - } + DCHECK_EQ(status, CtapDeviceResponseCode::kSuccess); delegate_->HavePINUVAuthTokenResultForAuthenticator( authenticator_, Result::kSuccess, *response);
diff --git a/device/fido/bio/enroller.h b/device/fido/bio/enroller.h index f878c488..238e1f4 100644 --- a/device/fido/bio/enroller.h +++ b/device/fido/bio/enroller.h
@@ -46,6 +46,7 @@ void Cancel(); pin::TokenResponse token() { return token_; } + FidoAuthenticator* authenticator() { return authenticator_; } private: enum State {
diff --git a/device/fido/cable/fido_tunnel_device.cc b/device/fido/cable/fido_tunnel_device.cc index 26f1196..bd385519 100644 --- a/device/fido/cable/fido_tunnel_device.cc +++ b/device/fido/cable/fido_tunnel_device.cc
@@ -81,13 +81,12 @@ QRInfo& info = absl::get<QRInfo>(info_); info.pairing_callback = std::move(pairing_callback); - info.decrypted_eid = decrypted_eid; info.local_identity_seed = fido_parsing_utils::Materialize(local_identity_seed); info.tunnel_server_domain = components.tunnel_server_domain; - info.psk = Derive<EXTENT(info.psk)>(secret, components.nonce, - DerivedValueType::kPSK); + info.psk = + Derive<EXTENT(info.psk)>(secret, decrypted_eid, DerivedValueType::kPSK); std::array<uint8_t, 16> tunnel_id; tunnel_id = Derive<EXTENT(tunnel_id)>(secret, components.nonce, @@ -176,8 +175,7 @@ return false; } - info.decrypted_eid = *plaintext; - info.psk = Derive<EXTENT(*info.psk)>(info.secret, components.nonce, + info.psk = Derive<EXTENT(*info.psk)>(info.secret, *plaintext, DerivedValueType::kPSK); if (state_ == State::kWaitingForEID) { @@ -332,14 +330,13 @@ if (auto* info = absl::get_if<QRInfo>(&info_)) { base::Optional<ResponderResult> inner_result(cablev2::RespondToHandshake( - info->psk, info->decrypted_eid, info->local_identity_seed, - base::nullopt, data, &response)); + info->psk, info->local_identity_seed, base::nullopt, data, &response)); if (inner_result) { result.emplace(std::move(*inner_result)); } state_ = State::kHandshakeProcessed; } else if (auto* info = absl::get_if<PairedInfo>(&info_)) { - if (!info->decrypted_eid) { + if (!info->psk) { DCHECK_EQ(state_, State::kConnected); state_ = State::kWaitingForEID; info->handshake_message = fido_parsing_utils::Materialize(data); @@ -347,7 +344,7 @@ } base::Optional<ResponderResult> inner_result( - cablev2::RespondToHandshake(*info->psk, *info->decrypted_eid, + cablev2::RespondToHandshake(*info->psk, /*local_identity=*/base::nullopt, info->peer_identity, data, &response)); if (inner_result) {
diff --git a/device/fido/cable/v2_authenticator.cc b/device/fido/cable/v2_authenticator.cc index d4fc1161..ad65ce8 100644 --- a/device/fido/cable/v2_authenticator.cc +++ b/device/fido/cable/v2_authenticator.cc
@@ -237,17 +237,11 @@ device::cablev2::DerivedValueType::kEIDKey)), network_context_(network_context), peer_identity_(device::fido_parsing_utils::Materialize(peer_identity)), - generate_pairing_data_(std::move(generate_pairing_data)) { + generate_pairing_data_(std::move(generate_pairing_data)), + secret_(fido_parsing_utils::Materialize(secret)) { DCHECK_EQ(state_, State::kNone); - state_ = State::kConnecting; - std::array<uint8_t, device::cablev2::kPSKSize> psk; - psk = device::cablev2::Derive<EXTENT(psk)>( - secret, nonce_, device::cablev2::DerivedValueType::kPSK); - handshaker_ = std::make_unique<device::cablev2::HandshakeInitiator>( - psk, peer_identity, /*local_identity=*/nullptr); - websocket_client_ = std::make_unique<device::cablev2::WebSocketAdapter>( base::BindOnce(&TunnelTransport::OnTunnelReady, base::Unretained(this)), base::BindRepeating(&TunnelTransport::OnTunnelData, @@ -271,17 +265,13 @@ secret, client_nonce, device::cablev2::DerivedValueType::kEIDKey)), - network_context_(network_context) { + network_context_(network_context), + secret_(fido_parsing_utils::Materialize(secret)), + local_identity_(std::move(local_identity)) { DCHECK_EQ(state_, State::kNone); state_ = State::kConnectingPaired; - std::array<uint8_t, device::cablev2::kPSKSize> psk; - psk = device::cablev2::Derive<EXTENT(psk)>( - secret, nonce_, device::cablev2::DerivedValueType::kPSK); - handshaker_ = std::make_unique<device::cablev2::HandshakeInitiator>( - psk, /*peer_identity=*/base::nullopt, std::move(local_identity)); - websocket_client_ = std::make_unique<device::cablev2::WebSocketAdapter>( base::BindOnce(&TunnelTransport::OnTunnelReady, base::Unretained(this)), base::BindRepeating(&TunnelTransport::OnTunnelData, @@ -363,8 +353,15 @@ kZeroRoutingID = {0, 0, 0}; const device::CableEidArray plaintext_eid = StartAdvertising(routing_id.value_or(kZeroRoutingID)); + + std::array<uint8_t, device::cablev2::kPSKSize> psk; + psk = device::cablev2::Derive<EXTENT(psk)>( + secret_, plaintext_eid, device::cablev2::DerivedValueType::kPSK); + handshaker_ = std::make_unique<device::cablev2::HandshakeInitiator>( + psk, peer_identity_, std::move(local_identity_)); + std::vector<uint8_t> msg = - handshaker_->BuildInitialMessage(plaintext_eid, BuildGetInfoResponse()); + handshaker_->BuildInitialMessage(BuildGetInfoResponse()); websocket_client_->Write(msg); } @@ -449,6 +446,8 @@ network::mojom::NetworkContext* const network_context_; const base::Optional<std::array<uint8_t, kP256X962Length>> peer_identity_; GeneratePairingDataCallback generate_pairing_data_; + const std::vector<uint8_t> secret_; + bssl::UniquePtr<EC_KEY> local_identity_; GURL target_; std::unique_ptr<Platform::BLEAdvert> ble_advert_; base::RepeatingCallback<void(base::Optional<std::vector<uint8_t>>)>
diff --git a/device/fido/cable/v2_handshake.cc b/device/fido/cable/v2_handshake.cc index e0e8565..61fde3fd 100644 --- a/device/fido/cable/v2_handshake.cc +++ b/device/fido/cable/v2_handshake.cc
@@ -541,11 +541,8 @@ HandshakeInitiator::~HandshakeInitiator() = default; std::vector<uint8_t> HandshakeInitiator::BuildInitialMessage( - base::span<const uint8_t, kCableEphemeralIdSize> eid, base::span<const uint8_t> get_info_bytes) { - uint8_t prologue[1 + kCableEphemeralIdSize]; - DCHECK_EQ(kCableEphemeralIdSize, eid.size()); - memcpy(&prologue[1], eid.data(), kCableEphemeralIdSize); + uint8_t prologue[1]; if (peer_identity_) { noise_.Init(Noise::HandshakeType::kNKpsk0); @@ -670,7 +667,6 @@ base::Optional<ResponderResult> RespondToHandshake( base::span<const uint8_t, 32> psk, - base::span<const uint8_t, kCableEphemeralIdSize> eid, base::Optional<base::span<const uint8_t, kQRSeedSize>> identity_seed, base::Optional<base::span<const uint8_t, kP256X962Length>> peer_identity, base::span<const uint8_t> in, @@ -693,8 +689,7 @@ } Noise noise; - uint8_t prologue[1 + EXTENT(eid)]; - memcpy(&prologue[1], eid.data(), eid.size()); + uint8_t prologue[1]; if (identity) { noise.Init(device::Noise::HandshakeType::kNKpsk0); prologue[0] = 0;
diff --git a/device/fido/cable/v2_handshake.h b/device/fido/cable/v2_handshake.h index d002935..26bb711b 100644 --- a/device/fido/cable/v2_handshake.h +++ b/device/fido/cable/v2_handshake.h
@@ -248,9 +248,6 @@ // BuildInitialMessage returns the handshake message to send to the peer to // start a handshake. std::vector<uint8_t> BuildInitialMessage( - // eid is the EID that was advertised for this handshake. This is checked - // as part of the handshake. - base::span<const uint8_t, kCableEphemeralIdSize> eid, // getinfo contains the CBOR-serialised getInfo response for this // authenticator. This is assumed not to contain highly-sensitive // information and is included to avoid an extra round-trip. (It is @@ -297,9 +294,6 @@ // psk is derived from the connection nonce and either QR-code secrets or // pairing secrets. base::span<const uint8_t, 32> psk, - // eid is the EID that was advertised for this handshake. This is checked - // as part of the handshake. - base::span<const uint8_t, kCableEphemeralIdSize> eid, // identity_seed, if not nullopt, specifies that this is a QR handshake and // contains the seed for QR key for this client. base::Optional<base::span<const uint8_t, kQRSeedSize>> identity_seed,
diff --git a/device/fido/cable/v2_handshake_fuzzer.cc b/device/fido/cable/v2_handshake_fuzzer.cc index bdc47dd9..8af8de8 100644 --- a/device/fido/cable/v2_handshake_fuzzer.cc +++ b/device/fido/cable/v2_handshake_fuzzer.cc
@@ -22,8 +22,6 @@ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; -constexpr std::array<uint8_t, 16> kTestEphemeralID = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; constexpr std::array<uint8_t, 65> kTestPeerIdentity = { 0x04, 0x67, 0x80, 0xc5, 0xfc, 0x70, 0x27, 0x5e, 0x2c, 0x70, 0x61, 0xa0, 0xe7, 0x87, 0x7b, 0xb1, 0x74, 0xde, 0xad, 0xeb, 0x98, 0x87, @@ -66,12 +64,12 @@ if (initiate) { cablev2::HandshakeInitiator handshaker(kTestPSK, peer_identity, std::move(local_key)); - handshaker.BuildInitialMessage(kTestEphemeralID, kTestGetInfoBytes); + handshaker.BuildInitialMessage(kTestGetInfoBytes); handshaker.ProcessResponse(input); } else { std::vector<uint8_t> response; - cablev2::RespondToHandshake(kTestPSK, kTestEphemeralID, local_seed, - peer_identity, input, &response); + cablev2::RespondToHandshake(kTestPSK, local_seed, peer_identity, input, + &response); } return 0;
diff --git a/device/fido/cable/v2_handshake_unittest.cc b/device/fido/cable/v2_handshake_unittest.cc index 321e169..c01c4ae 100644 --- a/device/fido/cable/v2_handshake_unittest.cc +++ b/device/fido/cable/v2_handshake_unittest.cc
@@ -146,7 +146,6 @@ public: CableV2HandshakeTest() { std::fill(psk_.begin(), psk_.end(), 0); - std::fill(eid_.begin(), eid_.end(), 1); std::fill(identity_seed_.begin(), identity_seed_.end(), 2); bssl::UniquePtr<EC_GROUP> group( @@ -162,7 +161,6 @@ protected: std::array<uint8_t, 32> psk_; - CableEidArray eid_; bssl::UniquePtr<EC_KEY> identity_key_; std::array<uint8_t, kP256X962Length> identity_public_; std::array<uint8_t, kQRSeedSize> identity_seed_; @@ -204,11 +202,10 @@ HandshakeInitiator initiator(use_correct_key ? psk_ : wrong_psk, identity_public_, /*local_identity=*/nullptr); - std::vector<uint8_t> message = - initiator.BuildInitialMessage(eid_, kGetInfoBytes); + std::vector<uint8_t> message = initiator.BuildInitialMessage(kGetInfoBytes); std::vector<uint8_t> response; base::Optional<ResponderResult> responder_result(RespondToHandshake( - psk_, eid_, identity_seed_, + psk_, identity_seed_, /*peer_identity=*/base::nullopt, message, &response)); ASSERT_EQ(responder_result.has_value(), use_correct_key); if (!use_correct_key) { @@ -241,11 +238,10 @@ HandshakeInitiator initiator(psk_, /*peer_identity=*/base::nullopt, bssl::UniquePtr<EC_KEY>(key)); - std::vector<uint8_t> message = - initiator.BuildInitialMessage(eid_, kGetInfoBytes); + std::vector<uint8_t> message = initiator.BuildInitialMessage(kGetInfoBytes); std::vector<uint8_t> response; base::Optional<ResponderResult> responder_result(RespondToHandshake( - psk_, eid_, + psk_, /*identity_seed=*/base::nullopt, identity_public_, message, &response)); ASSERT_EQ(responder_result.has_value(), use_correct_key);
diff --git a/device/fido/fido_authenticator.cc b/device/fido/fido_authenticator.cc index efab866..263d466f 100644 --- a/device/fido/fido_authenticator.cc +++ b/device/fido/fido_authenticator.cc
@@ -59,11 +59,11 @@ NOTREACHED(); } -FidoAuthenticator::MakeCredentialPINDisposition -FidoAuthenticator::WillNeedPINToMakeCredential( +FidoAuthenticator::MakeCredentialPINUVDisposition +FidoAuthenticator::PINUVDispositionForMakeCredential( const CtapMakeCredentialRequest& request, const FidoRequestHandlerBase::Observer* observer) { - return MakeCredentialPINDisposition::kNoPIN; + return MakeCredentialPINUVDisposition::kNoUV; } FidoAuthenticator::GetAssertionPINDisposition
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h index 723f3ae..0cbb756c 100644 --- a/device/fido/fido_authenticator.h +++ b/device/fido/fido_authenticator.h
@@ -137,28 +137,29 @@ const std::string& new_pin, SetPINCallback callback); - // MakeCredentialPINDisposition enumerates the possible interactions between - // a user-verification level, the PIN configuration of an authenticator, and - // whether the embedder is capable of collecting PINs from the user. - enum class MakeCredentialPINDisposition { - // kNoPIN means that a PIN will not be needed to make this credential. - kNoPIN, - // kUsePIN means that a PIN must be gathered and used to make this + // MakeCredentialPINUVDisposition enumerates the possible options for + // obtaining user verification when making a credential. + enum class MakeCredentialPINUVDisposition { + // No UV (neither clientPIN nor internal) is needed to make this // credential. - kUsePIN, - // kUsePINForFallback means that a PIN may be used for fallback if internal - // user verification fails. - kUsePINForFallback, - // kSetPIN means that the operation should set and then use a PIN to - // make this credential. - kSetPIN, - // kUnsatisfiable means that the request cannot be satisfied by this - // authenticator. + kNoUV, + // A PIN/UV Auth Token should be used to make this credential. The token + // needs to be obtained via clientPIN or internal UV, depending on which + // modality the device supports. The modality may need to be set up first. + kGetToken, + // The request should be sent with the `uv` bit set to true, in order to + // perform internal user verification without a PIN/UV Auth Token. + kNoTokenInternalUV, + // Same as kNoTokenInternalUV, but a PIN can be used as a fallback. (A PIN + // may have to be set first.) + kNoTokenInternalUVPINFallback, + // The request cannot be satisfied by this authenticator. kUnsatisfiable, }; - // WillNeedPINToMakeCredential returns what type of PIN intervention will be - // needed to serve the given request on this authenticator. - virtual MakeCredentialPINDisposition WillNeedPINToMakeCredential( + // PINUVDispositionForMakeCredential returns whether and how user verification + // should be obtained in order to serve the given request on this + // authenticator. + virtual MakeCredentialPINUVDisposition PINUVDispositionForMakeCredential( const CtapMakeCredentialRequest& request, const FidoRequestHandlerBase::Observer* observer);
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc index fcf6742..2ceb324 100644 --- a/device/fido/fido_device_authenticator.cc +++ b/device/fido/fido_device_authenticator.cc
@@ -28,6 +28,11 @@ namespace device { +using ClientPinAvailability = + AuthenticatorSupportedOptions::ClientPinAvailability; +using UserVerificationAvailability = + AuthenticatorSupportedOptions::UserVerificationAvailability; + namespace { // Helper method for determining correct bio enrollment version. @@ -106,8 +111,7 @@ // request can be translated to U2F. if (!request.pin_auth && options_->user_verification_availability == - AuthenticatorSupportedOptions::UserVerificationAvailability:: - kSupportedAndConfigured && + UserVerificationAvailability::kSupportedAndConfigured && !request.is_u2f_only) { request.user_verification = UserVerificationRequirement::kRequired; } else { @@ -151,8 +155,7 @@ GetAssertionCallback callback) { if (!request.pin_auth && options_->user_verification_availability == - AuthenticatorSupportedOptions::UserVerificationAvailability:: - kSupportedAndConfigured && + UserVerificationAvailability::kSupportedAndConfigured && request.user_verification != UserVerificationRequirement::kDiscouraged) { request.user_verification = UserVerificationRequirement::kRequired; } else { @@ -197,7 +200,7 @@ void FidoDeviceAuthenticator::GetPinRetries(GetRetriesCallback callback) { DCHECK(Options()); DCHECK(Options()->client_pin_availability != - AuthenticatorSupportedOptions::ClientPinAvailability::kNotSupported); + ClientPinAvailability::kNotSupported); DCHECK(chosen_pin_uv_auth_protocol_); RunOperation<pin::PinRetriesRequest, pin::RetriesResponse>( @@ -209,10 +212,10 @@ void FidoDeviceAuthenticator::GetEphemeralKey( GetEphemeralKeyCallback callback) { DCHECK(Options()); - DCHECK( - Options()->client_pin_availability != - AuthenticatorSupportedOptions::ClientPinAvailability::kNotSupported || - Options()->supports_pin_uv_auth_token || SupportsHMACSecretExtension()); + DCHECK(Options()->client_pin_availability != + ClientPinAvailability::kNotSupported || + Options()->supports_pin_uv_auth_token || + SupportsHMACSecretExtension()); DCHECK(chosen_pin_uv_auth_protocol_); RunOperation<pin::KeyAgreementRequest, pin::KeyAgreementResponse>( @@ -227,7 +230,7 @@ GetTokenCallback callback) { DCHECK(Options()); DCHECK(Options()->client_pin_availability != - AuthenticatorSupportedOptions::ClientPinAvailability::kNotSupported); + ClientPinAvailability::kNotSupported); DCHECK_NE(permissions.size(), 0u); DCHECK(!((base::Contains(permissions, pin::Permissions::kMakeCredential)) || base::Contains(permissions, pin::Permissions::kGetAssertion)) || @@ -274,7 +277,7 @@ SetPINCallback callback) { DCHECK(Options()); DCHECK(Options()->client_pin_availability != - AuthenticatorSupportedOptions::ClientPinAvailability::kNotSupported); + ClientPinAvailability::kNotSupported); GetEphemeralKey(base::BindOnce( &FidoDeviceAuthenticator::OnHaveEphemeralKeyForSetPIN, @@ -301,7 +304,7 @@ SetPINCallback callback) { DCHECK(Options()); DCHECK(Options()->client_pin_availability != - AuthenticatorSupportedOptions::ClientPinAvailability::kNotSupported); + ClientPinAvailability::kNotSupported); GetEphemeralKey( base::BindOnce(&FidoDeviceAuthenticator::OnHaveEphemeralKeyForChangePIN, @@ -325,25 +328,22 @@ std::move(callback), base::BindOnce(&pin::EmptyResponse::Parse)); } -FidoAuthenticator::MakeCredentialPINDisposition -FidoDeviceAuthenticator::WillNeedPINToMakeCredential( +FidoAuthenticator::MakeCredentialPINUVDisposition +FidoDeviceAuthenticator::PINUVDispositionForMakeCredential( const CtapMakeCredentialRequest& request, const FidoRequestHandlerBase::Observer* observer) { - using ClientPinAvailability = - AuthenticatorSupportedOptions::ClientPinAvailability; - - const auto device_support = Options()->client_pin_availability; const bool can_collect_pin = observer && observer->SupportsPIN(); + const bool pin_supported = Options()->client_pin_availability != + ClientPinAvailability::kNotSupported; + const bool pin_configured = Options()->client_pin_availability == + ClientPinAvailability::kSupportedAndPinSet; - // Authenticators with built-in UV can use that. - if (Options()->user_verification_availability == - AuthenticatorSupportedOptions::UserVerificationAvailability:: - kSupportedAndConfigured) { - return device_support == ClientPinAvailability::kSupportedAndPinSet && - can_collect_pin - ? MakeCredentialPINDisposition::kUsePINForFallback - : MakeCredentialPINDisposition::kNoPIN; - } + const bool uv_configured = + Options()->user_verification_availability == + UserVerificationAvailability::kSupportedAndConfigured; + + const bool can_get_token = + (can_collect_pin && pin_supported) || CanGetUvToken(); // CTAP 2.0 requires a PIN for credential creation once a PIN has been set. // Thus, if fallback to U2F isn't possible, a PIN will be needed if set. @@ -352,48 +352,29 @@ device()->device_info()->versions.contains(ProtocolVersion::kU2f) && IsConvertibleToU2fRegisterCommand(request) && !ShouldPreferCTAP2EvenIfItNeedsAPIN(request); - if (device_support == ClientPinAvailability::kSupportedAndPinSet && - !u2f_fallback_possible) { - if (can_collect_pin) { - return MakeCredentialPINDisposition::kUsePIN; - } else { - return MakeCredentialPINDisposition::kUnsatisfiable; - } + const bool uv_required = + request.user_verification == UserVerificationRequirement::kRequired || + (pin_configured && !u2f_fallback_possible); + const bool uv_preferred = + request.user_verification == UserVerificationRequirement::kPreferred; + + if (!uv_required && !(uv_preferred && (pin_configured || uv_configured))) { + return MakeCredentialPINUVDisposition::kNoUV; } - // If a PIN cannot be collected, and UV is required, then this request cannot - // be met. - if (request.user_verification == UserVerificationRequirement::kRequired && - (!can_collect_pin || - device_support == ClientPinAvailability::kNotSupported)) { - return MakeCredentialPINDisposition::kUnsatisfiable; + // Authenticators with built-in UV that don't support UV token should try + // sending the request as-is with uv=true first. + if (uv_configured && !CanGetUvToken()) { + return (can_collect_pin && pin_supported) + ? MakeCredentialPINUVDisposition::kNoTokenInternalUVPINFallback + : MakeCredentialPINUVDisposition::kNoTokenInternalUV; } - // If UV is required and a PIN can be set, set it during the MakeCredential - // process. - if (device_support == ClientPinAvailability::kSupportedButPinNotSet && - request.user_verification == UserVerificationRequirement::kRequired) { - return MakeCredentialPINDisposition::kSetPIN; + if (can_get_token) { + return MakeCredentialPINUVDisposition::kGetToken; } - // If discouraged, then either a PIN isn't set (thus we don't use one), or - // else the device supports U2F (because the alternative was handled above) - // and we'll use a U2F fallback to create a credential without a PIN. - DCHECK(device_support != ClientPinAvailability::kSupportedAndPinSet || - u2f_fallback_possible); - // TODO(agl): perhaps CTAP2 is indicated when, for example, hmac-secret is - // requested? - if (request.user_verification == UserVerificationRequirement::kDiscouraged) { - return MakeCredentialPINDisposition::kNoPIN; - } - - // Otherwise, a PIN will be used only if set. - if (device_support == ClientPinAvailability::kSupportedAndPinSet && - can_collect_pin) { - return MakeCredentialPINDisposition::kUsePIN; - } - - return MakeCredentialPINDisposition::kNoPIN; + return MakeCredentialPINUVDisposition::kUnsatisfiable; } FidoAuthenticator::GetAssertionPINDisposition @@ -409,8 +390,7 @@ // Authenticators with built-in UV can use that. if (Options()->user_verification_availability == - AuthenticatorSupportedOptions::UserVerificationAvailability:: - kSupportedAndConfigured) { + UserVerificationAvailability::kSupportedAndConfigured) { return can_use_pin ? GetAssertionPINDisposition::kUsePINForFallback : GetAssertionPINDisposition::kNoPIN; } @@ -1022,8 +1002,7 @@ void FidoDeviceAuthenticator::GetUvRetries(GetRetriesCallback callback) { DCHECK(Options()); DCHECK(Options()->user_verification_availability != - AuthenticatorSupportedOptions::UserVerificationAvailability:: - kNotSupported); + UserVerificationAvailability::kNotSupported); DCHECK(chosen_pin_uv_auth_protocol_); RunOperation<pin::UvRetriesRequest, pin::RetriesResponse>(
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h index e2ff838..8269303 100644 --- a/device/fido/fido_device_authenticator.h +++ b/device/fido/fido_device_authenticator.h
@@ -59,12 +59,11 @@ void GetUvToken(std::vector<pin::Permissions> permissions, base::Optional<std::string> rp_id, GetTokenCallback callback) override; - void SetPIN(const std::string& pin, - SetPINCallback callback) override; + void SetPIN(const std::string& pin, SetPINCallback callback) override; void ChangePIN(const std::string& old_pin, const std::string& new_pin, SetPINCallback callback) override; - MakeCredentialPINDisposition WillNeedPINToMakeCredential( + MakeCredentialPINUVDisposition PINUVDispositionForMakeCredential( const CtapMakeCredentialRequest& request, const FidoRequestHandlerBase::Observer* observer) override;
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc index 0d8aa7f..c0236bf1 100644 --- a/device/fido/make_credential_request_handler.cc +++ b/device/fido/make_credential_request_handler.cc
@@ -27,10 +27,8 @@ namespace device { -using ClientPinAvailability = - AuthenticatorSupportedOptions::ClientPinAvailability; -using MakeCredentialPINDisposition = - FidoAuthenticator::MakeCredentialPINDisposition; +using MakeCredentialPINUVDisposition = + FidoAuthenticator::MakeCredentialPINUVDisposition; using BioEnrollmentAvailability = AuthenticatorSupportedOptions::BioEnrollmentAvailability; @@ -38,14 +36,14 @@ // Permissions requested for PinUvAuthToken. GetAssertion is needed for silent // probing of credentials. -const std::vector<pin::Permissions> GetMakeCredentialRequestPermissions( +const std::set<pin::Permissions> GetMakeCredentialRequestPermissions( FidoAuthenticator* authenticator) { - std::vector<pin::Permissions> permissions = { - pin::Permissions::kMakeCredential, pin::Permissions::kGetAssertion}; + std::set<pin::Permissions> permissions = {pin::Permissions::kMakeCredential, + pin::Permissions::kGetAssertion}; if (authenticator->Options() && authenticator->Options()->bio_enrollment_availability == BioEnrollmentAvailability::kSupportedButUnprovisioned) { - permissions.emplace_back(pin::Permissions::kBioEnrollment); + permissions.insert(pin::Permissions::kBioEnrollment); } return permissions; } @@ -131,8 +129,8 @@ return MakeCredentialStatus::kAuthenticatorMissingResidentKeys; } - if (authenticator->WillNeedPINToMakeCredential(request, observer) == - MakeCredentialPINDisposition::kUnsatisfiable) { + if (authenticator->PINUVDispositionForMakeCredential(request, observer) == + MakeCredentialPINUVDisposition::kUnsatisfiable) { return MakeCredentialStatus::kAuthenticatorMissingUserVerification; } @@ -424,55 +422,25 @@ return; } - switch ( - authenticator->WillNeedPINToMakeCredential(*request.get(), observer())) { - case MakeCredentialPINDisposition::kUsePIN: - // Skip asking for touch if this is the only available authenticator. - if (active_authenticators().size() == 1 && - options_.allow_skipping_pin_touch) { - CollectPINThenSendRequest(authenticator, std::move(request)); - return; - } - // A PIN will be needed. Just request a touch to let the user select - // this authenticator if they wish. - authenticator->GetTouch(base::BindOnce( - &MakeCredentialRequestHandler::CollectPINThenSendRequest, - weak_factory_.GetWeakPtr(), authenticator, std::move(request))); - return; + const bool skip_pin_touch = + active_authenticators().size() == 1 && options_.allow_skipping_pin_touch; - case MakeCredentialPINDisposition::kSetPIN: - // Skip asking for touch if this is the only available authenticator. - if (active_authenticators().size() == 1 && - options_.allow_skipping_pin_touch) { - SetPINThenSendRequest(authenticator, std::move(request)); - return; - } - // A PIN will be needed. Just request a touch to let the user select - // this authenticator if they wish. - authenticator->GetTouch(base::BindOnce( - &MakeCredentialRequestHandler::SetPINThenSendRequest, - weak_factory_.GetWeakPtr(), authenticator, std::move(request))); - return; - - case MakeCredentialPINDisposition::kNoPIN: - case MakeCredentialPINDisposition::kUsePINForFallback: + auto uv_disposition = authenticator->PINUVDispositionForMakeCredential( + *request.get(), observer()); + switch (uv_disposition) { + case MakeCredentialPINUVDisposition::kNoUV: + case MakeCredentialPINUVDisposition::kNoTokenInternalUV: + case MakeCredentialPINUVDisposition::kNoTokenInternalUVPINFallback: break; - - case MakeCredentialPINDisposition::kUnsatisfiable: + case MakeCredentialPINUVDisposition::kGetToken: + ObtainPINUVAuthToken(authenticator, skip_pin_touch); + return; + case MakeCredentialPINUVDisposition::kUnsatisfiable: // |IsCandidateAuthenticatorPostTouch| should have handled this case. NOTREACHED(); return; } - if (!request->is_u2f_only && - request->user_verification != UserVerificationRequirement::kDiscouraged && - authenticator->CanGetUvToken()) { - authenticator->GetUvRetries(base::BindOnce( - &MakeCredentialRequestHandler::OnStartUvTokenOrFallback, - weak_factory_.GetWeakPtr(), authenticator, std::move(request))); - return; - } - ReportMakeCredentialRequestTransport(authenticator); auto request_copy(*request.get()); // can't copy and move in the same stmt. @@ -488,12 +456,15 @@ FidoAuthenticator* authenticator) { DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); + auth_token_requester_map_.erase(authenticator); + FidoRequestHandlerBase::AuthenticatorRemoved(discovery, authenticator); - if (authenticator == authenticator_) { - authenticator_ = nullptr; - if (state_ == State::kWaitingForPIN || state_ == State::kWaitingForNewPIN || - state_ == State::kWaitingForSecondTouch) { + if (authenticator == selected_authenticator_for_pin_uv_auth_token_) { + selected_authenticator_for_pin_uv_auth_token_ = nullptr; + // Authenticator could have been removed during PIN entry, PIN fallback + // after failed internal UV, or bio enrollment. Bail and show an error. + if (state_ != State::kFinished) { state_ = State::kFinished; std::move(completion_callback_) .Run(MakeCredentialStatus::kAuthenticatorRemovedDuringPINEntry, @@ -502,6 +473,124 @@ } } +void MakeCredentialRequestHandler::AuthenticatorSelectedForPINUVAuthToken( + FidoAuthenticator* authenticator) { + DCHECK_EQ(state_, State::kWaitingForTouch); + state_ = State::kWaitingForToken; + selected_authenticator_for_pin_uv_auth_token_ = authenticator; + + base::EraseIf(auth_token_requester_map_, [authenticator](auto& entry) { + return entry.first != authenticator; + }); + CancelActiveAuthenticators(authenticator->GetId()); +} + +void MakeCredentialRequestHandler::CollectNewPIN( + ProvidePINCallback provide_pin_cb) { + DCHECK_EQ(state_, State::kWaitingForToken); + observer()->CollectPIN(base::nullopt, std::move(provide_pin_cb)); +} + +void MakeCredentialRequestHandler::CollectExistingPIN( + int attempts, + ProvidePINCallback provide_pin_cb) { + DCHECK_EQ(state_, State::kWaitingForToken); + observer()->CollectPIN(attempts, std::move(provide_pin_cb)); +} + +void MakeCredentialRequestHandler::PromptForInternalUVRetry(int attempts) { + DCHECK(state_ == State::kWaitingForTouch || + state_ == State::kWaitingForToken); + observer()->OnRetryUserVerification(attempts); +} + +void MakeCredentialRequestHandler::InternalUVLockedForAuthToken() { + DCHECK(state_ == State::kWaitingForTouch || + state_ == State::kWaitingForToken); + observer()->OnInternalUserVerificationLocked(); +} + +void MakeCredentialRequestHandler::HavePINUVAuthTokenResultForAuthenticator( + FidoAuthenticator* authenticator, + AuthTokenRequester::Result result, + base::Optional<pin::TokenResponse> token_response) { + DCHECK_EQ(state_, State::kWaitingForToken); + DCHECK_EQ(selected_authenticator_for_pin_uv_auth_token_, authenticator); + + base::Optional<MakeCredentialStatus> error; + switch (result) { + case AuthTokenRequester::Result::kPreTouchUnsatisfiableRequest: + case AuthTokenRequester::Result::kPreTouchAuthenticatorResponseInvalid: + FIDO_LOG(ERROR) << "Ignoring MakeCredentialStatus=" + << static_cast<int>(result) << " from " + << authenticator->GetId(); + return; + case AuthTokenRequester::Result::kPostTouchAuthenticatorInternalUVLock: + HandleInternalUvLocked(authenticator); + return; + case AuthTokenRequester::Result::kPostTouchAuthenticatorResponseInvalid: + error = MakeCredentialStatus::kAuthenticatorResponseInvalid; + break; + case AuthTokenRequester::Result::kPostTouchAuthenticatorOperationDenied: + error = MakeCredentialStatus::kUserConsentDenied; + break; + case AuthTokenRequester::Result::kPostTouchAuthenticatorPINSoftLock: + error = MakeCredentialStatus::kSoftPINBlock; + break; + case AuthTokenRequester::Result::kPostTouchAuthenticatorPINHardLock: + error = MakeCredentialStatus::kHardPINBlock; + break; + case AuthTokenRequester::Result::kSuccess: + break; + } + if (error) { + state_ = State::kFinished; + std::move(completion_callback_).Run(*error, base::nullopt, authenticator); + return; + } + + DCHECK_EQ(result, AuthTokenRequester::Result::kSuccess); + + auto request = std::make_unique<CtapMakeCredentialRequest>(request_); + SpecializeRequestForAuthenticator(request.get(), authenticator); + + // If the authenticator supports biometric enrollment but is not enrolled, + // offer enrollment with the request. + if (authenticator->Options()->bio_enrollment_availability == + BioEnrollmentAvailability::kSupportedButUnprovisioned || + authenticator->Options()->bio_enrollment_availability_preview == + BioEnrollmentAvailability::kSupportedButUnprovisioned) { + state_ = State::kBioEnrollment; + bio_enroller_ = + std::make_unique<BioEnroller>(this, authenticator, *token_response); + bio_enrollment_complete_barrier_.emplace(base::BarrierClosure( + 2, base::BindOnce(&MakeCredentialRequestHandler::OnEnrollmentComplete, + weak_factory_.GetWeakPtr(), std::move(request)))); + observer()->StartBioEnrollment( + base::BindOnce(&MakeCredentialRequestHandler::OnEnrollmentDismissed, + weak_factory_.GetWeakPtr())); + return; + } + + DispatchRequestWithToken(authenticator, std::move(request), + std::move(*token_response)); +} + +void MakeCredentialRequestHandler::ObtainPINUVAuthToken( + FidoAuthenticator* authenticator, + bool skip_pin_touch) { + AuthTokenRequester::Options options; + options.token_permissions = + GetMakeCredentialRequestPermissions(authenticator); + options.rp_id = request_.rp.id; + options.skip_pin_touch = skip_pin_touch; + + auth_token_requester_map_.insert( + {authenticator, std::make_unique<AuthTokenRequester>( + this, authenticator, std::move(options))}); + auth_token_requester_map_.at(authenticator)->ObtainPINUVAuthToken(); +} + void MakeCredentialRequestHandler::HandleResponse( FidoAuthenticator* authenticator, std::unique_ptr<CtapMakeCredentialRequest> request, @@ -511,7 +600,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); if (state_ != State::kWaitingForTouch && - state_ != State::kWaitingForSecondTouch) { + state_ != State::kWaitingForResponseWithToken) { return; } @@ -542,29 +631,25 @@ } #endif - // Requests that require a PIN should follow the |GetTouch| path initially. - MakeCredentialPINDisposition will_need_pin = - authenticator->WillNeedPINToMakeCredential(*request, observer()); - DCHECK(state_ == State::kWaitingForSecondTouch || - will_need_pin == MakeCredentialPINDisposition::kNoPIN || - will_need_pin == MakeCredentialPINDisposition::kUsePINForFallback); - - if ((status == CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid || + // If we requested UV from an authentiator without uvToken support, UV failed, + // and the authenticator supports PIN, fall back to that. + if (request->user_verification != UserVerificationRequirement::kDiscouraged && + !request->pin_auth && + (status == CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid || status == CtapDeviceResponseCode::kCtap2ErrPinRequired) && - authenticator->WillNeedPINToMakeCredential(*request, observer()) == - MakeCredentialPINDisposition::kUsePINForFallback) { + authenticator->PINUVDispositionForMakeCredential(*request, observer()) == + MakeCredentialPINUVDisposition::kNoTokenInternalUVPINFallback) { // Authenticators without uvToken support will return this error immediately // without user interaction when internal UV is locked. const base::TimeDelta response_time = request_timer.Elapsed(); + observer()->OnInternalUserVerificationLocked(); if (response_time < kMinExpectedAuthenticatorResponseTime) { FIDO_LOG(DEBUG) << "Authenticator is probably locked, response_time=" << response_time; - authenticator->GetTouch(base::BindOnce( - &MakeCredentialRequestHandler::StartPINFallbackForInternalUv, - weak_factory_.GetWeakPtr(), authenticator, std::move(request))); + ObtainPINUVAuthToken(authenticator, /*skip_pin_touch=*/false); return; } - StartPINFallbackForInternalUv(authenticator, std::move(request)); + ObtainPINUVAuthToken(authenticator, /*skip_pin_touch=*/true); return; } @@ -589,7 +674,7 @@ const base::Optional<MakeCredentialStatus> maybe_result = ConvertDeviceResponseCode(status); if (!maybe_result) { - if (state_ == State::kWaitingForSecondTouch) { + if (state_ == State::kWaitingForResponseWithToken) { std::move(completion_callback_) .Run(MakeCredentialStatus::kAuthenticatorResponseInvalid, base::nullopt, authenticator); @@ -633,47 +718,6 @@ .Run(MakeCredentialStatus::kSuccess, std::move(*response), authenticator); } -void MakeCredentialRequestHandler::CollectPINThenSendRequest( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request) { - if (state_ != State::kWaitingForTouch) { - return; - } - DCHECK(observer()); - state_ = State::kGettingRetries; - CancelActiveAuthenticators(authenticator->GetId()); - authenticator_ = authenticator; - authenticator_->GetPinRetries( - base::BindOnce(&MakeCredentialRequestHandler::OnRetriesResponse, - weak_factory_.GetWeakPtr(), std::move(request))); -} - -void MakeCredentialRequestHandler::StartPINFallbackForInternalUv( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request) { - DCHECK(authenticator->WillNeedPINToMakeCredential(*request, observer()) == - MakeCredentialPINDisposition::kUsePINForFallback); - observer()->OnInternalUserVerificationLocked(); - CollectPINThenSendRequest(authenticator, std::move(request)); -} - -void MakeCredentialRequestHandler::SetPINThenSendRequest( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request) { - DCHECK(authenticator->WillNeedPINToMakeCredential(*request, observer()) == - MakeCredentialPINDisposition::kSetPIN); - if (state_ != State::kWaitingForTouch) { - return; - } - state_ = State::kWaitingForNewPIN; - CancelActiveAuthenticators(authenticator->GetId()); - authenticator_ = authenticator; - observer()->CollectPIN( - base::nullopt, - base::BindOnce(&MakeCredentialRequestHandler::OnHavePIN, - weak_factory_.GetWeakPtr(), std::move(request))); -} - void MakeCredentialRequestHandler::HandleInternalUvLocked( FidoAuthenticator* authenticator) { state_ = State::kFinished; @@ -696,144 +740,6 @@ std::move(completion_callback_).Run(capability_error, base::nullopt, nullptr); } -void MakeCredentialRequestHandler::OnHavePIN( - std::unique_ptr<CtapMakeCredentialRequest> request, - std::string pin) { - DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); - DCHECK(state_ == State::kWaitingForPIN || state_ == State::kWaitingForNewPIN); - DCHECK(pin::IsValid(pin)); - - if (authenticator_ == nullptr) { - // Authenticator was detached. The request will already have been canceled - // but this callback may have been waiting in a queue. - DCHECK(!completion_callback_); - return; - } - - if (state_ == State::kWaitingForPIN) { - state_ = State::kRequestWithPIN; - base::Optional<std::string> rp_id(request->rp.id); - authenticator_->GetPINToken( - std::move(pin), GetMakeCredentialRequestPermissions(authenticator_), - std::move(rp_id), - base::BindOnce(&MakeCredentialRequestHandler::OnHavePINToken, - weak_factory_.GetWeakPtr(), std::move(request))); - return; - } - - DCHECK_EQ(state_, State::kWaitingForNewPIN); - state_ = State::kSettingPIN; - authenticator_->SetPIN( - pin, base::BindOnce(&MakeCredentialRequestHandler::OnHaveSetPIN, - weak_factory_.GetWeakPtr(), std::move(request), pin)); -} - -void MakeCredentialRequestHandler::OnRetriesResponse( - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::RetriesResponse> response) { - DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); - DCHECK_EQ(state_, State::kGettingRetries); - if (status != CtapDeviceResponseCode::kSuccess) { - state_ = State::kFinished; - std::move(completion_callback_) - .Run(MakeCredentialStatus::kAuthenticatorResponseInvalid, base::nullopt, - nullptr); - return; - } - if (response->retries == 0) { - state_ = State::kFinished; - std::move(completion_callback_) - .Run(MakeCredentialStatus::kHardPINBlock, base::nullopt, nullptr); - return; - } - state_ = State::kWaitingForPIN; - observer()->CollectPIN( - response->retries, - base::BindOnce(&MakeCredentialRequestHandler::OnHavePIN, - weak_factory_.GetWeakPtr(), std::move(request))); -} - -void MakeCredentialRequestHandler::OnHaveSetPIN( - std::unique_ptr<CtapMakeCredentialRequest> request, - std::string pin, - CtapDeviceResponseCode status, - base::Optional<pin::EmptyResponse> response) { - DCHECK_EQ(state_, State::kSettingPIN); - - if (status != CtapDeviceResponseCode::kSuccess) { - state_ = State::kFinished; - std::move(completion_callback_) - .Run(MakeCredentialStatus::kAuthenticatorResponseInvalid, base::nullopt, - nullptr); - return; - } - - // Having just set the PIN, we need to immediately turn around and use it to - // get a PIN token. - state_ = State::kRequestWithPIN; - base::Optional<std::string> rp_id(request->rp.id); - authenticator_->GetPINToken( - std::move(pin), GetMakeCredentialRequestPermissions(authenticator_), - std::move(rp_id), - base::BindOnce(&MakeCredentialRequestHandler::OnHavePINToken, - weak_factory_.GetWeakPtr(), std::move(request))); -} - -void MakeCredentialRequestHandler::OnHavePINToken( - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::TokenResponse> response) { - DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); - DCHECK_EQ(state_, State::kRequestWithPIN); - - if (status == CtapDeviceResponseCode::kCtap2ErrPinInvalid) { - state_ = State::kGettingRetries; - authenticator_->GetPinRetries( - base::BindOnce(&MakeCredentialRequestHandler::OnRetriesResponse, - weak_factory_.GetWeakPtr(), std::move(request))); - return; - } - - if (status != CtapDeviceResponseCode::kSuccess) { - state_ = State::kFinished; - MakeCredentialStatus ret; - switch (status) { - case CtapDeviceResponseCode::kCtap2ErrPinAuthBlocked: - ret = MakeCredentialStatus::kSoftPINBlock; - break; - case CtapDeviceResponseCode::kCtap2ErrPinBlocked: - ret = MakeCredentialStatus::kHardPINBlock; - break; - default: - ret = MakeCredentialStatus::kAuthenticatorResponseInvalid; - break; - } - std::move(completion_callback_).Run(ret, base::nullopt, nullptr); - return; - } - - if (authenticator_->Options()->bio_enrollment_availability == - BioEnrollmentAvailability::kSupportedButUnprovisioned || - authenticator_->Options()->bio_enrollment_availability_preview == - BioEnrollmentAvailability::kSupportedButUnprovisioned) { - // Authenticator supports biometric enrollment but is not enrolled, offer - // enrollment with the request. - state_ = State::kBioEnrollment; - bio_enroller_ = - std::make_unique<BioEnroller>(this, authenticator_, *response); - bio_enrollment_complete_barrier_.emplace(base::BarrierClosure( - 2, base::BindOnce(&MakeCredentialRequestHandler::OnEnrollmentComplete, - weak_factory_.GetWeakPtr(), std::move(request)))); - observer()->StartBioEnrollment( - base::BindOnce(&MakeCredentialRequestHandler::OnEnrollmentDismissed, - weak_factory_.GetWeakPtr())); - return; - } - - DispatchRequestWithToken(std::move(request), std::move(*response)); -} - void MakeCredentialRequestHandler::OnSampleCollected( BioEnrollmentSampleStatus status, int samples_remaining) { @@ -871,138 +777,28 @@ bio_enrollment_complete_barrier_.reset(); auto token = bio_enroller_->token(); + FidoAuthenticator* authenticator = bio_enroller_->authenticator(); + DCHECK_EQ(authenticator, selected_authenticator_for_pin_uv_auth_token_); bio_enroller_.reset(); - DispatchRequestWithToken(std::move(request), std::move(token)); -} - -void MakeCredentialRequestHandler::OnStartUvTokenOrFallback( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::RetriesResponse> response) { - size_t retries; - if (status != CtapDeviceResponseCode::kSuccess) { - FIDO_LOG(ERROR) << "OnStartUvTokenOrFallback() failed for " - << authenticator_->GetDisplayName() - << ", assuming authenticator locked."; - retries = 0; - } else { - retries = response->retries; - } - - if (retries == 0) { - if (authenticator->WillNeedPINToMakeCredential(*request, observer()) == - MakeCredentialPINDisposition::kUsePINForFallback) { - authenticator->GetTouch(base::BindOnce( - &MakeCredentialRequestHandler::StartPINFallbackForInternalUv, - weak_factory_.GetWeakPtr(), authenticator, std::move(request))); - return; - } - authenticator->GetTouch( - base::BindOnce(&MakeCredentialRequestHandler::HandleInternalUvLocked, - weak_factory_.GetWeakPtr(), authenticator)); - } - - base::Optional<std::string> rp_id(request->rp.id); - authenticator->GetUvToken( - GetMakeCredentialRequestPermissions(authenticator), std::move(rp_id), - base::BindOnce(&MakeCredentialRequestHandler::OnHaveUvToken, - weak_factory_.GetWeakPtr(), authenticator, - std::move(request))); -} - -void MakeCredentialRequestHandler::OnUvRetriesResponse( - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::RetriesResponse> response) { - if (status != CtapDeviceResponseCode::kSuccess) { - FIDO_LOG(ERROR) << "OnUvRetriesResponse() failed for " - << authenticator_->GetDisplayName(); - state_ = State::kFinished; - std::move(completion_callback_) - .Run(MakeCredentialStatus::kAuthenticatorResponseInvalid, base::nullopt, - nullptr); - return; - } - state_ = State::kWaitingForTouch; - if (response->retries == 0) { - // Fall back to PIN if able. - if (authenticator_->WillNeedPINToMakeCredential(*request, observer()) == - MakeCredentialPINDisposition::kUsePINForFallback) { - StartPINFallbackForInternalUv(authenticator_, std::move(request)); - return; - } - HandleInternalUvLocked(authenticator_); - return; - } - observer()->OnRetryUserVerification(response->retries); - base::Optional<std::string> rp_id(request->rp.id); - authenticator_->GetUvToken( - GetMakeCredentialRequestPermissions(authenticator_), std::move(rp_id), - base::BindOnce(&MakeCredentialRequestHandler::OnHaveUvToken, - weak_factory_.GetWeakPtr(), authenticator_, - std::move(request))); -} - -void MakeCredentialRequestHandler::OnHaveUvToken( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::TokenResponse> response) { - DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker_); - if (state_ != State::kWaitingForTouch) { - return; - } - - if (status == CtapDeviceResponseCode::kCtap2ErrUvInvalid || - status == CtapDeviceResponseCode::kCtap2ErrOperationDenied || - status == CtapDeviceResponseCode::kCtap2ErrUvBlocked) { - if (status == CtapDeviceResponseCode::kCtap2ErrUvBlocked) { - if (authenticator->WillNeedPINToMakeCredential(*request, observer()) == - MakeCredentialPINDisposition::kUsePINForFallback) { - StartPINFallbackForInternalUv(authenticator, std::move(request)); - return; - } - HandleInternalUvLocked(authenticator); - return; - } - DCHECK(status == CtapDeviceResponseCode::kCtap2ErrUvInvalid || - status == CtapDeviceResponseCode::kCtap2ErrOperationDenied); - CancelActiveAuthenticators(authenticator->GetId()); - authenticator_ = authenticator; - state_ = State::kGettingRetries; - authenticator->GetUvRetries( - base::BindOnce(&MakeCredentialRequestHandler::OnUvRetriesResponse, - weak_factory_.GetWeakPtr(), std::move(request))); - return; - } - - if (status != CtapDeviceResponseCode::kSuccess) { - FIDO_LOG(ERROR) << "Ignoring status " << static_cast<int>(status) - << " from " << authenticator->GetDisplayName(); - return; - } - - CancelActiveAuthenticators(authenticator->GetId()); - authenticator_ = authenticator; - DispatchRequestWithToken(std::move(request), std::move(*response)); + DispatchRequestWithToken(authenticator, std::move(request), std::move(token)); } void MakeCredentialRequestHandler::DispatchRequestWithToken( + FidoAuthenticator* authenticator, std::unique_ptr<CtapMakeCredentialRequest> request, pin::TokenResponse token) { observer()->FinishCollectToken(); - state_ = State::kWaitingForSecondTouch; + state_ = State::kWaitingForResponseWithToken; std::tie(request->pin_protocol, request->pin_auth) = token.PinAuth(request->client_data_hash); - ReportMakeCredentialRequestTransport(authenticator_); + ReportMakeCredentialRequestTransport(authenticator); auto request_copy(*request.get()); // can't copy and move in the same stmt. - authenticator_->MakeCredential( + authenticator->MakeCredential( std::move(request_copy), base::BindOnce(&MakeCredentialRequestHandler::HandleResponse, - weak_factory_.GetWeakPtr(), authenticator_, + weak_factory_.GetWeakPtr(), authenticator, std::move(request), base::ElapsedTimer())); }
diff --git a/device/fido/make_credential_request_handler.h b/device/fido/make_credential_request_handler.h index 18d30ead..3bd9016e 100644 --- a/device/fido/make_credential_request_handler.h +++ b/device/fido/make_credential_request_handler.h
@@ -16,6 +16,7 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/sequence_checker.h" +#include "device/fido/auth_token_requester.h" #include "device/fido/authenticator_make_credential_response.h" #include "device/fido/authenticator_selection_criteria.h" #include "device/fido/bio/enroller.h" @@ -37,8 +38,6 @@ class FidoDiscoveryFactory; namespace pin { -struct EmptyResponse; -struct RetriesResponse; class TokenResponse; } // namespace pin @@ -65,6 +64,7 @@ class COMPONENT_EXPORT(DEVICE_FIDO) MakeCredentialRequestHandler : public FidoRequestHandlerBase, + public AuthTokenRequester::Delegate, public BioEnroller::Delegate { public: using CompletionCallback = base::OnceCallback<void( @@ -135,14 +135,10 @@ private: enum class State { kWaitingForTouch, - kWaitingForSecondTouch, - kGettingRetries, - kWaitingForPIN, - kWaitingForNewPIN, - kSettingPIN, - kRequestWithPIN, + kWaitingForToken, kBioEnrollment, kBioEnrollmentDone, + kWaitingForResponseWithToken, kFinished, }; @@ -151,6 +147,19 @@ void AuthenticatorRemoved(FidoDiscoveryBase* discovery, FidoAuthenticator* authenticator) override; + // AuthTokenRequester::Delegate: + void AuthenticatorSelectedForPINUVAuthToken( + FidoAuthenticator* authenticator) override; + void CollectNewPIN(ProvidePINCallback provide_pin_cb) override; + void CollectExistingPIN(int attempts, + ProvidePINCallback provide_pin_cb) override; + void PromptForInternalUVRetry(int attempts) override; + void InternalUVLockedForAuthToken() override; + void HavePINUVAuthTokenResultForAuthenticator( + FidoAuthenticator* authenticator, + AuthTokenRequester::Result result, + base::Optional<pin::TokenResponse> response) override; + // BioEnroller::Delegate: void OnSampleCollected(BioEnrollmentSampleStatus status, int samples_remaining) override; @@ -158,52 +167,23 @@ base::Optional<std::vector<uint8_t>> template_id) override; void OnEnrollmentError(CtapDeviceResponseCode status) override; + void ObtainPINUVAuthToken(FidoAuthenticator* authenticator, + bool skip_pin_touch); + void HandleResponse( FidoAuthenticator* authenticator, std::unique_ptr<CtapMakeCredentialRequest> request, base::ElapsedTimer request_timer, CtapDeviceResponseCode response_code, base::Optional<AuthenticatorMakeCredentialResponse> response); - void CollectPINThenSendRequest( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request); - void StartPINFallbackForInternalUv( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request); - void SetPINThenSendRequest( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request); void HandleInternalUvLocked(FidoAuthenticator* authenticator); void HandleInapplicableAuthenticator( FidoAuthenticator* authenticator, std::unique_ptr<CtapMakeCredentialRequest> request); - void OnHavePIN(std::unique_ptr<CtapMakeCredentialRequest> request, - std::string pin); - void OnRetriesResponse(std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::RetriesResponse> response); - void OnHaveSetPIN(std::unique_ptr<CtapMakeCredentialRequest> request, - std::string pin, - CtapDeviceResponseCode status, - base::Optional<pin::EmptyResponse> response); - void OnHavePINToken(std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::TokenResponse> response); void OnEnrollmentComplete(std::unique_ptr<CtapMakeCredentialRequest> request); void OnEnrollmentDismissed(); - void OnStartUvTokenOrFallback( - FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::RetriesResponse> response); - void OnUvRetriesResponse(std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::RetriesResponse> response); - void OnHaveUvToken(FidoAuthenticator* authenticator, - std::unique_ptr<CtapMakeCredentialRequest> request, - CtapDeviceResponseCode status, - base::Optional<pin::TokenResponse> response); void DispatchRequestWithToken( + FidoAuthenticator* authenticator, std::unique_ptr<CtapMakeCredentialRequest> request, pin::TokenResponse token); @@ -217,12 +197,14 @@ base::Optional<base::RepeatingClosure> bio_enrollment_complete_barrier_; const Options options_; - // authenticator_ points to the authenticator that will be used for this - // operation. It's only set after the user touches an authenticator to select - // it, after which point that authenticator will be used exclusively through - // requesting PIN etc. The object is owned by the underlying discovery object - // and this pointer is cleared if it's removed during processing. - FidoAuthenticator* authenticator_ = nullptr; + std::map<FidoAuthenticator*, std::unique_ptr<AuthTokenRequester>> + auth_token_requester_map_; + + // selected_authenticator_for_pin_uv_auth_token_ points to the authenticator + // that was tapped by the user while requesting a pinUvAuthToken from + // connected authenticators. The object is owned by the underlying discovery + // object and this pointer is cleared if it's removed during processing. + FidoAuthenticator* selected_authenticator_for_pin_uv_auth_token_ = nullptr; base::Optional<pin::TokenResponse> token_; std::unique_ptr<BioEnroller> bio_enroller_; SEQUENCE_CHECKER(my_sequence_checker_);
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc index 68a21a48..6118251 100644 --- a/device/fido/virtual_ctap2_device.cc +++ b/device/fido/virtual_ctap2_device.cc
@@ -58,7 +58,6 @@ {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}}; - struct PinUvAuthTokenPermissions { uint8_t permissions; base::Optional<std::string> rp_id; @@ -1779,7 +1778,9 @@ return base::nullopt; } if (!config_.user_verification_succeeds) { - return CtapDeviceResponseCode::kCtap2ErrUvInvalid; + return mutable_state()->uv_retries > 0 + ? CtapDeviceResponseCode::kCtap2ErrUvInvalid + : CtapDeviceResponseCode::kCtap2ErrUvBlocked; } mutable_state()->pin_retries = kMaxPinRetries;
diff --git a/docs/code_reviews.md b/docs/code_reviews.md index a42add2..ecfe7495 100644 --- a/docs/code_reviews.md +++ b/docs/code_reviews.md
@@ -232,9 +232,7 @@ result of the `//base` change. This is often the same person from the previous step but could be somebody else. - 3. TBR the owner of the lower-level code you're changing (in this example, - `//base`), after they've LGTM'ed the API change, to bypass owners review of - the API consumers incurring trivial side-effects. + 3. TBR the owners of the calling code, after the API change is LGTM'ed. This process ensures that all code is reviewed prior to checkin and that the concept of the change is reviewed by a qualified person, without having to ping @@ -267,4 +265,3 @@ * Be sure to actually send out the email for the code review. If you get one, please actually read the changes. -
diff --git a/extensions/common/image_util.cc b/extensions/common/image_util.cc index 1b30824..14486fdd 100644 --- a/extensions/common/image_util.cc +++ b/extensions/common/image_util.cc
@@ -271,7 +271,7 @@ DCHECK(rendered_icon->empty()); rendered_icon->allocN32Pixels(icon.width(), icon.height()); rendered_icon->eraseColor(background_color); - SkCanvas offscreen(*rendered_icon, SkSurfaceProps{}); + SkCanvas offscreen(*rendered_icon); offscreen.drawImage(SkImage::MakeFromBitmap(icon), 0, 0); offscreen.drawColor(background_color, SkBlendMode::kDifference); }
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index ea0577d..04e3061 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -59,7 +59,6 @@ #include "gpu/command_buffer/service/skia_utils.h" #include "gpu/command_buffer/service/wrapped_sk_image.h" #include "gpu/vulkan/buildflags.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkDeferredDisplayListRecorder.h" #include "third_party/skia/include/core/SkPromiseImageTexture.h" @@ -1596,8 +1595,7 @@ // backed surface for OOP raster commands. auto info = SkImageInfo::MakeN32(10, 10, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - sk_surface_for_testing_ = SkSurface::MakeRaster(info, &props); + sk_surface_for_testing_ = SkSurface::MakeRaster(info); sk_surface_ = sk_surface_for_testing_.get(); raster_canvas_ = sk_surface_->getCanvas(); } @@ -2885,7 +2883,9 @@ uint32_t flags = 0; SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); if (can_use_lcd_text) { - surface_props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(flags); + // LegacyFontHost will get LCD text and skia figures out what type to use. + surface_props = + SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); } SkColorType sk_color_type = viz::ResourceFormatToClosestSkColorType(
diff --git a/gpu/command_buffer/service/test_shared_image_backing.cc b/gpu/command_buffer/service/test_shared_image_backing.cc index e991e305..d51e7bd7 100644 --- a/gpu/command_buffer/service/test_shared_image_backing.cc +++ b/gpu/command_buffer/service/test_shared_image_backing.cc
@@ -6,7 +6,6 @@ #include "build/build_config.h" #include "components/viz/common/resources/resource_format_utils.h" #include "gpu/command_buffer/service/shared_context_state.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkPromiseImageTexture.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" #include "third_party/skia/include/gpu/mock/GrMockTypes.h" @@ -73,9 +72,7 @@ if (!static_cast<TestSharedImageBacking*>(backing())->can_access()) { return nullptr; } - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - return SkSurface::MakeRasterN32Premul(size().width(), size().height(), - &props); + return SkSurface::MakeRasterN32Premul(size().width(), size().height()); } void EndWriteAccess(sk_sp<SkSurface> surface) override {} sk_sp<SkPromiseImageTexture> BeginReadAccess(
diff --git a/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc b/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc index ac165e5e..dc4a02c 100644 --- a/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc +++ b/gpu/command_buffer/tests/shared_image_gl_backing_produce_dawn_unittest.cc
@@ -74,7 +74,9 @@ bool ShouldSkipTest() { // Windows is the only platform enabled passthrough in this test. #if defined(OS_WIN) - return false; + // Skip the test if there is no GPU service holder. It is not created if + // Dawn is not supported on the platform (Win7). + return GetGpuServiceHolder() == nullptr; #else return true; #endif // defined(OS_WIN)
diff --git a/gpu/vulkan/demo/BUILD.gn b/gpu/vulkan/demo/BUILD.gn index ae8cf761..6d4351c 100644 --- a/gpu/vulkan/demo/BUILD.gn +++ b/gpu/vulkan/demo/BUILD.gn
@@ -28,7 +28,6 @@ "//components/tracing:startup_tracing", "//components/viz/common", "//gpu/vulkan/init", - "//skia", "//ui/display/types", "//ui/events", "//ui/events/platform",
diff --git a/gpu/vulkan/demo/DEPS b/gpu/vulkan/demo/DEPS index d590920..e75b1b59 100644 --- a/gpu/vulkan/demo/DEPS +++ b/gpu/vulkan/demo/DEPS
@@ -1,7 +1,6 @@ include_rules = [ "+components/tracing", "+components/viz", - "+skia/ext", "+third_party/skia", "+ui", ]
diff --git a/gpu/vulkan/demo/vulkan_demo.cc b/gpu/vulkan/demo/vulkan_demo.cc index 2ebd3807..cef0156 100644 --- a/gpu/vulkan/demo/vulkan_demo.cc +++ b/gpu/vulkan/demo/vulkan_demo.cc
@@ -12,7 +12,6 @@ #include "gpu/vulkan/vulkan_function_pointers.h" #include "gpu/vulkan/vulkan_implementation.h" #include "gpu/vulkan/vulkan_surface.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkFont.h" #include "third_party/skia/include/core/SkSurface.h" @@ -115,8 +114,7 @@ if (!sk_surface) { SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - + SkSurfaceProps(0, SkSurfaceProps::kLegacyFontHost_InitType); GrVkImageInfo vk_image_info; vk_image_info.fImage = scoped_write_->image(); vk_image_info.fImageLayout = scoped_write_->image_layout();
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 1c69b7b3..9ffcc3e 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -38,6 +38,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -71,6 +75,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -104,6 +112,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -137,6 +149,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -170,6 +186,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -203,6 +223,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -236,6 +260,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -269,6 +297,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -302,6 +334,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -335,6 +371,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -378,6 +418,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -421,6 +465,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -464,6 +512,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -507,6 +559,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -550,6 +606,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -593,6 +653,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -636,6 +700,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -679,6 +747,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -722,6 +794,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -765,6 +841,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -808,6 +888,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -851,6 +935,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -894,6 +982,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -937,6 +1029,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -980,6 +1076,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1023,6 +1123,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1056,6 +1160,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1089,6 +1197,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1122,6 +1234,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1155,6 +1271,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1188,6 +1308,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1221,6 +1345,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1254,6 +1382,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1287,6 +1419,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1320,6 +1456,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1353,6 +1493,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1386,6 +1530,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1419,6 +1567,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1452,6 +1604,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1485,6 +1641,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1518,6 +1678,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1561,6 +1725,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1604,6 +1772,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1637,6 +1809,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1670,6 +1846,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1703,6 +1883,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1736,6 +1920,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1769,6 +1957,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1802,6 +1994,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1835,6 +2031,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1868,6 +2068,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1899,6 +2103,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1930,6 +2138,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1963,6 +2175,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -1996,6 +2212,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2029,6 +2249,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2062,6 +2286,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2095,6 +2323,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2128,6 +2360,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2161,6 +2397,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2194,6 +2434,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2227,6 +2471,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2260,6 +2508,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2293,6 +2545,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2326,6 +2582,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2359,6 +2619,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2392,6 +2656,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2425,6 +2693,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2458,6 +2730,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2491,6 +2767,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2524,6 +2804,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2557,6 +2841,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2590,6 +2878,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2623,6 +2915,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2656,6 +2952,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2689,6 +2989,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2722,6 +3026,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2755,6 +3063,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2798,6 +3110,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2841,6 +3157,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2884,6 +3204,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2925,6 +3249,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -2966,6 +3294,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3007,6 +3339,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3050,6 +3386,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3093,6 +3433,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3136,6 +3480,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3179,6 +3527,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3222,6 +3574,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3265,6 +3621,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3308,6 +3668,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3351,6 +3715,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3394,6 +3762,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3437,6 +3809,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3480,6 +3856,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3523,6 +3903,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3564,6 +3948,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3605,6 +3993,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3648,6 +4040,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3691,6 +4087,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3734,6 +4134,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3767,6 +4171,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3800,6 +4208,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3833,6 +4245,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3866,6 +4282,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3898,6 +4318,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3931,6 +4355,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3964,6 +4392,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -3997,6 +4429,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4030,6 +4466,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4063,6 +4503,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4096,6 +4540,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4128,6 +4576,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4160,6 +4612,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4193,6 +4649,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4226,6 +4686,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4259,6 +4723,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4292,6 +4760,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4325,6 +4797,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4358,6 +4834,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4391,6 +4871,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4424,6 +4908,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4457,6 +4945,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4490,6 +4982,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4523,6 +5019,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4556,6 +5056,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4589,6 +5093,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4632,6 +5140,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4675,6 +5187,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4718,6 +5234,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4761,6 +5281,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4804,6 +5328,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4847,6 +5375,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4890,6 +5422,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4933,6 +5469,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -4976,6 +5516,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5019,6 +5563,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5062,6 +5610,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5105,6 +5657,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5148,6 +5704,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5191,6 +5751,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5234,6 +5798,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5267,6 +5835,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5300,6 +5872,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5333,6 +5909,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5366,6 +5946,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5399,6 +5983,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5442,6 +6030,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5475,6 +6067,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5508,6 +6104,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5541,6 +6141,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5685,6 +6289,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5718,6 +6326,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5751,6 +6363,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5784,6 +6400,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5816,6 +6436,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5848,6 +6472,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5879,6 +6507,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5911,6 +6543,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5942,6 +6578,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -5973,6 +6613,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6040,6 +6684,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6083,6 +6731,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6126,6 +6778,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6169,6 +6825,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6212,6 +6872,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6253,6 +6917,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6296,6 +6964,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6339,6 +7011,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6382,6 +7058,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6425,6 +7105,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6468,6 +7152,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6509,6 +7197,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6552,6 +7244,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6595,6 +7291,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6638,6 +7338,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6681,6 +7385,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6724,6 +7432,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6767,6 +7479,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6880,6 +7596,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6913,6 +7633,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6946,6 +7670,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -6979,6 +7707,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7012,6 +7744,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7045,6 +7781,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7078,6 +7818,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7111,6 +7855,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7144,6 +7892,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7177,6 +7929,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7210,6 +7966,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7243,6 +8003,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7276,6 +8040,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7308,6 +8076,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7341,6 +8113,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7374,6 +8150,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7407,6 +8187,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7477,6 +8261,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7510,6 +8298,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7543,6 +8335,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7576,6 +8372,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7609,6 +8409,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7642,6 +8446,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7675,6 +8483,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7708,6 +8520,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7741,6 +8557,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7774,6 +8594,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7807,6 +8631,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7840,6 +8668,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7872,6 +8704,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7905,6 +8741,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7938,6 +8778,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -7971,6 +8815,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8004,6 +8852,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8037,6 +8889,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8070,6 +8926,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8103,6 +8963,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8136,6 +9000,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8169,6 +9037,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8202,6 +9074,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8235,6 +9111,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8268,6 +9148,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8301,6 +9185,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8334,6 +9222,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8367,6 +9259,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8400,6 +9296,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8436,6 +9336,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8472,6 +9376,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8505,6 +9413,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8538,6 +9450,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8571,6 +9487,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8641,6 +9561,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8674,6 +9598,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8707,6 +9635,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8739,6 +9671,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8807,6 +9743,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8839,6 +9779,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8871,6 +9815,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8903,6 +9851,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8935,6 +9887,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -8967,6 +9923,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9000,6 +9960,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9033,6 +9997,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9076,6 +10044,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9119,6 +10091,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9162,6 +10138,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9205,6 +10185,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9248,6 +10232,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9291,6 +10279,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9334,6 +10326,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9377,6 +10373,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9420,6 +10420,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9463,6 +10467,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9506,6 +10514,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9549,6 +10561,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9592,6 +10608,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9635,6 +10655,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9677,6 +10701,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9709,6 +10737,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9814,6 +10846,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9857,6 +10893,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9899,6 +10939,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9932,6 +10976,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -9975,6 +11023,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10018,6 +11070,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10061,6 +11117,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10104,6 +11164,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10147,6 +11211,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10189,6 +11257,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10221,6 +11293,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10253,6 +11329,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10286,6 +11366,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10319,6 +11403,10 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10352,6 +11440,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10385,6 +11477,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10418,6 +11514,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10451,6 +11551,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10484,6 +11588,10 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10517,6 +11625,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10550,6 +11662,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10657,6 +11773,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10690,6 +11810,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10723,6 +11847,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10756,6 +11884,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10789,6 +11921,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10822,6 +11958,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10855,6 +11995,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10888,6 +12032,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10918,6 +12066,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10951,6 +12103,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -10984,6 +12140,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11017,6 +12177,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11050,6 +12214,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11083,6 +12251,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11186,6 +12358,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11219,6 +12395,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11252,6 +12432,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11285,6 +12469,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11318,6 +12506,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11351,6 +12543,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11384,6 +12580,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11417,6 +12617,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11450,6 +12654,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11483,6 +12691,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11516,6 +12728,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11549,6 +12765,10 @@ build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11582,6 +12802,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11615,6 +12839,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11648,6 +12876,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11681,6 +12913,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11714,6 +12950,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11784,6 +13024,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11817,6 +13061,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11850,6 +13098,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11883,6 +13135,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -11916,6 +13172,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12097,6 +13357,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12130,6 +13394,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12163,6 +13431,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12237,6 +13509,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12272,6 +13548,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12425,6 +13705,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12499,6 +13783,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12908,6 +14196,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -12941,6 +14233,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13011,6 +14307,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13338,6 +14638,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13408,6 +14712,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13589,6 +14897,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13696,6 +15008,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13766,6 +15082,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13798,6 +15118,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13831,6 +15155,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13901,6 +15229,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13934,6 +15266,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -13967,6 +15303,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14000,6 +15340,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14033,6 +15377,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14066,6 +15414,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14099,6 +15451,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14132,6 +15488,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14202,6 +15562,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14348,6 +15712,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14380,6 +15748,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14411,6 +15783,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14444,6 +15820,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14549,6 +15929,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14580,6 +15964,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14683,6 +16071,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -14974,6 +16366,10 @@ build_numbers: YES service_account: "component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15148,6 +16544,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15180,6 +16580,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15213,6 +16617,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15245,6 +16653,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15277,6 +16689,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15309,6 +16725,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15449,6 +16869,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15482,6 +16906,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15515,6 +16943,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15548,6 +16980,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15581,6 +17017,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15614,6 +17054,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15647,6 +17091,10 @@ build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15789,6 +17237,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15821,6 +17273,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 } @@ -15889,6 +17345,10 @@ build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" experiments { + key: "chromium.resultdb.result_sink" + value: 10 + } + experiments { key: "luci.use_realms" value: 100 }
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index ae1b196..57757ac 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -339,6 +339,7 @@ tree_closing = False, notifies = None, resultdb_bigquery_exports = None, + experiments = None, **kwargs): """Define a CI builder. @@ -376,6 +377,8 @@ specifying additional parameters for exporting test results to BigQuery. Will always upload to the luci-resultdb.chromium.ci_test_results table in addition to any tables specified by the list's elements. + experiments - a dict of experiment name to the percentage chance (0-100) + that it will apply to builds generated from this builder. """ if not branches.matches(branch_selector): return @@ -393,6 +396,10 @@ ] merged_resultdb_bigquery_exports.extend(resultdb_bigquery_exports or []) + # Enable "chromium.resultdb.result_sink" on all ci builders for 10% by default. + experiments = experiments or {} + experiments.setdefault("chromium.resultdb.result_sink", 10) + # Define the builder first so that any validation of luci.builder arguments # (e.g. bucket) occurs before we try to use it builders.builder( @@ -400,6 +407,7 @@ branch_selector = branch_selector, resultdb_bigquery_exports = merged_resultdb_bigquery_exports, notifies = notifies, + experiments = experiments, **kwargs )
diff --git a/ios/chrome/browser/metrics/chrome_browser_state_client.h b/ios/chrome/browser/metrics/chrome_browser_state_client.h index 1c01ac6..67075fe 100644 --- a/ios/chrome/browser/metrics/chrome_browser_state_client.h +++ b/ios/chrome/browser/metrics/chrome_browser_state_client.h
@@ -20,6 +20,7 @@ // DemographicMetricsProvider::ProfileClient: int GetNumberOfProfilesOnDisk() override; syncer::SyncService* GetSyncService() override; + PrefService* GetPrefService() override; base::Time GetNetworkTime() const override; DISALLOW_COPY_AND_ASSIGN(ChromeBrowserStateClient);
diff --git a/ios/chrome/browser/metrics/chrome_browser_state_client.mm b/ios/chrome/browser/metrics/chrome_browser_state_client.mm index ee3fc65..f26baf3 100644 --- a/ios/chrome/browser/metrics/chrome_browser_state_client.mm +++ b/ios/chrome/browser/metrics/chrome_browser_state_client.mm
@@ -41,6 +41,16 @@ ->GetOriginalChromeBrowserState()); } +PrefService* ChromeBrowserStateClient::GetPrefService() { + // Get PrefService from BrowserState that was the last to be used. Will create + // a new BrowserState if no BrowserState exists. + return GetApplicationContext() + ->GetChromeBrowserStateManager() + ->GetLastUsedBrowserState() + ->GetOriginalChromeBrowserState() + ->GetPrefs(); +} + int ChromeBrowserStateClient::GetNumberOfProfilesOnDisk() { // Return 1 because there should be only one Profile available. return 1;
diff --git a/ios/chrome/browser/metrics/demographics_egtest.mm b/ios/chrome/browser/metrics/demographics_egtest.mm index 2ebb558..52e514e5 100644 --- a/ios/chrome/browser/metrics/demographics_egtest.mm +++ b/ios/chrome/browser/metrics/demographics_egtest.mm
@@ -196,7 +196,7 @@ @"The report should contain the specified user demographics"); const int success = - static_cast<int>(syncer::UserDemographicsStatus::kSuccess); + static_cast<int>(metrics::UserDemographicsStatus::kSuccess); GREYAssertNil([MetricsAppInterface expectUniqueSampleWithCount:1 forBucket:success @@ -250,7 +250,7 @@ @"The report should contain the specified user demographics"); const int success = - static_cast<int>(syncer::UserDemographicsStatus::kSuccess); + static_cast<int>(metrics::UserDemographicsStatus::kSuccess); GREYAssertNil([MetricsAppInterface expectUniqueSampleWithCount:1 forBucket:success
diff --git a/ios/chrome/browser/prefs/BUILD.gn b/ios/chrome/browser/prefs/BUILD.gn index 86bcb73..813a2d5 100644 --- a/ios/chrome/browser/prefs/BUILD.gn +++ b/ios/chrome/browser/prefs/BUILD.gn
@@ -44,6 +44,7 @@ "//components/invalidation/impl:impl", "//components/language/core/browser", "//components/metrics", + "//components/metrics/demographics", "//components/network_time", "//components/ntp_snippets", "//components/ntp_tiles",
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm index c8668e3..d25bc4f 100644 --- a/ios/chrome/browser/prefs/browser_prefs.mm +++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -17,6 +17,7 @@ #include "components/invalidation/impl/per_user_topic_subscription_manager.h" #include "components/language/core/browser/language_prefs.h" #include "components/language/core/browser/pref_names.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/metrics/metrics_pref_names.h" #include "components/network_time/network_time_tracker.h" #include "components/ntp_snippets/category_rankers/click_based_category_ranker.h" @@ -161,6 +162,7 @@ HostContentSettingsMap::RegisterProfilePrefs(registry); ios::NotificationPromo::RegisterProfilePrefs(registry); language::LanguagePrefs::RegisterProfilePrefs(registry); + metrics::RegisterDemographicsProfilePrefs(registry); ntp_snippets::ClickBasedCategoryRanker::RegisterProfilePrefs(registry); ntp_snippets::ContentSuggestionsService::RegisterProfilePrefs(registry); ntp_snippets::RemoteSuggestionsProviderImpl::RegisterProfilePrefs(registry);
diff --git a/ios/chrome/browser/sync/BUILD.gn b/ios/chrome/browser/sync/BUILD.gn index eb689652..7f13b822 100644 --- a/ios/chrome/browser/sync/BUILD.gn +++ b/ios/chrome/browser/sync/BUILD.gn
@@ -48,6 +48,7 @@ "//components/invalidation/impl", "//components/keyed_service/core", "//components/keyed_service/ios", + "//components/metrics/demographics", "//components/network_time", "//components/password_manager/core/browser", "//components/pref_registry",
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.h b/ios/chrome/browser/sync/ios_chrome_sync_client.h index 6364596..104ab4c 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.h +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.h
@@ -57,6 +57,7 @@ GetControllerDelegateForModelType(syncer::ModelType type) override; syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override; syncer::SyncTypePreferenceProvider* GetPreferenceProvider() override; + void OnLocalSyncTransportDataCleared() override; private: ChromeBrowserState* const browser_state_;
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm index 4cab712c..9ea5ced 100644 --- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -27,6 +27,7 @@ #include "components/invalidation/impl/invalidation_switches.h" #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/keyed_service/core/service_access_type.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/password_manager/core/browser/password_store.h" #include "components/reading_list/core/reading_list_model.h" #include "components/sync/base/report_unrecoverable_error.h" @@ -259,3 +260,8 @@ IOSChromeSyncClient::GetPreferenceProvider() { return nullptr; } + +void IOSChromeSyncClient::OnLocalSyncTransportDataCleared() { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + metrics::ClearDemographicsPrefs(browser_state_->GetPrefs()); +}
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm index 2c0583d..c1319561 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator_unittest.mm
@@ -13,7 +13,7 @@ #include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" #include "components/sync/driver/sync_service.h" -#include "components/sync/model/fake_model_type_controller_delegate.h" +#include "components/sync/test/model/fake_model_type_controller_delegate.h" #include "components/sync_sessions/open_tabs_ui_delegate.h" #include "components/sync_sessions/session_sync_service.h" #include "components/sync_user_events/global_id_mapper.h"
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm index 5a08e98..3c02e3e3 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
@@ -401,6 +401,22 @@ } } +- (BOOL)isItemClickable:(TableViewItem*)item { + SafteyCheckItemType type = static_cast<SafteyCheckItemType>(item.type); + switch (type) { + case UpdateItemType: + return self.updateCheckRowState == UpdateCheckRowStateOutOfDate; + case PasswordItemType: + return self.passwordCheckRowState == PasswordCheckRowStateUnSafe; + case CheckStartItemType: + return YES; + case SafeBrowsingItemType: + case HeaderItem: + case TimestampFooterItem: + return NO; + } +} + - (BOOL)isItemWithErrorInfo:(TableViewItem*)item { SafteyCheckItemType type = static_cast<SafteyCheckItemType>(item.type); return (type != CheckStartItemType);
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm index bd12293e..1e00f8df 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm
@@ -93,7 +93,7 @@ namespace { -typedef NS_ENUM(NSInteger, SafteyCheckItemType) { +typedef NS_ENUM(NSInteger, SafetyCheckItemType) { // CheckTypes section. UpdateItemType = kItemTypeEnumZero, PasswordItemType, @@ -524,3 +524,56 @@ GetNSString(IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_CHANNEL_CANARY_DESC)); EXPECT_TRUE(mediator_.updateCheckItem.infoButtonHidden); } + +// Clickable tests. +TEST_F(SafetyCheckMediatorTest, UpdateClickableOutOfDate) { + mediator_.updateCheckRowState = UpdateCheckRowStateOutOfDate; + [mediator_ reconfigureUpdateCheckItem]; + TableViewItem* updateItem = + [[TableViewItem alloc] initWithType:SafetyCheckItemType::UpdateItemType]; + EXPECT_TRUE([mediator_ isItemClickable:updateItem]); +} + +TEST_F(SafetyCheckMediatorTest, UpdateNonclickableUpToDate) { + mediator_.updateCheckRowState = UpdateCheckRowStateUpToDate; + [mediator_ reconfigureUpdateCheckItem]; + TableViewItem* updateItem = + [[TableViewItem alloc] initWithType:SafetyCheckItemType::UpdateItemType]; + EXPECT_FALSE([mediator_ isItemClickable:updateItem]); +} + +TEST_F(SafetyCheckMediatorTest, PasswordClickableUnsafe) { + mediator_.passwordCheckRowState = PasswordCheckRowStateUnSafe; + [mediator_ reconfigurePasswordCheckItem]; + TableViewItem* passwordItem = [[TableViewItem alloc] + initWithType:SafetyCheckItemType::PasswordItemType]; + EXPECT_TRUE([mediator_ isItemClickable:passwordItem]); +} + +TEST_F(SafetyCheckMediatorTest, PasswordNonclickableSafe) { + mediator_.passwordCheckRowState = PasswordCheckRowStateSafe; + [mediator_ reconfigurePasswordCheckItem]; + TableViewItem* passwordItem = [[TableViewItem alloc] + initWithType:SafetyCheckItemType::PasswordItemType]; + EXPECT_FALSE([mediator_ isItemClickable:passwordItem]); +} + +TEST_F(SafetyCheckMediatorTest, SafeBrowsingNonClickableDefault) { + mediator_.safeBrowsingCheckRowState = SafeBrowsingCheckRowStateDefault; + [mediator_ reconfigureSafeBrowsingCheckItem]; + TableViewItem* safeBrowsingItem = [[TableViewItem alloc] + initWithType:SafetyCheckItemType::SafeBrowsingItemType]; + EXPECT_FALSE([mediator_ isItemClickable:safeBrowsingItem]); +} + +TEST_F(SafetyCheckMediatorTest, CheckNowClickableAll) { + mediator_.checkStartState = CheckStartStateCancel; + [mediator_ reconfigureCheckStartSection]; + TableViewItem* checkStartItem = [[TableViewItem alloc] + initWithType:SafetyCheckItemType::CheckStartItemType]; + EXPECT_TRUE([mediator_ isItemClickable:checkStartItem]); + + mediator_.checkStartState = CheckStartStateDefault; + [mediator_ reconfigureCheckStartSection]; + EXPECT_TRUE([mediator_ isItemClickable:checkStartItem]); +}
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h b/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h index 3886a21..bd72ee4 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h
@@ -15,6 +15,9 @@ // Called when item is tapped. - (void)didSelectItem:(TableViewItem*)item; +// Determines if selection animation should be shown for |item|. +- (BOOL)isItemClickable:(TableViewItem*)item; + // Checks if |item| should have an error popover. - (BOOL)isItemWithErrorInfo:(TableViewItem*)item;
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm index 44061682..cb539f5 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm
@@ -129,6 +129,12 @@ [tableView deselectRowAtIndexPath:indexPath animated:YES]; } +- (BOOL)tableView:(UITableView*)tableView + shouldHighlightRowAtIndexPath:(NSIndexPath*)indexPath { + TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath]; + return [self.serviceDelegate isItemClickable:item]; +} + #pragma mark - UITableViewDataSource - (UITableViewCell*)tableView:(UITableView*)tableView
diff --git a/ios/chrome/browser/ui/tab_grid/grid/plus_sign_cell.mm b/ios/chrome/browser/ui/tab_grid/grid/plus_sign_cell.mm index 15f1e91..5f6b61b 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/plus_sign_cell.mm +++ b/ios/chrome/browser/ui/tab_grid/grid/plus_sign_cell.mm
@@ -6,6 +6,8 @@ #import "ios/chrome/browser/ui/tab_grid/grid/grid_constants.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -52,6 +54,17 @@ return; switch (theme) { + case GridThemeDark: + self.accessibilityLabel = + l10n_util::GetNSString(IDS_IOS_TAB_GRID_CREATE_NEW_INCOGNITO_TAB); + break; + case GridThemeLight: + self.accessibilityLabel = + l10n_util::GetNSString(IDS_IOS_TAB_GRID_CREATE_NEW_TAB); + break; + } + + switch (theme) { // This is necessary for iOS 13 because on iOS 13, this will return // the dynamic color (which will then be colored with the user // interface style).
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn index de4fb6e9..c1844bf8 100644 --- a/ios/web_view/BUILD.gn +++ b/ios/web_view/BUILD.gn
@@ -274,6 +274,7 @@ "//components/language/ios/browser", "//components/leveldb_proto", "//components/metrics:library_support", + "//components/metrics/demographics", "//components/password_manager/core/browser", "//components/password_manager/core/browser:affiliation", "//components/password_manager/core/common",
diff --git a/ios/web_view/internal/DEPS b/ios/web_view/internal/DEPS index a6410990..2a8b5c8 100644 --- a/ios/web_view/internal/DEPS +++ b/ios/web_view/internal/DEPS
@@ -14,6 +14,7 @@ "+components/language/core/browser", "+components/language/core/common", "+components/leveldb_proto/public", + "+components/metrics/demographics", "+components/metrics/library_support", "+components/net_log", "+components/password_manager/core",
diff --git a/ios/web_view/internal/sync/web_view_sync_client.h b/ios/web_view/internal/sync/web_view_sync_client.h index 7aeac6a..bfc5c24 100644 --- a/ios/web_view/internal/sync/web_view_sync_client.h +++ b/ios/web_view/internal/sync/web_view_sync_client.h
@@ -61,6 +61,7 @@ GetControllerDelegateForModelType(syncer::ModelType type) override; syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override; syncer::SyncTypePreferenceProvider* GetPreferenceProvider() override; + void OnLocalSyncTransportDataCleared() override; private: autofill::AutofillWebDataService* profile_web_data_service_;
diff --git a/ios/web_view/internal/sync/web_view_sync_client.mm b/ios/web_view/internal/sync/web_view_sync_client.mm index 596ab4c0a..4b787f6 100644 --- a/ios/web_view/internal/sync/web_view_sync_client.mm +++ b/ios/web_view/internal/sync/web_view_sync_client.mm
@@ -16,6 +16,7 @@ #include "components/history/core/common/pref_names.h" #include "components/invalidation/impl/profile_invalidation_provider.h" #include "components/keyed_service/core/service_access_type.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/sync/base/sync_util.h" #include "components/sync/driver/data_type_controller.h" #include "components/sync/driver/sync_api_component_factory.h" @@ -208,4 +209,9 @@ return nullptr; } +void WebViewSyncClient::OnLocalSyncTransportDataCleared() { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + metrics::ClearDemographicsPrefs(pref_service_); +} + } // namespace ios_web_view
diff --git a/ios/web_view/internal/sync/web_view_sync_client_unittest.mm b/ios/web_view/internal/sync/web_view_sync_client_unittest.mm index a4d948ab..8caaabe 100644 --- a/ios/web_view/internal/sync/web_view_sync_client_unittest.mm +++ b/ios/web_view/internal/sync/web_view_sync_client_unittest.mm
@@ -20,7 +20,7 @@ #include "components/sync/base/model_type.h" #include "components/sync/driver/data_type_controller.h" #include "components/sync/driver/test_sync_service.h" -#include "components/sync/model/test_model_type_store_service.h" +#include "components/sync/test/model/test_model_type_store_service.h" #include "components/sync_device_info/fake_device_info_sync_service.h" #include "ios/web/public/test/web_task_environment.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ios/web_view/internal/web_view_browser_state.mm b/ios/web_view/internal/web_view_browser_state.mm index f000baa..d7a25fb4 100644 --- a/ios/web_view/internal/web_view_browser_state.mm +++ b/ios/web_view/internal/web_view_browser_state.mm
@@ -16,6 +16,7 @@ #include "components/history/core/common/pref_names.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/language/core/browser/language_prefs.h" +#include "components/metrics/demographics/user_demographics.h" #include "components/password_manager/core/browser/password_manager.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/in_memory_pref_store.h" @@ -166,6 +167,7 @@ pref_registry->RegisterBooleanPref(prefs::kSavingBrowserHistoryDisabled, true); language::LanguagePrefs::RegisterProfilePrefs(pref_registry); + metrics::RegisterDemographicsProfilePrefs(pref_registry); translate::TranslatePrefs::RegisterProfilePrefs(pref_registry); autofill::prefs::RegisterProfilePrefs(pref_registry); password_manager::PasswordManager::RegisterProfilePrefs(pref_registry);
diff --git a/media/DEPS b/media/DEPS index c982c07..63da8c9d 100644 --- a/media/DEPS +++ b/media/DEPS
@@ -12,7 +12,6 @@ "+mojo/public/cpp/system/platform_handle.h", "+services/device/public", "+services/viz/public/cpp/gpu/context_provider_command_buffer.h", - "+skia/ext", "+third_party/dav1d", "+third_party/ffmpeg", "+third_party/libaom",
diff --git a/media/base/user_input_monitor_win.cc b/media/base/user_input_monitor_win.cc index 48abe73..0ec741a 100644 --- a/media/base/user_input_monitor_win.cc +++ b/media/base/user_input_monitor_win.cc
@@ -164,8 +164,7 @@ // Stop receiving raw input. std::unique_ptr<RAWINPUTDEVICE> device( - GetRawInputDevices(window_->hwnd(), RIDEV_REMOVE)); - + GetRawInputDevices(nullptr, RIDEV_REMOVE)); if (!RegisterRawInputDevices(device.get(), 1, sizeof(*device))) { PLOG(INFO) << "RegisterRawInputDevices() failed for RIDEV_REMOVE"; }
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index ef2dea1..4e6b401 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -98,7 +98,6 @@ "//media/capture/mojom:image_capture_types", "//media/mojo/mojom", "//media/parsers", - "//skia", "//third_party/libyuv", "//ui/gfx", ]
diff --git a/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc index aef1247..1984bfb 100644 --- a/media/capture/video/fake_video_capture_device.cc +++ b/media/capture/video/fake_video_capture_device.cc
@@ -23,7 +23,6 @@ #include "media/base/video_frame.h" #include "media/capture/mojom/image_capture_types.h" #include "media/capture/video/gpu_memory_buffer_utils.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkFont.h" @@ -430,7 +429,7 @@ paint.setStyle(SkPaint::kFill_Style); SkFont font; font.setEdging(SkFont::Edging::kAlias); - SkCanvas canvas(bitmap, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(bitmap); const SkScalar unscaled_zoom = fake_device_state_->zoom / 100.f; const SkScalar translate_x =
diff --git a/media/fuchsia/audio/fuchsia_audio_renderer.cc b/media/fuchsia/audio/fuchsia_audio_renderer.cc index 14a82f5b..f27fa44 100644 --- a/media/fuchsia/audio/fuchsia_audio_renderer.cc +++ b/media/fuchsia/audio/fuchsia_audio_renderer.cc
@@ -113,6 +113,8 @@ OnError(AUDIO_RENDERER_ERROR); }); + UpdateVolume(); + audio_consumer_.events().OnEndOfStream = [this]() { OnEndOfStream(); }; RequestAudioConsumerStatus(); @@ -145,6 +147,18 @@ std::move(init_cb_).Run(PIPELINE_OK); } +void FuchsiaAudioRenderer::UpdateVolume() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(audio_consumer_); + if (!volume_control_) { + audio_consumer_->BindVolumeControl(volume_control_.NewRequest()); + volume_control_.set_error_handler([](zx_status_t status) { + ZX_LOG(ERROR, status) << "VolumeControl disconnected."; + }); + } + volume_control_->SetVolume(volume_); +} + void FuchsiaAudioRenderer::InitializeStreamSink( const AudioDecoderConfig& config) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -228,13 +242,9 @@ void FuchsiaAudioRenderer::SetVolume(float volume) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (!volume_control_) { - audio_consumer_->BindVolumeControl(volume_control_.NewRequest()); - volume_control_.set_error_handler([](zx_status_t status) { - ZX_LOG(ERROR, status) << "VolumeControl disconnected."; - }); - } - volume_control_->SetVolume(volume); + volume_ = volume; + if (audio_consumer_) + UpdateVolume(); } void FuchsiaAudioRenderer::SetLatencyHint(
diff --git a/media/fuchsia/audio/fuchsia_audio_renderer.h b/media/fuchsia/audio/fuchsia_audio_renderer.h index 1a873caa..aa7cf84 100644 --- a/media/fuchsia/audio/fuchsia_audio_renderer.h +++ b/media/fuchsia/audio/fuchsia_audio_renderer.h
@@ -85,6 +85,10 @@ // Resets AudioConsumer and reports error to the |client_|. void OnError(PipelineStatus Status); + // Connects |volume_control_|, if it hasn't been connected, and then sets + // |volume_|. + void UpdateVolume(); + // Initializes |stream_sink_|. Called during initialization and every time // configuration changes. void InitializeStreamSink(const AudioDecoderConfig& config); @@ -129,6 +133,8 @@ fuchsia::media::StreamSinkPtr stream_sink_; fuchsia::media::audio::VolumeControlPtr volume_control_; + float volume_ = 1.0; + DemuxerStream* demuxer_stream_ = nullptr; bool is_demuxer_read_pending_ = false; bool drop_next_demuxer_read_result_ = false;
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.cc b/media/gpu/windows/dxva_video_decode_accelerator_win.cc index e72b5c4..ebd03678 100644 --- a/media/gpu/windows/dxva_video_decode_accelerator_win.cc +++ b/media/gpu/windows/dxva_video_decode_accelerator_win.cc
@@ -23,7 +23,6 @@ #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" -#include "base/debug/alias.h" #include "base/file_version_info.h" #include "base/files/file_path.h" #include "base/location.h" @@ -756,6 +755,7 @@ if (codec_ == kCodecVP9) config_change_detector_.reset(new VP9ConfigChangeDetector()); + processing_config_changed_ = false; SetState(kNormal); UMA_HISTOGRAM_ENUMERATION("Media.DXVAVDA.PictureBufferMechanism", @@ -1990,16 +1990,34 @@ } } -void DXVAVideoDecodeAccelerator::Invalidate() { +void DXVAVideoDecodeAccelerator::Invalidate(bool for_config_change) { + DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); + if (GetState() == kUninitialized) return; // Best effort to make the GL context current. - make_context_current_cb_.Run(); + if (!make_context_current_cb_.Run()) { + // TODO(crbug.com/1139489): This may not be the right fix. + for (auto& kv : output_picture_buffers_) { + if (auto* fence = kv.second->reuse_fence()) + fence->Invalidate(); + } + for (auto& kv : stale_output_picture_buffers_) { + if (auto* fence = kv.second->reuse_fence()) + fence->Invalidate(); + } + + // Since this is called by StopOnError() we can't call it directly. + DLOG(ERROR) << "Failed to make context current."; + for_config_change = false; + if (client_) { + client_->NotifyError(PLATFORM_FAILURE); + client_ = nullptr; + } + } StopDecoderThread(); - weak_this_factory_.InvalidateWeakPtrs(); - weak_ptr_ = weak_this_factory_.GetWeakPtr(); pending_output_samples_.clear(); decoder_.Reset(); config_change_detector_.reset(); @@ -2009,7 +2027,10 @@ // output picture buffers may need to be recreated in case the video // resolution changes. We already handle that in the // HandleResolutionChanged() function. - if (GetState() != kConfigChange) { + if (!for_config_change) { + weak_this_factory_.InvalidateWeakPtrs(); + weak_ptr_ = weak_this_factory_.GetWeakPtr(); + output_picture_buffers_.clear(); stale_output_picture_buffers_.clear(); // We want to continue processing pending input after detecting a config @@ -2039,29 +2060,6 @@ } void DXVAVideoDecodeAccelerator::StopDecoderThread() { - // Try to determine what, if any exception last happened before a hang. See - // http://crbug.com/613701 - uint64_t last_process_output_time = g_last_process_output_time; - HRESULT last_device_removed_reason = g_last_device_removed_reason; - LARGE_INTEGER perf_frequency; - ::QueryPerformanceFrequency(&perf_frequency); - uint32_t output_array_size = output_array_size_; - size_t sample_count; - { - base::AutoLock lock(decoder_lock_); - sample_count = pending_output_samples_.size(); - } - size_t stale_output_picture_buffers_size = - stale_output_picture_buffers_.size(); - PictureBufferMechanism mechanism = GetPictureBufferMechanism(); - - base::debug::Alias(&last_process_output_time); - base::debug::Alias(&last_device_removed_reason); - base::debug::Alias(&perf_frequency.QuadPart); - base::debug::Alias(&output_array_size); - base::debug::Alias(&sample_count); - base::debug::Alias(&stale_output_picture_buffers_size); - base::debug::Alias(&mechanism); decoder_thread_.Stop(); } @@ -2207,7 +2205,6 @@ FROM_HERE, base::BindOnce(&DXVAVideoDecodeAccelerator::NotifyFlushDone, weak_ptr_)); } else { - processing_config_changed_ = false; main_thread_task_runner_->PostTask( FROM_HERE, base::BindOnce(&DXVAVideoDecodeAccelerator::ConfigChanged, weak_ptr_, config_)); @@ -2224,7 +2221,8 @@ if (GetState() == kUninitialized) return; - if (OutputSamplesPresent() || !pending_input_buffers_.empty()) { + if (OutputSamplesPresent() || !pending_input_buffers_.empty() || + processing_config_changed_) { pending_input_buffers_.push_back(sample); return; } @@ -3058,9 +3056,7 @@ void DXVAVideoDecodeAccelerator::ConfigChanged(const Config& config) { DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); - - SetState(kConfigChange); - Invalidate(); + Invalidate(/*for_config_change=*/true); Initialize(config_, client_); decoder_thread_task_runner_->PostTask( FROM_HERE,
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.h b/media/gpu/windows/dxva_video_decode_accelerator_win.h index 430b01b..3cb1047 100644 --- a/media/gpu/windows/dxva_video_decode_accelerator_win.h +++ b/media/gpu/windows/dxva_video_decode_accelerator_win.h
@@ -85,7 +85,6 @@ kResetting, // upon received Reset(), before ResetDone() kStopped, // upon output EOS received. kFlushing, // upon flush request received. - kConfigChange, // stream configuration change detected. }; // Does not take ownership of |client| which must outlive |*this|. @@ -226,7 +225,7 @@ // Transitions the decoder to the uninitialized state. The decoder will stop // accepting requests in this state. - void Invalidate(); + void Invalidate(bool for_config_change = false); // Stop and join on the decoder thread. void StopDecoderThread();
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc index e9ed2d7..469be55 100644 --- a/net/dns/dns_test_util.cc +++ b/net/dns/dns_test_util.cc
@@ -67,177 +67,88 @@ } }; -DnsResourceRecord BuildCannonnameRecord(std::string name, - std::string cannonname) { - DCHECK(!name.empty()); - DCHECK(!cannonname.empty()); - - DnsResourceRecord record; - record.name = std::move(name); - record.type = dns_protocol::kTypeCNAME; - record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromDays(1).InSeconds(); - CHECK(DNSDomainFromDot(cannonname, &record.owned_rdata)); - record.rdata = record.owned_rdata; - - return record; -} - -// Note: This is not a fully compliant SOA record, merely the bare amount needed -// in DnsRecord::ParseToAddressList() processessing. This record will not pass -// RecordParsed validation. -DnsResourceRecord BuildSoaRecord(std::string name) { - DCHECK(!name.empty()); - - DnsResourceRecord record; - record.name = std::move(name); - record.type = dns_protocol::kTypeSOA; - record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromDays(1).InSeconds(); - record.SetOwnedRdata("fake_rdata"); - - return record; -} - -DnsResourceRecord BuildTextRecord(std::string name, - std::vector<std::string> text_strings) { - DCHECK(!name.empty()); - DCHECK(!text_strings.empty()); - - DnsResourceRecord record; - record.name = std::move(name); - record.type = dns_protocol::kTypeTXT; - record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromDays(1).InSeconds(); - - std::string rdata; - for (std::string text_string : text_strings) { - DCHECK(!text_string.empty()); - - rdata += base::checked_cast<unsigned char>(text_string.size()); - rdata += std::move(text_string); - } - record.SetOwnedRdata(std::move(rdata)); - - return record; -} - -DnsResourceRecord BuildPointerRecord(std::string name, - std::string pointer_name) { - DCHECK(!name.empty()); - DCHECK(!pointer_name.empty()); - - DnsResourceRecord record; - record.name = std::move(name); - record.type = dns_protocol::kTypePTR; - record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromDays(1).InSeconds(); - CHECK(DNSDomainFromDot(pointer_name, &record.owned_rdata)); - record.rdata = record.owned_rdata; - - return record; -} - -DnsResourceRecord BuildServiceRecord(std::string name, - TestServiceRecord service) { - DCHECK(!name.empty()); - DCHECK(!service.target.empty()); - - DnsResourceRecord record; - record.name = std::move(name); - record.type = dns_protocol::kTypeSRV; - record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromHours(5).InSeconds(); - - std::string rdata; - char num_buffer[2]; - base::WriteBigEndian(num_buffer, service.priority); - rdata.append(num_buffer, 2); - base::WriteBigEndian(num_buffer, service.weight); - rdata.append(num_buffer, 2); - base::WriteBigEndian(num_buffer, service.port); - rdata.append(num_buffer, 2); - std::string dns_name; - CHECK(DNSDomainFromDot(service.target, &dns_name)); - rdata += dns_name; - - record.SetOwnedRdata(std::move(rdata)); - - return record; -} - - - -DnsResourceRecord BuildIntegrityRecord( - std::string name, - const std::vector<uint8_t>& serialized_rdata) { - CHECK(!name.empty()); - - DnsResourceRecord record; - record.name = std::move(name); - record.type = dns_protocol::kExperimentalTypeIntegrity; - record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromDays(1).InSeconds(); - - std::string serialized_rdata_str(serialized_rdata.begin(), - serialized_rdata.end()); - record.SetOwnedRdata(std::move(serialized_rdata_str)); - - CHECK_EQ(record.rdata.data(), record.owned_rdata.data()); - - return record; -} - } // namespace -DnsResourceRecord BuildTestAddressRecord(std::string name, - const IPAddress& ip) { +DnsResourceRecord BuildTestDnsRecord(std::string name, + uint16_t type, + std::string rdata, + base::TimeDelta ttl) { DCHECK(!name.empty()); - DCHECK(ip.IsValid()); DnsResourceRecord record; record.name = std::move(name); - record.type = ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA; + record.type = type; record.klass = dns_protocol::kClassIN; - record.ttl = base::TimeDelta::FromDays(1).InSeconds(); - record.SetOwnedRdata(net::IPAddressToPackedString(ip)); + record.ttl = ttl.InSeconds(); + record.SetOwnedRdata(std::move(rdata)); return record; } -DnsResponse BuildTestDnsAddressResponse(std::string name, const IPAddress& ip) { +DnsResourceRecord BuildTestAddressRecord(std::string name, + const IPAddress& ip, + base::TimeDelta ttl) { + DCHECK(!name.empty()); DCHECK(ip.IsValid()); - std::vector<DnsResourceRecord> answers = {BuildTestAddressRecord(name, ip)}; + return BuildTestDnsRecord( + std::move(name), + ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA, + net::IPAddressToPackedString(ip), ttl); +} + +DnsResponse BuildTestDnsResponse( + std::string name, + uint16_t type, + const std::vector<DnsResourceRecord>& answers) { + DCHECK(!name.empty()); + std::string dns_name; CHECK(DNSDomainFromDot(name, &dns_name)); - base::Optional<DnsQuery> query( - base::in_place, 0, dns_name, - ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA); - return DnsResponse(0, false, std::move(answers), - std::vector<DnsResourceRecord>() /* authority_records */, - std::vector<DnsResourceRecord>() /* additional_records */, + + base::Optional<DnsQuery> query(base::in_place, 0, std::move(dns_name), type); + return DnsResponse(0, true /* is_authoritative */, answers, + {} /* authority_records */, {} /* additional_records */, query); } +DnsResponse BuildTestDnsAddressResponse(std::string name, + const IPAddress& ip, + std::string answer_name) { + DCHECK(ip.IsValid()); + + if (answer_name.empty()) + answer_name = name; + + std::vector<DnsResourceRecord> answers = { + BuildTestAddressRecord(std::move(answer_name), ip)}; + + return BuildTestDnsResponse( + std::move(name), + ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA, answers); +} + DnsResponse BuildTestDnsAddressResponseWithCname(std::string name, const IPAddress& ip, - std::string cannonname) { + std::string cannonname, + std::string answer_name) { DCHECK(ip.IsValid()); DCHECK(!cannonname.empty()); + if (answer_name.empty()) + answer_name = name; + + std::string cname_rdata; + CHECK(DNSDomainFromDot(cannonname, &cname_rdata)); + std::vector<DnsResourceRecord> answers = { - BuildCannonnameRecord(name, cannonname), - BuildTestAddressRecord(cannonname, ip)}; - std::string dns_name; - CHECK(DNSDomainFromDot(name, &dns_name)); - base::Optional<DnsQuery> query( - base::in_place, 0, dns_name, - ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA); - return DnsResponse(0, false, std::move(answers), - std::vector<DnsResourceRecord>() /* authority_records */, - std::vector<DnsResourceRecord>() /* additional_records */, - query); + BuildTestDnsRecord(std::move(answer_name), dns_protocol::kTypeCNAME, + std::move(cname_rdata)), + BuildTestAddressRecord(std::move(cannonname), ip)}; + + return BuildTestDnsResponse( + std::move(name), + ip.IsIPv4() ? dns_protocol::kTypeA : dns_protocol::kTypeAAAA, answers); } DnsResponse BuildTestDnsTextResponse( @@ -249,18 +160,21 @@ std::vector<DnsResourceRecord> answers; for (std::vector<std::string>& text_record : text_records) { - answers.push_back(BuildTextRecord(answer_name, std::move(text_record))); + DCHECK(!text_record.empty()); + + std::string rdata; + for (std::string text_string : text_record) { + DCHECK(!text_string.empty()); + + rdata += base::checked_cast<unsigned char>(text_string.size()); + rdata += std::move(text_string); + } + + answers.push_back(BuildTestDnsRecord(answer_name, dns_protocol::kTypeTXT, + std::move(rdata))); } - std::string dns_name; - CHECK(DNSDomainFromDot(name, &dns_name)); - base::Optional<DnsQuery> query(base::in_place, 0, dns_name, - dns_protocol::kTypeTXT); - - return DnsResponse(0, false, std::move(answers), - std::vector<DnsResourceRecord>() /* authority_records */, - std::vector<DnsResourceRecord>() /* additional_records */, - query); + return BuildTestDnsResponse(std::move(name), dns_protocol::kTypeTXT, answers); } DnsResponse BuildTestDnsPointerResponse(std::string name, @@ -271,18 +185,14 @@ std::vector<DnsResourceRecord> answers; for (std::string& pointer_name : pointer_names) { - answers.push_back(BuildPointerRecord(answer_name, std::move(pointer_name))); + std::string rdata; + CHECK(DNSDomainFromDot(pointer_name, &rdata)); + + answers.push_back(BuildTestDnsRecord(answer_name, dns_protocol::kTypePTR, + std::move(rdata))); } - std::string dns_name; - CHECK(DNSDomainFromDot(name, &dns_name)); - base::Optional<DnsQuery> query(base::in_place, 0, dns_name, - dns_protocol::kTypePTR); - - return DnsResponse(0, false, std::move(answers), - std::vector<DnsResourceRecord>() /* authority_records */, - std::vector<DnsResourceRecord>() /* additional_records */, - query); + return BuildTestDnsResponse(std::move(name), dns_protocol::kTypePTR, answers); } DnsResponse BuildTestDnsServiceResponse( @@ -294,38 +204,24 @@ std::vector<DnsResourceRecord> answers; for (TestServiceRecord& service_record : service_records) { - answers.push_back( - BuildServiceRecord(answer_name, std::move(service_record))); + std::string rdata; + char num_buffer[2]; + base::WriteBigEndian(num_buffer, service_record.priority); + rdata.append(num_buffer, 2); + base::WriteBigEndian(num_buffer, service_record.weight); + rdata.append(num_buffer, 2); + base::WriteBigEndian(num_buffer, service_record.port); + rdata.append(num_buffer, 2); + std::string dns_name; + CHECK(DNSDomainFromDot(service_record.target, &dns_name)); + rdata += dns_name; + + answers.push_back(BuildTestDnsRecord(answer_name, dns_protocol::kTypeSRV, + std::move(rdata), + base::TimeDelta::FromHours(5))); } - std::string dns_name; - CHECK(DNSDomainFromDot(name, &dns_name)); - base::Optional<DnsQuery> query(base::in_place, 0, dns_name, - dns_protocol::kTypeSRV); - - return DnsResponse(0, false, std::move(answers), - std::vector<DnsResourceRecord>() /* authority_records */, - std::vector<DnsResourceRecord>() /* additional_records */, - query); -} - -DnsResponse BuildTestDnsIntegrityResponse( - std::string hostname, - const std::vector<uint8_t>& serialized_rdata) { - CHECK(!hostname.empty()); - - std::vector<DnsResourceRecord> answers{ - BuildIntegrityRecord(hostname, serialized_rdata)}; - - std::string dns_name; - CHECK(DNSDomainFromDot(hostname, &dns_name)); - base::Optional<DnsQuery> query(base::in_place, 0, dns_name, - dns_protocol::kExperimentalTypeIntegrity); - - return DnsResponse(0, false, std::move(answers), - std::vector<DnsResourceRecord>() /* authority_records */, - std::vector<DnsResourceRecord>() /* additional_records */, - query); + return BuildTestDnsResponse(std::move(name), dns_protocol::kTypeSRV, answers); } MockDnsClientRule::Result::Result(ResultType type, @@ -406,7 +302,8 @@ case MockDnsClientRule::NODOMAIN: case MockDnsClientRule::EMPTY: DCHECK(!result->response); // Not expected to be provided. - authority_records = {BuildSoaRecord(hostname_)}; + authority_records = {BuildTestDnsRecord( + hostname_, dns_protocol::kTypeSOA, "fake rdata")}; result_.response = DnsResponse( 22 /* id */, false /* is_authoritative */, std::vector<DnsResourceRecord>() /* answers */,
diff --git a/net/dns/dns_test_util.h b/net/dns/dns_test_util.h index a3e74b9..775f4263 100644 --- a/net/dns/dns_test_util.h +++ b/net/dns/dns_test_util.h
@@ -192,14 +192,28 @@ class ResolveContext; class URLRequestContext; -// Builds an address record for the given name and IP. -DnsResourceRecord BuildTestAddressRecord(std::string name, const IPAddress& ip); +DnsResourceRecord BuildTestDnsRecord( + std::string name, + uint16_t type, + std::string rdata, + base::TimeDelta ttl = base::TimeDelta::FromDays(1)); -// Builds a DNS response that includes address records. -DnsResponse BuildTestDnsAddressResponse(std::string name, const IPAddress& ip); +DnsResourceRecord BuildTestAddressRecord( + std::string name, + const IPAddress& ip, + base::TimeDelta ttl = base::TimeDelta::FromDays(1)); + +DnsResponse BuildTestDnsResponse(std::string name, + uint16_t type, + const std::vector<DnsResourceRecord>& answers); + +DnsResponse BuildTestDnsAddressResponse(std::string name, + const IPAddress& ip, + std::string answer_name = ""); DnsResponse BuildTestDnsAddressResponseWithCname(std::string name, const IPAddress& ip, - std::string cannonname); + std::string cannonname, + std::string answer_name = ""); // If |answer_name| is empty, |name| will be used for all answer records, as is // the normal behavior. @@ -223,10 +237,6 @@ std::vector<TestServiceRecord> service_records, std::string answer_name = ""); -DnsResponse BuildTestDnsIntegrityResponse( - std::string hostname, - const std::vector<uint8_t>& serialized_rdata); - struct MockDnsClientRule { enum ResultType { // Fail asynchronously with ERR_NAME_NOT_RESOLVED and NXDOMAIN.
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc index 43c39f4..b835f63 100644 --- a/net/dns/dns_transaction.cc +++ b/net/dns/dns_transaction.cc
@@ -4,6 +4,7 @@ #include "net/dns/dns_transaction.h" +#include <algorithm> #include <memory> #include <set> #include <string> @@ -31,6 +32,7 @@ #include "base/strings/stringprintf.h" #include "base/threading/thread_checker.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/timer/elapsed_timer.h" #include "base/timer/timer.h" #include "base/values.h" #include "build/build_config.h" @@ -130,8 +132,7 @@ // matches. Logging is done in the socket and in the outer DnsTransaction. class DnsAttempt { public: - explicit DnsAttempt(size_t server_index) - : result_(ERR_FAILED), server_index_(server_index) {} + explicit DnsAttempt(size_t server_index) : server_index_(server_index) {} virtual ~DnsAttempt() = default; // Starts the attempt. Returns ERR_IO_PENDING if cannot complete synchronously @@ -165,21 +166,10 @@ return dict; } - void set_result(int result) { result_ = result; } - // True if current attempt is pending (waiting for server response). - bool is_pending() const { return result_ == ERR_IO_PENDING; } - - // True if attempt is completed (received server response). - bool is_completed() const { - return (result_ == OK) || (result_ == ERR_NAME_NOT_RESOLVED) || - (result_ == ERR_DNS_SERVER_REQUIRES_TCP); - } + virtual bool IsPending() const = 0; private: - // Result of last operation. - int result_; - const size_t server_index_; DISALLOW_COPY_AND_ASSIGN(DnsAttempt); @@ -223,6 +213,8 @@ return socket_->NetLog(); } + bool IsPending() const override { return next_state_ != STATE_NONE; } + private: enum State { STATE_SEND_QUERY, @@ -257,13 +249,9 @@ } } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); - set_result(rv); - - if (rv == ERR_IO_PENDING) - return rv; - - if (rv == OK) + if (rv != ERR_IO_PENDING) DCHECK_EQ(STATE_NONE, next_state_); + return rv; } @@ -527,6 +515,8 @@ } } + bool IsPending() const override { return !callback_.is_null(); } + private: void ResponseCompleted(int net_error) { request_.reset(); @@ -620,7 +610,6 @@ int rv = socket_->Connect( base::BindOnce(&DnsTCPAttempt::OnIOComplete, base::Unretained(this))); if (rv == ERR_IO_PENDING) { - set_result(rv); return rv; } return DoLoop(rv); @@ -637,6 +626,8 @@ return socket_->NetLog(); } + bool IsPending() const override { return next_state_ != STATE_NONE; } + private: enum State { STATE_CONNECT_COMPLETE, @@ -683,9 +674,9 @@ } } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); - set_result(rv); - if (rv == OK) + if (rv != ERR_IO_PENDING) DCHECK_EQ(STATE_NONE, next_state_); + return rv; } @@ -1054,6 +1045,7 @@ secure_(secure), secure_dns_mode_(secure_dns_mode), callback_(std::move(callback)), + fast_timeout_(fast_timeout), net_log_(net_log), qnames_initial_size_(0), attempts_count_(0), @@ -1089,6 +1081,7 @@ DCHECK(attempts_.empty()); net_log_.BeginEvent(NetLogEventType::DNS_TRANSACTION, [&] { return NetLogStartParams(hostname_, qtype_); }); + time_from_start_ = std::make_unique<base::ElapsedTimer>(); AttemptResult result(PrepareSearch(), nullptr); if (result.rv == OK) { qnames_initial_size_ = qnames_.size(); @@ -1211,6 +1204,8 @@ } AttemptResult MakeAttempt() { + DCHECK(MoreAttemptsAllowed()); + DnsConfig config = session_->config(); if (secure_) { DCHECK_GT(config.dns_over_https_servers.size(), 0u); @@ -1430,6 +1425,8 @@ // Resolves the result of a DnsAttempt until a terminal result is reached // or it will complete asynchronously (ERR_IO_PENDING). AttemptResult ProcessAttemptResult(AttemptResult result) { + DCHECK(!callback_.is_null()); + while (result.rv != ERR_IO_PENDING) { LogResponse(result.attempt); @@ -1463,17 +1460,25 @@ break; case ERR_CONNECTION_REFUSED: case ERR_DNS_TIMED_OUT: + timer_.Stop(); + if (result.attempt) { + DCHECK(result.attempt == attempts_.back().get()); resolve_context_->RecordServerFailure( result.attempt->server_index(), secure_ /* is_doh_server */, result.rv, session_.get()); } if (MoreAttemptsAllowed()) { result = MakeAttempt(); - } else { - return result; + break; } - break; + + if (!fast_timeout_ && AnyAttemptPending()) { + StartTimeoutTimer(); + return AttemptResult(ERR_IO_PENDING, nullptr); + } + + return result; case ERR_DNS_SERVER_REQUIRES_TCP: result = RetryUdpAttemptAsTcp(result.attempt); break; @@ -1491,28 +1496,43 @@ // ERR_DNS_TIMED_OUT case above). As the failure was already recorded // at fallback time and is no longer being waited on, ignore this // failure. - if (result.attempt != attempts_.back().get()) { + if (result.attempt == attempts_.back().get()) { + timer_.Stop(); + resolve_context_->RecordServerFailure( + result.attempt->server_index(), secure_ /* is_doh_server */, + result.rv, session_.get()); + + if (MoreAttemptsAllowed()) { + result = MakeAttempt(); + break; + } + + if (fast_timeout_) { + return result; + } + + // No more attempts can be made, but there may be other attempts + // still pending, so start the timeout timer. + StartTimeoutTimer(); + } + + // If any attempts are still pending, continue to wait for them. + if (AnyAttemptPending()) { + DCHECK(timer_.IsRunning()); return AttemptResult(ERR_IO_PENDING, nullptr); } - resolve_context_->RecordServerFailure(result.attempt->server_index(), - secure_ /* is_doh_server */, - result.rv, session_.get()); - if (!MoreAttemptsAllowed()) { - return result; - } - result = MakeAttempt(); - break; + return result; } } return result; } - // Clears and cancels all non-completed attempts. If |leave_attempt| is not - // null, it is not cleared even if complete. + // Clears and cancels all pending attempts. If |leave_attempt| is not + // null, that attempt is not cleared even if pending. void ClearAttempts(const DnsAttempt* leave_attempt) { for (auto it = attempts_.begin(); it != attempts_.end();) { - if (!(*it)->is_completed() && it->get() != leave_attempt) { + if ((*it)->IsPending() && it->get() != leave_attempt) { it = attempts_.erase(it); } else { ++it; @@ -1520,6 +1540,13 @@ } } + bool AnyAttemptPending() { + return std::any_of(attempts_.begin(), attempts_.end(), + [](std::unique_ptr<DnsAttempt>& attempt) { + return attempt->IsPending(); + }); + } + void OnFallbackPeriodExpired() { if (callback_.is_null()) return; @@ -1530,6 +1557,29 @@ DoCallback(result); } + void StartTimeoutTimer() { + DCHECK(!fast_timeout_); + DCHECK(!timer_.IsRunning()); + DCHECK(!callback_.is_null()); + + // Timeout determination not currently implemented for Classic DNS because + // such transactions are assumed to always use fast timeout. If that ever + // changes, need to implement a ResolveContext::ClassicTransactionTimeout(). + DCHECK(secure_); + + base::TimeDelta timeout = resolve_context_->SecureTransactionTimeout( + secure_dns_mode_, session_.get()); + timeout -= time_from_start_->Elapsed(); + + timer_.Start(FROM_HERE, timeout, this, &DnsTransactionImpl::OnTimeout); + } + + void OnTimeout() { + if (callback_.is_null()) + return; + DoCallback(AttemptResult(ERR_DNS_TIMED_OUT, nullptr)); + } + scoped_refptr<DnsSession> session_; std::string hostname_; uint16_t qtype_; @@ -1539,6 +1589,11 @@ // Cleared in DoCallback. DnsTransactionFactory::CallbackType callback_; + // When true, transaction should time out immediately on expiration of the + // last attempt fallback period rather than waiting the overall transaction + // timeout period. + const bool fast_timeout_; + NetLogWithSource net_log_; // Search list of fully-qualified DNS names to query next (in DNS format). @@ -1557,6 +1612,7 @@ std::unique_ptr<DnsServerIterator> dns_server_iterator_; base::OneShotTimer timer_; + std::unique_ptr<base::ElapsedTimer> time_from_start_; // TODO(ericorth@chromium.org): Use base::UnownedPtr once available. ResolveContext* resolve_context_;
diff --git a/net/dns/dns_transaction.h b/net/dns/dns_transaction.h index 245d87b..3444a37 100644 --- a/net/dns/dns_transaction.h +++ b/net/dns/dns_transaction.h
@@ -104,14 +104,12 @@ // |secure| specifies whether DNS lookups should be performed using DNS-over- // HTTPS (DoH) or using plaintext DNS. // - // |fast_timeout| Not yet implemented. When true (and implemented), the - // transaction will timeout quickly after making its DNS attempts, without - // necessarily waiting long enough to allow slower-than-average requests to - // complete. Intended as an optimization for cases where the caller has - // reasonable fallback options to the transaction and it would be beneficial - // to move on to those options sooner on signals that the transaction is - // potentially slow or problematic. - // TODO(crbug.com/1109792): Implement it. + // When |fast_timeout| is true, the transaction will timeout quickly after + // making its DNS attempts, without necessarily waiting long enough to allow + // slower-than-average requests to complete. Intended as an optimization for + // cases where the caller has reasonable fallback options to the transaction + // and it would be beneficial to move on to those options sooner on signals + // that the transaction is potentially slow or problematic. virtual std::unique_ptr<DnsTransaction> CreateTransaction( const std::string& hostname, uint16_t qtype,
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc index 959dcec..8eef05e 100644 --- a/net/dns/dns_transaction_unittest.cc +++ b/net/dns/dns_transaction_unittest.cc
@@ -1173,7 +1173,7 @@ helper0.RunUntilComplete(); } -TEST_F(DnsTransactionTestWithMockTime, Timeout) { +TEST_F(DnsTransactionTestWithMockTime, Timeout_FastTimeout) { config_.attempts = 3; ConfigureFactory(); @@ -1182,8 +1182,13 @@ AddHangingQuery(kT0HostName, kT0Qtype); TransactionHelper helper0(ERR_DNS_TIMED_OUT); - helper0.StartTransaction(transaction_factory_.get(), kT0HostName, kT0Qtype, - false /* secure */, resolve_context_.get()); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper0.CompletionCallback(), + NetLogWithSource(), false /* secure */, SecureDnsMode::kOff, + resolve_context_.get(), true /* fast_timeout */); + + helper0.StartTransaction(std::move(transaction)); // Finish when the third attempt expires its fallback period. base::RunLoop().RunUntilIdle(); @@ -2552,23 +2557,69 @@ } // Test for when a slow DoH response is delayed until after the initial fallback -// period and no more attempts are configured. +// period (but succeeds before the full timeout period). TEST_F(DnsTransactionTestWithMockTime, SlowHttpsResponse_SingleAttempt) { config_.doh_attempts = 1; ConfigureDohServers(false /* use_post */); + // Assume fallback period is less than timeout. + ASSERT_LT(resolve_context_->NextDohFallbackPeriod(0 /* doh_server_index */, + session_.get()), + resolve_context_->SecureTransactionTimeout(SecureDnsMode::kSecure, + session_.get())); + + // Simulate a slow response by using an ERR_IO_PENDING read error to delay + // until SequencedSocketData::Resume() is called. + auto data = std::make_unique<DnsSocketData>( + 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::HTTPS, + nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128); + data->AddReadError(ERR_IO_PENDING, ASYNC); + data->AddResponseData(kT0ResponseDatagram, base::size(kT0ResponseDatagram), + ASYNC); + SequencedSocketData* sequenced_socket_data = data->GetProvider(); + AddSocketData(std::move(data), false /* enqueue_transaction_id */); + + TransactionHelper helper(kT0RecordCount); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + + helper.StartTransaction(std::move(transaction)); + base::RunLoop().RunUntilIdle(); + ASSERT_FALSE(helper.has_completed()); + FastForwardBy(resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get())); + EXPECT_FALSE(helper.has_completed()); + + sequenced_socket_data->Resume(); + helper.RunUntilComplete(); +} + +// Test for when a slow DoH response is delayed until after the initial fallback +// period but fast timeout is enabled, resulting in timeout failure. +TEST_F(DnsTransactionTestWithMockTime, + SlowHttpsResponse_SingleAttempt_FastTimeout) { + config_.doh_attempts = 1; + ConfigureDohServers(false /* use_post */); + AddHangingQuery(kT0HostName, kT0Qtype, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, false /* enqueue_transaction_id */); TransactionHelper helper(ERR_DNS_TIMED_OUT); - helper.StartTransaction(transaction_factory_.get(), kT0HostName, kT0Qtype, - true /* secure */, resolve_context_.get()); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), true /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); base::RunLoop().RunUntilIdle(); ASSERT_FALSE(helper.has_completed()); - // Only one attempt configured, so expect immediate failure after fallback - // period. + // Only one attempt configured and fast timeout enabled, so expect immediate + // failure after fallback period. FastForwardBy(resolve_context_->NextDohFallbackPeriod( 0 /* doh_server_index */, session_.get())); EXPECT_TRUE(helper.has_completed()); @@ -2592,8 +2643,13 @@ AddSocketData(std::move(data), false /* enqueue_transaction_id */); TransactionHelper helper(kT0RecordCount); - helper.StartTransaction(transaction_factory_.get(), kT0HostName, kT0Qtype, - true /* secure */, resolve_context_.get()); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + + helper.StartTransaction(std::move(transaction)); base::RunLoop().RunUntilIdle(); ASSERT_FALSE(helper.has_completed()); ASSERT_TRUE(sequenced_socket_data->IsPaused()); @@ -2613,6 +2669,330 @@ helper.RunUntilComplete(); } +// Test for when a slow DoH response is delayed until after the full timeout +// period. +TEST_F(DnsTransactionTestWithMockTime, HttpsTimeout) { + config_.doh_attempts = 1; + ConfigureDohServers(false /* use_post */); + + // Assume fallback period is less than timeout. + ASSERT_LT(resolve_context_->NextDohFallbackPeriod(0 /* doh_server_index */, + session_.get()), + resolve_context_->SecureTransactionTimeout(SecureDnsMode::kSecure, + session_.get())); + + AddHangingQuery(kT0HostName, kT0Qtype, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(ERR_DNS_TIMED_OUT); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); + base::RunLoop().RunUntilIdle(); + ASSERT_FALSE(helper.has_completed()); + + // Stop a tiny bit short to ensure transaction doesn't finish early. + const base::TimeDelta kTimeHoldback = base::TimeDelta::FromMilliseconds(5); + base::TimeDelta timeout = resolve_context_->SecureTransactionTimeout( + SecureDnsMode::kSecure, session_.get()); + ASSERT_LT(kTimeHoldback, timeout); + FastForwardBy(timeout - kTimeHoldback); + EXPECT_FALSE(helper.has_completed()); + + FastForwardBy(kTimeHoldback); + EXPECT_TRUE(helper.has_completed()); +} + +// Test for when two slow DoH responses are delayed until after the full timeout +// period. +TEST_F(DnsTransactionTestWithMockTime, HttpsTimeout2) { + config_.doh_attempts = 2; + ConfigureDohServers(false /* use_post */); + + // Assume fallback period is less than timeout. + ASSERT_LT(resolve_context_->NextDohFallbackPeriod(0 /* doh_server_index */, + session_.get()), + resolve_context_->SecureTransactionTimeout(SecureDnsMode::kSecure, + session_.get())); + + AddHangingQuery(kT0HostName, kT0Qtype, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + AddHangingQuery(kT0HostName, kT0Qtype, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(ERR_DNS_TIMED_OUT); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); + base::RunLoop().RunUntilIdle(); + ASSERT_FALSE(helper.has_completed()); + + base::TimeDelta fallback_period = resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get()); + FastForwardBy(fallback_period); + EXPECT_FALSE(helper.has_completed()); + + // Timeout is from start of transaction, so need to keep track of the + // remainder after other fast forwards. + base::TimeDelta timeout = resolve_context_->SecureTransactionTimeout( + SecureDnsMode::kSecure, session_.get()); + base::TimeDelta timeout_remainder = timeout - fallback_period; + + // Fallback period for second attempt. + fallback_period = resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get()); + ASSERT_LT(fallback_period, timeout_remainder); + FastForwardBy(fallback_period); + EXPECT_FALSE(helper.has_completed()); + timeout_remainder -= fallback_period; + + // Stop a tiny bit short to ensure transaction doesn't finish early. + const base::TimeDelta kTimeHoldback = base::TimeDelta::FromMilliseconds(5); + ASSERT_LT(kTimeHoldback, timeout_remainder); + FastForwardBy(timeout_remainder - kTimeHoldback); + EXPECT_FALSE(helper.has_completed()); + + FastForwardBy(kTimeHoldback); + EXPECT_TRUE(helper.has_completed()); +} + +// Test for when attempt fallback periods go beyond the full timeout period. +TEST_F(DnsTransactionTestWithMockTime, LongHttpsTimeouts) { + const int kNumAttempts = 20; + config_.doh_attempts = kNumAttempts; + ConfigureDohServers(false /* use_post */); + + // Assume sum of fallback periods is greater than timeout. + ASSERT_GT(kNumAttempts * resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get()), + resolve_context_->SecureTransactionTimeout(SecureDnsMode::kSecure, + session_.get())); + + for (int i = 0; i < kNumAttempts; ++i) { + AddHangingQuery(kT0HostName, kT0Qtype, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + } + + TransactionHelper helper(ERR_DNS_TIMED_OUT); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); + base::RunLoop().RunUntilIdle(); + ASSERT_FALSE(helper.has_completed()); + + for (int i = 0; i < kNumAttempts - 1; ++i) { + FastForwardBy(resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get())); + EXPECT_FALSE(helper.has_completed()); + } + + // Expect transaction to time out immediately after the last fallback period. + FastForwardBy(resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get())); + EXPECT_TRUE(helper.has_completed()); +} + +// Test for when the last of multiple HTTPS attempts fails (SERVFAIL) before +// a previous attempt succeeds. +TEST_F(DnsTransactionTestWithMockTime, LastHttpsAttemptFails) { + config_.doh_attempts = 2; + ConfigureDohServers(false /* use_post */); + + // Simulate a slow response by using an ERR_IO_PENDING read error to delay + // until SequencedSocketData::Resume() is called. + auto data = std::make_unique<DnsSocketData>( + 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::HTTPS, + nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128); + data->AddReadError(ERR_IO_PENDING, ASYNC); + data->AddResponseData(kT0ResponseDatagram, base::size(kT0ResponseDatagram), + ASYNC); + SequencedSocketData* sequenced_socket_data = data->GetProvider(); + AddSocketData(std::move(data), false /* enqueue_transaction_id */); + + AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, + SYNCHRONOUS, Transport::HTTPS, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(kT0RecordCount); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); + + // Wait for one timeout period to start (and fail) the second attempt. + FastForwardBy(resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get())); + EXPECT_FALSE(helper.has_completed()); + + // Complete the first attempt and expect immediate success. + sequenced_socket_data->Resume(); + helper.RunUntilComplete(); +} + +// Test for when the last of multiple HTTPS attempts fails (SERVFAIL), and a +// previous attempt never completes. +TEST_F(DnsTransactionTestWithMockTime, LastHttpsAttemptFails_Timeout) { + config_.doh_attempts = 2; + ConfigureDohServers(false /* use_post */); + + AddHangingQuery(kT0HostName, kT0Qtype, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, + SYNCHRONOUS, Transport::HTTPS, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(ERR_DNS_TIMED_OUT); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + + helper.StartTransaction(std::move(transaction)); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(helper.has_completed()); + + // Second attempt fails immediately after first fallback period, but because + // fast timeout is disabled, the transaction will attempt to wait for the + // first attempt. + base::TimeDelta fallback_period = resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get()); + FastForwardBy(fallback_period); + EXPECT_FALSE(helper.has_completed()); + + // Timeout is from start of transaction, so need to keep track of the + // remainder after other fast forwards. + base::TimeDelta timeout = resolve_context_->SecureTransactionTimeout( + SecureDnsMode::kSecure, session_.get()); + base::TimeDelta timeout_remainder = timeout - fallback_period; + + // Stop a tiny bit short to ensure transaction doesn't finish early. + const base::TimeDelta kTimeHoldback = base::TimeDelta::FromMilliseconds(5); + ASSERT_LT(kTimeHoldback, timeout_remainder); + FastForwardBy(timeout_remainder - kTimeHoldback); + EXPECT_FALSE(helper.has_completed()); + + FastForwardBy(kTimeHoldback); + EXPECT_TRUE(helper.has_completed()); +} + +// Test for when the last of multiple HTTPS attempts fails (SERVFAIL) before +// a previous attempt can complete, but fast timeouts is enabled. +TEST_F(DnsTransactionTestWithMockTime, LastHttpsAttemptFails_FastTimeout) { + config_.doh_attempts = 2; + ConfigureDohServers(false /* use_post */); + + AddHangingQuery(kT0HostName, kT0Qtype, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, + SYNCHRONOUS, Transport::HTTPS, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(ERR_DNS_SERVER_FAILED); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), true /* fast_timeout */); + + helper.StartTransaction(std::move(transaction)); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(helper.has_completed()); + + // With fast timeout enabled, expect the transaction to complete with failure + // immediately on failure of the last transaction. + FastForwardBy(resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get())); + EXPECT_TRUE(helper.has_completed()); +} + +// Test for when the last of multiple HTTPS attempts fails (SERVFAIL) before +// a previous attempt later fails as well. +TEST_F(DnsTransactionTestWithMockTime, LastHttpsAttemptFailsFirst) { + config_.doh_attempts = 2; + ConfigureDohServers(false /* use_post */); + + // Simulate a slow response by using an ERR_IO_PENDING read error to delay + // until SequencedSocketData::Resume() is called. + auto data = std::make_unique<DnsSocketData>( + 0 /* id */, kT0HostName, kT0Qtype, ASYNC, Transport::HTTPS, + nullptr /* opt_rdata */, DnsQuery::PaddingStrategy::BLOCK_LENGTH_128); + data->AddReadError(ERR_IO_PENDING, ASYNC); + data->AddRcode(dns_protocol::kRcodeSERVFAIL, ASYNC); + SequencedSocketData* sequenced_socket_data = data->GetProvider(); + AddSocketData(std::move(data), false /* enqueue_transaction_id */); + + AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, + SYNCHRONOUS, Transport::HTTPS, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(ERR_DNS_SERVER_FAILED); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); + + // Wait for one timeout period to start (and fail) the second attempt. + FastForwardBy(resolve_context_->NextDohFallbackPeriod( + 0 /* doh_server_index */, session_.get())); + EXPECT_FALSE(helper.has_completed()); + + // Complete the first attempt and expect immediate completion. + sequenced_socket_data->Resume(); + helper.RunUntilComplete(); +} + +// Test for when multiple HTTPS attempts fail (SERVFAIL) in order, making the +// last started attempt also the last attempt to be pending. +TEST_F(DnsTransactionTestWithMockTime, LastHttpsAttemptFailsLast) { + config_.doh_attempts = 2; + ConfigureDohServers(false /* use_post */); + + AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, + SYNCHRONOUS, Transport::HTTPS, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, + SYNCHRONOUS, Transport::HTTPS, + DnsQuery::PaddingStrategy::BLOCK_LENGTH_128, 0 /* id */, + false /* enqueue_transaction_id */); + + TransactionHelper helper(ERR_DNS_SERVER_FAILED); + std::unique_ptr<DnsTransaction> transaction = + transaction_factory_->CreateTransaction( + kT0HostName, kT0Qtype, helper.CompletionCallback(), + NetLogWithSource(), true /* secure */, SecureDnsMode::kSecure, + resolve_context_.get(), false /* fast_timeout */); + helper.StartTransaction(std::move(transaction)); + + // Expect both attempts will run quickly without waiting for fallbacks or + // transaction timeout. + helper.RunUntilComplete(); +} + TEST_F(DnsTransactionTest, TcpLookup_UdpRetry) { AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc index 99aacc2..d752872e 100644 --- a/net/dns/host_resolver_manager_unittest.cc +++ b/net/dns/host_resolver_manager_unittest.cc
@@ -8899,12 +8899,18 @@ std::vector<uint8_t> integrity_rdata = options.integrity_mangled ? GetMangledIntegrityRdata() : GetValidIntegrityRdata(); - rules.emplace_back( - "host", dns_protocol::kExperimentalTypeIntegrity, - options.secure_integrity, - MockDnsClientRule::Result(BuildTestDnsIntegrityResponse( - "host", std::move(integrity_rdata))), - options.delay_integrity); + std::string integrity_rdata_str(integrity_rdata.begin(), + integrity_rdata.end()); + std::vector<DnsResourceRecord> answers{ + BuildTestDnsRecord("host", dns_protocol::kExperimentalTypeIntegrity, + std::move(integrity_rdata_str))}; + DnsResponse response = BuildTestDnsResponse( + "host", dns_protocol::kExperimentalTypeIntegrity, answers); + + rules.emplace_back("host", dns_protocol::kExperimentalTypeIntegrity, + options.secure_integrity, + MockDnsClientRule::Result(std::move(response)), + options.delay_integrity); } CreateResolver();
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 4bcd2c8..cd47a69 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -1694,7 +1694,6 @@ { "name": "neftaly.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nu3.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nu3.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ovenapp.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ruudkoot.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seomobo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seowarp.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7296,7 +7295,6 @@ { "name": "bip.gov.sa", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "birkman.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bismarck.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bit8.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitshaker.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bittersweetcandybowl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blinkenlight.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9311,7 +9309,6 @@ { "name": "no17sifangjie.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nodespin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "noedidacticos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "noez.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nolatepayments.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nomesbiblicos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "noobunbox.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11064,7 +11061,6 @@ { "name": "spititout.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sponsortobias.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spyprofit.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "stamkassa.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sslsurvey.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ssmato.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spotifyripper.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12257,7 +12253,6 @@ { "name": "cornodo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "couragefound.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "courses.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "cprnearme.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "craigrouse.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crazy-crawler.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crazypaul.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12543,7 +12538,6 @@ { "name": "heartyme.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "heavensattic.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hebaus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hegen.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hegenshop.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "heidilein.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hesaplama.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13125,7 +13119,6 @@ { "name": "rmf.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "roadfeast.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "robin.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "robinhoodbingo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rockeyscrivo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rondommen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "roslynpad.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14898,7 +14891,6 @@ { "name": "sinquin.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spicywombat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "slapen17.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "sleepstar.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sitc.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "slevermann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spedplus.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -15058,7 +15050,6 @@ { "name": "travelogue.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "unikitty-on-tour.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "touchbasemail.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "t-tz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tsv-1894.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "typehub.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tuxie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -16130,7 +16121,6 @@ { "name": "praeparation-keppner.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "planete-lira.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "qipp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "readytongue.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "realwoo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pemagrid.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "purpleplains.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -18302,7 +18292,6 @@ { "name": "sumthing.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "spatzenwerkstatt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stamboommuller.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "srrdb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sports.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sport-in-sundern.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "siamsnus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19998,7 +19987,6 @@ { "name": "laplaceduvillage.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "maintainerheaven.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lifecoachproviders.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "lunafag.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lucas-garte.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mamadea.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "loyaltech.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21866,7 +21854,6 @@ { "name": "salde.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "salzamt.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sam-football.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "sanael.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sand-islets.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sauerland-schnittgruen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "saxojoe.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22956,7 +22943,6 @@ { "name": "dhlinux.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "diagnosia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "diamorphine.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "diannaobos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dicelab.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dicionariodegirias.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dicionariodelatim.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23622,7 +23608,6 @@ { "name": "innsalzachsingles.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "inscript.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "inst.mobi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "instinctive.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "int-ma.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "integralkk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "intelligence-explosion.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25357,7 +25342,6 @@ { "name": "vendigital.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vendorconnect.nyc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "venmos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "venoom.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "verliebt-in-bw.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "verliebt-in-niedersachsen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "versagercloud.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25797,7 +25781,6 @@ { "name": "abilitycaresoftware.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arent.kz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aquatechnologygroup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "alexdaulby.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arg.zone", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "armenians.online", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "annetaan.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28913,7 +28896,6 @@ { "name": "addcrazy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "3wecommerce.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "afbeeldinguploaden.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "aflamtorrent.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "addones.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aelurus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "513vpn.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29690,7 +29672,6 @@ { "name": "imperialonlinestore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jameshemmings.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "intertime.services", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "jeffmcneill.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ispsoft.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "joaosampaio.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "josemikkola.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29770,7 +29751,6 @@ { "name": "koryfi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jacobsenarquitetura.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kitatec.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "lannainnovation.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lazulu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "leadgenie.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "laraveldirectory.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -29873,7 +29853,6 @@ { "name": "lojaprimemed.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "malgraph.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "makedonien.guide", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "louduniverse.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "marinekaplama.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "masterofallscience.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "makaleci.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -30094,7 +30073,6 @@ { "name": "mireiaseuba.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "orangecomputers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "orleika.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "oliverniebuhr.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oversight.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "opsnotepad.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "owl.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31463,14 +31441,12 @@ { "name": "danyabanya.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "darlastudio66.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dasgeestig.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "datakick.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "datenschutzgrundverordnung.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ddel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "de-mail.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "deeparamaraj.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "denis-martinez.photos", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "digicert-support.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dingcc.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "discoverwellness.center", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dismail.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "divenwa.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32088,7 +32064,6 @@ { "name": "adamh.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adeline.mobi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adesa-asesoria.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "adhigamindia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adm-sarov.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "admin-serv.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "adriancitu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -33002,7 +32977,6 @@ { "name": "mymp3singer.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "myndcommunication.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mynewselfbariatrics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "mynn.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mypress.mx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mypup.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "myrandomtips.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -34405,7 +34379,6 @@ { "name": "bigcorporateevents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigfunbouncycastles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bikelifetvkidsquads.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bilalic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bilbayt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "billysbouncycastlehire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bio-disinfestazione.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34838,7 +34811,6 @@ { "name": "funtimebourne.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "funtimeentertainment.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "funtimesbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "furigana.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fuzoku.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gaio-automobiles.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gameshowchallenge.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34881,7 +34853,6 @@ { "name": "halkirkbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "happybounce.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "happykidscastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "haribilalic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "harryphoto.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "harrysgardengamehire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "harrysqnc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -35831,7 +35802,6 @@ { "name": "blogexpert.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bloodyexcellent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bluesecure.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bodixite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boisewaldorf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bolovegna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bosufitness.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -36035,7 +36005,6 @@ { "name": "indiaflowermall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "indoorplantsexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inetserver.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "innoteil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "instaquiz.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "interfloraservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inventoryimages.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -37551,7 +37520,6 @@ { "name": "augix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aupasdecourses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aurelienaltarriba.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "auroware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "austinuniversityhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "australianarmedforces.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "australianimmigrationadvisors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -42277,7 +42245,6 @@ { "name": "aussiewebmarketing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "authoritysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avocadooo.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "awesomesit.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "axiumacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "az-moga.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "azadliq.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -42832,7 +42799,6 @@ { "name": "whychoosebob.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wichitafoundationpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wirkaufendeinau.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wlwlwx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ws-meca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wsadek.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "www-9822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43401,7 +43367,6 @@ { "name": "pself.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "psicologasandrabernal.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "psychiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "puravida-estate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pushers.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qi0.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43732,7 +43697,6 @@ { "name": "indiroyunu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "insistel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "internalkmc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "invasmani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inventtatte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iproducemusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iro-iro.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43806,7 +43770,6 @@ { "name": "practicalprogrammer.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "productoinnovador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quangngaimedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rebelrebel.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "regenerapoint.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "renthelper.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "republictelecom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46161,7 +46124,6 @@ { "name": "onlinexl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onyxmoon.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "open-banking-access.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "openscreen.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openstreetmap.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "otsfreestyle.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ovirt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47333,7 +47295,6 @@ { "name": "como-se-escribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comocurarlagastritistratamientonatural.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cosasque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cprheartcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crimefreeliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crochetnerd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "curareldolordeespalda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47771,7 +47732,6 @@ { "name": "classictheatrecumbria.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cleaningservicejulai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cloudns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cocodroid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "colinsnaith.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "collectorsystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "commerce.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48556,7 +48516,6 @@ { "name": "havetherelationshipyouwant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "herbhuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hotels4teams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hrbl.lc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "html.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "humorcaliente.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hurleyhomestead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49367,7 +49326,6 @@ { "name": "kolorbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "komenamanda.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kotobox.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kucukayvaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lanahallen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "landlordy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "landscape-photography.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49454,7 +49412,6 @@ { "name": "mivzaklive.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mizu.coffee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modulex-gmbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "moeyoo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mojizuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moneoci.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moneybird.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -58264,7 +58221,6 @@ { "name": "lagsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lalunaonlinebr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lambangcapgiare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lannamontessori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lannatefl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lansewu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laserhealthsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -58848,7 +58804,6 @@ { "name": "woshiluo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wpboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wpcs.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wpherc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wug.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "www-5287.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wyomingexiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59480,7 +59435,6 @@ { "name": "retailcybersolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "retrotown.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rhondanp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "robsutter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roko-foto.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rs-cloud.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rubixstudios.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59769,7 +59723,6 @@ { "name": "linkyou.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lippu1.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "living-with-outlook-2010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "localegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ltlec.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ltlec.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ltmw.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61027,7 +60980,6 @@ { "name": "tim-demisch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tkcafe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totalpackers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "trastornolimite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travisec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trit.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trosell.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61912,7 +61864,6 @@ { "name": "codeknights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codetipi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "compostelle-bouddha.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "compreair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "computec.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "concilio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cosmicworlds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61988,7 +61939,6 @@ { "name": "itpanda.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ix.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jackfletcher.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jerseyplantsdirect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jesusvazquez.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jolinebrussel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jonny5.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62136,7 +62086,6 @@ { "name": "topshelf.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totalaccessnicaragua.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "touhou.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "trastornoevitacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tronlaserarena.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tsrv.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tutorialseo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63560,7 +63509,6 @@ { "name": "maximilian-staedtler.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mazi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mchost.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mcpebox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medbreaker-friends.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medpost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "megaxhost.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64353,7 +64301,6 @@ { "name": "pechonova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pentagonreviewcenter.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pirapiserver.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "planningsagenda.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plumbingkingsllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pnnl.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "po0k.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66686,7 +66633,6 @@ { "name": "plaros.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ploi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poliscentraal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "poslusny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pracujwunii.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pranaprinciple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "princetonnassaupediatrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -67054,7 +67000,6 @@ { "name": "6957z.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6957z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6957zz.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "7ka.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "876666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -68202,7 +68147,6 @@ { "name": "glexia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gobiz.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gordyf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "habbstars.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hallaminternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hanyingw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hashtagswimwear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -68562,7 +68506,6 @@ { "name": "chenx221.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chenx2210.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chrystus.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chun.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clare3dx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "claudiney.eti.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cnbibo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -69171,7 +69114,6 @@ { "name": "taxi-uslu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxichic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "technology.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "techzjc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teen-porno-video.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teleport.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "test-allegrodev.pantheonsite.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70431,7 +70373,6 @@ { "name": "dizzieforums.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "djdeepstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dmerkel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "doceo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "docmed360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dogboarding.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dogeboy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70590,7 +70531,6 @@ { "name": "mastermindbusinesspro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masternautconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mb-demo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "medbreaker.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "megaron.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meliowebweer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meloniecharm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73628,7 +73568,6 @@ { "name": "alwayshowher.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "am5188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "am615.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "am8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amandahamilton.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "americanunicornparty.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amoxil.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75621,7 +75560,6 @@ { "name": "man-stuff.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maneql.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maneql.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "marcus.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masarn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mbadika.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mdihi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75899,7 +75837,6 @@ { "name": "distributednya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "djsanonimo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dk1818.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dnoid.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dogfriendly.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "downtownsuiteliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dpim.org.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76101,7 +76038,6 @@ { "name": "quadron.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "r81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radioheaven.co.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rainbowflowers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rainturtle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rawcbd.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rbuddenhagen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76470,7 +76406,6 @@ { "name": "mekanika.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "metroplex.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mivm.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mjproduction.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modderday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moens.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netface.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77732,7 +77667,6 @@ { "name": "dechetor.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dejongonline.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "depot24.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "desertbloomplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devmode.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diariocibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diepanhcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77853,7 +77787,6 @@ { "name": "parkeerbordenhuren.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paroisses-theix-surzur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pcdbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "piektraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pitoufi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "planisys.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "playlisten.radio.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77890,7 +77823,6 @@ { "name": "siepomaga.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simmtronic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sinakuhestani.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "siulam-wingchun.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "skyblockrebellion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slalix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smaltimento-rifiuti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78362,7 +78294,6 @@ { "name": "zanjirzanane-shanbeghazan.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0553z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0571z6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "09am8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1u0m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3333ylc.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "364553.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79143,7 +79074,6 @@ { "name": "danskefilm.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dartydiscount.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dc-acupuncture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "deanstreettacochips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "decofiori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "denisadinu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desert-maroc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79837,7 +79767,6 @@ { "name": "lesptitstutos.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liborburda.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lightyear.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "liypoi.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lms-luch.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lomaem-nsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "londonlegaltranslation.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80674,7 +80603,6 @@ { "name": "breakout.careers", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brillio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bronzew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cadenceconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cadmax.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cairuz.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caldersoldas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81749,7 +81677,6 @@ { "name": "andriraharjo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "annuaire-auto-ecole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antispamcloud.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aorosora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apex.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apirest.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appliancepronwi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81762,7 +81689,6 @@ { "name": "auksnest.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "austerevisuals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avonvets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "badmintonadvisor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bangkokcookingclass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bavomaes.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beargoggleson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83726,7 +83652,6 @@ { "name": "uurl.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ux-solution.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uxsto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v-bank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vaaes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vastgoed-lidl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vbezhenar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84021,7 +83946,6 @@ { "name": "departureboard.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "derival.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "descargarwhatsappplusgratis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "diablocarpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diaconat.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diariorp.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "digitalgyan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85599,7 +85523,6 @@ { "name": "petstoredog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pexxi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pinkbuff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pishifu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pjylb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plus15.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pochoden-praha.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92870,7 +92793,6 @@ { "name": "pomadgw.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "priceless-jewelry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pro100blogger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "projectvault.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prospreads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prox.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proxybay.uno", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -93084,7 +93006,6 @@ { "name": "azur.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "baity.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bangun.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "baobaojihua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beakbirds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beleadsteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "benthanhtourist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94319,7 +94240,6 @@ { "name": "essethon.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "estumarca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eviadc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "evitacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exoticspecialist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "explorecams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "extrememusclepump.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94531,7 +94451,6 @@ { "name": "mokamelhaa.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "money-spell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moreyalta.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mossan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "msa.bank", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "msaludasuhogar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mt-caza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104777,7 +104696,6 @@ { "name": "bigtexasbeerfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bitcoin-youtube.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blackbbwvideos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "blueberrywinery.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bluheron.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "borza.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bosiquanao.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104876,7 +104794,6 @@ { "name": "erichoins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "erkkiaronen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "erulezz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ethernia.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "etindustries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eve.pub", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exaduosport.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107186,7 +107103,6 @@ { "name": "inscomers.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inspas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "institut-coiffureetnature.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "international-books.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iosbankermyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itbog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "j5y.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107281,7 +107197,6 @@ { "name": "mysafetygear.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysciencecloset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "na-n.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "naehtalente.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nakarkhana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nako.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "narda-sts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107363,7 +107278,6 @@ { "name": "rgb2hex.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rgfundraising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rohitpatil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rosskopfs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rostirolla.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rtl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rtonin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107371,7 +107285,6 @@ { "name": "rx-diet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ry88url.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sandtime.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sanemind.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sanskrit.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sb-graph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schwimmschule-kleine-fische.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107549,7 +107462,6 @@ { "name": "bellevueduilawyers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigbeats.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bingchunmoli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bismi.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bito3d.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blankpage.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blue-olive.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107562,7 +107474,6 @@ { "name": "bravoasociados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burz.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "burzgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bwmcnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c1cdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c30019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108048,7 +107959,6 @@ { "name": "the-deep.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theconversation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thecoorgfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thecracks.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tietotori.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tillmanassociates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tlroadmap.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109235,7 +109145,6 @@ { "name": "auxessenceselfiques.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "awoau.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bakerbasements.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bamheroes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bcome.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beauty92.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beautyest.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109876,7 +109785,6 @@ { "name": "illuminaterecovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immijobs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immobilier-swiss.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "immoe.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inoreader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "instaart.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "invisitone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111243,7 +111151,6 @@ { "name": "vfxstudy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viera.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viewpointsfromfacebook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "villers-ecalles.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vinc.name.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voetbalquizkopen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vogue.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111278,7 +111185,6 @@ { "name": "ysoft.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zappy.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zero-skill.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zigao.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "12gramu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1ii.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2isk.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111454,7 +111360,6 @@ { "name": "flibanserina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "foodyshoody.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "foro.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fotografoivanalmeida.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freebasics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "funtimeusabiloxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gabe.download", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112169,7 +112074,6 @@ { "name": "leleimports.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "levis.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "levisenlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lifeskills-education.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lindazi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linkinsta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livinkitchen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -113692,7 +113596,6 @@ { "name": "bazarfds.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "behavhealth.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beko.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bestkitchenbuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bet031.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bet531.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bet631.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -113715,7 +113618,6 @@ { "name": "byteultra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "byw.cymru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c-rpg.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "c52iv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "calibracionhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "calixa.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "callamnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114072,7 +113974,6 @@ { "name": "spacecovers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "speakermatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spyse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ssslinstallers.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "start-school.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "steelfirm.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stefamedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114434,7 +114335,6 @@ { "name": "guiadeprofesionales.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guiaminhasaude.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guiaturismovallarta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "guusu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "handyoutdoorgoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "havendetoxnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hbr.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114721,7 +114621,6 @@ { "name": "xion.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--6m1a86p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xvpn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xxzacg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yardandgardenguru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yasminedewolf.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yousifsaeed.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115129,7 +115028,6 @@ { "name": "veosvending.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verdeplus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vidimte.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voinuocsago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vov.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w-e-b--s-e-o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115289,7 +115187,6 @@ { "name": "devensys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devs.men", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diadoc.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "digitalstudios.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dikant.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "disougstroy.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "distributed.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116672,7 +116569,6 @@ { "name": "sexonv.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shakardara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shapingthebay.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sharebee.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shiuki.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shop-links.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shopshap.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117450,7 +117346,6 @@ { "name": "clarins-unlimited.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cloudprints.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmsdca.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cncn3.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codelistbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coenraets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "colegioalemanmcbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118421,7 +118316,6 @@ { "name": "discuss-data.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dollanid.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drkansal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dynamitejobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dzimchuk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ebusiness724.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edv-biela.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118795,7 +118689,6 @@ { "name": "carimcoder.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casadilanga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catcat.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "catpic.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catpumpsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "certreg.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chaoxi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118867,7 +118760,6 @@ { "name": "exact-online-apps-by-invantive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "experimentrak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "experimetrix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "extrabits.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fackovcova.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fackovec.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fan911.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118922,7 +118814,6 @@ { "name": "hax.sc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "healthyfoodster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "healthykitchen33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hermitant.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hifly.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hipo.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hodor-stage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119095,12 +118986,10 @@ { "name": "rentnow.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rico-j.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ricreare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "riku.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roi-project.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roi-project.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rot256.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rtc-israel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rust.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rvecomercio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "s20121946.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safetymeasuresas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119607,7 +119496,6 @@ { "name": "povar.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "preserverollinspass.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "priestessbali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "privatedns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prm-parken.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projectguru.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "promodoble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119757,6 +119645,970 @@ { "name": "zorgenvoorjean.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuffel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zulihome.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0011011.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "01337.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0xacab.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "129.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "136book.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "14er.games", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "14er.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "14er.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "16321.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "16345.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "166killearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1xbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1xbet.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1xbet.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1xbet.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1xbet.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1xtranslate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2113.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22bet.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "233333.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3accounts.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3dranger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3os.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3ringenieria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "50plusmusikfestival.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "592tk.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-actor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-busty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-gokan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-hitoduma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-moe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-shirouto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a-up.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a163.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaacomms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aalvarezs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaronqueen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aarons.law", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abhayaranya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abilenemachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "absolutebritney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "academiaoposicionescorreos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acedstudy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acl-desing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adstrafficsales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advbizintel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aegisaccounting.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "affumico.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahl.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aidoru.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airconsandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airportstuttgart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airpost.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aitci.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akbtv.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akinlau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akouryy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aktivpark-lumdatal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "albertovr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alexisgarin.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alicedepret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alignthoughts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alles.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almamarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphabeta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altiup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "am-i-on-am-i-on-drugs-dot-com.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "am-i-on-drugs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "americamilitar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amilcalcados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amiondrugs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amisoft.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amlakresan.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anchr.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andrecanuto.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "androidhub.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andropia-online.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aneutrallife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "angelefloramendy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "angione.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antonmcclure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ao6.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "appliedenglish.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aralys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arianagrande.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armadalelearningpathways.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armanddesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armanddesign.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armandmusic.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arminreiter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armoedebeleidgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artbalsam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arytmicznie.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atsugi-saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aurika.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoleaders.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avogel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aydesignco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b144.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b4a-learn.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "babyanywhere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baindayman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bampizza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bauer-reininghorses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bcomm.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beastshirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beeldbankgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beemenergy.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beer-sheva.city", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "behmmjc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bendelllawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benhoeg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benjamorphism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beonas.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bergtoldtrimcarpentry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berkbrands.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "best-ergonomic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet-platform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betandyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biabop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biden-scandal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "binhdang.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bittounsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bjelimici.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blatnice.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blauwgras.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blist.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blogyaren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boip.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boldlegal.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bombo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bompus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bonfloss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boxethaishop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brard.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridgecobuilders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brightesttv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brio.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "britney-galaxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "britneyuniverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brokgency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brunettipesco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bubbelwafel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "builterra2.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bumblebeekids.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bumblebeekids.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bytebe.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cabosaferide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carboneventsupport.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carboneventsupport.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carbonsupportcofabel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carmeny.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinhapratica.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cbmanager.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccaag.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccu.in.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdkrot.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdrom.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cecamericas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centurion-it.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "certprep.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "certpro.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cfent.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cfo4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chiron.care", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christ.cm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christiangaro.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "churchofpop.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cibercheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cirruslabs.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "citycardgante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "citycardghent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clarkaesthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clinicaschirmer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clintburnett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codebreakers.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collectifitness.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colossalfoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comealong.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comeros.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comfis.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comunicazionenellaristorazione.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "concern.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "condenast.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conduitzw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "congressmankirk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connecto.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conteelegant.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coral-study.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "craftychameleonbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cran-automobiles.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creativecityofmusic.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crex24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crimsonlettersmusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "csdisaster.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "csx.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ctsl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuentadias.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cujubimnoticias.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "custompoolsbydesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cutter.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dabbingtee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danielwelty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danwelty.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danwelty.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danwelty.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danwelty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darkgrid.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darkillusion.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darnashop.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dbs.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dcorporation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "de.vg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dealbenzbkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "debijloke.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demsh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "densocean.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "design2u.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detailingsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detectro.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devsdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devyanijayakar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dewereldvankina.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diadora-media.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "didier-equipereussite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "didierfle-decibel.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "didierfle-latelier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "didierfle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digifloat.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalandsocialmediaacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalecom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalfoodbook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalpiloten.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitizer.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dimi-inside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "divelyon.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "djvintagevinyl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dlsolutions-inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dmramp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dochub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dolinathome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dolmeningenieria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domain.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domucmayintainha.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "donteffwithmyvote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "donteffwithmyvote.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "donteffwithmyvote.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dontefwithmyvote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dontefwithmyvote.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dontefwithmyvote.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dotsmesh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dreieich.schule", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drkashany.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drone-mapping.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drslawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "duffau.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "duna.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dvn.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dynamic-movie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dynamicpl.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dynamicplus.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-branchekoden.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eajglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eastcairo-egypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ebabis.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ebcue.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ebipl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "echidna.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecup.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eczanemheryerde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "editorweb360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edman007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edr-d.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edwardscommercialcleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eekelen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "efay.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "effortlesshr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "einomanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "electionrunners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "electricgypsies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elementoraddons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elevationplumbingandheating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elinetv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elizabethmacdonaldbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elrincondeleer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elto.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emgroup.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emilieporte.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emoji.web.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emotebank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emperors.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "englishwithmrsann.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enlightsec.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eplayer.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eplayer.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erctra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erlebe-salsa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erobook.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "escrowalliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "esm.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "espenandersen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eucybernet.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "everythinglidia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "examesrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "excellence.corsica", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "executivecatering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expandtheroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expertly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expovivienda.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ezmembershipscript.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fairtradegemeentegent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fer.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "festivaldelumieresgand.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "finditalldirectory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "findom.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "first-ns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "floodheroessaltlakecity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "floria.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fluffypuff.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flwrightwichita.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "foldnfly.travel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forhers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "formommiesbymommy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "formsmarts.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "formvibes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fossildlp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fourstrategy.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "foxbenjaminfox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freebonusmembership.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freundeskreis-tarjan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fronteimoveis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuku-fashion.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "funeraire-365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "funeral-365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "futieltextiel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fxstock.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galefacialplastics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "game-garage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gardtools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "garo.directory", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gavr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gavr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gazetekarinca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gconstruction.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gdpr365.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geekgao.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geeksforrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gekleurdverleden.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "genhu.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gentcongres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gentcreativecityofmusic.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gentengarde.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gentseondernemersdagen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "genuinebackup.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "getwsodo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghada.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghentlichtfestival.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giftedhealthcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giga.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gladiium.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globalbusinessrisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globalpandemictools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globotech.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gnula2.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goabase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goabase.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goerdeler-alumni-club.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goetheschule-giessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gotoeat-aichi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greciahora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gsa.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gsaadvantage.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gscgh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guaranteedservice.company", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guywolkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gyefund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gyefund.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h2orto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "habrastorage.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "happicollective.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "happyland.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hartmann-hartmann.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hatierchinois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hcr2bot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healthyhomeventilation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hello-design.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "henryishax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hentai.baby", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hexagon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hexo.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hierden-bosch.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hiperbusinessblog.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hipersuli.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "historichousesghent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hivekey.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hivekey.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hoeheterobenjij.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hollyworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homedecorspecialists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "housestationlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "howardhannava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hsg-lumdatal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hubanero.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "huisaandecosta.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hurrikane.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hustl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyperian.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hzwc.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i-on.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iamafricacampaign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iamafricacampaign.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iclb.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ideal.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "identifytag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ienakacs.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "illumini.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "implantesdentalestopete.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inesnutricion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inffin-portal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ingroxd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "innovairservices.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "innovationrealtygrp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intechdaybcp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "integra-belgium.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intelx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intercomp-cbu.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inuevostiempos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "investinghent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ionnex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iransculpture.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isoq.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "it.com.eg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itgeeks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itshealthtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itzine.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iventuresolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j0hn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jack.fr.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jackhammerinteractive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jacobpleiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jamesonmelbye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "janakifoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jands.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jardinesimperiales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jbah.info.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jci.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jci.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jci.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jcinet.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jcinet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jdecommastermind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jeugdraad.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jivanplastics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johny.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "josien.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jp-aic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "judgefuszmediation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "julienstalder.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jumping4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jumping4all.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jumping4all.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jumpingforall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jumpingforall.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "k.tt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kamata-saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karencatering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kathakkachakkar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katja-bjoern.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kesen.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kesen.wang", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kfz-sachverstand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kh.pub.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinomap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kitsquid.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kk.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kleebauerhof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klimaatstad.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kobietydokodu.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koelcel-onderdelen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kontantfinans.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kontrapolis.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koolisw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kplastics.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "krankenpflege.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ksv-friesland.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kw.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kyn.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kyriakidisship.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laguiadelocioenuruguay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lan-der.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lapinator.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "larifari.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "larousse-edu.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "larrutan.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laud.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lawclinic-hsg.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "layan-luxurylighting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leandrebergeron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leapa.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ledebergleeft.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "legen.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leivadi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lesa.boutique", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lesgitesdusapey.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leslyandyana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lianhe.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lichtfestival.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lichtfestival.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lichtfestivalgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lichtfestivalgent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lichtfestivalgent.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lichtfestivalghent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lidosparesort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "life-experiment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linalynn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linovelib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linuxtips.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liorggi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lisacundy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "livienpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "llccd.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lodewillems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "logancooper.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lohnsteuerhilfe-essen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lola.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "londonlocks247.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loulifestyle.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lovemesomegadgets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lpgaclub.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lyclub.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "machida-saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "madamcougar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mafy.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mahmoudeeb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malawi-portal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malie.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malypiesekzuzi.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "managment.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mandrill.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manuelpinto.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manusje-van-alles.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marinapetruzio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "markhornsby.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "markhornsby.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marknb.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marny.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvin-elsen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvin.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "masduta.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mastpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mattmoorcroft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maxclers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maximoguk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maximumphysiotherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mayaroconstituency.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maynesoftware.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mcpetrade.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mdrp.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medhiwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megaimpressao3d.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meideas108.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mejitravelcr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "melbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mendmybackprogram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "merry.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metait.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metasearch.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mia-manager.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "micaballo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikaelf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikkohuupponen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobiliteit.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobiliteitstadgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "momochrome.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "monamurlite.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "montuan.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moonbooth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moonpay.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "morifuji.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "morriganbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mostqbalwatanalqahirah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mstazakka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "multifruttisystems.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "muon.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "musecomunicazione.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mvwoensei.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mybuddytheplumbertooele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mydataprotected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mylahcollection.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mylocalfoodtrucks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mypower91.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mzr.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "najrecept.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "napoveda.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "navot.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nccoe.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nd.fyi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nebulise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "needle-demo.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "net-provider.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netheadsonair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netmajstor.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netrino.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netrino.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netsoftit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newissuesmagazine.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newnationalstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ninasofian.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nitinpandey.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nonsa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noobit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "npw.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nsquaredong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nydbank.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "o2.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oapks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oasiskitchens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "obve.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ocasio.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ocmwgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oettig.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "office365-apps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ogaprinta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oliveoilshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olivetbgc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olyfed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opc.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oposicionesjusticia.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oppabet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orchardscribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orioneclipse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orpf.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ortoinnovapanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ourdataprotected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oyap.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pagerange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paidcashforhouses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "painful.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pamperssamples.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pancybertronics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pandemicoversight.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paragon-consult.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paramo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parelweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parentsguidetotheworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parenttheirpassion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "passionateracers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paste.rodeo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "patricklustigmediation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peace-is-possible.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peppyflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pflege.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phc4submit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philippkaindl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pierianservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pindex.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pl2.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plaxi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pmbsteelbuildings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pokkareindeermeat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "popxclusive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "potnofficial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pottwist.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powercomputers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prancor.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "primakeysmarketingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prisel.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "privateimoveis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prochaskamediation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "promotionvillanakarin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "promusicante.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "propcierge.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prws.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ps-playback.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psmpl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psoppc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pssjd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "puur.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qlares.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qqqq.plus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quantuin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "r-ix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "r3gi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radcloud.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rafik.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ramydent.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ranking-mensesthe.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rdxbioscience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reach.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "readingea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redlands.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "refurb-tracker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "regalradio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "regenpfeifer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reklamaandroid.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reklamaios.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "relevanttomyinterests.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "repalanca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "republic.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "resulttado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rewardscout.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rez.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rgf.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ringsandthings.scot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riveroaksdentaljax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robertjquinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robertsmits.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rodobike.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rolluplab.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rooferindallas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rowanz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rozvozznojmo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimentalconsolidated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimentalconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimentalfoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimentalkitchens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rudimentalretail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruimtevoorgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rushtonparay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "s2i.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "safeguardstudents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saisyuusyou-ikebukuro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saisyuusyou-omiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saisyuusyou-takasaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saisyuusyou-utsunomiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salalfoundation.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sald.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salo.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "savchenko.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schoolheads.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schweiz-sextreffen.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scorpioncomputers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scoutbee.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scpsecretlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scpsecretlaboratory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scriptolab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sdguitdagingen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seb8iaan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sekoia.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sellersmart1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "semenserang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sentrybay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seoulista.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serenitygwinnett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seucreditodigital.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sextreffendeutschland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shellphotostudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiftcrypto.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiftcrypto.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shinta.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shinyoko-saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shirosaki-hana.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shivering-isles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shopcon.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shoppingplaza.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shunliandongli.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sid-giessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "singerfamily.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sintsationeel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sipd.go.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skogmans.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sldlcdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slimopweg.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smarpshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartblock.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smithandnoble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smolkatours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smppcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smsfa.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sodigent.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solnascentepapelaria.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sophiefrutti.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sosregistration.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soydoula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spanmass-portal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spurindustrial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sr-sam.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "standardbook.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stargroup.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startupbros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "steebel.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "steinberg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "steparovi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stepupforeurope.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stevenjacobs.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stevenjacobs.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stiebelrewards.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stilida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stlfamilyattorney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stnguyen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stoemp.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stoneocean.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "streetwisebiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stylidafm.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sudabaus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sugardaddy.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sugardating.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suikerspinnetje.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sumopages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suomiheraa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swevenstays.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swostik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "synergiedenken.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "synobook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "syronex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t-cophony.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tabisuta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tachikawa-saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taciso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taikhoanfree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taskforce.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tayebbayri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tcook.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tcook.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tcshop.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "td-bambini.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "team3.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techanit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tecnologiaboliviana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tellerify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "testq.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tex-salon.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thekickassvirtualassistant.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "themarkup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theomegagroup.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theonyxzone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theunitehistoryproject.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thn.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timesedlen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timvandenborre.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tlesptyltd.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tomorrowx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tomservo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "top-rezepte.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "top10.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topmarketplace.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tornado-map.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tovse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tpue.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trabia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trafficexchange.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "transtrack.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treefeelingsandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treehorn.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treemadeiras.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trigate.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truckscout24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trustee.deals", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trustology.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "try2hack.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tshirtatlowprice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tv-mainzlar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twilite.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twilite.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "typecho.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ugodeal.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unausa.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unblockit.lat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "universal-techno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "universalspf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urologywi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utahdentalcrowns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utahtriallawyers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utduc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v-jo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vaneyckwashere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vanwoensei.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vanwoensel.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vanwoensel.directory", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "variusunum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "varunmaheshwari.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vdw-instruments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "velassoltas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veripn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verkeer.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vetcpd.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "videocall.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vikrammaheshwari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viralmailer.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visitgent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visuall.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vivaocredito.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voornaam-at-achternaam.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vote.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vous-etre-utile-ceidf.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vtivision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vzwregent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waavit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "walletfox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "warrioronewgw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wartraining.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "watermitigationspecialists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "web-info.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webehurt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webfiredesigns.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webplatform.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weektegenarmoede.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weewoo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welty.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welty.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welty.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welty.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wemakemx.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wfsrecruit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whichdoctor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wickersmith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "willowcundy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "willwilkins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "willywangsextapes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wingchun.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wir-do.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wisdomteethonly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wizardwiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wordpresshelpmaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worky.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wplan.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wptangtoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xanzhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--80aej8bv.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--marn-8ra.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xonet.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xplo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xraven.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yannickcoffi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yearend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yesterplay.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yflix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yhs.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ykdlb.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yoduzw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yogstation.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yooread.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youiv.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youiv2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yourblazeguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zahnarzt-backfisch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zebratee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zelvar.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zerofogmask.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zerty.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhstar.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zimedia.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zorgenvoorherena.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zorgenvoormaria.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zova.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zusammen-grossartig.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc index 86b75db5..92a2076 100644 --- a/net/nqe/network_quality_estimator_unittest.cc +++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -3071,21 +3071,28 @@ // Tests that the signal strength API is not called too frequently. TEST_F(NetworkQualityEstimatorTest, MAYBE_CheckSignalStrength) { - base::HistogramTester histogram_tester; constexpr char histogram_name[] = "NQE.SignalStrengthQueried.WiFi"; constexpr int kWiFiSignalStrengthQueryIntervalSeconds = 30 * 60; std::map<std::string, std::string> variation_params; variation_params["get_signal_strength_and_detailed_network_id"] = "true"; TestNetworkQualityEstimator estimator(variation_params); + estimator.SimulateNetworkChange( NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, "test"); base::SimpleTestTickClock tick_clock; - tick_clock.SetNowTicks(base::TimeTicks::Now()); + // SimulateNetworkChange() above can produce entries in the histogram bucket + // if the test system has real wifi or cellular connections, and can also + // leave the NQE inside its timeout. To avoid that, fastforward fake time for + // more than the query interval. + tick_clock.SetNowTicks(base::TimeTicks::Now() + + base::TimeDelta::FromSeconds( + kWiFiSignalStrengthQueryIntervalSeconds * 2)); estimator.SetTickClockForTesting(&tick_clock); + base::HistogramTester histogram_tester; base::Optional<int32_t> signal_strength = estimator.GetCurrentSignalStrengthWithThrottling();
diff --git a/printing/metafile_skia_unittest.cc b/printing/metafile_skia_unittest.cc index 734d247..8ab8d73 100644 --- a/printing/metafile_skia_unittest.cc +++ b/printing/metafile_skia_unittest.cc
@@ -68,7 +68,7 @@ EXPECT_TRUE(pic->cullRect() == page_rect); SkBitmap bitmap; bitmap.allocN32Pixels(kPageSideLen, kPageSideLen); - SkCanvas bitmap_canvas(bitmap, SkSurfaceProps{}); + SkCanvas bitmap_canvas(bitmap); pic->playback(&bitmap_canvas); // Check top left pixel color of the red square. EXPECT_EQ(bitmap.getColor(0, 0), SK_ColorRED);
diff --git a/services/image_annotation/public/cpp/image_processor.cc b/services/image_annotation/public/cpp/image_processor.cc index a1567f6b..2bedb42 100644 --- a/services/image_annotation/public/cpp/image_processor.cc +++ b/services/image_annotation/public/cpp/image_processor.cc
@@ -26,7 +26,7 @@ dest.eraseColor(0); // Use a canvas to scale the source image onto the new bitmap. - SkCanvas canvas(dest, SkSurfaceProps{}); + SkCanvas canvas(dest); canvas.scale(scale, scale); canvas.drawBitmap(source, 0, 0, nullptr /* paint */);
diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn index 81aecbe52..95dad66 100644 --- a/services/network/public/mojom/BUILD.gn +++ b/services/network/public/mojom/BUILD.gn
@@ -423,10 +423,11 @@ types = [ { mojom = "network.mojom.CanonicalCookie" - cpp = "::blink::CanonicalCookie" + cpp = "::net::CanonicalCookie" }, ] - traits_headers = [ "//third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.h" ] + traits_headers = + [ "//services/network/public/cpp/cookie_manager_mojom_traits.h" ] }, ] blink_cpp_typemaps += shared_cpp_typemaps
diff --git a/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc b/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc index 61657009..031dba2 100644 --- a/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc +++ b/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc
@@ -20,13 +20,14 @@ base::TimeTicks timestamp; gfx::RectF presentation_area; SkColor color; + base::TimeTicks frame_time; if (!data.ReadPoint(&point) || !data.ReadTimestamp(×tamp) || !data.ReadPresentationArea(&presentation_area) || - !data.ReadColor(&color)) { + !data.ReadColor(&color) || !data.ReadFrameTime(&frame_time)) { return false; } *out = std::make_unique<viz::DelegatedInkMetadata>( - point, data.diameter(), color, timestamp, presentation_area); + point, data.diameter(), color, timestamp, presentation_area, frame_time); return true; }
diff --git a/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h b/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h index bb452750..2a9a243 100644 --- a/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h +++ b/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h
@@ -5,6 +5,8 @@ #ifndef SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_ #define SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_ +#include <memory> + #include "components/viz/common/delegated_ink_metadata.h" #include "mojo/public/cpp/base/time_mojom_traits.h" #include "services/viz/public/mojom/compositing/delegated_ink_metadata.mojom-shared.h" @@ -24,7 +26,7 @@ input->reset(); } - static gfx::PointF point( + static const gfx::PointF& point( const std::unique_ptr<viz::DelegatedInkMetadata>& input) { return input->point(); } @@ -44,11 +46,16 @@ return input->timestamp(); } - static gfx::RectF presentation_area( + static const gfx::RectF& presentation_area( const std::unique_ptr<viz::DelegatedInkMetadata>& input) { return input->presentation_area(); } + static base::TimeTicks frame_time( + const std::unique_ptr<viz::DelegatedInkMetadata>& input) { + return input->frame_time(); + } + static bool Read(viz::mojom::DelegatedInkMetadataDataView data, std::unique_ptr<viz::DelegatedInkMetadata>* out); };
diff --git a/services/viz/public/mojom/compositing/delegated_ink_metadata.mojom b/services/viz/public/mojom/compositing/delegated_ink_metadata.mojom index 89843b27..99ff67e 100644 --- a/services/viz/public/mojom/compositing/delegated_ink_metadata.mojom +++ b/services/viz/public/mojom/compositing/delegated_ink_metadata.mojom
@@ -15,4 +15,5 @@ skia.mojom.SkColor color; mojo_base.mojom.TimeTicks timestamp; gfx.mojom.RectF presentation_area; + mojo_base.mojom.TimeTicks frame_time; };
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 1eeba09..b3657451 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -39,7 +39,7 @@ # External-facing config for dependent code. config("skia_config") { - defines = [] + defines = [ "SK_LEGACY_SURFACE_PROPS" ] include_dirs = [ "//third_party/skia" ] if (!is_ios) { @@ -249,8 +249,6 @@ "ext/google_logging.cc", "ext/image_operations.cc", "ext/image_operations.h", - "ext/legacy_display_globals.cc", - "ext/legacy_display_globals.h", "ext/opacity_filter_canvas.cc", "ext/opacity_filter_canvas.h", "ext/recursive_gaussian_convolution.cc",
diff --git a/skia/ext/legacy_display_globals.cc b/skia/ext/legacy_display_globals.cc deleted file mode 100644 index fa4e3922..0000000 --- a/skia/ext/legacy_display_globals.cc +++ /dev/null
@@ -1,44 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "skia/ext/legacy_display_globals.h" - -namespace skia { - -namespace { -SkPixelGeometry g_pixel_geometry = kRGB_H_SkPixelGeometry; -} - -// static -void LegacyDisplayGlobals::SetCachedPixelGeometry( - SkPixelGeometry pixel_geometry) { - g_pixel_geometry = pixel_geometry; -} - -// static -SkPixelGeometry LegacyDisplayGlobals::GetCachedPixelGeometry() { - return g_pixel_geometry; -} - -// static -SkSurfaceProps LegacyDisplayGlobals::GetSkSurfaceProps() { - return GetSkSurfaceProps(0); -} - -// static -SkSurfaceProps LegacyDisplayGlobals::GetSkSurfaceProps(uint32_t flags) { - return SkSurfaceProps{flags, g_pixel_geometry}; -} - -SkSurfaceProps LegacyDisplayGlobals::ComputeSurfaceProps( - bool can_use_lcd_text) { - uint32_t flags = 0; - if (can_use_lcd_text) { - return LegacyDisplayGlobals::GetSkSurfaceProps(flags); - } - // Use unknown pixel geometry to disable LCD text. - return SkSurfaceProps{flags, kUnknown_SkPixelGeometry}; -} - -} // namespace skia
diff --git a/skia/ext/legacy_display_globals.h b/skia/ext/legacy_display_globals.h deleted file mode 100644 index a11e1ce..0000000 --- a/skia/ext/legacy_display_globals.h +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SKIA_EXT_LEGACY_DISPLAY_GLOBALS_H_ -#define SKIA_EXT_LEGACY_DISPLAY_GLOBALS_H_ - -#include "third_party/skia/include/core/SkSurfaceProps.h" - -namespace skia { - -class SK_API LegacyDisplayGlobals { - public: - static void SetCachedPixelGeometry(SkPixelGeometry pixel_geometry); - static SkPixelGeometry GetCachedPixelGeometry(); - - // Returns a SkSurfaceProps with the cached geometry settings. - static SkSurfaceProps GetSkSurfaceProps(); - static SkSurfaceProps GetSkSurfaceProps(uint32_t flags); - - // Will turn off LCD text if |can_use_lcd_text| is false. - static SkSurfaceProps ComputeSurfaceProps(bool can_use_lcd_text); -}; - -} // namespace skia - -#endif // SKIA_EXT_LEGACY_DISPLAY_GLOBALS_H_
diff --git a/skia/ext/raster_handle_allocator_win.cc b/skia/ext/raster_handle_allocator_win.cc index 7469f3f..8cd6de71 100644 --- a/skia/ext/raster_handle_allocator_win.cc +++ b/skia/ext/raster_handle_allocator_win.cc
@@ -9,16 +9,15 @@ #include <string.h> #include "base/debug/gdi_debug_util_win.h" -#include "base/logging.h" #include "base/memory/ptr_util.h" +#include "base/logging.h" #include "base/win/win_util.h" -#include "skia/ext/legacy_display_globals.h" #include "skia/ext/platform_canvas.h" #include "skia/ext/skia_utils_win.h" #include "third_party/skia/include/core/SkMatrix.h" #include "third_party/skia/include/core/SkPath.h" -#include "third_party/skia/include/core/SkRect.h" #include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/core/SkRect.h" namespace { @@ -144,8 +143,7 @@ SkBitmap bitmap; if (bitmap.installPixels(info, pixels, row_bytes, unmap_view_proc, nullptr)) { - return std::make_unique<SkCanvas>( - bitmap, LegacyDisplayGlobals::GetSkSurfaceProps()); + return std::make_unique<SkCanvas>(bitmap); } } }
diff --git a/skia/ext/skia_utils_win.cc b/skia/ext/skia_utils_win.cc index 49e1755..f8f71f5 100644 --- a/skia/ext/skia_utils_win.cc +++ b/skia/ext/skia_utils_win.cc
@@ -8,7 +8,6 @@ #include <windows.h> #include "base/debug/gdi_debug_util_win.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkRect.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkTypes.h" @@ -180,11 +179,9 @@ sk_sp<SkSurface> MapPlatformSurface(HDC context) { BITMAP backing; const SkImageInfo size(PrepareAllocation(context, &backing)); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - return size.isEmpty() - ? nullptr - : SkSurface::MakeRasterDirect(size, backing.bmBits, - backing.bmWidthBytes, &props); + return size.isEmpty() ? nullptr + : SkSurface::MakeRasterDirect(size, backing.bmBits, + backing.bmWidthBytes); } SkBitmap MapPlatformBitmap(HDC context) {
diff --git a/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc b/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc index f9def0a..ec213ddbb 100644 --- a/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc +++ b/skia/tools/filter_fuzz_stub/filter_fuzz_stub.cc
@@ -79,7 +79,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(BitmapSize, BitmapSize); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(0x00000000); for (int i = 1; i < argc; i++)
diff --git a/testing/BUILD.gn b/testing/BUILD.gn index 56ebf8d..5a578973 100644 --- a/testing/BUILD.gn +++ b/testing/BUILD.gn
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/python.gni") + # Used by linux-gcc-rel to ensure gcc doesn't choke on clang-only flags. executable("empty_main") { sources = [ "empty_main.cc" ] @@ -35,3 +37,8 @@ data_deps += [ "//third_party/jdk:java_data" ] } } + +python_library("run_isolated_script_test") { + testonly = true + pydeps_file = "//testing/scripts/run_isolated_script_test.pydeps" +}
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 3c925102..b435a022 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -6605,7 +6605,8 @@ { "args": [ "--gs-results-bucket=chromium-result-details", - "--recover-devices" + "--recover-devices", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.lollipop_tablet_tester.content_browsertests.filter" ], "merge": { "args": [ @@ -13517,7 +13518,8 @@ { "args": [ "--gs-results-bucket=chromium-result-details", - "--recover-devices" + "--recover-devices", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter" ], "merge": { "args": [ @@ -21190,6 +21192,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "cronet_sizes", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -21215,6 +21220,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "cronet_sizes", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -21233,6 +21241,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "resource_sizes_cronet_sample_apk", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -21920,6 +21931,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "cronet_sizes", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -21953,6 +21967,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "cronet_sizes", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -21971,6 +21988,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "resource_sizes_cronet_sample_apk", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -22989,6 +23009,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "cronet_sizes", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -23022,6 +23045,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "cronet_sizes", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [ @@ -23040,6 +23066,9 @@ "script": "//tools/perf/process_perf_results.py" }, "name": "resource_sizes_cronet_sample_apk", + "resultdb": { + "enable": false + }, "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 781bf61..5ef1182 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -13146,8 +13146,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter;../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter", - "--no-xvfb" + "--no-xvfb", + "--test-launcher-filter-file=../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter" ], "merge": { "args": [], @@ -31923,9 +31923,6 @@ "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)": { "gtest_tests": [ { - "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter" - ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index ccada60..eb7bc27 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -5009,28 +5009,6 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests_x11", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "interactive_ui_tests", - "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" - }, - { - "args": [ - "--ozone-platform=x11", - "--enable-features=UseOzonePlatform" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, "name": "ozone_x11_unittests_x11", "swarming": { "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index 17411e1..4c7c99f 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -87,6 +87,8 @@ "//testing/buildbot/filters/android.asan.content_browsertests.filter", "//testing/buildbot/filters/android.emulator_m.content_browsertests.filter", "//testing/buildbot/filters/android.emulator_p.content_browsertests.filter", + "//testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter", + "//testing/buildbot/filters/android.lollipop_tablet_tester.content_browsertests.filter", "//testing/buildbot/filters/cast-linux.content_browsertests.filter", "//testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter", "//testing/buildbot/filters/lacros.content_browsertests.filter",
diff --git a/testing/buildbot/filters/android.lollipop_tablet_tester.content_browsertests.filter b/testing/buildbot/filters/android.lollipop_tablet_tester.content_browsertests.filter new file mode 100644 index 0000000..89982fa --- /dev/null +++ b/testing/buildbot/filters/android.lollipop_tablet_tester.content_browsertests.filter
@@ -0,0 +1,2 @@ +# crbug.com/1139816 +-WebRtcBrowserTest.CanSetupH264VideoCallOnSupportedDevice
diff --git a/testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter b/testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter new file mode 100644 index 0000000..89982fa --- /dev/null +++ b/testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter
@@ -0,0 +1,2 @@ +# crbug.com/1139816 +-WebRtcBrowserTest.CanSetupH264VideoCallOnSupportedDevice
diff --git a/testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter b/testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter index 31e6b40..e69de29 100644 --- a/testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter +++ b/testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter
@@ -1,3 +0,0 @@ -# crbug.com/1139118: new blur algorithm --All/LayerTreeHostFiltersPixelTest.BackdropFilterBlurRadius/SkiaDawn --All/LayerTreeHostFiltersPixelTest.BackdropFilterRotated/SkiaDawn
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 16b34ba..bbffc2f 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -918,6 +918,16 @@ 'shards': 10, }, }, + 'Lollipop Tablet Tester': { + 'args': [ + '--test-launcher-filter-file=../../testing/buildbot/filters/android.lollipop_tablet_tester.content_browsertests.filter', + ], + }, + 'Marshmallow Tablet Tester': { + 'args': [ + '--test-launcher-filter-file=../../testing/buildbot/filters/android.marshmallow_tablet_tester.content_browsertests.filter', + ], + }, 'Win10 Tests x64': { # crbug.com/868082 'args': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 2ff2794..8a30f40 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1126,6 +1126,11 @@ }, ], }, + # TODO(crbug.com/1137507): Enable resutldb after it can support + # single integration test suites. + 'resultdb': { + 'enable': False, + }, }, }, @@ -1144,7 +1149,12 @@ }, ], }, - }, + # TODO(crbug.com/1139149): Enable resultdb after it can support + # cronet_sizes. + 'resultdb': { + 'enable': False, + } + }, }, 'desktop_chromium_isolated_scripts': { @@ -2555,9 +2565,6 @@ '--no-xvfb', '--test-launcher-filter-file=../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter', ], - 'args': [ - '--test-launcher-filter-file=../../testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter', - ], }, 'viz_unittests': { 'linux_args': [ @@ -3468,7 +3475,6 @@ }, 'linux_ozone_x11_only_gtests': { - 'interactive_ui_tests': {}, 'ozone_x11_unittests': {}, 'x11_unittests': {}, },
diff --git a/testing/scripts/run_isolated_script_test.pydeps b/testing/scripts/run_isolated_script_test.pydeps new file mode 100644 index 0000000..574b622 --- /dev/null +++ b/testing/scripts/run_isolated_script_test.pydeps
@@ -0,0 +1,6 @@ +# Generated by running: +# build/print_python_deps.py --gn-paths testing/scripts/run_isolated_script_test.py +//testing/scripts/common.py +//testing/scripts/run_isolated_script_test.py +//testing/test_env.py +//testing/xvfb.py
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn index ed77df1..c0145de 100644 --- a/third_party/android_deps/BUILD.gn +++ b/third_party/android_deps/BUILD.gn
@@ -1117,7 +1117,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("google_play_services_auth_api_phone_java") { - aar_path = "libs/com_google_android_gms_play_services_auth_api_phone/play-services-auth-api-phone-17.1.0.aar" + aar_path = "libs/com_google_android_gms_play_services_auth_api_phone/play-services-auth-api-phone-17.5.0.aar" info_path = "libs/com_google_android_gms_play_services_auth_api_phone/com_google_android_gms_play_services_auth_api_phone.info" deps = [ ":google_play_services_base_java", @@ -1146,7 +1146,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("google_play_services_base_java") { - aar_path = "libs/com_google_android_gms_play_services_base/play-services-base-17.0.0.aar" + aar_path = "libs/com_google_android_gms_play_services_base/play-services-base-17.1.0.aar" info_path = "libs/com_google_android_gms_play_services_base/com_google_android_gms_play_services_base.info" deps = [ ":androidx_collection_collection_java", @@ -1162,7 +1162,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("google_play_services_basement_java") { - aar_path = "libs/com_google_android_gms_play_services_basement/play-services-basement-17.0.0.aar" + aar_path = "libs/com_google_android_gms_play_services_basement/play-services-basement-17.1.0.aar" info_path = "libs/com_google_android_gms_play_services_basement/com_google_android_gms_play_services_basement.info" deps = [ ":androidx_collection_collection_java",
diff --git a/third_party/android_deps/build.gradle b/third_party/android_deps/build.gradle index da43aad..bd38c86 100644 --- a/third_party/android_deps/build.gradle +++ b/third_party/android_deps/build.gradle
@@ -118,7 +118,7 @@ compile "com.google.android.gms:play-services-tasks:${gmsVersion}" compile "com.google.android.gms:play-services-base:${gmsVersion}" compile "com.google.android.gms:play-services-auth-base:${gmsVersion}" - compile "com.google.android.gms:play-services-auth-api-phone:17.1.0" + compile "com.google.android.gms:play-services-auth-api-phone:17.5.0" compile "com.google.android.gms:play-services-auth:${gmsVersion}" compile "com.google.android.gms:play-services-cast:${gmsVersion}" compile "com.google.android.gms:play-services-cast-framework:${gmsVersion}"
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/LICENSE b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/LICENSE index fb38a036..ff0af79 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/LICENSE +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/LICENSE
@@ -147,7 +147,7 @@ December 9, 2016 -AndroidX document file library., AndroidX print library.: +AndroidX lifecycle common library, AndroidX lifecycle livedatacore library, AndroidX lifecycle runtime library: Copyright (c) 2005-2011, The Android Open Source Project @@ -340,199 +340,29 @@ END OF TERMS AND CONDITIONS +Animal Sniffer: -AndroidX versioned parcelable library.: +The MIT License +Copyright (c) 2008 Kohsuke Kawaguchi and codehaus.org. - Copyright (c) 2005-2018, The Android Open Source Project +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. Checker Framework Annotations: @@ -573,8 +403,7 @@ =========================================================================== -FlatBuffers: - +Error Prone: Apache License Version 2.0, January 2004 @@ -764,7 +593,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2014 Google Inc. + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -779,7 +608,7 @@ limitations under the License. -JSR 250, safeparcel: +Guava JDK5, J2ObjC, SafeParcelable library: Apache License @@ -985,6 +814,417 @@ limitations under the License. +Guava JDK7: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +JsInterop Annotations: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + JSR 305: Copyright (c) 2007-2009, JSR305 expert group
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/README.chromium b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/README.chromium index b6ade67..e225618 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/README.chromium +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/README.chromium
@@ -1,7 +1,7 @@ Name: play-services-auth-api-phone Short Name: play-services-auth-api-phone URL: https://developers.google.com/android/guides/setup -Version: 17.1.0 +Version: 17.5.0 License: Android Software Development Kit License License File: LICENSE Security Critical: yes
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/cipd.yaml b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/cipd.yaml index c798416..2b2e1bb 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/cipd.yaml +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/cipd.yaml
@@ -3,8 +3,8 @@ # found in the LICENSE file. # To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:17.1.0-cr0 +# cipd create --pkg-def cipd.yaml -tag version:17.5.0-cr0 package: chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone description: "play-services-auth-api-phone" data: -- file: play-services-auth-api-phone-17.1.0.aar +- file: play-services-auth-api-phone-17.5.0.aar
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_base/LICENSE b/third_party/android_deps/libs/com_google_android_gms_play_services_base/LICENSE index 67b4049..fb38a036 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_base/LICENSE +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_base/LICENSE
@@ -147,529 +147,433 @@ December 9, 2016 -ICU4C: - -COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) - -Copyright © 1991-2018 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Unicode data files and any associated documentation -(the "Data Files") or Unicode software and any associated documentation -(the "Software") to deal in the Data Files or Software -without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files -or Software are furnished to do so, provided that either -(a) this copyright and permission notice appear with all copies -of the Data Files or Software, or -(b) this copyright and permission notice appear in associated -Documentation. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT OF THIRD PARTY RIGHTS. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS -NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THE DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, -use or other dealings in these Data Files or Software without prior -written authorization of the copyright holder. - ---------------------- - -Third-Party Software Licenses - -This section contains third-party software notices and/or additional -terms for licensed third-party software components included within ICU -libraries. - -1. ICU License - ICU 1.8.1 to ICU 57.1 - -COPYRIGHT AND PERMISSION NOTICE - -Copyright (c) 1995-2016 International Business Machines Corporation and others -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, and/or sell copies of the Software, and to permit persons -to whom the Software is furnished to do so, provided that the above -copyright notice(s) and this permission notice appear in all copies of -the Software and that both the above copyright notice(s) and this -permission notice appear in supporting documentation. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY -SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER -RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF -CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, use -or other dealings in this Software without prior written authorization -of the copyright holder. - -All trademarks and registered trademarks mentioned herein are the -property of their respective owners. - -2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt) - - # The Google Chrome software developed by Google is licensed under - # the BSD license. Other software included in this distribution is - # provided under other licenses, as set forth below. - # - # The BSD License - # http://opensource.org/licenses/bsd-license.php - # Copyright (C) 2006-2008, Google Inc. - # - # All rights reserved. - # - # Redistribution and use in source and binary forms, with or without - # modification, are permitted provided that the following conditions are met: - # - # Redistributions of source code must retain the above copyright notice, - # this list of conditions and the following disclaimer. - # Redistributions in binary form must reproduce the above - # copyright notice, this list of conditions and the following - # disclaimer in the documentation and/or other materials provided with - # the distribution. - # Neither the name of Google Inc. nor the names of its - # contributors may be used to endorse or promote products derived from - # this software without specific prior written permission. - # - # - # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - # - # - # The word list in cjdict.txt are generated by combining three word lists - # listed below with further processing for compound word breaking. The - # frequency is generated with an iterative training against Google web - # corpora. - # - # * Libtabe (Chinese) - # - https://sourceforge.net/project/?group_id=1519 - # - Its license terms and conditions are shown below. - # - # * IPADIC (Japanese) - # - http://chasen.aist-nara.ac.jp/chasen/distribution.html - # - Its license terms and conditions are shown below. - # - # ---------COPYING.libtabe ---- BEGIN-------------------- - # - # /* - # * Copyright (c) 1999 TaBE Project. - # * Copyright (c) 1999 Pai-Hsiang Hsiao. - # * All rights reserved. - # * - # * Redistribution and use in source and binary forms, with or without - # * modification, are permitted provided that the following conditions - # * are met: - # * - # * . Redistributions of source code must retain the above copyright - # * notice, this list of conditions and the following disclaimer. - # * . Redistributions in binary form must reproduce the above copyright - # * notice, this list of conditions and the following disclaimer in - # * the documentation and/or other materials provided with the - # * distribution. - # * . Neither the name of the TaBE Project nor the names of its - # * contributors may be used to endorse or promote products derived - # * from this software without specific prior written permission. - # * - # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - # * OF THE POSSIBILITY OF SUCH DAMAGE. - # */ - # - # /* - # * Copyright (c) 1999 Computer Systems and Communication Lab, - # * Institute of Information Science, Academia - # * Sinica. All rights reserved. - # * - # * Redistribution and use in source and binary forms, with or without - # * modification, are permitted provided that the following conditions - # * are met: - # * - # * . Redistributions of source code must retain the above copyright - # * notice, this list of conditions and the following disclaimer. - # * . Redistributions in binary form must reproduce the above copyright - # * notice, this list of conditions and the following disclaimer in - # * the documentation and/or other materials provided with the - # * distribution. - # * . Neither the name of the Computer Systems and Communication Lab - # * nor the names of its contributors may be used to endorse or - # * promote products derived from this software without specific - # * prior written permission. - # * - # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - # * OF THE POSSIBILITY OF SUCH DAMAGE. - # */ - # - # Copyright 1996 Chih-Hao Tsai @ Beckman Institute, - # University of Illinois - # c-tsai4@uiuc.edu http://casper.beckman.uiuc.edu/~c-tsai4 - # - # ---------------COPYING.libtabe-----END-------------------------------- - # - # - # ---------------COPYING.ipadic-----BEGIN------------------------------- - # - # Copyright 2000, 2001, 2002, 2003 Nara Institute of Science - # and Technology. All Rights Reserved. - # - # Use, reproduction, and distribution of this software is permitted. - # Any copy of this software, whether in its original form or modified, - # must include both the above copyright notice and the following - # paragraphs. - # - # Nara Institute of Science and Technology (NAIST), - # the copyright holders, disclaims all warranties with regard to this - # software, including all implied warranties of merchantability and - # fitness, in no event shall NAIST be liable for - # any special, indirect or consequential damages or any damages - # whatsoever resulting from loss of use, data or profits, whether in an - # action of contract, negligence or other tortuous action, arising out - # of or in connection with the use or performance of this software. - # - # A large portion of the dictionary entries - # originate from ICOT Free Software. The following conditions for ICOT - # Free Software applies to the current dictionary as well. - # - # Each User may also freely distribute the Program, whether in its - # original form or modified, to any third party or parties, PROVIDED - # that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear - # on, or be attached to, the Program, which is distributed substantially - # in the same form as set out herein and that such intended - # distribution, if actually made, will neither violate or otherwise - # contravene any of the laws and regulations of the countries having - # jurisdiction over the User or the intended distribution itself. - # - # NO WARRANTY - # - # The program was produced on an experimental basis in the course of the - # research and development conducted during the project and is provided - # to users as so produced on an experimental basis. Accordingly, the - # program is provided without any warranty whatsoever, whether express, - # implied, statutory or otherwise. The term "warranty" used herein - # includes, but is not limited to, any warranty of the quality, - # performance, merchantability and fitness for a particular purpose of - # the program and the nonexistence of any infringement or violation of - # any right of any third party. - # - # Each user of the program will agree and understand, and be deemed to - # have agreed and understood, that there is no warranty whatsoever for - # the program and, accordingly, the entire risk arising from or - # otherwise connected with the program is assumed by the user. - # - # Therefore, neither ICOT, the copyright holder, or any other - # organization that participated in or was otherwise related to the - # development of the program and their respective officials, directors, - # officers and other employees shall be held liable for any and all - # damages, including, without limitation, general, special, incidental - # and consequential damages, arising out of or otherwise in connection - # with the use or inability to use the program or any product, material - # or result produced or otherwise obtained by using the program, - # regardless of whether they have been advised of, or otherwise had - # knowledge of, the possibility of such damages at any time during the - # project or thereafter. Each user will be deemed to have agreed to the - # foregoing by his or her commencement of use of the program. The term - # "use" as used herein includes, but is not limited to, the use, - # modification, copying and distribution of the program and the - # production of secondary products from the program. - # - # In the case where the program, whether in its original form or - # modified, was distributed or delivered to or received by a user from - # any person, organization or entity other than ICOT, unless it makes or - # grants independently of ICOT any specific warranty to the user in - # writing, such person, organization or entity, will also be exempted - # from and not be held liable to the user for any such damages as noted - # above as far as the program is concerned. - # - # ---------------COPYING.ipadic-----END---------------------------------- - -3. Lao Word Break Dictionary Data (laodict.txt) - - # Copyright (c) 2013 International Business Machines Corporation - # and others. All Rights Reserved. - # - # Project: http://code.google.com/p/lao-dictionary/ - # Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt - # License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICENSE.txt - # (copied below) - # - # This file is derived from the above dictionary, with slight - # modifications. - # ---------------------------------------------------------------------- - # Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell. - # All rights reserved. - # - # Redistribution and use in source and binary forms, with or without - # modification, - # are permitted provided that the following conditions are met: - # - # - # Redistributions of source code must retain the above copyright notice, this - # list of conditions and the following disclaimer. Redistributions in - # binary form must reproduce the above copyright notice, this list of - # conditions and the following disclaimer in the documentation and/or - # other materials provided with the distribution. - # - # - # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - # OF THE POSSIBILITY OF SUCH DAMAGE. - # -------------------------------------------------------------------------- - -4. Burmese Word Break Dictionary Data (burmesedict.txt) - - # Copyright (c) 2014 International Business Machines Corporation - # and others. All Rights Reserved. - # - # This list is part of a project hosted at: - # github.com/kanyawtech/myanmar-karen-word-lists - # - # -------------------------------------------------------------------------- - # Copyright (c) 2013, LeRoy Benjamin Sharon - # All rights reserved. - # - # Redistribution and use in source and binary forms, with or without - # modification, are permitted provided that the following conditions - # are met: Redistributions of source code must retain the above - # copyright notice, this list of conditions and the following - # disclaimer. Redistributions in binary form must reproduce the - # above copyright notice, this list of conditions and the following - # disclaimer in the documentation and/or other materials provided - # with the distribution. - # - # Neither the name Myanmar Karen Word Lists, nor the names of its - # contributors may be used to endorse or promote products derived - # from this software without specific prior written permission. - # - # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS - # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - # SUCH DAMAGE. - # -------------------------------------------------------------------------- - -5. Time Zone Database - - ICU uses the public domain data and code derived from Time Zone -Database for its time zone support. The ownership of the TZ database -is explained in BCP 175: Procedure for Maintaining the Time Zone -Database section 7. - - # 7. Database Ownership - # - # The TZ database itself is not an IETF Contribution or an IETF - # document. Rather it is a pre-existing and regularly updated work - # that is in the public domain, and is intended to remain in the - # public domain. Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do - # not apply to the TZ Database or contributions that individuals make - # to it. Should any claims be made and substantiated against the TZ - # Database, the organization that is providing the IANA - # Considerations defined in this RFC, under the memorandum of - # understanding with the IETF, currently ICANN, may act in accordance - # with all competent court orders. No ownership claims will be made - # by ICANN or the IETF Trust on the database or the code. Any person - # making a contribution to the database or code waives all rights to - # future claims in that contribution or in the TZ Database. - -6. Google double-conversion - -Copyright 2006-2011, the V8 project authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +AndroidX document file library., AndroidX print library.: -JSR 305: + Copyright (c) 2005-2011, The Android Open Source Project -Copyright (c) 2007-2009, JSR305 expert group -All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. -http://www.opensource.org/licenses/bsd-license.php - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the JSR305 expert group nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -Protobuf Nano: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Copyright 2008, Google Inc. -All rights reserved. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + 1. Definitions. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -STL: + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -SGI STL + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -The STL portion of GNU libstdc++ that is used with gcc3 and gcc4 is licensed -under the GPL, with the following exception: + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -# As a special exception, you may use this file as part of a free software -# library without restriction. Specifically, if other files instantiate -# templates or use macros or inline functions from this file, or you compile -# this file and link it with other files to produce an executable, this -# file does not by itself cause the resulting executable to be covered by -# the GNU General Public License. This exception does not however -# invalidate any other reasons why the executable file might be covered by -# the GNU General Public License. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS -UTF: - -UTF-8 Library - -The authors of this software are Rob Pike and Ken Thompson. - Copyright (c) 1998-2002 by Lucent Technologies. -Permission to use, copy, modify, and distribute this software for any -purpose without fee is hereby granted, provided that this entire notice -is included in all copies of any software which is or includes a copy -or modification of this software and in all copies of the supporting -documentation for such software. -THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED -WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY -REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY -OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. +AndroidX versioned parcelable library.: -flatbuffers: + Copyright (c) 2005-2018, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +Checker Framework Annotations: + +A few parts of the Checker Framework have more permissive licenses. + + * The annotations are licensed under the MIT License. (The text of this + license appears below.) More specifically, all the parts of the Checker + Framework that you might want to include with your own program use the + MIT License. This is the checker-qual.jar file and all the files that + appear in it: every file in a qual/ directory, plus NullnessUtils.java + and RegexUtil.java. In addition, the cleanroom implementations of + third-party annotations, which the Checker Framework recognizes as + aliases for its own annotations, are licensed under the MIT License. + +=========================================================================== + +MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +=========================================================================== + + +FlatBuffers: Apache License @@ -875,7 +779,7 @@ limitations under the License. -safeparcel: +JSR 250, safeparcel: Apache License @@ -1079,3 +983,35 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + +JSR 305: + +Copyright (c) 2007-2009, JSR305 expert group +All rights reserved. + +http://www.opensource.org/licenses/bsd-license.php + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the JSR305 expert group nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_base/README.chromium b/third_party/android_deps/libs/com_google_android_gms_play_services_base/README.chromium index 65d72bc..e11391e9 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_base/README.chromium +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_base/README.chromium
@@ -1,7 +1,7 @@ Name: play-services-base Short Name: play-services-base URL: https://developers.google.com/android/guides/setup -Version: 17.0.0 +Version: 17.1.0 License: Android Software Development Kit License License File: LICENSE Security Critical: yes
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_base/cipd.yaml b/third_party/android_deps/libs/com_google_android_gms_play_services_base/cipd.yaml index 820c088a..188018e 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_base/cipd.yaml +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_base/cipd.yaml
@@ -3,8 +3,8 @@ # found in the LICENSE file. # To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:17.0.0-cr0 +# cipd create --pkg-def cipd.yaml -tag version:17.1.0-cr0 package: chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base description: "play-services-base" data: -- file: play-services-base-17.0.0.aar +- file: play-services-base-17.1.0.aar
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/LICENSE b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/LICENSE index 60ac680..fb38a036 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/LICENSE +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/LICENSE
@@ -147,7 +147,433 @@ December 9, 2016 -JSR 250: +AndroidX document file library., AndroidX print library.: + + + Copyright (c) 2005-2011, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +AndroidX versioned parcelable library.: + + + Copyright (c) 2005-2018, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + +Checker Framework Annotations: + +A few parts of the Checker Framework have more permissive licenses. + + * The annotations are licensed under the MIT License. (The text of this + license appears below.) More specifically, all the parts of the Checker + Framework that you might want to include with your own program use the + MIT License. This is the checker-qual.jar file and all the files that + appear in it: every file in a qual/ directory, plus NullnessUtils.java + and RegexUtil.java. In addition, the cleanroom implementations of + third-party annotations, which the Checker Framework recognizes as + aliases for its own annotations, are licensed under the MIT License. + +=========================================================================== + +MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +=========================================================================== + + +FlatBuffers: Apache License @@ -338,7 +764,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2014 Google Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -353,214 +779,7 @@ limitations under the License. -absl: - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - -safeparcel: +JSR 250, safeparcel: Apache License @@ -796,246 +1015,3 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -Protobuf Nano: - -Copyright 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. - - -flatbuffers: - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/README.chromium b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/README.chromium index 8dc46f9..112cb8f0 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/README.chromium +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/README.chromium
@@ -1,7 +1,7 @@ Name: play-services-basement Short Name: play-services-basement URL: https://developers.google.com/android/guides/setup -Version: 17.0.0 +Version: 17.1.0 License: Android Software Development Kit License License File: LICENSE Security Critical: yes
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/cipd.yaml b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/cipd.yaml index 1478577b..91c91cb 100644 --- a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/cipd.yaml +++ b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/cipd.yaml
@@ -3,8 +3,8 @@ # found in the LICENSE file. # To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:17.0.0-cr0 +# cipd create --pkg-def cipd.yaml -tag version:17.1.0-cr0 package: chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement description: "play-services-basement" data: -- file: play-services-basement-17.0.0.aar +- file: play-services-basement-17.1.0.aar
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 84419d44..c4f1691c4 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -42,6 +42,7 @@ "crash/crash_memory_metrics_reporter.mojom", "credentialmanager/credential_manager.mojom", "css/preferred_color_scheme.mojom", + "css/preferred_contrast.mojom", "devtools/console_message.mojom", "devtools/devtools_agent.mojom", "devtools/devtools_frontend.mojom",
diff --git a/third_party/blink/public/mojom/css/preferred_contrast.mojom b/third_party/blink/public/mojom/css/preferred_contrast.mojom new file mode 100644 index 0000000..7af6486 --- /dev/null +++ b/third_party/blink/public/mojom/css/preferred_contrast.mojom
@@ -0,0 +1,12 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module blink.mojom; + +// Spec: https://drafts.csswg.org/mediaqueries-5/#prefers-contrast +enum PreferredContrast { + kMore, + kLess, + kNoPreference, +}; \ No newline at end of file
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h index 0a6dde810..781ac08 100644 --- a/third_party/blink/public/web/web_settings.h +++ b/third_party/blink/public/web/web_settings.h
@@ -35,6 +35,7 @@ #include "third_party/blink/public/common/css/navigation_controls.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" +#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-forward.h" #include "third_party/blink/public/mojom/v8_cache_options.mojom-forward.h" #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-forward.h" #include "third_party/blink/public/platform/web_common.h" @@ -275,6 +276,7 @@ virtual void SetLazyImageFirstKFullyLoad4G(int) = 0; virtual void SetForceDarkModeEnabled(bool) = 0; virtual void SetPreferredColorScheme(blink::mojom::PreferredColorScheme) = 0; + virtual void SetPreferredContrast(mojom::PreferredContrast) = 0; virtual void SetNavigationControls(NavigationControls) = 0; virtual void SetAriaModalPrunesAXTree(bool) = 0; virtual void SetUseAXMenuList(bool) = 0;
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 9e002d9a..bb8fe6b2 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1579,7 +1579,6 @@ "//components/paint_preview/common:common", "//mojo/public/cpp/system", "//services/network/trust_tokens:test_support", - "//skia", "//skia:skcms", "//testing/gmock", "//testing/gtest",
diff --git a/third_party/blink/renderer/core/DEPS b/third_party/blink/renderer/core/DEPS index 5ef3854..c636224b 100644 --- a/third_party/blink/renderer/core/DEPS +++ b/third_party/blink/renderer/core/DEPS
@@ -29,6 +29,7 @@ "+cc/animation/scroll_offset_animation_curve.h", "+cc/animation/scroll_state.h", "+cc/animation/scroll_timeline.h", + "+cc/base/features.h", "+cc/base/region.h", "+cc/input/browser_controls_state.h", "+cc/input/event_listener_properties.h", @@ -83,7 +84,6 @@ "+services/service_manager/public", "+skia/public/mojom", "+skia/ext/image_operations.h", - "+skia/ext/legacy_display_globals.h", "+skia/ext/skia_utils_mac.h", "+third_party/blink/public/common", "+third_party/blink/public/mojom",
diff --git a/third_party/blink/renderer/core/css/css.dict b/third_party/blink/renderer/core/css/css.dict index d17dba6..eee08f7e 100644 --- a/third_party/blink/renderer/core/css/css.dict +++ b/third_party/blink/renderer/core/css/css.dict
@@ -925,6 +925,9 @@ "jis-b5" "jis-b4" "hidden-matchable" +"more" +"less" +"forced" # at-rules "@charset"
diff --git a/third_party/blink/renderer/core/css/css_value_keywords.json5 b/third_party/blink/renderer/core/css/css_value_keywords.json5 index 82f0080..dba0e266 100644 --- a/third_party/blink/renderer/core/css/css_value_keywords.json5 +++ b/third_party/blink/renderer/core/css/css_value_keywords.json5
@@ -1441,5 +1441,11 @@ // always // both "force", + + // (prefers-contrast:) media feature + // no-preference + "more", + "less", + "forced", ], }
diff --git a/third_party/blink/renderer/core/css/media_feature_names.json5 b/third_party/blink/renderer/core/css/media_feature_names.json5 index 8d74260..464d2a23 100644 --- a/third_party/blink/renderer/core/css/media_feature_names.json5 +++ b/third_party/blink/renderer/core/css/media_feature_names.json5
@@ -53,6 +53,7 @@ "origin-trial-test", "pointer", "prefers-color-scheme", + "prefers-contrast", "prefers-reduced-motion", "prefers-reduced-data", "resolution",
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.cc b/third_party/blink/renderer/core/css/media_query_evaluator.cc index 5b94719..65c0ec07 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator.cc
@@ -32,7 +32,6 @@ #include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/navigation_controls.h" #include "third_party/blink/public/common/css/screen_spanning.h" -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" #include "third_party/blink/renderer/core/css/css_resolution_units.h" @@ -865,6 +864,37 @@ value.id == CSSValueID::kLight); } +static bool PrefersContrastMediaFeatureEval(const MediaQueryExpValue& value, + MediaFeaturePrefix, + const MediaValues& media_values) { + auto preferred_contrast = media_values.GetPreferredContrast(); + ForcedColors forced_colors = media_values.GetForcedColors(); + + if (!value.IsValid()) { + return forced_colors != ForcedColors::kNone || + preferred_contrast != mojom::blink::PreferredContrast::kNoPreference; + } + + if (!value.is_id) + return false; + + switch (value.id) { + case CSSValueID::kForced: + return forced_colors == ForcedColors::kActive; + case CSSValueID::kMore: + return preferred_contrast == mojom::blink::PreferredContrast::kMore; + case CSSValueID::kLess: + return preferred_contrast == mojom::blink::PreferredContrast::kLess; + case CSSValueID::kNoPreference: + return forced_colors != ForcedColors::kActive && + preferred_contrast == + mojom::blink::PreferredContrast::kNoPreference; + default: + NOTREACHED(); + return false; + } +} + static bool ForcedColorsMediaFeatureEval(const MediaQueryExpValue& value, MediaFeaturePrefix, const MediaValues& media_values) {
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc index 0fdcf554c5..a9140bdb 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
@@ -187,6 +187,60 @@ {nullptr, 0} // Do not remove the terminator line. }; +MediaQueryEvaluatorTestCase g_preferscontrast_nopreference_cases[] = { + {"(prefers-contrast)", 0}, + {"(prefers-contrast: more)", 0}, + {"(prefers-contrast: less)", 0}, + {"(prefers-contrast: forced)", 0}, + {"(prefers-contrast: no-preference)", 1}, + {nullptr, 0} // Do not remove the terminator line. +}; + +MediaQueryEvaluatorTestCase g_preferscontrast_more_cases[] = { + {"(prefers-contrast)", 1}, + {"(prefers-contrast: more)", 1}, + {"(prefers-contrast: less)", 0}, + {"(prefers-contrast: forced)", 0}, + {"(prefers-contrast: no-preference)", 0}, + {nullptr, 0} // Do not remove the terminator line. +}; + +MediaQueryEvaluatorTestCase g_preferscontrast_less_cases[] = { + {"(prefers-contrast)", 1}, + {"(prefers-contrast: more)", 0}, + {"(prefers-contrast: less)", 1}, + {"(prefers-contrast: forced)", 0}, + {"(prefers-contrast: no-preference)", 0}, + {nullptr, 0} // Do not remove the terminator line. +}; + +MediaQueryEvaluatorTestCase g_preferscontrast_forced_cases[] = { + {"(prefers-contrast)", 1}, + {"(prefers-contrast: more)", 0}, + {"(prefers-contrast: less)", 0}, + {"(prefers-contrast: forced)", 1}, + {"(prefers-contrast: no-preference)", 0}, + {nullptr, 0} // Do not remove the terminator line. +}; + +MediaQueryEvaluatorTestCase g_preferscontrast_forced_more_cases[] = { + {"(prefers-contrast)", 1}, + {"(prefers-contrast: more)", 1}, + {"(prefers-contrast: less)", 0}, + {"(prefers-contrast: forced)", 1}, + {"(prefers-contrast: no-preference)", 0}, + {nullptr, 0} // Do not remove the terminator line. +}; + +MediaQueryEvaluatorTestCase g_preferscontrast_forced_less_cases[] = { + {"(prefers-contrast)", 1}, + {"(prefers-contrast: more)", 0}, + {"(prefers-contrast: less)", 1}, + {"(prefers-contrast: forced)", 1}, + {"(prefers-contrast: no-preference)", 0}, + {nullptr, 0} // Do not remove the terminator line. +}; + MediaQueryEvaluatorTestCase g_navigationcontrols_back_button_cases[] = { {"(navigation-controls: back-button)", 1}, {"(navigation-controls: none)", 0}, @@ -398,6 +452,61 @@ } } +TEST(MediaQueryEvaluatorTest, CachedPrefersContrast) { + ScopedForcedColorsForTest forced_scoped_feature(true); + ScopedPrefersContrastForTest contrast_scoped_feature(true); + + MediaValuesCached::MediaValuesCachedData data; + data.forced_colors = ForcedColors::kNone; + data.preferred_contrast = mojom::blink::PreferredContrast::kNoPreference; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + + // Prefers-contrast - no-preference. + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_preferscontrast_nopreference_cases, media_query_evaluator); + + // Prefers-contrast - more. + { + data.preferred_contrast = mojom::blink::PreferredContrast::kMore; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_preferscontrast_more_cases, media_query_evaluator); + } + + // Prefers-contrast - less. + { + data.preferred_contrast = mojom::blink::PreferredContrast::kLess; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_preferscontrast_less_cases, media_query_evaluator); + } + + // Prefers-contrast - forced. + { + data.preferred_contrast = mojom::blink::PreferredContrast::kNoPreference; + data.forced_colors = ForcedColors::kActive; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_preferscontrast_forced_cases, media_query_evaluator); + } + + // Prefers-contrast - forced and more. + { + data.preferred_contrast = mojom::blink::PreferredContrast::kMore; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_preferscontrast_forced_more_cases, media_query_evaluator); + } + + // Prefers-contrast - forced and less. + { + data.preferred_contrast = mojom::blink::PreferredContrast::kLess; + MediaValues* media_values = MakeGarbageCollected<MediaValuesCached>(data); + MediaQueryEvaluator media_query_evaluator(*media_values); + TestMQEvaluator(g_preferscontrast_forced_less_cases, media_query_evaluator); + } +} + TEST(MediaQueryEvaluatorTest, CachedScreenSpanning) { ScopedCSSFoldablesForTest scoped_feature(true);
diff --git a/third_party/blink/renderer/core/css/media_query_exp.cc b/third_party/blink/renderer/core/css/media_query_exp.cc index 870db6e..60177fab7 100644 --- a/third_party/blink/renderer/core/css/media_query_exp.cc +++ b/third_party/blink/renderer/core/css/media_query_exp.cc
@@ -79,6 +79,13 @@ if (media_feature == media_feature_names::kPrefersColorSchemeMediaFeature) return ident == CSSValueID::kDark || ident == CSSValueID::kLight; + if (RuntimeEnabledFeatures::PrefersContrastEnabled()) { + if (media_feature == media_feature_names::kPrefersContrastMediaFeature) { + return ident == CSSValueID::kNoPreference || ident == CSSValueID::kMore || + ident == CSSValueID::kLess || ident == CSSValueID::kForced; + } + } + if (media_feature == media_feature_names::kPrefersReducedMotionMediaFeature) return ident == CSSValueID::kNoPreference || ident == CSSValueID::kReduce; @@ -219,6 +226,8 @@ media_feature == media_feature_names::kImmersiveMediaFeature || media_feature == media_feature_names::kPrefersColorSchemeMediaFeature || + (media_feature == media_feature_names::kPrefersContrastMediaFeature && + RuntimeEnabledFeatures::PrefersContrastEnabled()) || media_feature == media_feature_names::kPrefersReducedMotionMediaFeature || (media_feature ==
diff --git a/third_party/blink/renderer/core/css/media_values.cc b/third_party/blink/renderer/core/css/media_values.cc index 0fac519f..f6a4809 100644 --- a/third_party/blink/renderer/core/css/media_values.cc +++ b/third_party/blink/renderer/core/css/media_values.cc
@@ -6,7 +6,6 @@ #include "third_party/blink/public/common/css/screen_spanning.h" #include "third_party/blink/public/common/widget/screen_info.h" -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/renderer/core/css/css_resolution_units.h" @@ -196,6 +195,13 @@ return frame->GetDocument()->GetStyleEngine().GetPreferredColorScheme(); } +mojom::blink::PreferredContrast MediaValues::CalculatePreferredContrast( + LocalFrame* frame) { + DCHECK(frame); + DCHECK(frame->GetSettings()); + return frame->GetSettings()->GetPreferredContrast(); +} + bool MediaValues::CalculatePrefersReducedMotion(LocalFrame* frame) { DCHECK(frame); DCHECK(frame->GetSettings());
diff --git a/third_party/blink/renderer/core/css/media_values.h b/third_party/blink/renderer/core/css/media_values.h index cf3dd63..a631a5f 100644 --- a/third_party/blink/renderer/core/css/media_values.h +++ b/third_party/blink/renderer/core/css/media_values.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_H_ #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink-forward.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" @@ -19,7 +20,6 @@ class LocalFrame; enum class CSSValueID; enum class ColorSpaceGamut; -enum class PreferredColorScheme; enum class ForcedColors; enum class NavigationControls; enum class ScreenSpanning; @@ -85,6 +85,7 @@ virtual ColorSpaceGamut ColorGamut() const = 0; virtual mojom::blink::PreferredColorScheme GetPreferredColorScheme() const = 0; + virtual mojom::blink::PreferredContrast GetPreferredContrast() const = 0; virtual bool PrefersReducedMotion() const = 0; virtual bool PrefersReducedData() const = 0; virtual ForcedColors GetForcedColors() const = 0; @@ -112,6 +113,8 @@ static ColorSpaceGamut CalculateColorGamut(LocalFrame*); static mojom::blink::PreferredColorScheme CalculatePreferredColorScheme( LocalFrame*); + static mojom::blink::PreferredContrast CalculatePreferredContrast( + LocalFrame*); static bool CalculatePrefersReducedMotion(LocalFrame*); static bool CalculatePrefersReducedData(LocalFrame*); static ForcedColors CalculateForcedColors();
diff --git a/third_party/blink/renderer/core/css/media_values_cached.cc b/third_party/blink/renderer/core/css/media_values_cached.cc index 8e2108a..6fe6bf12 100644 --- a/third_party/blink/renderer/core/css/media_values_cached.cc +++ b/third_party/blink/renderer/core/css/media_values_cached.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/public/common/css/navigation_controls.h" #include "third_party/blink/public/common/css/screen_spanning.h" #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h" +#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -35,6 +36,7 @@ display_mode(blink::mojom::DisplayMode::kBrowser), color_gamut(ColorSpaceGamut::kUnknown), preferred_color_scheme(mojom::blink::PreferredColorScheme::kLight), + preferred_contrast(mojom::blink::PreferredContrast::kNoPreference), prefers_reduced_motion(false), forced_colors(ForcedColors::kNone), navigation_controls(NavigationControls::kNone), @@ -77,6 +79,7 @@ media_type = MediaValues::CalculateMediaType(frame); color_gamut = MediaValues::CalculateColorGamut(frame); preferred_color_scheme = MediaValues::CalculatePreferredColorScheme(frame); + preferred_contrast = MediaValues::CalculatePreferredContrast(frame); prefers_reduced_motion = MediaValues::CalculatePrefersReducedMotion(frame); prefers_reduced_data = MediaValues::CalculatePrefersReducedData(frame); forced_colors = MediaValues::CalculateForcedColors(); @@ -197,6 +200,11 @@ return data_.preferred_color_scheme; } +mojom::blink::PreferredContrast MediaValuesCached::GetPreferredContrast() + const { + return data_.preferred_contrast; +} + bool MediaValuesCached::PrefersReducedMotion() const { return data_.prefers_reduced_motion; }
diff --git a/third_party/blink/renderer/core/css/media_values_cached.h b/third_party/blink/renderer/core/css/media_values_cached.h index 5988c2198..92f44ef0 100644 --- a/third_party/blink/renderer/core/css/media_values_cached.h +++ b/third_party/blink/renderer/core/css/media_values_cached.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_CACHED_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_CACHED_H_ -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/media_values.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h" @@ -37,6 +36,7 @@ blink::mojom::DisplayMode display_mode; ColorSpaceGamut color_gamut; mojom::blink::PreferredColorScheme preferred_color_scheme; + mojom::blink::PreferredContrast preferred_contrast; bool prefers_reduced_motion; bool prefers_reduced_data = false; ForcedColors forced_colors; @@ -67,6 +67,7 @@ data.display_mode = display_mode; data.color_gamut = color_gamut; data.preferred_color_scheme = preferred_color_scheme; + data.preferred_contrast = preferred_contrast; data.prefers_reduced_motion = prefers_reduced_motion; data.prefers_reduced_data = prefers_reduced_data; data.forced_colors = forced_colors; @@ -108,6 +109,7 @@ blink::mojom::DisplayMode DisplayMode() const override; ColorSpaceGamut ColorGamut() const override; mojom::blink::PreferredColorScheme GetPreferredColorScheme() const override; + mojom::blink::PreferredContrast GetPreferredContrast() const override; bool PrefersReducedMotion() const override; bool PrefersReducedData() const override; ForcedColors GetForcedColors() const override;
diff --git a/third_party/blink/renderer/core/css/media_values_dynamic.cc b/third_party/blink/renderer/core/css/media_values_dynamic.cc index 37a3386..df1f7b9 100644 --- a/third_party/blink/renderer/core/css/media_values_dynamic.cc +++ b/third_party/blink/renderer/core/css/media_values_dynamic.cc
@@ -6,7 +6,6 @@ #include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/navigation_controls.h" -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" #include "third_party/blink/renderer/core/css/css_resolution_units.h" #include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h" @@ -145,6 +144,11 @@ return CalculatePreferredColorScheme(frame_); } +mojom::blink::PreferredContrast MediaValuesDynamic::GetPreferredContrast() + const { + return CalculatePreferredContrast(frame_); +} + bool MediaValuesDynamic::PrefersReducedMotion() const { return CalculatePrefersReducedMotion(frame_); }
diff --git a/third_party/blink/renderer/core/css/media_values_dynamic.h b/third_party/blink/renderer/core/css/media_values_dynamic.h index 7861a7d..6a02488 100644 --- a/third_party/blink/renderer/core/css/media_values_dynamic.h +++ b/third_party/blink/renderer/core/css/media_values_dynamic.h
@@ -48,6 +48,7 @@ blink::mojom::DisplayMode DisplayMode() const override; ColorSpaceGamut ColorGamut() const override; mojom::blink::PreferredColorScheme GetPreferredColorScheme() const override; + mojom::blink::PreferredContrast GetPreferredContrast() const override; bool PrefersReducedMotion() const override; bool PrefersReducedData() const override; ForcedColors GetForcedColors() const override;
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index 02e648d..c9d35a5a 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -9,7 +9,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/common/css/navigation_controls.h" -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_shadow_root_init.h" @@ -1544,6 +1543,125 @@ GetCSSPropertyColor())); } +TEST_F(StyleEngineTest, MediaQueriesChangePrefersContrast) { + ScopedForcedColorsForTest forced_scoped_feature(true); + ScopedPrefersContrastForTest contrast_scoped_feature(true); + + ColorSchemeHelper color_scheme_helper(GetDocument()); + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kNoPreference); + color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kNone); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + body { color: red; forced-color-adjust: none; } + @media (prefers-contrast: no-preference) { + body { color: green } + } + @media (prefers-contrast) { + body { color: blue } + } + </style> + <body></body> + )HTML"); + + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 128, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kMore); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 0, 255), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kLess); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 0, 255), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kActive); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 0, 255), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); +} + +TEST_F(StyleEngineTest, MediaQueriesChangeSpecificPrefersContrast) { + ScopedForcedColorsForTest forced_scoped_feature(true); + ScopedPrefersContrastForTest contrast_scoped_feature(true); + + ColorSchemeHelper color_scheme_helper(GetDocument()); + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kNoPreference); + color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kNone); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + body { color: red; forced-color-adjust: none; } + @media (prefers-contrast: more) { + body { color: blue } + } + @media (prefers-contrast: less) { + body { color: orange } + } + @media (prefers-contrast: forced) { + body { color: yellow } + } + @media (prefers-contrast: forced) and (prefers-contrast: more) { + body { color: green } + } + @media (prefers-contrast: forced) and (prefers-contrast: less) { + body { color: purple } + } + </style> + <body></body> + )HTML"); + + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(255, 0, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kMore); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 0, 255), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kLess); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(255, 165, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetForcedColors(GetDocument(), ForcedColors::kActive); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(128, 0, 128), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kMore); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(0, 128, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); + + color_scheme_helper.SetPreferredContrast( + mojom::blink::PreferredContrast::kNoPreference); + UpdateAllLifecyclePhases(); + EXPECT_EQ(MakeRGB(255, 255, 0), + GetDocument().body()->GetComputedStyle()->VisitedDependentColor( + GetCSSPropertyColor())); +} + TEST_F(StyleEngineTest, MediaQueriesChangePrefersReducedMotion) { GetDocument().body()->setInnerHTML(R"HTML( <style>
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 09fa31a..63c54840 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -673,6 +673,14 @@ // update. layout_object->MarkEffectiveAllowedTouchActionChanged(); } + if (needs_blocking_wheel_event_handler_update_ || + layout_object->BlockingWheelEventHandlerChanged() || + layout_object->DescendantBlockingWheelEventHandlerChanged()) { + // Note that although the object itself should have up to date value, in + // order to force recalc of the whole subtree, we mark it as needing an + // update. + layout_object->MarkBlockingWheelEventHandlerChanged(); + } return true; } return compositing_dirtied; @@ -762,6 +770,7 @@ PrePaintTreeWalk::ObjectRequiresTreeBuilderContext(*layout_object) || needs_prepaint_subtree_walk_ || needs_effective_allowed_touch_action_update_ || + needs_blocking_wheel_event_handler_update_ || needs_compositing_requirements_update_ || (layout_box && layout_box->HasSelfPaintingLayer() && layout_box->Layer()->ChildNeedsCompositingInputsUpdate());
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index 32709c28a..c35f579 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -178,9 +178,12 @@ void NotifySubtreeGainedSelection(); void SetNeedsPrePaintSubtreeWalk( - bool needs_effective_allowed_touch_action_update) { + bool needs_effective_allowed_touch_action_update, + bool needs_blocking_wheel_event_handler_update) { needs_effective_allowed_touch_action_update_ = needs_effective_allowed_touch_action_update; + needs_blocking_wheel_event_handler_update_ = + needs_blocking_wheel_event_handler_update; needs_prepaint_subtree_walk_ = true; } @@ -334,6 +337,7 @@ bool reattach_layout_tree_was_blocked_ = false; bool needs_effective_allowed_touch_action_update_ = false; + bool needs_blocking_wheel_event_handler_update_ = false; bool needs_prepaint_subtree_walk_ = false; bool needs_compositing_requirements_update_ = false; bool needs_compositing_dependent_flag_update_ = false;
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc index ba0cfe1b..e2cf89b 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -8,6 +8,8 @@ #include <utility> #include "base/memory/ptr_util.h" +#include "base/test/scoped_feature_list.h" +#include "cc/base/features.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" @@ -1591,6 +1593,275 @@ EXPECT_TRUE(handler_object->InsideBlockingTouchEventHandler()); } +TEST_F(DisplayLockContextTest, AncestorWheelEventHandler) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetHtmlInnerHTML(R"HTML( + <style> + #locked { + width: 100px; + height: 100px; + contain: style layout paint; + } + </style> + <div id="ancestor"> + <div id="handler"> + <div id="descendant"> + <div id="locked"> + <div id="lockedchild"></div> + </div> + </div> + </div> + </div> + )HTML"); + + auto* ancestor_element = GetDocument().getElementById("ancestor"); + auto* handler_element = GetDocument().getElementById("handler"); + auto* descendant_element = GetDocument().getElementById("descendant"); + auto* locked_element = GetDocument().getElementById("locked"); + auto* lockedchild_element = GetDocument().getElementById("lockedchild"); + + LockElement(*locked_element, false); + EXPECT_TRUE(locked_element->GetDisplayLockContext()->IsLocked()); + + auto* ancestor_object = ancestor_element->GetLayoutObject(); + auto* handler_object = handler_element->GetLayoutObject(); + auto* descendant_object = descendant_element->GetLayoutObject(); + auto* locked_object = locked_element->GetLayoutObject(); + auto* lockedchild_object = lockedchild_element->GetLayoutObject(); + + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(lockedchild_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE( + lockedchild_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(handler_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(lockedchild_object->InsideBlockingWheelEventHandler()); + + auto* callback = MakeGarbageCollected<DisplayLockEmptyEventListener>(); + handler_element->addEventListener(event_type_names::kWheel, callback); + + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(lockedchild_object->BlockingWheelEventHandlerChanged()); + + EXPECT_TRUE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE( + lockedchild_object->DescendantBlockingWheelEventHandlerChanged()); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(lockedchild_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE( + lockedchild_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(handler_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(lockedchild_object->InsideBlockingWheelEventHandler()); + + // Manually commit the lock so that we can verify which dirty bits get + // propagated. + CommitElement(*locked_element, false); + UnlockImmediate(locked_element->GetDisplayLockContext()); + + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(lockedchild_object->BlockingWheelEventHandlerChanged()); + + EXPECT_TRUE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE( + lockedchild_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(handler_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(lockedchild_object->InsideBlockingWheelEventHandler()); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(lockedchild_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE( + lockedchild_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(handler_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(lockedchild_object->InsideBlockingWheelEventHandler()); +} + +TEST_F(DisplayLockContextTest, DescendantWheelEventHandler) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetHtmlInnerHTML(R"HTML( + <style> + #locked { + width: 100px; + height: 100px; + contain: style layout paint; + } + </style> + <div id="ancestor"> + <div id="descendant"> + <div id="locked"> + <div id="handler"></div> + </div> + </div> + </div> + )HTML"); + + auto* ancestor_element = GetDocument().getElementById("ancestor"); + auto* descendant_element = GetDocument().getElementById("descendant"); + auto* locked_element = GetDocument().getElementById("locked"); + auto* handler_element = GetDocument().getElementById("handler"); + + LockElement(*locked_element, false); + EXPECT_TRUE(locked_element->GetDisplayLockContext()->IsLocked()); + + auto* ancestor_object = ancestor_element->GetLayoutObject(); + auto* descendant_object = descendant_element->GetLayoutObject(); + auto* locked_object = locked_element->GetLayoutObject(); + auto* handler_object = handler_element->GetLayoutObject(); + + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(handler_object->InsideBlockingWheelEventHandler()); + + auto* callback = MakeGarbageCollected<DisplayLockEmptyEventListener>(); + handler_element->addEventListener(event_type_names::kWheel, callback); + + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(handler_object->InsideBlockingWheelEventHandler()); + + // Do the same check again. For now, nothing is expected to change. However, + // when we separate self and child layout, then some flags would be different. + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(handler_object->InsideBlockingWheelEventHandler()); + + // Manually commit the lock so that we can verify which dirty bits get + // propagated. + CommitElement(*locked_element, false); + UnlockImmediate(locked_element->GetDisplayLockContext()); + + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler_object->BlockingWheelEventHandlerChanged()); + + EXPECT_TRUE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_TRUE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(handler_object->InsideBlockingWheelEventHandler()); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(ancestor_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(locked_object->DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler_object->DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant_object->InsideBlockingWheelEventHandler()); + EXPECT_FALSE(locked_object->InsideBlockingWheelEventHandler()); + EXPECT_TRUE(handler_object->InsideBlockingWheelEventHandler()); +} + TEST_F(DisplayLockContextTest, DescendantNeedsPaintPropertyUpdateBlocked) { SetHtmlInnerHTML(R"HTML( <style>
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 6d2b5adc..6946676 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -8687,7 +8687,7 @@ SkBitmap bitmap; bitmap.allocN32Pixels(reference_bitmap_size.Width(), reference_bitmap_size.Height()); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorGREEN); EXPECT_EQ(reference_bitmap_size.Width(), drag_image->Size().Width());
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc index 0231ad1..3133f16 100644 --- a/third_party/blink/renderer/core/exported/web_settings_impl.cc +++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -775,6 +775,11 @@ settings_->SetPreferredColorScheme(color_scheme); } +void WebSettingsImpl::SetPreferredContrast( + mojom::blink::PreferredContrast contrast) { + settings_->SetPreferredContrast(contrast); +} + void WebSettingsImpl::SetNavigationControls( NavigationControls navigation_controls) { settings_->SetNavigationControls(navigation_controls);
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h index 8d8baedf..6dacbbf8 100644 --- a/third_party/blink/renderer/core/exported/web_settings_impl.h +++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -31,6 +31,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_SETTINGS_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_SETTINGS_IMPL_H_ +#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h" #include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h" #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h" #include "third_party/blink/public/web/web_settings.h" @@ -223,6 +224,7 @@ void SetForceDarkModeEnabled(bool) override; void SetPreferredColorScheme(mojom::blink::PreferredColorScheme) override; + void SetPreferredContrast(mojom::blink::PreferredContrast) override; void SetNavigationControls(NavigationControls) override; void SetAriaModalPrunesAXTree(bool) override;
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index a6b9552..924e1e56 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -537,7 +537,7 @@ // Set canvas background to red with alpha. SkBitmap bitmap; bitmap.allocN32Pixels(kWidth, kHeight); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(kAlphaRed); PaintRecordBuilder builder;
diff --git a/third_party/blink/renderer/core/frame/event_handler_registry.cc b/third_party/blink/renderer/core/frame/event_handler_registry.cc index 85c70ec0..5672958 100644 --- a/third_party/blink/renderer/core/frame/event_handler_registry.cc +++ b/third_party/blink/renderer/core/frame/event_handler_registry.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/frame/event_handler_registry.h" +#include "cc/base/features.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_options.h" #include "third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h" #include "third_party/blink/renderer/core/events/event_util.h" @@ -303,6 +304,25 @@ if (auto* layout_view = dom_window->GetFrame()->ContentLayoutObject()) layout_view->MarkEffectiveAllowedTouchActionChanged(); } + } else if (handler_class == kWheelEventBlocking) { + if (base::FeatureList::IsEnabled(::features::kWheelEventRegions)) { + if (auto* node = target->ToNode()) { + if (auto* layout_object = node->GetLayoutObject()) { + layout_object->MarkBlockingWheelEventHandlerChanged(); + auto* continuation = layout_object->VirtualContinuation(); + while (continuation) { + continuation->MarkBlockingWheelEventHandlerChanged(); + continuation = continuation->VirtualContinuation(); + } + } + } else if (auto* dom_window = target->ToLocalDOMWindow()) { + // This event handler is on a window. Ensure the layout view is + // invalidated because the layout view tracks the window's blocking + // wheel event handler rects. + if (auto* layout_view = dom_window->GetFrame()->ContentLayoutObject()) + layout_view->MarkBlockingWheelEventHandlerChanged(); + } + } } }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 03240756..132a9041 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -4272,6 +4272,13 @@ // the frame was throttled. layout_view->AddSubtreePaintPropertyUpdateReason( SubtreePaintPropertyUpdateReason::kPreviouslySkipped); + + if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + // PaintLayerCompositor::CanBeComposited returns an incorrect visibility + // value for throttled frames, and it needs to be recomputed when the + // frame becomes unthrottled again. + layout_view->Layer()->SetNeedsCompositingInputsUpdate(); + } } // Ensure we'll recompute viewport intersection for the frame subtree during // the scheduled visual update.
diff --git a/third_party/blink/renderer/core/frame/settings.h b/third_party/blink/renderer/core/frame/settings.h index c1f6841..c635d0e 100644 --- a/third_party/blink/renderer/core/frame/settings.h +++ b/third_party/blink/renderer/core/frame/settings.h
@@ -32,7 +32,7 @@ #include "base/macros.h" #include "third_party/blink/public/common/css/navigation_controls.h" -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-blink.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h" #include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h" #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5 index b269bb16..21280dd 100644 --- a/third_party/blink/renderer/core/frame/settings.json5 +++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -1011,6 +1011,15 @@ type: "mojom::blink::PreferredColorScheme", }, + // Preferred contrast from the OS/application passed to the renderer for + // evaluating the prefers-contrast media query. + { + name: "preferredContrast", + initial: "mojom::blink::PreferredContrast::kNoPreference", + invalidate: "MediaQuery", + type: "mojom::blink::PreferredContrast", + }, + // Preferred motion-reduction setting from the OS/application passed to the // renderer for evaluating the prefers-reduced-motion media query. {
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc index 53ebe65f..477a21d 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -12,7 +12,6 @@ #include "base/single_thread_task_runner.h" #include "gpu/command_buffer/client/shared_image_interface.h" #include "gpu/config/gpu_feature_info.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h" @@ -968,8 +967,7 @@ DCHECK(!IsMainThread()); SkImageInfo info = SkImageInfo::MakeN32Premul(dst_rect.Width(), dst_rect.Height()); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - sk_sp<SkSurface> surface = SkSurface::MakeRaster(info, &props); + sk_sp<SkSurface> surface = SkSurface::MakeRaster(info); sk_sp<SkImage> skia_image; if (surface) { paint_record->Playback(surface->getCanvas());
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc index bbfe837..e6fa2adf 100644 --- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
@@ -34,6 +34,7 @@ #include <memory> #include "base/stl_util.h" +#include "cc/base/features.h" #include "cc/base/region.h" #include "cc/layers/picture_layer.h" #include "cc/trees/layer_tree_host.h" @@ -126,12 +127,22 @@ IntRect(rect), protocol::LayerTree::ScrollRect::TypeEnum::TouchEventHandler)); } - if (report_wheel_scrollers) { - scroll_rects->emplace_back(BuildScrollRect( - // TODO(pdr): Use the correct region for wheel event handlers, see - // https://crbug.com/841364. - gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height()), - protocol::LayerTree::ScrollRect::TypeEnum::WheelEventHandler)); + + if (base::FeatureList::IsEnabled(::features::kWheelEventRegions)) { + const cc::Region& wheel_event_handler_region = layer->wheel_event_region(); + for (const gfx::Rect& rect : wheel_event_handler_region) { + scroll_rects->emplace_back(BuildScrollRect( + IntRect(rect), + protocol::LayerTree::ScrollRect::TypeEnum::WheelEventHandler)); + } + } else { + if (report_wheel_scrollers) { + scroll_rects->emplace_back(BuildScrollRect( + // TODO(pdr): Use the correct region for wheel event handlers, see + // https://crbug.com/841364. + gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height()), + protocol::LayerTree::ScrollRect::TypeEnum::WheelEventHandler)); + } } return scroll_rects->empty() ? nullptr : std::move(scroll_rects); }
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index da9ab8f7..b284434 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -33,6 +33,7 @@ #include <utility> #include "base/allocator/partition_allocator/partition_alloc.h" +#include "cc/base/features.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/animation/element_animations.h" @@ -4453,10 +4454,12 @@ ClearPaintInvalidationFlags(); bitfields_.SetNeedsPaintPropertyUpdate(false); bitfields_.SetEffectiveAllowedTouchActionChanged(false); + bitfields_.SetBlockingWheelEventHandlerChanged(false); if (!ChildPrePaintBlockedByDisplayLock()) { bitfields_.SetDescendantNeedsPaintPropertyUpdate(false); bitfields_.SetDescendantEffectiveAllowedTouchActionChanged(false); + bitfields_.SetDescendantBlockingWheelEventHandlerChanged(false); bitfields_.ResetSubtreePaintPropertyUpdateReasons(); } } @@ -4540,6 +4543,27 @@ } } +void LayoutObject::MarkBlockingWheelEventHandlerChanged() { + DCHECK(base::FeatureList::IsEnabled(::features::kWheelEventRegions)); + bitfields_.SetBlockingWheelEventHandlerChanged(true); + // If we're locked, mark our descendants as needing this change. This is used + // as a signal to ensure we mark the element as needing wheel event handler + // recalculation when the element becomes unlocked. + if (ChildPrePaintBlockedByDisplayLock()) { + bitfields_.SetDescendantBlockingWheelEventHandlerChanged(true); + return; + } + + LayoutObject* obj = ParentCrossingFrames(); + while (obj && !obj->DescendantBlockingWheelEventHandlerChanged()) { + obj->bitfields_.SetDescendantBlockingWheelEventHandlerChanged(true); + if (obj->ChildPrePaintBlockedByDisplayLock()) + break; + + obj = obj->ParentCrossingFrames(); + } +} + // Note about ::first-letter pseudo-element: // When an element has ::first-letter pseudo-element, first letter characters // are taken from |Text| node and first letter characters are considered
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 1fe0c24e..5f1ae94c 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -30,6 +30,7 @@ #include <utility> #include "base/auto_reset.h" +#include "cc/base/features.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/display_lock/display_lock_context.h" @@ -3000,6 +3001,25 @@ bitfields_.SetInsideBlockingTouchEventHandler(inside); } + // Whether this object's Node has a blocking wheel event handler on itself or + // an ancestor. + bool InsideBlockingWheelEventHandler() const { + return bitfields_.InsideBlockingWheelEventHandler(); + } + // Mark this object as having a |InsideBlockingWheelEventHandler| changed, and + // mark all ancestors as having a descendant that changed. This will cause a + // PrePaint tree walk to update blocking wheel event handler state. + void MarkBlockingWheelEventHandlerChanged(); + bool BlockingWheelEventHandlerChanged() const { + return bitfields_.BlockingWheelEventHandlerChanged(); + } + bool DescendantBlockingWheelEventHandlerChanged() const { + return bitfields_.DescendantBlockingWheelEventHandlerChanged(); + } + void UpdateInsideBlockingWheelEventHandler(bool inside) { + bitfields_.SetInsideBlockingWheelEventHandler(inside); + } + // Painters can use const methods only, except for these explicitly declared // methods. class CORE_EXPORT MutableForPainting { @@ -3063,6 +3083,10 @@ layout_object_.UpdateInsideBlockingTouchEventHandler(inside); } + void UpdateInsideBlockingWheelEventHandler(bool inside) { + layout_object_.UpdateInsideBlockingWheelEventHandler(inside); + } + void InvalidateIntersectionObserverCachedRects() { layout_object_.InvalidateIntersectionObserverCachedRects(); } @@ -3697,6 +3721,10 @@ inside_blocking_touch_event_handler_(false), effective_allowed_touch_action_changed_(true), descendant_effective_allowed_touch_action_changed_(false), + inside_blocking_wheel_event_handler_(false), + blocking_wheel_event_handler_changed_( + base::FeatureList::IsEnabled(::features::kWheelEventRegions)), + descendant_blocking_wheel_event_handler_changed_(false), is_effective_root_scroller_(false), is_global_root_scroller_(false), registered_as_first_line_image_observer_(false), @@ -3962,6 +3990,23 @@ ADD_BOOLEAN_BITFIELD(descendant_effective_allowed_touch_action_changed_, DescendantEffectiveAllowedTouchActionChanged); + // Whether this object's Node has a blocking wheel event handler on itself + // or an ancestor. This is updated during the PrePaint phase. + ADD_BOOLEAN_BITFIELD(inside_blocking_wheel_event_handler_, + InsideBlockingWheelEventHandler); + + // Set when |InsideBlockingWheelEventHandler| changes (i.e., blocking wheel + // event handlers change). This only needs to be set on the object that + // changes as the PrePaint walk will ensure descendants are updated. + ADD_BOOLEAN_BITFIELD(blocking_wheel_event_handler_changed_, + BlockingWheelEventHandlerChanged); + + // Set when a descendant's |InsideBlockingWheelEventHandler| changes. This + // is used to ensure the PrePaint tree walk processes objects with + // |blocking_wheel_event_handler_changed_|. + ADD_BOOLEAN_BITFIELD(descendant_blocking_wheel_event_handler_changed_, + DescendantBlockingWheelEventHandlerChanged); + // See page/scrolling/README.md for an explanation of root scroller and how // it works. ADD_BOOLEAN_BITFIELD(is_effective_root_scroller_, IsEffectiveRootScroller);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc index 1433679..6bf2681 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -556,6 +556,11 @@ return layout_object_->EffectiveAllowedTouchAction(); } +bool NGPhysicalFragment::InsideBlockingWheelEventHandler() const { + DCHECK(layout_object_); + return layout_object_->InsideBlockingWheelEventHandler(); +} + UBiDiLevel NGPhysicalFragment::BidiLevel() const { switch (Type()) { case kFragmentText:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h index 45844ab..16cc709 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -386,6 +386,9 @@ // (from style) and blocking touch event handlers. TouchAction EffectiveAllowedTouchAction() const; + // Returns if this fragment is inside a non-passive wheel event handler. + bool InsideBlockingWheelEventHandler() const; + // Returns the bidi level of a text or atomic inline fragment. UBiDiLevel BidiLevel() const;
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc index e1d6107..2a7fb66 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc
@@ -22,7 +22,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "cc/base/features.h" #include "cc/input/main_thread_scrolling_reason.h" #include "cc/layers/scrollbar_layer_base.h" #include "cc/trees/compositor_commit_data.h" @@ -903,6 +905,349 @@ EXPECT_EQ(region.bounds(), gfx::Rect(0, 0, 100, 100)); } +TEST_P(ScrollingTest, WheelEventRegion) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <style> + #scrollable { + width: 200px; + height: 200px; + will-change: transform; + overflow: scroll; + } + #content { + width: 1000px; + height: 1000px; + } + </style> + <div id="scrollable"> + <div id="content"></div> + </div> + <script> + document.getElementById("scrollable").addEventListener('wheel', (e) => { + e.preventDefault(); + }); + </script> + )HTML"); + ForceFullCompositingUpdate(); + + auto* cc_layer = MainFrameScrollingContentsLayer(); + cc::Region region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); + + cc_layer = LayerByDOMElementId("scrollable"); + region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.GetRegionComplexity(), 1); + EXPECT_EQ(region.bounds(), gfx::Rect(0, 0, 200, 200)); + + cc_layer = ScrollingContentsLayerByDOMElementId("scrollable"); + region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.GetRegionComplexity(), 1); + EXPECT_EQ(region.bounds(), gfx::Rect(0, 0, 1000, 1000)); +} + +TEST_P(ScrollingTest, WheelEventHandlerInvalidation) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <style> + #scrollable { + width: 200px; + height: 200px; + will-change: transform; + overflow: scroll; + } + #content { + width: 1000px; + height: 1000px; + } + </style> + <div id="scrollable"> + <div id="content"></div> + </div> + )HTML"); + ForceFullCompositingUpdate(); + + // Initially there are no wheel event regions. + const auto* cc_layer = LayerByDOMElementId("scrollable"); + auto region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); + + const auto* cc_layer_content = + ScrollingContentsLayerByDOMElementId("scrollable"); + region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); + + // Adding a blocking window event handler should create a wheel event region. + auto* listener = MakeGarbageCollected<ScrollingTestMockEventListener>(); + auto* resolved_options = + MakeGarbageCollected<AddEventListenerOptionsResolved>(); + resolved_options->setPassive(false); + GetFrame() + ->GetDocument() + ->getElementById("scrollable") + ->addEventListener(event_type_names::kWheel, listener, resolved_options); + ForceFullCompositingUpdate(); + region = cc_layer->wheel_event_region(); + EXPECT_FALSE(region.IsEmpty()); + region = cc_layer_content->wheel_event_region(); + EXPECT_FALSE(region.IsEmpty()); + + // Removing the window event handler also removes the wheel event region. + GetFrame() + ->GetDocument() + ->getElementById("scrollable") + ->RemoveAllEventListeners(); + ForceFullCompositingUpdate(); + region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); + region = cc_layer_content->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); +} + +TEST_P(ScrollingTest, WheelEventRegions) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <style> + #scrollable { + width: 200px; + height: 200px; + will-change: transform; + overflow: scroll; + } + #content { + width: 1000px; + height: 1000px; + } + .region { + width: 100px; + height: 100px; + } + </style> + <div id="scrollable"> + <div id="region1" class="region"></div> + <div id="content"></div> + <div id="region2" class="region"></div> + </div> + <script> + document.getElementById("region1").addEventListener('wheel', (e) => { + e.preventDefault(); + }); + document.getElementById("region2").addEventListener('wheel', (e) => { + e.preventDefault(); + }); + </script> + )HTML"); + ForceFullCompositingUpdate(); + + auto* cc_layer = LayerByDOMElementId("scrollable"); + cc::Region region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); + + cc_layer = ScrollingContentsLayerByDOMElementId("scrollable"); + region = cc_layer->wheel_event_region(); + + cc::Region expected_region; + expected_region.Union(gfx::Rect(0, 0, 100, 100)); + expected_region.Union(gfx::Rect(0, 1100, 100, 100)); + + EXPECT_EQ(region, expected_region); +} + +TEST_P(ScrollingTest, WheelEventRegionUpdatedOnSubscrollerScrollChange) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + GetWebView()->GetSettings()->SetPreferCompositingToLCDTextEnabled(false); + LoadHTML(R"HTML( + <style> + #noncomposited { + width: 200px; + height: 200px; + overflow: auto; + position: absolute; + top: 50px; + background: white; + box-shadow: 10px 10px black inset; + } + #content { + width: 100%; + height: 1000px; + } + .region { + width: 100px; + height: 100px; + } + </style> + <div id="noncomposited"> + <div id="region" class="region"></div> + <div id="content"></div> + </div> + <script> + document.getElementById("region").addEventListener('wheel', (e) => { + e.preventDefault(); + }, {passive: false}); + </script> + )HTML"); + ForceFullCompositingUpdate(); + + const auto* cc_layer = MainFrameScrollingContentsLayer(); + cc::Region region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.bounds(), gfx::Rect(8, 50, 100, 100)); + + Element* scrollable_element = + GetFrame()->GetDocument()->getElementById("noncomposited"); + DCHECK(scrollable_element); + + // Change scroll position and verify that blocking wheel handler region is + // updated accordingly. + scrollable_element->setScrollTop(10.0); + ForceFullCompositingUpdate(); + region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.bounds(), gfx::Rect(8, 50, 100, 90)); +} + +// Box shadow is not hit testable and should not be included in wheel region. +TEST_P(ScrollingTest, WheelEventRegionExcludesBoxShadow) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <style> + #shadow { + width: 100px; + height: 100px; + box-shadow: 10px 5px 5px red; + } + </style> + <div id="shadow"></div> + <script> + document.getElementById("shadow").addEventListener('wheel', (e) => { + e.preventDefault(); + }); + </script> + )HTML"); + ForceFullCompositingUpdate(); + + const auto* cc_layer = MainFrameScrollingContentsLayer(); + + cc::Region region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.bounds(), gfx::Rect(8, 8, 100, 100)); +} + +TEST_P(ScrollingTest, IframeWindowWheelEventHandler) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <iframe style="width: 275px; height: 250px; will-change: transform"> + </iframe> + )HTML"); + auto* child_frame = + To<WebLocalFrameImpl>(GetWebView()->MainFrameImpl()->FirstChild()); + frame_test_helpers::LoadHTMLString(child_frame, R"HTML( + <p style="margin: 1000px"> Hello </p> + <script> + window.addEventListener('wheel', (e) => { + e.preventDefault(); + }, {passive: false}); + </script> + )HTML", + url_test_helpers::ToKURL("about:blank")); + ForceFullCompositingUpdate(); + + const auto* child_cc_layer = + FrameScrollingContentsLayer(*child_frame->GetFrame()); + cc::Region region_child_frame = child_cc_layer->wheel_event_region(); + cc::Region region_main_frame = + MainFrameScrollingContentsLayer()->wheel_event_region(); + EXPECT_TRUE(region_main_frame.bounds().IsEmpty()); + EXPECT_FALSE(region_child_frame.bounds().IsEmpty()); + // We only check for the content size for verification as the offset is 0x0 + // due to child frame having its own composited layer. + + // Because blocking wheel rects are painted on the scrolling contents layer, + // the size of the rect should be equal to the entire scrolling contents area. + EXPECT_EQ(gfx::Rect(child_cc_layer->bounds()), region_child_frame.bounds()); +} + +TEST_P(ScrollingTest, WindowWheelEventHandler) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <style> + html { width: 200px; height: 200px; } + body { width: 100px; height: 100px; } + </style> + <script> + window.addEventListener('wheel', function(event) { + event.preventDefault(); + }, {passive: false} ); + </script> + )HTML"); + ForceFullCompositingUpdate(); + + auto* cc_layer = MainFrameScrollingContentsLayer(); + + // The wheel region should include the entire frame, even though the + // document is smaller than the frame. + cc::Region region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.bounds(), gfx::Rect(0, 0, 320, 240)); +} + +TEST_P(ScrollingTest, WindowWheelEventHandlerInvalidation) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(""); + ForceFullCompositingUpdate(); + + auto* cc_layer = MainFrameScrollingContentsLayer(); + + // Initially there are no wheel event regions. + auto region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); + + // Adding a blocking window event handler should create a wheel event region. + auto* listener = MakeGarbageCollected<ScrollingTestMockEventListener>(); + auto* resolved_options = + MakeGarbageCollected<AddEventListenerOptionsResolved>(); + resolved_options->setPassive(false); + GetFrame()->DomWindow()->addEventListener(event_type_names::kWheel, listener, + resolved_options); + ForceFullCompositingUpdate(); + region = cc_layer->wheel_event_region(); + EXPECT_FALSE(region.IsEmpty()); + + // Removing the window event handler also removes the wheel event region. + GetFrame()->DomWindow()->RemoveAllEventListeners(); + ForceFullCompositingUpdate(); + region = cc_layer->wheel_event_region(); + EXPECT_TRUE(region.IsEmpty()); +} + +TEST_P(ScrollingTest, WheelEventHandlerChangeWithoutContent) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + LoadHTML(R"HTML( + <div id="blocking" + style="will-change: transform; width: 100px; height: 100px;"></div> + )HTML"); + ForceFullCompositingUpdate(); + + // Adding a blocking window event handler should create a touch action region. + auto* listener = MakeGarbageCollected<ScrollingTestMockEventListener>(); + auto* resolved_options = + MakeGarbageCollected<AddEventListenerOptionsResolved>(); + resolved_options->setPassive(false); + auto* target_element = GetFrame()->GetDocument()->getElementById("blocking"); + target_element->addEventListener(event_type_names::kWheel, listener, + resolved_options); + ForceFullCompositingUpdate(); + + const auto* cc_layer = LayerByDOMElementId("blocking"); + cc::Region region = cc_layer->wheel_event_region(); + EXPECT_EQ(region.bounds(), gfx::Rect(0, 0, 100, 100)); +} + // Ensure we don't crash when a plugin becomes a LayoutInline TEST_P(ScrollingTest, PluginBecomesLayoutInline) { LoadHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/paint/README.md b/third_party/blink/renderer/core/paint/README.md index 499d75b2..0bcc84e 100644 --- a/third_party/blink/renderer/core/paint/README.md +++ b/third_party/blink/renderer/core/paint/README.md
@@ -690,7 +690,13 @@ areas of the page that disallow touch events due to blocking touch event handlers. -3. [`HitTestData::scroll_translation`](../../platform/graphics/paint/hit_test_data.h) +3. [`HitTestData::wheel_event_rects`](../../platform/graphics/paint/hit_test_data.h) + + Used for [wheel event handler regions](https://docs.google.com/document/d/1ar4WhVnLA-fmw6atgP-23iq-ys_NfFoGb3LA5AgaylA/view) + which are areas of the page that disallow default wheel event processing + due to blocking wheel event handlers. + +4. [`HitTestData::scroll_translation`](../../platform/graphics/paint/hit_test_data.h) and [`HitTestData::scroll_hit_test_rect`](../../platform/graphics/paint/hit_test_data.h)
diff --git a/third_party/blink/renderer/core/paint/block_flow_paint_invalidator.cc b/third_party/blink/renderer/core/paint/block_flow_paint_invalidator.cc index 07c3c56..1e45914 100644 --- a/third_party/blink/renderer/core/paint/block_flow_paint_invalidator.cc +++ b/third_party/blink/renderer/core/paint/block_flow_paint_invalidator.cc
@@ -57,7 +57,8 @@ if (cursor) { // Line boxes record hit test data (see NGBoxFragmentPainter::PaintLineBox) // and should be invalidated if they change. - bool invalidate_all_lines = block_flow_.HasEffectiveAllowedTouchAction(); + bool invalidate_all_lines = block_flow_.HasEffectiveAllowedTouchAction() || + block_flow_.InsideBlockingWheelEventHandler(); for (cursor.MoveToFirstLine(); cursor; cursor.MoveToNextLine()) { // The first line NGLineBoxFragment paints the ::first-line background.
diff --git a/third_party/blink/renderer/core/paint/block_painter_test.cc b/third_party/blink/renderer/core/paint/block_painter_test.cc index 65de3154..e459e42 100644 --- a/third_party/blink/renderer/core/paint/block_painter_test.cc +++ b/third_party/blink/renderer/core/paint/block_painter_test.cc
@@ -4,8 +4,11 @@ #include "third_party/blink/renderer/core/paint/block_painter.h" +#include "base/test/scoped_feature_list.h" +#include "cc/base/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h" #include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" @@ -49,6 +52,296 @@ EXPECT_EQ(PhysicalRect(0, 0, 50, 5000), BlockPainter(*scroller).OverflowRectForCullRectTesting(false)); } +namespace { +class BlockPainterTestMockEventListener final : public NativeEventListener { + public: + void Invoke(ExecutionContext*, Event*) override {} +}; + +void SetWheelEventListener(const Document& document, const char* element_id) { + auto* element = document.getElementById(element_id); + auto* listener = MakeGarbageCollected<BlockPainterTestMockEventListener>(); + auto* resolved_options = + MakeGarbageCollected<AddEventListenerOptionsResolved>(); + resolved_options->setPassive(false); + element->addEventListener(event_type_names::kWheel, listener, + resolved_options); + document.View()->UpdateAllLifecyclePhases(DocumentUpdateReason::kTest); + document.View()->RunPostLifecycleSteps(); +} +} // namespace + +TEST_P(BlockPainterTest, BlockingWheelRectsWithoutPaint) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetBodyInnerHTML(R"HTML( + <style> + ::-webkit-scrollbar { display: none; } + body { margin: 0; } + #parent { width: 100px; height: 100px; } + #childVisible { width: 200px; height: 25px; } + #childHidden { width: 200px; height: 30px; visibility: hidden; } + #childDisplayNone { width: 200px; height: 30px; display: none; } + </style> + <div id='parent'> + <div id='childVisible'></div> + <div id='childHidden'></div> + </div> + )HTML"); + + // Initially there should be no hit test data because there is no blocking + // wheel handler. + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); + + // Add a blocking wheel event handler to parent and ensure that hit test data + // are created for both the parent and the visible child. + SetWheelEventListener(GetDocument(), "parent"); + + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + + HitTestData hit_test_data; + hit_test_data.wheel_event_rects = {{IntRect(0, 0, 100, 100)}, + {IntRect(0, 0, 200, 25)}}; + ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK(1, &hit_test_data)); + + // Remove the blocking wheel event handler from parent and ensure no hit test + // data are left. + auto* parent_element = GetElementById("parent"); + parent_element->RemoveAllEventListeners(); + UpdateAllLifecyclePhasesForTest(); + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); +} + +TEST_P(BlockPainterTest, BlockingWheelEventRectSubsequenceCaching) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetBodyInnerHTML(R"HTML( + <style> + body { margin: 0; } + #stacking-context { + position: absolute; + z-index: 1; + } + #wheelhandler { + width: 100px; + height: 100px; + } + </style> + <div id='stacking-context'> + <div id='wheelhandler'></div> + </div> + )HTML"); + + SetWheelEventListener(GetDocument(), "wheelhandler"); + + const auto* wheelhandler = GetLayoutObjectByElementId("wheelhandler"); + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + + const auto& hit_test_client = + *ToLayoutBox(GetLayoutObjectByElementId("stacking-context"))->Layer(); + EXPECT_SUBSEQUENCE_FROM_CHUNK(hit_test_client, + ContentPaintChunks().begin() + 1, 1); + + PaintChunk::Id hit_test_chunk_id(hit_test_client, DisplayItem::kLayerChunk); + auto hit_test_chunk_properties = wheelhandler->EnclosingLayer() + ->GetLayoutObject() + .FirstFragment() + .ContentsProperties(); + HitTestData hit_test_data; + hit_test_data.wheel_event_rects = {{IntRect(0, 0, 100, 100)}}; + + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 1, hit_test_chunk_id, hit_test_chunk_properties, + &hit_test_data, IntRect(0, 0, 100, 100)))); + + // Trigger a repaint with the whole stacking-context subsequence cached. + GetLayoutView().Layer()->SetNeedsRepaint(); + CachedItemAndSubsequenceCounter counter; + UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ(1u, counter.NumNewCachedItems()); + EXPECT_EQ(1u, counter.NumNewCachedSubsequences()); + + EXPECT_SUBSEQUENCE_FROM_CHUNK(hit_test_client, + ContentPaintChunks().begin() + 1, 1); + + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 1, hit_test_chunk_id, hit_test_chunk_properties, + &hit_test_data, IntRect(0, 0, 100, 100)))); +} + +TEST_P(BlockPainterTest, WheelEventRectPaintCaching) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetBodyInnerHTML(R"HTML( + <style> + body { margin: 0; } + #wheelhandler { + width: 100px; + height: 100px; + } + #sibling { + width: 100px; + height: 100px; + background: blue; + } + </style> + <div id='wheelhandler'></div> + <div id='sibling'></div> + )HTML"); + + SetWheelEventListener(GetDocument(), "wheelhandler"); + + auto* sibling_element = GetElementById("sibling"); + const auto* sibling = sibling_element->GetLayoutObject(); + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, + IsSameId(sibling, kBackgroundType))); + + HitTestData hit_test_data; + hit_test_data.wheel_event_rects = {{IntRect(0, 0, 100, 100)}}; + + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK(2, &hit_test_data))); + + sibling_element->setAttribute(html_names::kStyleAttr, "background: green;"); + CachedItemAndSubsequenceCounter counter; + UpdateAllLifecyclePhasesForTest(); + // Only the background display item of the sibling should be invalidated. + EXPECT_EQ(1u, counter.NumNewCachedItems()); + + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK(2, &hit_test_data))); +} + +TEST_P(BlockPainterTest, BlockingWheelRectScrollingContents) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetBodyInnerHTML(R"HTML( + <style> + ::-webkit-scrollbar { display: none; } + body { margin: 0; } + #scroller { + width: 100px; + height: 100px; + overflow: scroll; + will-change: transform; + background-color: blue; + } + #child { + width: 10px; + height: 400px; + } + </style> + <div id='scroller'> + <div id='child'></div> + </div> + )HTML"); + + auto* scroller_element = GetElementById("scroller"); + auto* scroller = ToLayoutBoxModelObject(scroller_element->GetLayoutObject()); + const auto& scroller_scrolling_client = + scroller->GetScrollableArea()->GetScrollingBackgroundDisplayItemClient(); + + SetWheelEventListener(GetDocument(), "scroller"); + + HitTestData hit_test_data; + hit_test_data.wheel_event_rects = {{IntRect(0, 0, 100, 400)}, + {IntRect(0, 0, 10, 400)}}; + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + EXPECT_THAT( + ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, + IsSameId(scroller, kBackgroundType), + IsSameId(&scroller_scrolling_client, kBackgroundType))); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2), // scroller background. + IsPaintChunk(2, 2), // scroller scroll hit test. + IsPaintChunk( + 2, 3, PaintChunk::Id(*scroller, kScrollingBackgroundChunkType), + scroller->FirstFragment().ContentsProperties(), + &hit_test_data))); + + } else { + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); + + auto& scroller_paint_controller = scroller->GetScrollableArea() + ->Layer() + ->GraphicsLayerBacking() + ->GetPaintController(); + EXPECT_THAT( + scroller_paint_controller.GetDisplayItemList(), + ElementsAre(IsSameId(&scroller_scrolling_client, kBackgroundType))); + EXPECT_THAT( + scroller_paint_controller.PaintChunks(), + ElementsAre(IsPaintChunk( + 0, 1, PaintChunk::Id(*scroller, kScrollingBackgroundChunkType), + scroller->FirstFragment().ContentsProperties(), &hit_test_data))); + } +} + +TEST_P(BlockPainterTest, WheelEventRectPaintChunkChanges) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetBodyInnerHTML(R"HTML( + <style> + body { margin: 0; } + #wheelevent { + width: 100px; + height: 100px; + } + </style> + <div id='wheelevent'></div> + )HTML"); + + auto* wheelevent_element = GetElementById("wheelevent"); + auto* wheelevent = wheelevent_element->GetLayoutObject(); + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); + + SetWheelEventListener(GetDocument(), "wheelevent"); + + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + + PaintChunk::Id hit_test_chunk_id(*wheelevent->EnclosingLayer(), + kNonScrollingBackgroundChunkType); + HitTestData hit_test_data; + hit_test_data.wheel_event_rects = {{IntRect(0, 0, 100, 100)}}; + + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK(1, &hit_test_data))); + + wheelevent_element->RemoveAllEventListeners(); + UpdateAllLifecyclePhasesForTest(); + EXPECT_THAT(ContentDisplayItems(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM)); + EXPECT_THAT(ContentPaintChunks(), + ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON)); +} TEST_P(BlockPainterTest, TouchActionRectsWithoutPaint) { SetBodyInnerHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/paint/box_painter.cc b/third_party/blink/renderer/core/paint/box_painter.cc index b0b788ca..9daca95 100644 --- a/third_party/blink/renderer/core/paint/box_painter.cc +++ b/third_party/blink/renderer/core/paint/box_painter.cc
@@ -286,7 +286,8 @@ paint_info.context.GetPaintController().RecordHitTestData( background_client, PixelSnappedIntRect(paint_rect), - layout_box_.EffectiveAllowedTouchAction()); + layout_box_.EffectiveAllowedTouchAction(), + layout_box_.InsideBlockingWheelEventHandler()); } void BoxPainter::RecordScrollHitTestData(
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index db2fad8..21f026f1 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -958,8 +958,9 @@ // paints content, regardless of whether the descendant content is a hit test) // but an exhaustive check of descendants that paint hit tests would be too // expensive. - bool paints_hit_test = - has_painted_content || GetLayoutObject().HasEffectiveAllowedTouchAction(); + bool paints_hit_test = has_painted_content || + GetLayoutObject().HasEffectiveAllowedTouchAction() || + GetLayoutObject().InsideBlockingWheelEventHandler(); bool paints_scroll_hit_test = ((owning_layer_.GetScrollableArea() && owning_layer_.GetScrollableArea()->ScrollsOverflow()) ||
diff --git a/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc b/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc index efed615..bd2f446a 100644 --- a/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc +++ b/third_party/blink/renderer/core/paint/inline_flow_box_painter.cc
@@ -349,7 +349,8 @@ paint_info.context.GetPaintController().RecordHitTestData( inline_flow_box_, PixelSnappedIntRect(AdjustedFrameRect(paint_offset)), - layout_object->EffectiveAllowedTouchAction()); + layout_object->EffectiveAllowedTouchAction(), + layout_object->InsideBlockingWheelEventHandler()); } void InlineFlowBoxPainter::PaintNormalBoxShadow(
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index 78fe8fa6..babf6f4 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -972,7 +972,8 @@ if (ShouldRecordHitTestData(paint_info)) { paint_info.context.GetPaintController().RecordHitTestData( *background_client, PixelSnappedIntRect(paint_rect), - PhysicalFragment().EffectiveAllowedTouchAction()); + PhysicalFragment().EffectiveAllowedTouchAction(), + PhysicalFragment().InsideBlockingWheelEventHandler()); } bool needs_scroll_hit_test = true; @@ -1359,7 +1360,8 @@ border_box.offset += child_offset; paint_info.context.GetPaintController().RecordHitTestData( display_item_client, PixelSnappedIntRect(border_box), - PhysicalFragment().EffectiveAllowedTouchAction()); + PhysicalFragment().EffectiveAllowedTouchAction(), + PhysicalFragment().InsideBlockingWheelEventHandler()); } // Paint the background of the `::first-line` line box.
diff --git a/third_party/blink/renderer/core/paint/paint_phase.h b/third_party/blink/renderer/core/paint/paint_phase.h index 579ecf8..b316aa4 100644 --- a/third_party/blink/renderer/core/paint/paint_phase.h +++ b/third_party/blink/renderer/core/paint/paint_phase.h
@@ -32,8 +32,8 @@ // The painting of a layer occurs in 5 phases, Each involves a recursive // descent into the layer's layout objects in painting order: // 1. Background phase: backgrounds and borders of all blocks are painted. -// Inlines are not painted at all. Touch-action hit test rects are also -// painted during this phase (see: paint/README.md#hit-test-painting). +// Inlines are not painted at all. Touch-action and wheel hit test rects are +// also painted during this phase (see: paint/README.md#hit-test-painting). // 2. ForcedColorsModeBackplate phase: a readability backplate is painted // behind all inline text, split by paragraph. This phase should only paint // content when in forced colors mode to ensure readability for text above
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 3debb9e5..12b5030 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/paint/pre_paint_tree_walk.h" #include "base/auto_reset.h" +#include "cc/base/features.h" #include "third_party/blink/renderer/core/dom/document_lifecycle.h" #include "third_party/blink/renderer/core/frame/event_handler_registry.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -292,22 +293,42 @@ } namespace { -bool HasBlockingTouchEventHandler(const LocalFrame& frame, - EventTarget& target) { + +enum class BlockingEventHandlerType { + kNone, + kTouchStartOrMoveBlockingEventHandler, + kWheelBlockingEventHandler, +}; + +bool HasBlockingEventHandlerHelper(const LocalFrame& frame, + EventTarget& target, + BlockingEventHandlerType event_type) { if (!target.HasEventListeners()) return false; const auto& registry = frame.GetEventHandlerRegistry(); - const auto* blocking = registry.EventHandlerTargets( - EventHandlerRegistry::kTouchStartOrMoveEventBlocking); - const auto* blocking_low_latency = registry.EventHandlerTargets( - EventHandlerRegistry::kTouchStartOrMoveEventBlockingLowLatency); - return blocking->Contains(&target) || blocking_low_latency->Contains(&target); + if (BlockingEventHandlerType::kTouchStartOrMoveBlockingEventHandler == + event_type) { + const auto* blocking = registry.EventHandlerTargets( + EventHandlerRegistry::kTouchStartOrMoveEventBlocking); + const auto* blocking_low_latency = registry.EventHandlerTargets( + EventHandlerRegistry::kTouchStartOrMoveEventBlockingLowLatency); + return blocking->Contains(&target) || + blocking_low_latency->Contains(&target); + } else if (BlockingEventHandlerType::kWheelBlockingEventHandler == + event_type) { + const auto* blocking = + registry.EventHandlerTargets(EventHandlerRegistry::kWheelEventBlocking); + return blocking->Contains(&target); + } + NOTREACHED(); + return false; } -bool HasBlockingTouchEventHandler(const LayoutObject& object) { +bool HasBlockingEventHandlerHelper(const LayoutObject& object, + BlockingEventHandlerType event_type) { if (IsA<LayoutView>(object)) { auto* frame = object.GetFrame(); - if (HasBlockingTouchEventHandler(*frame, *frame->DomWindow())) + if (HasBlockingEventHandlerHelper(*frame, *frame->DomWindow(), event_type)) return true; } @@ -321,7 +342,17 @@ } if (!node) return false; - return HasBlockingTouchEventHandler(*object.GetFrame(), *node); + return HasBlockingEventHandlerHelper(*object.GetFrame(), *node, event_type); +} + +bool HasBlockingTouchEventHandler(const LayoutObject& object) { + return HasBlockingEventHandlerHelper( + object, BlockingEventHandlerType::kTouchStartOrMoveBlockingEventHandler); +} + +bool HasBlockingWheelEventHandler(const LayoutObject& object) { + return HasBlockingEventHandlerHelper( + object, BlockingEventHandlerType::kWheelBlockingEventHandler); } } // namespace @@ -341,6 +372,22 @@ context.inside_blocking_touch_event_handler = true; } +void PrePaintTreeWalk::UpdateBlockingWheelEventHandler( + const LayoutObject& object, + PrePaintTreeWalk::PrePaintTreeWalkContext& context) { + if (object.BlockingWheelEventHandlerChanged()) + context.blocking_wheel_event_handler_changed = true; + + if (context.blocking_wheel_event_handler_changed) { + object.GetMutableForPainting().UpdateInsideBlockingWheelEventHandler( + context.inside_blocking_wheel_event_handler || + HasBlockingWheelEventHandler(object)); + } + + if (object.InsideBlockingWheelEventHandler()) + context.inside_blocking_wheel_event_handler = true; +} + void PrePaintTreeWalk::InvalidatePaintForHitTesting( const LayoutObject& object, PrePaintTreeWalk::PrePaintTreeWalkContext& context) { @@ -348,7 +395,8 @@ PaintInvalidatorContext::kSubtreeNoInvalidation) return; - if (!context.effective_allowed_touch_action_changed) + if (!context.effective_allowed_touch_action_changed && + !context.blocking_wheel_event_handler_changed) return; context.paint_invalidator_context.painting_layer->SetNeedsRepaint(); @@ -399,13 +447,17 @@ bool PrePaintTreeWalk::ObjectRequiresPrePaint(const LayoutObject& object) { return object.ShouldCheckForPaintInvalidation() || object.EffectiveAllowedTouchActionChanged() || - object.DescendantEffectiveAllowedTouchActionChanged(); + object.DescendantEffectiveAllowedTouchActionChanged() || + object.BlockingWheelEventHandlerChanged() || + object.DescendantBlockingWheelEventHandlerChanged(); + ; } bool PrePaintTreeWalk::ContextRequiresPrePaint( const PrePaintTreeWalkContext& context) { return context.paint_invalidator_context.NeedsSubtreeWalk() || - context.effective_allowed_touch_action_changed || context.clip_changed; + context.effective_allowed_touch_action_changed || + context.blocking_wheel_event_handler_changed || context.clip_changed; } bool PrePaintTreeWalk::ObjectRequiresTreeBuilderContext( @@ -543,8 +595,11 @@ } // This must happen before paint invalidation because background painting - // depends on the effective allowed touch action. + // depends on the effective allowed touch action and blocking wheel event + // handlers. UpdateEffectiveAllowedTouchAction(object, context); + if (base::FeatureList::IsEnabled(::features::kWheelEventRegions)) + UpdateBlockingWheelEventHandler(object, context); if (paint_invalidator_.InvalidatePaint( object, pre_paint_info, @@ -871,14 +926,15 @@ // same bits on the context. if (child_walk_blocked && (ContextRequiresTreeBuilderContext(context()) || ContextRequiresPrePaint(context()))) { - // Note that effective allowed touch action changed is special in that - // it requires us to specifically recalculate this value on each subtree - // element. Other flags simply need a subtree walk. Some consideration - // needs to be given to |clip_changed| which ensures that we repaint every - // layer, but for the purposes of PrePaint, this flag is just forcing a - // subtree walk. + // Note that |effective_allowed_touch_action_changed| and + // |blocking_wheel_event_handler_changed| are special in that they requires + // us to specifically recalculate this value on each subtree element. Other + // flags simply need a subtree walk. Some consideration needs to be given to + // |clip_changed| which ensures that we repaint every layer, but for the + // purposes of PrePaint, this flag is just forcing a subtree walk. object.GetDisplayLockContext()->SetNeedsPrePaintSubtreeWalk( - context().effective_allowed_touch_action_changed); + context().effective_allowed_touch_action_changed, + context().blocking_wheel_event_handler_changed); } if (!child_walk_blocked) {
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h index 423cf7a..dc7198d7 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
@@ -50,6 +50,10 @@ parent_context.inside_blocking_touch_event_handler), effective_allowed_touch_action_changed( parent_context.effective_allowed_touch_action_changed), + inside_blocking_wheel_event_handler( + parent_context.inside_blocking_wheel_event_handler), + blocking_wheel_event_handler_changed( + parent_context.blocking_wheel_event_handler_changed), clip_changed(parent_context.clip_changed), paint_invalidation_container( parent_context.paint_invalidation_container), @@ -81,6 +85,13 @@ // entire subtree may need to update. bool effective_allowed_touch_action_changed = false; + // Whether there is a blocking wheel event handler on any ancestor. + bool inside_blocking_wheel_event_handler = false; + + // When the blocking wheel event handlers change on an ancestor, the entire + // subtree may need to update. + bool blocking_wheel_event_handler_changed = false; + // This is set to true once we see tree_builder_context->clip_changed is // true. It will be propagated to descendant contexts even if we don't // create tree_builder_context. @@ -128,6 +139,11 @@ // which will ensure the subtree is updated too. void UpdateEffectiveAllowedTouchAction(const LayoutObject&, PrePaintTreeWalkContext&); + // Updates |LayoutObject::InsideBlockingWheelEventHandler|. Also ensures + // |PrePaintTreeWalkContext.blocking_wheel_event_handler_changed| is set + // which will ensure the subtree is updated too. + void UpdateBlockingWheelEventHandler(const LayoutObject&, + PrePaintTreeWalkContext&); void InvalidatePaintForHitTesting(const LayoutObject&, PrePaintTreeWalkContext&);
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc index 4813fd4..37d658aa 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/paint/pre_paint_tree_walk.h" +#include "base/test/scoped_feature_list.h" +#include "cc/base/features.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -407,4 +409,60 @@ EXPECT_FALSE(descendant.DescendantEffectiveAllowedTouchActionChanged()); } +TEST_P(PrePaintTreeWalkTest, InsideBlockingWheelEventHandlerUpdate) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + SetBodyInnerHTML(R"HTML( + <div id='ancestor' style='width: 100px; height: 100px;'> + <div id='handler' style='width: 100px; height: 100px;'> + <div id='descendant' style='width: 100px; height: 100px;'> + </div> + </div> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + auto& ancestor = *GetLayoutObjectByElementId("ancestor"); + auto& handler = *GetLayoutObjectByElementId("handler"); + auto& descendant = *GetLayoutObjectByElementId("descendant"); + + EXPECT_FALSE(ancestor.BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler.BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant.BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor.DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler.DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant.DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor.InsideBlockingWheelEventHandler()); + EXPECT_FALSE(handler.InsideBlockingWheelEventHandler()); + EXPECT_FALSE(descendant.InsideBlockingWheelEventHandler()); + + PrePaintTreeWalkMockEventListener* callback = + MakeGarbageCollected<PrePaintTreeWalkMockEventListener>(); + auto* handler_element = GetDocument().getElementById("handler"); + handler_element->addEventListener(event_type_names::kWheel, callback); + + EXPECT_FALSE(ancestor.BlockingWheelEventHandlerChanged()); + EXPECT_TRUE(handler.BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant.BlockingWheelEventHandlerChanged()); + + EXPECT_TRUE(ancestor.DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler.DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant.DescendantBlockingWheelEventHandlerChanged()); + + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(ancestor.BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler.BlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant.BlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor.DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(handler.DescendantBlockingWheelEventHandlerChanged()); + EXPECT_FALSE(descendant.DescendantBlockingWheelEventHandlerChanged()); + + EXPECT_FALSE(ancestor.InsideBlockingWheelEventHandler()); + EXPECT_TRUE(handler.InsideBlockingWheelEventHandler()); + EXPECT_TRUE(descendant.InsideBlockingWheelEventHandler()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/replaced_painter.cc b/third_party/blink/renderer/core/paint/replaced_painter.cc index 391a36c..726c6d9c 100644 --- a/third_party/blink/renderer/core/paint/replaced_painter.cc +++ b/third_party/blink/renderer/core/paint/replaced_painter.cc
@@ -103,8 +103,10 @@ if (layout_replaced_.StyleRef().Visibility() == EVisibility::kVisible) { if (layout_replaced_.HasBoxDecorationBackground()) should_paint_background = true; - if (layout_replaced_.HasEffectiveAllowedTouchAction()) + if (layout_replaced_.HasEffectiveAllowedTouchAction() || + layout_replaced_.InsideBlockingWheelEventHandler()) { should_paint_background = true; + } } if (should_paint_background) { if (layout_replaced_.HasLayer() &&
diff --git a/third_party/blink/renderer/core/paint/svg_model_object_painter.cc b/third_party/blink/renderer/core/paint/svg_model_object_painter.cc index 681754a..ff8ac2f 100644 --- a/third_party/blink/renderer/core/paint/svg_model_object_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_model_object_painter.cc
@@ -37,7 +37,8 @@ paint_info.context.GetPaintController().RecordHitTestData( svg_object, EnclosingIntRect(svg_object.VisualRectInLocalSVGCoordinates()), - svg_object.EffectiveAllowedTouchAction()); + svg_object.EffectiveAllowedTouchAction(), + svg_object.InsideBlockingWheelEventHandler()); } void SVGModelObjectPainter::PaintOutline(const PaintInfo& paint_info) {
diff --git a/third_party/blink/renderer/core/paint/view_painter.cc b/third_party/blink/renderer/core/paint/view_painter.cc index 26b98e85..06cd5505 100644 --- a/third_party/blink/renderer/core/paint/view_painter.cc +++ b/third_party/blink/renderer/core/paint/view_painter.cc
@@ -71,7 +71,8 @@ if (layout_view_.StyleRef().Visibility() != EVisibility::kVisible) return; - bool has_touch_action_rect = layout_view_.HasEffectiveAllowedTouchAction(); + bool has_hit_test_data = layout_view_.HasEffectiveAllowedTouchAction() || + layout_view_.InsideBlockingWheelEventHandler(); bool painting_scrolling_background = BoxDecorationData::IsPaintingScrollingBackground(paint_info, layout_view_); @@ -94,7 +95,7 @@ } } - if (!layout_view_.HasBoxDecorationBackground() && !has_touch_action_rect && + if (!layout_view_.HasBoxDecorationBackground() && !has_hit_test_data && !paints_scroll_hit_test) return; @@ -195,7 +196,7 @@ *background_client, painted_separate_backdrop, painted_separate_effect); } - if (has_touch_action_rect) { + if (has_hit_test_data) { BoxPainter(layout_view_) .RecordHitTestData(paint_info, PhysicalRect(pixel_snapped_background_rect),
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc index 5dbda36..1688361 100644 --- a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc +++ b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc
@@ -496,7 +496,26 @@ // Then bring it back on-screen. This should schedule an animation update. frame_element->setAttribute(kStyleAttr, ""); CompositeFrame(); + + if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + // Compositing inputs need to be re-computed on the next frame after + // unthrottling, because while throttled all throttled content is not + // considered eligible for compositing (PLC::CanBeComposited often returns + // false). + EXPECT_TRUE(frame_element->contentDocument() + ->View() + ->GetLayoutView() + ->Layer() + ->NeedsCompositingInputsUpdate()); + } + EXPECT_TRUE(Compositor().NeedsBeginFrame()); + CompositeFrame(); + EXPECT_FALSE(frame_element->contentDocument() + ->View() + ->GetLayoutView() + ->Layer() + ->NeedsCompositingInputsUpdate()); } TEST_P(FrameThrottlingTest, MutatingThrottledFrameDoesNotCauseAnimation) {
diff --git a/third_party/blink/renderer/core/testing/color_scheme_helper.cc b/third_party/blink/renderer/core/testing/color_scheme_helper.cc index 3953323..81bdf6c5 100644 --- a/third_party/blink/renderer/core/testing/color_scheme_helper.cc +++ b/third_party/blink/renderer/core/testing/color_scheme_helper.cc
@@ -4,7 +4,6 @@ #include "third_party/blink/renderer/core/testing/color_scheme_helper.h" -#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_theme_engine.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -18,6 +17,7 @@ DCHECK(Platform::Current() && Platform::Current()->ThemeEngine()); web_theme_engine_ = Platform::Current()->ThemeEngine(); default_preferred_color_scheme_ = settings_.GetPreferredColorScheme(); + default_preferred_contrast_ = settings_.GetPreferredContrast(); default_forced_colors_ = web_theme_engine_->GetForcedColors(); } @@ -26,12 +26,15 @@ DCHECK(Platform::Current() && Platform::Current()->ThemeEngine()); web_theme_engine_ = Platform::Current()->ThemeEngine(); default_preferred_color_scheme_ = settings_.GetPreferredColorScheme(); + default_preferred_contrast_ = settings_.GetPreferredContrast(); default_forced_colors_ = web_theme_engine_->GetForcedColors(); } ColorSchemeHelper::~ColorSchemeHelper() { - // Reset preferred color scheme and forced colors to their original values. + // Reset preferred color scheme, preferred contrast and forced colors to their + // original values. settings_.SetPreferredColorScheme(default_preferred_color_scheme_); + settings_.SetPreferredContrast(default_preferred_contrast_); web_theme_engine_->SetForcedColors(default_forced_colors_); } @@ -40,6 +43,11 @@ settings_.SetPreferredColorScheme(preferred_color_scheme); } +void ColorSchemeHelper::SetPreferredContrast( + const mojom::blink::PreferredContrast preferred_contrast) { + settings_.SetPreferredContrast(preferred_contrast); +} + void ColorSchemeHelper::SetForcedColors(Document& document, const ForcedColors forced_colors) { web_theme_engine_->SetForcedColors(forced_colors);
diff --git a/third_party/blink/renderer/core/testing/color_scheme_helper.h b/third_party/blink/renderer/core/testing/color_scheme_helper.h index e3ad820..92b6edb 100644 --- a/third_party/blink/renderer/core/testing/color_scheme_helper.h +++ b/third_party/blink/renderer/core/testing/color_scheme_helper.h
@@ -7,6 +7,7 @@ #include "third_party/blink/public/common/css/forced_colors.h" #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-shared.h" +#include "third_party/blink/public/mojom/css/preferred_contrast.mojom-shared.h" namespace blink { @@ -15,9 +16,10 @@ class Settings; class WebThemeEngine; -// ColorSchemeHelper is used to update the values of PreferredColorScheme and -// ForcedColors for testing. ColorSchemeHelper will reset PreferredColorScheme -// and ForcedColors back to their default values upon deconstruction. +// ColorSchemeHelper is used to update the values of PreferredColorScheme, +// PreferredContrast and ForcedColors for testing. ColorSchemeHelper will reset +// PreferredColorScheme, PreferredContrast and ForcedColors back to their +// default values upon deconstruction. class ColorSchemeHelper { public: ColorSchemeHelper(Document& document); @@ -26,6 +28,7 @@ void SetPreferredColorScheme( const mojom::PreferredColorScheme preferred_color_scheme); + void SetPreferredContrast(const mojom::PreferredContrast preferred_contrast); void SetForcedColors(Document& document, const ForcedColors forced_colors); void SetForcedColors(Page& page, const ForcedColors forced_colors); @@ -34,6 +37,8 @@ Settings& settings_; mojom::PreferredColorScheme default_preferred_color_scheme_ = mojom::PreferredColorScheme::kLight; + mojom::PreferredContrast default_preferred_contrast_ = + mojom::PreferredContrast::kNoPreference; ForcedColors default_forced_colors_ = ForcedColors::kNone; };
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index ee711629..394034d 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -1941,7 +1941,7 @@ } else { bitmap.allocPixels( SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType)); - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.clear(SK_ColorTRANSPARENT); canvas.drawImageRect(image, SkRect::MakeIWH(width, height), nullptr); }
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.cc b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.cc index 31ddf34d..837bad47 100644 --- a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.cc +++ b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.cc
@@ -11,7 +11,6 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_cookie_list_item.h" #include "third_party/blink/renderer/core/dom/dom_time_stamp.h" #include "third_party/blink/renderer/modules/event_modules.h" -#include "third_party/blink/renderer/platform/cookie/canonical_cookie.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -49,15 +48,15 @@ namespace { -String ToCookieListItemSameSite(network::mojom::CookieSameSite same_site) { +String ToCookieListItemSameSite(net::CookieSameSite same_site) { switch (same_site) { - case network::mojom::CookieSameSite::STRICT_MODE: + case net::CookieSameSite::STRICT_MODE: return "strict"; - case network::mojom::CookieSameSite::LAX_MODE: + case net::CookieSameSite::LAX_MODE: return "lax"; - case network::mojom::CookieSameSite::NO_RESTRICTION: + case net::CookieSameSite::NO_RESTRICTION: return "none"; - case network::mojom::CookieSameSite::UNSPECIFIED: + case net::CookieSameSite::UNSPECIFIED: return String(); } @@ -83,13 +82,14 @@ // static CookieListItem* CookieChangeEvent::ToCookieListItem( - const CanonicalCookie& canonical_cookie, + const net::CanonicalCookie& canonical_cookie, const network::mojom::blink::CookieEffectiveSameSite& effective_same_site, bool is_deleted) { CookieListItem* list_item = CookieListItem::Create(); - list_item->setName(canonical_cookie.Name()); - list_item->setPath(canonical_cookie.Path()); + list_item->setName(String::FromUTF8(canonical_cookie.Name())); + list_item->setPath(String::FromUTF8(canonical_cookie.Path())); + list_item->setSecure(canonical_cookie.IsSecure()); // Use effective same site if available, otherwise use same site. auto&& same_site = ToCookieListItemEffectiveSameSite(effective_same_site); @@ -99,7 +99,7 @@ list_item->setSameSite(same_site); // The domain of host-only cookies is the host name, without a dot (.) prefix. - String cookie_domain = canonical_cookie.Domain(); + String cookie_domain = String::FromUTF8(canonical_cookie.Domain()); if (cookie_domain.StartsWith(".")) { list_item->setDomain(cookie_domain.Substring(1)); } else { @@ -107,7 +107,7 @@ } if (!is_deleted) { - list_item->setValue(canonical_cookie.Value()); + list_item->setValue(String::FromUTF8(canonical_cookie.Value())); if (canonical_cookie.ExpiryDate().is_null()) { // TODO(crbug.com/1070871): Use base::nullopt instead. list_item->setExpiresToNull();
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h index 9369c44..68f35bcf 100644 --- a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h +++ b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h
@@ -7,6 +7,7 @@ #include <utility> +#include "net/cookies/canonical_cookie.h" #include "services/network/public/mojom/cookie_manager.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_cookie_list_item.h" #include "third_party/blink/renderer/modules/event_modules.h" @@ -62,7 +63,7 @@ void Trace(Visitor*) const override; static CookieListItem* ToCookieListItem( - const CanonicalCookie& canonical_cookie, + const net::CanonicalCookie& canonical_cookie, const network::mojom::blink::CookieEffectiveSameSite&, bool is_deleted); // True for information from a cookie deletion event.
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc index ace49af..558439b 100644 --- a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc +++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/optional.h" +#include "net/cookies/canonical_cookie.h" #include "services/network/public/mojom/restricted_cookie_manager.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" @@ -24,7 +25,6 @@ #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/cookie/canonical_cookie.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" @@ -60,7 +60,7 @@ } // Returns no value if and only if an exception is thrown. -base::Optional<CanonicalCookie> ToCanonicalCookie( +std::unique_ptr<net::CanonicalCookie> ToCanonicalCookie( const KURL& cookie_url, const CookieInit* options, ExceptionState& exception_state) { @@ -69,12 +69,12 @@ if (name.IsEmpty() && value.Contains('=')) { exception_state.ThrowTypeError( "Cookie value cannot contain '=' if the name is empty"); - return base::nullopt; + return nullptr; } if (name.IsEmpty() && value.IsEmpty()) { exception_state.ThrowTypeError( "Cookie name and value both cannot be empty"); - return base::nullopt; + return nullptr; } base::Time expires = options->hasExpiresNonNull() @@ -87,14 +87,14 @@ if (name.StartsWith("__Host-")) { exception_state.ThrowTypeError( "Cookies with \"__Host-\" prefix cannot have a domain"); - return base::nullopt; + return nullptr; } // The leading dot (".") from the domain attribute is stripped in the // Set-Cookie header, for compatibility. This API doesn't have compatibility // constraints, so reject the edge case outright. if (options->domain().StartsWith(".")) { exception_state.ThrowTypeError("Cookie domain cannot start with \".\""); - return base::nullopt; + return nullptr; } domain = String(".") + options->domain(); @@ -102,11 +102,8 @@ cookie_url_host != options->domain()) { exception_state.ThrowTypeError( "Cookie domain must domain-match current host"); - return base::nullopt; + return nullptr; } - } else { - // The absence of "domain" implies a host-only cookie. - domain = cookie_url_host; } String path = options->path(); @@ -114,11 +111,11 @@ if (name.StartsWith("__Host-") && path != "/") { exception_state.ThrowTypeError( "Cookies with \"__Host-\" prefix cannot have a non-\"/\" path"); - return base::nullopt; + return nullptr; } if (!path.StartsWith("/")) { exception_state.ThrowTypeError("Cookie path must start with \"/\""); - return base::nullopt; + return nullptr; } if (!path.EndsWith("/")) { path = path + String("/"); @@ -136,24 +133,24 @@ if (!SecurityOrigin::IsSecure(cookie_url)) { exception_state.ThrowTypeError( "Cannot modify a secure cookie on insecure origin"); - return base::nullopt; + return nullptr; } - network::mojom::CookieSameSite same_site; + net::CookieSameSite same_site; if (options->sameSite() == "strict") { - same_site = network::mojom::CookieSameSite::STRICT_MODE; + same_site = net::CookieSameSite::STRICT_MODE; } else if (options->sameSite() == "lax") { - same_site = network::mojom::CookieSameSite::LAX_MODE; + same_site = net::CookieSameSite::LAX_MODE; } else { DCHECK_EQ(options->sameSite(), "none"); - same_site = network::mojom::CookieSameSite::NO_RESTRICTION; + same_site = net::CookieSameSite::NO_RESTRICTION; } - return CanonicalCookie::Create( - name, value, domain, path, base::Time() /*creation*/, expires, - base::Time() /*last_access*/, true /*secure*/, false /*http_only*/, - same_site, CanonicalCookie::kDefaultPriority, - network::mojom::CookieSourceScheme::kSecure); + return net::CanonicalCookie::CreateSanitizedCookie( + cookie_url, name.Utf8(), value.Utf8(), domain.Utf8(), path.Utf8(), + base::Time() /*creation*/, expires, base::Time() /*last_access*/, + true /*secure*/, false /*http_only*/, same_site, + net::CookiePriority::COOKIE_PRIORITY_DEFAULT); } const KURL DefaultCookieURL(ExecutionContext* execution_context) { @@ -470,7 +467,7 @@ return ScriptPromise(); } - base::Optional<CanonicalCookie> canonical_cookie = + std::unique_ptr<net::CanonicalCookie> canonical_cookie = ToCanonicalCookie(default_cookie_url_, options, exception_state); if (!canonical_cookie) { DCHECK(exception_state.HadException()); @@ -485,7 +482,7 @@ auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); backend_->SetCanonicalCookie( - std::move(canonical_cookie.value()), default_cookie_url_, + *std::move(canonical_cookie), default_cookie_url_, default_site_for_cookies_, default_top_frame_origin_, WTF::Bind(&CookieStore::OnSetCanonicalCookieResult, WrapPersistent(resolver)));
diff --git a/third_party/blink/renderer/modules/imagecapture/DEPS b/third_party/blink/renderer/modules/imagecapture/DEPS index 093fbd2..a073069 100644 --- a/third_party/blink/renderer/modules/imagecapture/DEPS +++ b/third_party/blink/renderer/modules/imagecapture/DEPS
@@ -3,7 +3,6 @@ "+media/capture/mojom/image_capture.mojom-blink-forward.h", "+media/base", - "+skia/ext/legacy_display_globals.h", "+skia/ext/platform_canvas.h", "+third_party/libyuv", "+third_party/skia/include/core",
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc b/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc index d7edccca1..a2ea9d0 100644 --- a/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc +++ b/third_party/blink/renderer/modules/imagecapture/image_capture_frame_grabber.cc
@@ -8,7 +8,6 @@ #include "media/base/video_frame.h" #include "media/base/video_types.h" #include "media/base/video_util.h" -#include "skia/ext/legacy_display_globals.h" #include "skia/ext/platform_canvas.h" #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h" #include "third_party/blink/renderer/platform/mediastream/media_stream_component.h" @@ -94,8 +93,7 @@ const SkImageInfo info = SkImageInfo::MakeN32( frame->visible_rect().width(), frame->visible_rect().height(), alpha); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - sk_sp<SkSurface> surface = SkSurface::MakeRaster(info, &props); + sk_sp<SkSurface> surface = SkSurface::MakeRaster(info); DCHECK(surface); auto wrapper_callback =
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 64a2a69..57aa5a3 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -481,10 +481,6 @@ "context_lifecycle_notifier.h", "context_lifecycle_observer.cc", "context_lifecycle_observer.h", - "cookie/canonical_cookie.cc", - "cookie/canonical_cookie.h", - "cookie/canonical_cookie_mojom_traits.cc", - "cookie/canonical_cookie_mojom_traits.h", "cpu/mips/common_macros_msa.h", "crypto.cc", "crypto.h", @@ -1903,7 +1899,6 @@ "audio/vector_math_test.cc", "bindings/parkable_string_test.cc", "bindings/runtime_call_stats_test.cc", - "cookie/canonical_cookie_test.cc", "disk_data_allocator_test.cc", "disk_data_allocator_test_utils.h", "exported/file_path_conversion_test.cc",
diff --git a/third_party/blink/renderer/platform/cookie/DEPS b/third_party/blink/renderer/platform/cookie/DEPS deleted file mode 100644 index b943aa15..0000000 --- a/third_party/blink/renderer/platform/cookie/DEPS +++ /dev/null
@@ -1,19 +0,0 @@ -include_rules = [ - # Don't depend on platform/. - "-third_party/blink/renderer/platform", - - # Module. - "+third_party/blink/renderer/platform/cookie", - - # Dependencies. - "+third_party/blink/renderer/platform/platform_export.h", - "+third_party/blink/renderer/platform/weborigin", - "+third_party/blink/renderer/platform/wtf", -] - -specific_include_rules = { - "canonical_cookie.cc": [ - "+net/cookies/canonical_cookie.h", - "+net/cookies/cookie_constants.h", - ], -}
diff --git a/third_party/blink/renderer/platform/cookie/OWNERS b/third_party/blink/renderer/platform/cookie/OWNERS deleted file mode 100644 index d5fefd8..0000000 --- a/third_party/blink/renderer/platform/cookie/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -per-file *_mojom_traits*.*=set noparent -per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/renderer/platform/cookie/canonical_cookie.cc b/third_party/blink/renderer/platform/cookie/canonical_cookie.cc deleted file mode 100644 index ea02c4f..0000000 --- a/third_party/blink/renderer/platform/cookie/canonical_cookie.cc +++ /dev/null
@@ -1,164 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/platform/cookie/canonical_cookie.h" - -#include <memory> -#include <utility> - -#include "base/optional.h" -#include "net/cookies/canonical_cookie.h" -#include "net/cookies/cookie_constants.h" -#include "third_party/blink/public/platform/web_url.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" -#include "third_party/blink/renderer/platform/wtf/vector.h" -#include "url/gurl.h" - -// Assumptions made by static_casts used in this file. -STATIC_ASSERT_ENUM(net::CookieSameSite::UNSPECIFIED, - network::mojom::CookieSameSite::UNSPECIFIED); -STATIC_ASSERT_ENUM(net::CookieSameSite::NO_RESTRICTION, - network::mojom::CookieSameSite::NO_RESTRICTION); -STATIC_ASSERT_ENUM(net::CookieSameSite::LAX_MODE, - network::mojom::CookieSameSite::LAX_MODE); -STATIC_ASSERT_ENUM(net::CookieSameSite::STRICT_MODE, - network::mojom::CookieSameSite::STRICT_MODE); - -STATIC_ASSERT_ENUM(net::CookiePriority::COOKIE_PRIORITY_LOW, - network::mojom::CookiePriority::LOW); -STATIC_ASSERT_ENUM(net::CookiePriority::COOKIE_PRIORITY_MEDIUM, - network::mojom::CookiePriority::MEDIUM); -STATIC_ASSERT_ENUM(net::CookiePriority::COOKIE_PRIORITY_HIGH, - network::mojom::CookiePriority::HIGH); -STATIC_ASSERT_ENUM(net::CookiePriority::COOKIE_PRIORITY_DEFAULT, - blink::CanonicalCookie::kDefaultPriority); - -STATIC_ASSERT_ENUM(net::CookieSourceScheme::kUnset, - network::mojom::CookieSourceScheme::kUnset); -STATIC_ASSERT_ENUM(net::CookieSourceScheme::kNonSecure, - network::mojom::CookieSourceScheme::kNonSecure); -STATIC_ASSERT_ENUM(net::CookieSourceScheme::kSecure, - network::mojom::CookieSourceScheme::kSecure); - -namespace blink { - -namespace { - -net::CanonicalCookie ToNetCanonicalCookie(const CanonicalCookie& cookie) { - net::CanonicalCookie net_cookie( - cookie.Name().Utf8(), cookie.Value().Utf8(), cookie.Domain().Utf8(), - cookie.Path().Utf8(), cookie.CreationDate(), cookie.ExpiryDate(), - cookie.LastAccessDate(), cookie.IsSecure(), cookie.IsHttpOnly(), - static_cast<net::CookieSameSite>(cookie.SameSite()), - static_cast<net::CookiePriority>(cookie.Priority()), - static_cast<net::CookieSourceScheme>(cookie.SourceScheme())); - DCHECK(net_cookie.IsCanonical()); - return net_cookie; -} - -} // namespace - -CanonicalCookie::CanonicalCookie() = default; - -CanonicalCookie::CanonicalCookie( - WebString name, - WebString value, - WebString domain, - WebString path, - base::Time creation, - base::Time expiration, - base::Time last_access, - bool is_secure, - bool is_http_only, - network::mojom::CookieSameSite same_site, - network::mojom::CookiePriority priority, - network::mojom::CookieSourceScheme source_scheme) - : name_(std::move(name)), - value_(std::move(value)), - domain_(std::move(domain)), - path_(std::move(path)), - creation_(creation), - expiration_(expiration), - last_access_(last_access), - is_secure_(is_secure), - is_http_only_(is_http_only), - same_site_(same_site), - priority_(priority), - source_scheme_(source_scheme) { - DCHECK(ToNetCanonicalCookie(*this).IsCanonical()); -} - -CanonicalCookie::CanonicalCookie(const CanonicalCookie& other) = default; - -CanonicalCookie& CanonicalCookie::operator=(const CanonicalCookie& other) = - default; - -CanonicalCookie::~CanonicalCookie() = default; - -namespace { - -// TODO(crbug.com/851889): WebURL::operator GURL() is only available if -// !INSIDE_BLINK. Remove ToGURL() when this changes. -GURL ToGURL(const WebURL& url) { - return url.IsNull() - ? GURL() - : GURL(url.GetString().Utf8(), url.GetParsed(), url.IsValid()); -} - -} // namespace - -// static -base::Optional<CanonicalCookie> CanonicalCookie::Create( - const WebURL& url, - const WebString& cookie_line, - base::Time creation_time) { - std::unique_ptr<net::CanonicalCookie> cookie = net::CanonicalCookie::Create( - ToGURL(url), cookie_line.Utf8(), creation_time, - base::nullopt /* server_time */); - if (!cookie) - return base::nullopt; - return CanonicalCookie( - WebString::FromUTF8(cookie->Name()), WebString::FromUTF8(cookie->Value()), - WebString::FromUTF8(cookie->Domain()), - WebString::FromUTF8(cookie->Path()), cookie->CreationDate(), - cookie->ExpiryDate(), cookie->LastAccessDate(), cookie->IsSecure(), - cookie->IsHttpOnly(), - static_cast<network::mojom::CookieSameSite>(cookie->SameSite()), - static_cast<network::mojom::CookiePriority>(cookie->Priority()), - static_cast<network::mojom::CookieSourceScheme>(cookie->SourceScheme())); -} - -// static -base::Optional<CanonicalCookie> CanonicalCookie::Create( - WebString name, - WebString value, - WebString domain, - WebString path, - base::Time creation, - base::Time expiration, - base::Time last_access, - bool is_secure, - bool is_http_only, - network::mojom::CookieSameSite same_site, - network::mojom::CookiePriority priority, - network::mojom::CookieSourceScheme source_scheme) { - net::CanonicalCookie net_cookie( - name.Utf8(), value.Utf8(), domain.Utf8(), path.Utf8(), creation, - expiration, last_access, is_secure, is_http_only, - static_cast<net::CookieSameSite>(same_site), - static_cast<net::CookiePriority>(priority), - static_cast<net::CookieSourceScheme>(source_scheme)); - if (!net_cookie.IsCanonical()) - return base::nullopt; - - return CanonicalCookie(std::move(name), std::move(value), std::move(domain), - std::move(path), creation, expiration, last_access, - is_secure, is_http_only, same_site, priority, - source_scheme); -} - -constexpr const network::mojom::CookiePriority - CanonicalCookie::kDefaultPriority; - -} // namespace blink
diff --git a/third_party/blink/renderer/platform/cookie/canonical_cookie.h b/third_party/blink/renderer/platform/cookie/canonical_cookie.h deleted file mode 100644 index 965409c..0000000 --- a/third_party/blink/renderer/platform/cookie/canonical_cookie.h +++ /dev/null
@@ -1,102 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_COOKIE_CANONICAL_COOKIE_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_COOKIE_CANONICAL_COOKIE_H_ - -#include "base/optional.h" -#include "base/time/time.h" -#include "services/network/public/mojom/cookie_manager.mojom-shared.h" -#include "third_party/blink/public/platform/web_common.h" -#include "third_party/blink/public/platform/web_string.h" - -namespace blink { - -class WebURL; - -// This class is a blink analogue for net::CanonicalCookie. -class BLINK_PLATFORM_EXPORT CanonicalCookie { - public: - // Default/copy constructor needed for use with Vector. - CanonicalCookie(); - CanonicalCookie(const CanonicalCookie& other); - - ~CanonicalCookie(); - - CanonicalCookie& operator=(const CanonicalCookie& other); - - const WebString& Name() const { return name_; } - const WebString& Value() const { return value_; } - const WebString& Domain() const { return domain_; } - const WebString& Path() const { return path_; } - base::Time CreationDate() const { return creation_; } - base::Time ExpiryDate() const { return expiration_; } - base::Time LastAccessDate() const { return last_access_; } - bool IsSecure() const { return is_secure_; } - bool IsHttpOnly() const { return is_http_only_; } - network::mojom::CookieSameSite SameSite() const { return same_site_; } - network::mojom::CookiePriority Priority() const { return priority_; } - network::mojom::CookieSourceScheme SourceScheme() const { - return source_scheme_; - } - - // If the result is not canonical, nullopt will be returned. - static base::Optional<CanonicalCookie> Create( - WebString name, - WebString value, - WebString domain, - WebString path, - base::Time creation, - base::Time expiration, - base::Time last_access, - bool is_secure, - bool is_http_only, - network::mojom::CookieSameSite same_site, - network::mojom::CookiePriority priority, - network::mojom::CookieSourceScheme source_scheme); - - // Parsing, for the document.cookie API. - // If the result is not canonical, nullopt will be returned. - static base::Optional<CanonicalCookie> Create(const WebURL& url, - const WebString& cookie_line, - base::Time creation_time); - - static constexpr const network::mojom::CookiePriority kDefaultPriority = - network::mojom::CookiePriority::MEDIUM; - - private: - // Prefer static Create methods, which ensure that the returned cookie is - // canonical. - CanonicalCookie(WebString name, - WebString value, - WebString domain, - WebString path, - base::Time creation, - base::Time expiration, - base::Time last_access, - bool is_secure, - bool is_http_only, - network::mojom::CookieSameSite same_site, - network::mojom::CookiePriority priority, - network::mojom::CookieSourceScheme source_scheme); - - WebString name_; - WebString value_; - WebString domain_; - WebString path_; - base::Time creation_; - base::Time expiration_; - base::Time last_access_; - bool is_secure_ = false; - bool is_http_only_ = false; - network::mojom::CookieSameSite same_site_ = - network::mojom::CookieSameSite::NO_RESTRICTION; - network::mojom::CookiePriority priority_ = kDefaultPriority; - network::mojom::CookieSourceScheme source_scheme_ = - network::mojom::CookieSourceScheme::kUnset; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_COOKIE_CANONICAL_COOKIE_H_
diff --git a/third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.cc b/third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.cc deleted file mode 100644 index e3ebbbb..0000000 --- a/third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.cc +++ /dev/null
@@ -1,151 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.h" - -#include <utility> - -#include "base/optional.h" -#include "mojo/public/cpp/base/time_mojom_traits.h" -#include "mojo/public/cpp/bindings/string_traits_wtf.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace mojo { - -// static -WTF::String -StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::name(const blink::CanonicalCookie& c) { - return c.Name(); -} - -// static -WTF::String -StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::value(const blink::CanonicalCookie& c) { - return c.Value(); -} - -// static -WTF::String -StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::domain(const blink::CanonicalCookie& c) { - return c.Domain(); -} - -// static -WTF::String -StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::path(const blink::CanonicalCookie& c) { - return c.Path(); -} - -// static -base::Time StructTraits< - network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::creation(const blink::CanonicalCookie& c) { - return c.CreationDate(); -} - -// static -base::Time -StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::expiry(const blink::CanonicalCookie& c) { - return c.ExpiryDate(); -} - -// static -base::Time StructTraits< - network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::last_access(const blink::CanonicalCookie& c) { - return c.LastAccessDate(); -} - -// static -bool StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::secure(const blink::CanonicalCookie& - c) { - return c.IsSecure(); -} -// static -bool StructTraits< - network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::httponly(const blink::CanonicalCookie& c) { - return c.IsHttpOnly(); -} - -// static -network::mojom::CookieSameSite -StructTraits<network::mojom::CanonicalCookieDataView, blink::CanonicalCookie>:: - site_restrictions(const blink::CanonicalCookie& c) { - return c.SameSite(); -} - -// static -network::mojom::CookiePriority StructTraits< - network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::priority(const blink::CanonicalCookie& c) { - return c.Priority(); -} - -// static -network::mojom::CookieSourceScheme StructTraits< - network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>::source_scheme(const blink::CanonicalCookie& c) { - return c.SourceScheme(); -} - -// static -bool StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie>:: - Read(network::mojom::CanonicalCookieDataView cookie, - blink::CanonicalCookie* out) { - WTF::String name; - if (!cookie.ReadName(&name)) - return false; - - WTF::String value; - if (!cookie.ReadValue(&value)) - return false; - - WTF::String domain; - if (!cookie.ReadDomain(&domain)) - return false; - - WTF::String path; - if (!cookie.ReadPath(&path)) - return false; - - base::Time creation; - if (!cookie.ReadCreation(&creation)) - return false; - - base::Time expiry; - if (!cookie.ReadExpiry(&expiry)) - return false; - - base::Time last_access; - if (!cookie.ReadLastAccess(&last_access)) - return false; - - network::mojom::CookieSameSite site_restrictions; - if (!cookie.ReadSiteRestrictions(&site_restrictions)) - return false; - - network::mojom::CookiePriority priority; - if (!cookie.ReadPriority(&priority)) - return false; - - base::Optional<blink::CanonicalCookie> created = - blink::CanonicalCookie::Create(name, value, domain, path, creation, - expiry, last_access, cookie.secure(), - cookie.httponly(), site_restrictions, - priority, cookie.source_scheme()); - if (!created) - return false; - *out = std::move(created).value(); - return true; -} - -} // namespace mojo
diff --git a/third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.h b/third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.h deleted file mode 100644 index edb4053..0000000 --- a/third_party/blink/renderer/platform/cookie/canonical_cookie_mojom_traits.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_COOKIE_CANONICAL_COOKIE_MOJOM_TRAITS_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_COOKIE_CANONICAL_COOKIE_MOJOM_TRAITS_H_ - -#include "base/time/time.h" -#include "mojo/public/cpp/bindings/struct_traits.h" -#include "services/network/public/mojom/cookie_manager.mojom-shared.h" -#include "third_party/blink/renderer/platform/cookie/canonical_cookie.h" -#include "third_party/blink/renderer/platform/platform_export.h" -#include "third_party/blink/renderer/platform/wtf/forward.h" - -namespace mojo { - -template <> -struct PLATFORM_EXPORT StructTraits<network::mojom::CanonicalCookieDataView, - blink::CanonicalCookie> { - static WTF::String name(const blink::CanonicalCookie& c); - static WTF::String value(const blink::CanonicalCookie& c); - static WTF::String domain(const blink::CanonicalCookie& c); - static WTF::String path(const blink::CanonicalCookie& c); - static base::Time creation(const blink::CanonicalCookie& c); - static base::Time expiry(const blink::CanonicalCookie& c); - static base::Time last_access(const blink::CanonicalCookie& c); - static bool secure(const blink::CanonicalCookie& c); - static bool httponly(const blink::CanonicalCookie& c); - static network::mojom::CookieSameSite site_restrictions( - const blink::CanonicalCookie& c); - static network::mojom::CookiePriority priority( - const blink::CanonicalCookie& c); - static network::mojom::CookieSourceScheme source_scheme( - const blink::CanonicalCookie& c); - - static bool Read(network::mojom::CanonicalCookieDataView cookie, - blink::CanonicalCookie* out); -}; - -} // namespace mojo - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_COOKIE_CANONICAL_COOKIE_MOJOM_TRAITS_H_
diff --git a/third_party/blink/renderer/platform/cookie/canonical_cookie_test.cc b/third_party/blink/renderer/platform/cookie/canonical_cookie_test.cc deleted file mode 100644 index 2313551..0000000 --- a/third_party/blink/renderer/platform/cookie/canonical_cookie_test.cc +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/platform/cookie/canonical_cookie.h" - -#include <initializer_list> - -#include "base/optional.h" -#include "base/time/time.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/platform/web_url.h" -#include "third_party/blink/renderer/platform/weborigin/kurl.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace blink { - -TEST(CanonicalCookieTest, Defaults) { - CanonicalCookie cookie; - EXPECT_EQ(WebString(), cookie.Name()); - EXPECT_EQ(WebString(), cookie.Value()); - EXPECT_EQ(WebString(), cookie.Domain()); - EXPECT_EQ(WebString(), cookie.Path()); - EXPECT_EQ(base::Time(), cookie.CreationDate()); - EXPECT_EQ(base::Time(), cookie.ExpiryDate()); - EXPECT_EQ(base::Time(), cookie.LastAccessDate()); - EXPECT_FALSE(cookie.IsSecure()); - EXPECT_FALSE(cookie.IsHttpOnly()); - EXPECT_EQ(network::mojom::CookieSameSite::NO_RESTRICTION, cookie.SameSite()); - EXPECT_EQ(CanonicalCookie::kDefaultPriority, cookie.Priority()); -} - -TEST(CanonicalCookieTest, CreationFailure) { - const WebURL url(KURL("http://example.com")); - - // Invalid cookie lines cause nullopt to be returned. - EXPECT_FALSE( - CanonicalCookie::Create(url, "\x01", base::Time::Now()).has_value()); - - // Invalid names cause nullopt to be returned. - EXPECT_FALSE(CanonicalCookie::Create( - "\x01", "value", "domain", "/path", base::Time::Now(), - base::Time::Now(), base::Time::Now(), false, false, - network::mojom::CookieSameSite::NO_RESTRICTION, - CanonicalCookie::kDefaultPriority, - network::mojom::CookieSourceScheme::kNonSecure) - .has_value()); -} - -TEST(CanonicalCookieTest, Properties) { - const base::Time t1 = base::Time::FromDoubleT(1); - const base::Time t2 = base::Time::FromDoubleT(2); - const base::Time t3 = base::Time::FromDoubleT(3); - ASSERT_NE(t1, t2); - ASSERT_NE(t1, t3); - ASSERT_NE(t2, t3); - - base::Optional<CanonicalCookie> cookie_opt = CanonicalCookie::Create( - "name", "value", "domain", "/path", t1, t2, t3, true, true, - network::mojom::CookieSameSite::STRICT_MODE, - network::mojom::CookiePriority::HIGH, - network::mojom::CookieSourceScheme::kSecure); - ASSERT_TRUE(cookie_opt); - CanonicalCookie& cookie = cookie_opt.value(); - - EXPECT_EQ("name", cookie.Name()); - EXPECT_EQ("value", cookie.Value()); - EXPECT_EQ("domain", cookie.Domain()); - EXPECT_EQ("/path", cookie.Path()); - EXPECT_EQ(t1, cookie.CreationDate()); - EXPECT_EQ(t2, cookie.ExpiryDate()); - EXPECT_EQ(t3, cookie.LastAccessDate()); - EXPECT_TRUE(cookie.IsSecure()); - EXPECT_TRUE(cookie.IsHttpOnly()); - EXPECT_EQ(network::mojom::CookieSameSite::STRICT_MODE, cookie.SameSite()); - EXPECT_EQ(network::mojom::CookiePriority::HIGH, cookie.Priority()); - EXPECT_EQ(cookie.SourceScheme(), network::mojom::CookieSourceScheme::kSecure); - - // Exercise WebCookieSameSite values. - for (auto same_site : {network::mojom::CookieSameSite::NO_RESTRICTION, - network::mojom::CookieSameSite::LAX_MODE, - network::mojom::CookieSameSite::STRICT_MODE}) { - EXPECT_EQ(same_site, - CanonicalCookie::Create( - "name", "value", "domain", "/path", t1, t2, t3, false, false, - same_site, CanonicalCookie::kDefaultPriority, - network::mojom::CookieSourceScheme::kSecure) - ->SameSite()); - } - - // Exercise WebCookiePriority values. - for (auto priority : {network::mojom::CookiePriority::LOW, - network::mojom::CookiePriority::MEDIUM, - network::mojom::CookiePriority::HIGH, - CanonicalCookie::kDefaultPriority}) { - EXPECT_EQ(priority, - CanonicalCookie::Create( - "name", "value", "domain", "/path", t1, t2, t3, false, false, - network::mojom::CookieSameSite::NO_RESTRICTION, priority, - network::mojom::CookieSourceScheme::kSecure) - ->Priority()); - } -} - -} // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc index 20eded2f..b772d71f 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.h" #include "base/numerics/safe_conversions.h" +#include "cc/base/features.h" #include "cc/layers/layer.h" #include "cc/paint/display_item_list.h" #include "cc/paint/paint_op_buffer.h" @@ -849,6 +850,22 @@ } } +static void UpdateWheelEventRegion(const HitTestData& hit_test_data, + const PropertyTreeState& layer_state, + const PropertyTreeState& chunk_state, + const FloatPoint& layer_offset, + cc::Region& wheel_event_region) { + for (const auto& wheel_event_rect : hit_test_data.wheel_event_rects) { + auto rect = FloatClipRect(FloatRect(wheel_event_rect)); + if (!GeometryMapper::LocalToAncestorVisualRect(chunk_state, layer_state, + rect)) { + continue; + } + rect.MoveBy(-layer_offset); + wheel_event_region.Union(gfx::Rect(EnclosingIntRect(rect.Rect()))); + } +} + static void UpdateNonFastScrollableRegion( cc::Layer& layer, const HitTestData& hit_test_data, @@ -892,7 +909,7 @@ non_fast_scrollable_region.Union(EnclosingIntRect(rect.Rect())); } -static void UpdateTouchActionAndNonFastScrollableRegions( +static void UpdateTouchActionWheelEventHandlerAndNonFastScrollableRegions( cc::Layer& layer, const PropertyTreeState& layer_state, const PaintChunkSubset& chunks, @@ -900,6 +917,7 @@ gfx::Vector2dF cc_layer_offset = layer.offset_to_transform_parent(); FloatPoint layer_offset(cc_layer_offset.x(), cc_layer_offset.y()); cc::TouchActionRegion touch_action_region; + cc::Region wheel_event_region; cc::Region non_fast_scrollable_region; for (const auto& chunk : chunks) { if (!chunk.hit_test_data) @@ -907,11 +925,17 @@ auto chunk_state = chunk.properties.GetPropertyTreeState().Unalias(); UpdateTouchActionRegion(*chunk.hit_test_data, layer_state, chunk_state, layer_offset, touch_action_region); + if (base::FeatureList::IsEnabled(::features::kWheelEventRegions)) { + UpdateWheelEventRegion(*chunk.hit_test_data, layer_state, chunk_state, + layer_offset, wheel_event_region); + } UpdateNonFastScrollableRegion( layer, *chunk.hit_test_data, layer_state, chunk_state, layer_offset, property_tree_manager, non_fast_scrollable_region); } layer.SetTouchActionRegion(std::move(touch_action_region)); + if (base::FeatureList::IsEnabled(::features::kWheelEventRegions)) + layer.SetWheelEventRegion(std::move(wheel_event_region)); layer.SetNonFastScrollableRegion(std::move(non_fast_scrollable_region)); } @@ -921,8 +945,8 @@ const PaintChunkSubset& chunks, PropertyTreeManager* property_tree_manager) { UpdateBackgroundColor(layer, chunks); - UpdateTouchActionAndNonFastScrollableRegions(layer, layer_state, chunks, - property_tree_manager); + UpdateTouchActionWheelEventHandlerAndNonFastScrollableRegions( + layer, layer_state, chunks, property_tree_manager); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc b/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc index 346a46fa..bba15d90 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
@@ -83,7 +83,7 @@ GraphicsLayerPaintingPhase, const IntRect&) { if (layer == &root) { context.GetPaintController().RecordHitTestData( - *layer, IntRect(1, 2, 3, 4), TouchAction::kNone); + *layer, IntRect(1, 2, 3, 4), TouchAction::kNone, false); } else if (layer == &layer1) { ScopedPaintChunkProperties properties( context.GetPaintController(), layer1_state, *layer, kBackgroundType);
diff --git a/third_party/blink/renderer/platform/graphics/intercepting_canvas.h b/third_party/blink/renderer/platform/graphics/intercepting_canvas.h index 0a2324a6..8038f79e 100644 --- a/third_party/blink/renderer/platform/graphics/intercepting_canvas.h +++ b/third_party/blink/renderer/platform/graphics/intercepting_canvas.h
@@ -68,9 +68,7 @@ protected: explicit InterceptingCanvasBase(SkBitmap bitmap) - : SkCanvas(bitmap, SkSurfaceProps{}), - call_nesting_depth_(0), - call_count_(0) {} + : SkCanvas(bitmap), call_nesting_depth_(0), call_count_(0) {} InterceptingCanvasBase(int width, int height) : SkCanvas(width, height), call_nesting_depth_(0), call_count_(0) {}
diff --git a/third_party/blink/renderer/platform/graphics/paint/hit_test_data.cc b/third_party/blink/renderer/platform/graphics/paint/hit_test_data.cc index b5aee1a..648fbee 100644 --- a/third_party/blink/renderer/platform/graphics/paint/hit_test_data.cc +++ b/third_party/blink/renderer/platform/graphics/paint/hit_test_data.cc
@@ -8,8 +8,8 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { - -static String TouchActionRectsAsString(const Vector<TouchActionRect>& rects) { +template <typename T> +static String RectsAsString(const Vector<T>& rects) { StringBuilder sb; sb.Append("["); bool first = true; @@ -32,7 +32,13 @@ bool printed_top_level_field = false; if (!touch_action_rects.IsEmpty()) { sb.Append("touch_action_rects: "); - sb.Append(TouchActionRectsAsString(touch_action_rects)); + sb.Append(RectsAsString<TouchActionRect>(touch_action_rects)); + printed_top_level_field = true; + } + + if (!wheel_event_rects.IsEmpty()) { + sb.Append("wheel_event_rects: "); + sb.Append(RectsAsString<IntRect>(wheel_event_rects)); printed_top_level_field = true; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/hit_test_data.h b/third_party/blink/renderer/platform/graphics/paint/hit_test_data.h index cc785893..b1632dd 100644 --- a/third_party/blink/renderer/platform/graphics/paint/hit_test_data.h +++ b/third_party/blink/renderer/platform/graphics/paint/hit_test_data.h
@@ -13,6 +13,7 @@ struct PLATFORM_EXPORT HitTestData { Vector<TouchActionRect> touch_action_rects; + Vector<IntRect> wheel_event_rects; // If scroll_translation is nullptr or in pre-CompositeAfterPaint, this marks // a region in which composited scroll is not allowed. In CompositeAfterPaint @@ -24,6 +25,7 @@ bool operator==(const HitTestData& rhs) const { return touch_action_rects == rhs.touch_action_rects && + wheel_event_rects == rhs.wheel_event_rects && scroll_hit_test_rect == rhs.scroll_hit_test_rect && scroll_translation == rhs.scroll_translation; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_chunk.cc b/third_party/blink/renderer/platform/graphics/paint/paint_chunk.cc index 8a2734c..41d57e4 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_chunk.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_chunk.cc
@@ -45,6 +45,7 @@ total_size += sizeof(*hit_test_data); total_size += hit_test_data->touch_action_rects.capacity() * sizeof(TouchActionRect); + total_size += hit_test_data->wheel_event_rects.capacity() * sizeof(IntRect); } return total_size; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_chunker.cc b/third_party/blink/renderer/platform/graphics/paint/paint_chunker.cc index 2bf52ede..fadddfb 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_chunker.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_chunker.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/platform/graphics/paint/paint_chunker.h" +#include "cc/base/features.h" #include "third_party/blink/renderer/platform/graphics/paint/drawing_display_item.h" namespace blink { @@ -127,13 +128,15 @@ bool PaintChunker::AddHitTestDataToCurrentChunk(const PaintChunk::Id& id, const IntRect& rect, - TouchAction touch_action) { + TouchAction touch_action, + bool blocking_wheel) { // In CompositeAfterPaint, we ensure a paint chunk for correct composited // hit testing. In pre-CompositeAfterPaint, this is unnecessary, except that - // there is special touch action, and that we have a non-root effect so that - // PaintChunksToCcLayer will emit paint operations for filters. + // there is special touch action or blocking wheel event handler, and that we + // have a non-root effect so that PaintChunksToCcLayer will emit paint + // operations for filters. if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && - touch_action == TouchAction::kAuto && + touch_action == TouchAction::kAuto && !blocking_wheel && ¤t_properties_.Effect() == &EffectPaintPropertyNode::Root()) return false; @@ -144,6 +147,10 @@ chunk.EnsureHitTestData().touch_action_rects.push_back( TouchActionRect{rect, touch_action}); } + if (blocking_wheel) { + DCHECK(base::FeatureList::IsEnabled(::features::kWheelEventRegions)); + chunk.EnsureHitTestData().wheel_event_rects.push_back(rect); + } return created_new_chunk; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h b/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h index 948ed09..022198d 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_chunker.h
@@ -61,7 +61,8 @@ // Otherwise it's ignored. Returns true if a new chunk is added. bool AddHitTestDataToCurrentChunk(const PaintChunk::Id&, const IntRect&, - TouchAction); + TouchAction, + bool blocking_wheel); void CreateScrollHitTestChunk( const PaintChunk::Id&, const TransformPaintPropertyNode* scroll_translation,
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_chunker_test.cc b/third_party/blink/renderer/platform/graphics/paint/paint_chunker_test.cc index 6be1be6..ad5dbd0 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_chunker_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_chunker_test.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/platform/graphics/paint/paint_chunker.h" +#include "base/test/scoped_feature_list.h" +#include "cc/base/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/platform/graphics/paint/drawing_display_item.h" @@ -544,14 +546,14 @@ // This is not used as id of the chunk because we already have |id2|. PaintChunk::Id hit_test_id(client_, DisplayItem::kHitTest); chunker.AddHitTestDataToCurrentChunk(hit_test_id, IntRect(10, 20, 30, 40), - TouchAction::kAuto); + TouchAction::kAuto, false); chunker.AddHitTestDataToCurrentChunk(hit_test_id, IntRect(20, 30, 40, 50), - TouchAction::kPan); + TouchAction::kPan, false); chunker.SetWillForceNewChunk(true); PaintChunk::Id id3(client_, DisplayItemType(4)); chunker.AddHitTestDataToCurrentChunk(id3, IntRect(40, 50, 60, 70), - TouchAction::kAuto); + TouchAction::kAuto, false); chunker.IncrementDisplayItemIndex(TestChunkerDisplayItem( client_, DisplayItemType(5), IntRect(0, 0, 10, 10))); @@ -580,6 +582,65 @@ } } +TEST_F(PaintChunkerTest, AddHitTestDataToCurrentChunkWheelRegionsEnabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(::features::kWheelEventRegions); + Vector<PaintChunk> chunks; + PaintChunker chunker(chunks); + + PaintChunk::Id id1(client_, DisplayItemType(1)); + + chunker.UpdateCurrentPaintChunkProperties(&id1, + DefaultPaintChunkProperties()); + chunker.IncrementDisplayItemIndex(TestChunkerDisplayItem( + client_, DisplayItemType(2), IntRect(0, 0, 10, 10))); + + PaintChunk::Id id2(client_, DisplayItemType(3)); + auto transform = Create2DTranslation(t0(), 10, 20); + PropertyTreeState properties(*transform, c0(), e0()); + chunker.UpdateCurrentPaintChunkProperties(&id2, properties); + // This is not used as id of the chunk because we already have |id2|. + PaintChunk::Id hit_test_id(client_, DisplayItem::kHitTest); + chunker.AddHitTestDataToCurrentChunk(hit_test_id, IntRect(10, 20, 30, 40), + TouchAction::kAuto, false); + chunker.AddHitTestDataToCurrentChunk(hit_test_id, IntRect(20, 30, 40, 50), + TouchAction::kPan, false); + chunker.AddHitTestDataToCurrentChunk(hit_test_id, IntRect(25, 35, 5, 10), + TouchAction::kAuto, true); + + chunker.SetWillForceNewChunk(true); + PaintChunk::Id id3(client_, DisplayItemType(4)); + chunker.AddHitTestDataToCurrentChunk(id3, IntRect(40, 50, 60, 70), + TouchAction::kAuto, false); + chunker.IncrementDisplayItemIndex(TestChunkerDisplayItem( + client_, DisplayItemType(5), IntRect(0, 0, 10, 10))); + + HitTestData hit_test_data; + hit_test_data.touch_action_rects = { + {IntRect(20, 30, 40, 50), TouchAction::kPan}}; + hit_test_data.wheel_event_rects = {IntRect(25, 35, 5, 10)}; + if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { + EXPECT_THAT( + chunks, + ElementsAre(IsPaintChunk(0, 1, id1, DefaultPaintChunkProperties(), + nullptr, IntRect(0, 0, 10, 10)), + IsPaintChunk(1, 1, id2, properties, &hit_test_data, + IntRect(10, 20, 50, 60)), + IsPaintChunk(1, 2, id3, properties, nullptr, + IntRect(0, 0, 100, 120)))); + } else { + EXPECT_THAT( + chunks, + ElementsAre( + IsPaintChunk(0, 1, id1, DefaultPaintChunkProperties(), nullptr, + IntRect(0, 0, 10, 10)), + IsPaintChunk(1, 1, id2, properties, &hit_test_data, + IntRect(20, 30, 40, 50)), + IsPaintChunk(1, 2, PaintChunk::Id(client_, DisplayItemType(5)), + properties, nullptr, IntRect(0, 0, 10, 10)))); + } +} + TEST_F(PaintChunkerTest, ChunkBoundsAndKnownToBeOpaqueAllOpaqueItems) { ScopedCompositeAfterPaintForTest cap(true); Vector<PaintChunk> chunks; @@ -634,28 +695,29 @@ // Hit test rect only. chunker.AddHitTestDataToCurrentChunk( PaintChunk::Id(client1, DisplayItemType(0)), IntRect(10, 20, 30, 40), - TouchAction::kAuto); + TouchAction::kAuto, false); chunker.SetWillForceNewChunk(true); + // Hit test rect is smaller than the opaque item. chunker.IncrementDisplayItemIndex(TestChunkerOpaqueDisplayItem( client1, DisplayItemType(1), IntRect(0, 0, 100, 100))); chunker.AddHitTestDataToCurrentChunk( PaintChunk::Id(client1, DisplayItemType(2)), IntRect(0, 0, 50, 100), - TouchAction::kAuto); + TouchAction::kAuto, false); chunker.SetWillForceNewChunk(true); // Hit test rect is the same as the opaque item. chunker.IncrementDisplayItemIndex(TestChunkerOpaqueDisplayItem( client1, DisplayItemType(3), IntRect(0, 0, 100, 100))); chunker.AddHitTestDataToCurrentChunk( PaintChunk::Id(client1, DisplayItemType(4)), IntRect(0, 0, 100, 100), - TouchAction::kAuto); + TouchAction::kAuto, false); chunker.SetWillForceNewChunk(true); // Hit test rect is bigger than the opaque item. chunker.IncrementDisplayItemIndex(TestChunkerOpaqueDisplayItem( client1, DisplayItemType(5), IntRect(0, 0, 100, 100))); chunker.AddHitTestDataToCurrentChunk( PaintChunk::Id(client1, DisplayItemType(6)), IntRect(0, 100, 200, 100), - TouchAction::kAuto); + TouchAction::kAuto, false); EXPECT_THAT( chunks,
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc b/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc index 43f8625..f5164a5 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc +++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc
@@ -48,7 +48,8 @@ void PaintController::RecordHitTestData(const DisplayItemClient& client, const IntRect& rect, - TouchAction touch_action) { + TouchAction touch_action, + bool blocking_wheel) { if (rect.IsEmpty()) return; // In CompositeAfterPaint, we ensure a paint chunk for correct composited @@ -56,13 +57,14 @@ // there is special touch action, and that we have a non-root effect so that // PaintChunksToCcLayer will emit paint operations for filters. if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && - touch_action == TouchAction::kAuto && + touch_action == TouchAction::kAuto && !blocking_wheel && CurrentPaintChunkProperties().Effect().IsRoot()) return; PaintChunk::Id id(client, DisplayItem::kHitTest, current_fragment_); CheckDuplicatePaintChunkId(id); - if (paint_chunker_.AddHitTestDataToCurrentChunk(id, rect, touch_action)) + if (paint_chunker_.AddHitTestDataToCurrentChunk(id, rect, touch_action, + blocking_wheel)) DidAppendChunk(); }
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller.h b/third_party/blink/renderer/platform/graphics/paint/paint_controller.h index 7774485..1faddddf 100644 --- a/third_party/blink/renderer/platform/graphics/paint/paint_controller.h +++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller.h
@@ -103,7 +103,11 @@ void EnsureChunk(); - void RecordHitTestData(const DisplayItemClient&, const IntRect&, TouchAction); + void RecordHitTestData(const DisplayItemClient&, + const IntRect&, + TouchAction, + bool); + void RecordScrollHitTestData( const DisplayItemClient&, DisplayItem::Type,
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index c7634208..405d218 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -570,11 +570,11 @@ }, { name: "CSSPseudoIs", - status: "experimental", + status: "stable", }, { name: "CSSPseudoWhere", - status: "experimental", + status: "stable", }, { // Perform partial layout invalidation on web font loading. @@ -1536,6 +1536,10 @@ settable_from_internals: true, }, { + name: "PrefersContrast", + depends_on: ["ForcedColors"], + }, + { name: 'PrefersReducedData', status: 'experimental', },
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 0106b22..8e76ea1 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -429,6 +429,12 @@ # HTTP structured headers 'net::structured_headers::.+', + # CanonicalCookie and related headers + 'net::CanonicalCookie', + 'net::CookiePriority', + 'net::CookieSameSite', + 'net::CookieSourceScheme', + # HTTP status codes 'net::HTTP_.+',
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index e5361ac..53b858a6 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -148,6 +148,8 @@ # This test requires a compositor, so only the virtual/threaded/ version is run. external/wpt/feature-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Skip ] [ Linux ] virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Pass ] +external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Skip ] +[ Linux ] virtual/threaded/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Pass ] # This test requires a compositor to pass as root scrollbar scrolling is always # done on the compositor thread.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index f769404..010948b 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -5667,6 +5667,7 @@ # Skipping because of unimplemented behaviour crbug.com/965495 external/wpt/feature-policy/experimental-features/focus-without-user-activation-enabled-tentative.sub.html [ Skip ] +crbug.com/965495 external/wpt/permissions-policy/experimental-features/focus-without-user-activation-enabled-tentative.sub.html [ Skip ] # Temporary suppression to allow devtools-frontend changes crbug.com/1029489 http/tests/devtools/elements/elements-linkify-attributes.js [ Pass Failure Timeout ] @@ -6194,6 +6195,7 @@ crbug.com/924472 external/wpt/css/css-transforms/transform-box/svgbox-stroke-box.html [ Failure ] crbug.com/1092135 [ Linux ] virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Pass Timeout ] +crbug.com/1092135 [ Linux ] virtual/threaded/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Pass Timeout ] # Sheriff 2020-06-16 crbug.com/1044825 http/tests/devtools/network/resource-priority.js [ Pass Timeout ] @@ -6348,6 +6350,7 @@ # Sheriff 2020-0-21 crbug.com/1120330 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-disabled-scrollbar-tentative.html [ Pass Failure ] +crbug.com/1120330 virtual/threaded/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-scrollbar-tentative.html [ Pass Failure ] # Sheriff 2020-08-26 crbug.com/1122742 http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations.js [ Pass Timeout ] @@ -6416,10 +6419,6 @@ crbug.com/1042877 external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/unset/img-tag.https.html [ Failure ] crbug.com/1042877 external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/unset/img-tag.https.html [ Failure ] crbug.com/1042877 external/wpt/upgrade-insecure-requests/gen/top.meta/unset/img-tag.https.html [ Failure ] -crbug.com/1042877 virtual/omt-worker-fetch/external/wpt/fetch/cross-origin-resource-policy/scheme-restriction.https.window.html [ Failure ] -crbug.com/1042877 virtual/omt-worker-fetch/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/unset/img-tag.https.html [ Failure ] -crbug.com/1042877 virtual/omt-worker-fetch/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/unset/img-tag.https.html [ Failure ] -crbug.com/1042877 virtual/omt-worker-fetch/external/wpt/upgrade-insecure-requests/gen/top.meta/unset/img-tag.https.html [ Failure ] crbug.com/1042877 http/tests/security/mixedContent/insecure-css-image-with-reload.html [ Failure ] crbug.com/1042877 http/tests/security/mixedContent/insecure-image-in-iframe.html [ Failure ] crbug.com/1042877 http/tests/security/mixedContent/insecure-image-in-main-frame-allowed.html [ Failure ] @@ -6448,11 +6447,7 @@ crbug.com/1136687 external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html [ Pass Failure ] crbug.com/1136726 [ Linux ] virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Failure ] -# Sheriff 2020-10-13 -crbug.com/1137716 [ Mac10.12 ] fast/events/mouse-cursor-image-set.html [ Pass Failure ] - # Sheriff 2020-10-14 -crbug.com/1138589 [ Mac10.15 ] fast/events/mouse-cursor-image-set-svg.html [ Failure ] crbug.com/1138591 [ Mac10.15 ] http/tests/dom/raf-throttling-out-of-view-cross-origin-page.html [ Failure ] # WebRTC: Payload demuxing times out in Plan B. This is expected. @@ -6468,3 +6463,11 @@ # Sheriff 2020-10-19 crbug.com/1139950 [ Linux ] virtual/text-antialias/hyphens/hyphens-auto.html [ Failure ] + +# Rename document.featurePolicy to document.permissionsPolicy +crbug.com/1123116 external/wpt/permissions-policy/payment-supported-by-permissions-policy.tentative.html [ Failure ] +crbug.com/1123116 external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html [ Failure ] +crbug.com/1123116 external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html [ Failure ] +crbug.com/1123116 external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html [ Failure ] +crbug.com/1123116 external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html [ Failure ] +crbug.com/1123116 external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index cdaf116..fa82973 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -45,6 +45,7 @@ "external/wpt/css/css-scroll-snap", "external/wpt/css/css-transforms/animation", "external/wpt/feature-policy/experimental-features", + "external/wpt/permissions-policy/experimental-features", "external/wpt/html/canvas/offscreen/manual/convert-to-blob", "external/wpt/scroll-animations", "external/wpt/requestidlecallback",
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index b44faa4..4edf456 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -301,6 +301,7 @@ SET TIMEOUT: css/css-fonts/font-display/font-display-preload.html SET TIMEOUT: document-policy/font-display/override-to-optional.tentative.html SET TIMEOUT: feature-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html +SET TIMEOUT: permissions-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html SET TIMEOUT: html/browsers/windows/auxiliary-browsing-contexts/resources/close-opener.html SET TIMEOUT: html/cross-origin-embedder-policy/resources/navigate-none.sub.html SET TIMEOUT: html/cross-origin-embedder-policy/resources/navigate-require-corp.sub.html
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/META.yml b/third_party/blink/web_tests/external/wpt/permissions-policy/META.yml new file mode 100644 index 0000000..7b2e2cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/META.yml
@@ -0,0 +1,3 @@ +spec: https://w3c.github.io/webappsec-permissions-policy/ + - bakulf + - clelland
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/OWNERS b/third_party/blink/web_tests/external/wpt/permissions-policy/OWNERS new file mode 100644 index 0000000..6385d12 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: feature-control@chromium.org +# COMPONENT: Blink>FeaturePolicy +# WPT-NOTIFY: true +iclelland@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/README.md b/third_party/blink/web_tests/external/wpt/permissions-policy/README.md new file mode 100644 index 0000000..ae17c099 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/README.md
@@ -0,0 +1,59 @@ +# Permissions Policy Guide +## How to Test a New Feature with permissions policy + +This directory contains a framework to test features with permissions policy. + +When adding a new feature to permissions policy, the following cases should be tested: +* feature enabled by header policy [HTTP tests] + + test when feature is enabled by permissions policy HTTP header; +* feature disabled by header policy [HTTP tests] + + test when feature is disabled by permissions policy HTTP header; +* feature enabled on self origin by header policy [HTTP tests] + + test when feature is enabled only on self origin by permissions policy HTTP + header. +* feature allowed by container policy (iframe "allow" attribute); + + test when feature is enabled by iframe "allow" attribute on self and cross + origins. +* feature allowed by container policy, redirect on load. + + test when feature is enabled by iframe "allow" attribute when the iframe + is being redirected to a new origin upon loading + +### How to Use the Test Framework +Use `test_feature_availability()` defined in +`/permissions-policy/resources/permissions-policy.js`. Please refer to the comments +in `/permissions-policy/resources/permissions-policy.js` for how this function works. + +### How to Write Header Policy Tests +HTTP tests are used to test features with header policy. + +* Define the header policy in `<feature-name>-<enabled | disabled | enabled-on-self-origin>-by-permissions-policy.https.sub.html.headers`. Example: + + Permissions-Policy: feature-name=* + + +* In `<feature-name>-<enabled | disabled | enabled-on-self-origin>-by-permissions-policy.https.sub.html`: +* test if feature is enabled / disabled in the main frame; +* test if feature is enabled / disabled in a same-origin iframe; +* test if feature is enabled / disabled in a cross-origin iframe. + +Examples: +`/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html` +`/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html.headers` + +### How to Write Container Policy Tests +Simply use `test_feature_availability()` with the optional argument +`feature_name` specified to test if: +* feature is enabled / disabled in a same-origin iframe; +* feature is enabled / disabled in a cross-origin iframe. + +Example: +`/permissions-policy/payment-allowed-by-permissions-policy-attribute.https.sub.html` + +### How to Write Container Policy Tests with Redirect +Similar to the section above, append +`/permissions-policy/resources/redirect-on-load.html#` to the argument `src` +passed to `test_feature_availability()`. + +Example: +`/permissions-policy/payment-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html` +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/focus-without-user-activation-disabled-tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/focus-without-user-activation-disabled-tentative.html new file mode 100644 index 0000000..3980fd12 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/focus-without-user-activation-disabled-tentative.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/common.js"></script> +<title> 'focus-without-user-activation' Policy : Correctly block automatic focus when policy disabled +</title> +<body> +<script> + "use strict" + // Note: According to html spec: https://html.spec.whatwg.org/#attr-fe-autofocus, + // topDocument's autofocus processed flag initially is false and is set to true + // after flushing autofocus candidates, i.e. flush of autofocus candidates + // only happens once per page load. + // In order to test the behaviour with both focus-without-user-activation on and off: + // two test files are necessary: + // - focus-without-user-activation-disabled-tentative.html + // - focus-without-user-activation-enabled-tentative.sub.html + + // Use same origin url here because when iframe document has cross origin + // url, autofocus will be blocked by default with following console error: + // "Blocked autofocusing on a form control in a cross-origin subframe." + const url = "/permissions-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html"; + + function subframe_focused(subframe, event_name, timeout) { + return new Promise(resolve => { + window.onmessage = m => resolve(m.data.focused); + subframe.contentWindow.postMessage({ + event: event_name, + timeout: timeout + }, "*"); + }); + } + + promise_test( async (instance) => { + const frame = createIframe(document.body, { + sandbox: "allow-scripts allow-same-origin", + allow: "focus-without-user-activation 'none'", + src: url + }); + + await wait_for_load(frame); + assert_false(await subframe_focused(frame, "autofocus", 400), "'autofocus' should not work."); + window.focus(); // Reset focus state in subframe. + assert_false(await subframe_focused(frame, "focus-input", 400), "'element.focus' should not work."); + window.focus(); // Reset focus state in subframe. + assert_false(await subframe_focused(frame, "focus-window", 400), "'window.focus' should not work."); + window.focus(); // Reset focus state in subframe. + }, "When the policy is disabled, 'autofocus' and scripted focus do not focus " + + "the document."); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/focus-without-user-activation-enabled-tentative.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/focus-without-user-activation-enabled-tentative.sub.html new file mode 100644 index 0000000..5722947 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/focus-without-user-activation-enabled-tentative.sub.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/common.js"></script> +<title> 'focus-without-user-activation' Policy : Correctly block automatic focus when policy disabled +</title> +<body> +<script> + "use strict" + // Note: According to html spec: https://html.spec.whatwg.org/#attr-fe-autofocus, + // topDocument's autofocus processed flag initially is false and is set to true + // after flushing autofocus candidates, i.e. flush of autofocus candidates + // only happens once per page load. + // In order to test the behaviour with both focus-without-user-activation on and off: + // two test files are necessary: + // - focus-without-user-activation-disabled-tentative.html + // - focus-without-user-activation-enabled-tentative.sub.html + + // Cross origin subframe should not be able to use autofocus to steal focus + // from main frame by default. However, with focus-without-user-activation + // enabled for subframe, subframe should be able to autofocus. + const url = "http://{{hosts[alt][www1]}}:{{ports[http][0]}}/permissions-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html"; + + function subframe_focused(subframe, event_name, timeout) { + return new Promise(resolve => { + window.onmessage = m => resolve(m.data.focused); + subframe.contentWindow.postMessage({ + event: event_name, + timeout: timeout + }, "*"); + }); + } + + promise_test( async (instance) => { + const frame = createIframe(document.body, { + sandbox: "allow-scripts allow-same-origin", + allow: "focus-without-user-activation *", + src: url + }); + + await wait_for_load(frame); + assert_true(await subframe_focused(frame, "autofocus"), "'autofocus' should work."); + window.focus(); // Reset focus state in subframe. + assert_true(await subframe_focused(frame, "focus-input"), "'element.focus' should work."); + window.focus(); // Reset focus state in subframe. + assert_true(await subframe_focused(frame, "focus-window"), "'window.focus' should work."); + window.focus(); // Reset focus state in subframe. + }, "When the policy is enabled, 'autofocus' and scripted focus do focus " + + "the document."); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/common.js b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/common.js new file mode 100644 index 0000000..de25ce7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/common.js
@@ -0,0 +1,94 @@ +const url_base = "/permissions-policy/experimental-features/resources/"; +window.messageResponseCallback = null; + +function setFeatureState(iframe, feature, origins) { + iframe.setAttribute("allow", `${feature} ${origins};`); +} + +// Returns a promise which is resolved when the <iframe> is navigated to |url| +// and "load" handler has been called. +function loadUrlInIframe(iframe, url) { + return new Promise((resolve) => { + iframe.addEventListener("load", resolve); + iframe.src = url; + }); +} + +// Posts |message| to |target| and resolves the promise with the response coming +// back from |target|. +function sendMessageAndGetResponse(target, message) { + return new Promise((resolve) => { + window.messageResponseCallback = resolve; + target.postMessage(message, "*"); + }); +} + + +function onMessage(e) { + if (window.messageResponseCallback) { + window.messageResponseCallback(e.data); + window.messageResponseCallback = null; + } +} + +window.addEventListener("message", onMessage); + +// Waits for |load_timeout| before resolving the promise. It will resolve the +// promise sooner if a message event with |e.data.id| of |id| is received. +// In such a case the response is the contents of the message |e.data.contents|. +// Otherwise, returns false (when timeout occurs). +function waitForMessageOrTimeout(t, id, load_timeout) { + return new Promise((resolve) => { + window.addEventListener( + "message", + (e) => { + if (!e.data || e.data.id !== id) + return; + resolve(e.data.contents); + } + ); + t.step_timeout(() => { resolve(false); }, load_timeout); + }); +} + +function createIframe(container, attributes) { + var new_iframe = document.createElement("iframe"); + for (attr_name in attributes) + new_iframe.setAttribute(attr_name, attributes[attr_name]); + container.appendChild(new_iframe); + return new_iframe; +} + +// Returns a promise which is resolved when |load| event is dispatched for |e|. +function wait_for_load(e) { + return new Promise((resolve) => { + e.addEventListener("load", resolve); + }); +} + +setup(() => { + window.reporting_observer_instance = new ReportingObserver((reports, observer) => { + if (window.reporting_observer_callback) { + reports.forEach(window.reporting_observer_callback); + } + }, {types: ["feature-policy-violation"]}); + window.reporting_observer_instance.observe(); + window.reporting_observer_callback = null; +}); + +// Waits for a violation in |feature| and source file containing |file_name|. +function wait_for_violation_in_file(feature, file_name) { + return new Promise( (resolve) => { + assert_equals(null, window.reporting_observer_callback); + window.reporting_observer_callback = (report) => { + var feature_match = (feature === report.body.featureId); + var file_name_match = + !file_name || + (report.body.sourceFile.indexOf(file_name) !== -1); + if (feature_match && file_name_match) { + window.reporting_observer_callback = null; + resolve(report); + } + }; + }); +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html new file mode 100644 index 0000000..3d5aab95 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/focus-without-user-activation-iframe-tentative.html
@@ -0,0 +1,47 @@ +<!doctype html> +<input autofocus onfocus="autofocus_onfocus()"/> +<script> + let autofocused = false; + function autofocus_onfocus() { + autofocused = true; + } + + /** + * @param target object: Target to call |focus()| with. + * @param timeout integer | undefined: Timeout to wait for the focus event. + * If unspecified, a timeout will not be set. + * @param focus_target boolean | undefined: Wether to focus the target after + * listening for |onfocus| event. + */ + function wait_focus_event(target, timeout, focus_target) { + return new Promise((resolve) => { + if (timeout) + setTimeout(() => resolve(false), timeout); + + target.onfocus = () => resolve(true); + if (focus_target) + target.focus(); + }); + } + + function post_result(destination, result) { + destination.postMessage({focused: result}, "*"); + } + + window.addEventListener("message", (e) => { + if (e.data.event === "autofocus") { + if (autofocused) + post_result(e.source, true); + + wait_focus_event(document.querySelector("input"), e.data.timeout) + .then(result => post_result(e.source, result)); + } else if (e.data.event === "focus-window") { + wait_focus_event(window, e.data.timeout, true /* focus_target */) + .then(result => post_result(e.source, result)); + } else if (e.data.event === "focus-input") { + const input_element = document.querySelector("input"); + wait_focus_event(input_element, e.data.timeout, true /* focus_target */) + .then(result => post_result(e.source, result)); + } +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/lazyload-contents.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/lazyload-contents.html new file mode 100644 index 0000000..a6e98c2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/lazyload-contents.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<body> + <p>This page is lazyloaded.</p> + <script> + let query_index = window.location.href.indexOf("?id="); + let id = window.location.href.substr(query_index + 4); + window.addEventListener("load", () => { + let p = document.querySelector("p"); + let contents = p ? p.innerHTML : "null"; + window.parent.postMessage({"id": id, "contents": contents}, "*"); + }); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/lazyload.png b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/lazyload.png new file mode 100644 index 0000000..fd3da53 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/lazyload.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/permissions-policy-trust-token-redemption.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/permissions-policy-trust-token-redemption.html new file mode 100644 index 0000000..329f0faa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/permissions-policy-trust-token-redemption.html
@@ -0,0 +1,55 @@ +<script> + 'use strict'; + + window.onload = function() { + // When the trust-token-redemption permissions policy is enabled, redemption + // and signing ("send-srr") should both be available; when it's disabled, + // they should both be unavailable. Send the number of available operations + // upstream in order to enforce this in assertions. + let num_enabled = 4; + try { + new Request("https://issuer.example/", { + trustToken: { + type: "srr-token-redemption" + } + }); + } catch (e) { + num_enabled--; + } + try { + new Request("https://destination.example/", { + trustToken: { + type: "send-srr", + issuers: ["https://issuer.example/"] + } + }); + } catch (e) { + num_enabled--; + } + + try { + const xhr = new XMLHttpRequest(); + xhr.open("GET", "https://issuer.example/"); + xhr.setTrustToken({ + type: "srr-token-redemption" + }); + } catch (e) { + num_enabled--; + } + + try { + const xhr = new XMLHttpRequest(); + xhr.open("GET", "https://destination.example/"); + xhr.setTrustToken({ + type: "send-srr", + issuers: ["https://issuer.example/"] + }); + } catch (e) { + num_enabled--; + } + + parent.postMessage({ + num_operations_enabled: num_enabled + }, '*'); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollable-content.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollable-content.html new file mode 100644 index 0000000..9f78ea4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollable-content.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<style> + body, html { + height: 100%; + width: 100%; + } + #spacer { + width: 1500px; + height: 1500px; + background-color: red; + } +</style> +<body> + <p>This page is scrollable.</p> + <div id="spacer"></div> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollbar-ref.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollbar-ref.html new file mode 100644 index 0000000..fd432b3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollbar-ref.html
@@ -0,0 +1,13 @@ +<!doctype html> +<title>Ref: vertical-scroll test for scrollbar</title> +<iframe src="/permissions-policy/experimental-features/resources/vertical-scroll-scrollable-content.html"></iframe> +<script> + let iframe = document.querySelector("iframe"); + let overflow_y = "visible"; + if (window.location.search.indexOf("no-vertical-scrollbar") !== -1) + overflow_y = "hidden" + iframe.addEventListener("load", () => { + iframe.contentDocument.body.style.overflowY = overflow_y; + }); +</script> +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollintoview.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollintoview.html new file mode 100644 index 0000000..7bed27c2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-scrollintoview.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<style> +html, body, #container { + width: 100%; + height: 100%; +} + +#spacer { + width: 200%; + height: 200%; +} +</style> +<div id="container"> + <div id="spacer"></div> + <button>Element To Scroll</button> +</div> +<script> + window.addEventListener('message', onMessageReceived); + + function scrollingElementBounds() { + var rect = document.querySelector("button").getBoundingClientRect(); + return { + x: rect.x, y: rect.y, width: rect.width, height: rect.height + }; + } + + function onMessageReceived(e) { + if (!e.data || !e.data.type) + return; + switch(e.data.type) { + case "scroll": + document.querySelector("button").scrollIntoView({behavior: "instant"}); + ackMessage({bounds: scrollingElementBounds()}, e.source); + break; + + case "scrolling-element-bounds": + ackMessage({bounds: scrollingElementBounds()}, e.source); + break; + } + } + + function ackMessage(msg, source) { + source.postMessage(msg, "*"); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-touch-action.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-touch-action.html new file mode 100644 index 0000000..51b715f3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-touch-action.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<style> + body, html { + height: 100%; + width: 100%; + overflow: hidden; + } + body { + touch-action: none; + } +</style> +<body> + <p>This page blocks all 'touch-action'.</p> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-touch-block.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-touch-block.html new file mode 100644 index 0000000..4c204055 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-touch-block.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<style> +body, div, html { + height: 100%; + width: 100%; + overflow: hidden; +} +p { + margin-bottom: 1000px; + margin-right: 1000px; +} +</style> +<body> + <div id="blocker"> + <p>This page blocks 'touchstart' and 'touchmove'.</p> + </div> + <script> + function doSomethingUnimportant(e) { + return false !== e; + } + + function preventDefault(e) { + e.preventDefault(); + } + + document.addEventListener("touchstart", doSomethingUnimportant, {passive: false}); + document.addEventListener("touchmove", doSomethingUnimportant, {passive: false}); + + function messageHandler(e) { + let msg = e.data; + let element = document.querySelector(msg.query); + if (msg.prevent) { + element.addEventListener(msg.event_type, preventDefault, {passive: false}); + } else { + element.addEventListener(msg.event_type, doSomethingUnimportant); + } + e.source.postMessage(msg, "*"); + } + + window.addEventListener("message", messageHandler); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-wheel-block.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-wheel-block.html new file mode 100644 index 0000000..21fc2b9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll-wheel-block.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<style> + body, html { + height: 100%; + width: 100%; + overflow: hidden; + } +</style> +<body> + <p>This page blocks all 'mouse-wheel'.</p> +<script> + function defaultScroll() { + window.scrollTo(0, 0); + } + + document.body.addEventListener( + "wheel", + (e) => { e.preventDefault(); defaultScroll(); }, {passive: false}); + + defaultScroll(); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll.js b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll.js new file mode 100644 index 0000000..88835cc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/resources/vertical-scroll.js
@@ -0,0 +1,25 @@ +function rectMaxY(rect) { + return rect.height + rect.y; +} + +function rectMaxX(rect) { + return rect.width + rect.x; +} + +function isEmptyRect(rect) { + return !rect.width || !rect.height; +} + +// Returns true if the given rectangles intersect. +function rects_intersect(rect1, rect2) { + if (isEmptyRect(rect1) || isEmptyRect(rect2)) + return false; + return rect1.x < rectMaxX(rect2) && + rect2.x < rectMaxX(rect1) && + rect1.y < rectMaxY(rect2) && + rect2.y < rectMaxY(rect1); +} + +function rectToString(rect) { + return `Location: (${rect.x}, ${rect.y}) Size: (${rect.width}, ${rect.height})`; +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/trust-token-redemption-default-permissions-policy.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/trust-token-redemption-default-permissions-policy.tentative.https.sub.html new file mode 100644 index 0000000..8adc0c39 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/trust-token-redemption-default-permissions-policy.tentative.https.sub.html
@@ -0,0 +1,62 @@ +<!DOCTYPE html> +<title>Test that trust token redemption is enabled/disabled according to the permissions policy</title> + +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + 'use strict'; + const same_origin_src = '/permissions-policy/experimental-features/resources/permissions-policy-trust-token-redemption.html'; + const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + const header = 'Default "trust-token-redemption" permissions policy ["self"]'; + + test(() => { + try { + // The permissions policy gates redemption and signing via both the Fetch + // and XHR interfaces. + new Request("https://issuer.example/", { + trustToken: { + type: "srr-token-redemption" + } + }); + new Request("https://destination.example/", { + trustToken: { + type: "send-srr", // signing + issuers: ["https://issuer.example/"] + } + }); + + const redemption_xhr = new XMLHttpRequest(); + redemption_xhr.open("GET", "https://issuer.example/"); + redemption_xhr.setTrustToken({ + type: "srr-token-redemption" + }); + + const signing_xhr = new XMLHttpRequest(); + signing_xhr.open("GET", "https://destination.example/"); + signing_xhr.setTrustToken({ + type: "send-srr", // signing + issuers: ["https://issuer.example/"] + }); + } catch (e) { + assert_unreached(); + } + }, header + ' allows the top-level document.'); + + async_test(t => { + test_feature_availability('Trust token redemption', t, same_origin_src, + (data, desc) => { + assert_equals(data.num_operations_enabled, 4, desc); + }); + }, header + ' allows same-origin iframes.'); + + async_test(t => { + test_feature_availability('Trust token redemption', t, cross_origin_src, + (data, desc) => { + assert_equals(data.num_operations_enabled, 0, desc); + }); + }, header + ' disallows cross-origin iframes.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/trust-token-redemption-supported-by-permissions-policy.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/trust-token-redemption-supported-by-permissions-policy.tentative.html new file mode 100644 index 0000000..e349eadc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/trust-token-redemption-supported-by-permissions-policy.tentative.html
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<title>Test that trust token redemption is advertised in the feature list</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(() => { + assert_in_array('trust-token-redemption', document.featurePolicy.features()); + }, 'document.featurePolicy.features should advertise trust token redemption.'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html new file mode 100644 index 0000000..67cae05 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html
@@ -0,0 +1,113 @@ +<!doctype html> +<meta name="timeout" content="long"> +<title>vertical-scroll test for touch-action</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/permissions-policy/experimental-features/resources/common.js"></script> +<script src="/permissions-policy/experimental-features/resources/vertical-scroll.js"></script> +<style> +html, body { + height: 100%; + width: 100%; +} + +iframe { + width: 90%; + height: 90%; + margin: 0; + padding: 0; +} + +.spacer { + width: 100%; + height: 100%; + margin: 100%; +} +</style> +<iframe></iframe> +<br/> +<p>Spacers below to make page scrollable</p> +<br/> +<div class="spacer"></div> +<div class="spacer"></div> +<p> EOF </p> + +<script> + "use strict"; + + let url = url_base + "vertical-scroll-scrollable-content.html"; + let iframeElement = document.querySelector("iframe"); + + // Wait for the helper scripts to load. + promise_test(async() => { + if (window.input_api_ready) + return Promise.resolve(); + await new Promise( (r) => { + window.resolve_on_input_api_ready = r; + }); + }, "Make sure input injection API is ready."); + + // Sanity-check: Verify we can scroll using the test-API (empty <iframe>). + promise_test(async() => { + window.scrollTo(0, 0); + + await inject_input("down"); + assert_greater_than(window.scrollY, 0, "Page must have scrolled down."); + + await inject_input("right"); + assert_greater_than(window.scrollX, 0, "Page must have scrolled right."); + }, "Verify that the page normally scrolls."); + + // Sanity-check: <iframe> normally scrolls. + promise_test(async() => { + // Make sure <window> can scroll both towards right and bottom. + window.scrollTo(0, 0); + + await loadUrlInIframe(iframeElement, url); + iframeElement.contentWindow.scrollTo(0, 0); + + await inject_input("down"); + assert_greater_than( + iframeElement.contentWindow.scrollY, + 0, + "<iframe> must have scrolled down."); + + + // Apply the scroll gesture. + await inject_input("right"); + assert_greater_than( + iframeElement.contentWindow.scrollX, + 0, + "<iframe> must have scrolled right."); + + }, "Verify that the <iframe> normally scrolls."); + + // Disable 'vertical-scroll': <iframe> should only scroll horizontally. + promise_test(async() => { + window.scrollTo(0, 0); + + // Disallow vertical scroll and reload the <iframe>. + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + iframeElement.contentWindow.scrollTo(0, 0); + + // Apply the scroll gesture. Main frame should and <iframe> should not + // scroll vertically. + await inject_input("down"); + assert_equals(iframeElement.contentWindow.scrollY, + 0, + "<iframe> must not scroll vertically."); + assert_greater_than(window.scrollY, + 0, + "Page must scroll vertically."); + + window.scrollTo(0, 0); + iframeElement.contentWindow.scrollTo(0, 0); + + await inject_input("right"); + assert_greater_than(iframeElement.contentWindow.scrollX, + 0, + "<iframe> must have scrolled right."); + }, "When 'vertical-scroll' is disabled in a document, scrollable contents " + + "can only *horizontally* scroll."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-scrollbar-tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-scrollbar-tentative.html new file mode 100644 index 0000000..6522254 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-disabled-scrollbar-tentative.html
@@ -0,0 +1,4 @@ +<!doctype html> +<title>vertical-scroll test for vertical scrollbar</title> +<link rel="match" href="/permissions-policy/experimental-features/resources/vertical-scroll-scrollbar-ref.html?no-vertical-scrollbar"> +<iframe src="/permissions-policy/experimental-features/resources/vertical-scroll-scrollable-content.html" allow="vertical-scroll 'none'"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative.html new file mode 100644 index 0000000..cda6c49a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title>Ensure 'vertical-scroll' does not affect main frame</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/permissions-policy/experimental-features/resources/common.js"></script> +<script src="/permissions-policy/experimental-features/resources/vertical-scroll.js"></script> +<style> +html, body { + height: 100%; + width: 100%; +} +.spacer { + width: 100%; + height: 100%; + margin-top: 100%; + margin-bottom: 100%; +} +</style> +<p> Making sure there is room for vertical scroll </p> +<div class="spacer"></div> +<div class="spacer"></div> +</p>EOP</p> +<script> + "use strict"; + + // Sanity check. + test(() => { + assert_false(document.featurePolicy.allowsFeature("vertical-scroll"), + "Expected 'vertical-scroll' to be disabled."); + }, "'vertical-scroll' disabled in main document."); + + // Wait for the helper scripts to load. + promise_test(async() => { + if (window.input_api_ready) + return Promise.resolve(); + await new Promise( (r) => { + window.resolve_on_input_api_ready = r; + }); + }, "Make sure input injection API is ready."); + + promise_test(async() => { + window.scrollTo(0, 0); + await inject_input("down"); + assert_greater_than(window.scrollY, 0, "Page must have scrolled down."); + }, "Verify that the page scrolls vertically."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative.html.headers new file mode 100644 index 0000000..8d9c01e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: vertical-scroll=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-scrollintoview.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-scrollintoview.tentative.html new file mode 100644 index 0000000..4f78dd9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-scrollintoview.tentative.html
@@ -0,0 +1,117 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/permissions-policy/experimental-features/resources/common.js"></script> +<script src="/permissions-policy/experimental-features/resources/vertical-scroll.js"></script> +<style> +html, body { + height: 100%; + width: 100%; +} + +iframe { + width: 95%; + height: 95%; + overflow: scroll; + margin-top: 200%; +} + +.spacer { + width: 100%; + height: 100%; + margin-top: 100%; + margin-bottom: 100%; +} + +</style> +<p> An <iframe> further below which is not allowed to block scroll.</p> +<div class="spacer"></div> +<iframe></iframe> +<p> Making sure there is room for vertical scroll </p> +<script> + "use strict"; + + let url = url_base + "vertical-scroll-scrollintoview.html"; + let iframeElement = document.querySelector("iframe"); + + function iframeBounds() { + return iframeElement.getBoundingClientRect(); + } + + // Enabled 'vertical-scroll': scrollIntoView should work in all frames. + promise_test(async() => { + window.scrollTo(0, 0); + await loadUrlInIframe(iframeElement, url); + + await sendMessageAndGetResponse( + iframeElement.contentWindow, + {type: "scrolling-element-bounds"}).then((response) => { + let iframeBoundsAtOrigin = { + x: 0, + y: 0, + width: iframeBounds().width, + height: iframeBounds().height}; + let scrollingElementBounds = response.bounds; + assert_false( + rects_intersect(iframeBoundsAtOrigin, scrollingElementBounds), + "Scrolling element should not be visible in <iframe>." + + `Scrolling element's bounds is: ${rectToString(response.bounds)} ` + + "but <iframe>'s size is:" + + `${iframeBounds().width}x${iframeBounds().height}.`); + }); + + // Scroll the scrolling element inside the <iframe>. + await sendMessageAndGetResponse(iframeElement.contentWindow, + {type: "scroll"}); + // The page should have scrolled vertically. + assert_greater_than(window.scrollY, + 0, + "Main frame must scroll vertically."); + }, "Calling 'scrollIntoView()' inside a <iframe> will propagate up by" + + " default('vertical-scroll' enabled)."); + + // Disabled 'vertical-scroll': The scope of scrollIntoView is within the set + // of disabled frames (does not propagate to main frame). + promise_test(async() => { + window.scrollTo(0, 0); + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + + await sendMessageAndGetResponse( + iframeElement.contentWindow, + {type: "scrolling-element-bounds"}).then((response) => { + let iframeBoundsAtOrigin = { + x: 0, + y: 0, + width: iframeBounds().width, + height: iframeBounds().height}; + let scrollingElementBounds = response.bounds; + assert_false(rects_intersect(iframeBoundsAtOrigin, scrollingElementBounds), + "Scrolling element should not be visible in <iframe>." + + `Scrolling element's bounds is: ${rectToString(response.bounds)}` + + "but <iframe>'s size is:" + + `${iframeBounds().width}x${iframeBounds().height}.`); + }); + + // Scroll scrolling element inside the <iframe>. + await sendMessageAndGetResponse(iframeElement.contentWindow, + {type: "scroll"}).then((response) => { + // Make sure the nested <iframe> is visible. + let scrollingElementBounds = response.bounds; + let iframeBoundsAtOrigin = { + x: 0, + y: 0, + width: iframeBounds().width, + height: iframeBounds().height}; + // The scrolling element should be visible inside <iframe>. + assert_true(rects_intersect(iframeBoundsAtOrigin, scrollingElementBounds), + "Scrolling element should be visible in <iframe>." + + `Scrolling element's bounds is: ${rectToString(response.bounds)}` + + "but <iframe>'s size is:" + + `${iframeBounds().width}, ${iframeBounds().height}.`); + // The page however should not have scrolled. + assert_equals(window.scrollY, 0, "Main frame must not scroll vertically."); + }); + }, "Calling 'scrollIntoView()' inside a <iframe> with" + + " 'vertical-scroll none;'will not propagate upwards."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html new file mode 100644 index 0000000..8c2eec9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html
@@ -0,0 +1,103 @@ +<!doctype html> +<meta name="timeout" content="long"> +<title>vertical-scroll test for touch-action</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/permissions-policy/experimental-features/resources/common.js"></script> +<script src="/permissions-policy/experimental-features/resources/vertical-scroll.js"></script> +<style> +html, body { + height: 100%; + width: 100%; +} + +iframe { + width: 90%; + height: 90%; + margin: 0; + padding: 0; +} + +.spacer { + width: 100%; + height: 100%; + margin: 100%; +} +</style> +<iframe></iframe> +<br/> +<p>Spacers below to make page scrollable</p> +<br/> +<div class="spacer"></div> +<div class="spacer"></div> +<p> EOF </p> + +<script> + "use strict"; + + let url = url_base + "vertical-scroll-touch-action.html"; + let iframeElement = document.querySelector("iframe"); + + // Wait for the helper scripts to load. + promise_test(async() => { + if (window.input_api_ready) + return Promise.resolve(); + await new Promise( (r) => { + window.resolve_on_input_api_ready = r; + }); + }, "Make sure input injection API is ready."); + + // Sanity-check: Verify we can scroll using the test-API (empty <iframe>). + promise_test(async() => { + window.scrollTo(0, 0); + + await inject_input("down"); + assert_greater_than(window.scrollY, 0, "Page must have scrolled down."); + + await inject_input("right"); + assert_greater_than(window.scrollX, 0, "Page must have scrolled right."); + }, "Verify that the page normally scrolls."); + + // Enable 'vertical-scroll': "touch-action" should be able to block scroll. + promise_test(async() => { + // Make sure <window> can scroll both towards right and bottom. + window.scrollTo(0, 0); + + await loadUrlInIframe(iframeElement, url); + + // Apply the scroll gesture. + await inject_input("down"); + + // The scroll should normally bubble and affect this page, but the <iframe> + // is allowed to block it. + assert_equals(window.scrollY, + 0, + "Main frame must not scroll vertically"); + }, "Vertical scrolling through 'touch-action' can normally be blocked if" + + " 'pan-y' is not present."); + + // Disable 'vertical-scroll': "touch-action" should not be able to block + // scroll. + promise_test(async() => { + window.scrollTo(0, 0); + + // Disallow vertical scroll and reload the <iframe>. + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + + // Apply the scroll gesture. Main frame should scroll vertically. + await inject_input("down"); + + assert_greater_than(window.scrollY, + 0, + "Main frame must scroll vertically."); + window.scrollTo(0, 0); + + await inject_input("right"); + assert_equals( + window.scrollX, + 0, + "'pan-x' can be blocked even when 'vertical-scroll' is disabled"); + }, "Vertical scrolling (and only vertical scrolling) through 'touch-action'" + + " cannot be blocked by a disabled frame."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html new file mode 100644 index 0000000..341e5439 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html
@@ -0,0 +1,237 @@ +<!doctype html> +<title>vertical-scroll test for touch-action</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/permissions-policy/experimental-features/resources/common.js"></script> +<script src="/permissions-policy/experimental-features/resources/vertical-scroll.js"></script> +<style> +html, body { + height: 100%; + width: 100%; +} + +iframe { + width: 90%; + height: 90%; + margin: 0; + padding: 0; +} + +.spacer { + width: 100%; + height: 100%; + margin: 100%; +} +</style> +<iframe></iframe> +<br/> +<p>Spacers below to make page scrollable</p> +<br/> +<div class="spacer"></div> +<div class="spacer"></div> +<p> EOF </p> + +<script> + "use strict"; + + let url = url_base + "vertical-scroll-touch-block.html"; + let iframeElement = document.querySelector("iframe"); + + // Wait for the helper scripts to load. + promise_test(async() => { + if (window.input_api_ready) + return Promise.resolve(); + await new Promise( (r) => { + window.resolve_on_input_api_ready = r; + }); + + }, "Make sure input injection API is ready."); + + // Sanity-check: Verify we can scroll using the test-API. The <iframe> with no + // query arguments would not preventDefault() any events. + promise_test(async() => { + window.scrollTo(0, 0); + await loadUrlInIframe(iframeElement, url); + + await inject_scroll("down"); + assert_greater_than(window.scrollY, 0, "Page must have scrolled down."); + + await inject_scroll("right"); + assert_greater_than(window.scrollX, 0, "Page must have scrolled right."); + }, "Verify that the page normally scrolls."); + + // Enable 'vertical-scroll': Blocking "touchstart" can block scrolling. + promise_test(async() => { + window.scrollTo(0, 0); + setFeatureState(iframeElement, "vertical-scroll", "*"); + await loadUrlInIframe(iframeElement, url); + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchstart", + query: "#blocker", + prevent: true + }); + + await inject_scroll("down"); + assert_equals(window.scrollY, + 0, + "Main frame must not scroll vertically."); + }, "Calling 'preventDefault' on 'touchstart' blocks vertical scroll when " + + " the feature is enabled."); + + // Disable 'vertical-scroll': Blocking "touchstart" cannot block vertical + // scroll. + promise_test(async() => { + window.scrollTo(0, 0); + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchstart", + query: "#blocker", + prevent: true + }); + + await inject_scroll("down"); + assert_greater_than(window.scrollY, + 0, + "Main frame must scroll vertically."); + + // Horizontal scrolling must still be blocked. + window.scrollTo(0, 0); + await inject_scroll("right"); + assert_equals(window.scrollX, + 0, + "Main frame must not scroll horizontally."); + }, "When feature is disabled, calling 'preventDefault' on 'touchstart' does" + + " not block vertical scroll, but still bocks horizontal scroll."); + + // Enable 'vertical-scroll': Blocking "touchmove" can block scrolling. + promise_test(async() => { + // Make sure <window> can scroll both towards right and bottom. + window.scrollTo(0, 0); + setFeatureState(iframeElement, "vertical-scroll", "*"); + await loadUrlInIframe(iframeElement, url); + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchmove", + query: "#blocker", + prevent: true + }); + + await inject_scroll("down"); + assert_equals(window.scrollY, + 0, + "Main frame must not scroll vertically"); + }, "Calling 'preventDefault' on 'touchmove' blocks vertical scroll when " + + "the feature is enabled."); + + // Disable 'vertical-scroll': Blocking "touchmove" cannot block vertical + // scroll. + promise_test(async() => { + window.scrollTo(0, 0); + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchmove", + query: "#blocker", + prevent: true + }); + await new Promise((r) => { + window.setTimeout(r, 100); + }); + + await inject_scroll("down"); + assert_greater_than(window.scrollY, + 0, + "Main frame must scroll vertically."); + }, "When feature is disabled, calling 'preventDefault' on 'touchmove' does" + + " not block vertical scroll."); + + // Disable 'vertical-scroll': Add a non-preventing handler, and then a + // preventing handler and verify vertical scroll is possible and horizontal + // is blocked. + promise_test(async() => { + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + + // Add a non-blocking handler. + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchstart", + query: "#blocker", + prevent: false + }); + + window.scrollTo(0, 0); + await inject_scroll("down"); + assert_greater_than(window.scrollY, 0, "Page must have scrolled down."); + + window.scrollTo(0, 0); + await inject_scroll("right"); + assert_greater_than(window.scrollX, 0, "Page must have scrolled right."); + + // Add a blocking handler. + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchstart", + query: "#blocker", + prevent: true + }); + window.scrollTo(0, 0); + await inject_scroll("down"); + assert_greater_than(window.scrollY, + 0, + "Page must have scrolled down (preventing handler)."); + + window.scrollTo(0, 0); + await inject_scroll("right"); + assert_equals(window.scrollX, + 0, + "Page must not have scrolled horizontally."); + }, "Verify that starting with a non-preventing listener and then switching" + + " to a preventing one works as intended."); + + // Disable 'vertical-scroll': A preventing 'touchstart' handler does not allow + // other multi-touch actions such as 'pinch-zoom'. + promise_test(async() => { + assert_true(!!window.visualViewport, + "'visualViewport' is needed for this test."); + + setFeatureState(iframeElement, "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement, url); + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchstart", + query: "#blocker", + prevent: false + }); + + // Sanity check: Pinch zoom in should work since 'touchstart' is not + // preventing. + let current_scale_factor = window.visualViewport.scale; + await inject_zoom("in"); + let new_scale_factor = window.visualViewport.scale; + assert_greater_than( + new_scale_factor, + current_scale_factor, + "Pinch zoom should work since 'touchstart' is not prevented."); + + // Add a preventing handler and verify pinch zoom is now blocked. + await sendMessageAndGetResponse(iframeElement.contentWindow, + { + event_type: "touchstart", + query: "#blocker", + prevent: true + }); + current_scale_factor = new_scale_factor; + await inject_zoom("out"); + new_scale_factor = window.visualViewport.scale; + assert_equals( + new_scale_factor, + current_scale_factor, + "Pinch zoom must be blocked."); + }, "Verify that pinch zoom is blocked in frames with 'vertical-scroll' none'" + + " where 'touchstart' is prevent defaulted."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html new file mode 100644 index 0000000..2627fd41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html
@@ -0,0 +1,145 @@ +<!doctype html> +<title>vertical-scroll test for 'mousewheel'</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/permissions-policy/experimental-features/resources/common.js"></script> +<script src="/permissions-policy/experimental-features/resources/vertical-scroll.js"></script> +<style> +html, body { + height: 100%; + width: 100%; +} + +iframe { + width: 90%; + height: 90%; + margin: 0; + padding: 0; +} + +.spacer { + width: 100%; + height: 100%; + margin: 100%; +} + +</style> +<iframe></iframe> +<br/> +<p>Spacers below to make page scrollable</p> +<br/> +<div class="spacer"></div> +<div class="spacer"></div> +<p> EOF </p> +<script> + "use strict"; + + let url = url_base + "vertical-scroll-wheel-block.html"; + function iframeElement() { + return document.querySelector("iframe"); + } + + // Used as the polling interval when waiting for a specific condition. + let verify_scroll_offset_delay = 5; + let no_scroll_timout = 50; + + function waitUntilSatisfied(testInstance, predicate) { + return new Promise((r) => { + function testPredicate() { + if (predicate()) { + r(); + } else { + testInstance.step_timeout(testPredicate, verify_scroll_offset_delay); + } + } + testPredicate(); + }); + } + + function resetScroll(testInstance) { + window.scrollTo({top: 0, left: 0, behavior: "instant"}); + return waitUntilSatisfied(testInstance, () => { + return window.scrollX === 0 && window.scrollY === 0; + }); + } + + function waitForMinimumScrollOffset(testInstance, minX, minY) { + return waitUntilSatisfied(testInstance, () => { + return window.scrollX >= minX && window.scrollY >= minY; + }); + } + + function waitFor(testInstance, delay) { + let checked_once = false; + return waitUntilSatisfied(testInstance, () => { + if (checked_once) + return true; + checked_once = true; + return false; + }); + } + + // Wait for the helper scripts to load. + promise_test(async() => { + if (window.input_api_ready) + return Promise.resolve(); + await new Promise((r) => { + window.resolve_on_input_api_ready = r; + }); + }, "Make sure input injection API is ready."); + + // Sanity-check: Test API for scrolling along y-axis works as expected. + promise_test(async(testInstance) => { + await resetScroll(testInstance); + await inject_wheel_scroll("down"); + await waitForMinimumScrollOffset(testInstance, 0, 1); + assert_greater_than(window.scrollY, 0, "Expected vertical scroll."); + }, "Sanity-check: the page scrolls vertically in response to vertical wheel."); + + // Sanity-check: Test API for scrolling along x-axis works as expected. + promise_test(async(testInstance) => { + await resetScroll(testInstance); + await inject_wheel_scroll("right"); + await waitForMinimumScrollOffset(testInstance, 1, 0); + assert_greater_than(window.scrollX, 0, "Expected horizontal scroll."); + }, "Sanity-check: the page scrolls horizontally in response to horizontal wheel."); + + // Test that when 'vertical-scroll' is enabled, vertical scroll can be + // blocked by canceling 'wheel' event. + promise_test(async(testInstance) => { + setFeatureState(iframeElement(), "vertical-scroll", "*"); + await loadUrlInIframe(iframeElement(), url); + + await resetScroll(testInstance); + await inject_wheel_scroll("down") + await waitFor(testInstance, no_scroll_timout); + assert_equals(window.scrollY, 0, "Did not expected vertical scroll."); + }, "When 'vertical-scroll' is enabled canceling vertical 'wheel' " + + "blocks vertical scrolling."); + + // Test that when 'vertical-scroll' is disabled, vertical scroll cannot + // be blocked by canceling 'wheel' event. + promise_test(async(testInstance) => { + setFeatureState(iframeElement(), "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement(), url); + + await resetScroll(testInstance); + await inject_wheel_scroll("down"); + await waitForMinimumScrollOffset(testInstance, 0, 1); + assert_greater_than(window.scrollY, 0, "Expected vertical scroll."); + }, "When 'vertical-scroll' is disabled canceling vertical 'wheel' " + + "does not block vertical scrolling."); + + // Test that when 'vertical-scroll' is disabled, horizontal scroll can be + // blocked by canceling 'wheel' event. + promise_test(async(testInstance) => { + setFeatureState(iframeElement(), "vertical-scroll", "'none'"); + await loadUrlInIframe(iframeElement(), url); + + await resetScroll(testInstance); + await inject_wheel_scroll("right"); + await waitFor(testInstance, no_scroll_timout); + assert_equals(window.scrollX, 0, "Did not expect horizontal scroll."); + }, "When 'vertical-scroll' is disabled canceling horizontal 'wheel' " + + "blocks horizontal scrolling."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/idlharness.window-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/idlharness.window-expected.txt new file mode 100644 index 0000000..db0b972 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/idlharness.window-expected.txt
@@ -0,0 +1,58 @@ +This is a testharness.js-based test. +Found 54 tests; 22 PASS, 32 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS idl_test setup +PASS idl_test validation +PASS Partial interface Document: original interface defined +PASS Partial interface Document: member names are unique +PASS Partial interface HTMLIFrameElement: original interface defined +PASS Partial interface HTMLIFrameElement: member names are unique +PASS Partial interface Document[2]: member names are unique +PASS Partial interface HTMLIFrameElement[2]: member names are unique +PASS Partial interface Document[3]: member names are unique +PASS Document includes GlobalEventHandlers: member names are unique +PASS Document includes DocumentAndElementEventHandlers: member names are unique +PASS Document includes NonElementParentNode: member names are unique +PASS Document includes ParentNode: member names are unique +PASS Document includes XPathEvaluatorBase: member names are unique +PASS HTMLElement includes GlobalEventHandlers: member names are unique +PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes ElementContentEditable: member names are unique +PASS HTMLElement includes HTMLOrSVGElement: member names are unique +PASS Element includes ParentNode: member names are unique +PASS Element includes NonDocumentTypeChildNode: member names are unique +PASS Element includes ChildNode: member names are unique +PASS Element includes Slottable: member names are unique +FAIL PermissionsPolicy interface: existence and properties of interface object assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface object length assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface object name assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: existence and properties of interface prototype object assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: operation allowsFeature(DOMString, optional DOMString) assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: operation features() assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: operation allowedFeatures() assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy interface: operation getAllowlistForFeature(DOMString) assert_own_property: self does not have own property "PermissionsPolicy" expected property "PermissionsPolicy" missing +FAIL PermissionsPolicy must be primary interface of document.permissionsPolicy assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL Stringification of document.permissionsPolicy assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicy interface: document.permissionsPolicy must inherit property "allowsFeature(DOMString, optional DOMString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicy interface: calling allowsFeature(DOMString, optional DOMString) on document.permissionsPolicy with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicy interface: document.permissionsPolicy must inherit property "features()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicy interface: document.permissionsPolicy must inherit property "allowedFeatures()" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicy interface: document.permissionsPolicy must inherit property "getAllowlistForFeature(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicy interface: calling getAllowlistForFeature(DOMString) on document.permissionsPolicy with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL PermissionsPolicyViolationReportBody interface: existence and properties of interface object assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface object length assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface object name assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: existence and properties of interface prototype object assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: attribute featureId assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: attribute sourceFile assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: attribute lineNumber assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: attribute columnNumber assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL PermissionsPolicyViolationReportBody interface: attribute disposition assert_own_property: self does not have own property "PermissionsPolicyViolationReportBody" expected property "PermissionsPolicyViolationReportBody" missing +FAIL HTMLIFrameElement interface: attribute permissionsPolicy assert_true: The prototype object must have a property "permissionsPolicy" expected true got false +FAIL Document interface: attribute permissionsPolicy assert_true: The prototype object must have a property "permissionsPolicy" expected true got false +FAIL Document interface: document must inherit property "permissionsPolicy" with the proper type assert_inherits: property "permissionsPolicy" not found in prototype chain +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/idlharness.window.js b/third_party/blink/web_tests/external/wpt/permissions-policy/idlharness.window.js new file mode 100644 index 0000000..2546061 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/idlharness.window.js
@@ -0,0 +1,20 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js +// META: timeout=long + +"use strict"; + +// https://wicg.github.io/permissions-policy/ + +idl_test( + ['permissions-policy'], + ['reporting', 'html', 'dom'], + idl_array => { + idl_array.add_objects({ + Document: ['document'], + HTMLIframeElement: ['document.createElement("iframe")'], + PermissionsPolicy: ['document.permissionsPolicy'], + // TODO: PermissionsPolicyViolationReportBody + }); + } +);
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html new file mode 100644 index 0000000..e43f4c8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + 'use strict'; + var relative_path = '/permissions-policy/resources/permissions-policy-payment.html'; + var base_src = '/permissions-policy/resources/redirect-on-load.html#'; + var same_origin_src = base_src + relative_path; + var cross_origin_src = base_src + 'https://{{domains[www]}}:{{ports[https][0]}}' + + relative_path; + var header = 'permissions policy allow="payment"'; + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, same_origin_src, + expect_feature_available_default, 'payment'); + }, header + ' allows same-origin navigation in an iframe.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, cross_origin_src, + expect_feature_unavailable_default, 'payment'); + }, header + ' disallows cross-origin navigation in an iframe.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, same_origin_src, + expect_feature_available_default, 'payment', 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true allows same-origin navigation in an iframe.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, cross_origin_src, + expect_feature_unavailable_default, 'payment', 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true disallows cross-origin navigation in an iframe.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy-attribute.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy-attribute.https.sub.html new file mode 100644 index 0000000..779e9d6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy-attribute.https.sub.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + 'use strict'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-payment.html'; + var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + var feature_name = 'permissions policy "payment"'; + var header = 'allow="payment" attribute'; + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, same_origin_src, + expect_feature_available_default, 'payment'); + }, feature_name + ' can be enabled in same-origin iframe using ' + header); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, cross_origin_src, + expect_feature_available_default, 'payment'); + }, feature_name + ' can be enabled in cross-origin iframe using ' + header); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy.https.sub.html new file mode 100644 index 0000000..cb619bc2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy.https.sub.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + 'use strict'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-payment.html'; + var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + var header = 'permissions policy header "payment=*"'; + + test(() => { + var supportedMethods = [ { supportedMethods: 'https://{{domains[nonexistent]}}/payment-request' } ]; + var details = { + total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } } + }; + try { + new PaymentRequest(supportedMethods, details); + } catch (e) { + assert_unreached(); + } + }, header + ' allows the top-level document.'); + + async_test(t => { + test_feature_availability('PaymentRequest()', t, same_origin_src, + expect_feature_available_default); + }, header + ' allows same-origin iframes.'); + + async_test(t => { + test_feature_availability('PaymentRequest()', t, cross_origin_src, + expect_feature_available_default); + }, header + ' allows cross-origin iframes.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, same_origin_src, + expect_feature_available_default, undefined, 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true allows same-origin iframes.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, cross_origin_src, + expect_feature_available_default, undefined, 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true allows cross-origin iframes.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy.https.sub.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy.https.sub.html.headers new file mode 100644 index 0000000..73449d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-allowed-by-permissions-policy.https.sub.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: payment=*
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-default-permissions-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-default-permissions-policy.https.sub.html new file mode 100644 index 0000000..71ab15a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-default-permissions-policy.https.sub.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + 'use strict'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-payment.html'; + var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + var header = 'Default "payment" permissions policy'; + + test(() => { + var supportedInstruments = [ { supportedMethods: 'visa' } ]; + var details = { + total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } } + }; + try { + new PaymentRequest(supportedInstruments, details); + } catch (e) { + assert_unreached(); + } + }, header + ' allows the top-level document.'); + + async_test(t => { + test_feature_availability('PaymentRequest()', t, same_origin_src, + expect_feature_available_default); + }, header + ' allows same-origin iframes.'); + + async_test(t => { + test_feature_availability('PaymentRequest()', t, cross_origin_src, + expect_feature_unavailable_default); + }, header + ' disallows cross-origin iframes.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, same_origin_src, + expect_feature_available_default, undefined, 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true allows same-origin iframes.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, cross_origin_src, + expect_feature_available_default, undefined, 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true allows cross-origin iframes.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html new file mode 100644 index 0000000..90f3a0ee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + 'use strict'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-payment.html'; + var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + var header = 'permissions policy header "payment=()"'; + + test(() => { + var supportedInstruments = [ { supportedMethods: 'visa' } ]; + var details = { + total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } } + }; + assert_throws_dom('SecurityError', () => { + new PaymentRequest(supportedInstruments, details); + }); + }, header + ' disallows the top-level document.'); + + async_test(t => { + test_feature_availability('PaymentRequest()', t, same_origin_src, + expect_feature_unavailable_default); + }, header + ' disallows same-origin iframes.'); + + async_test(t => { + test_feature_availability('PaymentRequest()', t, cross_origin_src, + expect_feature_unavailable_default,); + }, header + ' disallows cross-origin iframes.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, same_origin_src, + expect_feature_unavailable_default, undefined, 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true disallows same-origin iframes.'); + + async_test(t => { + test_feature_availability( + 'PaymentRequest()', t, cross_origin_src, + expect_feature_unavailable_default, undefined, 'allowpaymentrequest'); + }, header + ' allowpaymentrequest=true disallows cross-origin iframes.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html.headers new file mode 100644 index 0000000..49f799d13 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-disabled-by-permissions-policy.https.sub.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: payment=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/payment-supported-by-permissions-policy.tentative.html b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-supported-by-permissions-policy.tentative.html new file mode 100644 index 0000000..3b9928f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/payment-supported-by-permissions-policy.tentative.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<title>Test that payment is advertised in the feature list</title> +<link rel="help" href="https://w3c.github.io/webappsec-permissions-policy/#dom-permissionspolicy-features"> +<link rel="help" href="https://github.com/w3c/payment-request/issues/600"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(() => { + assert_in_array('payment', document.permissionsPolicy.features()); +}, 'document.featurePolicy.features should advertise payment.'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html new file mode 100644 index 0000000..fc851df --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html
@@ -0,0 +1,150 @@ +<!DOCTYPE html> +<html> +<head> + <meta name="timeout" content="long"> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> +</head> +<body> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=*; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var data_src = 'data:text/html,<h1>data: URL</h1>'; + var policies = [ + {allow: "*", sameOriginTestExpect: true, crossOriginTestExpect: true, dataOriginTestExpect: true}, + {allow: "'self'", sameOriginTestExpect: true, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'none'", sameOriginTestExpect: false, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'self' " + cross_origin + " https://www.example.com", sameOriginTestExpect: true, crossOriginTestExpect: true, dataOriginTestExpect: false}]; + var pipe_front = '?pipe=sub|header(Permissions-Policy, fullscreen='; + var pipe_end = ';)'; + var header_policies = ["*", "self", "()"]; + + // Test that frame.policy inherits from parent's header policy when allow + // attribute is not specified. + test(function() { + test_frame_policy('fullscreen', same_origin_src, undefined, true); + }, 'Test frame policy on same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, undefined, true); + }, 'Test frame policy on cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', undefined, true, true); + }, 'Test frame policy on srcdoc iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', same_origin_src, true, true); + }, 'Test frame policy on srcdoc+ same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, true, true); + }, 'Test frame policy on srcdoc+ cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', data_src, undefined, true); + }, 'Test frame policy on data: URL cross origin iframe inherit from header policy.'); + + // Test frame policy with allow attribute set to be one of the policies above. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on data: URL cross origin iframe with allow = "' + policies[i].allow + '".'); + } + + // Test that the header policy of the iframe document does not change the + // frame policy. + for (var i = 0; i < policies.length; i++) { + for (var j = 0; j < header_policies.length; j++) { + test(function() { + test_frame_policy( + 'fullscreen', + same_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + test(function() { + test_frame_policy( + 'fullscreen', + cross_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + } + } + + // Test that the allow attribute overrides allowfullscreen. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on data: URL cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + } + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html.sub.headers new file mode 100644 index 0000000..2cbb8a82 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-all.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=*
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub-expected.txt new file mode 100644 index 0000000..9910d7c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub-expected.txt
@@ -0,0 +1,90 @@ +This is a testharness.js-based test. +Found 86 tests; 84 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test frame policy on same origin iframe inherit from header policy. +PASS Test frame policy on cross origin iframe inherit from header policy. +PASS Test frame policy on srcdoc iframe inherit from header policy. +PASS Test frame policy on srcdoc + same origin iframe inherit from header policy. +PASS Test frame policy on srcdoc + cross origin iframe inherit from header policy. +PASS Test frame policy on data: URL cross origin iframe inherit from header policy. +PASS Test frame policy on sandboxed iframe with no allow attribute. +PASS Test frame policy on sandboxed iframe with allow="fullscreen". +PASS Test frame policy on sandboxed iframe with allow="fullscreen 'src'". +PASS Test frame policy on sandboxed iframe with allow="fullscreen https://www.web-platform.test:8444". +PASS Test frame policy on srcdoc sandboxed iframe with allow="fullscreen". +PASS Test frame policy on srcdoc + same origin sandboxed iframe with allow="fullscreen". +PASS Test frame policy on srcdoc + cross origin sandboxed iframe with allow="fullscreen". +PASS Test frame policy on sandboxed srcdoc iframe with allow="fullscreen https://www.web-platform.test:8444". +PASS Test frame policy on same origin iframe with allow = "*". +PASS Test frame policy on cross origin iframe with allow = "*". +PASS Test frame policy on srcdoc iframe with allow = "*". +PASS Test frame policy on srcdoc + same origin iframe with allow = "*". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "*". +FAIL Test frame policy on data: URL origin iframe with allow = "*". assert_false: expected false got true +PASS Test frame policy on same origin iframe with allow = "'self'". +PASS Test frame policy on cross origin iframe with allow = "'self'". +PASS Test frame policy on srcdoc iframe with allow = "'self'". +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self'". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self'". +PASS Test frame policy on data: URL origin iframe with allow = "'self'". +PASS Test frame policy on same origin iframe with allow = "'none'". +PASS Test frame policy on cross origin iframe with allow = "'none'". +PASS Test frame policy on srcdoc iframe with allow = "'none'". +PASS Test frame policy on srcdoc + same origin iframe with allow = "'none'". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'none'". +PASS Test frame policy on data: URL origin iframe with allow = "'none'". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on data: URL origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on same origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "*" and allowfullscreen. +FAIL Test frame policy on data: URL origin iframe with allow = "*" and allowfullscreen. assert_false: expected false got true +PASS Test frame policy on same origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on data: URL origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on same origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on data: URL origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on data: URL origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html new file mode 100644 index 0000000..1aa219b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html
@@ -0,0 +1,184 @@ +<!DOCTYPE html> +<html> +<head> + <meta name="timeout" content="long"> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> +</head> +<body> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=self; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var data_src = 'data:text/html,<h1>data: URL</h1>'; + var policies = [ + {allow: "*", sameOriginTestExpect: true, crossOriginTestExpect: true, dataOriginTestExpect: false}, + {allow: "'self'", sameOriginTestExpect: true, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'none'", sameOriginTestExpect: false, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'self' " + cross_origin + " https://www.example.com", sameOriginTestExpect: true, crossOriginTestExpect: true, dataOriginTestExpect: false}]; + var pipe_front = '?pipe=sub|header(Permissions-Policy, fullscreen='; + var pipe_end = ';)'; + var header_policies = ["*", "self", "()"]; + + // Test that frame.policy inherits from parent's header policy when allow + // attribute is not specified. + test(function() { + test_frame_policy('fullscreen', same_origin_src, undefined, true); + }, 'Test frame policy on same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, undefined, false); + }, 'Test frame policy on cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', undefined, true, true); + }, 'Test frame policy on srcdoc iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', same_origin_src, true, true); + }, 'Test frame policy on srcdoc + same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, true, true); + }, 'Test frame policy on srcdoc + cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', data_src, undefined, false); + }, 'Test frame policy on data: URL cross origin iframe inherit from header policy.'); + + // Test that frame policy can be used for sandboxed frames + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, false, undefined, false, true); + }, 'Test frame policy on sandboxed iframe with no allow attribute.'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, true, 'fullscreen', false, true); + }, 'Test frame policy on sandboxed iframe with allow="fullscreen".'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, true, 'fullscreen \'src\'', false, true); + }, 'Test frame policy on sandboxed iframe with allow="fullscreen \'src\'".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, false, 'fullscreen ' + cross_origin, false, true); + }, 'Test frame policy on sandboxed iframe with allow="fullscreen ' + cross_origin + '".'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, true, 'fullscreen', false, true); + }, 'Test frame policy on srcdoc sandboxed iframe with allow="fullscreen".'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, true, 'fullscreen', false, true); + }, 'Test frame policy on srcdoc + same origin sandboxed iframe with allow="fullscreen".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, true, 'fullscreen', false, true); + }, 'Test frame policy on srcdoc + cross origin sandboxed iframe with allow="fullscreen".'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, false, 'fullscreen ' + cross_origin, false, true); + }, 'Test frame policy on sandboxed srcdoc iframe with allow="fullscreen ' + cross_origin + '".'); + + // Test frame policy with allow attribute set to be one of the policies above. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on data: URL origin iframe with allow = "' + policies[i].allow + '".'); + } + + // Test that the header policy of the iframe document does not change the + // frame policy. + for (var i = 0; i < policies.length; i++) { + for (var j = 0; j < header_policies.length; j++) { + test(function() { + test_frame_policy( + 'fullscreen', + same_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + test(function() { + test_frame_policy( + 'fullscreen', + cross_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + } + } + + // Test that the allow attribute overrides allowfullscreen. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on data: URL origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + } + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html.sub.headers new file mode 100644 index 0000000..ff7ae41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-self.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=self
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub-expected.txt new file mode 100644 index 0000000..0239d71 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub-expected.txt
@@ -0,0 +1,35 @@ +This is a testharness.js-based test. +PASS Test frame policy on same origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on another cross origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "*" and allowfullscreen. +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "*" and allowfullscreen. +FAIL Test frame policy on data: URL cross origin iframe with allow = "*" and allowfullscreen. assert_false: expected false got true +PASS Test frame policy on same origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on another cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on data: URL cross origin iframe with allow = "'self'" and allowfullscreen. +PASS Test frame policy on same origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on another cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on data: URL cross origin iframe with allow = "'none'" and allowfullscreen. +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +PASS Test frame policy on data: URL cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and allowfullscreen. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html new file mode 100644 index 0000000..25056444 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html
@@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html> +<head> + <meta name="timeout" content="long"> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> +</head> +<body> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=self cross_origin https://www.example.com; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var cross_origin1 = 'https://{{domains[www1]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var cross_origin_src1 = cross_origin1 + same_origin_src; + var data_src = 'data:text/html,<h1>data: URL</h1>'; + // Test permissions policy with same_origin_src and cross_origin_src. + var policies = [ + {allow: "*", sameOriginTestExpect: true, crossOriginTestExpect: true, crossOrigin1TestExpect: true, dataOriginTestExpect: false}, + {allow: "'self'", sameOriginTestExpect: true, crossOriginTestExpect: false, crossOrigin1TestExpect: false, dataOriginTestExpect: false}, + {allow: "'none'", sameOriginTestExpect: false, crossOriginTestExpect: false, crossOrigin1TestExpect: false, dataOriginTestExpect: false}, + {allow: "'self' " + cross_origin + " https://www.example.com", sameOriginTestExpect: true, crossOriginTestExpect: true, crossOrigin1TestExpect: false, dataOriginTestExpect: false}]; + + // Test that the allow attribute overrides allowfullscreen. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src1, undefined, + policies[i].crossOrigin1TestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on another cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src1, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + another cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on data: URL cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + } + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html.sub.headers new file mode 100644 index 0000000..d3aa9ff --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some-override.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=self https://{{domains[www]}}:{{ports[https][0]}} https://www.example.com
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub-expected.txt new file mode 100644 index 0000000..0f6a3b6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub-expected.txt
@@ -0,0 +1,80 @@ +This is a testharness.js-based test. +Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test frame policy on same origin iframe inherit from header policy. +PASS Test frame policy on cross origin iframe inherit from header policy. +PASS Test frame policy on another cross origin iframe inherit from header policy. +PASS Test frame policy on srcdoc iframe inherit from header policy. +PASS Test frame policy on srcdoc + same origin iframe inherit from header policy. +PASS Test frame policy on srcdoc + cross origin iframe inherit from header policy. +PASS Test frame policy on srcdoc + another cross origin iframe inherit from header policy. +PASS Test frame policy on data: URL cross origin iframe inherit from header policy. +PASS Test frame policy on same origin iframe with allow = "*". +PASS Test frame policy on cross origin iframe with allow = "*". +PASS Test frame policy on another cross origin iframe with allow = "*". +PASS Test frame policy on srcdoc iframe with allow = "*". +PASS Test frame policy on srcdoc + same origin iframe with allow = "*". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "*". +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "*". +FAIL Test frame policy on data: URL cross origin iframe with allow = "*". assert_false: expected false got true +PASS Test frame policy on same origin iframe with allow = "'self'". +PASS Test frame policy on cross origin iframe with allow = "'self'". +PASS Test frame policy on another cross origin iframe with allow = "'self'". +PASS Test frame policy on srcdoc iframe with allow = "'self'". +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self'". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self'". +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "'self'". +PASS Test frame policy on data: URL cross origin iframe with allow = "'self'". +PASS Test frame policy on same origin iframe with allow = "'none'". +PASS Test frame policy on cross origin iframe with allow = "'none'". +PASS Test frame policy on another cross origin iframe with allow = "'none'". +PASS Test frame policy on srcdoc iframe with allow = "'none'". +PASS Test frame policy on srcdoc + same origin iframe with allow = "'none'". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'none'". +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "'none'". +PASS Test frame policy on data: URL cross origin iframe with allow = "'none'". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc + same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc + cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on srcdoc + another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on data: URL cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com". +PASS Test frame policy on same origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on another cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on another cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on another cross origin iframe with allow = "*" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on another cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on another cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on another cross origin iframe with allow = "'self'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on another cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on another cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on another cross origin iframe with allow = "'none'" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=*;". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=self;". +PASS Test frame policy on same origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=();". +PASS Test frame policy on another cross origin iframe with allow = "'self' https://www.web-platform.test:8444 https://www.example.com" and header policy = "Permissions-Policy: fullscreen=();". +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html new file mode 100644 index 0000000..a27018e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html
@@ -0,0 +1,136 @@ +<!DOCTYPE html> +<html> +<head> + <meta name="timeout" content="long"> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> +</head> +<body> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=self cross_origin https://www.example.com; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var cross_origin1 = 'https://{{domains[www1]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var cross_origin_src1 = cross_origin1 + same_origin_src; + var data_src = 'data:text/html,<h1>data: URL</h1>'; + // Test permissions policy with same_origin_src and cross_origin_src. + var policies = [ + {allow: "*", sameOriginTestExpect: true, crossOriginTestExpect: true, crossOrigin1TestExpect: true, dataOriginTestExpect: false}, + {allow: "'self'", sameOriginTestExpect: true, crossOriginTestExpect: false, crossOrigin1TestExpect: false, dataOriginTestExpect: false}, + {allow: "'none'", sameOriginTestExpect: false, crossOriginTestExpect: false, crossOrigin1TestExpect: false, dataOriginTestExpect: false}, + {allow: "'self' " + cross_origin + " https://www.example.com", sameOriginTestExpect: true, crossOriginTestExpect: true, crossOrigin1TestExpect: false, dataOriginTestExpect: false}]; + var pipe_front = '?pipe=sub|header(Permissions-Policy, fullscreen='; + var pipe_end = ')'; + var header_policies = ["*", "self", "()"]; + + // Test that frame.policy inherits from parent's header policy when allow + // attribute is not specified. + test(function() { + test_frame_policy('fullscreen', same_origin_src, undefined, true); + }, 'Test frame policy on same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, undefined, true); + }, 'Test frame policy on cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src1, undefined, false); + }, 'Test frame policy on another cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', undefined, true, true); + }, 'Test frame policy on srcdoc iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', same_origin_src, true, true); + }, 'Test frame policy on srcdoc + same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, true, true); + }, 'Test frame policy on srcdoc + cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src1, true, true); + }, 'Test frame policy on srcdoc + another cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', data_src, undefined, false); + }, 'Test frame policy on data: URL cross origin iframe inherit from header policy.'); + + // Test frame policy with allow attribute set to be one of the policies above. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src1, undefined, + policies[i].crossOrigin1TestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on another cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src1, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + another cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on data: URL cross origin iframe with allow = "' + policies[i].allow + '".'); + } + + // Test that the header policy of the iframe document does not change the + // frame policy. + for (var i = 0; i < policies.length; i++) { + for (var j = 0; j < header_policies.length; j++) { + test(function() { + test_frame_policy( + 'fullscreen', + same_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + test(function() { + test_frame_policy( + 'fullscreen', + cross_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + test(function() { + test_frame_policy( + 'fullscreen', + cross_origin_src1 + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].crossOrigin1TestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on another cross origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + } + } + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html.sub.headers new file mode 100644 index 0000000..af08d49c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-allowed-for-some.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=(self "https://{{domains[www]}}:{{ports[https][0]}}" "https://www.example.com")
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html new file mode 100644 index 0000000..e7869b1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html
@@ -0,0 +1,150 @@ +<!DOCTYPE html> +<html> +<head> + <meta name="timeout" content="long"> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> +</head> +<body> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=(); --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var data_src = 'data:text/html,<h1>data: URL</h1>'; + var policies = [ + {allow: "*", sameOriginTestExpect: false, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'self'", sameOriginTestExpect: false, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'none'", sameOriginTestExpect: false, crossOriginTestExpect: false, dataOriginTestExpect: false}, + {allow: "'self' " + cross_origin + " https://www.example.com", sameOriginTestExpect: false, crossOriginTestExpect: false, dataOriginTestExpect: false}]; + var pipe_front = '?pipe=sub|header(Permissions-Policy, fullscreen='; + var pipe_end = ';)'; + var header_policies = ["*", "self", "()"]; + + // Test that frame.policy inherits from parent's header policy when allow + // attribute is not specified. + test(function() { + test_frame_policy('fullscreen', same_origin_src, undefined, false); + }, 'Test frame policy on same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, undefined, false); + }, 'Test frame policy on cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', undefined, true, false); + }, 'Test frame policy on srcdoc iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', same_origin_src, true, false); + }, 'Test frame policy on srcdoc + same origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', cross_origin_src, true, false); + }, 'Test frame policy on srcdoc + cross origin iframe inherit from header policy.'); + test(function() { + test_frame_policy('fullscreen', data_src, undefined, false); + }, 'Test frame policy on data: URL cross origin iframe inherit from header policy.'); + + // Test frame policy with allow attribute set to be one of the policies above. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + '".'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on data: URL cross origin iframe with allow = "' + policies[i].allow + '".'); + } + + // Test that the header policy of the iframe document does not change the + // frame policy. + for (var i = 0; i < policies.length; i++) { + for (var j = 0; j < header_policies.length; j++) { + test(function() { + test_frame_policy( + 'fullscreen', + same_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + test(function() { + test_frame_policy( + 'fullscreen', + cross_origin_src + pipe_front + header_policies[j] + pipe_end, + undefined, policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';'); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and header policy = "Permissions-Policy: fullscreen=' + header_policies[j] + ';".'); + } + } + + // Test that the allow attribute overrides allowfullscreen. + for (var i = 0; i < policies.length; i++) { + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, undefined, + policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, undefined, + policies[i].crossOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', undefined, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', same_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + same origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', cross_origin_src, true, policies[i].sameOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on srcdoc + cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + test(function() { + test_frame_policy( + 'fullscreen', data_src, undefined, policies[i].dataOriginTestExpect, + 'fullscreen ' + policies[i].allow + ';', /*allowfullscreen*/true); + }, 'Test frame policy on data: URL cross origin iframe with allow = "' + policies[i].allow + + '" and allowfullscreen.'); + } + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html.sub.headers new file mode 100644 index 0000000..a65abd6e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-disallowed-for-all.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-timing-iframe-camera.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-timing-iframe-camera.https.sub.html new file mode 100644 index 0000000..8ea5d77 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-timing-iframe-camera.https.sub.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script> +window.onmessage = m => { + navigator.mediaDevices.getUserMedia({video: true}) + .then(() => 'ok') + .catch(e => e.name) + .then(r => { + window.parent.postMessage({ + id: m.data.id, + result: r + }, '*'); + }); +} +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-timing.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-timing.https.sub.html new file mode 100644 index 0000000..5b2a488 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-frame-policy-timing.https.sub.html
@@ -0,0 +1,69 @@ +<!doctype html> +<html> + <header> + <title>allow/sandbox attr changed after document creation, before response</title> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script> + let lastCallbackId = 0; + const callbacks = {}; + + function postMessageToFrame(frame, cb) { + var id = ++lastCallbackId; + callbacks[id] = cb; + frame.contentWindow.postMessage({id:id}, '*'); + step_timeout(() => { + if (id in callbacks) { + callbacks[id]('timeout'); + delete callbacks[id]; + } + }, 1000); + } + + window.onmessage = function(e) { + const message = e.data; + const id = message['id']; + const callback = callbacks[id]; + delete callbacks[id]; + callback(message.result); + }; + // @param {string} url + // @param {Function} iframe_pre_nav_callback - a callback with signature (iframe) => () which gets + // triggered before setting src attribute. + // @param {Function} iframe_post_nav_callback - a callback with signature (iframe) => () which gets + // triggered after setting src attribute but before commit + // of navigation. + // @param {Function} result_handler - a callback that handles the result posted back from iframe. + // @param {string} test_name + function timing_test(url, + iframe_pre_nav_callback, + iframe_post_nav_callback, + result_handler, test_name) { + async_test((t) => { + const iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + iframe_pre_nav_callback(iframe); + iframe.src = url; + iframe_post_nav_callback(iframe); + iframe.onload = t.step_func(() => { + postMessageToFrame(iframe, t.step_func_done(result_handler)); + }); + }, test_name); + } + + const path = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1); + const same_origin = path; + const cross_origin = "https://{{domains[www1]}}:{{ports[https][0]}}" + path; + + const cameraUrl = 'permissions-policy-frame-policy-timing-iframe-camera.https.sub.html'; + function disallowCamera(iframe) { iframe.allow = "camera 'none'"; } + function allowCamera(iframe) { iframe.allow = 'camera *'; } + function verifyCamera(result) { assert_equals(result, 'NotAllowedError'); } + timing_test(same_origin + cameraUrl, disallowCamera, allowCamera, verifyCamera, 'allow attr timing test same origin'); + timing_test(cross_origin + cameraUrl, disallowCamera, allowCamera, verifyCamera, 'allow attr timing test diff origin'); + </script> + </header> + <body> + <div id="log"></div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-all.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-all.https.sub.html new file mode 100644 index 0000000..d9113259 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-all.https.sub.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=*; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var header_policy = 'Permissions-Policy: fullscreen=*'; + + // Test that fullscreen's allowlist is ['*'] + test(function() { + assert_array_equals( + document.featurePolicy.getAllowlistForFeature('fullscreen'), + ['*']); + }, header_policy + ' -- test allowlist is ['*']'); + + // Test that fullscreen is allowed on all subframes. + test_allowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on same-origin subframe', + 'fullscreen', + same_origin_src); + test_allowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on cross-origin subframe', + 'fullscreen', + cross_origin_src); + + // Dynamically update sub frame's container policy + var allow = "fullscreen 'self';" + test_allowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is allowed on same-origin subframe', + 'fullscreen', + same_origin_src, + allow); + + test_disallowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is disallowed on cross-origin subframe', + 'fullscreen', + cross_origin_src, + allow); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-all.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-all.https.sub.html.sub.headers new file mode 100644 index 0000000..2cbb8a82 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-all.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=*
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-self.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-self.https.sub.html new file mode 100644 index 0000000..dba317e6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-self.https.sub.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=self; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var header_policy = 'Permissions-Policy: fullscreen=self'; + + // Test that fullscreen's allowlist is ['same_origin'] + test(function() { + assert_array_equals( + document.featurePolicy.getAllowlistForFeature('fullscreen'), + [same_origin]); + }, header_policy + ' -- test allowlist is [same_origin]'); + + // Test that fullscreen is only allowed on same-origin subframe. + test_allowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on same-origin subframe', + 'fullscreen', + same_origin_src); + test_disallowed_feature_for_subframe( + header_policy + ' -- test fullscreen is disallowed on cross-origin subframe', + 'fullscreen', + cross_origin_src); + + // Dynamically update sub frame's container policy + var allow = "fullscreen 'src';" + test_allowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is allowed on same-origin subframe', + 'fullscreen', + same_origin_src, + allow); + + test_allowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is allowed on cross-origin subframe', + 'fullscreen', + same_origin_src, + allow); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-self.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-self.https.sub.html.sub.headers new file mode 100644 index 0000000..ff7ae41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-self.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=self
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-some.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-some.https.sub.html new file mode 100644 index 0000000..1e999a5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-some.https.sub.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=self cross_origin https://www.example.com; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var header_policy = `Permissions-Policy: fullscreen=(self "${cross_origin}" "https://www.example.com")`; + + // Test that fullscreen's allowlist is [same_origin, cross_origin, 'https://www.example.com'] + test(function() { + assert_array_equals( + document.featurePolicy.getAllowlistForFeature('fullscreen').sort(), + [same_origin, cross_origin, 'https://www.example.com'].sort()); + }, header_policy + ' -- test allowlist is [same_origin, cross_origin, https://www.example.com]'); + + // Test that fullscreen is allowed on same_origin, some cross_origin subframes. + test_allowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on same-origin subframe', + 'fullscreen', + same_origin_src); + test_allowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on cross-origin ' + cross_origin_src + ' subframe', + 'fullscreen', + cross_origin_src); + var cross_origin_src1 = 'https://{{domains[www1]}}:{{ports[https][0]}}' + same_origin_src; + test_disallowed_feature_for_subframe( + header_policy + ' -- test fullscreen is disallowed on cross-origin ' + cross_origin_src1 + ' subframe', + 'fullscreen', + cross_origin_src1); + + // dynamically update sub frame's container policy + var allow = "fullscreen 'none';" + test_disallowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is disallowed on same-origin subframe', + 'fullscreen', + same_origin_src, + allow); + + test_disallowed_feature_for_subframe( + header_policy + 'iframe.allow = ' + allow + ' -- test fullscreen is disallowed on cross-origin subframe', + 'fullscreen', + cross_origin_src, + allow); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-some.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-some.https.sub.html.sub.headers new file mode 100644 index 0000000..af08d49c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-allowed-for-some.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=(self "https://{{domains[www]}}:{{ports[https][0]}}" "https://www.example.com")
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-declined.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-declined.https.sub.html new file mode 100644 index 0000000..8455d68 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-declined.https.sub.html
@@ -0,0 +1,64 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=cross_origin https://www.example.com; --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var header_policy = `Permissions-Policy: fullscreen=(self "${cross_origin}" "https://www.example.com"`; + + // Test that fullscreen's allowlist is [same_origin, cross_origin, 'https://www.example.com'] + test(function() { + assert_array_equals( + document.featurePolicy.getAllowlistForFeature('fullscreen'), + [cross_origin, 'https://www.example.com'].sort()); + }, header_policy + ' -- test allowlist is [cross_origin, https://www.example.com]'); + + // Test that fullscreen is disallowed on same_origin, allowed on some cross_origin subframes. + test_disallowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on same-origin subframe', + 'fullscreen', + same_origin_src); + test_allowed_feature_for_subframe( + header_policy + ' -- test fullscreen is allowed on cross-origin ' + cross_origin_src + ' subframe', + 'fullscreen', + cross_origin_src); + var cross_origin_src1 = 'https://{{domains[www1]}}:{{ports[https][0]}}' + same_origin_src; + test_disallowed_feature_for_subframe( + header_policy + ' -- test fullscreen is disallowed on cross-origin ' + cross_origin_src1 + ' subframe', + 'fullscreen', + cross_origin_src1); + + // dynamically update sub frame's container policy + var disallow = "fullscreen 'none';" + test_disallowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + disallow + ' -- test fullscreen is disallowed on same-origin subframe', + 'fullscreen', + same_origin_src, + disallow); + + test_disallowed_feature_for_subframe( + header_policy + 'iframe.allow = ' + disallow + ' -- test fullscreen is allowed on specific cross-origin subframe', + 'fullscreen', + cross_origin_src, + disallow); + + var allow = "fullscreen " + cross_origin; + test_disallowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is disallowed on same-origin subframe', + 'fullscreen', + same_origin_src, + allow); + + test_allowed_feature_for_subframe( + header_policy + 'iframe.allow = ' + allow + ' -- test fullscreen is allowed on specific cross-origin subframe', + 'fullscreen', + cross_origin_src, + allow); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-declined.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-declined.https.sub.html.sub.headers new file mode 100644 index 0000000..175e5465 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-declined.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=("https://{{domains[www]}}:{{ports[https][0]}}" "https://www.example.com")
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-disallowed-for-all.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-disallowed-for-all.https.sub.html new file mode 100644 index 0000000..6c6f6ef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-disallowed-for-all.https.sub.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <!-- Permissions-Policy: fullscreen=(); --> + <script> + 'use strict'; + var same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + var cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + var same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; + var cross_origin_src = cross_origin + same_origin_src; + var header_policy = 'Permissions-Policy: fullscreen=()'; + + // Test that fullscreen's allowlist is [] + test(function() { + assert_array_equals( + document.featurePolicy.getAllowlistForFeature('fullscreen'), + []); + assert_false(document.fullscreenEnabled, "fullscreenEnabled should reflect permissions policy properly"); + }, header_policy + ' -- test allowlist is []'); + + // Test that fullscreen is disallowed on all subframes. + test_disallowed_feature_for_subframe( + header_policy + ' -- test fullscreen is disallowed on same-origin subframe', + 'fullscreen', + same_origin_src); + test_disallowed_feature_for_subframe( + header_policy + ' -- test fullscreen is disallowed on cross-origin subframe', + 'fullscreen', + cross_origin_src); + + // Dynamically update sub frame's container policy + var allow = "fullscreen 'src';" + test_disallowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is disallowed on same-origin subframe', + 'fullscreen', + same_origin_src, + allow); + + test_disallowed_feature_for_subframe( + header_policy + ', iframe.allow = ' + allow + ' -- test fullscreen is disallowed on cross-origin subframe', + 'fullscreen', + cross_origin_src, + allow); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-disallowed-for-all.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-disallowed-for-all.https.sub.html.sub.headers new file mode 100644 index 0000000..bbc80c1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-header-policy-disallowed-for-all.https.sub.html.sub.headers
@@ -0,0 +1,2 @@ +Permissions-Policy: fullscreen=() +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-all.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-all.https.sub.html new file mode 100644 index 0000000..74ff64c5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-all.https.sub.html
@@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html> +<head> + <meta name="timeout" content="long"> +</head> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + /* + fullscreen is allowed for all at the top-level document. It can be disabled by + subframes. + */ + 'use strict'; + const same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + const cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-nested-subframe-policy.https.sub.html'; + const cross_origin_src = cross_origin + same_origin_src; + + /* ------------------------------------------ + | top-level document | + | ------------------------------------ | + | | same-origin iframe | | + | | ------------------------------ | | + | | | local and remote iframes | | | + | | ------------------------------ | | + | ------------------------------------ | + ------------------------------------------ */ + test_subframe_header_policy('fullscreen', '*', same_origin_src, + {local_all: true, local_self: true, local_none: false, + remote_all: true, remote_self: true, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=*"'); + test_subframe_header_policy('fullscreen', 'self', same_origin_src, + {local_all: true, local_self: true, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=self'); + test_subframe_header_policy('fullscreen', '\\(\\)', same_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=()"'); + + /* ------------------------------------------- + | top-level document | + | ------------------------------------- | + | | cross-origin iframe | | + | | ------------------------------- | | + | | | local and remote iframes | | | + | | ------------------------------- | | + | ------------------------------------- | + ------------------------------------------- */ + test_subframe_header_policy('fullscreen', '*', cross_origin_src, + {local_all: true, local_self: true, local_none: false, + remote_all: true, remote_self: true, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=*"'); + test_subframe_header_policy('fullscreen', 'self', cross_origin_src, + {local_all: true, local_self: true, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=self"'); + test_subframe_header_policy('fullscreen', '\\(\\)', cross_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=()"'); + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-all.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-all.https.sub.html.sub.headers new file mode 100644 index 0000000..2cbb8a82 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-all.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=*
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-self.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-self.https.sub.html new file mode 100644 index 0000000..f1e5f9d2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-self.https.sub.html
@@ -0,0 +1,63 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + /* + fullscreen is allowed for 'self' at the top-level document and through the + chain of same-origin iframes. It can be enabled by subframes, but otherwise + is disallowed everywhere else. + */ + 'use strict'; + const same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + const cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-nested-subframe-policy.https.sub.html'; + const cross_origin_src = cross_origin + same_origin_src; + + /* ------------------------------------------ + | top-level document | + | ------------------------------------ | + | | same-origin iframe | | + | | ------------------------------ | | + | | | local and remote iframes | | | + | | ------------------------------ | | + | ------------------------------------ | + ------------------------------------------ */ + test_subframe_header_policy('fullscreen', '*', same_origin_src, + {local_all: true, local_self: true, local_none: false, + remote_all: true, remote_self: true, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=*"'); + test_subframe_header_policy('fullscreen', 'self', same_origin_src, + {local_all: true, local_self: true, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=self"'); + test_subframe_header_policy('fullscreen', '\\(\\)', same_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=()"'); + + /* ------------------------------------------- + | top-level document | + | ------------------------------------- | + | | cross-origin iframe | | + | | ------------------------------- | | + | | | local and remote iframes | | | + | | ------------------------------- | | + | ------------------------------------- | + ------------------------------------------- */ + test_subframe_header_policy('fullscreen', '*', cross_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=*"'); + test_subframe_header_policy('fullscreen', 'self', cross_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=self"'); + test_subframe_header_policy('fullscreen', '\\(\\)', cross_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=()"'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-self.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-self.https.sub.html.sub.headers new file mode 100644 index 0000000..ff7ae41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-allowed-for-self.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=self
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-disallowed-for-all.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-disallowed-for-all.https.sub.html new file mode 100644 index 0000000..b6ae51b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-disallowed-for-all.https.sub.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script> + /* + fullscreen is disabled at the top-level document, therefore disabled + everywhere throughout inheritance. + */ + 'use strict'; + const same_origin = 'https://{{domains[]}}:{{ports[https][0]}}'; + const cross_origin = 'https://{{domains[www]}}:{{ports[https][0]}}'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-nested-subframe-policy.https.sub.html'; + const cross_origin_src = cross_origin + same_origin_src; + const policies = ['*', 'self', '\\(\\)']; + + for (var i = 0; i < policies.length; i++) { + /* ------------------------------------------ + | top-level document | + | ------------------------------------ | + | | same-origin iframe | | + | | ------------------------------ | | + | | | local and remote iframes | | | + | | ------------------------------ | | + | ------------------------------------ | + ------------------------------------------ */ + test_subframe_header_policy('fullscreen', policies[i], same_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with local iframe on policy "fullscreen=' + + policies[i] + '".'); + + /* ------------------------------------------- + | top-level document | + | ------------------------------------- | + | | cross-origin iframe | | + | | ------------------------------- | | + | | | local and remote iframes | | | + | | ------------------------------- | | + | ------------------------------------- | + ------------------------------------------- */ + test_subframe_header_policy('fullscreen', policies[i], cross_origin_src, + {local_all: false, local_self: false, local_none: false, + remote_all: false, remote_self: false, remote_none: false}, + 'Test nested header policy with remote iframe on policy "fullscreen=' + + policies[i] + '".'); +} + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-disallowed-for-all.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-disallowed-for-all.https.sub.html.sub.headers new file mode 100644 index 0000000..a65abd6e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/permissions-policy-nested-header-policy-disallowed-for-all.https.sub.html.sub.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html new file mode 100644 index 0000000..d965fdc5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy-attribute-redirect-on-load.https.sub.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<body> + <script src=/common/media.js></script> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/resources/testdriver.js></script> + <script src=/resources/testdriver-vendor.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script src=/permissions-policy/resources/picture-in-picture.js></script> + <script> + 'use strict'; + const relative_path = '/permissions-policy/resources/permissions-policy-picture-in-picture.html'; + const base_src = '/permissions-policy/resources/redirect-on-load.html#'; + const same_origin_src = base_src + relative_path; + const cross_origin_src = base_src + 'https://{{domains[www]}}:{{ports[https][0]}}' + + relative_path; + const header = 'permissions policy allow="picture-in-picture"'; + + async_pip_test(t => { + test_feature_availability( + 'picture-in-picture', t, same_origin_src, + expect_feature_available_default, 'picture-in-picture'); + }, header + ' allows same-origin navigation in an iframe.'); + + async_pip_test(t => { + test_feature_availability( + 'picture-in-picture', t, cross_origin_src, + expect_feature_unavailable_default, 'picture-in-picture'); + }, header + ' disallows cross-origin navigation in an iframe.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy-attribute.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy-attribute.https.sub.html new file mode 100644 index 0000000..c8371ab --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy-attribute.https.sub.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<body> + <script src=/common/media.js></script> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/resources/testdriver.js></script> + <script src=/resources/testdriver-vendor.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script src=/permissions-policy/resources/picture-in-picture.js></script> + <script> + 'use strict'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-picture-in-picture.html'; + const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + const feature_name = 'permissions policy "picture-in-picture"'; + const header = 'allow="picture-in-picture" attribute'; + + async_pip_test(t => { + test_feature_availability( + 'picture-in-picture', t, same_origin_src, + expect_feature_available_default, 'picture-in-picture'); + }, feature_name + ' can be enabled in same-origin iframe using ' + header); + + async_pip_test(t => { + test_feature_availability( + 'picture-in-picture', t, cross_origin_src, + expect_feature_available_default, 'picture-in-picture'); + }, feature_name + ' can be enabled in cross-origin iframe using ' + header); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy.https.sub.html new file mode 100644 index 0000000..dc85111 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy.https.sub.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<body> + <script src=/common/media.js></script> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/resources/testdriver.js></script> + <script src=/resources/testdriver-vendor.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script src=/permissions-policy/resources/picture-in-picture.js></script> + <script> + 'use strict'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-picture-in-picture.html'; + const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + const header = 'permissions policy header: picture-in-picture *'; + + async_pip_test(t => { + isPictureInPictureAllowed().then(t.step_func_done((result) => { + assert_true(result); + })); + }, header + ' allows the top-level document.'); + + async_pip_test(t => { + test_feature_availability('picture-in-picture', t, same_origin_src, + expect_feature_available_default); + }, header + ' allows same-origin iframes.'); + + async_pip_test(t => { + test_feature_availability('picture-in-picture', t, cross_origin_src, + expect_feature_available_default); + }, header + ' allows cross-origin iframes.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy.https.sub.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy.https.sub.html.headers new file mode 100644 index 0000000..a23f9332 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-allowed-by-permissions-policy.https.sub.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: picture-in-picture=*
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-default-permissions-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-default-permissions-policy.https.sub.html new file mode 100644 index 0000000..17ab1fd2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-default-permissions-policy.https.sub.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<body> + <script src=/common/media.js></script> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/resources/testdriver.js></script> + <script src=/resources/testdriver-vendor.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script src=/permissions-policy/resources/picture-in-picture.js></script> + <script> + 'use strict'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-picture-in-picture.html'; + const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + const header = 'Default "picture-in-picture" permissions policy [*]'; + + async_pip_test(t => { + isPictureInPictureAllowed().then(t.step_func_done((result) => { + assert_true(result); + })); + }, header + ' allows the top-level document.'); + + async_pip_test(t => { + test_feature_availability('picture-in-picture', t, same_origin_src, + expect_feature_available_default); + }, header + ' allows same-origin iframes.'); + + async_pip_test(t => { + test_feature_availability('picture-in-picture', t, cross_origin_src, + expect_feature_available_default); + }, header + ' allows cross-origin iframes.'); + + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-disabled-by-permissions-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-disabled-by-permissions-policy.https.sub.html new file mode 100644 index 0000000..7140f68 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-disabled-by-permissions-policy.https.sub.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<body> + <script src=/common/media.js></script> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src=/resources/testdriver.js></script> + <script src=/resources/testdriver-vendor.js></script> + <script src=/permissions-policy/resources/permissions-policy.js></script> + <script src=/permissions-policy/resources/picture-in-picture.js></script> + <script> + 'use strict'; + const same_origin_src = '/permissions-policy/resources/permissions-policy-picture-in-picture.html'; + const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + same_origin_src; + const header = 'permissions policy header: picture-in-picture "none"'; + + async_pip_test(t => { + isPictureInPictureAllowed().then(t.step_func_done((result) => { + assert_false(result); + })); + }, header + ' disallows the top-level document.'); + + async_pip_test(t => { + test_feature_availability('picture-in-picture', t, same_origin_src, + expect_feature_unavailable_default); + }, header + ' disallows same-origin iframes.'); + + async_pip_test(t => { + test_feature_availability('picture-in-picture', t, cross_origin_src, + expect_feature_unavailable_default); + }, header + ' disallows cross-origin iframes.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-disabled-by-permissions-policy.https.sub.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-disabled-by-permissions-policy.https.sub.html.headers new file mode 100644 index 0000000..12fc99b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-disabled-by-permissions-policy.https.sub.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: picture-in-picture=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-supported-by-permissions-policy.html b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-supported-by-permissions-policy.html new file mode 100644 index 0000000..387a878f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/picture-in-picture-supported-by-permissions-policy.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<title>Test that picture-in-picture is advertised in the feature list</title> +<link rel="help" href="https://w3c.github.io/webappsec-permissions-policy/#dom-permissions-policy-features"> +<link rel="help" href="https://wicg.github.io/picture-in-picture/#permissions-policy"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(() => { + assert_in_array('picture-in-picture', document.featurePolicy.features()); +}, 'document.featurePolicy.features should advertise picture-in-picture.'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/policy-extends-to-sandbox.html b/third_party/blink/web_tests/external/wpt/permissions-policy/policy-extends-to-sandbox.html new file mode 100644 index 0000000..50bf8a33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/policy-extends-to-sandbox.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<title>permissions policy treats opaque origins correctly</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> + "use strict"; + async_test(t => { + let frame = document.createElement('iframe'); + frame.src = "/permissions-policy/resources/sandbox-self.html"; + frame.allow = "fullscreen"; + frame.sandbox = "allow-scripts"; + + var handle_message = t.step_func(evt => { + if (evt.source === frame.contentWindow) { + assert_equals(evt.data.child, true, "'self' in header should match origin of sandboxed frame."); + assert_equals(evt.data.grandchild, false, "Opaque origins should not match each other."); + document.body.removeChild(frame); + window.removeEventListener('message', handle_message); + t.done(); + } + }); + window.addEventListener('message', handle_message); + document.body.appendChild(frame); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-report-only.https.html new file mode 100644 index 0000000..c22e1a517 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-report-only.https.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='/resources/testdriver.js'></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "camera"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await test_driver.bless('Activate document for user media'); + await navigator.mediaDevices.getUserMedia({video: true}); + check_report_format(await report); +}, "Camera report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-report-only.https.html.headers new file mode 100644 index 0000000..71a1cca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: camera=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-reporting.https.html new file mode 100644 index 0000000..12b48dc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-reporting.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var t = async_test("Camera Report Format"); + +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "camera"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +new ReportingObserver(t.step_func_done(check_report_format), + {types: ['feature-policy-violation']}).observe(); + +navigator.mediaDevices.getUserMedia({video: true}).then( + t.unreached_func("UserMedia camera access should not be allowed in this document.") +).catch(() => {}); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-reporting.https.html.headers new file mode 100644 index 0000000..6fcbae14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/camera-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: camera=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-report-only.https.html new file mode 100644 index 0000000..9ab4b0fe --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-report-only.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "encrypted-media"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await navigator.requestMediaKeySystemAccess("org.w3.clearkey", + [{ + initDataTypes: ["webm"], + videoCapabilities: [{contentType: 'video/webm;codecs="vp8"'}], + }]); + check_report_format(await report); +}, "Encrypted Media report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-report-only.https.html.headers new file mode 100644 index 0000000..0d5480e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: encrypted-media=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-reporting.https.html new file mode 100644 index 0000000..1f891a57 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-reporting.https.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "encrypted-media"); + assert_equals(report.body.disposition, "enforce"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await promise_rejects_dom(t, "SecurityError", + navigator.requestMediaKeySystemAccess("org.w3.clearkey", + [{ + initDataTypes: ["webm"], + videoCapabilities: [{contentType: 'video/webm;codecs="vp8"'}], + }]), + "requestMediaKeySystemAccess() should not be allowed in this document."); + const [reports, observer] = await report; + check_report_format(reports, observer); +}, "Encrypted Media report format"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-reporting.https.html.headers new file mode 100644 index 0000000..9505c02 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/encrypted-media-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: encrypted-media=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-report-only.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-report-only.html new file mode 100644 index 0000000..48fe9e3a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-report-only.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='/resources/testdriver.js'></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <div id='fs'></div> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "fullscreen"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await test_driver.bless('Activate document for fullscreen'); + await document.getElementById('fs').requestFullscreen(); + check_report_format(await report); + document.exitFullscreen(); +}, "Fullscreen report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-report-only.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-report-only.html.headers new file mode 100644 index 0000000..384d778 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-report-only.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: fullscreen=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-reporting.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-reporting.html new file mode 100644 index 0000000..3ac1ef4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-reporting.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <div id='fs'></div> + <script> +var observer1; +var observer2; + +var check_report_format = (reports, observer) => { + // Test that observer2 is notified, even if it is disconnected. + observer1.disconnect(); + observer2.disconnect(); + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "fullscreen"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +var check_second_observer = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "fullscreen"); +}; + +async_test(t => { + observer1 = new ReportingObserver(t.step_func(check_report_format), + {types: ['feature-policy-violation']}); + observer1.observe(); + observer2 = new ReportingObserver(t.step_func_done(check_second_observer), + {types: ['feature-policy-violation']}); + observer2.observe(); + document.getElementById('fs').requestFullscreen().then(t.unreached_func( + "Fullscreen should not be allowed in this document.")).catch(()=>{}); +}, "Fullscreen Report Format"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-reporting.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-reporting.html.headers new file mode 100644 index 0000000..a65abd6e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/fullscreen-reporting.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-report-only.https.html new file mode 100644 index 0000000..6c8c2ef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-report-only.https.html
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var sensor_features_verified = { + "accelerometer": false, + "ambient-light-sensor": false, + "magnetometer": false, + "gyroscope": false +}; + +var check_report_format = function(reports, observer) { + // Check each report in this batch. This observer callback may be called + // multiple times before all reports have been processed. + for (const report of reports) { + + // Validate that the reported feature is one of the sensor features, and that + // we have not seen a report for this feature before. + assert_true(sensor_features_verified.hasOwnProperty(report.body.featureId)); + assert_false(sensor_features_verified[report.body.featureId]); + + // Validate the remainder of the report + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "report"); + + sensor_features_verified[report.body.featureId] = true; + } + + // Test is only done when reports for all features have been seen + for (let result of Object.values(sensor_features_verified)) { + if (!result) + return; + } + this.done(); +}; + +async_test(t => { + new ReportingObserver(t.step_func(check_report_format), + {types: ['feature-policy-violation']}).observe(); + new Accelerometer(); + new AmbientLightSensor(); + new Gyroscope(); + new Magnetometer(); +}, "Generic Sensor report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-report-only.https.html.headers new file mode 100644 index 0000000..2a51586 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: ambient-light-sensor=(), accelerometer=(), gyroscope=(), magnetometer=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-reporting.https.html new file mode 100644 index 0000000..9a5d404d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-reporting.https.html
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var sensor_features_verified = { + "accelerometer": false, + "ambient-light-sensor": false, + "magnetometer": false, + "gyroscope": false +}; + +var check_report_format = function(reports, observer) { + // Check each report in this batch. This observer callback may be called + // multiple times before all reports have been processed. + for (const report of reports) { + + // Validate that the reported feature is one of the sensor features, and that + // we have not seen a report for this feature before. + assert_true(sensor_features_verified.hasOwnProperty(report.body.featureId)); + assert_false(sensor_features_verified[report.body.featureId]); + + // Validate the remainder of the report + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); + + sensor_features_verified[report.body.featureId] = true; + } + + // Test is only done when reports for all features have been seen + for (let result of Object.values(sensor_features_verified)) { + if (!result) + return; + } + this.done(); +}; + +async_test(t => { + new ReportingObserver(t.step_func(check_report_format), + {types: ['feature-policy-violation']}).observe(); + assert_throws_dom("SecurityError", () => new Accelerometer(), "Constructing sensors should be blocked by policy"); + assert_throws_dom("SecurityError", () => new AmbientLightSensor(), "Constructing sensors should be blocked by policy"); + assert_throws_dom("SecurityError", () => new Gyroscope(), "Constructing sensors should be blocked by policy"); + assert_throws_dom("SecurityError", () => new Magnetometer(), "Constructing sensors should be blocked by policy"); +}, "Generic Sensor Report Format"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-reporting.https.html.headers new file mode 100644 index 0000000..b0ebb72e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/generic-sensor-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: ambient-light-sensor=(),accelerometer=(),gyroscope=(),magnetometer=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https-expected.txt new file mode 100644 index 0000000..c7c46f13 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Geolocation report only mode promise_test: Unhandled rejection with value: object "[object GeolocationPositionError]" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html new file mode 100644 index 0000000..6c62b62 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "geolocation"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + try { + await new Promise((resolve, reject) => { + navigator.geolocation.getCurrentPosition(resolve, reject); + }); + check_report_format(await report); + } catch (err) { + // In case the getCurrentPosition call was rejected due to user permissions, + // the report should be generated anyway. Wait for it and check the format + // before failing this test. + check_report_format(await report); + throw err; + } +}, "Geolocation report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.headers new file mode 100644 index 0000000..c7e5f25 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: geolocation=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-reporting.https.html new file mode 100644 index 0000000..fe8761f8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-reporting.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var t = async_test("Geolocation Report Format"); + +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "geolocation"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +new ReportingObserver(t.step_func_done(check_report_format), + {types: ['feature-policy-violation']}).observe(); + +navigator.geolocation.getCurrentPosition( + t.unreached_func("geolocation should be disabled in this document"), + () => {}); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-reporting.https.html.headers new file mode 100644 index 0000000..26bfbc2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/geolocation-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: geolocation=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/image.bmp b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/image.bmp new file mode 100644 index 0000000..f2b8869 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/image.bmp Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-report-only.https.html new file mode 100644 index 0000000..539994c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-report-only.https.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='/resources/testdriver.js'></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "microphone"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await test_driver.bless('Activate document for user media'); + await navigator.mediaDevices.getUserMedia({audio: true}); + check_report_format(await report); +}, "Microphone report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-report-only.https.html.headers new file mode 100644 index 0000000..adcf95e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: microphone=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-reporting.https.html new file mode 100644 index 0000000..2aeba81 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-reporting.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var t = async_test("Microphone Report Format"); + +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "microphone"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +new ReportingObserver(t.step_func_done(check_report_format), + {types: ['feature-policy-violation']}).observe(); + +navigator.mediaDevices.getUserMedia({audio: true}).then( + t.unreached_func("UserMedia microphone access should not be allowed in this document.") +).catch(() => {}); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-reporting.https.html.headers new file mode 100644 index 0000000..ae65ea5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/microphone-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: microphone=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https-expected.txt new file mode 100644 index 0000000..bba8e2a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL MIDI report only mode promise_test: Unhandled rejection with value: object "SecurityError: An attempt was made to break through the security policy of the user agent." +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https.html new file mode 100644 index 0000000..bf0234d3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "midi"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + try { + await navigator.requestMIDIAccess(); + check_report_format(await report); + } catch (err) { + // In case the requestMIDIAccess call was rejected due to user permissions, + // the report should be generated anyway. Wait for it and check the format + // before failing this test. + check_report_format(await report); + throw err; + } +}, "MIDI report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https.html.headers new file mode 100644 index 0000000..10570f6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: midi=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-reporting.https.html new file mode 100644 index 0000000..9e8a6eb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-reporting.https.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "midi"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +promise_test(async (t) => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await promise_rejects_dom(t, 'SecurityError', navigator.requestMIDIAccess(), + "MIDI device access should not be allowed in this document."); + const [reports, observer] = await report; + check_report_format(reports, observer); +}, "MIDI Report Format"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-reporting.https.html.headers new file mode 100644 index 0000000..1fa88c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/midi-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: midi=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https-expected.txt b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https-expected.txt new file mode 100644 index 0000000..dc5e0c9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL PaymentRequest report only mode promise_test: Unhandled rejection with value: object "UnknownError: Renderer process could not establish or lost IPC connection to the PaymentRequest service in the browser process." +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https.html new file mode 100644 index 0000000..d2b8e5e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "payment"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + try { + const request = new PaymentRequest( + [{ supportedMethods: 'basic-card' }], + { total: { label: 'Total', amount: { currency: 'USD', value: 0 }}}, + {}); + await request.show() + check_report_format(await report); + } catch (err) { + // In case the show call was rejected, the report should be generated + // anyway. Wait for it and check the format before failing this test. + check_report_format(await report); + throw err; + } +}, "PaymentRequest report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https.html.headers new file mode 100644 index 0000000..25be816 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: payment=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-reporting.https.html new file mode 100644 index 0000000..50972ba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-reporting.https.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='../resources/permissions-policy-report-json.js'></script> + </head> + <body> + <script> +var t = async_test("PaymentRequest Report Format"); + +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "payment"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); + check_report_json(report); +}; + +new ReportingObserver(t.step_func_done(check_report_format), + {types: ['feature-policy-violation']}).observe(); + +t.step_func(() => { + assert_throws_dom('SecurityError', + () => new PaymentRequest( + [{ supportedMethods: 'basic-card' }], + { total: { label: 'Total', amount: { currency: 'USD', value: 0 }}}, + {}).show(), + "PaymentRequest API should not be allowed in this document."); +})(); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-reporting.https.html.headers new file mode 100644 index 0000000..49f799d13 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/payment-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: payment=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-report-only.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-report-only.html new file mode 100644 index 0000000..9e113a9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-report-only.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/common/media.js'></script> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src='../resources/picture-in-picture.js'></script> + </head> + <body> + <script> +const check_report_format = ([reports, observer]) => { + const report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "picture-in-picture"); + assert_equals(report.body.disposition, "report"); +}; + +const loadVideo = () => new Promise(resolve => { + const video = document.createElement('video'); + video.src = getVideoURI('/media/movie_5'); + video.addEventListener('loadedmetadata', () => { + resolve(video); + }, { once: true }); +}); + +promise_pip_test(async (t) => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + const videoElement = await loadVideo(); + await test_driver.bless('picture-in-picture'); + await videoElement.requestPictureInPicture(); + check_report_format(await report); +}, "Picture-in-Picture report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-report-only.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-report-only.html.headers new file mode 100644 index 0000000..0f73e39 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-report-only.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: picture-in-picture=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-reporting.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-reporting.html new file mode 100644 index 0000000..d1c641d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-reporting.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/common/media.js'></script> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script src='../resources/picture-in-picture.js'></script> + </head> + <body> + <script> +const check_report_format = (reports, observer) => { + const report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "picture-in-picture"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +const loadVideo = () => new Promise(resolve => { + const video = document.createElement('video'); + video.src = getVideoURI('/media/movie_5'); + video.addEventListener('loadedmetadata', () => { + resolve(video); + }, { once: true }); +}); + +promise_pip_test(async (t) => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + const videoElement = await loadVideo(); + await test_driver.bless('picture-in-picture'); + await promise_rejects_dom(t, 'SecurityError', videoElement.requestPictureInPicture(), + "Picture-in-Picture should not be allowed in this document."); + const [reports, observer] = await report; + check_report_format(reports, observer); +}, "Picture-in-Picture Report Format"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-reporting.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-reporting.html.headers new file mode 100644 index 0000000..12fc99b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/picture-in-picture-reporting.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: picture-in-picture=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-report-only.https.html new file mode 100644 index 0000000..11913a2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-report-only.https.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='/resources/testdriver.js'></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <div id='fs'></div> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "serial"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + + await test_driver.bless('Activate document for serial.requestPort'); + try { + await navigator.serial.requestPort({filters: []}); + assert_unreached('requestPort() call should fail when no port is selected.'); + } catch (e) { + assert_equals(e.code, DOMException.NOT_FOUND_ERR); + } + check_report_format(await report); +}, "requestPort in serial report only mode"); + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + + await navigator.serial.getPorts(); + check_report_format(await report); +}, "getPorts in serial report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-report-only.https.html.headers new file mode 100644 index 0000000..cee2639 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: serial=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-reporting.https.html new file mode 100644 index 0000000..827bc893 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-reporting.https.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='/resources/testdriver.js'></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "serial"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + + await test_driver.bless('Activate document for serial.requestPort'); + try { + await navigator.serial.requestPort({ filters: [] }); + assert_unreached("Serial port access should not be allowed in this document."); + } catch (e) { + assert_equals(e.code, DOMException.SECURITY_ERR); + } + check_report_format(await report); +}, "requestPort in serial reporting mode"); + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + + try { + await navigator.serial.getPorts(); + assert_unreached("Serial port access should not be allowed in this document."); + } catch (e) { + assert_equals(e.code, DOMException.SECURITY_ERR); + } + check_report_format(await report); +}, "getPorts in serial reporting mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-reporting.https.html.headers new file mode 100644 index 0000000..690b696 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/serial-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: serial=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-report-only.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-report-only.html new file mode 100644 index 0000000..76d26ed --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-report-only.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +const check_report_format = ([reports, observer]) => { + const report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "sync-xhr"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + const xhr = new XMLHttpRequest(); + xhr.open("GET", document.location.href, false); + xhr.send(); + check_report_format(await report); +}, "Sync-xhr report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-report-only.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-report-only.html.headers new file mode 100644 index 0000000..ce91404 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-report-only.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: sync-xhr=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-reporting.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-reporting.html new file mode 100644 index 0000000..5427bfd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-reporting.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='../resources/permissions-policy-report-json.js'></script> + </head> + <body> + <script> +var t = async_test("Sync-xhr Report Format"); + +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "sync-xhr"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); + check_report_json(report); +}; + +new ReportingObserver(t.step_func_done(check_report_format), + {types: ['feature-policy-violation']}).observe(); + +t.step_func(() => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", document.location.href, false); + assert_throws_dom('NetworkError', + () => xhr.send(), + "Synchronous XHR.send should throw an exception when disabled"); +})(); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-reporting.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-reporting.html.headers new file mode 100644 index 0000000..7f375e0b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/sync-xhr-reporting.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: sync-xhr=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-report-only.https.html new file mode 100644 index 0000000..7933e9eb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-report-only.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + <script src='/resources/testdriver.js'></script> + <script src="/resources/testdriver-vendor.js"></script> + </head> + <body> + <div id='fs'></div> + <script> +var check_report_format = ([reports, observer]) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.body.featureId, "usb"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await test_driver.bless('Activate document for USB'); + await navigator.usb.getDevices(); + check_report_format(await report); +}, "USB report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-report-only.https.html.headers new file mode 100644 index 0000000..f4b92ea --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: usb=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-reporting.https.html new file mode 100644 index 0000000..a63f301 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-reporting.https.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var t = async_test("USB Report Format"); + +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "usb"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +new ReportingObserver(t.step_func_done(check_report_format), + {types: ['feature-policy-violation']}).observe(); + +navigator.usb.getDevices().then( + t.unreached_func("USB device access should not be allowed in this document.") +).catch(() => {}); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-reporting.https.html.headers new file mode 100644 index 0000000..ff22d62f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/usb-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: usb=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-report-only.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-report-only.https.html new file mode 100644 index 0000000..ead03d6a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-report-only.https.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +const check_report_format = ([reports, observer]) => { + const report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "xr-spatial-tracking"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "report"); +}; + +promise_test(async t => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + try { + let supported = await navigator.xr.isSessionSupported('immersive-vr'); + } catch (err) { + // IsSessionSupported should only throw with a permissions policy violation; + // however, inline does not trigger the permissions policy, + // so immersive-vr must be used. + assert_unreached("isSessionSupported should not throw in ReportOnly mode"); + } + check_report_format(await report); +}, "XR report only mode"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-report-only.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-report-only.https.html.headers new file mode 100644 index 0000000..141deb4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-report-only.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy-Report-Only: xr-spatial-tracking=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-reporting.https.html b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-reporting.https.html new file mode 100644 index 0000000..3d62923 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-reporting.https.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <head> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> + </head> + <body> + <script> +var check_report_format = (reports, observer) => { + let report = reports[0]; + assert_equals(report.type, "feature-policy-violation"); + assert_equals(report.url, document.location.href); + assert_equals(report.body.featureId, "xr-spatial-tracking"); + assert_equals(report.body.sourceFile, document.location.href); + assert_equals(typeof report.body.lineNumber, "number"); + assert_equals(typeof report.body.columnNumber, "number"); + assert_equals(report.body.disposition, "enforce"); +}; + +promise_test(async (t) => { + const report = new Promise(resolve => { + new ReportingObserver((reports, observer) => resolve([reports, observer]), + {types: ['feature-policy-violation']}).observe(); + }); + await promise_rejects_dom(t, 'SecurityError', + navigator.xr.isSessionSupported('immersive-vr'), + "XR spatial tracking should not be allowed in this document."); + const [reports, observer] = await report; + check_report_format(reports, observer); +}, "XR Report Format"); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-reporting.https.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-reporting.https.html.headers new file mode 100644 index 0000000..56b8c11 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/reporting/xr-reporting.https.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: xr-spatial-tracking=()
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/autoplay.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/autoplay.js new file mode 100644 index 0000000..56780cf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/autoplay.js
@@ -0,0 +1,28 @@ + + +function simulateGesture(t, callback) { + // Get or create the target element. + let target = document.getElementById('target'); + if (!target) { + target = document.createElement('button'); + target.setAttribute('id', 'target'); + document.body.appendChild(target); + } + + // Simulate a gesture in the top frame to remove any gesture based autoplay + // restrictions. + test_driver.click(target).then(callback, t.unreached_func('click failed')); +} + +function isAutoplayAllowed() { + return new Promise((resolve, reject) => { + const video = document.createElement('video'); + video.src = getVideoURI('/media/A4'); + video.play().then(() => resolve(true), (e) => { + if (e.name == 'NotAllowedError') + resolve(false); + else + resolve(true); + }); + }); +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/nested-sandbox.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/nested-sandbox.html new file mode 100644 index 0000000..4ba5121 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/nested-sandbox.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<title>Return fullscreen permissions policy state</title> +<script> + "use strict"; + window.onload = () => { + window.parent.postMessage(document.featurePolicy.allowedFeatures().includes("fullscreen"),"*"); + }; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-allowedfeatures.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-allowedfeatures.html new file mode 100644 index 0000000..f4b02027 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-allowedfeatures.html
@@ -0,0 +1,7 @@ +<script> +'use strict'; + +window.onload = function() { + parent.postMessage(document.featurePolicy.allowedFeatures(), '*'); +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-autoplay.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-autoplay.html new file mode 100644 index 0000000..665d19b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-autoplay.html
@@ -0,0 +1,11 @@ +<script src="/common/media.js"></script> +<script src=/permissions-policy/resources/autoplay.js></script> +<script> +'use strict'; + +window.addEventListener('load', () => { + isAutoplayAllowed().then((result) => { + window.parent.postMessage({ enabled: result }, '*'); + }); +}, { once: true }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-battery.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-battery.html new file mode 100644 index 0000000..dff4b32 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-battery.html
@@ -0,0 +1,9 @@ +<script> +'use strict'; + +Promise.resolve().then(() => navigator.getBattery()).then(battery => { + window.parent.postMessage({ enabled: true }, '*'); +}, error => { + window.parent.postMessage({ enabled: false }, '*'); +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-clipboard-read.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-clipboard-read.html new file mode 100644 index 0000000..10fc45f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-clipboard-read.html
@@ -0,0 +1,20 @@ +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script> +'use strict'; + +(async () => { + try { + // TODO(https://crbug.com/1074482): Cross-origin focus is asynchronous and + // requires user gesture. Implement testing support for cross-origin focus. + window.focus(); // The Clipboard API requires focus. + + await test_driver.set_permission({ name: 'clipboard-read' }, 'granted'); + await navigator.clipboard.readText('test text'); + + window.parent.postMessage({ enabled: true }, "*"); + } catch (e) { + window.parent.postMessage({ enabled: false }, "*"); + } +})(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-clipboard-write.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-clipboard-write.html new file mode 100644 index 0000000..7eb96e3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-clipboard-write.html
@@ -0,0 +1,20 @@ +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script> +'use strict'; + +(async () => { + try { + // TODO(https://crbug.com/1074482): Cross-origin focus is asynchronous and + // requires user gesture. Implement testing support for cross-origin focus. + window.focus(); // The Clipboard API requires focus. + + await test_driver.set_permission({ name: 'clipboard-write' }, 'granted'); + await navigator.clipboard.writeText('test text'); + + window.parent.postMessage({ enabled: true }, "*"); + } catch (e) { + window.parent.postMessage({ enabled: false }, "*"); + } +})(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-generic-sensor.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-generic-sensor.html new file mode 100644 index 0000000..59652e2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-generic-sensor.html
@@ -0,0 +1,11 @@ +<script> +"use strict"; + +try { + const sensorName = location.hash.substring(1); + const sensor = new window[sensorName](); + window.parent.postMessage({ enabled: true }, "*"); +} catch (e) { + window.parent.postMessage({ enabled: false }, "*"); +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection-worker.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection-worker.html new file mode 100644 index 0000000..5bcc398 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection-worker.html
@@ -0,0 +1,10 @@ +<script> +'use strict'; + +let worker = new Worker('permissions-policy-idle-detection-worker.js'); + +worker.onmessage = event => { + window.parent.postMessage(event.data, '*'); +}; +worker.postMessage({ type: 'ready' }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection-worker.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection-worker.js new file mode 100644 index 0000000..2e4e3cd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection-worker.js
@@ -0,0 +1,16 @@ +'use strict'; + +// Dedicated worker +if (typeof postMessage === 'function') { + onmessage = event => { + switch(event.data.type) { + case 'ready': + new IdleDetector().start().then(() => { + postMessage({ enabled: true }); + }, error => { + postMessage ({ enabled: false }); + }); + break; + } + }; +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection.html new file mode 100644 index 0000000..65a5781 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-idle-detection.html
@@ -0,0 +1,10 @@ +<script> +'use strict'; + +new IdleDetector().start().then(() => { + window.parent.postMessage({ enabled: true }, '*'); +}, error => { + window.parent.postMessage({ enabled: false }, '*'); +}); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-nested-subframe-policy.https.sub.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-nested-subframe-policy.https.sub.html new file mode 100644 index 0000000..4c012bba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-nested-subframe-policy.https.sub.html
@@ -0,0 +1,57 @@ +<!DOCTYPE html> +<body> +<script> +'use strict'; +const same_origin_src = '/permissions-policy/resources/permissions-policy-allowedfeatures.html'; +const cross_origin_src = 'https://{{domains[www1]}}:{{ports[https][0]}}' + same_origin_src; +const subframe_header_policy = '?pipe=header(Permissions-Policy,fullscreen='; +const policy_all = '*'; +const policy_self = 'self'; +const policy_none = '\\(\\)'; + +// Messages gathered from subframes. When all subframe messages are gathered, +// it will be send back to top level frame. +const subframe_messages = []; + +let local_frame_all = document.createElement('iframe'); +let local_frame_self = document.createElement('iframe'); +let local_frame_none = document.createElement('iframe'); +local_frame_all.src = same_origin_src + subframe_header_policy + policy_all + ')'; +local_frame_self.src = same_origin_src + subframe_header_policy + policy_self + ')'; +local_frame_none.src = same_origin_src + subframe_header_policy + policy_none + ')'; + +let remote_frame_all = document.createElement('iframe'); +let remote_frame_self = document.createElement('iframe'); +let remote_frame_none = document.createElement('iframe'); +remote_frame_all.src = cross_origin_src + subframe_header_policy + policy_all + ')'; +remote_frame_self.src = cross_origin_src + subframe_header_policy + policy_self + ')'; +remote_frame_none.src = cross_origin_src + subframe_header_policy + policy_none + ')'; + +window.addEventListener('message', function(evt) { + if (evt.source === local_frame_all.contentWindow) { + subframe_messages.push({frame: 'local', policy: policy_all, allowedfeatures: evt.data}); + } else if (evt.source === local_frame_self.contentWindow) { + subframe_messages.push({frame: 'local', policy: policy_self, allowedfeatures: evt.data}); + } else if (evt.source === local_frame_none.contentWindow) { + subframe_messages.push({frame: 'local', policy: policy_none, allowedfeatures: evt.data}); + } else if (evt.source === remote_frame_all.contentWindow) { + subframe_messages.push({frame: 'remote', policy: policy_all, allowedfeatures: evt.data}); + } else if (evt.source === remote_frame_self.contentWindow) { + subframe_messages.push({frame: 'remote', policy: policy_self, allowedfeatures: evt.data}); + } else if (evt.source === remote_frame_none.contentWindow) { + subframe_messages.push({frame: 'remote', policy: policy_none, allowedfeatures: evt.data}); + } + + if (subframe_messages.length == 6) + parent.postMessage(subframe_messages, '*'); +}); + +document.body.appendChild(local_frame_all); +document.body.appendChild(local_frame_self); +document.body.appendChild(local_frame_none); +document.body.appendChild(remote_frame_all); +document.body.appendChild(remote_frame_self); +document.body.appendChild(remote_frame_none); +</script> +</body> +
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-payment.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-payment.html new file mode 100644 index 0000000..401a86e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-payment.html
@@ -0,0 +1,16 @@ +<script> +'use strict'; + +window.onload = function() { + var supportedInstruments = [ { supportedMethods: [ 'visa' ] } ]; + var details = { + total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } } + }; + try { + new PaymentRequest(supportedInstruments, details); + parent.postMessage({ enabled: true }, '*'); + } catch (e) { + parent.postMessage({ enabled: false }, '*'); + } +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-picture-in-picture.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-picture-in-picture.html new file mode 100644 index 0000000..b24e56b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-picture-in-picture.html
@@ -0,0 +1,11 @@ +<script src=/common/media.js></script> +<script src=/permissions-policy/resources/picture-in-picture.js></script> +<script> +'use strict'; + +window.addEventListener('load', () => { + isPictureInPictureAllowed().then(result => { + window.parent.postMessage({ enabled: result }, '*'); + }); +}, { once: true }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-report-json.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-report-json.js new file mode 100644 index 0000000..ad84ff9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-report-json.js
@@ -0,0 +1,20 @@ +/** + * @fileoverview functions for ensuring permissions policy report is serializable + */ + +const check_report_json = (report) => { + // Ensures toJSON method exists on report. + assert_equals(typeof report.toJSON, "function"); + const report_json = report.toJSON(); + // Ensures toJSON() call is successful. + assert_equals(report.type, report_json.type); + assert_equals(report.url, report_json.url); + assert_equals(report.body.featureId, report_json.body.featureId); + assert_equals(report.body.disposition, report_json.body.disposition); + assert_equals(report.body.sourceFile, report_json.body.sourceFile); + assert_equals(report.body.lineNumber, report_json.body.lineNumber); + assert_equals(report.body.columnNumber, report_json.body.columnNumber); + // Ensures JSON.stringify() serializes the report correctly. + assert_false(JSON.stringify(report) === "{}"); + assert_equals(JSON.stringify(report), JSON.stringify(report_json)); +} \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-screen-wakelock.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-screen-wakelock.html new file mode 100644 index 0000000..6feed51 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-screen-wakelock.html
@@ -0,0 +1,18 @@ +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script> +"use strict"; + +Promise.resolve().then(async () => { + try { + await test_driver.set_permission( + { name: 'screen-wake-lock' }, 'granted', false); + + const wakeLock = await navigator.wakeLock.request("screen"); + await wakeLock.release(); + window.parent.postMessage({ enabled: true }, "*"); + } catch (e) { + window.parent.postMessage({ enabled: false }, "*"); + } +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial-worker.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial-worker.html new file mode 100644 index 0000000..56bcfae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial-worker.html
@@ -0,0 +1,10 @@ +<script> +'use strict'; + +let worker = new Worker('permissions-policy-serial-worker.js'); + +worker.onmessage = event => { + window.parent.postMessage(event.data, '*'); +}; +worker.postMessage({ type: 'ready' }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial-worker.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial-worker.js new file mode 100644 index 0000000..2e8e6f5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial-worker.js
@@ -0,0 +1,14 @@ +'use strict'; + +// Dedicated worker +if (typeof postMessage === 'function') { + onmessage = event => { + switch(event.data.type) { + case 'ready': + navigator.serial.getPorts().then( + () => postMessage({ enabled: true }), + error => postMessage ({ enabled: false })); + break; + } + }; +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial.html new file mode 100644 index 0000000..caf716d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-serial.html
@@ -0,0 +1,9 @@ +<script> +'use strict'; + +navigator.serial.getPorts().then(ports => { + window.parent.postMessage({ enabled: true }, '*'); +}, error => { + window.parent.postMessage({ enabled: false }, '*'); +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb-worker.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb-worker.html new file mode 100644 index 0000000..e50ac55a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb-worker.html
@@ -0,0 +1,10 @@ +<script> +'use strict'; + +let worker = new Worker('permissions-policy-usb-worker.js'); + +worker.onmessage = event => { + window.parent.postMessage(event.data, '*'); +}; +worker.postMessage({ type: 'ready' }); +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb-worker.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb-worker.js new file mode 100644 index 0000000..c294f14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb-worker.js
@@ -0,0 +1,14 @@ +'use strict'; + +// Dedicated worker +if (typeof postMessage === 'function') { + onmessage = event => { + switch(event.data.type) { + case 'ready': + navigator.usb.getDevices().then( + () => postMessage({ enabled: true }), + error => postMessage ({ enabled: false })); + break; + } + }; +} \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb.html new file mode 100644 index 0000000..99d47c6f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy-usb.html
@@ -0,0 +1,9 @@ +<script> +'use strict'; + +Promise.resolve().then(() => navigator.usb.getDevices()).then(devices => { + window.parent.postMessage({ enabled: true }, '*'); +}, error => { + window.parent.postMessage({ enabled: false }, '*'); +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy.js new file mode 100644 index 0000000..1c5bf97 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/permissions-policy.js
@@ -0,0 +1,438 @@ +// Feature test to avoid timeouts +function assert_permissions_policy_supported() { + assert_not_equals(document.featurePolicy, undefined, + 'permissions policy is supported'); +} +// Tests whether a feature that is enabled/disabled by permissions policy works +// as expected. +// Arguments: +// feature_description: a short string describing what feature is being +// tested. Examples: "usb.GetDevices()", "PaymentRequest()". +// test: test created by testharness. Examples: async_test, promise_test. +// src: URL where a feature's availability is checked. Examples: +// "/permissions-policy/resources/permissions-policy-payment.html", +// "/permissions-policy/resources/permissions-policy-usb.html". +// expect_feature_available: a callback(data, feature_description) to +// verify if a feature is available or unavailable as expected. +// The file under the path "src" defines what "data" is sent back as a +// pistMessage. Inside the callback, some tests (e.g., EXPECT_EQ, +// EXPECT_TRUE, etc) are run accordingly to test a feature's +// availability. +// Example: expect_feature_available_default(data, feature_description). +// feature_name: Optional argument, only provided when testing iframe allow +// attribute. "feature_name" is the feature name of a policy controlled +// feature (https://wicg.github.io/permissions-policy/#features). +// See examples at: +// https://github.com/WICG/permissions-policy/blob/master/features.md +// allow_attribute: Optional argument, only used for testing fullscreen or +// payment: either "allowfullscreen" or "allowpaymentrequest" is passed. +function test_feature_availability( + feature_description, test, src, expect_feature_available, feature_name, + allow_attribute) { + let frame = document.createElement('iframe'); + frame.src = src; + + if (typeof feature_name !== 'undefined') { + frame.allow = frame.allow.concat(";" + feature_name); + } + + if (typeof allow_attribute !== 'undefined') { + frame.setAttribute(allow_attribute, true); + } + + window.addEventListener('message', test.step_func(function handler(evt) { + if (evt.source === frame.contentWindow) { + expect_feature_available(evt.data, feature_description); + document.body.removeChild(frame); + window.removeEventListener('message', handler); + test.done(); + } + })); + + document.body.appendChild(frame); +} + +// Default helper functions to test a feature's availability: +function expect_feature_available_default(data, feature_description) { + assert_true(data.enabled, feature_description); +} + +function expect_feature_unavailable_default(data, feature_description) { + assert_false(data.enabled, feature_description); +} + +// This is the same as test_feature_availability() but instead of passing in a +// function to check the result of the message sent back from an iframe, instead +// just compares the result to an expected result passed in. +// Arguments: +// test: test created by testharness. Examples: async_test, promise_test. +// src: the URL to load in an iframe in which to test the feature. +// expected_result: the expected value to compare to the data passed back +// from the src page by postMessage. +// allow_attribute: Optional argument, only provided when an allow +// attribute should be specified on the iframe. +function test_feature_availability_with_post_message_result( + test, src, expected_result, allow_attribute) { + var test_result = function(data, feature_description) { + assert_equals(data, expected_result); + }; + test_feature_availability(null, test, src, test_result, allow_attribute); +} + +// If this page is intended to test the named feature (according to the URL), +// tests the feature availability and posts the result back to the parent. +// Otherwise, does nothing. +function test_feature_in_iframe(feature_name, feature_promise_factory) { + if (location.hash.endsWith(`#${feature_name}`)) { + feature_promise_factory().then( + () => window.parent.postMessage('#OK', '*'), + (e) => window.parent.postMessage('#' + e.name, '*')); + } +} + +// Returns true if the URL for this page indicates that it is embedded in an +// iframe. +function page_loaded_in_iframe() { + return location.hash.startsWith('#iframe'); +} + +// Returns a same-origin (relative) URL suitable for embedding in an iframe for +// testing the availability of the feature. +function same_origin_url(feature_name) { + // Append #iframe to the URL so we can detect the iframe'd version of the + // page. + return location.pathname + '#iframe#' + feature_name; +} + +// Returns a cross-origin (absolute) URL suitable for embedding in an iframe for +// testing the availability of the feature. +function cross_origin_url(base_url, feature_name) { + return base_url + same_origin_url(feature_name); +} + +// This function runs all permissions policy tests for a particular feature that +// has a default policy of "self". This includes testing: +// 1. Feature usage succeeds by default in the top level frame. +// 2. Feature usage succeeds by default in a same-origin iframe. +// 3. Feature usage fails by default in a cross-origin iframe. +// 4. Feature usage succeeds when an allow attribute is specified on a +// cross-origin iframe. +// +// The same page which called this function will be loaded in the iframe in +// order to test feature usage there. When this function is called in that +// context it will simply run the feature and return a result back via +// postMessage. +// +// Arguments: +// cross_origin: A cross-origin URL base to be used to load the page which +// called into this function. +// feature_name: The name of the feature as it should be specified in an +// allow attribute. +// error_name: If feature usage does not succeed, this is the string +// representation of the error that will be passed in the rejected +// promise. +// feature_promise_factory: A function which returns a promise which tests +// feature usage. If usage succeeds, the promise should resolve. If it +// fails, the promise should reject with an error that can be +// represented as a string. +function run_all_fp_tests_allow_self( + cross_origin, feature_name, error_name, feature_promise_factory) { + // This may be the version of the page loaded up in an iframe. If so, just + // post the result of running the feature promise back to the parent. + if (page_loaded_in_iframe()) { + test_feature_in_iframe(feature_name, feature_promise_factory); + return; + } + + // Run the various tests. + // 1. Allowed in top-level frame. + promise_test( + () => feature_promise_factory(), + 'Default "' + feature_name + + '" permissions policy ["self"] allows the top-level document.'); + + // 2. Allowed in same-origin iframe. + const same_origin_frame_pathname = same_origin_url(feature_name); + async_test( + t => { + test_feature_availability_with_post_message_result( + t, same_origin_frame_pathname, '#OK'); + }, + 'Default "' + feature_name + + '" permissions policy ["self"] allows same-origin iframes.'); + + // 3. Blocked in cross-origin iframe. + const cross_origin_frame_url = cross_origin_url(cross_origin, feature_name); + async_test( + t => { + test_feature_availability_with_post_message_result( + t, cross_origin_frame_url, '#' + error_name); + }, + 'Default "' + feature_name + + '" permissions policy ["self"] disallows cross-origin iframes.'); + + // 4. Allowed in cross-origin iframe with "allow" attribute. + async_test( + t => { + test_feature_availability_with_post_message_result( + t, cross_origin_frame_url, '#OK', feature_name); + }, + 'permissions policy "' + feature_name + + '" can be enabled in cross-origin iframes using "allow" attribute.'); +} + +// This function runs all permissions policy tests for a particular feature that +// has a default policy of "*". This includes testing: +// 1. Feature usage succeeds by default in the top level frame. +// 2. Feature usage succeeds by default in a same-origin iframe. +// 3. Feature usage succeeds by default in a cross-origin iframe. +// 4. Feature usage fails when an allow attribute is specified on a +// cross-origin iframe with a value of "feature-name 'none'". +// +// The same page which called this function will be loaded in the iframe in +// order to test feature usage there. When this function is called in that +// context it will simply run the feature and return a result back via +// postMessage. +// +// Arguments: +// cross_origin: A cross-origin URL base to be used to load the page which +// called into this function. +// feature_name: The name of the feature as it should be specified in an +// allow attribute. +// error_name: If feature usage does not succeed, this is the string +// representation of the error that will be passed in the rejected +// promise. +// feature_promise_factory: A function which returns a promise which tests +// feature usage. If usage succeeds, the promise should resolve. If it +// fails, the promise should reject with an error that can be +// represented as a string. +function run_all_fp_tests_allow_all( + cross_origin, feature_name, error_name, feature_promise_factory) { + // This may be the version of the page loaded up in an iframe. If so, just + // post the result of running the feature promise back to the parent. + if (page_loaded_in_iframe()) { + test_feature_in_iframe(feature_name, feature_promise_factory); + return; + } + + // Run the various tests. + // 1. Allowed in top-level frame. + promise_test( + () => feature_promise_factory(), + 'Default "' + feature_name + + '" permissions policy ["*"] allows the top-level document.'); + + // 2. Allowed in same-origin iframe. + const same_origin_frame_pathname = same_origin_url(feature_name); + async_test( + t => { + test_feature_availability_with_post_message_result( + t, same_origin_frame_pathname, '#OK'); + }, + 'Default "' + feature_name + + '" permissions policy ["*"] allows same-origin iframes.'); + + // 3. Allowed in cross-origin iframe. + const cross_origin_frame_url = cross_origin_url(cross_origin, feature_name); + async_test( + t => { + test_feature_availability_with_post_message_result( + t, cross_origin_frame_url, '#OK'); + }, + 'Default "' + feature_name + + '" permissions policy ["*"] allows cross-origin iframes.'); + + // 4. Blocked in cross-origin iframe with "allow" attribute set to 'none'. + async_test( + t => { + test_feature_availability_with_post_message_result( + t, cross_origin_frame_url, '#' + error_name, + feature_name + " 'none'"); + }, + 'permissions policy "' + feature_name + + '" can be disabled in cross-origin iframes using "allow" attribute.'); + + // 5. Blocked in same-origin iframe with "allow" attribute set to 'none'. + async_test( + t => { + test_feature_availability_with_post_message_result( + t, same_origin_frame_pathname, '#' + error_name, + feature_name + " 'none'"); + }, + 'permissions policy "' + feature_name + + '" can be disabled in same-origin iframes using "allow" attribute.'); +} + +// This function tests that a subframe's document policy allows a given feature. +// A feature is allowed in a frame either through inherited policy or specified +// by iframe allow attribute. +// Arguments: +// test: test created by testharness. Examples: async_test, promise_test. +// feature: feature name that should be allowed in the frame. +// src: the URL to load in the frame. +// allow: the allow attribute (container policy) of the iframe +function test_allowed_feature_for_subframe(message, feature, src, allow) { + let frame = document.createElement('iframe'); + if (typeof allow !== 'undefined') { + frame.allow = allow; + } + promise_test(function() { + assert_permissions_policy_supported(); + frame.src = src; + return new Promise(function(resolve, reject) { + window.addEventListener('message', function handler(evt) { + resolve(evt.data); + }, { once: true }); + document.body.appendChild(frame); + }).then(function(data) { + assert_true(data.includes(feature), feature); + }); + }, message); +} + +// This function tests that a subframe's document policy disallows a given +// feature. A feature is allowed in a frame either through inherited policy or +// specified by iframe allow attribute. +// Arguments: +// test: test created by testharness. Examples: async_test, promise_test. +// feature: feature name that should not be allowed in the frame. +// src: the URL to load in the frame. +// allow: the allow attribute (container policy) of the iframe +function test_disallowed_feature_for_subframe(message, feature, src, allow) { + let frame = document.createElement('iframe'); + if (typeof allow !== 'undefined') { + frame.allow = allow; + } + promise_test(function() { + assert_permissions_policy_supported(); + frame.src = src; + return new Promise(function(resolve, reject) { + window.addEventListener('message', function handler(evt) { + resolve(evt.data); + }, { once: true }); + document.body.appendChild(frame); + }).then(function(data) { + assert_false(data.includes(feature), feature); + }); + }, message); +} + +// This function tests that a subframe with header policy defined on a given +// feature allows and disallows the feature as expected. +// Arguments: +// feature: feature name. +// frame_header_policy: either *, self or \\(\\), defines the frame +// document's header policy on |feature|. +// '(' and ')' need to be escaped because of server end +// header parameter syntax limitation. +// src: the URL to load in the frame. +// test_expects: contains 6 expected results of either |feature| is allowed +// or not inside of a local or remote iframe nested inside +// the subframe given the header policy to be either *, +// self, or (). +// test_name: name of the test. +function test_subframe_header_policy( + feature, frame_header_policy, src, test_expects, test_name) { + let frame = document.createElement('iframe'); + promise_test(function() { + assert_permissions_policy_supported() + frame.src = src + '?pipe=sub|header(Permissions-Policy,' + feature + '=' + + frame_header_policy + ')'; + return new Promise(function(resolve) { + window.addEventListener('message', function handler(evt) { + resolve(evt.data); + }); + document.body.appendChild(frame); + }).then(function(results) { + for (var j = 0; j < results.length; j++) { + var data = results[j]; + + function test_result(message, test_expect) { + if (test_expect) { + assert_true(data.allowedfeatures.includes(feature), message); + } else { + assert_false(data.allowedfeatures.includes(feature), message); + } + } + + if (data.frame === 'local') { + if (data.policy === '*') { + test_result('local_all:', test_expects.local_all); + } + if (data.policy === 'self') { + test_result('local_self:', test_expects.local_self); + } + if (data.policy === '\\(\\)') { + test_result('local_none:', test_expects.local_none); + } + } + + if (data.frame === 'remote') { + if (data.policy === '*') { + test_result('remote_all:', test_expects.remote_all); + } + if (data.policy === 'self') { + test_result('remote_self:', test_expects.remote_self); + } + if (data.policy === '\\(\\)') { + test_result('remote_none:', test_expects.remote_none); + } + } + } + }); + }, test_name); +} + +// This function tests that frame policy allows a given feature correctly. A +// feature is allowed in a frame either through inherited policy or specified +// by iframe allow attribute. +// Arguments: +// feature: feature name. +// src: the URL to load in the frame. If undefined, the iframe will have a +// srcdoc="" attribute +// test_expect: boolean value of whether the feature should be allowed. +// allow: optional, the allow attribute (container policy) of the iframe. +// allowfullscreen: optional, boolean value of allowfullscreen attribute. +// sandbox: optional boolean. If true, the frame will be sandboxed (with +// allow-scripts, so that tests can run in it.) +function test_frame_policy( + feature, src, srcdoc, test_expect, allow, allowfullscreen, sandbox) { + let frame = document.createElement('iframe'); + document.body.appendChild(frame); + // frame_policy should be dynamically updated as allow and allowfullscreen is + // updated. + var frame_policy = frame.permissionsPolicy; + if (typeof allow !== 'undefined') { + frame.setAttribute('allow', allow); + } + if (!!allowfullscreen) { + frame.setAttribute('allowfullscreen', true); + } + if (!!sandbox) { + frame.setAttribute('sandbox', 'allow-scripts'); + } + if (!!src) { + frame.src = src; + } + if (!!srcdoc) { + frame.srcdoc = "<h1>Hello world!</h1>"; + } + if (test_expect) { + assert_true(frame_policy.allowedFeatures().includes(feature)); + } else { + assert_false(frame_policy.allowedFeatures().includes(feature)); + } +} + +function expect_reports(report_count, policy_name, description) { + async_test(t => { + var num_received_reports = 0; + new ReportingObserver(t.step_func((reports, observer) => { + const relevant_reports = reports.filter(r => (r.body.featureId === policy_name)); + num_received_reports += relevant_reports.length; + if (num_received_reports >= report_count) { + t.done(); + } + }), {types: ['feature-policy-violation'], buffered: true}).observe(); + }, description); +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/picture-in-picture.js b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/picture-in-picture.js new file mode 100644 index 0000000..1bf3c1c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/picture-in-picture.js
@@ -0,0 +1,30 @@ +function async_pip_test(func, name) { + async_test(t => { + assert_true('pictureInPictureEnabled' in document, 'Picture-in-Picture API is available'); + func(t); + }, name); +} + +function promise_pip_test(func, name) { + promise_test(async t => { + assert_true('pictureInPictureEnabled' in document, 'Picture-in-Picture API is available'); + return func(t); + }, name); +} + +function isPictureInPictureAllowed() { + return new Promise(resolve => { + let video = document.createElement('video'); + video.src = getVideoURI('/media/movie_5'); + video.onloadedmetadata = () => { + video.requestPictureInPicture() + .then(() => resolve(document.pictureInPictureEnabled)) + .catch(e => { + if (e.name == 'NotAllowedError') + resolve(document.pictureInPictureEnabled); + else + resolve(false); + }); + }; + }); +}
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/redirect-on-load.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/redirect-on-load.html new file mode 100644 index 0000000..54d3cf5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/redirect-on-load.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<body> +<script> +// Automatically redirects the page to a new URL on load. +// Load this document with a URL like: +// "permissions-policy/resources/redirect-on-load.html#https://www.example.com/" +window.onload = function () { + document.location = document.location.hash.substring(1); +} +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/sandbox-self.html b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/sandbox-self.html new file mode 100644 index 0000000..8240de9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/sandbox-self.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<title>Return fullscreen permissions policy state from self and a sandboxed child frame</title> +<script> + "use strict"; + window.onload = () => { + let frame = document.createElement('iframe'); + frame.src = "/permissions-policy/resources/nested-sandbox.html"; + frame.sandbox = "allow-scripts"; + + var handle_message = evt => { + if (evt.source === frame.contentWindow) { + window.parent.postMessage({ + "child": document.featurePolicy.allowedFeatures().includes("fullscreen"), + "grandchild": evt.data + },"*"); + document.body.removeChild(frame); + window.removeEventListener('message', handle_message); + } + }; + window.addEventListener('message', handle_message); + document.body.appendChild(frame); + }; +</script>
diff --git a/third_party/blink/web_tests/external/wpt/permissions-policy/resources/sandbox-self.html.headers b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/sandbox-self.html.headers new file mode 100644 index 0000000..ff7ae41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/permissions-policy/resources/sandbox-self.html.headers
@@ -0,0 +1 @@ +Permissions-Policy: fullscreen=self
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py index f75587d..6110450 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
@@ -47,7 +47,6 @@ cache_manager, run_info_data, **kwargs) del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"] - del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"] capabilities = executor_kwargs["capabilities"] # Note that for WebLayer, we launch a test shell and have the test shell use # WebLayer.
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py index 8790567..d0773873 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
@@ -47,7 +47,6 @@ cache_manager, run_info_data, **kwargs) del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"] - del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"] capabilities = executor_kwargs["capabilities"] # Note that for WebView, we launch a test shell and have the test shell use WebView. # https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/webview-shell.md
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py index cd8c40f..485b96f 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -49,7 +49,6 @@ **kwargs) # Remove unsupported options on mobile. del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"] - del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"] assert kwargs["package_name"], "missing --package-name" executor_kwargs["capabilities"]["goog:chromeOptions"]["androidPackage"] = \
diff --git a/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative-automation.js b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative-automation.js new file mode 100644 index 0000000..00a1d2d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative-automation.js
@@ -0,0 +1,5 @@ +importAutomationScript('/permissions-policy/experimental-features/vertical-scroll.js'); + +function inject_input(direction) { + return touchScroll(direction, window.innerWidth / 2, window.innerHeight / 2); +}
diff --git a/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative-automation.js b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative-automation.js new file mode 100644 index 0000000..00a1d2d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-main-frame-manual.tentative-automation.js
@@ -0,0 +1,5 @@ +importAutomationScript('/permissions-policy/experimental-features/vertical-scroll.js'); + +function inject_input(direction) { + return touchScroll(direction, window.innerWidth / 2, window.innerHeight / 2); +}
diff --git a/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-touch-action-manual.tentative-automation.js b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-touch-action-manual.tentative-automation.js new file mode 100644 index 0000000..00a1d2d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-touch-action-manual.tentative-automation.js
@@ -0,0 +1,5 @@ +importAutomationScript('/permissions-policy/experimental-features/vertical-scroll.js'); + +function inject_input(direction) { + return touchScroll(direction, window.innerWidth / 2, window.innerHeight / 2); +}
diff --git a/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative-automation.js b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative-automation.js new file mode 100644 index 0000000..388b62a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-touch-block-manual.tentative-automation.js
@@ -0,0 +1,10 @@ +importAutomationScript('/permissions-policy/experimental-features/vertical-scroll.js'); + +function inject_scroll(direction) { + return touchScroll(direction, window.innerWidth / 2, window.innerHeight / 2); +} + +function inject_zoom(direction) { + let width = window.innerWidth, height = window.innerHeight; + return pinchZoom(direction, width / 4, height / 2, 3 * width / 4, height / 2); +}
diff --git a/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative-automation.js b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative-automation.js new file mode 100644 index 0000000..7064ddd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative-automation.js
@@ -0,0 +1,5 @@ +importAutomationScript('/permissions-policy/experimental-features/vertical-scroll.js'); + +function inject_wheel_scroll(direction) { + return wheelScroll(direction, window.innerWidth / 2, window.innerHeight / 2); +}
diff --git a/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll.js b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll.js new file mode 100644 index 0000000..889522e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt_automation/permissions-policy/experimental-features/vertical-scroll.js
@@ -0,0 +1,115 @@ +const delta_for_scroll = 100; +// See synthetic_gesture_params.h. +const ScrollSource = { Touch: 1, Wheel : 2}; + +function ensurePlatformAPIExists() { + if (!window.chrome || !window.chrome.gpuBenchmarking) + throw "'gpuBenchmarking' needed for this test."; +} + +function waitForCompositorCommit() { + return new Promise((resolve) => { + // For now, we just rAF twice. It would be nice to have a proper mechanism + // for this. + window.requestAnimationFrame(() => { + window.requestAnimationFrame(resolve); + }); + }); +} + +function smoothScrollBy(scrollOffset, xPosition, yPosition, direction, source, speed, preciseScrollingDeltas) { + return new Promise(function(resolve, reject) { + if (window.chrome && chrome.gpuBenchmarking) { + var scrollOffsetX = 0; + var scrollOffsetY = 0; + if (direction == "down") { + scrollOffsetY = scrollOffset; + } else if (direction == "up") { + scrollOffsetY = -scrollOffset; + } else if (direction == "right") { + scrollOffsetX = scrollOffset; + } else if (direction == "left") { + scrollOffsetX = -scrollOffset; + } else if (direction == "upleft") { + scrollOffsetX = -scrollOffset; + scrollOffsetY = -scrollOffset; + } else if (direction == "upright") { + scrollOffsetX = scrollOffset; + scrollOffsetY = -scrollOffset; + } else if (direction == "downleft") { + scrollOffsetX = -scrollOffset; + scrollOffsetY = scrollOffset; + } else if (direction == "downright") { + scrollOffsetX = scrollOffset; + scrollOffsetY = scrollOffset; + } + chrome.gpuBenchmarking.smoothScrollByXY(scrollOffsetX, scrollOffsetY, resolve, xPosition, + yPosition, source, speed, preciseScrollingDeltas); + } else { + reject(); + } + }); +} + +async function touchScroll(direction, start_x, start_y) { + ensurePlatformAPIExists("touch"); + await waitForCompositorCommit(); + await smoothScrollBy(delta_for_scroll, start_x, start_y, direction, ScrollSource.Touch); + await waitForCompositorCommit(); +} + +function pinchZoomGesture( + touch_point_1, touch_point_2, move_offset, offset_upper_bound) { + return new Promise((resolve) => { + var pointerActions = [{'source': 'touch'}, {'source': 'touch'}]; + var pointerAction1 = pointerActions[0]; + var pointerAction2 = pointerActions[1]; + pointerAction1.actions = []; + pointerAction2.actions = []; + pointerAction1.actions.push( + {name: 'pointerDown', x: touch_point_1.x, y: touch_point_1.y}); + pointerAction2.actions.push( + {name: 'pointerDown', x: touch_point_2.x, y: touch_point_2.y}); + for (var offset = move_offset; offset < offset_upper_bound; offset += move_offset) { + pointerAction1.actions.push({ + name: 'pointerMove', + x: (touch_point_1.x - offset), + y: touch_point_1.y, + }); + pointerAction2.actions.push({ + name: 'pointerMove', + x: (touch_point_2.x + offset), + y: touch_point_2.y, + }); + } + pointerAction1.actions.push({name: 'pointerUp'}); + pointerAction2.actions.push({name: 'pointerUp'}); + chrome.gpuBenchmarking.pointerActionSequence(pointerActions, resolve); + }) +} + +async function pinchZoom(direction, start_x_1, start_y_1, start_x_2, start_y_2) { + ensurePlatformAPIExists("touch"); + let zoom_in = direction === "in"; + let delta = zoom_in ? -delta_for_scroll : delta_for_scroll; + let move_offset = 10; + let offset_upper_bound = 80; + await waitForCompositorCommit(); + await pinchZoomGesture( + {x: start_x_1, y: start_y_1}, + {x: start_x_2, y: start_y_2}, + move_offset, + offset_upper_bound); + await waitForCompositorCommit(); +} + +async function wheelScroll(direction, start_x, start_y) { + ensurePlatformAPIExists("wheel"); + await waitForCompositorCommit(); + await smoothScrollBy(delta_for_scroll, start_x, start_y, direction, ScrollSource.Wheel); + await waitForCompositorCommit(); +} + +window.input_api_ready = true; +if (window.resolve_on_input_api_ready) + window.resolve_on_input_api_ready();
diff --git a/third_party/blink/web_tests/resources/testharnessreport.js b/third_party/blink/web_tests/resources/testharnessreport.js index 4bec520d..c24e00e 100644 --- a/third_party/blink/web_tests/resources/testharnessreport.js +++ b/third_party/blink/web_tests/resources/testharnessreport.js
@@ -128,7 +128,8 @@ pathAndBase.startsWith('/css/cssom-view/') || pathAndBase.startsWith('/css/css-scroll-snap/') || pathAndBase.startsWith('/dom/events/') || - pathAndBase.startsWith('/feature-policy/experimental-features/')) { + pathAndBase.startsWith('/feature-policy/experimental-features/') || + pathAndBase.startsWith('/permissions-policy/experimental-features/')) { // Per-test automation scripts. src = automationPath + pathAndBase + '-automation.js'; } else {
diff --git a/third_party/blink/web_tests/virtual/threaded/external/wpt/permissions-policy/experimental-features/README.txt b/third_party/blink/web_tests/virtual/threaded/external/wpt/permissions-policy/experimental-features/README.txt new file mode 100644 index 0000000..526c4680 --- /dev/null +++ b/third_party/blink/web_tests/virtual/threaded/external/wpt/permissions-policy/experimental-features/README.txt
@@ -0,0 +1,2 @@ +# This suite runs the tests in external/wpt/permissions-policy/experimental-features +# with --enable-threaded-compositing \ No newline at end of file
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index c753e06..dea7d2a 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-10-3-3-g840ce58f9 -Revision: 840ce58f94bafdd24a138a9f7920becb5a30695f +Version: VER-2-10-3-4 +Revision: 80389cab7f5823e7c3b3fe4190a7c337439317de CPEPrefix: cpe:/a:freetype:freetype:2.10.1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/third_party/modp_b64/modp_b64_data.h b/third_party/modp_b64/modp_b64_data.h index fb85890..2ecf5977 100644 --- a/third_party/modp_b64/modp_b64_data.h +++ b/third_party/modp_b64/modp_b64_data.h
@@ -1,4 +1,3 @@ -#include "build/build_config.h" #include <stdint.h> #define CHAR62 '+'
diff --git a/tools/accessibility/inspect/ax_tree_server.cc b/tools/accessibility/inspect/ax_tree_server.cc index c355ae2..cdb699f 100644 --- a/tools/accessibility/inspect/ax_tree_server.cc +++ b/tools/accessibility/inspect/ax_tree_server.cc
@@ -83,9 +83,6 @@ if (filters_path.empty()) { return { ui::AXPropertyFilter("*", ui::AXPropertyFilter::ALLOW), -#if defined(OS_MAC) - ui::AXPropertyFilter("children", ui::AXPropertyFilter::DENY), -#endif }; }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 31dfa38..4d54c2a 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -21672,9 +21672,6 @@ <int value="201" label="AttestationExtensionWhitelist"/> <int value="202" label="DeviceLocalAccountAutoLoginBailoutEnabled"/> <int value="203" label="AllowScreenWakeLocks"/> - <int value="204" label="ContentPackDefaultFilteringBehavior"/> - <int value="205" label="ContentPackManualBehaviorHosts"/> - <int value="206" label="ContentPackManualBehaviorURLs"/> <int value="207" label="AttestationEnabledForDevice"/> <int value="208" label="AudioCaptureAllowedUrls"/> <int value="209" label="VideoCaptureAllowedUrls"/> @@ -42930,6 +42927,7 @@ <int value="-770319039" label="enable-touch-editing"/> <int value="-769865314" label="AutofillCacheQueryResponses:disabled"/> <int value="-766805224" label="MirroringService:enabled"/> + <int value="-764463072" label="WebViewMixedContentAutoupgrades:disabled"/> <int value="-763900417" label="CCTModuleUseIntentExtras:enabled"/> <int value="-763759697" label="enable-audio-support-for-desktop-share"/> <int value="-763730918" label="CCTTargetTranslateLanguage:disabled"/> @@ -42976,6 +42974,7 @@ <int value="-726892130" label="AndroidMessagesIntegration:disabled"/> <int value="-723224470" label="enable-password-force-saving:enabled"/> <int value="-722474177" label="browser-side-navigation:disabled"/> + <int value="-721685663" label="WebViewMixedContentAutoupgrades:enabled"/> <int value="-721245076" label="DesktopPWAsStayInWindow:disabled"/> <int value="-719819631" label="TranslateUI:disabled"/> <int value="-719698123" label="LegacyTLSWarnings:enabled"/> @@ -44148,6 +44147,7 @@ <int value="482429100" label="OmniboxClobberIsZeroSuggestEntrypoint:disabled"/> <int value="483155358" label="GlobalMediaControlsForChromeOS:disabled"/> + <int value="484596410" label="EnterpriseRealtimeExtensionRequest:disabled"/> <int value="485957747" label="finch-seed-ignore-pending-download"/> <int value="487810392" label="EnablePalmOnToolTypePalm:enabled"/> <int value="491334698" label="ConditionalTabStripAndroid:enabled"/> @@ -45577,6 +45577,7 @@ <int value="1926524951" label="SystemWebApps:disabled"/> <int value="1927218315" label="ShelfNewUi:disabled"/> <int value="1927259098" label="TranslateLanguageByULP:enabled"/> + <int value="1927374573" label="EnterpriseRealtimeExtensionRequest:enabled"/> <int value="1928407249" label="NewPhotoPicker:enabled"/> <int value="1929603041" label="HideShelfControlsInTabletMode:disabled"/> <int value="1930901873" label="disable-sync-app-list"/> @@ -77017,6 +77018,12 @@ <int value="2" label="Cross-domain redirect"/> </enum> +<enum name="WebViewMixedContentMode"> + <int value="0" label="Always allow"/> + <int value="1" label="Never allow"/> + <int value="2" label="Compatibility Mode"/> +</enum> + <enum name="WebViewOpenWebScreenPortion"> <int value="0" label="ZeroPercent"/> <int value="1" label="TenPercent"/>
diff --git a/tools/metrics/histograms/histograms_xml/android/histograms.xml b/tools/metrics/histograms/histograms_xml/android/histograms.xml index d099875..cf2ef55 100644 --- a/tools/metrics/histograms/histograms_xml/android/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/android/histograms.xml
@@ -1784,7 +1784,7 @@ </histogram> <histogram name="Android.PlayServices.Installed" enum="BooleanInstalled" - expires_after="M88"> + expires_after="2021-06-01"> <owner>twellington@chromium.org</owner> <owner>tedchoc@chromium.org</owner> <summary> @@ -1794,7 +1794,7 @@ </histogram> <histogram name="Android.PlayServices.Version" units="versioncode" - expires_after="M88"> + expires_after="2021-06-01"> <owner>twellington@chromium.org</owner> <owner>tedchoc@chromium.org</owner> <summary> @@ -2426,6 +2426,17 @@ </summary> </histogram> +<histogram name="Android.WebView.MixedContent.Mode" + enum="WebViewMixedContentMode" expires_after="M91"> + <owner>ntfschr@chromium.org</owner> + <owner>carlosil@chromium.org</owner> + <owner>src/android_webview/OWNERS</owner> + <summary> + Records the mixed content mode set when an app uses the + WebSettings.setMixedContentMode API. + </summary> +</histogram> + <histogram name="Android.WebView.NonEmbeddedMetrics.HistogramRecordAge" units="minutes" expires_after="2021-01-20"> <owner>hazems@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml index 9d7ca6e..d964cc7 100644 --- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -18143,6 +18143,7 @@ <suffix name="Complete" label="All indexes are scanned."/> <suffix name="ConnectionOpened" label="Scanning is interrupted by an new connection to the database."/> + <suffix name="ForceClose" label="Scanning is stopped by force closing."/> <suffix name="MaxIterations" label="Scanning is stopped because the maximum record iteration count was hit."/>
diff --git a/tools/metrics/histograms/histograms_xml/renderer4/histograms.xml b/tools/metrics/histograms/histograms_xml/renderer4/histograms.xml index 28d61ef..3dd95a7 100644 --- a/tools/metrics/histograms/histograms_xml/renderer4/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/renderer4/histograms.xml
@@ -22,7 +22,7 @@ <histograms> <histogram name="Renderer4.Browser.RasterTaskSchedulingDelayNoAtRasterDecodes" - units="microseconds" expires_after="2020-11-30"> + units="microseconds" expires_after="2021-09-30"> <owner>andrescj@chromium.org</owner> <owner>chromeos-gfx@google.com</owner> <summary> @@ -222,7 +222,7 @@ </histogram> <histogram name="Renderer4.Renderer.RasterTaskSchedulingDelayNoAtRasterDecodes" - units="microseconds" expires_after="2020-11-30"> + units="microseconds" expires_after="2021-09-30"> <owner>andrescj@chromium.org</owner> <owner>chromeos-gfx@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/stability/histograms.xml b/tools/metrics/histograms/histograms_xml/stability/histograms.xml index 8e7611c..3e55308a8 100644 --- a/tools/metrics/histograms/histograms_xml/stability/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/stability/histograms.xml
@@ -301,8 +301,9 @@ </histogram> <histogram name="Stability.Internals.SystemCrashCount" units="crashes" - expires_after="2020-10-11"> - <owner>siggi@chromium.org</owner> + expires_after="2021-10-20"> + <owner>davidbienvenu@chromium.org</owner> + <owner>jessemckenna@google.com</owner> <summary> Number of times a browser crash was detected, where the browser was last known to be alive in a Windows system session that terminated abnormally.
diff --git a/tools/metrics/histograms/histograms_xml/uma/histograms.xml b/tools/metrics/histograms/histograms_xml/uma/histograms.xml index 3911db14..a3be2bc 100644 --- a/tools/metrics/histograms/histograms_xml/uma/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/uma/histograms.xml
@@ -44,7 +44,7 @@ <histogram name="UMA.CleanExitBeaconConsistency" enum="UmaCleanExitConsistency" expires_after="M85"> - <owner>siggi@chromium.org</owner> + <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> Reports the combined state of distinct clean exit beacons stored in Local
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index c2ecea0d..8e41fa4 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -13855,9 +13855,13 @@ <event name="Worker.ClientAdded"> <owner>cfredric@google.com</owner> <summary> - Recorded when a client connects to an existing SharedWorker; records the - source IDs of the client (which may be a document or another worker), and - the type of the worker being connected to. + Recorded when a client connects to an existing SharedWorker or + ServiceWorker; records the source IDs of the client (which may be a document + or another worker), and the type of the worker being connected to. In the + case of a ServiceWorker, this is recorded for each worker-client pair that + could communicate (whether or not they actually do) and this is only + recorded once the client is execution ready. Note also that emission can be + caused by the creation of a new ServiceWorker or a new ServiceWorker client. </summary> <metric name="ClientSourceId"> <summary>
diff --git a/tools/perf/contrib/cluster_telemetry/OWNERS b/tools/perf/contrib/cluster_telemetry/OWNERS index e355ad1..c1ed7f9 100644 --- a/tools/perf/contrib/cluster_telemetry/OWNERS +++ b/tools/perf/contrib/cluster_telemetry/OWNERS
@@ -1,7 +1,6 @@ rmistry@chromium.org -# Uncomment when alexmt@ becomes a committer. -# per-file ad_tagging_ct.py=alexmt@chromium.org +per-file ad_tagging_ct.py=alexmt@chromium.org per-file ad_tagging_ct.py=johnidel@chromium.org per-file loading_ct.py=tdresser@chromium.org per-file loading_ct.py=maxlg@chromium.org
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index bba4017b..b14fa35 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -342,7 +342,9 @@ _performance_browser_tests(210), ]) _MAC_ARM_DTK_BENCHMARK_CONFIGS = PerfSuite([ - _GetBenchmarkConfig('blink_perf.css') + 'loading.desktop', +]).Abridge([ + 'loading.desktop', ]) _WIN_10_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([
diff --git a/tools/perf/core/shard_maps/mac-arm_dtk_arm-perf_map.json b/tools/perf/core/shard_maps/mac-arm_dtk_arm-perf_map.json index 875fce0..42c990c 100644 --- a/tools/perf/core/shard_maps/mac-arm_dtk_arm-perf_map.json +++ b/tools/perf/core/shard_maps/mac-arm_dtk_arm-perf_map.json
@@ -1,8 +1,8 @@ { "0": { "benchmarks": { - "blink_perf.css": { - "abridged": false + "loading.desktop": { + "abridged": true } } }
diff --git a/tools/perf/core/shard_maps/mac-arm_dtk_x86-perf_map.json b/tools/perf/core/shard_maps/mac-arm_dtk_x86-perf_map.json index 875fce0..42c990c 100644 --- a/tools/perf/core/shard_maps/mac-arm_dtk_x86-perf_map.json +++ b/tools/perf/core/shard_maps/mac-arm_dtk_x86-perf_map.json
@@ -1,8 +1,8 @@ { "0": { "benchmarks": { - "blink_perf.css": { - "abridged": false + "loading.desktop": { + "abridged": true } } }
diff --git a/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_arm-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_arm-perf_timing.json index 514e3fb..0637a08 100644 --- a/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_arm-perf_timing.json +++ b/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_arm-perf_timing.json
@@ -1,162 +1 @@ -[ - { - "duration": "21.0", - "name": "blink_perf.css/AttributeDescendantSelector.html" - }, - { - "duration": "5.0", - "name": "blink_perf.css/CSSLogicalDirection.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/CSSPropertySetterGetter.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/CSSPropertyUpdateValue.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/ChangeStyleCSSVariableRecalc.html" - }, - { - "duration": "9.0", - "name": "blink_perf.css/ChangeStyleChildClassSelector.html" - }, - { - "duration": "9.0", - "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/ChangeStyleCustomPropertyDeclaration.html" - }, - { - "duration": "9.0", - "name": "blink_perf.css/ChangeStyleElementSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStyleShallowTree.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleUniversalSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" - }, - { - "duration": "14.0", - "name": "blink_perf.css/ClassDescendantSelector.html" - }, - { - "duration": "12.0", - "name": "blink_perf.css/ClassInvalidation.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesCascade.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesDependency.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesRootInheritance.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesVarAlias.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/ExplicitInheritance.html" - }, - { - "duration": "13.0", - "name": "blink_perf.css/FocusUpdate.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/LoadBootstrapBlog.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/LoadMaterializeStarterPage.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/LoadSemanticPageExample.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/PseudoClassSelectors.html" - }, - { - "duration": "12.0", - "name": "blink_perf.css/SelectorCountScaling.html" - } -] \ No newline at end of file +[] \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_x86-perf_timing.json b/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_x86-perf_timing.json index 514e3fb..0637a08 100644 --- a/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_x86-perf_timing.json +++ b/tools/perf/core/shard_maps/timing_data/mac-arm_dtk_x86-perf_timing.json
@@ -1,162 +1 @@ -[ - { - "duration": "21.0", - "name": "blink_perf.css/AttributeDescendantSelector.html" - }, - { - "duration": "5.0", - "name": "blink_perf.css/CSSLogicalDirection.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/CSSPropertySetterGetter.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/CSSPropertyUpdateValue.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/ChangeStyleCSSVariableRecalc.html" - }, - { - "duration": "9.0", - "name": "blink_perf.css/ChangeStyleChildClassSelector.html" - }, - { - "duration": "9.0", - "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/ChangeStyleCustomPropertyDeclaration.html" - }, - { - "duration": "9.0", - "name": "blink_perf.css/ChangeStyleElementSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/ChangeStyleShallowTree.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleUniversalSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" - }, - { - "duration": "14.0", - "name": "blink_perf.css/ClassDescendantSelector.html" - }, - { - "duration": "12.0", - "name": "blink_perf.css/ClassInvalidation.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesCascade.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesDependency.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesNonRootInheritance.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesPendingSubstitution.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesRootInheritance.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/CustomPropertiesVarAlias.html" - }, - { - "duration": "6.0", - "name": "blink_perf.css/ExplicitInheritance.html" - }, - { - "duration": "13.0", - "name": "blink_perf.css/FocusUpdate.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/LoadBootstrapBlog.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/LoadMaterializeStarterPage.html" - }, - { - "duration": "10.0", - "name": "blink_perf.css/LoadSemanticPageExample.html" - }, - { - "duration": "11.0", - "name": "blink_perf.css/PseudoClassSelectors.html" - }, - { - "duration": "12.0", - "name": "blink_perf.css/SelectorCountScaling.html" - } -] \ No newline at end of file +[] \ No newline at end of file
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 1e75bcf29..0e56dfa4 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -432,6 +432,7 @@ crbug.com/1064284 [ android-pixel-2 ] v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ] crbug.com/1088419 [ android-nexus-5x android-webview ] v8.browsing_mobile/browse:media:imgur:2019 [ Skip ] crbug.com/1112337 [ android ] v8.browsing_mobile/browse:news:cricbuzz:2019 [ Skip ] +crbug.com/1139057 [ mobile ] v8.browsing_mobile/browse:social:facebook:2019 [ Skip ] # Benchmark: v8.browsing_mobile-future crbug.com/1036141 [ android-webview ] v8.browsing_mobile-future/browse:shopping:lazada:2019 [ Skip ]
diff --git a/ui/accessibility/ax_common.h b/ui/accessibility/ax_common.h new file mode 100644 index 0000000..997ae98 --- /dev/null +++ b/ui/accessibility/ax_common.h
@@ -0,0 +1,18 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_ACCESSIBILITY_AX_COMMON_H_ +#define UI_ACCESSIBILITY_AX_COMMON_H_ + +#if (!defined(NDEBUG) || defined(ADDRESS_SANITIZER) || \ + defined(LEAK_SANITIZER) || defined(MEMORY_SANITIZER) || \ + defined(THREAD_SANITIZER) || defined(UNDEFINED_SANITIZER) || \ + DCHECK_IS_ON()) && \ + !defined(OS_IOS) +// Enable fast fails on clusterfuzz and other builds used to debug Chrome, +// in order to help narrow down illegal states more quickly. +#define AX_FAIL_FAST_BUILD +#endif + +#endif // UI_ACCESSIBILITY_AX_COMMON_H_
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h index a0146b4..1b4a2b4 100644 --- a/ui/accessibility/ax_tree_serializer.h +++ b/ui/accessibility/ax_tree_serializer.h
@@ -13,6 +13,7 @@ #include <vector> #include "base/logging.h" +#include "ui/accessibility/ax_common.h" #include "ui/accessibility/ax_export.h" #include "ui/accessibility/ax_tree_source.h" #include "ui/accessibility/ax_tree_update.h" @@ -392,11 +393,11 @@ AXTreeSerializer<AXSourceNode, AXNodeData, AXTreeData>::GetClientTreeNodeParent( ClientTreeNode* obj) { ClientTreeNode* parent = obj->parent; -#if DCHECK_IS_ON() || !defined(NDEBUG) +#if defined(AX_FAIL_FAST_BUILD) if (!parent) return nullptr; DCHECK(ClientTreeNodeById(parent->id)) << "Parent not in id map."; -#endif // DCHECK_IS_ON() || !defined(NDEBUG) +#endif // defined(AX_FAIL_FAST_BUILD) return parent; } @@ -579,7 +580,7 @@ ClientTreeNode* client_child = ClientTreeNodeById(new_child_id); if (client_child && GetClientTreeNodeParent(client_child) != client_node) { -#if DCHECK_IS_ON() || !defined(NDEBUG) +#if defined(AX_FAIL_FAST_BUILD) // TODO(accessibility) Remove all cases where this occurs and re-add // NOTREACHED(), or add a histogram. // This condition leads to performance problems. It will @@ -587,7 +588,7 @@ NOTREACHED() #else LOG(ERROR) -#endif +#endif // defined(AX_FAIL_FAST_BUILD) << "Illegal reparenting detected: " << "\nPassed-in parent: " << tree_->GetDebugString(tree_->GetFromId(client_node->id)) @@ -673,7 +674,7 @@ new_child->invalid = false; client_node->children.push_back(new_child); if (ClientTreeNodeById(child_id)) { -#if DCHECK_IS_ON() || !defined(NDEBUG) +#if defined(AX_FAIL_FAST_BUILD) // TODO(accessibility) Remove all cases where this occurs and re-add // NOTREACHED(), or add a histogram. // This condition leads to performance problems. It will @@ -681,7 +682,7 @@ NOTREACHED() #else LOG(ERROR) -#endif +#endif // defined(AX_FAIL_FAST_BUILD) << "Child id " << child_id << " already exists in map." << "\nChild is " << tree_->GetDebugString(tree_->GetFromId(child_id))
diff --git a/ui/accessibility/ax_tree_serializer_unittest.cc b/ui/accessibility/ax_tree_serializer_unittest.cc index 357ee37..46df4b2 100644 --- a/ui/accessibility/ax_tree_serializer_unittest.cc +++ b/ui/accessibility/ax_tree_serializer_unittest.cc
@@ -13,9 +13,9 @@ #include "base/strings/string_number_conversions.h" #include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/accessibility/ax_common.h" #include "ui/accessibility/ax_node.h" #include "ui/accessibility/ax_serializable_tree.h" -#include "ui/accessibility/ax_tree.h" using testing::UnorderedElementsAre; @@ -342,11 +342,8 @@ ASSERT_EQ(5u, update.nodes.size()); } -#if !defined(ADDRESS_SANITIZER) && defined(NDEBUG) && !DCHECK_IS_ON() // If duplicate ids are encountered, it returns an error and the next // update will re-send the entire tree. -// Test does not work with address sanitizer -- if EXPECT_DEATH is used to -// catch the "Illegal parenting" NOTREACHED(), an ASAN crash is still generated. TEST_F(AXTreeSerializerTest, DuplicateIdsReturnsErrorAndFlushes) { // (1 (2 (3 (4) 5))) treedata0_.root_id = 1; @@ -386,7 +383,13 @@ tree1_->GetFromId(2)->SwapChildren(&node2_children); AXTreeUpdate update; +#if defined(AX_FAIL_FAST_BUILD) + EXPECT_DEATH(serializer_->SerializeChanges(tree1_->GetFromId(7), &update), + "Illegal reparenting detected"); + serializer_->Reset(); +#else ASSERT_FALSE(serializer_->SerializeChanges(tree1_->GetFromId(7), &update)); +#endif // defined(AX_FAIL_FAST_BUILD) // Swap it back, fixing the tree. tree1_->GetFromId(2)->SwapChildren(&node2_children); @@ -397,7 +400,6 @@ serializer_->SerializeChanges(tree1_->GetFromId(7), &update); ASSERT_EQ(5u, update.nodes.size()); } -#endif // If a tree serializer is reset, that means it doesn't know about // the state of the client tree anymore. The safest thing to do in
diff --git a/ui/base/clipboard/clipboard.h b/ui/base/clipboard/clipboard.h index e596a20b..c5cf15c4 100644 --- a/ui/base/clipboard/clipboard.h +++ b/ui/base/clipboard/clipboard.h
@@ -108,8 +108,6 @@ virtual uint64_t GetSequenceNumber(ClipboardBuffer buffer) const = 0; // Tests whether the clipboard contains a certain format. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual bool IsFormatAvailable( const ClipboardFormatType& format, ClipboardBuffer buffer, @@ -133,30 +131,22 @@ // TODO(huangdarwin): Rename to ReadAvailablePortableFormatNames(). // Includes all sanitized types. // Also, includes pickled types by splitting them out of the pickled format. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originated uses. virtual void ReadAvailableTypes(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, std::vector<base::string16>* types) const = 0; // Includes all types, including unsanitized types. // Omits formats held within pickles, as they're different from what a native // application would see. - // TODO(crbug.com/1103614): Update |dst| in all references to its appropriate - // ClipboardDataEndpoint for web-originates uses. virtual std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames( ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst) const = 0; // Reads Unicode text from the clipboard, if available. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadText(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, base::string16* result) const = 0; // Reads ASCII text from the clipboard, if available. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadAsciiText(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, std::string* result) const = 0; @@ -165,8 +155,6 @@ // context to parse, |fragment_start| and |fragment_end| are indexes into // markup indicating the beginning and end of the actual fragment. Otherwise, // they will contain 0 and markup->size(). - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadHTML(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, base::string16* markup, @@ -175,15 +163,11 @@ uint32_t* fragment_end) const = 0; // Reads an SVG image from the clipboard, if available. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadSvg(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, base::string16* result) const = 0; // Reads RTF from the clipboard, if available. Stores the result as a byte // vector. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadRTF(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, std::string* result) const = 0; @@ -191,14 +175,10 @@ using ReadImageCallback = base::OnceCallback<void(const SkBitmap&)>; // Reads an image from the clipboard, if available. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadImage(ClipboardBuffer buffer, const ClipboardDataEndpoint* data_dst, ReadImageCallback callback) const = 0; - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadCustomData(ClipboardBuffer buffer, const base::string16& type, const ClipboardDataEndpoint* data_dst, @@ -206,16 +186,12 @@ // Reads a bookmark from the clipboard, if available. // |title| or |url| may be null. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadBookmark(const ClipboardDataEndpoint* data_dst, base::string16* title, std::string* url) const = 0; // Reads raw data from the clipboard with the given format type. Stores result // as a byte vector. - // TODO(crbug.com/1103614): Update |data_dst| in all references to its - // appropriate ClipboardDataEndpoint for web-originates uses. virtual void ReadData(const ClipboardFormatType& format, const ClipboardDataEndpoint* data_dst, std::string* result) const = 0;
diff --git a/ui/base/x/x11_software_bitmap_presenter.cc b/ui/base/x/x11_software_bitmap_presenter.cc index 88acdee..bfcfce5 100644 --- a/ui/base/x/x11_software_bitmap_presenter.cc +++ b/ui/base/x/x11_software_bitmap_presenter.cc
@@ -16,7 +16,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/ref_counted_memory.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkSurface.h" @@ -174,8 +173,7 @@ SkImageInfo info = SkImageInfo::Make(viewport_pixel_size_.width(), viewport_pixel_size_.height(), color_type, kOpaque_SkAlphaType); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - surface_ = SkSurface::MakeRaster(info, &props); + surface_ = SkSurface::MakeRaster(info); } }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb index 6c9b9604..7b1ee0a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -207,6 +207,7 @@ <translation id="3252266817569339921">Französisch</translation> <translation id="3254434849914415189">Wählen Sie eine Standard-App für <ph name="FILE_TYPE" />-Dateien:</translation> <translation id="3264582393905923483">Kontext</translation> +<translation id="3272909651715601089">„<ph name="PATH" />“ konnte nicht geöffnet werden</translation> <translation id="3280431534455935878">In Vorbereitung</translation> <translation id="3280987981688031357">Schallplatte</translation> <translation id="3296763833017966289">Georgisch</translation> @@ -309,6 +310,7 @@ <translation id="4477219268485577442">Bulgarisch – phonetisch</translation> <translation id="4479812471636796472">US-amerikanische Dvorak-Tastatur</translation> <translation id="4522570452068850558">Details</translation> +<translation id="4527800702232535228">Dieser Ordner ist für Parallels Desktop freigegeben</translation> <translation id="4552678318981539154">Mehr Speicherplatz erwerben</translation> <translation id="4559767610552730302">Bokeh</translation> <translation id="4572815280350369984"><ph name="FILE_TYPE" />-Datei</translation> @@ -326,6 +328,7 @@ <translation id="4694604912444486114">Affe</translation> <translation id="4697043402264950621">Die Dateiliste wurde in aufsteigender Reihenfolge nach "<ph name="COLUMN_NAME" />" sortiert.</translation> <translation id="4711094779914110278">Türkisch</translation> +<translation id="4712283082407695269">„<ph name="PATH" />“ wird geöffnet</translation> <translation id="4713544552769165154">Diese Datei wurde für einen Computer mit Macintosh-Software entwickelt und ist nicht mit Ihrem Chrome OS-Gerät kompatibel. Suchen Sie im <ph name="BEGIN_LINK" />Chrome Web Store<ph name="END_LINK" /> nach einer geeigneten Ersatz-App. <ph name="BEGIN_LINK_HELP" />Weitere Informationen<ph name="END_LINK_HELP" /></translation> <translation id="4724850507808590449"><ph name="FILE_COUNT" /> Fotos gesichert</translation> <translation id="4725511304875193254">Corgi</translation> @@ -525,6 +528,7 @@ <translation id="6558280019477628686">Ein Fehler ist aufgetreten. Einige Elemente wurden möglicherweise nicht gelöscht.</translation> <translation id="656398493051028875">"<ph name="FILENAME" />" wird gelöscht...</translation> <translation id="6581162200855843583">Google Drive-Link</translation> +<translation id="6594855146910089723">Dieser Ordner ist für Linux und Parallels Desktop freigegeben</translation> <translation id="6607272825297743757">Dateiinformationen</translation> <translation id="6609332149380188670"><ph name="NUMBER_OF_ITEMS" /> Ordner für Parallels Desktop freigegeben</translation> <translation id="6629841649550503054">Alle Daten wurden in <ph name="BEGIN_LINK" />Google Drive<ph name="END_LINK" /> gesichert.</translation>
diff --git a/ui/compositor/canvas_painter.cc b/ui/compositor/canvas_painter.cc index b5b0b9c..31c4cabd 100644 --- a/ui/compositor/canvas_painter.cc +++ b/ui/compositor/canvas_painter.cc
@@ -31,7 +31,7 @@ if (!output_->tryAllocPixels(info)) return; - SkCanvas canvas(*output_, SkSurfaceProps{}); + SkCanvas canvas(*output_); canvas.clear(clear_color_); // When pixel canvas is enabled, the recordings and canvas are already scaled
diff --git a/ui/gfx/animation/tween.cc b/ui/gfx/animation/tween.cc index 2ab0834..b5a6590 100644 --- a/ui/gfx/animation/tween.cc +++ b/ui/gfx/animation/tween.cc
@@ -42,6 +42,9 @@ case EASE_IN_OUT_2: return gfx::CubicBezier(0.33, 0, 0.67, 1).Solve(state); + case EASE_OUT_3: + return gfx::CubicBezier(0.6, 0, 0, 1).Solve(state); + case LINEAR: return state;
diff --git a/ui/gfx/animation/tween.h b/ui/gfx/animation/tween.h index c623b8e..9d5c821 100644 --- a/ui/gfx/animation/tween.h +++ b/ui/gfx/animation/tween.h
@@ -22,18 +22,19 @@ class ANIMATION_EXPORT Tween { public: enum Type { - LINEAR, // Linear. - EASE_OUT, // Fast in, slow out (default). - EASE_OUT_2, // Variant of EASE_OUT that ends slower than EASE_OUT. - EASE_IN, // Slow in, fast out. - EASE_IN_2, // Variant of EASE_IN that starts out slower than - // EASE_IN. - EASE_IN_OUT, // Slow in and out, fast in the middle. - EASE_IN_OUT_2, // Variant of EASE_IN_OUT that starts and ends slower - // than EASE_IN_OUT. - SMOOTH_IN_OUT, // Smooth, consistent speeds in and out (sine wave). - FAST_OUT_SLOW_IN, // Variant of EASE_IN_OUT which should be used in most - // cases. + LINEAR, // Linear. + EASE_OUT, // Fast in, slow out (default). + EASE_OUT_2, // Variant of EASE_OUT that ends slower than EASE_OUT. + EASE_OUT_3, // Variant of EASE_OUT that ends slower than EASE_OUT_2. + EASE_IN, // Slow in, fast out. + EASE_IN_2, // Variant of EASE_IN that starts out slower than + // EASE_IN. + EASE_IN_OUT, // Slow in and out, fast in the middle. + EASE_IN_OUT_2, // Variant of EASE_IN_OUT that starts and ends slower + // than EASE_IN_OUT. + SMOOTH_IN_OUT, // Smooth, consistent speeds in and out (sine wave). + FAST_OUT_SLOW_IN, // Variant of EASE_IN_OUT which should be used in most + // cases. FAST_OUT_SLOW_IN_2, // Variant of FAST_OUT_SLOW_IN that starts out quicker. LINEAR_OUT_SLOW_IN, // Variant of EASE_OUT which should be used for // fading in from 0% or motion when entering a scene.
diff --git a/ui/gfx/font_render_params.cc b/ui/gfx/font_render_params.cc index 31799c8..3a03ffcc 100644 --- a/ui/gfx/font_render_params.cc +++ b/ui/gfx/font_render_params.cc
@@ -9,23 +9,38 @@ namespace gfx { // static -SkPixelGeometry FontRenderParams::SubpixelRenderingToSkiaPixelGeometry( +SkFontLCDConfig::LCDOrder FontRenderParams::SubpixelRenderingToSkiaLCDOrder( FontRenderParams::SubpixelRendering subpixel_rendering) { switch (subpixel_rendering) { case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE: - return kRGB_H_SkPixelGeometry; // why not kUnknown_SkPixelGeometry ?? case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB: - return kRGB_H_SkPixelGeometry; case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB: - return kRGB_V_SkPixelGeometry; + return SkFontLCDConfig::kRGB_LCDOrder; case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR: - return kBGR_H_SkPixelGeometry; case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR: - return kBGR_V_SkPixelGeometry; + return SkFontLCDConfig::kBGR_LCDOrder; } NOTREACHED(); - return kRGB_H_SkPixelGeometry; + return SkFontLCDConfig::kRGB_LCDOrder; +} + +// static +SkFontLCDConfig::LCDOrientation +FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( + FontRenderParams::SubpixelRendering subpixel_rendering) { + switch (subpixel_rendering) { + case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR: + return SkFontLCDConfig::kHorizontal_LCDOrientation; + case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB: + case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR: + return SkFontLCDConfig::kVertical_LCDOrientation; + } + + NOTREACHED(); + return SkFontLCDConfig::kHorizontal_LCDOrientation; } FontRenderParamsQuery::FontRenderParamsQuery()
diff --git a/ui/gfx/font_render_params.h b/ui/gfx/font_render_params.h index 96508f2..5043313 100644 --- a/ui/gfx/font_render_params.h +++ b/ui/gfx/font_render_params.h
@@ -10,7 +10,7 @@ #include "build/build_config.h" #include "device/vr/buildflags/buildflags.h" -#include "third_party/skia/include/core/SkSurfaceProps.h" +#include "third_party/skia/include/core/SkFontLCDConfig.h" #include "ui/gfx/font.h" #include "ui/gfx/gfx_export.h" @@ -71,7 +71,9 @@ // subpixel order. SubpixelRendering subpixel_rendering = SUBPIXEL_RENDERING_NONE; - static SkPixelGeometry SubpixelRenderingToSkiaPixelGeometry( + static SkFontLCDConfig::LCDOrder SubpixelRenderingToSkiaLCDOrder( + SubpixelRendering subpixel_rendering); + static SkFontLCDConfig::LCDOrientation SubpixelRenderingToSkiaLCDOrientation( SubpixelRendering subpixel_rendering); };
diff --git a/ui/gfx/icon_util_unittest.cc b/ui/gfx/icon_util_unittest.cc index e033898..4e856eb8 100644 --- a/ui/gfx/icon_util_unittest.cc +++ b/ui/gfx/icon_util_unittest.cc
@@ -443,7 +443,7 @@ bitmap.allocN32Pixels(size, size, false); EXPECT_EQ(bitmap.alphaType(), kPremul_SkAlphaType); { - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); canvas.drawColor(SK_ColorWHITE); SkPaint paint; paint.setColor(semi_transparent_red);
diff --git a/ui/gfx/image/image_skia_rep_default.cc b/ui/gfx/image/image_skia_rep_default.cc index 36294aef..8819dd4 100644 --- a/ui/gfx/image/image_skia_rep_default.cc +++ b/ui/gfx/image/image_skia_rep_default.cc
@@ -9,7 +9,6 @@ #include "cc/paint/display_item_list.h" #include "cc/paint/record_paint_canvas.h" #include "cc/paint/skia_paint_canvas.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/gfx/color_palette.h" @@ -99,7 +98,7 @@ // as it forces a rasterization on the UI thread. bitmap_.allocN32Pixels(pixel_width(), pixel_height()); bitmap_.eraseColor(SK_ColorTRANSPARENT); - SkCanvas canvas(bitmap_, skia::LegacyDisplayGlobals::GetSkSurfaceProps()); + SkCanvas canvas(bitmap_); paint_record_->Playback(&canvas); bitmap_.setImmutable(); }
diff --git a/ui/gfx/image/image_unittest.cc b/ui/gfx/image/image_unittest.cc index 2f4f276..40354ae 100644 --- a/ui/gfx/image/image_unittest.cc +++ b/ui/gfx/image/image_unittest.cc
@@ -437,7 +437,7 @@ bitmap.eraseARGB(255, 0, 255, 0); // Paint the upper half of the image in red (lower half is in green). - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); SkPaint red; red.setColor(SK_ColorRED); canvas.drawRect(SkRect::MakeWH(width, height / 2), red); @@ -478,7 +478,7 @@ bitmap.eraseARGB(0, 0, 255, 0); // Paint the upper half of the image in red (lower half is transparent). - SkCanvas canvas(bitmap, SkSurfaceProps{}); + SkCanvas canvas(bitmap); SkPaint red; red.setColor(SK_ColorRED); canvas.drawRect(SkRect::MakeWH(width, height / 2), red);
diff --git a/ui/gfx/linux/gbm_wrapper.cc b/ui/gfx/linux/gbm_wrapper.cc index 9beeb30..71f9ffc 100644 --- a/ui/gfx/linux/gbm_wrapper.cc +++ b/ui/gfx/linux/gbm_wrapper.cc
@@ -10,7 +10,6 @@ #include "base/logging.h" #include "base/posix/eintr_wrapper.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkSurface.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/linux/drm_util_linux.h" @@ -223,9 +222,8 @@ return nullptr; SkImageInfo info = SkImageInfo::MakeN32Premul(size_.width(), size_.height()); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - return SkSurface::MakeRasterDirectReleaseProc( - info, addr, stride, &Buffer::UnmapGbmBo, this, &props); + return SkSurface::MakeRasterDirectReleaseProc(info, addr, stride, + &Buffer::UnmapGbmBo, this); } private:
diff --git a/ui/gfx/skbitmap_operations.cc b/ui/gfx/skbitmap_operations.cc index 9e1afd3..13abb4c0 100644 --- a/ui/gfx/skbitmap_operations.cc +++ b/ui/gfx/skbitmap_operations.cc
@@ -675,7 +675,7 @@ color_mask.allocN32Pixels(bitmap.width(), bitmap.height()); color_mask.eraseARGB(0, 0, 0, 0); - SkCanvas canvas(color_mask, SkSurfaceProps{}); + SkCanvas canvas(color_mask); SkPaint paint; paint.setColorFilter(SkColorFilters::Blend(c, SkBlendMode::kSrcIn)); @@ -699,7 +699,7 @@ bitmap.height() + shadow_margin.height()); image_with_shadow.eraseARGB(0, 0, 0, 0); - SkCanvas canvas(image_with_shadow, SkSurfaceProps{}); + SkCanvas canvas(image_with_shadow); canvas.translate(SkIntToScalar(shadow_margin.left()), SkIntToScalar(shadow_margin.top())); @@ -749,7 +749,7 @@ break; } - SkCanvas canvas(result, SkSurfaceProps{}); + SkCanvas canvas(result); canvas.clear(SkColorSetARGB(0, 0, 0, 0)); canvas.translate(SkFloatToScalar(result.width() * 0.5f),
diff --git a/ui/gfx/skbitmap_operations_unittest.cc b/ui/gfx/skbitmap_operations_unittest.cc index a0be6ed..63255097 100644 --- a/ui/gfx/skbitmap_operations_unittest.cc +++ b/ui/gfx/skbitmap_operations_unittest.cc
@@ -525,7 +525,7 @@ // GGGYYY src.allocN32Pixels(src_w, src_h); - SkCanvas canvas(src, SkSurfaceProps{}); + SkCanvas canvas(src); src.eraseARGB(0, 0, 0, 0); // This region is a semi-transparent red to test non-opaque pixels.
diff --git a/ui/ozone/demo/skia/skia_gl_renderer.cc b/ui/ozone/demo/skia/skia_gl_renderer.cc index f4731442..15a9ae3 100644 --- a/ui/ozone/demo/skia/skia_gl_renderer.cc +++ b/ui/ozone/demo/skia/skia_gl_renderer.cc
@@ -12,7 +12,6 @@ #include "base/location.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkFont.h" #include "third_party/skia/include/effects/SkGradientShader.h" @@ -84,8 +83,9 @@ void SkiaGlRenderer::RenderFrame() { TRACE_EVENT0("ozone", "SkiaGlRenderer::RenderFrame"); + // LegacyFontHost will get LCD text and skia figures out what type to use. SkSurfaceProps surface_props = - skia::LegacyDisplayGlobals::GetSkSurfaceProps(); + SkSurfaceProps(0, SkSurfaceProps::kLegacyFontHost_InitType); if (!sk_surface_) { GrGLFramebufferInfo framebuffer_info;
diff --git a/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc b/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc index 01f1dd0..889fca4 100644 --- a/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc +++ b/ui/ozone/platform/drm/gpu/drm_dumb_buffer.cc
@@ -8,7 +8,6 @@ #include <xf86drmMode.h> #include "base/logging.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkSurface.h" #include "ui/ozone/platform/drm/gpu/drm_device.h" @@ -89,8 +88,7 @@ return false; } - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - surface_ = SkSurface::MakeRasterDirect(info, mmap_base_, stride_, &props); + surface_ = SkSurface::MakeRasterDirect(info, mmap_base_, stride_); if (!surface_) { LOG(ERROR) << "DrmDumbBuffer: Failed to create SkSurface: handle " << handle_;
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc index a20f90a..841cf8f 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
@@ -9,6 +9,7 @@ #include <utility> #include "base/bind.h" +#include "base/files/file_util.h" #include "base/macros.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -40,8 +41,9 @@ constexpr uint32_t kActivePropId = 1000; constexpr uint32_t kModePropId = 1001; constexpr uint32_t kCrtcIdPropId = 2000; -constexpr uint32_t kTypePropId = 3010; -constexpr uint32_t kInFormatsPropId = 3011; +constexpr uint32_t kFenceFdPropId = 3010; +constexpr uint32_t kTypePropId = 3011; +constexpr uint32_t kInFormatsPropId = 3012; const gfx::Size kDefaultModeSize(kDefaultMode.hdisplay, kDefaultMode.vdisplay); const gfx::Size kOverlaySize(kDefaultMode.hdisplay / 2, @@ -50,6 +52,35 @@ } // namespace +class FakeFenceFD { + public: + FakeFenceFD(); + + std::unique_ptr<gfx::GpuFence> GetGpuFence() const; + void Signal() const; + + private: + base::ScopedFD read_fd; + base::ScopedFD write_fd; +}; + +FakeFenceFD::FakeFenceFD() { + int fds[2]; + base::CreateLocalNonBlockingPipe(fds); + read_fd = base::ScopedFD(fds[0]); + write_fd = base::ScopedFD(fds[1]); +} + +std::unique_ptr<gfx::GpuFence> FakeFenceFD::GetGpuFence() const { + gfx::GpuFenceHandle handle; + handle.owned_fd = base::ScopedFD(HANDLE_EINTR(dup(read_fd.get()))); + return std::make_unique<gfx::GpuFence>(std::move(handle)); +} + +void FakeFenceFD::Signal() const { + base::WriteFileDescriptor(write_fd.get(), "a", 1); +} + class HardwareDisplayControllerTest : public testing::Test { public: HardwareDisplayControllerTest() : page_flips_(0) {} @@ -142,6 +173,7 @@ {3007, "SRC_Y"}, {3008, "SRC_W"}, {3009, "SRC_H"}, + {kFenceFdPropId, "IN_FENCE_FD"}, // Add some optional properties we use for convenience. {kTypePropId, "type"}, {kInFormatsPropId, "IN_FORMATS"}, @@ -259,6 +291,64 @@ GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", &crtc_prop_for_name); EXPECT_EQ(kModePropId, crtc_prop_for_name.id); + + ui::DrmDevice::Property fence_fd_prop = {}; + ui::ScopedDrmObjectPropertyPtr plane_props = + drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); + ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", + &fence_fd_prop); + EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); + EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(fence_fd_prop.value)); +} + +TEST_F(HardwareDisplayControllerTest, FenceFdValueChange) { + ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr); + EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); + + // Test invalid fence fd + { + ui::DrmDevice::Property fence_fd_prop = {}; + ui::ScopedDrmObjectPropertyPtr plane_props = + drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); + ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", + &fence_fd_prop); + EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); + EXPECT_EQ(base::kInvalidPlatformFile, + static_cast<int>(fence_fd_prop.value)); + } + + const FakeFenceFD fake_fence_fd; + plane1.gpu_fence = fake_fence_fd.GetGpuFence(); + std::vector<ui::DrmOverlayPlane> planes = {}; + planes.push_back(plane1.Clone()); + SchedulePageFlip(std::move(planes)); + + // Verify fence FD after a GPU Fence is added to the plane. + { + ui::DrmDevice::Property fence_fd_prop = {}; + ui::ScopedDrmObjectPropertyPtr plane_props = + drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); + ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", + &fence_fd_prop); + EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); + EXPECT_LT(base::kInvalidPlatformFile, + static_cast<int>(fence_fd_prop.value)); + } + + plane1.gpu_fence = nullptr; + EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode)); + + // Test an invalid FD again after the fence is removed. + { + ui::DrmDevice::Property fence_fd_prop = {}; + ui::ScopedDrmObjectPropertyPtr plane_props = + drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); + ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", + &fence_fd_prop); + EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); + EXPECT_EQ(base::kInvalidPlatformFile, + static_cast<int>(fence_fd_prop.value)); + } } TEST_F(HardwareDisplayControllerTest, CheckDisableResetsProps) { @@ -293,6 +383,14 @@ GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", &crtc_prop_for_name); EXPECT_EQ(0U, crtc_prop_for_name.value); + + ui::DrmDevice::Property fence_fd_prop = {}; + ui::ScopedDrmObjectPropertyPtr plane_props = + drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); + ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", + &fence_fd_prop); + EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); + EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(fence_fd_prop.value)); } TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc index b3fcead..c47cedb 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
@@ -74,8 +74,7 @@ return ret; } -bool HardwareDisplayPlaneAtomic::SetPlaneData( - drmModeAtomicReq* property_set, +bool HardwareDisplayPlaneAtomic::AssignPlaneProps( uint32_t crtc_id, uint32_t framebuffer, const gfx::Rect& crtc_rect, @@ -88,52 +87,65 @@ if (!IsRotationTransformSupported(transform)) return false; - properties_.crtc_id.value = crtc_id; - properties_.crtc_x.value = crtc_rect.x(); - properties_.crtc_y.value = crtc_rect.y(); - properties_.crtc_w.value = crtc_rect.width(); - properties_.crtc_h.value = crtc_rect.height(); - properties_.fb_id.value = framebuffer; - properties_.src_x.value = src_rect.x(); - properties_.src_y.value = src_rect.y(); - properties_.src_w.value = src_rect.width(); - properties_.src_h.value = src_rect.height(); + // Make a copy of properties to get the props IDs for the new intermediate + // values. + assigned_props_ = properties_; - bool plane_set_succeeded = - AddPropertyIfValid(property_set, id_, properties_.crtc_id) && - AddPropertyIfValid(property_set, id_, properties_.crtc_x) && - AddPropertyIfValid(property_set, id_, properties_.crtc_y) && - AddPropertyIfValid(property_set, id_, properties_.crtc_w) && - AddPropertyIfValid(property_set, id_, properties_.crtc_h) && - AddPropertyIfValid(property_set, id_, properties_.fb_id) && - AddPropertyIfValid(property_set, id_, properties_.src_x) && - AddPropertyIfValid(property_set, id_, properties_.src_y) && - AddPropertyIfValid(property_set, id_, properties_.src_w) && - AddPropertyIfValid(property_set, id_, properties_.src_h); + assigned_props_.crtc_id.value = crtc_id; + assigned_props_.crtc_x.value = crtc_rect.x(); + assigned_props_.crtc_y.value = crtc_rect.y(); + assigned_props_.crtc_w.value = crtc_rect.width(); + assigned_props_.crtc_h.value = crtc_rect.height(); + assigned_props_.fb_id.value = framebuffer; + assigned_props_.src_x.value = src_rect.x(); + assigned_props_.src_y.value = src_rect.y(); + assigned_props_.src_w.value = src_rect.width(); + assigned_props_.src_h.value = src_rect.height(); - if (properties_.rotation.id) { - properties_.rotation.value = + if (assigned_props_.rotation.id) { + assigned_props_.rotation.value = OverlayTransformToDrmRotationPropertyValue(transform); - plane_set_succeeded = - plane_set_succeeded && - AddPropertyIfValid(property_set, id_, properties_.rotation); } - if (properties_.in_fence_fd.id && in_fence_fd >= 0) { - properties_.in_fence_fd.value = in_fence_fd; - plane_set_succeeded = - plane_set_succeeded && - AddPropertyIfValid(property_set, id_, properties_.in_fence_fd); + if (assigned_props_.in_fence_fd.id) + assigned_props_.in_fence_fd.value = static_cast<uint64_t>(in_fence_fd); + + return true; +} + +bool HardwareDisplayPlaneAtomic::SetPlaneProps(drmModeAtomicReq* property_set) { + bool plane_set_succeeded = + AddPropertyIfValid(property_set, id_, assigned_props_.crtc_id) && + AddPropertyIfValid(property_set, id_, assigned_props_.crtc_x) && + AddPropertyIfValid(property_set, id_, assigned_props_.crtc_y) && + AddPropertyIfValid(property_set, id_, assigned_props_.crtc_w) && + AddPropertyIfValid(property_set, id_, assigned_props_.crtc_h) && + AddPropertyIfValid(property_set, id_, assigned_props_.fb_id) && + AddPropertyIfValid(property_set, id_, assigned_props_.src_x) && + AddPropertyIfValid(property_set, id_, assigned_props_.src_y) && + AddPropertyIfValid(property_set, id_, assigned_props_.src_w) && + AddPropertyIfValid(property_set, id_, assigned_props_.src_h); + + if (assigned_props_.rotation.id) { + plane_set_succeeded &= + AddPropertyIfValid(property_set, id_, assigned_props_.rotation); } - if (properties_.plane_color_encoding.id) { - properties_.plane_color_encoding.value = color_encoding_bt601_; - properties_.plane_color_range.value = color_range_limited_; - plane_set_succeeded = - plane_set_succeeded && - AddPropertyIfValid(property_set, id_, - properties_.plane_color_encoding) && - AddPropertyIfValid(property_set, id_, properties_.plane_color_range); + if (assigned_props_.in_fence_fd.id) { + plane_set_succeeded &= + AddPropertyIfValid(property_set, id_, assigned_props_.in_fence_fd); + } + + if (assigned_props_.plane_color_encoding.id) { + // TODO(markyacoub): |color_encoding_bt601_| and |color_range_limited_| are + // only set in Initialize(). The properties could be set once in there and + // these member variables could be removed. + assigned_props_.plane_color_encoding.value = color_encoding_bt601_; + assigned_props_.plane_color_range.value = color_range_limited_; + plane_set_succeeded &= AddPropertyIfValid( + property_set, id_, assigned_props_.plane_color_encoding); + plane_set_succeeded &= AddPropertyIfValid( + property_set, id_, assigned_props_.plane_color_range); } if (!plane_set_succeeded) { @@ -141,7 +153,9 @@ return false; } - crtc_id_ = crtc_id; + crtc_id_ = assigned_props_.crtc_id.value; + // Update properties_ if the setting the props succeeded. + properties_ = assigned_props_; return true; }
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h index af874ab..077e586c 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h +++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h
@@ -20,25 +20,29 @@ class HardwareDisplayPlaneAtomic : public HardwareDisplayPlane { public: - HardwareDisplayPlaneAtomic(uint32_t id); + explicit HardwareDisplayPlaneAtomic(uint32_t id); ~HardwareDisplayPlaneAtomic() override; bool Initialize(DrmDevice* drm) override; - virtual bool SetPlaneData(drmModeAtomicReq* property_set, - uint32_t crtc_id, - uint32_t framebuffer, - const gfx::Rect& crtc_rect, - const gfx::Rect& src_rect, - const gfx::OverlayTransform transform, - int in_fence_fd); + // Saves the props locally onto the plane to be committed later. + virtual bool AssignPlaneProps(uint32_t crtc_id, + uint32_t framebuffer, + const gfx::Rect& crtc_rect, + const gfx::Rect& src_rect, + const gfx::OverlayTransform transform, + int in_fence_fd); + // Sets the props on |property_set| for commit. + bool SetPlaneProps(drmModeAtomicReq* property_set); bool SetPlaneCtm(drmModeAtomicReq* property_set, uint32_t ctm_blob_id); uint32_t crtc_id() { return crtc_id_; } private: - uint32_t crtc_id_ = 0; + uint32_t crtc_id_ = 0; // Updated after commit. + // Intermediate variable between Assign()ment and Set()ting. + HardwareDisplayPlane::Properties assigned_props_; DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneAtomic); };
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc index 27db5f99..c27d80e 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
@@ -124,6 +124,12 @@ std::unique_ptr<gfx::GpuFence>* out_fence) { bool test_only = !should_modeset && !page_flip_request; + for (HardwareDisplayPlane* plane : plane_list->plane_list) { + HardwareDisplayPlaneAtomic* atomic_plane = + static_cast<HardwareDisplayPlaneAtomic*>(plane); + atomic_plane->SetPlaneProps(plane_list->atomic_property_set.get()); + } + for (HardwareDisplayPlane* plane : plane_list->old_plane_list) { if (!base::Contains(plane_list->plane_list, plane)) { // |plane| is shared state between |old_plane_list| and |plane_list|. @@ -135,9 +141,10 @@ plane->set_in_use(false); HardwareDisplayPlaneAtomic* atomic_plane = static_cast<HardwareDisplayPlaneAtomic*>(plane); - atomic_plane->SetPlaneData( - plane_list->atomic_property_set.get(), 0, 0, gfx::Rect(), gfx::Rect(), - gfx::OVERLAY_TRANSFORM_NONE, base::kInvalidPlatformFile); + atomic_plane->AssignPlaneProps(0, 0, gfx::Rect(), gfx::Rect(), + gfx::OVERLAY_TRANSFORM_NONE, + base::kInvalidPlatformFile); + atomic_plane->SetPlaneProps(plane_list->atomic_property_set.get()); } } @@ -232,9 +239,10 @@ HardwareDisplayPlaneAtomic* atomic_plane = static_cast<HardwareDisplayPlaneAtomic*>(plane); - atomic_plane->SetPlaneData( - plane_list->atomic_property_set.get(), 0, 0, gfx::Rect(), gfx::Rect(), - gfx::OVERLAY_TRANSFORM_NONE, base::kInvalidPlatformFile); + atomic_plane->AssignPlaneProps(0, 0, gfx::Rect(), gfx::Rect(), + gfx::OVERLAY_TRANSFORM_NONE, + base::kInvalidPlatformFile); + atomic_plane->SetPlaneProps(plane_list->atomic_property_set.get()); } bool ret = drm_->CommitProperties(plane_list->atomic_property_set.get(), DRM_MODE_ATOMIC_NONBLOCK, 0, nullptr); @@ -305,10 +313,9 @@ fence_fd = gpu_fence_handle.owned_fd.get(); } - if (!atomic_plane->SetPlaneData(plane_list->atomic_property_set.get(), - crtc_id, framebuffer_id, - overlay.display_bounds, src_rect, - overlay.plane_transform, fence_fd)) { + if (!atomic_plane->AssignPlaneProps(crtc_id, framebuffer_id, + overlay.display_bounds, src_rect, + overlay.plane_transform, fence_fd)) { return false; } return true;
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc index a14bfff1..aff014c 100644 --- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc +++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
@@ -1309,13 +1309,12 @@ HardwareDisplayPlaneAtomicMock() : ui::HardwareDisplayPlaneAtomic(1) {} ~HardwareDisplayPlaneAtomicMock() override = default; - bool SetPlaneData(drmModeAtomicReq* property_set, - uint32_t crtc_id, - uint32_t framebuffer, - const gfx::Rect& crtc_rect, - const gfx::Rect& src_rect, - const gfx::OverlayTransform transform, - int in_fence_fd) override { + bool AssignPlaneProps(uint32_t crtc_id, + uint32_t framebuffer, + const gfx::Rect& crtc_rect, + const gfx::Rect& src_rect, + const gfx::OverlayTransform transform, + int in_fence_fd) override { framebuffer_ = framebuffer; return true; }
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_device.cc b/ui/ozone/platform/drm/gpu/mock_drm_device.cc index 4c7cf75..ae09845 100644 --- a/ui/ozone/platform/drm/gpu/mock_drm_device.cc +++ b/ui/ozone/platform/drm/gpu/mock_drm_device.cc
@@ -10,7 +10,6 @@ #include "base/check.h" #include "base/stl_util.h" -#include "skia/ext/legacy_display_globals.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h" @@ -386,11 +385,10 @@ *handle = allocate_buffer_count_++; *stride = info.minRowBytes(); void* pixels = new char[info.computeByteSize(*stride)]; - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); buffers_.push_back(SkSurface::MakeRasterDirectReleaseProc( info, pixels, *stride, [](void* pixels, void* context) { delete[] static_cast<char*>(pixels); }, - /*context=*/nullptr, &props)); + /*context=*/nullptr)); buffers_[*handle]->getCanvas()->clear(SK_ColorBLACK); return true;
diff --git a/ui/ozone/platform/headless/headless_surface_factory.cc b/ui/ozone/platform/headless/headless_surface_factory.cc index 8326493..4ecbd2c 100644 --- a/ui/ozone/platform/headless/headless_surface_factory.cc +++ b/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -14,7 +14,6 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "build/build_config.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkSurface.h" #include "ui/gfx/buffer_format_util.h" @@ -73,11 +72,8 @@ // SurfaceOzoneCanvas overrides: void ResizeCanvas(const gfx::Size& viewport_size) override { - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); - surface_ = SkSurface::MakeRaster( - SkImageInfo::MakeN32Premul(viewport_size.width(), - viewport_size.height()), - &props); + surface_ = SkSurface::MakeRaster(SkImageInfo::MakeN32Premul( + viewport_size.width(), viewport_size.height())); } SkCanvas* GetCanvas() override { return surface_->getCanvas(); } void PresentCanvas(const gfx::Rect& damage) override {
diff --git a/ui/ozone/platform/scenic/scenic_window_canvas.cc b/ui/ozone/platform/scenic/scenic_window_canvas.cc index cfa7be6..14ef766 100644 --- a/ui/ozone/platform/scenic/scenic_window_canvas.cc +++ b/ui/ozone/platform/scenic/scenic_window_canvas.cc
@@ -9,7 +9,6 @@ #include "base/fuchsia/fuchsia_logging.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/memory/writable_shared_memory_region.h" -#include "skia/ext/legacy_display_globals.h" #include "ui/gfx/geometry/size_f.h" #include "ui/gfx/skia_util.h" #include "ui/gfx/vsync_provider.h" @@ -49,10 +48,9 @@ scenic_memory = std::make_unique<scenic::Memory>( scenic, memory_handle.PassPlatformHandle(), buffer_size, fuchsia::images::MemoryType::HOST_MEMORY); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); surface = SkSurface::MakeRasterDirect( SkImageInfo::MakeN32Premul(size.width(), size.height()), - memory_mapping.memory(), bytes_per_row, &props); + memory_mapping.memory(), bytes_per_row); dirty_region.setRect(gfx::RectToSkIRect(gfx::Rect(size))); }
diff --git a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc index deb43b0..09cfac561 100644 --- a/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc +++ b/ui/ozone/platform/wayland/gpu/wayland_canvas_surface.cc
@@ -13,7 +13,6 @@ #include "base/memory/unsafe_shared_memory_region.h" #include "base/numerics/checked_math.h" #include "base/posix/eintr_wrapper.h" -#include "skia/ext/legacy_display_globals.h" #include "third_party/skia/include/core/SkRegion.h" #include "ui/gfx/skia_util.h" #include "ui/gfx/vsync_provider.h" @@ -80,10 +79,9 @@ buffer_manager_->CreateShmBasedBuffer( std::move(fd_pair.fd), checked_length.ValueOrDie(), size, buffer_id_); - SkSurfaceProps props = skia::LegacyDisplayGlobals::GetSkSurfaceProps(); sk_surface_ = SkSurface::MakeRasterDirect( SkImageInfo::MakeN32Premul(size.width(), size.height()), - shm_mapping_.memory(), CalculateStride(size.width()), &props); + shm_mapping_.memory(), CalculateStride(size.width())); if (!sk_surface_) return false;
diff --git a/ui/snapshot/snapshot_win.cc b/ui/snapshot/snapshot_win.cc index 35fc4da..27d99532 100644 --- a/ui/snapshot/snapshot_win.cc +++ b/ui/snapshot/snapshot_win.cc
@@ -65,7 +65,7 @@ snapshot_bounds_in_window.y()); // Clear the region of the bitmap outside the clip rect to white. - SkCanvas image_canvas(bitmap, SkSurfaceProps{}); + SkCanvas image_canvas(bitmap); SkPaint paint; paint.setColor(SK_ColorWHITE);
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb index 2260360..3381ee7 100644 --- a/ui/strings/translations/ui_strings_iw.xtb +++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -129,14 +129,14 @@ <translation id="4968171027979920686">{SECONDS,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}</translation> <translation id="4971687151119236543">טראק קודם במדיה</translation> <translation id="5046499563572181734">הקש כאן</translation> -<translation id="5076340679995252485">&הדבק</translation> +<translation id="5076340679995252485">&הדבקה</translation> <translation id="5198715732953550718">האפליקציה <ph name="MOVED_APP_NAME" /> משולבת ביחד עם האפליקציה <ph name="IN_PLACE_APP" /> ליצירת תיקייה חדשה.</translation> <translation id="520299402983819650"><ph name="QUANTITY" /> PB</translation> <translation id="5266161281976477809">משולש הצגה</translation> <translation id="5278860589123563674">השליחה נכשלה</translation> <translation id="5283099933536931082">האפליקציה <ph name="APP_ITEM_TITLE" /> מבקשת את תשומת לבך.</translation> <translation id="528468243742722775">סיום</translation> -<translation id="5329858601952122676">&מחק</translation> +<translation id="5329858601952122676">&מחיקה</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> מעל <ph name="IN_PLACE_APP" />. יש לשחרר כדי ליצור תיקייה.</translation> <translation id="5463830097259460683">אמוג'י וסמלים</translation> <translation id="5476505524087279545">ביטול הסימון</translation> @@ -210,7 +210,7 @@ <translation id="7507604095951736240">אמוג'י</translation> <translation id="7658239707568436148">ביטול</translation> <translation id="7781829728241885113">אתמול</translation> -<translation id="7814458197256864873">&העתק</translation> +<translation id="7814458197256864873">&העתקה</translation> <translation id="7848989271541991537">עברה לדף <ph name="PAGE_NUMBER" />, שורה <ph name="ROW_NUMBER" />, עמודה <ph name="COLUMN_NUMBER" />.</translation> <translation id="7879499977785298635">ללא חסימה</translation> <translation id="7907591526440419938">פתח קובץ</translation>
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc index c8221491..58774048 100644 --- a/ui/views/bubble/bubble_dialog_model_host.cc +++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -370,7 +370,7 @@ auto checkbox = std::make_unique<Checkbox>(); auto* checkbox_ptr = checkbox.get(); - checkbox->set_callback(base::BindRepeating( + checkbox->SetCallback(base::BindRepeating( [](ui::DialogModelCheckbox* model, util::PassKey<DialogModelHost> pass_key, Checkbox* checkbox, const ui::Event& event) { @@ -392,7 +392,7 @@ combobox->SetAccessibleName(model->accessible_name(GetPassKey()).empty() ? model->label(GetPassKey()) : model->accessible_name(GetPassKey())); - combobox->set_callback(base::BindRepeating( + combobox->SetCallback(base::BindRepeating( [](ui::DialogModelCombobox* model, util::PassKey<DialogModelHost> pass_key, Combobox* combobox) { // TODO(pbos): This should be a subscription through the Combobox
diff --git a/ui/views/controls/button/button.h b/ui/views/controls/button/button.h index 39826085..77a34d3 100644 --- a/ui/views/controls/button/button.h +++ b/ui/views/controls/button/button.h
@@ -141,7 +141,7 @@ int tag() const { return tag_; } void set_tag(int tag) { tag_ = tag; } - void set_callback(PressedCallback callback) { + void SetCallback(PressedCallback callback) { callback_ = std::move(callback); }
diff --git a/ui/views/controls/button/button_unittest.cc b/ui/views/controls/button/button_unittest.cc index 9758c4f..acb8cf9 100644 --- a/ui/views/controls/button/button_unittest.cc +++ b/ui/views/controls/button/button_unittest.cc
@@ -755,7 +755,7 @@ // Ensure PressedCallback is dynamically settable. TEST_F(ButtonTest, SetCallback) { TestButtonListener listener; - button()->set_callback(Button::PressedCallback(&listener, button())); + button()->SetCallback(Button::PressedCallback(&listener, button())); const gfx::Point center(10, 10); button()->OnMousePressed(ui::MouseEvent(
diff --git a/ui/views/controls/combobox/combobox.h b/ui/views/controls/combobox/combobox.h index 88610932..aab703d 100644 --- a/ui/views/controls/combobox/combobox.h +++ b/ui/views/controls/combobox/combobox.h
@@ -65,7 +65,7 @@ const gfx::FontList& GetFontList() const; // Sets the callback which will be called when a selection has been made. - void set_callback(base::RepeatingClosure callback) { + void SetCallback(base::RepeatingClosure callback) { callback_ = std::move(callback); }
diff --git a/ui/views/controls/combobox/combobox_unittest.cc b/ui/views/controls/combobox/combobox_unittest.cc index 3cb55f5a..1f16edb 100644 --- a/ui/views/controls/combobox/combobox_unittest.cc +++ b/ui/views/controls/combobox/combobox_unittest.cc
@@ -150,8 +150,8 @@ class EvilListener { public: EvilListener() { - combobox_->set_callback(base::BindRepeating(&EvilListener::OnPerformAction, - base::Unretained(this))); + combobox_->SetCallback(base::BindRepeating(&EvilListener::OnPerformAction, + base::Unretained(this))); } ~EvilListener() = default; @@ -546,7 +546,7 @@ InitCombobox(nullptr); TestComboboxListener listener(combobox_); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); combobox_->Layout(); @@ -562,7 +562,7 @@ InitCombobox(nullptr); TestComboboxListener listener(combobox_); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); combobox_->Layout(); @@ -579,7 +579,7 @@ InitCombobox(nullptr); TestComboboxListener listener(combobox_); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); // The click event is ignored. Instead the menu is shown. @@ -593,7 +593,7 @@ InitCombobox(nullptr); TestComboboxListener listener(combobox_); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); // The click event is ignored. Instead the menu is shwon. @@ -640,7 +640,7 @@ InitCombobox(nullptr); TestComboboxListener listener(combobox_); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); combobox_->Layout(); @@ -760,7 +760,7 @@ InitCombobox(nullptr); TestComboboxListener listener(combobox_); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); ui::TextInputClient* input_client = widget_->GetInputMethod()->GetTextInputClient();
diff --git a/ui/views/controls/editable_combobox/editable_combobox.h b/ui/views/controls/editable_combobox/editable_combobox.h index fdd5882b..5b758af 100644 --- a/ui/views/controls/editable_combobox/editable_combobox.h +++ b/ui/views/controls/editable_combobox/editable_combobox.h
@@ -85,7 +85,7 @@ const gfx::FontList& GetFontList() const; - void set_callback(base::RepeatingClosure callback) { + void SetCallback(base::RepeatingClosure callback) { content_changed_callback_ = std::move(callback); }
diff --git a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc index 90e607ebf..83a41e6 100644 --- a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc +++ b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -154,7 +154,7 @@ combobox_ = new EditableCombobox(std::make_unique<ui::SimpleComboboxModel>(items), filter_on_edit, show_on_empty, type); - combobox_->set_callback(base::BindRepeating( + combobox_->SetCallback(base::BindRepeating( &EditableComboboxTest::OnContentChanged, base::Unretained(this))); combobox_->SetID(2); dummy_focusable_view_ = new View();
diff --git a/ui/views/controls/link.h b/ui/views/controls/link.h index 71aaad3..82a422b 100644 --- a/ui/views/controls/link.h +++ b/ui/views/controls/link.h
@@ -43,14 +43,14 @@ // Allow providing callbacks that expect either zero or one args, since many // callers don't care about the argument and can avoid adapter functions this // way. - void set_callback(base::RepeatingClosure callback) { + void SetCallback(base::RepeatingClosure callback) { // Adapt this closure to a ClickedCallback by discarding the extra arg. callback_ = base::BindRepeating([](base::RepeatingClosure closure, const ui::Event& event) { closure.Run(); }, std::move(callback)); } - void set_callback(ClickedCallback callback) { + void SetCallback(ClickedCallback callback) { callback_ = std::move(callback); }
diff --git a/ui/views/controls/link_unittest.cc b/ui/views/controls/link_unittest.cc index a5a1eab..2fb2409 100644 --- a/ui/views/controls/link_unittest.cc +++ b/ui/views/controls/link_unittest.cc
@@ -66,7 +66,7 @@ TEST_F(LinkTest, TestLinkClick) { bool link_clicked = false; - link()->set_callback(base::BindRepeating( + link()->SetCallback(base::BindRepeating( [](bool* link_clicked) { *link_clicked = true; }, &link_clicked)); link()->SizeToPreferredSize(); gfx::Point point = link()->bounds().CenterPoint(); @@ -79,7 +79,7 @@ TEST_F(LinkTest, TestLinkTap) { bool link_clicked = false; - link()->set_callback(base::BindRepeating( + link()->SetCallback(base::BindRepeating( [](bool* link_clicked) { *link_clicked = true; }, &link_clicked)); link()->SizeToPreferredSize(); gfx::Point point = link()->bounds().CenterPoint();
diff --git a/ui/views/controls/message_box_view.cc b/ui/views/controls/message_box_view.cc index 221a34cb..ba85f6f7 100644 --- a/ui/views/controls/message_box_view.cc +++ b/ui/views/controls/message_box_view.cc
@@ -175,7 +175,7 @@ DCHECK(!callback.is_null()); DCHECK(link_); - link_->set_callback(std::move(callback)); + link_->SetCallback(std::move(callback)); if (link_->GetVisible() && link_->GetText() == text) return; link_->SetText(text);
diff --git a/ui/views/controls/styled_label.cc b/ui/views/controls/styled_label.cc index cf89dffc..520990f1 100644 --- a/ui/views/controls/styled_label.cc +++ b/ui/views/controls/styled_label.cc
@@ -527,7 +527,7 @@ // Note this ignores |default_text_style_|, in favor of style::STYLE_LINK. auto link = std::make_unique<Link>(text, text_context_); - link->set_callback(style_info.callback); + link->SetCallback(style_info.callback); result = std::move(link); } else if (style_info.custom_font) {
diff --git a/ui/views/examples/button_example.cc b/ui/views/examples/button_example.cc index 0230ecbc..6ed440b9 100644 --- a/ui/views/examples/button_example.cc +++ b/ui/views/examples/button_example.cc
@@ -78,16 +78,16 @@ .Build(); auto start_throbber_cb = [](Button* button) { button->StartThrobbing(5); }; - label_button_->set_callback( + label_button_->SetCallback( base::BindRepeating(&ButtonExample::LabelButtonPressed, base::Unretained(this), label_button_)); - md_button_->set_callback(base::BindRepeating(start_throbber_cb, md_button_)); - md_disabled_button_->set_callback( + md_button_->SetCallback(base::BindRepeating(start_throbber_cb, md_button_)); + md_disabled_button_->SetCallback( base::BindRepeating(&ButtonExample::LabelButtonPressed, base::Unretained(this), md_disabled_button_)); - md_default_button_->set_callback( + md_default_button_->SetCallback( base::BindRepeating(start_throbber_cb, md_default_button_)); - image_button_->set_callback(base::BindRepeating( + image_button_->SetCallback(base::BindRepeating( &ButtonExample::ImageButtonPressed, base::Unretained(this))); image_button_->SetImage(ImageButton::STATE_NORMAL,
diff --git a/ui/views/examples/combobox_example.cc b/ui/views/examples/combobox_example.cc index 7aa2f80..db33ae4b 100644 --- a/ui/views/examples/combobox_example.cc +++ b/ui/views/examples/combobox_example.cc
@@ -58,13 +58,13 @@ .Build(); combobox_->SetOwnedModel(std::make_unique<ComboboxModelExample>()); - combobox_->set_callback(base::BindRepeating(&ComboboxExample::ValueChanged, - base::Unretained(this))); + combobox_->SetCallback(base::BindRepeating(&ComboboxExample::ValueChanged, + base::Unretained(this))); // The index is set outside of the builder because SetOwnedModel will override // set indices. combobox_->SetSelectedIndex(3); disabled_combobox->SetOwnedModel(std::make_unique<ComboboxModelExample>()); - disabled_combobox->set_callback(base::BindRepeating( + disabled_combobox->SetCallback(base::BindRepeating( &ComboboxExample::ValueChanged, base::Unretained(this))); // The index is set outside of the builder because SetOwnedModel will override // set indices.
diff --git a/ui/views/examples/dialog_example.cc b/ui/views/examples/dialog_example.cc index 38ad5f9..10ffb74 100644 --- a/ui/views/examples/dialog_example.cc +++ b/ui/views/examples/dialog_example.cc
@@ -153,8 +153,8 @@ StartRowWithLabel(layout, "Modal Type"); mode_ = layout->AddView(std::make_unique<Combobox>(&mode_model_)); - mode_->set_callback(base::BindRepeating(&DialogExample::OnPerformAction, - base::Unretained(this))); + mode_->SetCallback(base::BindRepeating(&DialogExample::OnPerformAction, + base::Unretained(this))); mode_->SetSelectedIndex(ui::MODAL_TYPE_CHILD); StartRowWithLabel(layout, "Bubble");
diff --git a/ui/views/examples/examples_window.cc b/ui/views/examples/examples_window.cc index 8a3b78f..aa986da8 100644 --- a/ui/views/examples/examples_window.cc +++ b/ui/views/examples/examples_window.cc
@@ -120,7 +120,7 @@ auto combobox = std::make_unique<Combobox>(std::move(combobox_model)); instance_ = this; - combobox->set_callback(base::BindRepeating( + combobox->SetCallback(base::BindRepeating( &ExamplesWindowContents::ComboboxChanged, base::Unretained(this))); SetBackground(CreateThemedSolidBackground(
diff --git a/ui/views/examples/label_example.cc b/ui/views/examples/label_example.cc index b163737..7ea30bc 100644 --- a/ui/views/examples/label_example.cc +++ b/ui/views/examples/label_example.cc
@@ -228,7 +228,7 @@ auto combobox = std::make_unique<Combobox>( std::make_unique<ExampleComboboxModel>(strings, count)); combobox->SetSelectedIndex(0); - combobox->set_callback(base::BindRepeating(function, base::Unretained(this))); + combobox->SetCallback(base::BindRepeating(function, base::Unretained(this))); return layout->AddView(std::move(combobox)); }
diff --git a/ui/views/examples/layout_example_base.cc b/ui/views/examples/layout_example_base.cc index ebf0580..4a0729e3 100644 --- a/ui/views/examples/layout_example_base.cc +++ b/ui/views/examples/layout_example_base.cc
@@ -189,7 +189,7 @@ row->AddChildView(std::make_unique<Label>(label_text)); auto* const combobox = row->AddChildView(std::make_unique<Combobox>( std::make_unique<ExampleComboboxModel>(items, count))); - combobox->set_callback(std::move(combobox_callback)); + combobox->SetCallback(std::move(combobox_callback)); return combobox; }
diff --git a/ui/views/examples/link_example.cc b/ui/views/examples/link_example.cc index 46311a6..f1cd3316 100644 --- a/ui/views/examples/link_example.cc +++ b/ui/views/examples/link_example.cc
@@ -31,7 +31,7 @@ auto link = views::Builder<Link>() .SetText(GetStringUTF16(IDS_LINK_CLICK_PROMPT_LABEL)) .Build(); - link->set_callback(base::BindRepeating( + link->SetCallback(base::BindRepeating( &LogStatus, GetStringUTF8(IDS_LINK_CLICK_CONFIRMED_LABEL))); container->SetLayoutManager(std::make_unique<FillLayout>());
diff --git a/ui/views/examples/table_example.cc b/ui/views/examples/table_example.cc index 22b0536..b2ba1eac 100644 --- a/ui/views/examples/table_example.cc +++ b/ui/views/examples/table_example.cc
@@ -73,7 +73,7 @@ icon1_.allocN32Pixels(16, 16); icon2_.allocN32Pixels(16, 16); - SkCanvas canvas1(icon1_, SkSurfaceProps{}), canvas2(icon2_, SkSurfaceProps{}); + SkCanvas canvas1(icon1_), canvas2(icon2_); canvas1.drawColor(SK_ColorRED); canvas2.drawColor(SK_ColorBLUE);
diff --git a/ui/views/examples/text_example.cc b/ui/views/examples/text_example.cc index 08f2781..9ba9a15 100644 --- a/ui/views/examples/text_example.cc +++ b/ui/views/examples/text_example.cc
@@ -121,7 +121,7 @@ std::make_unique<Combobox>( std::make_unique<ExampleComboboxModel>(strings, count)), kNumColumns - 1, 1); - combobox->set_callback( + combobox->SetCallback( base::BindRepeating(combobox_callback, base::Unretained(this))); return combobox; }
diff --git a/ui/webui/resources/cr_elements/cr_toast/BUILD.gn b/ui/webui/resources/cr_elements/cr_toast/BUILD.gn index a06ff0e..527ae4d 100644 --- a/ui/webui/resources/cr_elements/cr_toast/BUILD.gn +++ b/ui/webui/resources/cr_elements/cr_toast/BUILD.gn
@@ -13,12 +13,12 @@ } js_library("cr_toast") { - deps = [ "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted" ] } js_library("cr_toast_manager") { deps = [ ":cr_toast", + "//third_party/polymer/v1_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer-extracted", "//ui/webui/resources/js:assert", "//ui/webui/resources/js:cr", ]
diff --git a/ui/webui/resources/cr_elements/cr_toast/cr_toast.html b/ui/webui/resources/cr_elements/cr_toast/cr_toast.html index 6debee31..8b54718 100644 --- a/ui/webui/resources/cr_elements/cr_toast/cr_toast.html +++ b/ui/webui/resources/cr_elements/cr_toast/cr_toast.html
@@ -1,6 +1,5 @@ <link rel="import" href="../../html/polymer.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> <link rel="import" href="../shared_vars_css.html">
diff --git a/ui/webui/resources/cr_elements/cr_toast/cr_toast.js b/ui/webui/resources/cr_elements/cr_toast/cr_toast.js index 7cb95803..f6a5f1b 100644 --- a/ui/webui/resources/cr_elements/cr_toast/cr_toast.js +++ b/ui/webui/resources/cr_elements/cr_toast/cr_toast.js
@@ -20,10 +20,6 @@ }, }, - hostAttributes: { - 'role': 'alert', - }, - observers: ['resetAutoHide_(duration, open)'], /** @private {number|null} */ @@ -47,68 +43,30 @@ }, /** - * Announce a11y message - * @param {string} text - * @private - */ - announceA11yMessage_(text) { - Polymer.IronA11yAnnouncer.requestAvailability(); - this.fire('iron-announce', { text }); - }, - - /** * Shows the toast and auto-hides after |this.duration| milliseconds has * passed. If the toast is currently being shown, any preexisting auto-hide * is cancelled and replaced with a new auto-hide. - * - * If |this.duration| is set to 0, the toast will remain open indefinitely. - * The caller is responsible for hiding the toast. - * - * When |duration| is passed in the non-negative number, |this.duration| - * is updated to that value. - * - * If text is set, replace the toast content with text, - * can also optionally announce a11y with text - * - * @param {number=} duration - * @param {string=} text - * @param {boolean=} shouldAnnounceA11y */ - show(duration, text, shouldAnnounceA11y) { - if (text !== undefined) { - this.textContent = ''; - const span = document.createElement('span'); - span.textContent = text; - this.appendChild(span); + show() { + // Force autohide to reset if calling show on an already shown toast. + const shouldResetAutohide = this.open; - if (shouldAnnounceA11y) { - this.announceA11yMessage_(text); - } - } + // The role attribute is removed first so that screen readers to better + // ensure that screen readers will read out the content inside the toast. + // If the role is not removed and re-added back in, certain screen readers + // do not read out the contents, especially if the text remains exactly + // the same as a previous toast. + this.removeAttribute('role'); - // |this.resetAutoHide_| is called whenever |this.duration| or |this.open| - // is changed. If neither is changed, we will still need to reset auto-hide. - let shouldResetAutoHide = true; + this.open = true; + this.setAttribute('role', 'alert'); - if (typeof (duration) !== 'undefined' && duration >= 0 && - this.duration !== duration) { - this.duration = duration; - shouldResetAutoHide = false; - } - - if (!this.open) { - this.open = true; - shouldResetAutoHide = false; - } - - if (shouldResetAutoHide) { + if (shouldResetAutohide) { this.resetAutoHide_(); } }, - /** - * Hides the toast. - */ + /** Hides the toast. */ hide() { this.open = false; },
diff --git a/ui/webui/resources/tools/generate_grd.gni b/ui/webui/resources/tools/generate_grd.gni index d44c8b2d..75f3218 100644 --- a/ui/webui/resources/tools/generate_grd.gni +++ b/ui/webui/resources/tools/generate_grd.gni
@@ -30,5 +30,9 @@ ] args += [ "--input-files" ] + invoker.input_files } + + if (defined(invoker.resource_path_rewrites)) { + args += [ "--resource-path-rewrites" ] + invoker.resource_path_rewrites + } } }
diff --git a/ui/webui/resources/tools/generate_grd.py b/ui/webui/resources/tools/generate_grd.py index b6089c9..bfcbf92 100644 --- a/ui/webui/resources/tools/generate_grd.py +++ b/ui/webui/resources/tools/generate_grd.py
@@ -73,19 +73,16 @@ # Generates an <include .... /> row for the given file. -def _generate_include_row(grd_prefix, filename, pathname): +def _generate_include_row(grd_prefix, filename, pathname, \ + resource_path_rewrites): name_suffix = filename.upper().replace('/', '_').replace('.', '_'). \ replace('-', '_') name = 'IDR_%s_%s' % (grd_prefix.upper(), name_suffix) extension = os.path.splitext(filename)[1] type = 'chrome_html' if extension == '.html' or extension == '.js' \ else 'BINDATA' - resource_path = filename - # Remove 'rollup' from *.rollup.js paths, except for shared.rollup.js. - # Possibly pass such replacements from the gni file, if this ends up not being - # sufficient for all cases. - if ('rollup' in resource_path and 'shared' not in resource_path): - resource_path = resource_path.replace('rollup.', '') + resource_path = resource_path_rewrites[filename] \ + if filename in resource_path_rewrites else filename return GRD_INCLUDE_TEMPLATE.format( file=pathname, path=resource_path, @@ -101,18 +98,26 @@ parser.add_argument('--root-gen-dir', required=True) parser.add_argument('--input-files', nargs="*") parser.add_argument('--input-files-base-dir') + parser.add_argument('--resource-path-rewrites', nargs="*") args = parser.parse_args(argv) grd_file = open(os.path.normpath(os.path.join(_CWD, args.out_grd)), 'w') grd_file.write(GRD_BEGIN_TEMPLATE.format(prefix=args.grd_prefix)) + resource_path_rewrites = {} + if args.resource_path_rewrites != None: + for r in args.resource_path_rewrites: + [original, rewrite] = r.split("|") + resource_path_rewrites[original] = rewrite + if args.input_files != None: assert(args.input_files_base_dir) for filename in args.input_files: filepath = os.path.join( args.input_files_base_dir, filename).replace('\\', '/') grd_file.write(_generate_include_row( - args.grd_prefix, filename, '${root_src_dir}/' + filepath)) + args.grd_prefix, filename, '${root_src_dir}/' + filepath, + resource_path_rewrites)) for manifest_file in args.manifest_files: manifest_path = os.path.normpath(os.path.join(_CWD, manifest_file)) @@ -123,7 +128,8 @@ filepath = os.path.join(base_dir, filename).replace('\\', '/') rebased_path = os.path.relpath(filepath, args.root_gen_dir) grd_file.write(_generate_include_row( - args.grd_prefix, filename, '${root_gen_dir}/' + rebased_path)) + args.grd_prefix, filename, '${root_gen_dir}/' + rebased_path, + resource_path_rewrites)) grd_file.write(GRD_END_TEMPLATE) return
diff --git a/ui/webui/resources/tools/generate_grd_test.py b/ui/webui/resources/tools/generate_grd_test.py index ed0a161..5659b739 100755 --- a/ui/webui/resources/tools/generate_grd_test.py +++ b/ui/webui/resources/tools/generate_grd_test.py
@@ -27,7 +27,7 @@ return open(os.path.join(self._out_folder, file_name), 'rb').read() def _run_test_(self, grd_expected, manifest_files, input_files=None, - input_files_base_dir=None): + input_files_base_dir=None, resource_path_rewrites=None): assert not self._out_folder self._out_folder = tempfile.mkdtemp(dir=_HERE_DIR) args = [ @@ -45,6 +45,9 @@ ] args += input_files + if (resource_path_rewrites): + args += [ '--resource-path-rewrites' ] + resource_path_rewrites + generate_grd.main(args) actual_grd = self._read_out_file('test_resources.grd') @@ -70,6 +73,19 @@ [ 'images/test_svg.svg', 'test_html_in_src.html' ], 'test_src_dir') + def testSuccessWithRewrites(self): + self._run_test_( + 'expected_grd_with_rewrites.grd', + [ + os.path.join(pathToHere, 'tests', 'test_manifest_1.json'), + os.path.join(pathToHere, 'tests', 'test_manifest_2.json'), + ], + input_files=None, input_files_base_dir=None, + resource_path_rewrites=[ + 'test.rollup.js|test.js', + 'dir/another_element_in_dir.js|dir2/another_element_in_dir_renamed.js', + ]) + if __name__ == '__main__': unittest.main()
diff --git a/ui/webui/resources/tools/tests/expected_grd.grd b/ui/webui/resources/tools/tests/expected_grd.grd index 12d1091..1a85c39 100644 --- a/ui/webui/resources/tools/tests/expected_grd.grd +++ b/ui/webui/resources/tools/tests/expected_grd.grd
@@ -13,7 +13,7 @@ <release seq="1"> <includes> <include name="IDR_TEST_TEST_HTML" file="${root_gen_dir}/preprocessed/test.html" resource_path="test.html" use_base_dir="false" type="chrome_html" /> - <include name="IDR_TEST_TEST_ROLLUP_JS" file="${root_gen_dir}/preprocessed/test.rollup.js" resource_path="test.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_TEST_ROLLUP_JS" file="${root_gen_dir}/preprocessed/test.rollup.js" resource_path="test.rollup.js" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_SHARED_ROLLUP_JS" file="${root_gen_dir}/preprocessed/shared.rollup.js" resource_path="shared.rollup.js" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_DIR_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/element_in_dir.js" resource_path="dir/element_in_dir.js" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_DIR_TEST_SVG_SVG" file="${root_gen_dir}/preprocessed/dir/test_svg.svg" resource_path="dir/test_svg.svg" use_base_dir="false" type="BINDATA" />
diff --git a/ui/webui/resources/tools/tests/expected_grd_with_input_files.grd b/ui/webui/resources/tools/tests/expected_grd_with_input_files.grd index 3df8503..957f5024 100644 --- a/ui/webui/resources/tools/tests/expected_grd_with_input_files.grd +++ b/ui/webui/resources/tools/tests/expected_grd_with_input_files.grd
@@ -15,7 +15,7 @@ <include name="IDR_TEST_IMAGES_TEST_SVG_SVG" file="${root_src_dir}/test_src_dir/images/test_svg.svg" resource_path="images/test_svg.svg" use_base_dir="false" type="BINDATA" /> <include name="IDR_TEST_TEST_HTML_IN_SRC_HTML" file="${root_src_dir}/test_src_dir/test_html_in_src.html" resource_path="test_html_in_src.html" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_TEST_HTML" file="${root_gen_dir}/preprocessed/test.html" resource_path="test.html" use_base_dir="false" type="chrome_html" /> - <include name="IDR_TEST_TEST_ROLLUP_JS" file="${root_gen_dir}/preprocessed/test.rollup.js" resource_path="test.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_TEST_ROLLUP_JS" file="${root_gen_dir}/preprocessed/test.rollup.js" resource_path="test.rollup.js" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_SHARED_ROLLUP_JS" file="${root_gen_dir}/preprocessed/shared.rollup.js" resource_path="shared.rollup.js" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_DIR_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/element_in_dir.js" resource_path="dir/element_in_dir.js" use_base_dir="false" type="chrome_html" /> <include name="IDR_TEST_DIR_TEST_SVG_SVG" file="${root_gen_dir}/preprocessed/dir/test_svg.svg" resource_path="dir/test_svg.svg" use_base_dir="false" type="BINDATA" />
diff --git a/ui/webui/resources/tools/tests/expected_grd_with_rewrites.grd b/ui/webui/resources/tools/tests/expected_grd_with_rewrites.grd new file mode 100644 index 0000000..41339a5 --- /dev/null +++ b/ui/webui/resources/tools/tests/expected_grd_with_rewrites.grd
@@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<grit latest_public_release="0" current_release="1" output_all_resource_defines="false"> + <outputs> + <output filename="grit/test_resources.h" type="rc_header"> + <emit emit_type='prepend'></emit> + </output> + <output filename="grit/test_resources_map.cc" + type="resource_file_map_source" /> + <output filename="grit/test_resources_map.h" + type="resource_map_header" /> + <output filename="test_resources.pak" type="data_package" /> + </outputs> + <release seq="1"> + <includes> + <include name="IDR_TEST_TEST_HTML" file="${root_gen_dir}/preprocessed/test.html" resource_path="test.html" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_TEST_ROLLUP_JS" file="${root_gen_dir}/preprocessed/test.rollup.js" resource_path="test.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_SHARED_ROLLUP_JS" file="${root_gen_dir}/preprocessed/shared.rollup.js" resource_path="shared.rollup.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_DIR_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/element_in_dir.js" resource_path="dir/element_in_dir.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_DIR_TEST_SVG_SVG" file="${root_gen_dir}/preprocessed/dir/test_svg.svg" resource_path="dir/test_svg.svg" use_base_dir="false" type="BINDATA" /> + <include name="IDR_TEST_TEST_UI_JS" file="${root_gen_dir}/preprocessed/test_ui.js" resource_path="test_ui.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_TEST_PROXY_JS" file="${root_gen_dir}/preprocessed/test_proxy.js" resource_path="test_proxy.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_FILE_WITH_DASHES_JS" file="${root_gen_dir}/preprocessed/file-with-dashes.js" resource_path="file-with-dashes.js" use_base_dir="false" type="chrome_html" /> + <include name="IDR_TEST_DIR_ANOTHER_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/another_element_in_dir.js" resource_path="dir2/another_element_in_dir_renamed.js" use_base_dir="false" type="chrome_html" /> + </includes> + </release> +</grit>